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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +16 -1
- data/lib/datadog/core/environment/agent_info.rb +1 -1
- data/lib/datadog/core/metrics/client.rb +1 -1
- data/lib/datadog/core/remote/client.rb +1 -1
- data/lib/datadog/core/remote/negotiation.rb +1 -1
- data/lib/datadog/core/remote/transport/config.rb +2 -2
- data/lib/datadog/core/remote/transport/http/client.rb +1 -1
- data/lib/datadog/core/remote/transport/http.rb +2 -2
- data/lib/datadog/core/remote/transport/negotiation.rb +2 -2
- data/lib/datadog/core/transport/http/builder.rb +2 -2
- data/lib/datadog/core/transport/http.rb +1 -1
- data/lib/datadog/di/transport/diagnostics.rb +2 -2
- data/lib/datadog/di/transport/http/client.rb +1 -1
- data/lib/datadog/di/transport/input.rb +2 -2
- data/lib/datadog/kit/appsec/events.rb +6 -3
- data/lib/datadog/tracing/contrib/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/karafka/configuration/settings.rb +27 -0
- data/lib/datadog/tracing/contrib/karafka/distributed/propagation.rb +46 -0
- data/lib/datadog/tracing/contrib/karafka/ext.rb +27 -0
- data/lib/datadog/tracing/contrib/karafka/integration.rb +45 -0
- data/lib/datadog/tracing/contrib/karafka/monitor.rb +66 -0
- data/lib/datadog/tracing/contrib/karafka/patcher.rb +71 -0
- data/lib/datadog/tracing/contrib/karafka.rb +37 -0
- data/lib/datadog/tracing/contrib.rb +1 -0
- data/lib/datadog/tracing/transport/http/client.rb +1 -1
- data/lib/datadog/tracing/transport/http.rb +1 -1
- data/lib/datadog/tracing/transport/traces.rb +11 -6
- data/lib/datadog/version.rb +1 -1
- data/lib/datadog.rb +1 -1
- metadata +11 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d6f1f9a8bd097f353792ce207813881aadce161aaef09d6790c551686de7d53e
|
4
|
+
data.tar.gz: 34dbaf125e9b9a3ce3eec376546ae3817f42f3556033a27b83b69578372b2475
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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.
|
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)
|
@@ -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
|
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
|
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!
|
@@ -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
|
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
|
@@ -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'
|
@@ -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
|
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(
|
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
|
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.
|
data/lib/datadog/version.rb
CHANGED
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.
|
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-
|
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.
|
941
|
-
source_code_uri: https://github.com/DataDog/dd-trace-rb/tree/v2.
|
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:
|