ddtrace 1.11.0.beta1 → 1.11.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +56 -1
  3. data/README.md +0 -1
  4. data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +34 -7
  5. data/lib/datadog/appsec/component.rb +1 -1
  6. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +2 -3
  7. data/lib/datadog/core/configuration/agent_settings_resolver.rb +62 -11
  8. data/lib/datadog/core/configuration/settings.rb +5 -6
  9. data/lib/datadog/core/environment/identity.rb +56 -0
  10. data/lib/datadog/core/remote/client.rb +98 -19
  11. data/lib/datadog/core/remote/component.rb +29 -21
  12. data/lib/datadog/core/remote/configuration/content.rb +2 -0
  13. data/lib/datadog/core/remote/configuration/repository.rb +15 -1
  14. data/lib/datadog/core/remote/configuration/target.rb +5 -3
  15. data/lib/datadog/core/remote/negotiation.rb +57 -0
  16. data/lib/datadog/core/transport/http/negotiation.rb +1 -1
  17. data/lib/datadog/core/workers/async.rb +6 -2
  18. data/lib/datadog/core/workers/interval_loop.rb +5 -1
  19. data/lib/datadog/tracing/contrib/active_record/configuration/settings.rb +6 -1
  20. data/lib/datadog/tracing/contrib/active_record/events/sql.rb +4 -1
  21. data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +4 -2
  22. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +2 -1
  23. data/lib/datadog/tracing/contrib/dalli/configuration/settings.rb +6 -1
  24. data/lib/datadog/tracing/contrib/dalli/instrumentation.rb +4 -1
  25. data/lib/datadog/tracing/contrib/elasticsearch/configuration/settings.rb +6 -1
  26. data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +4 -1
  27. data/lib/datadog/tracing/contrib/ethon/configuration/settings.rb +6 -1
  28. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +5 -3
  29. data/lib/datadog/tracing/contrib/ethon/multi_patch.rb +4 -2
  30. data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +6 -1
  31. data/lib/datadog/tracing/contrib/excon/middleware.rb +5 -2
  32. data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +6 -1
  33. data/lib/datadog/tracing/contrib/faraday/middleware.rb +5 -2
  34. data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +6 -1
  35. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +5 -2
  36. data/lib/datadog/tracing/contrib/http/configuration/settings.rb +6 -1
  37. data/lib/datadog/tracing/contrib/http/instrumentation.rb +5 -2
  38. data/lib/datadog/tracing/contrib/sidekiq/integration.rb +8 -0
  39. data/lib/datadog/tracing/contrib/sidekiq/patcher.rb +14 -2
  40. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/heartbeat.rb +9 -4
  41. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/stop.rb +34 -0
  42. data/lib/ddtrace/version.rb +4 -2
  43. metadata +6 -3
@@ -5,6 +5,7 @@ require_relative 'client/capabilities'
5
5
  require_relative 'client'
6
6
  require_relative '../transport/http'
7
7
  require_relative '../remote'
8
+ require_relative 'negotiation'
8
9
 
9
10
  module Datadog
10
11
  module Core
@@ -16,27 +17,43 @@ module Datadog
16
17
 
17
18
  attr_reader :client
18
19
 
19
- def initialize(settings, agent_settings)
20
+ def initialize(settings, capabilities, agent_settings)
20
21
  transport_options = {}
21
22
  transport_options[:agent_settings] = agent_settings if agent_settings
22
23
 
24
+ negotiation = Negotiation.new(settings, agent_settings)
23
25
  transport_v7 = Datadog::Core::Transport::HTTP.v7(**transport_options.dup)
24
26
 
25
- capabilities = Client::Capabilities.new(settings)
26
-
27
27
  @barrier = Barrier.new(BARRIER_TIMEOUT)
28
28
 
29
29
  @client = Client.new(transport_v7, capabilities)
30
+ healthy = false
31
+ Datadog.logger.debug { "new remote configuration client: #{@client.id}" }
32
+
30
33
  @worker = Worker.new(interval: settings.remote.poll_interval_seconds) do
34
+ unless healthy || negotiation.endpoint?('/v0.7/config')
35
+ @barrier.lift
36
+
37
+ next
38
+ end
39
+
31
40
  begin
32
41
  @client.sync
42
+ healthy ||= true
43
+ rescue Client::SyncError => e
44
+ Datadog.logger.error do
45
+ "remote worker client sync error: #{e.message} location: #{Array(e.backtrace).first}. skipping sync"
46
+ end
33
47
  rescue StandardError => e
34
48
  Datadog.logger.error do
35
- "remote worker error: #{e.class.name} #{e.message} location: #{Array(e.backtrace).first}"
49
+ "remote worker error: #{e.class.name} #{e.message} location: #{Array(e.backtrace).first}. "\
50
+ 'reseting client state'
36
51
  end
37
52
 
38
53
  # client state is unknown, state might be corrupted
39
54
  @client = Client.new(transport_v7, capabilities)
55
+ healthy = false
56
+ Datadog.logger.debug { "new remote configuration client: #{@client.id}" }
40
57
 
41
58
  # TODO: bail out if too many errors?
42
59
  end
@@ -116,32 +133,23 @@ module Datadog
116
133
  def build(settings, agent_settings)
117
134
  return unless settings.remote.enabled
118
135
 
119
- transport_options = {}
120
- transport_options[:agent_settings] = agent_settings if agent_settings
136
+ capabilities = Client::Capabilities.new(settings)
121
137
 
122
- transport_root = Datadog::Core::Transport::HTTP.root(**transport_options.dup)
138
+ return if capabilities.products.empty?
123
139
 
124
- res = transport_root.send_info
125
- if res.ok?
126
- if res.endpoints.include?('/v0.7/config')
127
- Datadog.logger.debug { 'agent reachable and reports remote configuration endpoint' }
128
- else
129
- Datadog.logger.error do
130
- 'agent reachable but does not report remote configuration endpoint: ' \
131
- 'disabling remote configuration for this process.'
132
- end
140
+ negotiation = Negotiation.new(settings, agent_settings)
133
141
 
134
- return
135
- end
136
- else
142
+ unless negotiation.endpoint?('/v0.7/config')
137
143
  Datadog.logger.error do
138
- 'agent unreachable: disabling remote configuration for this process.'
144
+ 'endpoint unavailable: disabling remote configuration for this process.'
139
145
  end
140
146
 
141
147
  return
142
148
  end
143
149
 
144
- new(settings, agent_settings)
150
+ Datadog.logger.debug { 'agent reachable and reports remote configuration endpoint' }
151
+
152
+ new(settings, capabilities, agent_settings)
145
153
  end
146
154
  end
147
155
  end
@@ -19,11 +19,13 @@ module Datadog
19
19
  end
20
20
 
21
21
  attr_reader :path, :data, :hashes
22
+ attr_accessor :version
22
23
 
23
24
  def initialize(path:, data:)
24
25
  @path = path
25
26
  @data = data
26
27
  @hashes = {}
28
+ @version = 0
27
29
  end
28
30
 
29
31
  def hexdigest(type)
@@ -78,7 +78,7 @@ module Datadog
78
78
  @repository = repository
79
79
  @root_version = repository.root_version
80
80
  @targets_version = repository.targets_version
81
- @config_states = []
81
+ @config_states = contents_to_config_states(repository.contents)
82
82
  @has_error = false
83
83
  @error = ''
84
84
  @opaque_backend_state = repository.opaque_backend_state
@@ -87,6 +87,18 @@ module Datadog
87
87
 
88
88
  private
89
89
 
90
+ def contents_to_config_states(contents)
91
+ return [] if contents.empty?
92
+
93
+ contents.map do |content|
94
+ {
95
+ id: content.path.config_id,
96
+ version: content.version,
97
+ product: content.path.product
98
+ }
99
+ end
100
+ end
101
+
90
102
  def contents_to_cached_target_files(contents)
91
103
  return [] if contents.empty?
92
104
 
@@ -164,6 +176,7 @@ module Datadog
164
176
  def apply(repository)
165
177
  return unless repository[@path].nil?
166
178
 
179
+ @content.version = @target.version
167
180
  repository.contents << @content
168
181
 
169
182
  @path
@@ -184,6 +197,7 @@ module Datadog
184
197
  def apply(repository)
185
198
  return if repository[@path].nil?
186
199
 
200
+ @content.version = @target.version
187
201
  repository.contents[@path] = @content
188
202
 
189
203
  @path
@@ -48,16 +48,18 @@ module Datadog
48
48
  def parse(hash)
49
49
  length = Integer(hash['length'])
50
50
  digests = Configuration::DigestList.parse(hash['hashes'])
51
+ version = Integer(hash['custom']['v'])
51
52
 
52
- new(digests: digests, length: length)
53
+ new(digests: digests, length: length, version: version)
53
54
  end
54
55
  end
55
56
 
56
- attr_reader :length, :digests
57
+ attr_reader :length, :digests, :version
57
58
 
58
- def initialize(digests:, length:)
59
+ def initialize(digests:, length:, version:)
59
60
  @digests = digests
60
61
  @length = length
62
+ @version = version
61
63
  end
62
64
 
63
65
  private_class_method :new
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../transport/http'
4
+
5
+ module Datadog
6
+ module Core
7
+ module Remote
8
+ # Endpoint negotiation
9
+ class Negotiation
10
+ def initialize(_settings, agent_settings)
11
+ transport_options = {}
12
+ transport_options[:agent_settings] = agent_settings if agent_settings
13
+
14
+ @transport_root = Datadog::Core::Transport::HTTP.root(**transport_options.dup)
15
+ end
16
+
17
+ def endpoint?(path)
18
+ res = @transport_root.send_info
19
+
20
+ if res.internal_error? && network_error?(res.error)
21
+ Datadog.logger.error { "agent unreachable: cannot negotiate #{path}" }
22
+
23
+ return false
24
+ end
25
+
26
+ if res.not_found?
27
+ Datadog.logger.error { "agent reachable but has no /info endpoint: cannot negotiate #{path}" }
28
+
29
+ return false
30
+ end
31
+
32
+ unless res.ok?
33
+ Datadog.logger.error { "agent reachable but unexpected response: cannot negotiate #{path}" }
34
+
35
+ return false
36
+ end
37
+
38
+ unless res.endpoints.include?(path)
39
+ Datadog.logger.error { "agent reachable but does not report #{path}" }
40
+
41
+ return false
42
+ end
43
+
44
+ Datadog.logger.debug { "agent reachable and reports #{path}" }
45
+
46
+ true
47
+ end
48
+
49
+ private
50
+
51
+ def network_error?(error)
52
+ error.is_a?(Errno::ECONNREFUSED)
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -122,7 +122,7 @@ module Datadog
122
122
  http_response = super(env, &block)
123
123
 
124
124
  # Process the response
125
- body = JSON.parse(http_response.payload, symbolize_names: true)
125
+ body = JSON.parse(http_response.payload, symbolize_names: true) if http_response.ok?
126
126
 
127
127
  # TODO: there should be more processing here to ensure a proper response_options
128
128
  response_options = body.is_a?(Hash) ? body : {}
@@ -11,6 +11,10 @@ module Datadog
11
11
  FORK_POLICY_RESTART = :restart
12
12
  SHUTDOWN_TIMEOUT = 1
13
13
 
14
+ # This single shared mutex is used to avoid concurrency issues during the
15
+ # initialization of per-instance lazy-initialized mutexes.
16
+ MUTEX_INIT = Mutex.new
17
+
14
18
  def self.included(base)
15
19
  base.prepend(PrependedMethods)
16
20
  end
@@ -86,7 +90,7 @@ module Datadog
86
90
  :result
87
91
 
88
92
  def mutex
89
- @mutex ||= Mutex.new
93
+ @mutex || MUTEX_INIT.synchronize { @mutex ||= Mutex.new }
90
94
  end
91
95
 
92
96
  def after_fork
@@ -99,7 +103,7 @@ module Datadog
99
103
  :pid
100
104
 
101
105
  def mutex_after_fork
102
- @mutex_after_fork ||= Mutex.new
106
+ @mutex_after_fork || MUTEX_INIT.synchronize { @mutex_after_fork ||= Mutex.new }
103
107
  end
104
108
 
105
109
  def worker
@@ -10,6 +10,10 @@ module Datadog
10
10
  BACK_OFF_MAX = 5
11
11
  BASE_INTERVAL = 1
12
12
 
13
+ # This single shared mutex is used to avoid concurrency issues during the
14
+ # initialization of per-instance lazy-initialized mutexes.
15
+ MUTEX_INIT = Mutex.new
16
+
13
17
  def self.included(base)
14
18
  base.prepend(PrependedMethods)
15
19
  end
@@ -82,7 +86,7 @@ module Datadog
82
86
  :loop_base_interval
83
87
 
84
88
  def mutex
85
- @mutex ||= Mutex.new
89
+ @mutex || MUTEX_INIT.synchronize { @mutex ||= Mutex.new }
86
90
  end
87
91
 
88
92
  private
@@ -28,7 +28,12 @@ module Datadog
28
28
  end
29
29
 
30
30
  option :service_name do |o|
31
- o.default { Utils.adapter_name }
31
+ o.default do
32
+ Contrib::SpanAttributeSchema.fetch_service_name(
33
+ '',
34
+ Utils.adapter_name
35
+ )
36
+ end
32
37
  o.lazy
33
38
  end
34
39
  end
@@ -46,7 +46,10 @@ module Datadog
46
46
  span.set_tag(Tracing::Metadata::Ext::TAG_OPERATION, Ext::TAG_OPERATION_SQL)
47
47
 
48
48
  # Tag as an external peer service
49
- span.set_tag(Tracing::Metadata::Ext::TAG_PEER_SERVICE, span.service)
49
+ if Contrib::SpanAttributeSchema.default_span_attribute_schema?
50
+ span.set_tag(Tracing::Metadata::Ext::TAG_PEER_SERVICE, span.service)
51
+ end
52
+
50
53
  # TODO: Populate hostname for JDBC connections
51
54
  span.set_tag(Tracing::Metadata::Ext::TAG_PEER_HOSTNAME, config[:host]) if config[:host]
52
55
 
@@ -42,8 +42,10 @@ module Datadog
42
42
  span.set_tag(Tracing::Metadata::Ext::TAG_COMPONENT, Ext::TAG_COMPONENT)
43
43
  span.set_tag(Tracing::Metadata::Ext::TAG_OPERATION, Ext::TAG_OPERATION_CACHE)
44
44
 
45
- # Tag as an external peer service
46
- span.set_tag(Tracing::Metadata::Ext::TAG_PEER_SERVICE, service)
45
+ if Contrib::SpanAttributeSchema.default_span_attribute_schema?
46
+ # Tag as an external peer service
47
+ span.set_tag(Tracing::Metadata::Ext::TAG_PEER_SERVICE, service)
48
+ end
47
49
 
48
50
  tracing_context[:dd_cache_span] = span
49
51
  rescue StandardError => e
@@ -42,9 +42,10 @@ module Datadog
42
42
  # Tag as an external peer service
43
43
  if Contrib::SpanAttributeSchema.default_span_attribute_schema?
44
44
  span.set_tag(Tracing::Metadata::Ext::TAG_PEER_SERVICE, span.service)
45
- span.set_tag(Tracing::Metadata::Ext::TAG_PEER_HOSTNAME, context.safely(:host))
46
45
  end
47
46
 
47
+ span.set_tag(Tracing::Metadata::Ext::TAG_PEER_HOSTNAME, context.safely(:host))
48
+
48
49
  # Set analytics sample rate
49
50
  if Contrib::Analytics.enabled?(configuration[:analytics_enabled])
50
51
  Contrib::Analytics.set_sample_rate(span, configuration[:analytics_sample_rate])
@@ -27,7 +27,12 @@ module Datadog
27
27
  end
28
28
 
29
29
  option :service_name do |o|
30
- o.default { ENV.fetch(Ext::ENV_SERVICE_NAME, Ext::DEFAULT_PEER_SERVICE_NAME) }
30
+ o.default do
31
+ Contrib::SpanAttributeSchema.fetch_service_name(
32
+ Ext::ENV_SERVICE_NAME,
33
+ Ext::DEFAULT_PEER_SERVICE_NAME
34
+ )
35
+ end
31
36
  o.lazy
32
37
  end
33
38
  end
@@ -28,7 +28,10 @@ module Datadog
28
28
  span.set_tag(Tracing::Metadata::Ext::TAG_OPERATION, Ext::TAG_OPERATION_COMMAND)
29
29
 
30
30
  # Tag as an external peer service
31
- span.set_tag(Tracing::Metadata::Ext::TAG_PEER_SERVICE, span.service)
31
+ if Contrib::SpanAttributeSchema.default_span_attribute_schema?
32
+ span.set_tag(Tracing::Metadata::Ext::TAG_PEER_SERVICE, span.service)
33
+ end
34
+
32
35
  span.set_tag(Tracing::Metadata::Ext::TAG_PEER_HOSTNAME, hostname)
33
36
 
34
37
  # Set analytics sample rate
@@ -29,7 +29,12 @@ module Datadog
29
29
  option :quantize, default: {}
30
30
 
31
31
  option :service_name do |o|
32
- o.default { ENV.fetch(Ext::ENV_SERVICE_NAME, Ext::DEFAULT_PEER_SERVICE_NAME) }
32
+ o.default do
33
+ Contrib::SpanAttributeSchema.fetch_service_name(
34
+ Ext::ENV_SERVICE_NAME,
35
+ Ext::DEFAULT_PEER_SERVICE_NAME
36
+ )
37
+ end
33
38
  o.lazy
34
39
  end
35
40
  end
@@ -90,7 +90,10 @@ module Datadog
90
90
  body = JSON.generate(body) if body && !body.is_a?(String)
91
91
 
92
92
  # Tag as an external peer service
93
- span.set_tag(Tracing::Metadata::Ext::TAG_PEER_SERVICE, span.service)
93
+ if Contrib::SpanAttributeSchema.default_span_attribute_schema?
94
+ span.set_tag(Tracing::Metadata::Ext::TAG_PEER_SERVICE, span.service)
95
+ end
96
+
94
97
  span.set_tag(Tracing::Metadata::Ext::TAG_PEER_HOSTNAME, host) if host
95
98
 
96
99
  # Set analytics sample rate
@@ -31,7 +31,12 @@ module Datadog
31
31
  option :split_by_domain, default: false
32
32
 
33
33
  option :service_name do |o|
34
- o.default { ENV.fetch(Ext::ENV_SERVICE_NAME, Ext::DEFAULT_PEER_SERVICE_NAME) }
34
+ o.default do
35
+ Contrib::SpanAttributeSchema.fetch_service_name(
36
+ Ext::ENV_SERVICE_NAME,
37
+ Ext::DEFAULT_PEER_SERVICE_NAME
38
+ )
39
+ end
35
40
  o.lazy
36
41
  end
37
42
  end
@@ -121,8 +121,11 @@ module Datadog
121
121
  method = Ext::NOT_APPLICABLE_METHOD
122
122
  method = @datadog_method.to_s if instance_variable_defined?(:@datadog_method) && !@datadog_method.nil?
123
123
  span.resource = method
124
- # Tag as an external peer service
125
- span.set_tag(Tracing::Metadata::Ext::TAG_PEER_SERVICE, span.service)
124
+
125
+ if Contrib::SpanAttributeSchema.default_span_attribute_schema?
126
+ # Tag as an external peer service
127
+ span.set_tag(Tracing::Metadata::Ext::TAG_PEER_SERVICE, span.service)
128
+ end
126
129
  # Set analytics sample rate
127
130
  Contrib::Analytics.set_sample_rate(span, analytics_sample_rate) if analytics_enabled?
128
131
 
@@ -138,7 +141,6 @@ module Datadog
138
141
  span.set_tag(Tracing::Metadata::Ext::HTTP::TAG_METHOD, method)
139
142
  span.set_tag(Tracing::Metadata::Ext::NET::TAG_TARGET_HOST, uri.host)
140
143
  span.set_tag(Tracing::Metadata::Ext::NET::TAG_TARGET_PORT, uri.port)
141
-
142
144
  span.set_tag(Tracing::Metadata::Ext::TAG_PEER_HOSTNAME, uri.host)
143
145
  end
144
146
 
@@ -69,8 +69,10 @@ module Datadog
69
69
 
70
70
  @datadog_multi_span.set_tag(Tracing::Metadata::Ext::TAG_KIND, Tracing::Metadata::Ext::SpanKind::TAG_CLIENT)
71
71
 
72
- # Tag as an external peer service
73
- @datadog_multi_span.set_tag(Tracing::Metadata::Ext::TAG_PEER_SERVICE, @datadog_multi_span.service)
72
+ if Contrib::SpanAttributeSchema.default_span_attribute_schema?
73
+ # Tag as an external peer service
74
+ @datadog_multi_span.set_tag(Tracing::Metadata::Ext::TAG_PEER_SERVICE, @datadog_multi_span.service)
75
+ end
74
76
 
75
77
  # Set analytics sample rate
76
78
  Contrib::Analytics.set_sample_rate(@datadog_multi_span, analytics_sample_rate) if analytics_enabled?
@@ -31,7 +31,12 @@ module Datadog
31
31
  option :split_by_domain, default: false
32
32
 
33
33
  option :service_name do |o|
34
- o.default { ENV.fetch(Ext::ENV_SERVICE_NAME, Ext::DEFAULT_PEER_SERVICE_NAME) }
34
+ o.default do
35
+ Contrib::SpanAttributeSchema.fetch_service_name(
36
+ Ext::ENV_SERVICE_NAME,
37
+ Ext::DEFAULT_PEER_SERVICE_NAME
38
+ )
39
+ end
35
40
  o.lazy
36
41
  end
37
42
  end
@@ -119,8 +119,11 @@ module Datadog
119
119
  span.set_tag(Tracing::Metadata::Ext::TAG_COMPONENT, Ext::TAG_COMPONENT)
120
120
  span.set_tag(Tracing::Metadata::Ext::TAG_OPERATION, Ext::TAG_OPERATION_REQUEST)
121
121
 
122
- # Tag as an external peer service
123
- span.set_tag(Tracing::Metadata::Ext::TAG_PEER_SERVICE, span.service)
122
+ if Contrib::SpanAttributeSchema.default_span_attribute_schema?
123
+ # Tag as an external peer service
124
+ span.set_tag(Tracing::Metadata::Ext::TAG_PEER_SERVICE, span.service)
125
+ end
126
+
124
127
  span.set_tag(Tracing::Metadata::Ext::TAG_PEER_HOSTNAME, datum[:host])
125
128
 
126
129
  # Set analytics sample rate
@@ -35,7 +35,12 @@ module Datadog
35
35
  option :split_by_domain, default: false
36
36
 
37
37
  option :service_name do |o|
38
- o.default { ENV.fetch(Ext::ENV_SERVICE_NAME, Ext::DEFAULT_PEER_SERVICE_NAME) }
38
+ o.default do
39
+ Contrib::SpanAttributeSchema.fetch_service_name(
40
+ Ext::ENV_SERVICE_NAME,
41
+ Ext::DEFAULT_PEER_SERVICE_NAME
42
+ )
43
+ end
39
44
  o.lazy
40
45
  end
41
46
  end
@@ -45,8 +45,11 @@ module Datadog
45
45
  span.set_tag(Tracing::Metadata::Ext::TAG_COMPONENT, Ext::TAG_COMPONENT)
46
46
  span.set_tag(Tracing::Metadata::Ext::TAG_OPERATION, Ext::TAG_OPERATION_REQUEST)
47
47
 
48
- # Tag as an external peer service
49
- span.set_tag(Tracing::Metadata::Ext::TAG_PEER_SERVICE, span.service)
48
+ if Contrib::SpanAttributeSchema.default_span_attribute_schema?
49
+ # Tag as an external peer service
50
+ span.set_tag(Tracing::Metadata::Ext::TAG_PEER_SERVICE, span.service)
51
+ end
52
+
50
53
  span.set_tag(Tracing::Metadata::Ext::TAG_PEER_HOSTNAME, env[:url].host)
51
54
 
52
55
  # Set analytics sample rate
@@ -30,7 +30,12 @@ module Datadog
30
30
  option :distributed_tracing, default: true
31
31
 
32
32
  option :service_name do |o|
33
- o.default { ENV.fetch(Ext::ENV_SERVICE_NAME, Ext::DEFAULT_PEER_SERVICE_NAME) }
33
+ o.default do
34
+ Contrib::SpanAttributeSchema.fetch_service_name(
35
+ Ext::ENV_SERVICE_NAME,
36
+ Ext::DEFAULT_PEER_SERVICE_NAME
37
+ )
38
+ end
34
39
  o.lazy
35
40
  end
36
41
 
@@ -43,8 +43,11 @@ module Datadog
43
43
  span.set_tag(Tracing::Metadata::Ext::TAG_COMPONENT, Ext::TAG_COMPONENT)
44
44
  span.set_tag(Tracing::Metadata::Ext::TAG_OPERATION, Ext::TAG_OPERATION_CLIENT)
45
45
 
46
- # Tag as an external peer service
47
- span.set_tag(Tracing::Metadata::Ext::TAG_PEER_SERVICE, span.service)
46
+ if Contrib::SpanAttributeSchema.default_span_attribute_schema?
47
+ # Tag as an external peer service
48
+ span.set_tag(Tracing::Metadata::Ext::TAG_PEER_SERVICE, span.service)
49
+ end
50
+
48
51
  host, _port = find_host_port(call)
49
52
  span.set_tag(Tracing::Metadata::Ext::TAG_PEER_HOSTNAME, host) if host
50
53
 
@@ -29,7 +29,12 @@ module Datadog
29
29
  option :distributed_tracing, default: true
30
30
 
31
31
  option :service_name do |o|
32
- o.default { ENV.fetch(Ext::ENV_SERVICE_NAME, Ext::DEFAULT_PEER_SERVICE_NAME) }
32
+ o.default do
33
+ Contrib::SpanAttributeSchema.fetch_service_name(
34
+ Ext::ENV_SERVICE_NAME,
35
+ Ext::DEFAULT_PEER_SERVICE_NAME
36
+ )
37
+ end
33
38
  o.lazy
34
39
  end
35
40
 
@@ -80,8 +80,11 @@ module Datadog
80
80
  span.set_tag(Tracing::Metadata::Ext::NET::TAG_TARGET_HOST, host)
81
81
  span.set_tag(Tracing::Metadata::Ext::NET::TAG_TARGET_PORT, port.to_s)
82
82
 
83
- # Tag as an external peer service
84
- span.set_tag(Tracing::Metadata::Ext::TAG_PEER_SERVICE, span.service)
83
+ if Contrib::SpanAttributeSchema.default_span_attribute_schema?
84
+ # Tag as an external peer service
85
+ span.set_tag(Tracing::Metadata::Ext::TAG_PEER_SERVICE, span.service)
86
+ end
87
+
85
88
  span.set_tag(Tracing::Metadata::Ext::TAG_PEER_HOSTNAME, host)
86
89
 
87
90
  # Set analytics sample rate
@@ -12,6 +12,7 @@ module Datadog
12
12
 
13
13
  MINIMUM_VERSION = Gem::Version.new('3.5.4')
14
14
  MINIMUM_SERVER_INTERNAL_TRACING_VERSION = Gem::Version.new('5.2.4')
15
+ MINIMUM_CAPSULE_VERSION = Gem::Version.new('7.0.0')
15
16
 
16
17
  # @public_api Changing the integration name or integration options can cause breaking changes
17
18
  register_as :sidekiq
@@ -37,6 +38,13 @@ module Datadog
37
38
  version >= MINIMUM_SERVER_INTERNAL_TRACING_VERSION
38
39
  end
39
40
 
41
+ # Capsules are a new way of configuring Sidekiq that was introduced in version 7
42
+ # that change the way some of the configuration data is exposed. Certain patches
43
+ # are applied differently for versions of Sidekiq that support capsules.
44
+ def self.supports_capsules?
45
+ version >= MINIMUM_CAPSULE_VERSION
46
+ end
47
+
40
48
  def new_configuration
41
49
  Configuration::Settings.new
42
50
  end
@@ -49,9 +49,17 @@ module Datadog
49
49
  end
50
50
 
51
51
  def patch_server_heartbeat
52
+ require_relative 'server_internal_tracer/stop'
52
53
  require_relative 'server_internal_tracer/heartbeat'
53
54
 
54
- ::Sidekiq::Launcher.prepend(ServerInternalTracer::Heartbeat)
55
+ ::Sidekiq::Launcher.prepend(ServerInternalTracer::Stop)
56
+
57
+ # Sidekiq 7 changed method `heartbeat` to `beat`
58
+ if ::Sidekiq::Launcher.private_method_defined? :heartbeat
59
+ ::Sidekiq::Launcher.prepend(ServerInternalTracer::Heartbeat)
60
+ end
61
+
62
+ ::Sidekiq::Launcher.prepend(ServerInternalTracer::Beat) if ::Sidekiq::Launcher.private_method_defined? :beat
55
63
  end
56
64
 
57
65
  def patch_server_job_fetch
@@ -69,7 +77,11 @@ module Datadog
69
77
  def patch_redis_info
70
78
  require_relative 'server_internal_tracer/redis_info'
71
79
 
72
- ::Sidekiq.singleton_class.prepend(ServerInternalTracer::RedisInfo)
80
+ if Integration.supports_capsules?
81
+ ::Sidekiq::Config.prepend(ServerInternalTracer::RedisInfo)
82
+ else
83
+ ::Sidekiq.singleton_class.prepend(ServerInternalTracer::RedisInfo)
84
+ end
73
85
  end
74
86
  end
75
87
  end