datadog 2.13.0 → 2.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +16 -1
  3. data/lib/datadog/core/environment/agent_info.rb +1 -1
  4. data/lib/datadog/core/metrics/client.rb +1 -1
  5. data/lib/datadog/core/remote/client.rb +1 -1
  6. data/lib/datadog/core/remote/negotiation.rb +1 -1
  7. data/lib/datadog/core/remote/transport/config.rb +2 -2
  8. data/lib/datadog/core/remote/transport/http/client.rb +1 -1
  9. data/lib/datadog/core/remote/transport/http.rb +2 -2
  10. data/lib/datadog/core/remote/transport/negotiation.rb +2 -2
  11. data/lib/datadog/core/transport/http/builder.rb +2 -2
  12. data/lib/datadog/core/transport/http.rb +1 -1
  13. data/lib/datadog/di/transport/diagnostics.rb +2 -2
  14. data/lib/datadog/di/transport/http/client.rb +1 -1
  15. data/lib/datadog/di/transport/input.rb +2 -2
  16. data/lib/datadog/kit/appsec/events.rb +6 -3
  17. data/lib/datadog/tracing/contrib/ext.rb +1 -0
  18. data/lib/datadog/tracing/contrib/karafka/configuration/settings.rb +27 -0
  19. data/lib/datadog/tracing/contrib/karafka/distributed/propagation.rb +46 -0
  20. data/lib/datadog/tracing/contrib/karafka/ext.rb +27 -0
  21. data/lib/datadog/tracing/contrib/karafka/integration.rb +45 -0
  22. data/lib/datadog/tracing/contrib/karafka/monitor.rb +66 -0
  23. data/lib/datadog/tracing/contrib/karafka/patcher.rb +71 -0
  24. data/lib/datadog/tracing/contrib/karafka.rb +37 -0
  25. data/lib/datadog/tracing/contrib.rb +1 -0
  26. data/lib/datadog/tracing/transport/http/client.rb +1 -1
  27. data/lib/datadog/tracing/transport/http.rb +1 -1
  28. data/lib/datadog/tracing/transport/traces.rb +11 -6
  29. data/lib/datadog/version.rb +1 -1
  30. data/lib/datadog.rb +1 -1
  31. metadata +11 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2c826569b30a9e809d44f98b6371650aa38306e325b2f1ceb79ece2d3fb23360
4
- data.tar.gz: 6753a8ac457c797fe29e19f1af4d434e33d6f74aa3b7c9a32394a8d3e5d57f33
3
+ metadata.gz: d6f1f9a8bd097f353792ce207813881aadce161aaef09d6790c551686de7d53e
4
+ data.tar.gz: 34dbaf125e9b9a3ce3eec376546ae3817f42f3556033a27b83b69578372b2475
5
5
  SHA512:
6
- metadata.gz: 14445f04bb88f59798ed30ed28c849556556639720d2086f678058021e23ca64ab4740a3e4df1e53cab34e5f18eb785dfeebfd0716c20a75971acb605cdf6884
7
- data.tar.gz: b3d8a318c7571747d80bb474478ab4a4ae92c422ba9a6177b6889fc3231bac4666c13d8c77ebd6bf43bd5045f427d6771e3f69531b23903ebdf4673824268f50
6
+ metadata.gz: 07d6d7499521fb3ebb75574960e7eff4bd7e893dc8631b02b9a4db2201ed47afa0b294ab493a198c09b5bfe7e00e1d215ae61a45f4e8a756c2644e7a59ee56d9
7
+ data.tar.gz: 31aa80c9ee735eef7dc676a72e7fe2b33fe996704a2a58c97386284af16fdf5fa6037269e6d7e1f3a4a2b823825a0e3cef0f36f3e04f45bf9c8907510d7d5e54
data/CHANGELOG.md CHANGED
@@ -2,6 +2,17 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [2.14.0] - 2025-04-04
6
+
7
+ ### Added
8
+
9
+ * Tracing: Add `karafka` instrumentation with 2.3.0 as the minimum supported version. ([#4147][])
10
+
11
+ ### Fixed
12
+
13
+ * Core: Tracing: default logger arguments for compatibility with previous dd-trace-rb versions ([#4558][])
14
+ * AppSec: Fix `Datadog::Kit::AppSec::Events` SDK methods to correctly handle given string key `usr.login`. ([#4552][])
15
+
5
16
  ## [2.13.0] - 2025-04-02
6
17
 
7
18
  ### Added
@@ -3167,7 +3178,8 @@ Release notes: https://github.com/DataDog/dd-trace-rb/releases/tag/v0.3.1
3167
3178
  Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
3168
3179
 
3169
3180
 
3170
- [Unreleased]: https://github.com/DataDog/dd-trace-rb/compare/v2.13.0...master
3181
+ [Unreleased]: https://github.com/DataDog/dd-trace-rb/compare/v2.14.0...master
3182
+ [2.14.0]: https://github.com/DataDog/dd-trace-rb/compare/v2.13.0...v2.14.0
3171
3183
  [2.13.0]: https://github.com/DataDog/dd-trace-rb/compare/v2.12.2...v2.13.0
3172
3184
  [2.12.2]: https://github.com/DataDog/dd-trace-rb/compare/v2.12.1...v2.12.2
3173
3185
  [2.12.1]: https://github.com/DataDog/dd-trace-rb/compare/v2.12.0...v2.12.1
@@ -4630,6 +4642,7 @@ Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
4630
4642
  [#4085]: https://github.com/DataDog/dd-trace-rb/issues/4085
4631
4643
  [#4137]: https://github.com/DataDog/dd-trace-rb/issues/4137
4632
4644
  [#4140]: https://github.com/DataDog/dd-trace-rb/issues/4140
4645
+ [#4147]: https://github.com/DataDog/dd-trace-rb/issues/4147
4633
4646
  [#4153]: https://github.com/DataDog/dd-trace-rb/issues/4153
4634
4647
  [#4161]: https://github.com/DataDog/dd-trace-rb/issues/4161
4635
4648
  [#4164]: https://github.com/DataDog/dd-trace-rb/issues/4164
@@ -4686,6 +4699,8 @@ Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
4686
4699
  [#4534]: https://github.com/DataDog/dd-trace-rb/issues/4534
4687
4700
  [#4547]: https://github.com/DataDog/dd-trace-rb/issues/4547
4688
4701
  [#4549]: https://github.com/DataDog/dd-trace-rb/issues/4549
4702
+ [#4552]: https://github.com/DataDog/dd-trace-rb/issues/4552
4703
+ [#4558]: https://github.com/DataDog/dd-trace-rb/issues/4558
4689
4704
  [@AdrianLC]: https://github.com/AdrianLC
4690
4705
  [@Azure7111]: https://github.com/Azure7111
4691
4706
  [@BabyGroot]: https://github.com/BabyGroot
@@ -53,7 +53,7 @@ module Datadog
53
53
  class AgentInfo
54
54
  attr_reader :agent_settings, :logger
55
55
 
56
- def initialize(agent_settings, logger:)
56
+ def initialize(agent_settings, logger: Datadog.logger)
57
57
  @agent_settings = agent_settings
58
58
  @logger = logger
59
59
  @client = Remote::Transport::HTTP.root(agent_settings: agent_settings, logger: logger)
@@ -23,7 +23,7 @@ module Datadog
23
23
 
24
24
  attr_reader :statsd, :logger
25
25
 
26
- def initialize(logger:, statsd: nil, enabled: true, **_)
26
+ def initialize(logger: Datadog.logger, statsd: nil, enabled: true, **_)
27
27
  @logger = logger
28
28
  @statsd =
29
29
  if supported?
@@ -15,7 +15,7 @@ module Datadog
15
15
 
16
16
  attr_reader :transport, :repository, :id, :dispatcher, :logger
17
17
 
18
- def initialize(transport, capabilities, logger:, repository: Configuration::Repository.new)
18
+ def initialize(transport, capabilities, logger: Datadog.logger, repository: Configuration::Repository.new)
19
19
  @transport = transport
20
20
  @logger = logger
21
21
 
@@ -9,7 +9,7 @@ module Datadog
9
9
  class Negotiation
10
10
  attr_reader :logger
11
11
 
12
- def initialize(_settings, agent_settings, logger:, suppress_logging: {})
12
+ def initialize(_settings, agent_settings, logger: Datadog.logger, suppress_logging: {})
13
13
  @logger = logger
14
14
  @transport_root = Datadog::Core::Remote::Transport::HTTP.root(agent_settings: agent_settings, logger: logger)
15
15
  @logged = suppress_logging
@@ -34,11 +34,11 @@ module Datadog
34
34
  class Transport
35
35
  attr_reader :client, :apis, :default_api, :current_api_id, :logger
36
36
 
37
- def initialize(apis, default_api, logger)
37
+ def initialize(apis, default_api, logger: Datadog.logger)
38
38
  @apis = apis
39
39
  @logger = logger
40
40
 
41
- @client = HTTP::Client.new(current_api, logger)
41
+ @client = HTTP::Client.new(current_api, logger: logger)
42
42
  end
43
43
 
44
44
  ##### there is only one transport! it's negotiation!
@@ -17,7 +17,7 @@ module Datadog
17
17
  class Client
18
18
  attr_reader :api, :logger
19
19
 
20
- def initialize(api, logger)
20
+ def initialize(api, logger: Datadog.logger)
21
21
  @api = api
22
22
  @logger = logger
23
23
  end
@@ -33,7 +33,7 @@ module Datadog
33
33
  # Pass a block to override any settings.
34
34
  def root(
35
35
  agent_settings:,
36
- logger:,
36
+ logger: Datadog.logger,
37
37
  api_version: nil,
38
38
  headers: nil
39
39
  )
@@ -57,7 +57,7 @@ module Datadog
57
57
  # Pass a block to override any settings.
58
58
  def v7(
59
59
  agent_settings:,
60
- logger:,
60
+ logger: Datadog.logger,
61
61
  api_version: nil,
62
62
  headers: nil
63
63
  )
@@ -51,11 +51,11 @@ module Datadog
51
51
  class Transport
52
52
  attr_reader :client, :apis, :default_api, :current_api_id, :logger
53
53
 
54
- def initialize(apis, default_api, logger)
54
+ def initialize(apis, default_api, logger: Datadog.logger)
55
55
  @apis = apis
56
56
  @logger = logger
57
57
 
58
- @client = HTTP::Client.new(current_api, logger)
58
+ @client = HTTP::Client.new(current_api, logger: logger)
59
59
  end
60
60
 
61
61
  def send_info
@@ -21,7 +21,7 @@ module Datadog
21
21
  :default_headers,
22
22
  :logger
23
23
 
24
- def initialize(api_instance_class:, logger:)
24
+ def initialize(api_instance_class:, logger: Datadog.logger)
25
25
  # Global settings
26
26
  @default_adapter = nil
27
27
  @default_headers = {}
@@ -88,7 +88,7 @@ module Datadog
88
88
  def to_transport(klass)
89
89
  raise NoDefaultApiError if @default_api.nil?
90
90
 
91
- klass.new(to_api_instances, @default_api, logger)
91
+ klass.new(to_api_instances, @default_api, logger: logger)
92
92
  end
93
93
 
94
94
  def to_api_instances
@@ -29,7 +29,7 @@ module Datadog
29
29
  # Helper function that delegates to Builder.new
30
30
  # but is under HTTP namespace so that client code requires this file
31
31
  # to get the adapters configured, and not the builder directly.
32
- def build(api_instance_class:, agent_settings:, logger:, api_version: nil, headers: nil, &block)
32
+ def build(api_instance_class:, agent_settings:, logger: Datadog.logger, api_version: nil, headers: nil, &block)
33
33
  Builder.new(api_instance_class: api_instance_class, logger: logger) do |transport|
34
34
  transport.adapter(agent_settings)
35
35
  transport.headers(default_headers)
@@ -17,11 +17,11 @@ module Datadog
17
17
  class Transport
18
18
  attr_reader :client, :apis, :default_api, :current_api_id, :logger
19
19
 
20
- def initialize(apis, default_api, logger)
20
+ def initialize(apis, default_api, logger:)
21
21
  @apis = apis
22
22
  @logger = logger
23
23
 
24
- @client = HTTP::Client.new(current_api, logger)
24
+ @client = HTTP::Client.new(current_api, logger: logger)
25
25
  end
26
26
 
27
27
  def current_api
@@ -16,7 +16,7 @@ module Datadog
16
16
  class Client
17
17
  attr_reader :api, :logger
18
18
 
19
- def initialize(api, logger)
19
+ def initialize(api, logger:)
20
20
  @api = api
21
21
  @logger = logger
22
22
  end
@@ -17,11 +17,11 @@ module Datadog
17
17
  class Transport
18
18
  attr_reader :client, :apis, :default_api, :current_api_id, :logger
19
19
 
20
- def initialize(apis, default_api, logger)
20
+ def initialize(apis, default_api, logger:)
21
21
  @apis = apis
22
22
  @logger = logger
23
23
 
24
- @client = HTTP::Client.new(current_api, logger)
24
+ @client = HTTP::Client.new(current_api, logger: logger)
25
25
  end
26
26
 
27
27
  def current_api
@@ -10,6 +10,7 @@ module Datadog
10
10
  LOGIN_SUCCESS_EVENT = 'users.login.success'
11
11
  LOGIN_FAILURE_EVENT = 'users.login.failure'
12
12
  SIGNUP_EVENT = 'users.signup'
13
+ USER_LOGIN_KEYS = ['usr.login', :'usr.login'].freeze
13
14
 
14
15
  class << self
15
16
  # Attach login success event information to the trace
@@ -30,10 +31,11 @@ module Datadog
30
31
  set_trace_and_span_context('track_login_success', trace, span) do |active_trace, active_span|
31
32
  user_options = user.dup
32
33
  user_id = user_options.delete(:id)
33
- user_login = user_options[:login] || others[:'usr.login'] || user_id
34
+ user_login = user_options[:login] || others[:'usr.login'] || others['usr.login'] || user_id
34
35
 
35
36
  raise ArgumentError, 'missing required key: :user => { :id }' if user_id.nil?
36
37
 
38
+ others = others.reject { |key, _| USER_LOGIN_KEYS.include?(key) }
37
39
  others[:'usr.login'] = user_login
38
40
  track(LOGIN_SUCCESS_EVENT, active_trace, active_span, **others)
39
41
 
@@ -58,7 +60,7 @@ module Datadog
58
60
  # event information to attach to the trace.
59
61
  def track_login_failure(trace = nil, span = nil, user_exists:, user_id: nil, **others)
60
62
  set_trace_and_span_context('track_login_failure', trace, span) do |active_trace, active_span|
61
- others[:'usr.login'] = user_id if user_id && !others.key?(:'usr.login')
63
+ others[:'usr.login'] = user_id if user_id && !others.key?(:'usr.login') && !others.key?('usr.login')
62
64
  track(LOGIN_FAILURE_EVENT, active_trace, active_span, **others)
63
65
 
64
66
  active_span.set_tag('appsec.events.users.login.failure.usr.id', user_id) if user_id
@@ -84,10 +86,11 @@ module Datadog
84
86
  set_trace_and_span_context('track_signup', trace, span) do |active_trace, active_span|
85
87
  user_options = user.dup
86
88
  user_id = user_options.delete(:id)
87
- user_login = user_options[:login] || others[:'usr.login'] || user_id
89
+ user_login = user_options[:login] || others[:'usr.login'] || others['usr.login'] || user_id
88
90
 
89
91
  raise ArgumentError, 'missing required key: :user => { :id }' if user_id.nil?
90
92
 
93
+ others = others.reject { |key, _| USER_LOGIN_KEYS.include?(key) }
91
94
  others[:'usr.login'] = user_login
92
95
  track(SIGNUP_EVENT, active_trace, active_span, **others)
93
96
 
@@ -48,6 +48,7 @@ module Datadog
48
48
 
49
49
  module Messaging
50
50
  TAG_SYSTEM = 'messaging.system'
51
+ TAG_DESTINATION = 'messaging.destination'
51
52
  PEER_SERVICE_SOURCES = Array[Tracing::Metadata::Ext::NET::TAG_DESTINATION_NAME,
52
53
  Tracing::Metadata::Ext::TAG_PEER_HOSTNAME,
53
54
  Tracing::Metadata::Ext::NET::TAG_TARGET_HOST,].freeze
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../configuration/settings'
4
+ require_relative '../ext'
5
+
6
+ module Datadog
7
+ module Tracing
8
+ module Contrib
9
+ module Karafka
10
+ module Configuration
11
+ # @public_api
12
+ class Settings < Contrib::Configuration::Settings
13
+ option :enabled do |o|
14
+ o.type :bool
15
+ o.env Ext::ENV_ENABLED
16
+ o.default true
17
+ end
18
+
19
+ option :service_name
20
+
21
+ option :distributed_tracing, default: false, type: :bool
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../../distributed/fetcher'
4
+ require_relative '../../../distributed/propagation'
5
+ require_relative '../../../distributed/b3_multi'
6
+ require_relative '../../../distributed/b3_single'
7
+ require_relative '../../../distributed/datadog'
8
+ require_relative '../../../distributed/none'
9
+ require_relative '../../../distributed/trace_context'
10
+ require_relative '../../../configuration/ext'
11
+
12
+ module Datadog
13
+ module Tracing
14
+ module Contrib
15
+ module Karafka
16
+ module Distributed
17
+ # Extracts and injects propagation through Kafka message headers.
18
+ class Propagation < Tracing::Distributed::Propagation
19
+ def initialize(
20
+ propagation_style_inject:,
21
+ propagation_style_extract:,
22
+ propagation_extract_first:
23
+ )
24
+ super(
25
+ propagation_styles: {
26
+ Tracing::Configuration::Ext::Distributed::PROPAGATION_STYLE_B3_MULTI_HEADER =>
27
+ Tracing::Distributed::B3Multi.new(fetcher: Tracing::Distributed::Fetcher),
28
+ Tracing::Configuration::Ext::Distributed::PROPAGATION_STYLE_B3_SINGLE_HEADER =>
29
+ Tracing::Distributed::B3Single.new(fetcher: Tracing::Distributed::Fetcher),
30
+ Tracing::Configuration::Ext::Distributed::PROPAGATION_STYLE_DATADOG =>
31
+ Tracing::Distributed::Datadog.new(fetcher: Tracing::Distributed::Fetcher),
32
+ Tracing::Configuration::Ext::Distributed::PROPAGATION_STYLE_TRACE_CONTEXT =>
33
+ Tracing::Distributed::TraceContext.new(fetcher: Tracing::Distributed::Fetcher),
34
+ Tracing::Configuration::Ext::Distributed::PROPAGATION_STYLE_NONE => Tracing::Distributed::None.new
35
+ },
36
+ propagation_style_inject: propagation_style_inject,
37
+ propagation_style_extract: propagation_style_extract,
38
+ propagation_extract_first: propagation_extract_first
39
+ )
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Datadog
4
+ module Tracing
5
+ module Contrib
6
+ module Karafka
7
+ module Ext
8
+ ENV_ENABLED = 'DD_TRACE_KARAFKA_ENABLED'
9
+
10
+ SPAN_MESSAGE_CONSUME = 'karafka.consume'
11
+ SPAN_WORKER_PROCESS = 'worker.process'
12
+
13
+ TAG_CONSUMER = 'kafka.consumer'
14
+ TAG_TOPIC = 'kafka.topic'
15
+ TAG_PARTITION = 'kafka.partition'
16
+ TAG_OFFSET = 'kafka.offset'
17
+ TAG_OFFSET_LAG = 'kafka.offset_lag'
18
+ TAG_MESSAGE_COUNT = 'kafka.message_count'
19
+ TAG_MESSAGE_KEY = 'kafka.message_key'
20
+ TAG_SYSTEM = 'kafka'
21
+
22
+ TAG_OPERATION_PROCESS_BATCH = 'consumer.process_batch'
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../integration'
4
+ require_relative 'configuration/settings'
5
+ require_relative 'patcher'
6
+
7
+ module Datadog
8
+ module Tracing
9
+ module Contrib
10
+ module Karafka
11
+ # Description of Kafka integration
12
+ class Integration
13
+ include Contrib::Integration
14
+
15
+ # Minimum version of the Karafka library that we support
16
+ # https://karafka.io/docs/Versions-Lifecycle-and-EOL/#versioning-strategy
17
+ MINIMUM_VERSION = Gem::Version.new('2.3.0')
18
+
19
+ # @public_api Changing the integration name or integration options can cause breaking changes
20
+ register_as :karafka, auto_patch: false
21
+
22
+ def self.version
23
+ Gem.loaded_specs['karafka']&.version
24
+ end
25
+
26
+ def self.loaded?
27
+ !defined?(::Karafka).nil?
28
+ end
29
+
30
+ def self.compatible?
31
+ super && version >= MINIMUM_VERSION
32
+ end
33
+
34
+ def new_configuration
35
+ Configuration::Settings.new
36
+ end
37
+
38
+ def patcher
39
+ Patcher
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'ext'
4
+
5
+ module Datadog
6
+ module Tracing
7
+ module Contrib
8
+ module Karafka
9
+ # Custom monitor for Karafka.
10
+ # Creating a custom monitor, instead of subscribing to an event
11
+ # (e.g. `Karafka.monitor.subscribe 'worker.processed'`),
12
+ # is required because event subscriptions cannot wrap the event execution (`yield`).
13
+ module Monitor
14
+ TRACEABLE_EVENTS = %w[
15
+ worker.processed
16
+ ].freeze
17
+
18
+ def instrument(event_id, payload = EMPTY_HASH, &block)
19
+ return super unless TRACEABLE_EVENTS.include?(event_id)
20
+
21
+ Datadog::Tracing.trace(Ext::SPAN_WORKER_PROCESS) do |span|
22
+ job = payload[:job]
23
+ job_type = fetch_job_type(job.class)
24
+ consumer = job.executor.topic.consumer
25
+
26
+ action = case job_type
27
+ when 'Periodic', 'PeriodicNonBlocking'
28
+ 'tick'
29
+ when 'Shutdown'
30
+ 'shutdown'
31
+ when 'Revoked', 'RevokedNonBlocking'
32
+ 'revoked'
33
+ when 'Idle'
34
+ 'idle'
35
+ when 'Eofed', 'EofedNonBlocking'
36
+ 'eofed'
37
+ else
38
+ 'consume'
39
+ end
40
+
41
+ span.resource = "#{consumer}##{action}"
42
+
43
+ if action == 'consume'
44
+ span.set_tag(Ext::TAG_MESSAGE_COUNT, job.messages.count)
45
+ span.set_tag(Ext::TAG_PARTITION, job.executor.partition)
46
+ span.set_tag(Ext::TAG_OFFSET, job.messages.first.metadata.offset)
47
+ span.set_tag(Ext::TAG_CONSUMER, consumer)
48
+ span.set_tag(Contrib::Ext::Messaging::TAG_DESTINATION, job.executor.topic.name)
49
+ span.set_tag(Contrib::Ext::Messaging::TAG_SYSTEM, Ext::TAG_SYSTEM)
50
+ end
51
+
52
+ super
53
+ end
54
+ end
55
+
56
+ private
57
+
58
+ def fetch_job_type(job_class)
59
+ @job_types_cache ||= {}
60
+ @job_types_cache[job_class] ||= job_class.to_s.split('::').last
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../patcher'
4
+ require_relative 'ext'
5
+ require_relative 'distributed/propagation'
6
+
7
+ module Datadog
8
+ module Tracing
9
+ module Contrib
10
+ module Karafka
11
+ # Patch to add tracing to Karafka::Messages::Messages
12
+ module MessagesPatch
13
+ def configuration
14
+ Datadog.configuration.tracing[:karafka]
15
+ end
16
+
17
+ def propagation
18
+ @propagation ||= Contrib::Karafka::Distributed::Propagation.new
19
+ end
20
+
21
+ # `each` is the most popular access point to Karafka messages,
22
+ # but not the only one
23
+ # Other access patterns do not have a straightforward tracing avenue
24
+ # (e.g. `my_batch_operation messages.payloads`)
25
+ # @see https://github.com/karafka/karafka/blob/b06d1f7c17818e1605f80c2bb573454a33376b40/README.md?plain=1#L29-L35
26
+ def each(&block)
27
+ @messages_array.each do |message|
28
+ if configuration[:distributed_tracing]
29
+ headers = if message.metadata.respond_to?(:raw_headers)
30
+ message.metadata.raw_headers
31
+ else
32
+ message.metadata.headers
33
+ end
34
+ trace_digest = Karafka.extract(headers)
35
+ Datadog::Tracing.continue_trace!(trace_digest) if trace_digest
36
+ end
37
+
38
+ Tracing.trace(Ext::SPAN_MESSAGE_CONSUME) do |span|
39
+ span.set_tag(Ext::TAG_OFFSET, message.metadata.offset)
40
+ span.set_tag(Contrib::Ext::Messaging::TAG_DESTINATION, message.topic)
41
+ span.set_tag(Contrib::Ext::Messaging::TAG_SYSTEM, Ext::TAG_SYSTEM)
42
+
43
+ span.resource = message.topic
44
+
45
+ yield message
46
+ end
47
+ end
48
+ end
49
+ end
50
+
51
+ # Patcher enables patching of 'karafka' module.
52
+ module Patcher
53
+ include Contrib::Patcher
54
+
55
+ module_function
56
+
57
+ def target_version
58
+ Integration.version
59
+ end
60
+
61
+ def patch
62
+ require_relative 'monitor'
63
+
64
+ ::Karafka::Instrumentation::Monitor.prepend(Monitor)
65
+ ::Karafka::Messages::Messages.prepend(MessagesPatch)
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'component'
4
+ require_relative 'karafka/integration'
5
+ require_relative 'karafka/distributed/propagation'
6
+
7
+ module Datadog
8
+ module Tracing
9
+ module Contrib
10
+ # `Karafka` integration public API
11
+ module Karafka
12
+ def self.inject(digest, data)
13
+ raise 'Please invoke Datadog.configure at least once before calling this method' unless @propagation
14
+
15
+ @propagation.inject!(digest, data)
16
+ end
17
+
18
+ def self.extract(data)
19
+ raise 'Please invoke Datadog.configure at least once before calling this method' unless @propagation
20
+
21
+ @propagation.extract(data)
22
+ end
23
+
24
+ Contrib::Component.register('karafka') do |config|
25
+ tracing = config.tracing
26
+ tracing.propagation_style
27
+
28
+ @propagation = Karafka::Distributed::Propagation.new(
29
+ propagation_style_inject: tracing.propagation_style_inject,
30
+ propagation_style_extract: tracing.propagation_style_extract,
31
+ propagation_extract_first: tracing.propagation_extract_first
32
+ )
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -55,6 +55,7 @@ require_relative 'contrib/httpclient/integration'
55
55
  require_relative 'contrib/httprb/integration'
56
56
  require_relative 'contrib/integration'
57
57
  require_relative 'contrib/kafka/integration'
58
+ require_relative 'contrib/karafka'
58
59
  require_relative 'contrib/lograge/integration'
59
60
  require_relative 'contrib/mongodb/integration'
60
61
  require_relative 'contrib/mysql2/integration'
@@ -14,7 +14,7 @@ module Datadog
14
14
 
15
15
  attr_reader :api, :logger
16
16
 
17
- def initialize(api, logger)
17
+ def initialize(api, logger: Datadog.logger)
18
18
  @api = api
19
19
  @logger = logger
20
20
  end
@@ -18,7 +18,7 @@ module Datadog
18
18
  # Pass a block to override any settings.
19
19
  def default(
20
20
  agent_settings:,
21
- logger:,
21
+ logger: Datadog.logger,
22
22
  api_version: nil,
23
23
  headers: nil
24
24
  )
@@ -51,7 +51,7 @@ module Datadog
51
51
  # @param encoder [Datadog::Core::Encoding::Encoder]
52
52
  # @param logger [Datadog::Core::Logger]
53
53
  # @param max_size [String] maximum acceptable payload size
54
- def initialize(encoder, logger, native_events_supported:, max_size: DEFAULT_MAX_PAYLOAD_SIZE)
54
+ def initialize(encoder, logger:, native_events_supported:, max_size: DEFAULT_MAX_PAYLOAD_SIZE)
55
55
  @encoder = encoder
56
56
  @logger = logger
57
57
  @native_events_supported = native_events_supported
@@ -80,7 +80,12 @@ module Datadog
80
80
  private
81
81
 
82
82
  def encode_one(trace)
83
- encoded = Encoder.encode_trace(encoder, trace, logger, native_events_supported: @native_events_supported)
83
+ encoded = Encoder.encode_trace(
84
+ encoder,
85
+ trace,
86
+ logger: logger,
87
+ native_events_supported: @native_events_supported
88
+ )
84
89
 
85
90
  if encoded.size > max_size
86
91
  # This single trace is too large, we can't flush it
@@ -98,7 +103,7 @@ module Datadog
98
103
  module Encoder
99
104
  module_function
100
105
 
101
- def encode_trace(encoder, trace, logger, native_events_supported:)
106
+ def encode_trace(encoder, trace, logger:, native_events_supported:)
102
107
  # Format the trace for transport
103
108
  TraceFormatter.format!(trace)
104
109
 
@@ -121,7 +126,7 @@ module Datadog
121
126
  class Transport
122
127
  attr_reader :client, :apis, :default_api, :current_api_id, :logger
123
128
 
124
- def initialize(apis, default_api, logger)
129
+ def initialize(apis, default_api, logger: Datadog.logger)
125
130
  @apis = apis
126
131
  @default_api = default_api
127
132
  @logger = logger
@@ -133,7 +138,7 @@ module Datadog
133
138
  encoder = current_api.encoder
134
139
  chunker = Datadog::Tracing::Transport::Traces::Chunker.new(
135
140
  encoder,
136
- logger,
141
+ logger: logger,
137
142
  native_events_supported: native_events_supported?
138
143
  )
139
144
 
@@ -194,7 +199,7 @@ module Datadog
194
199
  raise UnknownApiVersionError, api_id unless apis.key?(api_id)
195
200
 
196
201
  @current_api_id = api_id
197
- @client = HTTP::Client.new(current_api, logger)
202
+ @client = HTTP::Client.new(current_api, logger: logger)
198
203
  end
199
204
 
200
205
  # Queries the agent for native span events serialization support.
@@ -3,7 +3,7 @@
3
3
  module Datadog
4
4
  module VERSION
5
5
  MAJOR = 2
6
- MINOR = 13
6
+ MINOR = 14
7
7
  PATCH = 0
8
8
  PRE = nil
9
9
  BUILD = nil
data/lib/datadog.rb CHANGED
@@ -9,5 +9,5 @@ require_relative 'datadog/profiling'
9
9
  require_relative 'datadog/appsec'
10
10
  # Line probes will not work on Ruby < 2.6 because of lack of :script_compiled
11
11
  # trace point. Only load DI on supported Ruby versions.
12
- require_relative 'datadog/di' if RUBY_VERSION >= '2.6'
12
+ require_relative 'datadog/di' if RUBY_VERSION >= '2.6' && RUBY_ENGINE != 'jruby'
13
13
  require_relative 'datadog/kit'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: datadog
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.13.0
4
+ version: 2.14.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Datadog, Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-04-02 00:00:00.000000000 Z
11
+ date: 2025-04-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: msgpack
@@ -690,6 +690,13 @@ files:
690
690
  - lib/datadog/tracing/contrib/kafka/ext.rb
691
691
  - lib/datadog/tracing/contrib/kafka/integration.rb
692
692
  - lib/datadog/tracing/contrib/kafka/patcher.rb
693
+ - lib/datadog/tracing/contrib/karafka.rb
694
+ - lib/datadog/tracing/contrib/karafka/configuration/settings.rb
695
+ - lib/datadog/tracing/contrib/karafka/distributed/propagation.rb
696
+ - lib/datadog/tracing/contrib/karafka/ext.rb
697
+ - lib/datadog/tracing/contrib/karafka/integration.rb
698
+ - lib/datadog/tracing/contrib/karafka/monitor.rb
699
+ - lib/datadog/tracing/contrib/karafka/patcher.rb
693
700
  - lib/datadog/tracing/contrib/lograge/configuration/settings.rb
694
701
  - lib/datadog/tracing/contrib/lograge/ext.rb
695
702
  - lib/datadog/tracing/contrib/lograge/instrumentation.rb
@@ -937,8 +944,8 @@ licenses:
937
944
  - Apache-2.0
938
945
  metadata:
939
946
  allowed_push_host: https://rubygems.org
940
- changelog_uri: https://github.com/DataDog/dd-trace-rb/blob/v2.13.0/CHANGELOG.md
941
- source_code_uri: https://github.com/DataDog/dd-trace-rb/tree/v2.13.0
947
+ changelog_uri: https://github.com/DataDog/dd-trace-rb/blob/v2.14.0/CHANGELOG.md
948
+ source_code_uri: https://github.com/DataDog/dd-trace-rb/tree/v2.14.0
942
949
  post_install_message:
943
950
  rdoc_options: []
944
951
  require_paths: