ddtrace 1.14.0 → 1.16.2

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 (282) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +165 -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/request.rb +6 -2
  32. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +8 -6
  33. data/lib/datadog/appsec/contrib/rack/reactive/request.rb +2 -7
  34. data/lib/datadog/appsec/contrib/rack/reactive/request_body.rb +2 -5
  35. data/lib/datadog/appsec/contrib/rack/reactive/response.rb +2 -5
  36. data/lib/datadog/appsec/contrib/rack/request_body_middleware.rb +3 -2
  37. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +24 -10
  38. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +3 -2
  39. data/lib/datadog/appsec/contrib/rails/patcher.rb +9 -3
  40. data/lib/datadog/appsec/contrib/rails/reactive/action.rb +2 -5
  41. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +6 -4
  42. data/lib/datadog/appsec/contrib/sinatra/patcher.rb +13 -7
  43. data/lib/datadog/appsec/contrib/sinatra/reactive/routed.rb +2 -5
  44. data/lib/datadog/appsec/event.rb +106 -50
  45. data/lib/datadog/appsec/monitor/gateway/watcher.rb +3 -3
  46. data/lib/datadog/appsec/monitor/reactive/set_user.rb +2 -5
  47. data/lib/datadog/appsec/processor/actions.rb +49 -0
  48. data/lib/datadog/appsec/processor/rule_merger.rb +22 -2
  49. data/lib/datadog/appsec/processor.rb +34 -6
  50. data/lib/datadog/appsec/remote.rb +4 -1
  51. data/lib/datadog/appsec/response.rb +82 -4
  52. data/lib/datadog/appsec/sample_rate.rb +21 -0
  53. data/lib/datadog/appsec.rb +2 -2
  54. data/lib/datadog/core/configuration/agent_settings_resolver.rb +29 -24
  55. data/lib/datadog/core/configuration/base.rb +1 -11
  56. data/lib/datadog/core/configuration/components.rb +7 -2
  57. data/lib/datadog/core/configuration/ext.rb +21 -0
  58. data/lib/datadog/core/configuration/option.rb +2 -4
  59. data/lib/datadog/core/configuration/option_definition.rb +17 -41
  60. data/lib/datadog/core/configuration/options.rb +5 -5
  61. data/lib/datadog/core/configuration/settings.rb +47 -45
  62. data/lib/datadog/core/environment/execution.rb +47 -9
  63. data/lib/datadog/core/environment/variable_helpers.rb +0 -69
  64. data/lib/datadog/core/error.rb +1 -0
  65. data/lib/datadog/core/git/ext.rb +2 -0
  66. data/lib/datadog/core/remote/client/capabilities.rb +1 -1
  67. data/lib/datadog/core/remote/component.rb +2 -2
  68. data/lib/datadog/core/remote/negotiation.rb +2 -2
  69. data/lib/datadog/core/remote/transport/config.rb +60 -0
  70. data/lib/datadog/core/remote/transport/http/api/instance.rb +39 -0
  71. data/lib/datadog/core/remote/transport/http/api/spec.rb +21 -0
  72. data/lib/datadog/core/remote/transport/http/api.rb +58 -0
  73. data/lib/datadog/core/remote/transport/http/builder.rb +219 -0
  74. data/lib/datadog/core/remote/transport/http/client.rb +48 -0
  75. data/lib/datadog/core/remote/transport/http/config.rb +280 -0
  76. data/lib/datadog/core/remote/transport/http/negotiation.rb +146 -0
  77. data/lib/datadog/core/remote/transport/http.rb +179 -0
  78. data/lib/datadog/core/{transport → remote/transport}/negotiation.rb +25 -23
  79. data/lib/datadog/core/remote/worker.rb +3 -1
  80. data/lib/datadog/core/telemetry/collector.rb +3 -2
  81. data/lib/datadog/core/telemetry/http/transport.rb +2 -1
  82. data/lib/datadog/core/transport/ext.rb +47 -0
  83. data/lib/datadog/core/transport/http/adapters/net.rb +168 -0
  84. data/lib/datadog/core/transport/http/adapters/registry.rb +29 -0
  85. data/lib/datadog/core/transport/http/adapters/test.rb +89 -0
  86. data/lib/datadog/core/transport/http/adapters/unix_socket.rb +83 -0
  87. data/lib/datadog/core/transport/http/api/endpoint.rb +31 -0
  88. data/lib/datadog/core/transport/http/api/fallbacks.rb +26 -0
  89. data/lib/datadog/core/transport/http/api/map.rb +18 -0
  90. data/lib/datadog/core/transport/http/env.rb +62 -0
  91. data/lib/datadog/core/transport/http/response.rb +60 -0
  92. data/lib/datadog/core/transport/parcel.rb +22 -0
  93. data/lib/datadog/core/transport/request.rb +17 -0
  94. data/lib/datadog/core/transport/response.rb +64 -0
  95. data/lib/datadog/core/workers/polling.rb +2 -2
  96. data/lib/datadog/opentelemetry/api/context.rb +10 -3
  97. data/lib/datadog/opentelemetry/sdk/propagator.rb +2 -1
  98. data/lib/datadog/opentelemetry/sdk/span_processor.rb +14 -2
  99. data/lib/datadog/opentelemetry/sdk/trace/span.rb +68 -0
  100. data/lib/datadog/opentelemetry/trace.rb +58 -0
  101. data/lib/datadog/opentelemetry.rb +1 -0
  102. data/lib/datadog/opentracer.rb +9 -0
  103. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +14 -19
  104. data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +1 -1
  105. data/lib/datadog/profiling/collectors/thread_context.rb +9 -1
  106. data/lib/datadog/profiling/component.rb +24 -99
  107. data/lib/datadog/profiling/ext.rb +0 -12
  108. data/lib/datadog/profiling/flush.rb +0 -3
  109. data/lib/datadog/profiling/http_transport.rb +6 -3
  110. data/lib/datadog/profiling/native_extension.rb +0 -21
  111. data/lib/datadog/profiling/profiler.rb +36 -13
  112. data/lib/datadog/profiling/scheduler.rb +16 -9
  113. data/lib/datadog/profiling.rb +8 -81
  114. data/lib/datadog/tracing/component.rb +10 -4
  115. data/lib/datadog/tracing/configuration/agent_settings_resolver.rb +13 -0
  116. data/lib/datadog/tracing/configuration/ext.rb +4 -2
  117. data/lib/datadog/tracing/configuration/settings.rb +14 -7
  118. data/lib/datadog/tracing/contrib/action_pack/configuration/settings.rb +1 -1
  119. data/lib/datadog/tracing/contrib/active_job/configuration/settings.rb +1 -1
  120. data/lib/datadog/tracing/contrib/active_record/events/sql.rb +4 -0
  121. data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +106 -197
  122. data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +3 -0
  123. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +7 -0
  124. data/lib/datadog/tracing/contrib/concurrent_ruby/context_composite_executor_service.rb +14 -14
  125. data/lib/datadog/tracing/contrib/concurrent_ruby/future_patch.rb +3 -10
  126. data/lib/datadog/tracing/contrib/concurrent_ruby/integration.rb +2 -1
  127. data/lib/datadog/tracing/contrib/concurrent_ruby/patcher.rb +8 -1
  128. data/lib/datadog/tracing/contrib/concurrent_ruby/promises_future_patch.rb +22 -0
  129. data/lib/datadog/tracing/contrib/configuration/settings.rb +1 -1
  130. data/lib/datadog/tracing/contrib/dalli/configuration/settings.rb +6 -0
  131. data/lib/datadog/tracing/contrib/dalli/ext.rb +7 -0
  132. data/lib/datadog/tracing/contrib/dalli/instrumentation.rb +9 -2
  133. data/lib/datadog/tracing/contrib/delayed_job/configuration/settings.rb +1 -1
  134. data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +5 -0
  135. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +5 -0
  136. data/lib/datadog/tracing/contrib/ethon/multi_patch.rb +8 -0
  137. data/lib/datadog/tracing/contrib/excon/middleware.rb +5 -0
  138. data/lib/datadog/tracing/contrib/ext.rb +3 -0
  139. data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +1 -1
  140. data/lib/datadog/tracing/contrib/faraday/middleware.rb +5 -0
  141. data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +21 -1
  142. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +11 -1
  143. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +18 -0
  144. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor.rb +0 -4
  145. data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +3 -3
  146. data/lib/datadog/tracing/contrib/http/instrumentation.rb +5 -0
  147. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +5 -0
  148. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +5 -0
  149. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +7 -0
  150. data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +13 -3
  151. data/lib/datadog/tracing/contrib/opensearch/integration.rb +2 -2
  152. data/lib/datadog/tracing/contrib/opensearch/patcher.rb +7 -0
  153. data/lib/datadog/tracing/contrib/pg/instrumentation.rb +5 -0
  154. data/lib/datadog/tracing/contrib/presto/instrumentation.rb +5 -0
  155. data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +1 -1
  156. data/lib/datadog/tracing/contrib/que/configuration/settings.rb +1 -1
  157. data/lib/datadog/tracing/contrib/racecar/event.rb +5 -0
  158. data/lib/datadog/tracing/contrib/rack/header_tagging.rb +14 -4
  159. data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +4 -4
  160. data/lib/datadog/tracing/contrib/rake/configuration/settings.rb +1 -1
  161. data/lib/datadog/tracing/contrib/redis/configuration/settings.rb +1 -1
  162. data/lib/datadog/tracing/contrib/redis/instrumentation.rb +3 -38
  163. data/lib/datadog/tracing/contrib/redis/tags.rb +7 -2
  164. data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +46 -33
  165. data/lib/datadog/tracing/contrib/resque/configuration/settings.rb +1 -1
  166. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +5 -0
  167. data/lib/datadog/tracing/contrib/sequel/utils.rb +5 -0
  168. data/lib/datadog/tracing/contrib/shoryuken/configuration/settings.rb +1 -1
  169. data/lib/datadog/tracing/contrib/sidekiq/configuration/settings.rb +1 -1
  170. data/lib/datadog/tracing/contrib/sneakers/configuration/settings.rb +1 -1
  171. data/lib/datadog/tracing/contrib/utils/quantization/http.rb +2 -2
  172. data/lib/datadog/tracing/diagnostics/environment_logger.rb +6 -0
  173. data/lib/datadog/tracing/distributed/propagation.rb +13 -33
  174. data/lib/datadog/tracing/metadata/tagging.rb +3 -3
  175. data/lib/datadog/tracing/sync_writer.rb +3 -3
  176. data/lib/datadog/tracing/tracer.rb +2 -0
  177. data/lib/datadog/{core → tracing}/transport/http/api/instance.rb +1 -1
  178. data/lib/datadog/{core → tracing}/transport/http/api/spec.rb +1 -1
  179. data/lib/datadog/tracing/transport/http/api.rb +43 -0
  180. data/lib/datadog/{core → tracing}/transport/http/builder.rb +13 -68
  181. data/lib/datadog/tracing/transport/http/client.rb +57 -0
  182. data/lib/datadog/tracing/transport/http/statistics.rb +47 -0
  183. data/lib/datadog/tracing/transport/http/traces.rb +152 -0
  184. data/lib/datadog/tracing/transport/http.rb +124 -0
  185. data/lib/datadog/tracing/transport/io/client.rb +89 -0
  186. data/lib/datadog/tracing/transport/io/response.rb +27 -0
  187. data/lib/datadog/tracing/transport/io/traces.rb +101 -0
  188. data/lib/datadog/tracing/transport/io.rb +30 -0
  189. data/lib/datadog/tracing/transport/serializable_trace.rb +126 -0
  190. data/lib/datadog/tracing/transport/statistics.rb +77 -0
  191. data/lib/datadog/tracing/transport/trace_formatter.rb +209 -0
  192. data/lib/datadog/tracing/transport/traces.rb +224 -0
  193. data/lib/datadog/tracing/workers/trace_writer.rb +5 -3
  194. data/lib/datadog/tracing/workers.rb +3 -2
  195. data/lib/datadog/tracing/writer.rb +5 -2
  196. data/lib/ddtrace/transport/ext.rb +17 -15
  197. data/lib/ddtrace/version.rb +2 -2
  198. data/lib/ddtrace.rb +1 -1
  199. metadata +73 -96
  200. data/lib/datadog/ci/configuration/components.rb +0 -32
  201. data/lib/datadog/ci/configuration/settings.rb +0 -51
  202. data/lib/datadog/ci/contrib/cucumber/configuration/settings.rb +0 -35
  203. data/lib/datadog/ci/contrib/cucumber/ext.rb +0 -22
  204. data/lib/datadog/ci/contrib/cucumber/formatter.rb +0 -94
  205. data/lib/datadog/ci/contrib/cucumber/instrumentation.rb +0 -28
  206. data/lib/datadog/ci/contrib/cucumber/integration.rb +0 -47
  207. data/lib/datadog/ci/contrib/cucumber/patcher.rb +0 -27
  208. data/lib/datadog/ci/contrib/minitest/configuration/settings.rb +0 -35
  209. data/lib/datadog/ci/contrib/minitest/ext.rb +0 -21
  210. data/lib/datadog/ci/contrib/minitest/integration.rb +0 -49
  211. data/lib/datadog/ci/contrib/minitest/patcher.rb +0 -27
  212. data/lib/datadog/ci/contrib/minitest/test_helper.rb +0 -68
  213. data/lib/datadog/ci/contrib/rspec/configuration/settings.rb +0 -35
  214. data/lib/datadog/ci/contrib/rspec/example.rb +0 -68
  215. data/lib/datadog/ci/contrib/rspec/ext.rb +0 -21
  216. data/lib/datadog/ci/contrib/rspec/integration.rb +0 -48
  217. data/lib/datadog/ci/contrib/rspec/patcher.rb +0 -27
  218. data/lib/datadog/ci/ext/app_types.rb +0 -9
  219. data/lib/datadog/ci/ext/environment.rb +0 -575
  220. data/lib/datadog/ci/ext/settings.rb +0 -10
  221. data/lib/datadog/ci/ext/test.rb +0 -35
  222. data/lib/datadog/ci/extensions.rb +0 -19
  223. data/lib/datadog/ci/flush.rb +0 -38
  224. data/lib/datadog/ci/test.rb +0 -81
  225. data/lib/datadog/ci.rb +0 -21
  226. data/lib/datadog/core/configuration/dependency_resolver.rb +0 -28
  227. data/lib/datadog/core/configuration/option_definition_set.rb +0 -22
  228. data/lib/datadog/core/configuration/option_set.rb +0 -10
  229. data/lib/datadog/core/transport/config.rb +0 -58
  230. data/lib/datadog/core/transport/http/api.rb +0 -57
  231. data/lib/datadog/core/transport/http/client.rb +0 -45
  232. data/lib/datadog/core/transport/http/config.rb +0 -278
  233. data/lib/datadog/core/transport/http/negotiation.rb +0 -144
  234. data/lib/datadog/core/transport/http.rb +0 -169
  235. data/lib/datadog/core/utils/object_set.rb +0 -43
  236. data/lib/datadog/core/utils/string_table.rb +0 -47
  237. data/lib/datadog/profiling/backtrace_location.rb +0 -34
  238. data/lib/datadog/profiling/buffer.rb +0 -43
  239. data/lib/datadog/profiling/collectors/old_stack.rb +0 -301
  240. data/lib/datadog/profiling/encoding/profile.rb +0 -41
  241. data/lib/datadog/profiling/event.rb +0 -15
  242. data/lib/datadog/profiling/events/stack.rb +0 -82
  243. data/lib/datadog/profiling/old_recorder.rb +0 -107
  244. data/lib/datadog/profiling/pprof/builder.rb +0 -125
  245. data/lib/datadog/profiling/pprof/converter.rb +0 -102
  246. data/lib/datadog/profiling/pprof/message_set.rb +0 -16
  247. data/lib/datadog/profiling/pprof/payload.rb +0 -20
  248. data/lib/datadog/profiling/pprof/pprof.proto +0 -212
  249. data/lib/datadog/profiling/pprof/pprof_pb.rb +0 -81
  250. data/lib/datadog/profiling/pprof/stack_sample.rb +0 -139
  251. data/lib/datadog/profiling/pprof/string_table.rb +0 -12
  252. data/lib/datadog/profiling/pprof/template.rb +0 -118
  253. data/lib/datadog/profiling/trace_identifiers/ddtrace.rb +0 -43
  254. data/lib/datadog/profiling/trace_identifiers/helper.rb +0 -45
  255. data/lib/ddtrace/transport/http/adapters/net.rb +0 -168
  256. data/lib/ddtrace/transport/http/adapters/registry.rb +0 -27
  257. data/lib/ddtrace/transport/http/adapters/test.rb +0 -85
  258. data/lib/ddtrace/transport/http/adapters/unix_socket.rb +0 -77
  259. data/lib/ddtrace/transport/http/api/endpoint.rb +0 -29
  260. data/lib/ddtrace/transport/http/api/fallbacks.rb +0 -24
  261. data/lib/ddtrace/transport/http/api/instance.rb +0 -35
  262. data/lib/ddtrace/transport/http/api/map.rb +0 -16
  263. data/lib/ddtrace/transport/http/api/spec.rb +0 -17
  264. data/lib/ddtrace/transport/http/api.rb +0 -39
  265. data/lib/ddtrace/transport/http/builder.rb +0 -176
  266. data/lib/ddtrace/transport/http/client.rb +0 -52
  267. data/lib/ddtrace/transport/http/env.rb +0 -58
  268. data/lib/ddtrace/transport/http/response.rb +0 -58
  269. data/lib/ddtrace/transport/http/statistics.rb +0 -43
  270. data/lib/ddtrace/transport/http/traces.rb +0 -144
  271. data/lib/ddtrace/transport/http.rb +0 -117
  272. data/lib/ddtrace/transport/io/client.rb +0 -85
  273. data/lib/ddtrace/transport/io/response.rb +0 -25
  274. data/lib/ddtrace/transport/io/traces.rb +0 -99
  275. data/lib/ddtrace/transport/io.rb +0 -28
  276. data/lib/ddtrace/transport/parcel.rb +0 -20
  277. data/lib/ddtrace/transport/request.rb +0 -15
  278. data/lib/ddtrace/transport/response.rb +0 -60
  279. data/lib/ddtrace/transport/serializable_trace.rb +0 -122
  280. data/lib/ddtrace/transport/statistics.rb +0 -75
  281. data/lib/ddtrace/transport/trace_formatter.rb +0 -207
  282. data/lib/ddtrace/transport/traces.rb +0 -216
@@ -3,6 +3,7 @@ require_relative 'configuration/resolver'
3
3
  require_relative 'ext'
4
4
  require_relative 'quantize'
5
5
  require_relative 'tags'
6
+ require_relative 'trace_middleware'
6
7
 
7
8
  module Datadog
8
9
  module Tracing
@@ -17,31 +18,11 @@ module Datadog
17
18
  # InstanceMethods - implementing instrumentation
18
19
  module InstanceMethods
19
20
  def call(*args, &block)
20
- show_command_args = command_args?
21
-
22
- Tracing.trace(Contrib::Redis::Ext::SPAN_COMMAND) do |span|
23
- span.service = service_name
24
- span.span_type = Contrib::Redis::Ext::TYPE
25
- span.resource = get_command(args, show_command_args)
26
- Contrib::Redis::Tags.set_common_tags(self, span, show_command_args)
27
-
28
- super
29
- end
21
+ TraceMiddleware.call(self, args[0], service_name, command_args?) { super }
30
22
  end
31
23
 
32
24
  def call_pipeline(*args, &block)
33
- show_command_args = command_args?
34
-
35
- Tracing.trace(Contrib::Redis::Ext::SPAN_COMMAND) do |span|
36
- span.service = service_name
37
- span.span_type = Contrib::Redis::Ext::TYPE
38
- commands = get_pipeline_commands(args, show_command_args)
39
- span.resource = commands.any? ? commands.join("\n") : '(none)'
40
- span.set_metric Contrib::Redis::Ext::METRIC_PIPELINE_LEN, commands.length
41
- Contrib::Redis::Tags.set_common_tags(self, span, show_command_args)
42
-
43
- super
44
- end
25
+ TraceMiddleware.call_pipelined(self, args[0].commands, service_name, command_args?) { super }
45
26
  end
46
27
 
47
28
  private
@@ -59,22 +40,6 @@ module Datadog
59
40
  datadog_configuration[:service_name]
60
41
  end
61
42
 
62
- def get_command(args, show_command_args)
63
- if show_command_args
64
- Contrib::Redis::Quantize.format_command_args(*args)
65
- else
66
- Contrib::Redis::Quantize.get_verb(*args)
67
- end
68
- end
69
-
70
- def get_pipeline_commands(args, show_command_args)
71
- if show_command_args
72
- args[0].commands.map { |c| Contrib::Redis::Quantize.format_command_args(c) }
73
- else
74
- args[0].commands.map { |c| Contrib::Redis::Quantize.get_verb(c) }
75
- end
76
- end
77
-
78
43
  def datadog_configuration
79
44
  Datadog.configuration.tracing[:redis, options]
80
45
  end
@@ -12,7 +12,7 @@ module Datadog
12
12
  # Tags handles generic common tags assignment.
13
13
  module Tags
14
14
  class << self
15
- def set_common_tags(client, span, show_command_args)
15
+ def set_common_tags(client, span, raw_command)
16
16
  if datadog_configuration[:peer_service]
17
17
  span.set_tag(
18
18
  Tracing::Metadata::Ext::TAG_PEER_SERVICE,
@@ -20,6 +20,11 @@ module Datadog
20
20
  )
21
21
  end
22
22
 
23
+ # Tag original global service name if not used
24
+ if span.service != Datadog.configuration.service
25
+ span.set_tag(Tracing::Contrib::Ext::Metadata::TAG_BASE_SERVICE, Datadog.configuration.service)
26
+ end
27
+
23
28
  span.set_tag(Tracing::Metadata::Ext::TAG_COMPONENT, Ext::TAG_COMPONENT)
24
29
  span.set_tag(Tracing::Metadata::Ext::TAG_OPERATION, Ext::TAG_OPERATION_COMMAND)
25
30
 
@@ -37,7 +42,7 @@ module Datadog
37
42
 
38
43
  span.set_tag Ext::TAG_DATABASE_INDEX, client.db.to_s
39
44
  span.set_tag Ext::TAG_DB, client.db
40
- span.set_tag Ext::TAG_RAW_COMMAND, span.resource if show_command_args
45
+ span.set_tag Ext::TAG_RAW_COMMAND, raw_command
41
46
 
42
47
  Contrib::SpanAttributeSchema.set_peer_service!(span, Ext::PEER_SERVICE_SOURCES)
43
48
  end
@@ -9,55 +9,68 @@ module Datadog
9
9
  module Redis
10
10
  # Instrumentation for Redis 5+
11
11
  module TraceMiddleware
12
- def call(commands, redis_config)
13
- Tracing.trace(Contrib::Redis::Ext::SPAN_COMMAND) do |span|
14
- datadog_configuration = resolve(redis_config)
15
- resource = get_command(commands, datadog_configuration[:command_args])
12
+ # Instruments {RedisClient::ConnectionMixin#call}.
13
+ def call(command, redis_config)
14
+ config = resolve(redis_config)
15
+ TraceMiddleware.call(redis_config, command, config[:service_name], config[:command_args]) { super }
16
+ end
17
+
18
+ # Instruments {RedisClient::ConnectionMixin#call_pipelined}.
19
+ def call_pipelined(commands, redis_config)
20
+ config = resolve(redis_config)
21
+ TraceMiddleware.call_pipelined(redis_config, commands, config[:service_name], config[:command_args]) { super }
22
+ end
16
23
 
17
- span.service = datadog_configuration[:service_name]
18
- span.span_type = Contrib::Redis::Ext::TYPE
19
- span.resource = resource
24
+ class << self
25
+ def call(client, command, service_name, command_args)
26
+ Tracing.trace(Redis::Ext::SPAN_COMMAND, type: Redis::Ext::TYPE, service: service_name) do |span|
27
+ raw_command = get_command(command, true)
28
+ span.resource = command_args ? raw_command : get_command(command, false)
20
29
 
21
- Contrib::Redis::Tags.set_common_tags(redis_config, span, datadog_configuration[:command_args])
30
+ Contrib::Redis::Tags.set_common_tags(client, span, raw_command)
22
31
 
23
- super
32
+ yield
33
+ end
24
34
  end
25
- end
26
35
 
27
- def call_pipelined(commands, redis_config)
28
- Tracing.trace(Contrib::Redis::Ext::SPAN_COMMAND) do |span|
29
- datadog_configuration = resolve(redis_config)
30
- pipelined_commands = get_pipeline_commands(commands, datadog_configuration[:command_args])
36
+ def call_pipelined(client, commands, service_name, command_args)
37
+ Tracing.trace(Redis::Ext::SPAN_COMMAND, type: Redis::Ext::TYPE, service: service_name) do |span|
38
+ raw_command = get_pipeline_commands(commands, true)
39
+ span.resource = command_args ? raw_command : get_pipeline_commands(commands, false)
31
40
 
32
- span.service = datadog_configuration[:service_name]
33
- span.span_type = Contrib::Redis::Ext::TYPE
34
- span.resource = pipelined_commands.join("\n")
35
- span.set_metric Contrib::Redis::Ext::METRIC_PIPELINE_LEN, pipelined_commands.length
41
+ span.set_metric Contrib::Redis::Ext::METRIC_PIPELINE_LEN, commands.length
36
42
 
37
- Contrib::Redis::Tags.set_common_tags(redis_config, span, datadog_configuration[:command_args])
43
+ Contrib::Redis::Tags.set_common_tags(client, span, raw_command)
38
44
 
39
- super
45
+ yield
46
+ end
40
47
  end
41
- end
42
48
 
43
- private
49
+ private
44
50
 
45
- def get_command(commands, boolean)
46
- if boolean
47
- Contrib::Redis::Quantize.format_command_args(commands)
48
- else
49
- Contrib::Redis::Quantize.get_verb(commands)
51
+ # Quantizes a single Redis command
52
+ def get_command(command, command_args)
53
+ if command_args
54
+ Contrib::Redis::Quantize.format_command_args(command)
55
+ else
56
+ Contrib::Redis::Quantize.get_verb(command)
57
+ end
50
58
  end
51
- end
52
59
 
53
- def get_pipeline_commands(commands, boolean)
54
- if boolean
55
- commands.map { |c| Contrib::Redis::Quantize.format_command_args(c) }
56
- else
57
- commands.map { |c| Contrib::Redis::Quantize.get_verb(c) }
60
+ # Quantizes a multi-command Redis pipeline execution
61
+ def get_pipeline_commands(commands, command_args)
62
+ list = if command_args
63
+ commands.map { |c| Contrib::Redis::Quantize.format_command_args(c) }
64
+ else
65
+ commands.map { |c| Contrib::Redis::Quantize.get_verb(c) }
66
+ end
67
+
68
+ list.empty? ? '(none)' : list.join("\n")
58
69
  end
59
70
  end
60
71
 
72
+ private
73
+
61
74
  def resolve(redis_config)
62
75
  custom = redis_config.custom[:datadog] || {}
63
76
 
@@ -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
@@ -41,6 +41,11 @@ module Datadog
41
41
  )
42
42
  end
43
43
 
44
+ # Tag original global service name if not used
45
+ if span.service != Datadog.configuration.service
46
+ span.set_tag(Tracing::Contrib::Ext::Metadata::TAG_BASE_SERVICE, Datadog.configuration.service)
47
+ end
48
+
44
49
  span.set_tag(Tracing::Metadata::Ext::TAG_KIND, Tracing::Metadata::Ext::SpanKind::TAG_CLIENT)
45
50
 
46
51
  span.set_tag(Tracing::Metadata::Ext::TAG_COMPONENT, Ext::TAG_COMPONENT)
@@ -49,6 +49,11 @@ module Datadog
49
49
  end
50
50
 
51
51
  def set_common_tags(span, db)
52
+ # Tag original global service name if not used
53
+ if span.service != Datadog.configuration.service
54
+ span.set_tag(Tracing::Contrib::Ext::Metadata::TAG_BASE_SERVICE, Datadog.configuration.service)
55
+ end
56
+
52
57
  span.set_tag(Tracing::Metadata::Ext::TAG_COMPONENT, Ext::TAG_COMPONENT)
53
58
  span.set_tag(Tracing::Metadata::Ext::TAG_OPERATION, Ext::TAG_OPERATION_QUERY)
54
59
 
@@ -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
  option :tag_body, default: false, type: :bool
39
39
  end
@@ -40,7 +40,7 @@ module Datadog
40
40
  option :client_service_name
41
41
  option :error_handler do |o|
42
42
  o.type :proc
43
- o.experimental_default_proc(&Tracing::SpanOperation::Events::DEFAULT_ON_ERROR)
43
+ o.default_proc(&Tracing::SpanOperation::Events::DEFAULT_ON_ERROR)
44
44
  end
45
45
  option :quantize, default: {}, type: :hash
46
46
  option :distributed_tracing, default: false, type: :bool
@@ -31,7 +31,7 @@ module Datadog
31
31
  option :service_name
32
32
  option :error_handler do |o|
33
33
  o.type :proc
34
- o.experimental_default_proc(&Tracing::SpanOperation::Events::DEFAULT_ON_ERROR)
34
+ o.default_proc(&Tracing::SpanOperation::Events::DEFAULT_ON_ERROR)
35
35
  end
36
36
  option :tag_body, default: false, type: :bool
37
37
  end
@@ -160,11 +160,11 @@ module Datadog
160
160
  (?:"|%22) # closing '"' at end of value
161
161
  )
162
162
  |(?: # other common secret values
163
- bearer(?:\s|%20)+[a-z0-9._\-]+
163
+ bearer(?:\s|%20)+[a-z0-9._-]+
164
164
  |token(?::|%3A)[a-z0-9]{13}
165
165
  |gh[opsu]_[0-9a-zA-Z]{36}
166
166
  |ey[I-L](?:[\w=-]|%3D)+\.ey[I-L](?:[\w=-]|%3D)+(?:\.(?:[\w.+/=-]|%3D|%2F|%2B)+)?
167
- |-{5}BEGIN(?:[a-z\s]|%20)+PRIVATE(?:\s|%20)KEY-{5}[^\-]+-{5}END(?:[a-z\s]|%20)+PRIVATE(?:\s|%20)KEY(?:-{5})?(?:\n|%0A)?
167
+ |-{5}BEGIN(?:[a-z\s]|%20)+PRIVATE(?:\s|%20)KEY-{5}[^-]+-{5}END(?:[a-z\s]|%20)+PRIVATE(?:\s|%20)KEY(?:-{5})?(?:\n|%0A)?
168
168
  |(?:ssh-(?:rsa|dss)|ecdsa-[a-z0-9]+-[a-z0-9]+)(?:\s|%20)*(?:[a-z0-9/.+]|%2F|%5C|%2B){100,}(?:=|%3D)*(?:(?:\s+)[a-z0-9._-]+)?
169
169
  )
170
170
  }ix.freeze
@@ -137,6 +137,12 @@ module Datadog
137
137
  private
138
138
 
139
139
  def instrumented_integrations
140
+ # `instrumented_integrations` method is added only if tracing contrib extensions are required.
141
+ # If tracing is used in manual mode without integrations enabled this method does not exist.
142
+ # CI visibility gem datadog-ci uses Datadog::Tracer without requiring datadog/tracing/contrib folder
143
+ # nor enabling any integrations by default which causes EnvironmentCollector to fail.
144
+ return {} unless Datadog.configuration.tracing.respond_to?(:instrumented_integrations)
145
+
140
146
  Datadog.configuration.tracing.instrumented_integrations
141
147
  end
142
148
 
@@ -18,6 +18,12 @@ module Datadog
18
18
  # @param propagation_styles [Hash<String,Object>]
19
19
  def initialize(propagation_styles:)
20
20
  @propagation_styles = propagation_styles
21
+ # We need to make sure propagation_style option is evaluated.
22
+ # Our options are lazy evaluated and it happens that propagation_style has the after_set callback
23
+ # that affect Datadog.configuration.tracing.distributed_tracing.propagation_inject_style and
24
+ # Datadog.configuration.tracing.distributed_tracing.propagation_extract_style
25
+ # By calling it here, we make sure if the customers has set any value either via code or ENV variable is applied.
26
+ ::Datadog.configuration.tracing.distributed_tracing.propagation_style
21
27
  end
22
28
 
23
29
  # inject! populates the env with span ID, trace ID and sampling priority
@@ -72,8 +78,10 @@ module Datadog
72
78
  #
73
79
  # @param data [Hash]
74
80
  def extract(data)
75
- trace_digest = nil
76
- dd_trace_digest = nil
81
+ return unless data
82
+ return if data.empty?
83
+
84
+ extracted_trace_digest = nil
77
85
 
78
86
  ::Datadog.configuration.tracing.distributed_tracing.propagation_extract_style.each do |style|
79
87
  propagator = @propagation_styles[style]
@@ -83,42 +91,14 @@ module Datadog
83
91
  extracted_trace_digest = propagator.extract(data)
84
92
  rescue => e
85
93
  ::Datadog.logger.error(
86
- 'Error extracting distributed trace data. ' \
87
- "Cause: #{e} Location: #{Array(e.backtrace).first}"
94
+ "Error extracting distributed trace data. Cause: #{e} Location: #{Array(e.backtrace).first}"
88
95
  )
89
96
  end
90
97
 
91
- # Skip if no valid data was found
92
- next if extracted_trace_digest.nil?
93
-
94
- # Keep track of the Datadog extracted digest, we want to return it if we have it.
95
- if extracted_trace_digest && style == Tracing::Configuration::Ext::Distributed::PROPAGATION_STYLE_DATADOG
96
- dd_trace_digest = extracted_trace_digest
97
- end
98
-
99
- # No previously extracted trace data, use the one we just extracted
100
- if trace_digest.nil?
101
- trace_digest = extracted_trace_digest
102
- else
103
- unless trace_digest.trace_id == extracted_trace_digest.trace_id \
104
- && trace_digest.span_id == extracted_trace_digest.span_id
105
- # We have two mismatched propagation contexts
106
- ::Datadog.logger.debug do
107
- 'Cannot extract distributed trace data: extracted styles differ, ' \
108
- "#{trace_digest.trace_id} != #{extracted_trace_digest.trace_id} && " \
109
- "#{trace_digest.span_id} != #{extracted_trace_digest.span_id}"
110
- end
111
-
112
- # It's safer to create a new context than to attach ourselves to the wrong context
113
- return TraceDigest.new # Early return from the whole method
114
- end
115
- end
98
+ break if extracted_trace_digest
116
99
  end
117
100
 
118
- # Return the extracted trace digest if we found one or else a new empty digest.
119
- # Always return the Datadog trace digest if one exists since it has more
120
- # information than the B3 digest, e.g. origin, priority sampling values.
121
- dd_trace_digest || trace_digest || nil
101
+ extracted_trace_digest
122
102
  end
123
103
  end
124
104
  end
@@ -59,8 +59,8 @@ module Datadog
59
59
  # A valid example is:
60
60
  #
61
61
  # span.set_tags({ "http.method" => "GET", "user.id" => "234" })
62
- def set_tags(tags)
63
- tags.each { |k, v| set_tag(k, v) }
62
+ def set_tags(hash)
63
+ hash.each { |k, v| set_tag(k, v) }
64
64
  end
65
65
 
66
66
  # Returns true if the provided `tag` was set to a non-nil value.
@@ -111,7 +111,7 @@ module Datadog
111
111
  # Returns a copy of all metadata.
112
112
  # Keys for `@meta` and `@metrics` don't collide, by construction.
113
113
  def tags
114
- @meta.merge(@metrics)
114
+ meta.merge(metrics)
115
115
  end
116
116
 
117
117
  protected
@@ -4,7 +4,7 @@ require_relative 'pipeline'
4
4
  require_relative 'runtime/metrics'
5
5
  require_relative 'writer'
6
6
 
7
- require_relative '../../ddtrace/transport/http'
7
+ require_relative 'transport/http'
8
8
 
9
9
  module Datadog
10
10
  module Tracing
@@ -20,10 +20,10 @@ module Datadog
20
20
  :events,
21
21
  :transport
22
22
 
23
- # @param [Datadog::Transport::Traces::Transport] transport a custom transport instance.
23
+ # @param [Datadog::Tracing::Transport::Traces::Transport] transport a custom transport instance.
24
24
  # If provided, overrides `transport_options` and `agent_settings`.
25
25
  # @param [Hash<Symbol,Object>] transport_options options for the default transport instance.
26
- # @param [Datadog::Core::Configuration::AgentSettingsResolver::AgentSettings] agent_settings agent options for
26
+ # @param [Datadog::Tracing::Configuration::AgentSettingsResolver::AgentSettings] agent_settings agent options for
27
27
  # the default transport instance.
28
28
  def initialize(transport: nil, transport_options: {}, agent_settings: nil)
29
29
  @transport = transport || begin
@@ -353,6 +353,8 @@ module Datadog
353
353
  end
354
354
  end
355
355
 
356
+ # Creates a new TraceOperation, with events bounds to this Tracer instance.
357
+ # @return [TraceOperation]
356
358
  def start_trace(continue_from: nil)
357
359
  # Build a new trace using digest if provided.
358
360
  trace = build_trace(continue_from)
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Datadog
4
- module Core
4
+ module Tracing
5
5
  module Transport
6
6
  module HTTP
7
7
  module API
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Datadog
4
- module Core
4
+ module Tracing
5
5
  module Transport
6
6
  module HTTP
7
7
  module API
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../../core/encoding'
4
+
5
+ require_relative '../../../core/transport/http/api/map'
6
+ require_relative 'api/spec'
7
+
8
+ require_relative 'traces'
9
+
10
+ module Datadog
11
+ module Tracing
12
+ module Transport
13
+ module HTTP
14
+ # Namespace for API components
15
+ module API
16
+ # Default API versions
17
+ V4 = 'v0.4'
18
+ V3 = 'v0.3'
19
+
20
+ module_function
21
+
22
+ def defaults
23
+ Datadog::Core::Transport::HTTP::API::Map[
24
+ V4 => Spec.new do |s|
25
+ s.traces = Traces::API::Endpoint.new(
26
+ '/v0.4/traces',
27
+ Core::Encoding::MsgpackEncoder,
28
+ service_rates: true
29
+ )
30
+ end,
31
+ V3 => Spec.new do |s|
32
+ s.traces = Traces::API::Endpoint.new(
33
+ '/v0.3/traces',
34
+ Core::Encoding::MsgpackEncoder
35
+ )
36
+ end,
37
+ ].with_fallbacks(V4 => V3)
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -1,50 +1,18 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative '../../configuration/agent_settings_resolver'
4
- require_relative '../../../../ddtrace/transport/http/adapters/registry'
5
- require_relative '../../../../ddtrace/transport/http/api/map'
6
-
7
- # TODO: Decouple standard transport/http/api/instance
8
- #
9
- # Separate classes are needed because transport/http/trace includes
10
- # Trace::API::Instance which closes over and uses a single spec, which is
11
- # negotiated as either /v3 or /v4 for the whole API at the spec level, but we
12
- # need an independent toplevel path at the endpoint level.
13
- #
14
- # Separate classes are needed because of `include Trace::API::Instance`.
15
- #
16
- # Below should be:
17
- # require_relative '../../../../ddtrace/transport/http/api/instance'
3
+ require_relative '../../../core/configuration/agent_settings_resolver'
4
+ require_relative '../../../core/transport/http/adapters/registry'
5
+ require_relative '../../../core/transport/http/api/map'
18
6
  require_relative 'api/instance'
19
-
20
- # TODO: Decouple transport/http/client
21
- #
22
- # The standard one does `include Transport::HTTP::Statistics` and performs
23
- # stats updates, which may or may not be desirable in general.
24
- #
25
- # Below should be:
26
- # require_relative '../../../../ddtrace/transport/http/client'
27
7
  require_relative 'client'
28
8
 
29
- # TODO: Decouple transport/http/builder
30
- #
31
- # This class is duplicated even though it is tantalisingly close to the
32
- # one in ddtrace/transport mostly because it refers to a different
33
- # `API::Instance` in `#api_instance_class` but also because it operates on a
34
- # different `HTTP::Client`, as well as de-hardcoding the transport class
35
- # `Transport::Traces::Transport` in `#to_transport`
36
- #
37
- # Additionally, its design makes it so there can be only one (API, Client,
38
- # Transport) triplet, requiring a new transport instance for any varying
39
- # element of the triplet.
40
-
41
9
  module Datadog
42
- module Core
10
+ module Tracing
43
11
  module Transport
44
12
  module HTTP
45
13
  # Builds new instances of Transport::HTTP::Client
46
14
  class Builder
47
- REGISTRY = Datadog::Transport::HTTP::Adapters::Registry.new
15
+ REGISTRY = Datadog::Core::Transport::HTTP::Adapters::Registry.new
48
16
 
49
17
  attr_reader \
50
18
  :apis,
@@ -59,7 +27,7 @@ module Datadog
59
27
  @default_headers = {}
60
28
 
61
29
  # Client settings
62
- @apis = Datadog::Transport::HTTP::API::Map.new
30
+ @apis = Datadog::Core::Transport::HTTP::API::Map.new
63
31
  @default_api = nil
64
32
 
65
33
  # API settings
@@ -114,16 +82,17 @@ module Datadog
114
82
  @default_api = key
115
83
  end
116
84
 
117
- def to_transport(klass)
85
+ def to_transport
118
86
  raise NoDefaultApiError if @default_api.nil?
119
87
 
120
- klass.new(to_api_instances, @default_api)
88
+ # DEV: Should not be specific to traces
89
+ Transport::Traces::Transport.new(to_api_instances, @default_api)
121
90
  end
122
91
 
123
92
  def to_api_instances
124
93
  raise NoApisError if @apis.empty?
125
94
 
126
- @apis.inject(Datadog::Transport::HTTP::API::Map.new) do |instances, (key, spec)|
95
+ @apis.inject(Datadog::Core::Transport::HTTP::API::Map.new) do |instances, (key, spec)|
127
96
  instances.tap do
128
97
  api_options = @api_options[key].dup
129
98
 
@@ -154,46 +123,22 @@ module Datadog
154
123
 
155
124
  # Raised when the API key does not match known APIs.
156
125
  class UnknownApiError < StandardError
157
- attr_reader :key
158
-
159
126
  def initialize(key)
160
- super()
161
-
162
- @key = key
163
- end
164
-
165
- def message
166
- "Unknown transport API '#{key}'!"
127
+ super("Unknown transport API '#{key}'!")
167
128
  end
168
129
  end
169
130
 
170
131
  # Raised when the identifier cannot be matched to an adapter.
171
132
  class UnknownAdapterError < StandardError
172
- attr_reader :type
173
-
174
133
  def initialize(type)
175
- super()
176
-
177
- @type = type
178
- end
179
-
180
- def message
181
- "Unknown transport adapter '#{type}'!"
134
+ super("Unknown transport adapter '#{type}'!")
182
135
  end
183
136
  end
184
137
 
185
138
  # Raised when an adapter cannot be resolved for an API instance.
186
139
  class NoAdapterForApiError < StandardError
187
- attr_reader :key
188
-
189
140
  def initialize(key)
190
- super()
191
-
192
- @key = key
193
- end
194
-
195
- def message
196
- "No adapter resolved for transport API '#{key}'!"
141
+ super("No adapter resolved for transport API '#{key}'!")
197
142
  end
198
143
  end
199
144