ddtrace 1.14.0 → 1.15.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 (270) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +178 -2
  3. data/ext/ddtrace_profiling_native_extension/NativeExtensionDesign.md +3 -5
  4. data/ext/ddtrace_profiling_native_extension/clock_id.h +0 -3
  5. data/ext/ddtrace_profiling_native_extension/clock_id_from_pthread.c +0 -22
  6. data/ext/ddtrace_profiling_native_extension/clock_id_noop.c +0 -1
  7. data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +41 -6
  8. data/ext/ddtrace_profiling_native_extension/collectors_idle_sampling_helper.c +3 -0
  9. data/ext/ddtrace_profiling_native_extension/collectors_stack.c +76 -24
  10. data/ext/ddtrace_profiling_native_extension/collectors_stack.h +1 -1
  11. data/ext/ddtrace_profiling_native_extension/collectors_thread_context.c +207 -32
  12. data/ext/ddtrace_profiling_native_extension/collectors_thread_context.h +1 -1
  13. data/ext/ddtrace_profiling_native_extension/extconf.rb +8 -2
  14. data/ext/ddtrace_profiling_native_extension/http_transport.c +26 -10
  15. data/ext/ddtrace_profiling_native_extension/libdatadog_helpers.c +42 -0
  16. data/ext/ddtrace_profiling_native_extension/libdatadog_helpers.h +6 -0
  17. data/ext/ddtrace_profiling_native_extension/native_extension_helpers.rb +1 -16
  18. data/ext/ddtrace_profiling_native_extension/pid_controller.c +57 -0
  19. data/ext/ddtrace_profiling_native_extension/pid_controller.h +45 -0
  20. data/ext/ddtrace_profiling_native_extension/private_vm_api_access.c +17 -12
  21. data/ext/ddtrace_profiling_native_extension/profiling.c +0 -2
  22. data/ext/ddtrace_profiling_native_extension/stack_recorder.c +74 -37
  23. data/ext/ddtrace_profiling_native_extension/stack_recorder.h +13 -3
  24. data/lib/datadog/appsec/assets/waf_rules/processors.json +92 -0
  25. data/lib/datadog/appsec/assets/waf_rules/recommended.json +698 -75
  26. data/lib/datadog/appsec/assets/waf_rules/scanners.json +114 -0
  27. data/lib/datadog/appsec/assets/waf_rules/strict.json +98 -8
  28. data/lib/datadog/appsec/assets.rb +8 -0
  29. data/lib/datadog/appsec/component.rb +9 -2
  30. data/lib/datadog/appsec/configuration/settings.rb +61 -2
  31. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +8 -6
  32. data/lib/datadog/appsec/contrib/rack/reactive/request.rb +2 -7
  33. data/lib/datadog/appsec/contrib/rack/reactive/request_body.rb +2 -5
  34. data/lib/datadog/appsec/contrib/rack/reactive/response.rb +2 -5
  35. data/lib/datadog/appsec/contrib/rack/request_body_middleware.rb +3 -2
  36. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +23 -9
  37. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +3 -2
  38. data/lib/datadog/appsec/contrib/rails/patcher.rb +9 -3
  39. data/lib/datadog/appsec/contrib/rails/reactive/action.rb +2 -5
  40. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +6 -4
  41. data/lib/datadog/appsec/contrib/sinatra/patcher.rb +13 -7
  42. data/lib/datadog/appsec/contrib/sinatra/reactive/routed.rb +2 -5
  43. data/lib/datadog/appsec/event.rb +106 -50
  44. data/lib/datadog/appsec/monitor/gateway/watcher.rb +3 -3
  45. data/lib/datadog/appsec/monitor/reactive/set_user.rb +2 -5
  46. data/lib/datadog/appsec/processor/actions.rb +49 -0
  47. data/lib/datadog/appsec/processor/rule_merger.rb +22 -2
  48. data/lib/datadog/appsec/processor.rb +34 -6
  49. data/lib/datadog/appsec/remote.rb +4 -1
  50. data/lib/datadog/appsec/response.rb +82 -4
  51. data/lib/datadog/appsec/sample_rate.rb +21 -0
  52. data/lib/datadog/appsec.rb +2 -2
  53. data/lib/datadog/core/configuration/agent_settings_resolver.rb +29 -24
  54. data/lib/datadog/core/configuration/base.rb +1 -11
  55. data/lib/datadog/core/configuration/components.rb +7 -2
  56. data/lib/datadog/core/configuration/ext.rb +21 -0
  57. data/lib/datadog/core/configuration/option.rb +2 -4
  58. data/lib/datadog/core/configuration/option_definition.rb +17 -41
  59. data/lib/datadog/core/configuration/options.rb +5 -5
  60. data/lib/datadog/core/configuration/settings.rb +47 -45
  61. data/lib/datadog/core/environment/execution.rb +47 -9
  62. data/lib/datadog/core/environment/variable_helpers.rb +0 -69
  63. data/lib/datadog/core/error.rb +1 -0
  64. data/lib/datadog/core/git/ext.rb +2 -0
  65. data/lib/datadog/core/remote/client/capabilities.rb +1 -1
  66. data/lib/datadog/core/remote/component.rb +2 -2
  67. data/lib/datadog/core/remote/negotiation.rb +2 -2
  68. data/lib/datadog/core/remote/transport/config.rb +60 -0
  69. data/lib/datadog/core/remote/transport/http/api/instance.rb +39 -0
  70. data/lib/datadog/core/remote/transport/http/api/spec.rb +21 -0
  71. data/lib/datadog/core/remote/transport/http/api.rb +58 -0
  72. data/lib/datadog/core/remote/transport/http/builder.rb +219 -0
  73. data/lib/datadog/core/remote/transport/http/client.rb +48 -0
  74. data/lib/datadog/core/remote/transport/http/config.rb +280 -0
  75. data/lib/datadog/core/remote/transport/http/negotiation.rb +146 -0
  76. data/lib/datadog/core/remote/transport/http.rb +179 -0
  77. data/lib/datadog/core/{transport → remote/transport}/negotiation.rb +25 -23
  78. data/lib/datadog/core/telemetry/collector.rb +3 -2
  79. data/lib/datadog/core/telemetry/http/transport.rb +2 -1
  80. data/lib/datadog/core/transport/ext.rb +47 -0
  81. data/lib/datadog/core/transport/http/adapters/net.rb +168 -0
  82. data/lib/datadog/core/transport/http/adapters/registry.rb +29 -0
  83. data/lib/datadog/core/transport/http/adapters/test.rb +89 -0
  84. data/lib/datadog/core/transport/http/adapters/unix_socket.rb +83 -0
  85. data/lib/datadog/core/transport/http/api/endpoint.rb +31 -0
  86. data/lib/datadog/core/transport/http/api/fallbacks.rb +26 -0
  87. data/lib/datadog/core/transport/http/api/map.rb +18 -0
  88. data/lib/datadog/core/transport/http/env.rb +62 -0
  89. data/lib/datadog/core/transport/http/response.rb +60 -0
  90. data/lib/datadog/core/transport/parcel.rb +22 -0
  91. data/lib/datadog/core/transport/request.rb +17 -0
  92. data/lib/datadog/core/transport/response.rb +64 -0
  93. data/lib/datadog/core/workers/polling.rb +2 -2
  94. data/lib/datadog/opentelemetry/api/context.rb +10 -3
  95. data/lib/datadog/opentelemetry/sdk/propagator.rb +2 -1
  96. data/lib/datadog/opentelemetry/sdk/span_processor.rb +14 -2
  97. data/lib/datadog/opentelemetry/sdk/trace/span.rb +68 -0
  98. data/lib/datadog/opentelemetry/trace.rb +58 -0
  99. data/lib/datadog/opentelemetry.rb +1 -0
  100. data/lib/datadog/opentracer.rb +9 -0
  101. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +12 -18
  102. data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +1 -1
  103. data/lib/datadog/profiling/collectors/thread_context.rb +9 -1
  104. data/lib/datadog/profiling/component.rb +24 -99
  105. data/lib/datadog/profiling/ext.rb +0 -12
  106. data/lib/datadog/profiling/flush.rb +0 -3
  107. data/lib/datadog/profiling/http_transport.rb +6 -3
  108. data/lib/datadog/profiling/native_extension.rb +0 -21
  109. data/lib/datadog/profiling/profiler.rb +11 -12
  110. data/lib/datadog/profiling.rb +8 -81
  111. data/lib/datadog/tracing/component.rb +10 -4
  112. data/lib/datadog/tracing/configuration/agent_settings_resolver.rb +13 -0
  113. data/lib/datadog/tracing/configuration/ext.rb +4 -2
  114. data/lib/datadog/tracing/configuration/settings.rb +14 -7
  115. data/lib/datadog/tracing/contrib/action_pack/configuration/settings.rb +1 -1
  116. data/lib/datadog/tracing/contrib/active_job/configuration/settings.rb +1 -1
  117. data/lib/datadog/tracing/contrib/active_record/events/sql.rb +4 -0
  118. data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +104 -197
  119. data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +3 -0
  120. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +7 -0
  121. data/lib/datadog/tracing/contrib/configuration/settings.rb +1 -1
  122. data/lib/datadog/tracing/contrib/dalli/configuration/settings.rb +6 -0
  123. data/lib/datadog/tracing/contrib/dalli/ext.rb +7 -0
  124. data/lib/datadog/tracing/contrib/dalli/instrumentation.rb +9 -2
  125. data/lib/datadog/tracing/contrib/delayed_job/configuration/settings.rb +1 -1
  126. data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +5 -0
  127. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +5 -0
  128. data/lib/datadog/tracing/contrib/ethon/multi_patch.rb +8 -0
  129. data/lib/datadog/tracing/contrib/excon/middleware.rb +5 -0
  130. data/lib/datadog/tracing/contrib/ext.rb +3 -0
  131. data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +1 -1
  132. data/lib/datadog/tracing/contrib/faraday/middleware.rb +5 -0
  133. data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +21 -1
  134. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +11 -1
  135. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +18 -0
  136. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor.rb +0 -4
  137. data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +3 -3
  138. data/lib/datadog/tracing/contrib/http/instrumentation.rb +5 -0
  139. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +5 -0
  140. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +5 -0
  141. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +7 -0
  142. data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +13 -3
  143. data/lib/datadog/tracing/contrib/opensearch/integration.rb +2 -2
  144. data/lib/datadog/tracing/contrib/opensearch/patcher.rb +7 -0
  145. data/lib/datadog/tracing/contrib/pg/instrumentation.rb +5 -0
  146. data/lib/datadog/tracing/contrib/presto/instrumentation.rb +5 -0
  147. data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +1 -1
  148. data/lib/datadog/tracing/contrib/que/configuration/settings.rb +1 -1
  149. data/lib/datadog/tracing/contrib/racecar/event.rb +5 -0
  150. data/lib/datadog/tracing/contrib/rack/header_tagging.rb +14 -4
  151. data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +4 -4
  152. data/lib/datadog/tracing/contrib/rake/configuration/settings.rb +1 -1
  153. data/lib/datadog/tracing/contrib/redis/tags.rb +5 -0
  154. data/lib/datadog/tracing/contrib/resque/configuration/settings.rb +1 -1
  155. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +5 -0
  156. data/lib/datadog/tracing/contrib/sequel/utils.rb +5 -0
  157. data/lib/datadog/tracing/contrib/shoryuken/configuration/settings.rb +1 -1
  158. data/lib/datadog/tracing/contrib/sidekiq/configuration/settings.rb +1 -1
  159. data/lib/datadog/tracing/contrib/sneakers/configuration/settings.rb +1 -1
  160. data/lib/datadog/tracing/contrib/utils/quantization/http.rb +2 -2
  161. data/lib/datadog/tracing/distributed/propagation.rb +13 -33
  162. data/lib/datadog/tracing/metadata/tagging.rb +3 -3
  163. data/lib/datadog/tracing/sync_writer.rb +3 -3
  164. data/lib/datadog/tracing/tracer.rb +2 -0
  165. data/lib/datadog/{core → tracing}/transport/http/api/instance.rb +1 -1
  166. data/lib/datadog/{core → tracing}/transport/http/api/spec.rb +1 -1
  167. data/lib/datadog/tracing/transport/http/api.rb +43 -0
  168. data/lib/datadog/{core → tracing}/transport/http/builder.rb +13 -68
  169. data/lib/datadog/tracing/transport/http/client.rb +57 -0
  170. data/lib/datadog/tracing/transport/http/statistics.rb +47 -0
  171. data/lib/datadog/tracing/transport/http/traces.rb +152 -0
  172. data/lib/datadog/tracing/transport/http.rb +124 -0
  173. data/lib/datadog/tracing/transport/io/client.rb +89 -0
  174. data/lib/datadog/tracing/transport/io/response.rb +27 -0
  175. data/lib/datadog/tracing/transport/io/traces.rb +101 -0
  176. data/lib/datadog/tracing/transport/io.rb +30 -0
  177. data/lib/datadog/tracing/transport/serializable_trace.rb +126 -0
  178. data/lib/datadog/tracing/transport/statistics.rb +77 -0
  179. data/lib/datadog/tracing/transport/trace_formatter.rb +209 -0
  180. data/lib/datadog/tracing/transport/traces.rb +224 -0
  181. data/lib/datadog/tracing/workers/trace_writer.rb +5 -3
  182. data/lib/datadog/tracing/workers.rb +3 -2
  183. data/lib/datadog/tracing/writer.rb +5 -2
  184. data/lib/ddtrace/transport/ext.rb +17 -15
  185. data/lib/ddtrace/version.rb +1 -1
  186. data/lib/ddtrace.rb +1 -1
  187. metadata +72 -96
  188. data/lib/datadog/ci/configuration/components.rb +0 -32
  189. data/lib/datadog/ci/configuration/settings.rb +0 -51
  190. data/lib/datadog/ci/contrib/cucumber/configuration/settings.rb +0 -35
  191. data/lib/datadog/ci/contrib/cucumber/ext.rb +0 -22
  192. data/lib/datadog/ci/contrib/cucumber/formatter.rb +0 -94
  193. data/lib/datadog/ci/contrib/cucumber/instrumentation.rb +0 -28
  194. data/lib/datadog/ci/contrib/cucumber/integration.rb +0 -47
  195. data/lib/datadog/ci/contrib/cucumber/patcher.rb +0 -27
  196. data/lib/datadog/ci/contrib/minitest/configuration/settings.rb +0 -35
  197. data/lib/datadog/ci/contrib/minitest/ext.rb +0 -21
  198. data/lib/datadog/ci/contrib/minitest/integration.rb +0 -49
  199. data/lib/datadog/ci/contrib/minitest/patcher.rb +0 -27
  200. data/lib/datadog/ci/contrib/minitest/test_helper.rb +0 -68
  201. data/lib/datadog/ci/contrib/rspec/configuration/settings.rb +0 -35
  202. data/lib/datadog/ci/contrib/rspec/example.rb +0 -68
  203. data/lib/datadog/ci/contrib/rspec/ext.rb +0 -21
  204. data/lib/datadog/ci/contrib/rspec/integration.rb +0 -48
  205. data/lib/datadog/ci/contrib/rspec/patcher.rb +0 -27
  206. data/lib/datadog/ci/ext/app_types.rb +0 -9
  207. data/lib/datadog/ci/ext/environment.rb +0 -575
  208. data/lib/datadog/ci/ext/settings.rb +0 -10
  209. data/lib/datadog/ci/ext/test.rb +0 -35
  210. data/lib/datadog/ci/extensions.rb +0 -19
  211. data/lib/datadog/ci/flush.rb +0 -38
  212. data/lib/datadog/ci/test.rb +0 -81
  213. data/lib/datadog/ci.rb +0 -21
  214. data/lib/datadog/core/configuration/dependency_resolver.rb +0 -28
  215. data/lib/datadog/core/configuration/option_definition_set.rb +0 -22
  216. data/lib/datadog/core/configuration/option_set.rb +0 -10
  217. data/lib/datadog/core/transport/config.rb +0 -58
  218. data/lib/datadog/core/transport/http/api.rb +0 -57
  219. data/lib/datadog/core/transport/http/client.rb +0 -45
  220. data/lib/datadog/core/transport/http/config.rb +0 -278
  221. data/lib/datadog/core/transport/http/negotiation.rb +0 -144
  222. data/lib/datadog/core/transport/http.rb +0 -169
  223. data/lib/datadog/core/utils/object_set.rb +0 -43
  224. data/lib/datadog/core/utils/string_table.rb +0 -47
  225. data/lib/datadog/profiling/backtrace_location.rb +0 -34
  226. data/lib/datadog/profiling/buffer.rb +0 -43
  227. data/lib/datadog/profiling/collectors/old_stack.rb +0 -301
  228. data/lib/datadog/profiling/encoding/profile.rb +0 -41
  229. data/lib/datadog/profiling/event.rb +0 -15
  230. data/lib/datadog/profiling/events/stack.rb +0 -82
  231. data/lib/datadog/profiling/old_recorder.rb +0 -107
  232. data/lib/datadog/profiling/pprof/builder.rb +0 -125
  233. data/lib/datadog/profiling/pprof/converter.rb +0 -102
  234. data/lib/datadog/profiling/pprof/message_set.rb +0 -16
  235. data/lib/datadog/profiling/pprof/payload.rb +0 -20
  236. data/lib/datadog/profiling/pprof/pprof.proto +0 -212
  237. data/lib/datadog/profiling/pprof/pprof_pb.rb +0 -81
  238. data/lib/datadog/profiling/pprof/stack_sample.rb +0 -139
  239. data/lib/datadog/profiling/pprof/string_table.rb +0 -12
  240. data/lib/datadog/profiling/pprof/template.rb +0 -118
  241. data/lib/datadog/profiling/trace_identifiers/ddtrace.rb +0 -43
  242. data/lib/datadog/profiling/trace_identifiers/helper.rb +0 -45
  243. data/lib/ddtrace/transport/http/adapters/net.rb +0 -168
  244. data/lib/ddtrace/transport/http/adapters/registry.rb +0 -27
  245. data/lib/ddtrace/transport/http/adapters/test.rb +0 -85
  246. data/lib/ddtrace/transport/http/adapters/unix_socket.rb +0 -77
  247. data/lib/ddtrace/transport/http/api/endpoint.rb +0 -29
  248. data/lib/ddtrace/transport/http/api/fallbacks.rb +0 -24
  249. data/lib/ddtrace/transport/http/api/instance.rb +0 -35
  250. data/lib/ddtrace/transport/http/api/map.rb +0 -16
  251. data/lib/ddtrace/transport/http/api/spec.rb +0 -17
  252. data/lib/ddtrace/transport/http/api.rb +0 -39
  253. data/lib/ddtrace/transport/http/builder.rb +0 -176
  254. data/lib/ddtrace/transport/http/client.rb +0 -52
  255. data/lib/ddtrace/transport/http/env.rb +0 -58
  256. data/lib/ddtrace/transport/http/response.rb +0 -58
  257. data/lib/ddtrace/transport/http/statistics.rb +0 -43
  258. data/lib/ddtrace/transport/http/traces.rb +0 -144
  259. data/lib/ddtrace/transport/http.rb +0 -117
  260. data/lib/ddtrace/transport/io/client.rb +0 -85
  261. data/lib/ddtrace/transport/io/response.rb +0 -25
  262. data/lib/ddtrace/transport/io/traces.rb +0 -99
  263. data/lib/ddtrace/transport/io.rb +0 -28
  264. data/lib/ddtrace/transport/parcel.rb +0 -20
  265. data/lib/ddtrace/transport/request.rb +0 -15
  266. data/lib/ddtrace/transport/response.rb +0 -60
  267. data/lib/ddtrace/transport/serializable_trace.rb +0 -122
  268. data/lib/ddtrace/transport/statistics.rb +0 -75
  269. data/lib/ddtrace/transport/trace_formatter.rb +0 -207
  270. data/lib/ddtrace/transport/traces.rb +0 -216
@@ -1,4 +1,5 @@
1
1
  require_relative '../../tracing/configuration/ext'
2
+ require_relative '../../core/environment/variable_helpers'
2
3
  require_relative 'http'
3
4
 
4
5
  module Datadog
@@ -64,7 +65,7 @@ module Datadog
64
65
  Tracing::Configuration::Ext::Distributed::PROPAGATION_STYLE_B3_SINGLE_HEADER,
65
66
  ]
66
67
  )
67
- o.on_set do |styles|
68
+ o.after_set do |styles|
68
69
  # Modernize B3 options
69
70
  # DEV-2.0: Can be removed with the removal of deprecated B3 constants.
70
71
  styles.map! do |style|
@@ -93,7 +94,7 @@ module Datadog
93
94
  o.env Tracing::Configuration::Ext::Distributed::ENV_PROPAGATION_STYLE_INJECT
94
95
  # DEV-2.0: Change default value to `tracecontext, Datadog`.
95
96
  o.default [Tracing::Configuration::Ext::Distributed::PROPAGATION_STYLE_DATADOG]
96
- o.on_set do |styles|
97
+ o.after_set do |styles|
97
98
  # Modernize B3 options
98
99
  # DEV-2.0: Can be removed with the removal of deprecated B3 constants.
99
100
  styles.map! do |style|
@@ -121,7 +122,7 @@ module Datadog
121
122
  o.type :array
122
123
  o.env Configuration::Ext::Distributed::ENV_PROPAGATION_STYLE
123
124
  o.default []
124
- o.on_set do |styles|
125
+ o.after_set do |styles|
125
126
  next if styles.empty?
126
127
 
127
128
  # Modernize B3 options
@@ -371,6 +372,12 @@ module Datadog
371
372
  o.env Tracing::Configuration::Ext::Test::ENV_MODE_ENABLED
372
373
  end
373
374
 
375
+ # Use async writer in test mode
376
+ option :async do |o|
377
+ o.type :bool
378
+ o.default false
379
+ end
380
+
374
381
  option :trace_flush
375
382
 
376
383
  option :writer_options do |o|
@@ -382,8 +389,8 @@ module Datadog
382
389
  # @see file:docs/GettingStarted.md#configuring-the-transport-layer Configuring the transport layer
383
390
  #
384
391
  # A {Proc} that configures a custom tracer transport.
385
- # @yield Receives a {Datadog::Transport::HTTP} that can be modified with custom adapters and settings.
386
- # @yieldparam [Datadog::Transport::HTTP] t transport to be configured.
392
+ # @yield Receives a {Datadog::Tracing::Transport::HTTP} that can be modified with custom adapters and settings.
393
+ # @yieldparam [Datadog::Tracing::Transport::HTTP] t transport to be configured.
387
394
  # @default `nil`
388
395
  # @return [Proc,nil]
389
396
  option :transport_options do |o|
@@ -425,7 +432,7 @@ module Datadog
425
432
  option :enabled do |o|
426
433
  o.type :bool
427
434
  o.default do
428
- disabled = env_to_bool(Tracing::Configuration::Ext::ClientIp::ENV_DISABLED)
435
+ disabled = Core::Environment::VariableHelpers.env_to_bool(Tracing::Configuration::Ext::ClientIp::ENV_DISABLED)
429
436
 
430
437
  enabled = if disabled.nil?
431
438
  false
@@ -438,7 +445,7 @@ module Datadog
438
445
  end
439
446
 
440
447
  # ENABLED env var takes precedence over deprecated DISABLED
441
- env_to_bool(Tracing::Configuration::Ext::ClientIp::ENV_ENABLED, enabled)
448
+ Core::Environment::VariableHelpers.env_to_bool(Tracing::Configuration::Ext::ClientIp::ENV_ENABLED, enabled)
442
449
  end
443
450
  end
444
451
 
@@ -30,7 +30,7 @@ module Datadog
30
30
 
31
31
  # DEV-2.0: Breaking changes for removal.
32
32
  option :exception_controller do |o|
33
- o.on_set do |value|
33
+ o.after_set do |value|
34
34
  if value
35
35
  Datadog::Core.log_deprecation do
36
36
  'The error controller is now automatically detected. '\
@@ -33,7 +33,7 @@ module Datadog
33
33
  option :service_name
34
34
  option :error_handler do |o|
35
35
  o.type :proc
36
- o.experimental_default_proc(&Tracing::SpanOperation::Events::DEFAULT_ON_ERROR)
36
+ o.default_proc(&Tracing::SpanOperation::Events::DEFAULT_ON_ERROR)
37
37
  end
38
38
  end
39
39
  end
@@ -45,6 +45,10 @@ 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_SQL)
47
47
 
48
+ if service_name != Datadog.configuration.service
49
+ span.set_tag(Tracing::Contrib::Ext::Metadata::TAG_BASE_SERVICE, Datadog.configuration.service)
50
+ end
51
+
48
52
  # Set analytics sample rate
49
53
  if Contrib::Analytics.enabled?(configuration[:analytics_enabled])
50
54
  Contrib::Analytics.set_sample_rate(span, configuration[:analytics_sample_rate])
@@ -10,266 +10,173 @@ module Datadog
10
10
  module ActiveSupport
11
11
  module Cache
12
12
  # Defines instrumentation for ActiveSupport caching
13
- # rubocop:disable Lint/RescueException
14
13
  module Instrumentation
15
14
  module_function
16
15
 
17
- def start_trace_cache(payload)
18
- return unless enabled?
19
-
20
- # In most of the cases Rails ``fetch()`` and ``read()`` calls are nested.
21
- # This check ensures that two reads are not nested since they don't provide
22
- # interesting details.
23
- # NOTE: the ``finish_trace_cache()`` is fired but it already has a safe-guard
24
- # to avoid any kind of issue.
25
- current_span = Tracing.active_span
26
- return if current_span.try(:name) == Ext::SPAN_CACHE &&
27
- (
28
- payload[:action] == Ext::RESOURCE_CACHE_GET &&
29
- current_span.try(:resource) == Ext::RESOURCE_CACHE_GET ||
30
- payload[:action] == Ext::RESOURCE_CACHE_MGET &&
31
- current_span.try(:resource) == Ext::RESOURCE_CACHE_MGET
32
- )
33
-
34
- tracing_context = payload.fetch(:tracing_context)
16
+ # @param action [String] type of cache operation. Will be set as the span resource.
17
+ # @param key [Object] redis cache key. Used for actions with a single key locator.
18
+ # @param multi_key [Array<Object>] list of redis cache keys. Used for actions with a multiple key locators.
19
+ def trace(action, store, key: nil, multi_key: nil)
20
+ return yield unless enabled?
35
21
 
36
22
  # create a new ``Span`` and add it to the tracing context
37
- service = Datadog.configuration.tracing[:active_support][:cache_service]
38
- type = Ext::SPAN_TYPE_CACHE
39
- span = Tracing.trace(Ext::SPAN_CACHE, service: service, span_type: type)
40
- span.resource = payload.fetch(:action)
41
-
42
- span.set_tag(Tracing::Metadata::Ext::TAG_COMPONENT, Ext::TAG_COMPONENT)
43
- span.set_tag(Tracing::Metadata::Ext::TAG_OPERATION, Ext::TAG_OPERATION_CACHE)
44
-
45
- tracing_context[:dd_cache_span] = span
46
- rescue StandardError => e
47
- Datadog.logger.debug(e.message)
48
- end
49
-
50
- def finish_trace_cache(payload)
51
- return unless enabled?
52
-
53
- # retrieve the tracing context and continue the trace
54
- tracing_context = payload.fetch(:tracing_context)
55
- span = tracing_context[:dd_cache_span]
56
- return unless span && !span.finished?
57
-
58
- begin
59
- # discard parameters from the cache_store configuration
60
- if defined?(::Rails)
61
- store, = *Array.wrap(::Rails.configuration.cache_store).flatten
62
- span.set_tag(Ext::TAG_CACHE_BACKEND, store)
23
+ Tracing.trace(
24
+ Ext::SPAN_CACHE,
25
+ span_type: Ext::SPAN_TYPE_CACHE,
26
+ service: Datadog.configuration.tracing[:active_support][:cache_service],
27
+ resource: action
28
+ ) do |span|
29
+ span.set_tag(Tracing::Metadata::Ext::TAG_COMPONENT, Ext::TAG_COMPONENT)
30
+ span.set_tag(Tracing::Metadata::Ext::TAG_OPERATION, Ext::TAG_OPERATION_CACHE)
31
+
32
+ if span.service != Datadog.configuration.service
33
+ span.set_tag(Tracing::Contrib::Ext::Metadata::TAG_BASE_SERVICE, Datadog.configuration.service)
63
34
  end
64
35
 
65
- normalized_key = ::ActiveSupport::Cache.expand_cache_key(payload.fetch(:key))
66
- cache_key = Core::Utils.truncate(normalized_key, Ext::QUANTIZE_CACHE_MAX_KEY_SIZE)
67
- span.set_tag(Ext::TAG_CACHE_KEY, cache_key)
36
+ span.set_tag(Ext::TAG_CACHE_BACKEND, store) if store
37
+ set_cache_key(span, key, multi_key)
68
38
 
69
- span.set_error(payload[:exception]) if payload[:exception]
70
- ensure
71
- span.finish
39
+ yield
72
40
  end
73
- rescue StandardError => e
74
- Datadog.logger.debug(e.message)
75
41
  end
76
42
 
77
- def finish_trace_cache_multi(payload)
78
- return unless enabled?
79
-
80
- # retrieve the tracing context and continue the trace
81
- tracing_context = payload.fetch(:tracing_context)
82
- span = tracing_context[:dd_cache_span]
83
- return unless span && !span.finished?
43
+ # In most of the cases, `#fetch()` and `#read()` calls are nested.
44
+ # Instrument both does not add any value.
45
+ # This method checks if these two operations are nested.
46
+ def nested_read?
47
+ current_span = Tracing.active_span
48
+ current_span && current_span.name == Ext::SPAN_CACHE && current_span.resource == Ext::RESOURCE_CACHE_GET
49
+ end
84
50
 
85
- begin
86
- # discard parameters from the cache_store configuration
87
- if defined?(::Rails)
88
- store, = *Array.wrap(::Rails.configuration.cache_store).flatten
89
- span.set_tag(Ext::TAG_CACHE_BACKEND, store)
90
- end
91
- normalized_keys = payload.fetch(:keys, []).map do |key|
92
- ::ActiveSupport::Cache.expand_cache_key(key)
93
- end
94
- cache_keys = Core::Utils.truncate(normalized_keys, Ext::QUANTIZE_CACHE_MAX_KEY_SIZE)
95
- span.set_tag(Ext::TAG_CACHE_KEY_MULTI, cache_keys)
51
+ # (see #nested_read?)
52
+ def nested_multiread?
53
+ current_span = Tracing.active_span
54
+ current_span && current_span.name == Ext::SPAN_CACHE && current_span.resource == Ext::RESOURCE_CACHE_MGET
55
+ end
96
56
 
97
- span.set_error(payload[:exception]) if payload[:exception]
98
- ensure
99
- span.finish
57
+ def set_cache_key(span, single_key, multi_key)
58
+ if multi_key
59
+ resolved_key = multi_key.map { |key| ::ActiveSupport::Cache.expand_cache_key(key) }
60
+ cache_key = Core::Utils.truncate(resolved_key, Ext::QUANTIZE_CACHE_MAX_KEY_SIZE)
61
+ span.set_tag(Ext::TAG_CACHE_KEY_MULTI, cache_key)
62
+ else
63
+ resolved_key = ::ActiveSupport::Cache.expand_cache_key(single_key)
64
+ cache_key = Core::Utils.truncate(resolved_key, Ext::QUANTIZE_CACHE_MAX_KEY_SIZE)
65
+ span.set_tag(Ext::TAG_CACHE_KEY, cache_key)
100
66
  end
101
- rescue StandardError => e
102
- Datadog.logger.debug(e.message)
103
67
  end
104
68
 
105
69
  def enabled?
106
70
  Tracing.enabled? && Datadog.configuration.tracing[:active_support][:enabled]
107
71
  end
108
72
 
73
+ # Instance methods injected into the cache client
74
+ module InstanceMethods
75
+ private
76
+
77
+ # The name of the store is never saved.
78
+ # ActiveSupport looks up stores by converting a symbol into a 'require' path,
79
+ # then "camelizing" it for a `const_get` call:
80
+ # ```
81
+ # require "active_support/cache/#{store}"
82
+ # ActiveSupport::Cache.const_get(store.to_s.camelize)
83
+ # ```
84
+ # @see https://github.com/rails/rails/blob/261975dbef77731d2c76f907f1076c5132ebc0e4/activesupport/lib/active_support/cache.rb#L139-L149
85
+ #
86
+ # As `self` is the store object, we can reverse engineer
87
+ # the original symbol by converting the class name to snake case:
88
+ # e.g. ActiveSupport::Cache::RedisStore -> active_support/cache/redis_store
89
+ # In this case, `redis_store` is the store name.
90
+ #
91
+ # Because there's no API retrieve only the class name
92
+ # (only `RedisStore`, and not `ActiveSupport::Cache::RedisStore`)
93
+ # the easiest way to retrieve the store symbol is to convert the fully qualified
94
+ # name using the Rails-provided method `#underscore`, which is the reverse of `#camelize`,
95
+ # then extracting the last part of it.
96
+ #
97
+ # Also, this method caches the store name, given this value will be retrieve
98
+ # multiple times and involves string manipulation.
99
+ def dd_store_name
100
+ return @store_name if defined?(@store_name)
101
+
102
+ # DEV: String#underscore is available through ActiveSupport, and is
103
+ # DEV: the exact reverse operation to `#camelize`.
104
+ @store_name = self.class.name.underscore.match(%r{active_support/cache/(.*)})[1]
105
+ end
106
+ end
107
+
109
108
  # Defines instrumentation for ActiveSupport cache reading
110
109
  module Read
110
+ include InstanceMethods
111
+
111
112
  def read(*args, &block)
112
- payload = {
113
- action: Ext::RESOURCE_CACHE_GET,
114
- key: args[0],
115
- tracing_context: {}
116
- }
117
-
118
- begin
119
- # process and catch cache exceptions
120
- Instrumentation.start_trace_cache(payload)
121
- super
122
- rescue Exception => e
123
- payload[:exception] = [e.class.name, e.message]
124
- payload[:exception_object] = e
125
- raise e
126
- end
127
- ensure
128
- Instrumentation.finish_trace_cache(payload)
113
+ return super if Instrumentation.nested_read?
114
+
115
+ Instrumentation.trace(Ext::RESOURCE_CACHE_GET, dd_store_name, key: args[0]) { super }
129
116
  end
130
117
  end
131
118
 
132
119
  # Defines instrumentation for ActiveSupport cache reading of multiple keys
133
120
  module ReadMulti
121
+ include InstanceMethods
122
+
134
123
  def read_multi(*keys, &block)
135
- payload = {
136
- action: Ext::RESOURCE_CACHE_MGET,
137
- keys: keys,
138
- tracing_context: {}
139
- }
140
-
141
- begin
142
- # process and catch cache exceptions
143
- Instrumentation.start_trace_cache(payload)
144
- super
145
- rescue Exception => e
146
- payload[:exception] = [e.class.name, e.message]
147
- payload[:exception_object] = e
148
- raise e
149
- end
150
- ensure
151
- Instrumentation.finish_trace_cache_multi(payload)
124
+ return super if Instrumentation.nested_multiread?
125
+
126
+ Instrumentation.trace(Ext::RESOURCE_CACHE_MGET, dd_store_name, multi_key: keys) { super }
152
127
  end
153
128
  end
154
129
 
155
130
  # Defines instrumentation for ActiveSupport cache fetching
156
131
  module Fetch
132
+ include InstanceMethods
133
+
157
134
  def fetch(*args, &block)
158
- payload = {
159
- action: Ext::RESOURCE_CACHE_GET,
160
- key: args[0],
161
- tracing_context: {}
162
- }
163
-
164
- begin
165
- # process and catch cache exceptions
166
- Instrumentation.start_trace_cache(payload)
167
- super
168
- rescue Exception => e
169
- payload[:exception] = [e.class.name, e.message]
170
- payload[:exception_object] = e
171
- raise e
172
- end
173
- ensure
174
- Instrumentation.finish_trace_cache(payload)
135
+ return super if Instrumentation.nested_read?
136
+
137
+ Instrumentation.trace(Ext::RESOURCE_CACHE_GET, dd_store_name, key: args[0]) { super }
175
138
  end
176
139
  end
177
140
 
178
141
  # Defines instrumentation for ActiveSupport cache fetching of multiple keys
179
142
  module FetchMulti
143
+ include InstanceMethods
144
+
180
145
  def fetch_multi(*args, &block)
181
- # extract options hash
146
+ return super if Instrumentation.nested_multiread?
147
+
182
148
  keys = args[-1].instance_of?(Hash) ? args[0..-2] : args
183
- payload = {
184
- action: Ext::RESOURCE_CACHE_MGET,
185
- keys: keys,
186
- tracing_context: {}
187
- }
188
-
189
- begin
190
- # process and catch cache exceptions
191
- Instrumentation.start_trace_cache(payload)
192
- super
193
- rescue Exception => e
194
- payload[:exception] = [e.class.name, e.message]
195
- payload[:exception_object] = e
196
- raise e
197
- end
198
- ensure
199
- Instrumentation.finish_trace_cache_multi(payload)
149
+ Instrumentation.trace(Ext::RESOURCE_CACHE_MGET, dd_store_name, multi_key: keys) { super }
200
150
  end
201
151
  end
202
152
 
203
153
  # Defines instrumentation for ActiveSupport cache writing
204
154
  module Write
155
+ include InstanceMethods
156
+
205
157
  def write(*args, &block)
206
- payload = {
207
- action: Ext::RESOURCE_CACHE_SET,
208
- key: args[0],
209
- tracing_context: {}
210
- }
211
-
212
- begin
213
- # process and catch cache exceptions
214
- Instrumentation.start_trace_cache(payload)
215
- super
216
- rescue Exception => e
217
- payload[:exception] = [e.class.name, e.message]
218
- payload[:exception_object] = e
219
- raise e
220
- end
221
- ensure
222
- Instrumentation.finish_trace_cache(payload)
158
+ Instrumentation.trace(Ext::RESOURCE_CACHE_SET, dd_store_name, key: args[0]) { super }
223
159
  end
224
160
  end
225
161
 
226
162
  # Defines instrumentation for ActiveSupport cache writing of multiple keys
227
163
  module WriteMulti
164
+ include InstanceMethods
165
+
228
166
  def write_multi(hash, options = nil)
229
- payload = {
230
- action: Ext::RESOURCE_CACHE_MSET,
231
- keys: hash.keys,
232
- tracing_context: {}
233
- }
234
-
235
- begin
236
- # process and catch cache exceptions
237
- Instrumentation.start_trace_cache(payload)
238
- super
239
- rescue Exception => e
240
- payload[:exception] = [e.class.name, e.message]
241
- payload[:exception_object] = e
242
- raise e
243
- end
244
- ensure
245
- Instrumentation.finish_trace_cache_multi(payload)
167
+ Instrumentation.trace(Ext::RESOURCE_CACHE_MSET, dd_store_name, multi_key: hash.keys) { super }
246
168
  end
247
169
  end
248
170
 
249
171
  # Defines instrumentation for ActiveSupport cache deleting
250
172
  module Delete
173
+ include InstanceMethods
174
+
251
175
  def delete(*args, &block)
252
- payload = {
253
- action: Ext::RESOURCE_CACHE_DELETE,
254
- key: args[0],
255
- tracing_context: {}
256
- }
257
-
258
- begin
259
- # process and catch cache exceptions
260
- Instrumentation.start_trace_cache(payload)
261
- super
262
- rescue Exception => e
263
- payload[:exception] = [e.class.name, e.message]
264
- payload[:exception_object] = e
265
- raise e
266
- end
267
- ensure
268
- Instrumentation.finish_trace_cache(payload)
176
+ Instrumentation.trace(Ext::RESOURCE_CACHE_DELETE, dd_store_name, key: args[0]) { super }
269
177
  end
270
178
  end
271
179
  end
272
- # rubocop:enable Lint/RescueException
273
180
  end
274
181
  end
275
182
  end
@@ -28,6 +28,9 @@ module Datadog
28
28
  patch_cache_store_delete
29
29
  end
30
30
 
31
+ # This method is overwritten by
32
+ # `datadog/tracing/contrib/active_support/cache/redis.rb`
33
+ # with more complex behavior.
31
34
  def cache_store_class(meth)
32
35
  ::ActiveSupport::Cache::Store
33
36
  end
@@ -28,6 +28,7 @@ module Datadog
28
28
 
29
29
  private
30
30
 
31
+ # rubocop:disable Metrics/AbcSize
31
32
  def annotate!(span, context)
32
33
  span.service = configuration[:service_name]
33
34
  span.span_type = Tracing::Metadata::Ext::HTTP::TYPE_OUTBOUND
@@ -47,6 +48,11 @@ module Datadog
47
48
  )
48
49
  end
49
50
 
51
+ # Tag original global service name if not used
52
+ if span.service != Datadog.configuration.service
53
+ span.set_tag(Tracing::Contrib::Ext::Metadata::TAG_BASE_SERVICE, Datadog.configuration.service)
54
+ end
55
+
50
56
  span.set_tag(Tracing::Metadata::Ext::TAG_KIND, Tracing::Metadata::Ext::SpanKind::TAG_CLIENT)
51
57
 
52
58
  span.set_tag(Tracing::Metadata::Ext::TAG_COMPONENT, Ext::TAG_COMPONENT)
@@ -71,6 +77,7 @@ module Datadog
71
77
 
72
78
  Contrib::SpanAttributeSchema.set_peer_service!(span, Ext::PEER_SERVICE_SOURCES)
73
79
  end
80
+ # rubocop:enable Metrics/AbcSize
74
81
 
75
82
  def configuration
76
83
  Datadog.configuration.tracing[:aws]
@@ -18,7 +18,7 @@ module Datadog
18
18
  option :service_name
19
19
 
20
20
  def configure(options = {})
21
- self.class.options.dependency_order.each do |name|
21
+ self.class.options.each do |name, _value|
22
22
  self[name] = options[name] if options.key?(name)
23
23
  end
24
24
 
@@ -42,6 +42,12 @@ module Datadog
42
42
  o.type :string, nilable: true
43
43
  o.env Ext::ENV_PEER_SERVICE
44
44
  end
45
+
46
+ option :command_enabled do |o|
47
+ o.type :bool
48
+ o.env Ext::ENV_COMMAND_ENABLED
49
+ o.default false
50
+ end
45
51
  end
46
52
  end
47
53
  end
@@ -7,9 +7,16 @@ module Datadog
7
7
  # Dalli integration constants
8
8
  # @public_api Changing resource names, tag names, or environment variables creates breaking changes.
9
9
  module Ext
10
+ # DEV: Even though this is the dalli integration, all spans are named `memcached.*`.
11
+ # DEV: This happens because such spans have special treatment in backend, with memcached-specific handling.
12
+ # DEV: If add support for the `memcached` gem (not popular as of 2023), we'll have issues with span naming
13
+ # DEV: conflicts.
10
14
  ENV_ENABLED = 'DD_TRACE_DALLI_ENABLED'
11
15
  ENV_ANALYTICS_ENABLED = 'DD_TRACE_DALLI_ANALYTICS_ENABLED'
12
16
  ENV_ANALYTICS_SAMPLE_RATE = 'DD_TRACE_DALLI_ANALYTICS_SAMPLE_RATE'
17
+ # DEV: This is named `*_MEMCACHED_*` because the spans it refer to are `memcached.*` and this variable
18
+ # DEV: is a global flag that affects all memcached spans generated by any Datadog product.
19
+ ENV_COMMAND_ENABLED = 'DD_TRACE_MEMCACHED_COMMAND_ENABLED'
13
20
  ENV_SERVICE_NAME = 'DD_TRACE_DALLI_SERVICE_NAME'
14
21
  ENV_PEER_SERVICE = 'DD_TRACE_DALLI_PEER_SERVICE'
15
22
 
@@ -29,6 +29,11 @@ module Datadog
29
29
  )
30
30
  end
31
31
 
32
+ # Tag original global service name if not used
33
+ if span.service != Datadog.configuration.service
34
+ span.set_tag(Tracing::Contrib::Ext::Metadata::TAG_BASE_SERVICE, Datadog.configuration.service)
35
+ end
36
+
32
37
  span.set_tag(Tracing::Metadata::Ext::TAG_KIND, Tracing::Metadata::Ext::SpanKind::TAG_CLIENT)
33
38
 
34
39
  span.set_tag(Tracing::Metadata::Ext::TAG_COMPONENT, Ext::TAG_COMPONENT)
@@ -45,8 +50,10 @@ module Datadog
45
50
 
46
51
  span.set_tag(Contrib::Ext::DB::TAG_SYSTEM, Ext::TAG_SYSTEM)
47
52
 
48
- cmd = Quantize.format_command(op, args)
49
- span.set_tag(Ext::TAG_COMMAND, cmd)
53
+ if datadog_configuration[:command_enabled]
54
+ cmd = Quantize.format_command(op, args)
55
+ span.set_tag(Ext::TAG_COMMAND, cmd)
56
+ end
50
57
 
51
58
  Contrib::SpanAttributeSchema.set_peer_service!(span, Ext::PEER_SERVICE_SOURCES)
52
59
  super
@@ -34,7 +34,7 @@ module Datadog
34
34
  option :client_service_name
35
35
  option :error_handler do |o|
36
36
  o.type :proc
37
- o.experimental_default_proc(&Tracing::SpanOperation::Events::DEFAULT_ON_ERROR)
37
+ o.default_proc(&Tracing::SpanOperation::Events::DEFAULT_ON_ERROR)
38
38
  end
39
39
  end
40
40
  end
@@ -77,6 +77,11 @@ module Datadog
77
77
  )
78
78
  end
79
79
 
80
+ # Tag original global service name if not used
81
+ if span.service != Datadog.configuration.service
82
+ span.set_tag(Tracing::Contrib::Ext::Metadata::TAG_BASE_SERVICE, Datadog.configuration.service)
83
+ end
84
+
80
85
  span.span_type = Datadog::Tracing::Contrib::Elasticsearch::Ext::SPAN_TYPE_QUERY
81
86
 
82
87
  span.set_tag(Tracing::Metadata::Ext::TAG_COMPONENT, Ext::TAG_COMPONENT)
@@ -136,6 +136,11 @@ module Datadog
136
136
  )
137
137
  end
138
138
 
139
+ # Tag original global service name if not used
140
+ if span.service != Datadog.configuration.service
141
+ span.set_tag(Tracing::Contrib::Ext::Metadata::TAG_BASE_SERVICE, Datadog.configuration.service)
142
+ end
143
+
139
144
  # Set analytics sample rate
140
145
  Contrib::Analytics.set_sample_rate(span, analytics_sample_rate) if analytics_enabled?
141
146
 
@@ -69,6 +69,14 @@ 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 original global service name if not used
73
+ if @datadog_multi_span.service != Datadog.configuration.service
74
+ @datadog_multi_span.set_tag(
75
+ Tracing::Contrib::Ext::Metadata::TAG_BASE_SERVICE,
76
+ Datadog.configuration.service
77
+ )
78
+ end
79
+
72
80
  # Set analytics sample rate
73
81
  Contrib::Analytics.set_sample_rate(@datadog_multi_span, analytics_sample_rate) if analytics_enabled?
74
82
 
@@ -121,6 +121,11 @@ module Datadog
121
121
  )
122
122
  end
123
123
 
124
+ # Tag original global service name if not used
125
+ if span.service != Datadog.configuration.service
126
+ span.set_tag(Tracing::Contrib::Ext::Metadata::TAG_BASE_SERVICE, Datadog.configuration.service)
127
+ end
128
+
124
129
  span.set_tag(Tracing::Metadata::Ext::TAG_KIND, Tracing::Metadata::Ext::SpanKind::TAG_CLIENT)
125
130
 
126
131
  span.set_tag(Tracing::Metadata::Ext::TAG_COMPONENT, Ext::TAG_COMPONENT)
@@ -45,6 +45,9 @@ module Datadog
45
45
 
46
46
  # Value of tag from which peer.service value was remapped from
47
47
  TAG_PEER_SERVICE_REMAP = '_dd.peer.service.remapped_from'
48
+
49
+ # Set equal to the global service when contrib span.service is overriden
50
+ TAG_BASE_SERVICE = '_dd.base_service'
48
51
  end
49
52
  end
50
53
  end