ddtrace 1.0.0 → 1.9.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 (646) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +453 -2
  3. data/LICENSE-3rdparty.csv +6 -2
  4. data/README.md +10 -5
  5. data/ext/ddtrace_profiling_loader/ddtrace_profiling_loader.c +134 -0
  6. data/ext/ddtrace_profiling_loader/extconf.rb +74 -0
  7. data/ext/ddtrace_profiling_native_extension/NativeExtensionDesign.md +79 -9
  8. data/ext/ddtrace_profiling_native_extension/clock_id.h +22 -1
  9. data/ext/ddtrace_profiling_native_extension/clock_id_from_pthread.c +33 -10
  10. data/ext/ddtrace_profiling_native_extension/clock_id_noop.c +11 -2
  11. data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time.c +899 -0
  12. data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time.h +9 -0
  13. data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +776 -0
  14. data/ext/ddtrace_profiling_native_extension/collectors_dynamic_sampling_rate.c +142 -0
  15. data/ext/ddtrace_profiling_native_extension/collectors_dynamic_sampling_rate.h +14 -0
  16. data/ext/ddtrace_profiling_native_extension/collectors_idle_sampling_helper.c +241 -0
  17. data/ext/ddtrace_profiling_native_extension/collectors_idle_sampling_helper.h +3 -0
  18. data/ext/ddtrace_profiling_native_extension/collectors_stack.c +390 -0
  19. data/ext/ddtrace_profiling_native_extension/collectors_stack.h +18 -0
  20. data/ext/ddtrace_profiling_native_extension/extconf.rb +156 -114
  21. data/ext/ddtrace_profiling_native_extension/helpers.h +17 -0
  22. data/ext/ddtrace_profiling_native_extension/http_transport.c +354 -0
  23. data/ext/ddtrace_profiling_native_extension/libdatadog_helpers.h +18 -0
  24. data/ext/ddtrace_profiling_native_extension/native_extension_helpers.rb +319 -0
  25. data/ext/ddtrace_profiling_native_extension/private_vm_api_access.c +820 -9
  26. data/ext/ddtrace_profiling_native_extension/private_vm_api_access.h +42 -0
  27. data/ext/ddtrace_profiling_native_extension/profiling.c +230 -3
  28. data/ext/ddtrace_profiling_native_extension/ruby_helpers.c +110 -0
  29. data/ext/ddtrace_profiling_native_extension/ruby_helpers.h +89 -0
  30. data/ext/ddtrace_profiling_native_extension/setup_signal_handler.c +115 -0
  31. data/ext/ddtrace_profiling_native_extension/setup_signal_handler.h +11 -0
  32. data/ext/ddtrace_profiling_native_extension/stack_recorder.c +487 -0
  33. data/ext/ddtrace_profiling_native_extension/stack_recorder.h +39 -0
  34. data/ext/ddtrace_profiling_native_extension/time_helpers.c +17 -0
  35. data/ext/ddtrace_profiling_native_extension/time_helpers.h +10 -0
  36. data/lib/datadog/appsec/assets/blocked.html +98 -3
  37. data/lib/datadog/appsec/assets/blocked.json +1 -0
  38. data/lib/datadog/appsec/assets/blocked.text +5 -0
  39. data/lib/datadog/appsec/assets/waf_rules/recommended.json +1250 -300
  40. data/lib/datadog/appsec/assets/waf_rules/risky.json +78 -78
  41. data/lib/datadog/appsec/assets/waf_rules/strict.json +308 -73
  42. data/lib/datadog/appsec/assets.rb +3 -3
  43. data/lib/datadog/appsec/autoload.rb +6 -4
  44. data/lib/datadog/appsec/configuration/settings.rb +55 -19
  45. data/lib/datadog/appsec/configuration.rb +17 -3
  46. data/lib/datadog/appsec/contrib/auto_instrument.rb +1 -3
  47. data/lib/datadog/appsec/contrib/configuration/settings.rb +2 -2
  48. data/lib/datadog/appsec/contrib/integration.rb +1 -1
  49. data/lib/datadog/appsec/contrib/patcher.rb +1 -1
  50. data/lib/datadog/appsec/contrib/rack/configuration/settings.rb +3 -3
  51. data/lib/datadog/appsec/contrib/rack/ext.rb +1 -1
  52. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +95 -47
  53. data/lib/datadog/appsec/contrib/rack/integration.rb +5 -4
  54. data/lib/datadog/appsec/contrib/rack/patcher.rb +2 -3
  55. data/lib/datadog/appsec/contrib/rack/reactive/request.rb +17 -21
  56. data/lib/datadog/appsec/contrib/rack/reactive/request_body.rb +64 -0
  57. data/lib/datadog/appsec/contrib/rack/reactive/response.rb +13 -13
  58. data/lib/datadog/appsec/contrib/rack/request.rb +27 -1
  59. data/lib/datadog/appsec/contrib/rack/request_body_middleware.rb +41 -0
  60. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +92 -10
  61. data/lib/datadog/appsec/contrib/rack/response.rb +1 -1
  62. data/lib/datadog/appsec/contrib/rails/configuration/settings.rb +3 -3
  63. data/lib/datadog/appsec/contrib/rails/ext.rb +1 -1
  64. data/lib/datadog/appsec/contrib/rails/framework.rb +1 -1
  65. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +82 -0
  66. data/lib/datadog/appsec/contrib/rails/integration.rb +5 -5
  67. data/lib/datadog/appsec/contrib/rails/patcher.rb +42 -8
  68. data/lib/datadog/appsec/contrib/rails/reactive/action.rb +68 -0
  69. data/lib/datadog/appsec/contrib/rails/request.rb +36 -0
  70. data/lib/datadog/appsec/contrib/rails/request_middleware.rb +1 -1
  71. data/lib/datadog/appsec/contrib/sinatra/configuration/settings.rb +3 -3
  72. data/lib/datadog/appsec/contrib/sinatra/ext.rb +2 -1
  73. data/lib/datadog/appsec/contrib/sinatra/framework.rb +1 -1
  74. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +126 -0
  75. data/lib/datadog/appsec/contrib/sinatra/integration.rb +4 -4
  76. data/lib/datadog/appsec/contrib/sinatra/patcher.rb +84 -10
  77. data/lib/datadog/appsec/contrib/sinatra/reactive/routed.rb +63 -0
  78. data/lib/datadog/appsec/contrib/sinatra/request_middleware.rb +1 -1
  79. data/lib/datadog/appsec/event.rb +38 -27
  80. data/lib/datadog/appsec/extensions.rb +43 -26
  81. data/lib/datadog/appsec/instrumentation/gateway.rb +17 -3
  82. data/lib/datadog/appsec/processor.rb +86 -13
  83. data/lib/datadog/appsec/rate_limiter.rb +6 -1
  84. data/lib/datadog/appsec/reactive/address_hash.rb +1 -1
  85. data/lib/datadog/appsec/reactive/engine.rb +3 -3
  86. data/lib/datadog/appsec/reactive/operation.rb +5 -6
  87. data/lib/datadog/appsec/reactive/subscriber.rb +1 -1
  88. data/lib/datadog/appsec/response.rb +63 -0
  89. data/lib/datadog/appsec/utils/http/media_range.rb +201 -0
  90. data/lib/datadog/appsec/utils/http/media_type.rb +87 -0
  91. data/lib/datadog/appsec/utils/http.rb +9 -0
  92. data/lib/datadog/appsec/utils.rb +7 -0
  93. data/lib/datadog/appsec.rb +6 -6
  94. data/lib/datadog/ci/configuration/components.rb +1 -1
  95. data/lib/datadog/ci/configuration/settings.rb +1 -1
  96. data/lib/datadog/ci/contrib/cucumber/configuration/settings.rb +2 -2
  97. data/lib/datadog/ci/contrib/cucumber/formatter.rb +5 -5
  98. data/lib/datadog/ci/contrib/cucumber/instrumentation.rb +1 -1
  99. data/lib/datadog/ci/contrib/cucumber/integration.rb +4 -4
  100. data/lib/datadog/ci/contrib/cucumber/patcher.rb +2 -2
  101. data/lib/datadog/ci/contrib/rspec/configuration/settings.rb +2 -2
  102. data/lib/datadog/ci/contrib/rspec/example.rb +5 -5
  103. data/lib/datadog/ci/contrib/rspec/integration.rb +4 -4
  104. data/lib/datadog/ci/contrib/rspec/patcher.rb +2 -2
  105. data/lib/datadog/ci/ext/environment.rb +99 -27
  106. data/lib/datadog/ci/extensions.rb +4 -4
  107. data/lib/datadog/ci/flush.rb +2 -2
  108. data/lib/datadog/ci/test.rb +3 -3
  109. data/lib/datadog/ci.rb +6 -6
  110. data/lib/datadog/core/buffer/cruby.rb +1 -1
  111. data/lib/datadog/core/buffer/thread_safe.rb +1 -1
  112. data/lib/datadog/core/configuration/agent_settings_resolver.rb +9 -12
  113. data/lib/datadog/core/configuration/base.rb +14 -2
  114. data/lib/datadog/core/configuration/components.rb +123 -54
  115. data/lib/datadog/core/configuration/ext.rb +26 -0
  116. data/lib/datadog/core/configuration/option_definition.rb +12 -3
  117. data/lib/datadog/core/configuration/option_definition_set.rb +1 -1
  118. data/lib/datadog/core/configuration/options.rb +3 -3
  119. data/lib/datadog/core/configuration/settings.rb +79 -251
  120. data/lib/datadog/core/configuration.rb +16 -11
  121. data/lib/datadog/core/diagnostics/environment_logger.rb +10 -5
  122. data/lib/datadog/core/diagnostics/health.rb +5 -23
  123. data/lib/datadog/core/environment/cgroup.rb +4 -2
  124. data/lib/datadog/core/environment/container.rb +3 -2
  125. data/lib/datadog/core/environment/ext.rb +1 -1
  126. data/lib/datadog/core/environment/identity.rb +2 -2
  127. data/lib/datadog/core/environment/platform.rb +40 -0
  128. data/lib/datadog/core/environment/socket.rb +1 -1
  129. data/lib/datadog/core/environment/variable_helpers.rb +83 -11
  130. data/lib/datadog/core/error.rb +1 -1
  131. data/lib/datadog/core/extensions.rb +1 -1
  132. data/lib/datadog/core/header_collection.rb +41 -0
  133. data/lib/datadog/core/logging/ext.rb +11 -0
  134. data/lib/datadog/core/metrics/client.rb +25 -14
  135. data/lib/datadog/core/metrics/ext.rb +0 -2
  136. data/lib/datadog/core/metrics/options.rb +3 -3
  137. data/lib/datadog/core/runtime/ext.rb +1 -1
  138. data/lib/datadog/core/runtime/metrics.rb +7 -7
  139. data/lib/datadog/core/telemetry/client.rb +79 -0
  140. data/lib/datadog/core/telemetry/collector.rb +233 -0
  141. data/lib/datadog/core/telemetry/emitter.rb +48 -0
  142. data/lib/datadog/core/telemetry/event.rb +71 -0
  143. data/lib/datadog/core/telemetry/ext.rb +11 -0
  144. data/lib/datadog/core/telemetry/heartbeat.rb +37 -0
  145. data/lib/datadog/core/telemetry/http/adapters/net.rb +113 -0
  146. data/lib/datadog/core/telemetry/http/env.rb +20 -0
  147. data/lib/datadog/core/telemetry/http/ext.rb +20 -0
  148. data/lib/datadog/core/telemetry/http/response.rb +68 -0
  149. data/lib/datadog/core/telemetry/http/transport.rb +53 -0
  150. data/lib/datadog/core/telemetry/v1/app_event.rb +52 -0
  151. data/lib/datadog/core/telemetry/v1/application.rb +86 -0
  152. data/lib/datadog/core/telemetry/v1/configuration.rb +25 -0
  153. data/lib/datadog/core/telemetry/v1/dependency.rb +36 -0
  154. data/lib/datadog/core/telemetry/v1/host.rb +51 -0
  155. data/lib/datadog/core/telemetry/v1/integration.rb +58 -0
  156. data/lib/datadog/core/telemetry/v1/product.rb +28 -0
  157. data/lib/datadog/core/telemetry/v1/telemetry_request.rb +100 -0
  158. data/lib/datadog/core/utils/compression.rb +5 -1
  159. data/lib/datadog/core/utils/object_set.rb +1 -1
  160. data/lib/datadog/core/utils/sequence.rb +5 -0
  161. data/lib/datadog/core/utils/string_table.rb +1 -1
  162. data/lib/datadog/core/utils/time.rb +3 -3
  163. data/lib/datadog/core/utils.rb +1 -22
  164. data/lib/datadog/core/vendor/multipart-post/multipart/post/multipartable.rb +2 -2
  165. data/lib/datadog/core/vendor/multipart-post/net/http/post/multipart.rb +3 -3
  166. data/lib/datadog/core/workers/async.rb +4 -4
  167. data/lib/datadog/core/workers/polling.rb +2 -2
  168. data/lib/datadog/core/workers/runtime_metrics.rb +4 -7
  169. data/lib/datadog/core.rb +28 -56
  170. data/lib/datadog/kit/appsec/events.rb +75 -0
  171. data/lib/datadog/kit/enable_core_dumps.rb +51 -0
  172. data/lib/datadog/kit/identity.rb +64 -0
  173. data/lib/datadog/kit.rb +11 -0
  174. data/lib/datadog/opentelemetry/api/context.rb +187 -0
  175. data/lib/datadog/opentelemetry/api/trace/span.rb +15 -0
  176. data/lib/datadog/opentelemetry/sdk/configurator.rb +38 -0
  177. data/lib/datadog/opentelemetry/sdk/id_generator.rb +27 -0
  178. data/lib/datadog/opentelemetry/sdk/propagator.rb +91 -0
  179. data/lib/datadog/opentelemetry/sdk/span_processor.rb +92 -0
  180. data/lib/datadog/opentelemetry.rb +48 -0
  181. data/lib/datadog/opentracer/distributed_headers.rb +7 -9
  182. data/lib/datadog/opentracer/rack_propagator.rb +10 -9
  183. data/lib/datadog/opentracer/span.rb +1 -1
  184. data/lib/datadog/opentracer/text_map_propagator.rb +13 -12
  185. data/lib/datadog/opentracer/thread_local_scope_manager.rb +26 -3
  186. data/lib/datadog/opentracer/tracer.rb +23 -23
  187. data/lib/datadog/opentracer.rb +16 -16
  188. data/lib/datadog/profiling/buffer.rb +3 -3
  189. data/lib/datadog/profiling/collectors/code_provenance.rb +1 -0
  190. data/lib/datadog/profiling/collectors/cpu_and_wall_time.rb +43 -0
  191. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +91 -0
  192. data/lib/datadog/profiling/collectors/dynamic_sampling_rate.rb +14 -0
  193. data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +68 -0
  194. data/lib/datadog/profiling/collectors/old_stack.rb +305 -0
  195. data/lib/datadog/profiling/collectors/stack.rb +4 -288
  196. data/lib/datadog/profiling/encoding/profile.rb +8 -13
  197. data/lib/datadog/profiling/events/stack.rb +1 -1
  198. data/lib/datadog/profiling/exporter.rb +69 -9
  199. data/lib/datadog/profiling/ext/forking.rb +41 -42
  200. data/lib/datadog/profiling/ext.rb +4 -16
  201. data/lib/datadog/profiling/flush.rb +25 -56
  202. data/lib/datadog/profiling/http_transport.rb +132 -0
  203. data/lib/datadog/profiling/load_native_extension.rb +22 -0
  204. data/lib/datadog/profiling/old_recorder.rb +109 -0
  205. data/lib/datadog/profiling/pprof/builder.rb +4 -4
  206. data/lib/datadog/profiling/pprof/converter.rb +1 -1
  207. data/lib/datadog/profiling/pprof/message_set.rb +1 -1
  208. data/lib/datadog/profiling/pprof/stack_sample.rb +4 -4
  209. data/lib/datadog/profiling/pprof/string_table.rb +1 -1
  210. data/lib/datadog/profiling/pprof/template.rb +5 -5
  211. data/lib/datadog/profiling/preload.rb +1 -1
  212. data/lib/datadog/profiling/profiler.rb +7 -0
  213. data/lib/datadog/profiling/scheduler.rb +29 -50
  214. data/lib/datadog/profiling/stack_recorder.rb +79 -0
  215. data/lib/datadog/profiling/tag_builder.rb +53 -0
  216. data/lib/datadog/profiling/tasks/exec.rb +2 -2
  217. data/lib/datadog/profiling/tasks/setup.rb +8 -13
  218. data/lib/datadog/profiling/trace_identifiers/ddtrace.rb +2 -2
  219. data/lib/datadog/profiling/trace_identifiers/helper.rb +1 -1
  220. data/lib/datadog/profiling.rb +49 -44
  221. data/lib/datadog/tracing/analytics.rb +1 -1
  222. data/lib/datadog/tracing/buffer.rb +14 -8
  223. data/lib/datadog/tracing/client_ip.rb +164 -0
  224. data/lib/datadog/tracing/configuration/ext.rb +47 -4
  225. data/lib/datadog/tracing/configuration/settings.rb +433 -0
  226. data/lib/datadog/tracing/context.rb +1 -1
  227. data/lib/datadog/tracing/context_provider.rb +18 -2
  228. data/lib/datadog/tracing/contrib/action_cable/configuration/settings.rb +2 -2
  229. data/lib/datadog/tracing/contrib/action_cable/event.rb +4 -5
  230. data/lib/datadog/tracing/contrib/action_cable/events/broadcast.rb +4 -4
  231. data/lib/datadog/tracing/contrib/action_cable/events/perform_action.rb +3 -3
  232. data/lib/datadog/tracing/contrib/action_cable/events/transmit.rb +4 -4
  233. data/lib/datadog/tracing/contrib/action_cable/events.rb +4 -4
  234. data/lib/datadog/tracing/contrib/action_cable/instrumentation.rb +3 -4
  235. data/lib/datadog/tracing/contrib/action_cable/integration.rb +4 -4
  236. data/lib/datadog/tracing/contrib/action_cable/patcher.rb +4 -4
  237. data/lib/datadog/tracing/contrib/action_mailer/configuration/settings.rb +2 -2
  238. data/lib/datadog/tracing/contrib/action_mailer/event.rb +3 -3
  239. data/lib/datadog/tracing/contrib/action_mailer/events/deliver.rb +3 -3
  240. data/lib/datadog/tracing/contrib/action_mailer/events/process.rb +3 -3
  241. data/lib/datadog/tracing/contrib/action_mailer/events.rb +2 -2
  242. data/lib/datadog/tracing/contrib/action_mailer/integration.rb +4 -4
  243. data/lib/datadog/tracing/contrib/action_mailer/patcher.rb +3 -3
  244. data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +10 -6
  245. data/lib/datadog/tracing/contrib/action_pack/action_controller/patcher.rb +2 -2
  246. data/lib/datadog/tracing/contrib/action_pack/configuration/settings.rb +2 -2
  247. data/lib/datadog/tracing/contrib/action_pack/integration.rb +4 -4
  248. data/lib/datadog/tracing/contrib/action_pack/patcher.rb +2 -2
  249. data/lib/datadog/tracing/contrib/action_pack/utils.rb +1 -1
  250. data/lib/datadog/tracing/contrib/action_view/configuration/settings.rb +2 -2
  251. data/lib/datadog/tracing/contrib/action_view/event.rb +1 -1
  252. data/lib/datadog/tracing/contrib/action_view/events/render_partial.rb +5 -5
  253. data/lib/datadog/tracing/contrib/action_view/events/render_template.rb +5 -5
  254. data/lib/datadog/tracing/contrib/action_view/events.rb +2 -2
  255. data/lib/datadog/tracing/contrib/action_view/instrumentation/partial_renderer.rb +2 -2
  256. data/lib/datadog/tracing/contrib/action_view/instrumentation/template_renderer.rb +2 -2
  257. data/lib/datadog/tracing/contrib/action_view/integration.rb +4 -4
  258. data/lib/datadog/tracing/contrib/action_view/patcher.rb +7 -8
  259. data/lib/datadog/tracing/contrib/action_view/utils.rb +1 -1
  260. data/lib/datadog/tracing/contrib/active_job/configuration/settings.rb +3 -3
  261. data/lib/datadog/tracing/contrib/active_job/event.rb +3 -3
  262. data/lib/datadog/tracing/contrib/active_job/events/discard.rb +4 -4
  263. data/lib/datadog/tracing/contrib/active_job/events/enqueue.rb +4 -4
  264. data/lib/datadog/tracing/contrib/active_job/events/enqueue_at.rb +4 -4
  265. data/lib/datadog/tracing/contrib/active_job/events/enqueue_retry.rb +4 -4
  266. data/lib/datadog/tracing/contrib/active_job/events/perform.rb +4 -4
  267. data/lib/datadog/tracing/contrib/active_job/events/retry_stopped.rb +4 -4
  268. data/lib/datadog/tracing/contrib/active_job/events.rb +6 -6
  269. data/lib/datadog/tracing/contrib/active_job/integration.rb +4 -4
  270. data/lib/datadog/tracing/contrib/active_job/log_injection.rb +0 -2
  271. data/lib/datadog/tracing/contrib/active_job/patcher.rb +4 -4
  272. data/lib/datadog/tracing/contrib/active_model_serializers/configuration/settings.rb +2 -2
  273. data/lib/datadog/tracing/contrib/active_model_serializers/event.rb +4 -5
  274. data/lib/datadog/tracing/contrib/active_model_serializers/events/render.rb +3 -3
  275. data/lib/datadog/tracing/contrib/active_model_serializers/events/serialize.rb +2 -2
  276. data/lib/datadog/tracing/contrib/active_model_serializers/events.rb +2 -2
  277. data/lib/datadog/tracing/contrib/active_model_serializers/integration.rb +3 -3
  278. data/lib/datadog/tracing/contrib/active_model_serializers/patcher.rb +3 -4
  279. data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +4 -4
  280. data/lib/datadog/tracing/contrib/active_record/configuration/settings.rb +3 -3
  281. data/lib/datadog/tracing/contrib/active_record/event.rb +1 -1
  282. data/lib/datadog/tracing/contrib/active_record/events/instantiation.rb +4 -4
  283. data/lib/datadog/tracing/contrib/active_record/events/sql.rb +6 -6
  284. data/lib/datadog/tracing/contrib/active_record/events.rb +2 -2
  285. data/lib/datadog/tracing/contrib/active_record/integration.rb +6 -6
  286. data/lib/datadog/tracing/contrib/active_record/patcher.rb +2 -2
  287. data/lib/datadog/tracing/contrib/active_record/utils.rb +3 -3
  288. data/lib/datadog/tracing/contrib/active_record/vendor/connection_specification.rb +1 -1
  289. data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +19 -9
  290. data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +2 -2
  291. data/lib/datadog/tracing/contrib/active_support/cache/redis.rb +1 -1
  292. data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +2 -2
  293. data/lib/datadog/tracing/contrib/active_support/integration.rb +5 -5
  294. data/lib/datadog/tracing/contrib/active_support/notifications/event.rb +1 -1
  295. data/lib/datadog/tracing/contrib/active_support/notifications/subscriber.rb +1 -1
  296. data/lib/datadog/tracing/contrib/active_support/notifications/subscription.rb +4 -2
  297. data/lib/datadog/tracing/contrib/active_support/patcher.rb +2 -2
  298. data/lib/datadog/tracing/contrib/analytics.rb +1 -1
  299. data/lib/datadog/tracing/contrib/auto_instrument.rb +4 -4
  300. data/lib/datadog/tracing/contrib/aws/configuration/settings.rb +6 -3
  301. data/lib/datadog/tracing/contrib/aws/ext.rb +1 -0
  302. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +5 -4
  303. data/lib/datadog/tracing/contrib/aws/integration.rb +3 -3
  304. data/lib/datadog/tracing/contrib/aws/patcher.rb +5 -5
  305. data/lib/datadog/tracing/contrib/aws/services.rb +0 -2
  306. data/lib/datadog/tracing/contrib/concurrent_ruby/configuration/settings.rb +2 -2
  307. data/lib/datadog/tracing/contrib/concurrent_ruby/context_composite_executor_service.rb +10 -3
  308. data/lib/datadog/tracing/contrib/concurrent_ruby/future_patch.rb +1 -1
  309. data/lib/datadog/tracing/contrib/concurrent_ruby/integration.rb +3 -3
  310. data/lib/datadog/tracing/contrib/concurrent_ruby/patcher.rb +2 -2
  311. data/lib/datadog/tracing/contrib/configurable.rb +2 -2
  312. data/lib/datadog/tracing/contrib/configuration/resolvers/pattern_resolver.rb +1 -1
  313. data/lib/datadog/tracing/contrib/configuration/settings.rb +2 -2
  314. data/lib/datadog/tracing/contrib/dalli/configuration/settings.rb +6 -3
  315. data/lib/datadog/tracing/contrib/dalli/ext.rb +2 -0
  316. data/lib/datadog/tracing/contrib/dalli/instrumentation.rb +8 -5
  317. data/lib/datadog/tracing/contrib/dalli/integration.rb +3 -3
  318. data/lib/datadog/tracing/contrib/dalli/patcher.rb +3 -4
  319. data/lib/datadog/tracing/contrib/dalli/quantize.rb +1 -1
  320. data/lib/datadog/tracing/contrib/delayed_job/configuration/settings.rb +3 -3
  321. data/lib/datadog/tracing/contrib/delayed_job/ext.rb +2 -0
  322. data/lib/datadog/tracing/contrib/delayed_job/integration.rb +3 -3
  323. data/lib/datadog/tracing/contrib/delayed_job/patcher.rb +8 -3
  324. data/lib/datadog/tracing/contrib/delayed_job/plugin.rb +7 -4
  325. data/lib/datadog/tracing/contrib/delayed_job/server_internal_tracer/worker.rb +32 -0
  326. data/lib/datadog/tracing/contrib/elasticsearch/configuration/settings.rb +7 -3
  327. data/lib/datadog/tracing/contrib/elasticsearch/ext.rb +3 -0
  328. data/lib/datadog/tracing/contrib/elasticsearch/integration.rb +12 -6
  329. data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +47 -9
  330. data/lib/datadog/tracing/contrib/elasticsearch/quantize.rb +1 -1
  331. data/lib/datadog/tracing/contrib/ethon/configuration/settings.rb +8 -3
  332. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +6 -7
  333. data/lib/datadog/tracing/contrib/ethon/ext.rb +1 -0
  334. data/lib/datadog/tracing/contrib/ethon/integration.rb +4 -4
  335. data/lib/datadog/tracing/contrib/ethon/multi_patch.rb +5 -4
  336. data/lib/datadog/tracing/contrib/ethon/patcher.rb +3 -4
  337. data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +7 -3
  338. data/lib/datadog/tracing/contrib/excon/ext.rb +1 -0
  339. data/lib/datadog/tracing/contrib/excon/integration.rb +4 -4
  340. data/lib/datadog/tracing/contrib/excon/middleware.rb +8 -7
  341. data/lib/datadog/tracing/contrib/excon/patcher.rb +2 -2
  342. data/lib/datadog/tracing/contrib/ext.rb +25 -0
  343. data/lib/datadog/tracing/contrib/extensions.rb +5 -5
  344. data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +7 -3
  345. data/lib/datadog/tracing/contrib/faraday/ext.rb +1 -0
  346. data/lib/datadog/tracing/contrib/faraday/integration.rb +4 -4
  347. data/lib/datadog/tracing/contrib/faraday/middleware.rb +8 -8
  348. data/lib/datadog/tracing/contrib/faraday/patcher.rb +5 -6
  349. data/lib/datadog/tracing/contrib/grape/configuration/settings.rb +3 -3
  350. data/lib/datadog/tracing/contrib/grape/endpoint.rb +4 -7
  351. data/lib/datadog/tracing/contrib/grape/integration.rb +3 -3
  352. data/lib/datadog/tracing/contrib/grape/patcher.rb +4 -5
  353. data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +3 -3
  354. data/lib/datadog/tracing/contrib/graphql/integration.rb +3 -3
  355. data/lib/datadog/tracing/contrib/graphql/patcher.rb +2 -4
  356. data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +10 -4
  357. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +20 -5
  358. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +17 -17
  359. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor.rb +7 -4
  360. data/lib/datadog/tracing/contrib/grpc/distributed/fetcher.rb +27 -0
  361. data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +43 -0
  362. data/lib/datadog/tracing/contrib/grpc/ext.rb +4 -0
  363. data/lib/datadog/tracing/contrib/grpc/integration.rb +3 -3
  364. data/lib/datadog/tracing/contrib/grpc/patcher.rb +3 -6
  365. data/lib/datadog/tracing/contrib/hanami/action_tracer.rb +47 -0
  366. data/lib/datadog/tracing/contrib/hanami/configuration/settings.rb +22 -0
  367. data/lib/datadog/tracing/contrib/hanami/ext.rb +24 -0
  368. data/lib/datadog/tracing/contrib/hanami/integration.rb +44 -0
  369. data/lib/datadog/tracing/contrib/hanami/patcher.rb +33 -0
  370. data/lib/datadog/tracing/contrib/hanami/plugin.rb +23 -0
  371. data/lib/datadog/tracing/contrib/hanami/renderer_policy_tracing.rb +41 -0
  372. data/lib/datadog/tracing/contrib/hanami/router_tracing.rb +44 -0
  373. data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +1 -2
  374. data/lib/datadog/tracing/contrib/http/configuration/settings.rb +13 -3
  375. data/lib/datadog/tracing/contrib/http/distributed/fetcher.rb +39 -0
  376. data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +38 -0
  377. data/lib/datadog/tracing/contrib/http/ext.rb +2 -0
  378. data/lib/datadog/tracing/contrib/http/instrumentation.rb +8 -10
  379. data/lib/datadog/tracing/contrib/http/integration.rb +6 -6
  380. data/lib/datadog/tracing/contrib/http/patcher.rb +3 -3
  381. data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +13 -3
  382. data/lib/datadog/tracing/contrib/httpclient/ext.rb +2 -0
  383. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +9 -9
  384. data/lib/datadog/tracing/contrib/httpclient/integration.rb +4 -4
  385. data/lib/datadog/tracing/contrib/httpclient/patcher.rb +3 -3
  386. data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +13 -3
  387. data/lib/datadog/tracing/contrib/httprb/ext.rb +2 -0
  388. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +9 -9
  389. data/lib/datadog/tracing/contrib/httprb/integration.rb +4 -4
  390. data/lib/datadog/tracing/contrib/httprb/patcher.rb +3 -3
  391. data/lib/datadog/tracing/contrib/integration.rb +3 -3
  392. data/lib/datadog/tracing/contrib/kafka/configuration/settings.rb +2 -2
  393. data/lib/datadog/tracing/contrib/kafka/consumer_event.rb +1 -0
  394. data/lib/datadog/tracing/contrib/kafka/event.rb +3 -3
  395. data/lib/datadog/tracing/contrib/kafka/events/connection/request.rb +2 -2
  396. data/lib/datadog/tracing/contrib/kafka/events/consumer/process_batch.rb +3 -3
  397. data/lib/datadog/tracing/contrib/kafka/events/consumer/process_message.rb +3 -3
  398. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/heartbeat.rb +4 -4
  399. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/join_group.rb +4 -4
  400. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/leave_group.rb +4 -4
  401. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/sync_group.rb +4 -4
  402. data/lib/datadog/tracing/contrib/kafka/events/produce_operation/send_messages.rb +3 -2
  403. data/lib/datadog/tracing/contrib/kafka/events/producer/deliver_messages.rb +3 -2
  404. data/lib/datadog/tracing/contrib/kafka/events.rb +9 -9
  405. data/lib/datadog/tracing/contrib/kafka/integration.rb +3 -3
  406. data/lib/datadog/tracing/contrib/kafka/patcher.rb +3 -4
  407. data/lib/datadog/tracing/contrib/lograge/configuration/settings.rb +2 -2
  408. data/lib/datadog/tracing/contrib/lograge/instrumentation.rb +2 -2
  409. data/lib/datadog/tracing/contrib/lograge/integration.rb +3 -3
  410. data/lib/datadog/tracing/contrib/lograge/patcher.rb +2 -2
  411. data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +7 -3
  412. data/lib/datadog/tracing/contrib/mongodb/ext.rb +8 -0
  413. data/lib/datadog/tracing/contrib/mongodb/instrumentation.rb +3 -3
  414. data/lib/datadog/tracing/contrib/mongodb/integration.rb +4 -4
  415. data/lib/datadog/tracing/contrib/mongodb/parsers.rb +1 -1
  416. data/lib/datadog/tracing/contrib/mongodb/patcher.rb +3 -3
  417. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +10 -4
  418. data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +18 -3
  419. data/lib/datadog/tracing/contrib/mysql2/ext.rb +2 -0
  420. data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +20 -5
  421. data/lib/datadog/tracing/contrib/mysql2/integration.rb +3 -3
  422. data/lib/datadog/tracing/contrib/mysql2/patcher.rb +2 -2
  423. data/lib/datadog/tracing/contrib/patcher.rb +16 -4
  424. data/lib/datadog/tracing/contrib/pg/configuration/settings.rb +50 -0
  425. data/lib/datadog/tracing/contrib/pg/ext.rb +33 -0
  426. data/lib/datadog/tracing/contrib/pg/instrumentation.rb +168 -0
  427. data/lib/datadog/tracing/contrib/pg/integration.rb +43 -0
  428. data/lib/datadog/tracing/contrib/pg/patcher.rb +31 -0
  429. data/lib/datadog/tracing/contrib/presto/configuration/settings.rb +6 -3
  430. data/lib/datadog/tracing/contrib/presto/ext.rb +1 -0
  431. data/lib/datadog/tracing/contrib/presto/instrumentation.rb +2 -3
  432. data/lib/datadog/tracing/contrib/presto/integration.rb +3 -3
  433. data/lib/datadog/tracing/contrib/presto/patcher.rb +4 -4
  434. data/lib/datadog/tracing/contrib/propagation/sql_comment/comment.rb +43 -0
  435. data/lib/datadog/tracing/contrib/propagation/sql_comment/ext.rb +33 -0
  436. data/lib/datadog/tracing/contrib/propagation/sql_comment/mode.rb +28 -0
  437. data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +47 -0
  438. data/lib/datadog/tracing/contrib/qless/configuration/settings.rb +2 -2
  439. data/lib/datadog/tracing/contrib/qless/integration.rb +3 -3
  440. data/lib/datadog/tracing/contrib/qless/patcher.rb +1 -3
  441. data/lib/datadog/tracing/contrib/qless/qless_job.rb +2 -3
  442. data/lib/datadog/tracing/contrib/qless/tracer_cleaner.rb +0 -2
  443. data/lib/datadog/tracing/contrib/que/configuration/settings.rb +3 -3
  444. data/lib/datadog/tracing/contrib/que/integration.rb +4 -4
  445. data/lib/datadog/tracing/contrib/que/patcher.rb +1 -2
  446. data/lib/datadog/tracing/contrib/que/tracer.rb +3 -1
  447. data/lib/datadog/tracing/contrib/racecar/configuration/settings.rb +2 -2
  448. data/lib/datadog/tracing/contrib/racecar/event.rb +4 -5
  449. data/lib/datadog/tracing/contrib/racecar/events/batch.rb +6 -3
  450. data/lib/datadog/tracing/contrib/racecar/events/consume.rb +2 -2
  451. data/lib/datadog/tracing/contrib/racecar/events/message.rb +6 -3
  452. data/lib/datadog/tracing/contrib/racecar/events.rb +3 -3
  453. data/lib/datadog/tracing/contrib/racecar/integration.rb +3 -3
  454. data/lib/datadog/tracing/contrib/racecar/patcher.rb +3 -4
  455. data/lib/datadog/tracing/contrib/rack/configuration/settings.rb +2 -2
  456. data/lib/datadog/tracing/contrib/rack/header_collection.rb +35 -0
  457. data/lib/datadog/tracing/contrib/rack/integration.rb +4 -4
  458. data/lib/datadog/tracing/contrib/rack/middlewares.rb +129 -61
  459. data/lib/datadog/tracing/contrib/rack/patcher.rb +12 -2
  460. data/lib/datadog/tracing/contrib/rails/auto_instrument_railtie.rb +1 -1
  461. data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +4 -1
  462. data/lib/datadog/tracing/contrib/rails/framework.rb +18 -22
  463. data/lib/datadog/tracing/contrib/rails/integration.rb +4 -4
  464. data/lib/datadog/tracing/contrib/rails/log_injection.rb +3 -18
  465. data/lib/datadog/tracing/contrib/rails/middlewares.rb +1 -2
  466. data/lib/datadog/tracing/contrib/rails/patcher.rb +7 -8
  467. data/lib/datadog/tracing/contrib/rails/railtie.rb +3 -3
  468. data/lib/datadog/tracing/contrib/rails/utils.rb +1 -1
  469. data/lib/datadog/tracing/contrib/rake/configuration/settings.rb +17 -2
  470. data/lib/datadog/tracing/contrib/rake/instrumentation.rb +14 -9
  471. data/lib/datadog/tracing/contrib/rake/integration.rb +3 -3
  472. data/lib/datadog/tracing/contrib/rake/patcher.rb +3 -5
  473. data/lib/datadog/tracing/contrib/redis/configuration/resolver.rb +1 -1
  474. data/lib/datadog/tracing/contrib/redis/configuration/settings.rb +6 -3
  475. data/lib/datadog/tracing/contrib/redis/ext.rb +3 -0
  476. data/lib/datadog/tracing/contrib/redis/instrumentation.rb +36 -26
  477. data/lib/datadog/tracing/contrib/redis/integration.rb +37 -4
  478. data/lib/datadog/tracing/contrib/redis/patcher.rb +57 -14
  479. data/lib/datadog/tracing/contrib/redis/quantize.rb +12 -9
  480. data/lib/datadog/tracing/contrib/redis/tags.rb +12 -10
  481. data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +72 -0
  482. data/lib/datadog/tracing/contrib/resque/configuration/settings.rb +3 -3
  483. data/lib/datadog/tracing/contrib/resque/integration.rb +3 -3
  484. data/lib/datadog/tracing/contrib/resque/patcher.rb +2 -3
  485. data/lib/datadog/tracing/contrib/resque/resque_job.rb +5 -4
  486. data/lib/datadog/tracing/contrib/rest_client/configuration/settings.rb +9 -3
  487. data/lib/datadog/tracing/contrib/rest_client/ext.rb +1 -0
  488. data/lib/datadog/tracing/contrib/rest_client/integration.rb +3 -3
  489. data/lib/datadog/tracing/contrib/rest_client/patcher.rb +2 -3
  490. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +7 -6
  491. data/lib/datadog/tracing/contrib/semantic_logger/configuration/settings.rb +2 -2
  492. data/lib/datadog/tracing/contrib/semantic_logger/instrumentation.rb +2 -2
  493. data/lib/datadog/tracing/contrib/semantic_logger/integration.rb +3 -3
  494. data/lib/datadog/tracing/contrib/semantic_logger/patcher.rb +2 -2
  495. data/lib/datadog/tracing/contrib/sequel/configuration/settings.rb +2 -2
  496. data/lib/datadog/tracing/contrib/sequel/database.rb +4 -5
  497. data/lib/datadog/tracing/contrib/sequel/dataset.rb +4 -5
  498. data/lib/datadog/tracing/contrib/sequel/integration.rb +3 -3
  499. data/lib/datadog/tracing/contrib/sequel/patcher.rb +3 -3
  500. data/lib/datadog/tracing/contrib/sequel/utils.rb +2 -2
  501. data/lib/datadog/tracing/contrib/shoryuken/configuration/settings.rb +3 -3
  502. data/lib/datadog/tracing/contrib/shoryuken/integration.rb +4 -4
  503. data/lib/datadog/tracing/contrib/shoryuken/patcher.rb +1 -1
  504. data/lib/datadog/tracing/contrib/shoryuken/tracer.rb +3 -1
  505. data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +9 -5
  506. data/lib/datadog/tracing/contrib/sidekiq/configuration/settings.rb +4 -3
  507. data/lib/datadog/tracing/contrib/sidekiq/ext.rb +6 -0
  508. data/lib/datadog/tracing/contrib/sidekiq/integration.rb +3 -3
  509. data/lib/datadog/tracing/contrib/sidekiq/patcher.rb +14 -7
  510. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/heartbeat.rb +19 -1
  511. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/{scheduled_push.rb → redis_info.rb} +5 -6
  512. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/scheduled_poller.rb +53 -0
  513. data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +29 -6
  514. data/lib/datadog/tracing/contrib/sidekiq/tracing.rb +2 -2
  515. data/lib/datadog/tracing/contrib/sinatra/configuration/settings.rb +2 -2
  516. data/lib/datadog/tracing/contrib/sinatra/env.rb +14 -25
  517. data/lib/datadog/tracing/contrib/sinatra/ext.rb +7 -3
  518. data/lib/datadog/tracing/contrib/sinatra/framework.rb +11 -2
  519. data/lib/datadog/tracing/contrib/sinatra/headers.rb +1 -1
  520. data/lib/datadog/tracing/contrib/sinatra/integration.rb +3 -3
  521. data/lib/datadog/tracing/contrib/sinatra/patcher.rb +7 -8
  522. data/lib/datadog/tracing/contrib/sinatra/tracer.rb +15 -88
  523. data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +20 -16
  524. data/lib/datadog/tracing/contrib/sneakers/configuration/settings.rb +2 -2
  525. data/lib/datadog/tracing/contrib/sneakers/integration.rb +4 -4
  526. data/lib/datadog/tracing/contrib/sneakers/patcher.rb +2 -3
  527. data/lib/datadog/tracing/contrib/sneakers/tracer.rb +4 -3
  528. data/lib/datadog/tracing/contrib/status_code_matcher.rb +2 -2
  529. data/lib/datadog/tracing/contrib/stripe/configuration/settings.rb +33 -0
  530. data/lib/datadog/tracing/contrib/stripe/ext.rb +26 -0
  531. data/lib/datadog/tracing/contrib/stripe/integration.rb +43 -0
  532. data/lib/datadog/tracing/contrib/stripe/patcher.rb +29 -0
  533. data/lib/datadog/tracing/contrib/stripe/request.rb +67 -0
  534. data/lib/datadog/tracing/contrib/sucker_punch/configuration/settings.rb +2 -2
  535. data/lib/datadog/tracing/contrib/sucker_punch/instrumentation.rb +3 -4
  536. data/lib/datadog/tracing/contrib/sucker_punch/integration.rb +3 -3
  537. data/lib/datadog/tracing/contrib/sucker_punch/patcher.rb +4 -6
  538. data/lib/datadog/tracing/contrib/utils/quantization/http.rb +92 -10
  539. data/lib/datadog/tracing/contrib.rb +50 -47
  540. data/lib/datadog/tracing/correlation.rb +1 -1
  541. data/lib/datadog/{core → tracing}/diagnostics/ext.rb +1 -6
  542. data/lib/datadog/tracing/diagnostics/health.rb +40 -0
  543. data/lib/datadog/tracing/distributed/b3_multi.rb +66 -0
  544. data/lib/datadog/tracing/distributed/b3_single.rb +66 -0
  545. data/lib/datadog/tracing/distributed/datadog.rb +153 -0
  546. data/lib/datadog/tracing/distributed/datadog_tags_codec.rb +85 -0
  547. data/lib/datadog/tracing/distributed/fetcher.rb +30 -0
  548. data/lib/datadog/tracing/distributed/headers/ext.rb +19 -15
  549. data/lib/datadog/tracing/distributed/helpers.rb +40 -4
  550. data/lib/datadog/tracing/distributed/none.rb +19 -0
  551. data/lib/datadog/tracing/distributed/propagation.rb +127 -0
  552. data/lib/datadog/tracing/distributed/trace_context.rb +378 -0
  553. data/lib/datadog/tracing/event.rb +3 -2
  554. data/lib/datadog/tracing/flush.rb +57 -35
  555. data/lib/datadog/tracing/metadata/analytics.rb +2 -2
  556. data/lib/datadog/tracing/metadata/errors.rb +2 -2
  557. data/lib/datadog/tracing/metadata/ext.rb +28 -1
  558. data/lib/datadog/tracing/metadata/tagging.rb +23 -2
  559. data/lib/datadog/tracing/metadata.rb +3 -3
  560. data/lib/datadog/tracing/pipeline/span_filter.rb +10 -6
  561. data/lib/datadog/tracing/pipeline.rb +3 -3
  562. data/lib/datadog/tracing/propagation/http.rb +3 -98
  563. data/lib/datadog/tracing/runtime/metrics.rb +1 -1
  564. data/lib/datadog/tracing/sampling/all_sampler.rb +1 -1
  565. data/lib/datadog/tracing/sampling/ext.rb +31 -0
  566. data/lib/datadog/tracing/sampling/priority_sampler.rb +64 -12
  567. data/lib/datadog/tracing/sampling/rate_by_key_sampler.rb +10 -11
  568. data/lib/datadog/tracing/sampling/rate_by_service_sampler.rb +32 -8
  569. data/lib/datadog/tracing/sampling/rate_limiter.rb +4 -1
  570. data/lib/datadog/tracing/sampling/rate_sampler.rb +27 -10
  571. data/lib/datadog/tracing/sampling/rule.rb +15 -9
  572. data/lib/datadog/tracing/sampling/rule_sampler.rb +11 -12
  573. data/lib/datadog/tracing/sampling/span/ext.rb +25 -0
  574. data/lib/datadog/tracing/sampling/span/matcher.rb +89 -0
  575. data/lib/datadog/tracing/sampling/span/rule.rb +82 -0
  576. data/lib/datadog/tracing/sampling/span/rule_parser.rb +104 -0
  577. data/lib/datadog/tracing/sampling/span/sampler.rb +75 -0
  578. data/lib/datadog/tracing/span.rb +24 -20
  579. data/lib/datadog/tracing/span_operation.rb +15 -16
  580. data/lib/datadog/tracing/sync_writer.rb +5 -5
  581. data/lib/datadog/tracing/trace_digest.rb +88 -2
  582. data/lib/datadog/tracing/trace_operation.rb +60 -16
  583. data/lib/datadog/tracing/trace_segment.rb +13 -8
  584. data/lib/datadog/tracing/tracer.rb +49 -21
  585. data/lib/datadog/tracing/utils.rb +50 -0
  586. data/lib/datadog/tracing/workers/trace_writer.rb +9 -9
  587. data/lib/datadog/tracing/workers.rb +3 -3
  588. data/lib/datadog/tracing/writer.rb +12 -5
  589. data/lib/datadog/tracing.rb +8 -8
  590. data/lib/ddtrace/auto_instrument.rb +9 -2
  591. data/lib/ddtrace/transport/ext.rb +7 -1
  592. data/lib/ddtrace/transport/http/adapters/net.rb +3 -2
  593. data/lib/ddtrace/transport/http/adapters/test.rb +1 -1
  594. data/lib/ddtrace/transport/http/adapters/unix_socket.rb +2 -2
  595. data/lib/ddtrace/transport/http/api/map.rb +1 -1
  596. data/lib/ddtrace/transport/http/api.rb +4 -4
  597. data/lib/ddtrace/transport/http/builder.rb +5 -5
  598. data/lib/ddtrace/transport/http/client.rb +4 -3
  599. data/lib/ddtrace/transport/http/response.rb +35 -5
  600. data/lib/ddtrace/transport/http/statistics.rb +1 -1
  601. data/lib/ddtrace/transport/http/traces.rb +5 -5
  602. data/lib/ddtrace/transport/http.rb +12 -9
  603. data/lib/ddtrace/transport/io/client.rb +5 -3
  604. data/lib/ddtrace/transport/io/response.rb +1 -1
  605. data/lib/ddtrace/transport/io/traces.rb +3 -3
  606. data/lib/ddtrace/transport/io.rb +3 -3
  607. data/lib/ddtrace/transport/statistics.rb +2 -2
  608. data/lib/ddtrace/transport/trace_formatter.rb +14 -10
  609. data/lib/ddtrace/transport/traces.rb +8 -6
  610. data/lib/ddtrace/version.rb +1 -1
  611. data/lib/ddtrace.rb +6 -5
  612. metadata +160 -44
  613. data/.editorconfig +0 -22
  614. data/.gitignore +0 -70
  615. data/CONTRIBUTING.md +0 -81
  616. data/ddtrace.gemspec +0 -59
  617. data/docs/0.x-trace.png +0 -0
  618. data/docs/1.0-trace.png +0 -0
  619. data/docs/AutoInstrumentation.md +0 -36
  620. data/docs/Deprecation.md +0 -8
  621. data/docs/DevelopmentGuide.md +0 -259
  622. data/docs/GettingStarted.md +0 -2671
  623. data/docs/ProfilingDevelopment.md +0 -110
  624. data/docs/PublicApi.md +0 -14
  625. data/docs/UpgradeGuide.md +0 -736
  626. data/lib/datadog/profiling/recorder.rb +0 -117
  627. data/lib/datadog/profiling/transport/client.rb +0 -16
  628. data/lib/datadog/profiling/transport/http/api/endpoint.rb +0 -107
  629. data/lib/datadog/profiling/transport/http/api/instance.rb +0 -38
  630. data/lib/datadog/profiling/transport/http/api/spec.rb +0 -42
  631. data/lib/datadog/profiling/transport/http/api.rb +0 -45
  632. data/lib/datadog/profiling/transport/http/builder.rb +0 -30
  633. data/lib/datadog/profiling/transport/http/client.rb +0 -35
  634. data/lib/datadog/profiling/transport/http/response.rb +0 -23
  635. data/lib/datadog/profiling/transport/http.rb +0 -112
  636. data/lib/datadog/profiling/transport/io/client.rb +0 -29
  637. data/lib/datadog/profiling/transport/io/response.rb +0 -18
  638. data/lib/datadog/profiling/transport/io.rb +0 -32
  639. data/lib/datadog/profiling/transport/parcel.rb +0 -19
  640. data/lib/datadog/profiling/transport/request.rb +0 -17
  641. data/lib/datadog/profiling/transport/response.rb +0 -10
  642. data/lib/datadog/tracing/distributed/headers/b3.rb +0 -55
  643. data/lib/datadog/tracing/distributed/headers/b3_single.rb +0 -67
  644. data/lib/datadog/tracing/distributed/headers/datadog.rb +0 -52
  645. data/lib/datadog/tracing/distributed/parser.rb +0 -70
  646. data/lib/datadog/tracing/propagation/grpc.rb +0 -88
@@ -1,8 +1,8 @@
1
1
  # typed: true
2
2
 
3
- require 'datadog/tracing'
4
- require 'datadog/tracing/contrib/registry'
5
- require 'datadog/tracing/contrib/extensions'
3
+ require_relative '../tracing'
4
+ require_relative 'contrib/registry'
5
+ require_relative 'contrib/extensions'
6
6
 
7
7
  module Datadog
8
8
  module Tracing
@@ -30,47 +30,50 @@ module Datadog
30
30
  end
31
31
  end
32
32
 
33
- require 'datadog/tracing/contrib/action_cable/integration'
34
- require 'datadog/tracing/contrib/action_mailer/integration'
35
- require 'datadog/tracing/contrib/action_pack/integration'
36
- require 'datadog/tracing/contrib/action_view/integration'
37
- require 'datadog/tracing/contrib/active_model_serializers/integration'
38
- require 'datadog/tracing/contrib/active_job/integration'
39
- require 'datadog/tracing/contrib/active_record/integration'
40
- require 'datadog/tracing/contrib/active_support/integration'
41
- require 'datadog/tracing/contrib/aws/integration'
42
- require 'datadog/tracing/contrib/concurrent_ruby/integration'
43
- require 'datadog/tracing/contrib/dalli/integration'
44
- require 'datadog/tracing/contrib/delayed_job/integration'
45
- require 'datadog/tracing/contrib/elasticsearch/integration'
46
- require 'datadog/tracing/contrib/ethon/integration'
47
- require 'datadog/tracing/contrib/excon/integration'
48
- require 'datadog/tracing/contrib/faraday/integration'
49
- require 'datadog/tracing/contrib/grape/integration'
50
- require 'datadog/tracing/contrib/graphql/integration'
51
- require 'datadog/tracing/contrib/grpc/integration'
52
- require 'datadog/tracing/contrib/http/integration'
53
- require 'datadog/tracing/contrib/httpclient/integration'
54
- require 'datadog/tracing/contrib/httprb/integration'
55
- require 'datadog/tracing/contrib/integration'
56
- require 'datadog/tracing/contrib/kafka/integration'
57
- require 'datadog/tracing/contrib/lograge/integration'
58
- require 'datadog/tracing/contrib/mongodb/integration'
59
- require 'datadog/tracing/contrib/mysql2/integration'
60
- require 'datadog/tracing/contrib/presto/integration'
61
- require 'datadog/tracing/contrib/qless/integration'
62
- require 'datadog/tracing/contrib/que/integration'
63
- require 'datadog/tracing/contrib/racecar/integration'
64
- require 'datadog/tracing/contrib/rack/integration'
65
- require 'datadog/tracing/contrib/rails/integration'
66
- require 'datadog/tracing/contrib/rake/integration'
67
- require 'datadog/tracing/contrib/redis/integration'
68
- require 'datadog/tracing/contrib/resque/integration'
69
- require 'datadog/tracing/contrib/rest_client/integration'
70
- require 'datadog/tracing/contrib/semantic_logger/integration'
71
- require 'datadog/tracing/contrib/sequel/integration'
72
- require 'datadog/tracing/contrib/shoryuken/integration'
73
- require 'datadog/tracing/contrib/sidekiq/integration'
74
- require 'datadog/tracing/contrib/sinatra/integration'
75
- require 'datadog/tracing/contrib/sneakers/integration'
76
- require 'datadog/tracing/contrib/sucker_punch/integration'
33
+ require_relative 'contrib/action_cable/integration'
34
+ require_relative 'contrib/action_mailer/integration'
35
+ require_relative 'contrib/action_pack/integration'
36
+ require_relative 'contrib/action_view/integration'
37
+ require_relative 'contrib/active_model_serializers/integration'
38
+ require_relative 'contrib/active_job/integration'
39
+ require_relative 'contrib/active_record/integration'
40
+ require_relative 'contrib/active_support/integration'
41
+ require_relative 'contrib/aws/integration'
42
+ require_relative 'contrib/concurrent_ruby/integration'
43
+ require_relative 'contrib/dalli/integration'
44
+ require_relative 'contrib/delayed_job/integration'
45
+ require_relative 'contrib/elasticsearch/integration'
46
+ require_relative 'contrib/ethon/integration'
47
+ require_relative 'contrib/excon/integration'
48
+ require_relative 'contrib/faraday/integration'
49
+ require_relative 'contrib/grape/integration'
50
+ require_relative 'contrib/graphql/integration'
51
+ require_relative 'contrib/grpc/integration'
52
+ require_relative 'contrib/hanami/integration'
53
+ require_relative 'contrib/http/integration'
54
+ require_relative 'contrib/httpclient/integration'
55
+ require_relative 'contrib/httprb/integration'
56
+ require_relative 'contrib/integration'
57
+ require_relative 'contrib/kafka/integration'
58
+ require_relative 'contrib/lograge/integration'
59
+ require_relative 'contrib/mongodb/integration'
60
+ require_relative 'contrib/mysql2/integration'
61
+ require_relative 'contrib/pg/integration'
62
+ require_relative 'contrib/presto/integration'
63
+ require_relative 'contrib/qless/integration'
64
+ require_relative 'contrib/que/integration'
65
+ require_relative 'contrib/racecar/integration'
66
+ require_relative 'contrib/rack/integration'
67
+ require_relative 'contrib/rails/integration'
68
+ require_relative 'contrib/rake/integration'
69
+ require_relative 'contrib/redis/integration'
70
+ require_relative 'contrib/resque/integration'
71
+ require_relative 'contrib/rest_client/integration'
72
+ require_relative 'contrib/semantic_logger/integration'
73
+ require_relative 'contrib/sequel/integration'
74
+ require_relative 'contrib/shoryuken/integration'
75
+ require_relative 'contrib/sidekiq/integration'
76
+ require_relative 'contrib/sinatra/integration'
77
+ require_relative 'contrib/sneakers/integration'
78
+ require_relative 'contrib/stripe/integration'
79
+ require_relative 'contrib/sucker_punch/integration'
@@ -1,6 +1,6 @@
1
1
  # typed: true
2
2
 
3
- require 'datadog/core'
3
+ require_relative '../core'
4
4
 
5
5
  module Datadog
6
6
  module Tracing
@@ -1,19 +1,14 @@
1
1
  # typed: true
2
2
 
3
3
  module Datadog
4
- module Core
4
+ module Tracing
5
5
  module Diagnostics
6
6
  # @public_api
7
7
  module Ext
8
- DD_TRACE_STARTUP_LOGS = 'DD_TRACE_STARTUP_LOGS'.freeze
9
- DD_TRACE_DEBUG = 'DD_TRACE_DEBUG'.freeze
10
- DD_TRACE_ENABLED = 'DD_TRACE_ENABLED'.freeze
11
8
  # Health
12
9
  module Health
13
10
  # Metrics
14
11
  module Metrics
15
- ENV_ENABLED = 'DD_HEALTH_METRICS_ENABLED'.freeze
16
-
17
12
  METRIC_API_ERRORS = 'datadog.tracer.api.errors'.freeze
18
13
  METRIC_API_REQUESTS = 'datadog.tracer.api.requests'.freeze
19
14
  METRIC_API_RESPONSES = 'datadog.tracer.api.responses'.freeze
@@ -0,0 +1,40 @@
1
+ # typed: ignore
2
+
3
+ require_relative 'ext'
4
+
5
+ module Datadog
6
+ module Tracing
7
+ module Diagnostics
8
+ # Health-related diagnostics
9
+ module Health
10
+ # Health metrics for diagnostics
11
+ module Metrics
12
+ def self.extended(base)
13
+ base.class_eval do
14
+ count :api_errors, Ext::Health::Metrics::METRIC_API_ERRORS
15
+ count :api_requests, Ext::Health::Metrics::METRIC_API_REQUESTS
16
+ count :api_responses, Ext::Health::Metrics::METRIC_API_RESPONSES
17
+ count :error_context_overflow, Ext::Health::Metrics::METRIC_ERROR_CONTEXT_OVERFLOW
18
+ count :error_instrumentation_patch, Ext::Health::Metrics::METRIC_ERROR_INSTRUMENTATION_PATCH
19
+ count :error_span_finish, Ext::Health::Metrics::METRIC_ERROR_SPAN_FINISH
20
+ count :error_unfinished_spans, Ext::Health::Metrics::METRIC_ERROR_UNFINISHED_SPANS
21
+ count :instrumentation_patched, Ext::Health::Metrics::METRIC_INSTRUMENTATION_PATCHED
22
+ count :queue_accepted, Ext::Health::Metrics::METRIC_QUEUE_ACCEPTED
23
+ count :queue_accepted_lengths, Ext::Health::Metrics::METRIC_QUEUE_ACCEPTED_LENGTHS
24
+ count :queue_dropped, Ext::Health::Metrics::METRIC_QUEUE_DROPPED
25
+ count :traces_filtered, Ext::Health::Metrics::METRIC_TRACES_FILTERED
26
+ count :transport_trace_too_large, Ext::Health::Metrics::METRIC_TRANSPORT_TRACE_TOO_LARGE
27
+ count :transport_chunked, Ext::Health::Metrics::METRIC_TRANSPORT_CHUNKED
28
+ count :writer_cpu_time, Ext::Health::Metrics::METRIC_WRITER_CPU_TIME
29
+
30
+ gauge :queue_length, Ext::Health::Metrics::METRIC_QUEUE_LENGTH
31
+ gauge :queue_max_length, Ext::Health::Metrics::METRIC_QUEUE_MAX_LENGTH
32
+ gauge :queue_spans, Ext::Health::Metrics::METRIC_QUEUE_SPANS
33
+ gauge :sampling_service_cache_length, Ext::Health::Metrics::METRIC_SAMPLING_SERVICE_CACHE_LENGTH
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+ # typed: true
3
+
4
+ require_relative 'helpers'
5
+ require_relative '../trace_digest'
6
+
7
+ module Datadog
8
+ module Tracing
9
+ module Distributed
10
+ # B3 multi header-style trace propagation.
11
+ # @see https://github.com/openzipkin/b3-propagation#multiple-headers
12
+ class B3Multi
13
+ B3_TRACE_ID_KEY = 'x-b3-traceid'
14
+ B3_SPAN_ID_KEY = 'x-b3-spanid'
15
+ B3_SAMPLED_KEY = 'x-b3-sampled'
16
+
17
+ def initialize(
18
+ fetcher:,
19
+ trace_id_key: B3_TRACE_ID_KEY,
20
+ span_id_key: B3_SPAN_ID_KEY,
21
+ sampled_key: B3_SAMPLED_KEY
22
+ )
23
+ @trace_id_key = trace_id_key
24
+ @span_id_key = span_id_key
25
+ @sampled_key = sampled_key
26
+ @fetcher = fetcher
27
+ end
28
+
29
+ def inject!(digest, data = {})
30
+ return if digest.nil?
31
+
32
+ # DEV: We need these to be hex encoded
33
+ data[@trace_id_key] = digest.trace_id.to_s(16)
34
+ data[@span_id_key] = digest.span_id.to_s(16)
35
+
36
+ if digest.trace_sampling_priority
37
+ sampling_priority = Helpers.clamp_sampling_priority(
38
+ digest.trace_sampling_priority
39
+ )
40
+ data[@sampled_key] = sampling_priority.to_s
41
+ end
42
+
43
+ data
44
+ end
45
+
46
+ def extract(data)
47
+ # DEV: B3 doesn't have "origin"
48
+ fetcher = @fetcher.new(data)
49
+ trace_id = fetcher.id(@trace_id_key, base: 16)
50
+ span_id = fetcher.id(@span_id_key, base: 16)
51
+ # We don't need to try and convert sampled since B3 supports 0/1 (AUTO_REJECT/AUTO_KEEP)
52
+ sampling_priority = fetcher.number(@sampled_key)
53
+
54
+ # Return early if this propagation is not valid
55
+ return unless trace_id && span_id
56
+
57
+ TraceDigest.new(
58
+ trace_id: trace_id,
59
+ span_id: span_id,
60
+ trace_sampling_priority: sampling_priority
61
+ )
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+ # typed: true
3
+
4
+ require_relative 'helpers'
5
+ require_relative '../trace_digest'
6
+
7
+ module Datadog
8
+ module Tracing
9
+ module Distributed
10
+ # B3 single header-style trace propagation.
11
+ #
12
+ # DEV: Format:
13
+ # DEV: b3: {TraceId}-{SpanId}-{SamplingState}-{ParentSpanId}
14
+ # DEV: https://github.com/apache/incubator-zipkin-b3-propagation/tree/7c6e9f14d6627832bd80baa87ac7dabee7be23cf#single-header
15
+ # DEV: `{SamplingState}` and `{ParentSpanId}` are optional
16
+ #
17
+ # @see https://github.com/openzipkin/b3-propagation#single-header
18
+ class B3Single
19
+ B3_SINGLE_HEADER_KEY = 'b3'
20
+
21
+ def initialize(fetcher:, key: B3_SINGLE_HEADER_KEY)
22
+ @key = key
23
+ @fetcher = fetcher
24
+ end
25
+
26
+ def inject!(digest, env)
27
+ return if digest.nil?
28
+
29
+ # DEV: We need these to be hex encoded
30
+ value = "#{digest.trace_id.to_s(16)}-#{digest.span_id.to_s(16)}"
31
+
32
+ if digest.trace_sampling_priority
33
+ sampling_priority = Helpers.clamp_sampling_priority(
34
+ digest.trace_sampling_priority
35
+ )
36
+ value += "-#{sampling_priority}"
37
+ end
38
+
39
+ env[@key] = value
40
+ env
41
+ end
42
+
43
+ def extract(env)
44
+ fetcher = @fetcher.new(env)
45
+ value = fetcher[@key]
46
+
47
+ return unless value
48
+
49
+ parts = value.split('-')
50
+ trace_id = Helpers.value_to_id(parts[0], 16) unless parts.empty?
51
+ span_id = Helpers.value_to_id(parts[1], 16) if parts.length > 1
52
+ sampling_priority = Helpers.value_to_number(parts[2]) if parts.length > 2
53
+
54
+ # Return if this propagation is not valid
55
+ return unless trace_id && span_id
56
+
57
+ TraceDigest.new(
58
+ span_id: span_id,
59
+ trace_id: trace_id,
60
+ trace_sampling_priority: sampling_priority
61
+ )
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,153 @@
1
+ # frozen_string_literal: true
2
+ # typed: true
3
+
4
+ require_relative '../metadata/ext'
5
+ require_relative '../trace_digest'
6
+ require_relative 'datadog_tags_codec'
7
+
8
+ module Datadog
9
+ module Tracing
10
+ module Distributed
11
+ # Datadog-style trace propagation.
12
+ class Datadog
13
+ TRACE_ID_KEY = 'x-datadog-trace-id'
14
+ PARENT_ID_KEY = 'x-datadog-parent-id'
15
+ SAMPLING_PRIORITY_KEY = 'x-datadog-sampling-priority'
16
+ ORIGIN_KEY = 'x-datadog-origin'
17
+ # Distributed trace-level tags
18
+ TAGS_KEY = 'x-datadog-tags'
19
+
20
+ # Prefix used by all Datadog-specific distributed tags
21
+ TAGS_PREFIX = 'x-datadog-'
22
+
23
+ def initialize(
24
+ fetcher:,
25
+ trace_id_key: TRACE_ID_KEY,
26
+ parent_id_key: PARENT_ID_KEY,
27
+ sampling_priority_key: SAMPLING_PRIORITY_KEY,
28
+ origin_key: ORIGIN_KEY,
29
+ tags_key: TAGS_KEY
30
+ )
31
+ @trace_id_key = trace_id_key
32
+ @parent_id_key = parent_id_key
33
+ @sampling_priority_key = sampling_priority_key
34
+ @origin_key = origin_key
35
+ @tags_key = tags_key
36
+ @fetcher = fetcher
37
+ end
38
+
39
+ def inject!(digest, data)
40
+ return if digest.nil?
41
+
42
+ data[@trace_id_key] = digest.trace_id.to_s
43
+ data[@parent_id_key] = digest.span_id.to_s
44
+ data[@sampling_priority_key] = digest.trace_sampling_priority.to_s if digest.trace_sampling_priority
45
+ data[@origin_key] = digest.trace_origin.to_s if digest.trace_origin
46
+
47
+ inject_tags(digest, data)
48
+
49
+ data
50
+ end
51
+
52
+ def extract(data)
53
+ fetcher = @fetcher.new(data)
54
+ trace_id = fetcher.id(@trace_id_key)
55
+ parent_id = fetcher.id(@parent_id_key)
56
+ sampling_priority = fetcher.number(@sampling_priority_key)
57
+ origin = fetcher[@origin_key]
58
+
59
+ # Return early if this propagation is not valid
60
+ # DEV: To be valid we need to have a trace id and a parent id
61
+ # or when it is a synthetics trace, just the trace id.
62
+ # DEV: `Fetcher#id` will not return 0
63
+ return unless (trace_id && parent_id) || (origin && trace_id)
64
+
65
+ trace_distributed_tags = extract_tags(fetcher)
66
+
67
+ TraceDigest.new(
68
+ span_id: parent_id,
69
+ trace_id: trace_id,
70
+ trace_origin: origin,
71
+ trace_sampling_priority: sampling_priority,
72
+ trace_distributed_tags: trace_distributed_tags,
73
+ )
74
+ end
75
+
76
+ private
77
+
78
+ # Export trace distributed tags through the `x-datadog-tags` key.
79
+ #
80
+ # DEV: This method accesses global state (the active trace) to record its error state as a trace tag.
81
+ # DEV: This means errors cannot be reported if there's not active span.
82
+ # DEV: Ideally, we'd have a dedicated error reporting stream for all of ddtrace.
83
+ def inject_tags(digest, data)
84
+ return if digest.trace_distributed_tags.nil? || digest.trace_distributed_tags.empty?
85
+ return set_tags_propagation_error(reason: 'disabled') if tags_disabled?
86
+
87
+ tags = DatadogTagsCodec.encode(digest.trace_distributed_tags)
88
+
89
+ return set_tags_propagation_error(reason: 'inject_max_size') if tags_too_large?(tags.size, scenario: 'inject')
90
+
91
+ data[@tags_key] = tags
92
+ rescue => e
93
+ set_tags_propagation_error(reason: 'encoding_error')
94
+ ::Datadog.logger.warn(
95
+ "Failed to inject x-datadog-tags: #{e.class.name} #{e.message} at #{Array(e.backtrace).first}"
96
+ )
97
+ end
98
+
99
+ # Import `x-datadog-tags` tags as trace distributed tags.
100
+ # Only tags that have the `_dd.p.` prefix are processed.
101
+ #
102
+ # DEV: This method accesses global state (the active trace) to record its error state as a trace tag.
103
+ # DEV: This means errors cannot be reported if there's not active span.
104
+ # DEV: Ideally, we'd have a dedicated error reporting stream for all of ddtrace.
105
+ def extract_tags(fetcher)
106
+ tags = fetcher[@tags_key]
107
+
108
+ return if !tags || tags.empty?
109
+ return set_tags_propagation_error(reason: 'disabled') if tags_disabled?
110
+ return set_tags_propagation_error(reason: 'extract_max_size') if tags_too_large?(tags.size, scenario: 'extract')
111
+
112
+ tags_hash = DatadogTagsCodec.decode(tags)
113
+ # Only extract keys with the expected Datadog prefix
114
+ tags_hash.select! do |key, _|
115
+ key.start_with?(Tracing::Metadata::Ext::Distributed::TAGS_PREFIX) && key != EXCLUDED_TAG
116
+ end
117
+ tags_hash
118
+ rescue => e
119
+ set_tags_propagation_error(reason: 'decoding_error')
120
+ ::Datadog.logger.warn(
121
+ "Failed to extract x-datadog-tags: #{e.class.name} #{e.message} at #{Array(e.backtrace).first}"
122
+ )
123
+ end
124
+
125
+ def set_tags_propagation_error(reason:)
126
+ active_trace = Tracing.active_trace
127
+ active_trace.set_tag('_dd.propagation_error', reason) if active_trace
128
+ nil
129
+ end
130
+
131
+ def tags_disabled?
132
+ ::Datadog.configuration.tracing.x_datadog_tags_max_length <= 0
133
+ end
134
+
135
+ def tags_too_large?(size, scenario:)
136
+ return false if size <= ::Datadog.configuration.tracing.x_datadog_tags_max_length
137
+
138
+ ::Datadog.logger.warn(
139
+ "Failed to #{scenario} x-datadog-tags: tags are too large for configured limit (size:#{size} >= " \
140
+ "limit:#{::Datadog.configuration.tracing.x_datadog_tags_max_length}). This limit can be configured " \
141
+ 'through the DD_TRACE_X_DATADOG_TAGS_MAX_LENGTH environment variable.'
142
+ )
143
+
144
+ true
145
+ end
146
+
147
+ # We want to exclude tags that we don't want to propagate downstream.
148
+ EXCLUDED_TAG = '_dd.p.upstream_services'
149
+ private_constant :EXCLUDED_TAG
150
+ end
151
+ end
152
+ end
153
+ end
@@ -0,0 +1,85 @@
1
+ # frozen_string_literal: true
2
+ # typed: false
3
+
4
+ module Datadog
5
+ module Tracing
6
+ module Distributed
7
+ # Encodes and decodes distributed 'x-datadog-tags' tags for transport
8
+ # to and from external processes.
9
+ module DatadogTagsCodec
10
+ # Backport `Regexp::match?` because it is measurably the most performant
11
+ # way to check if a string matches a regular expression.
12
+ module RefineRegexp
13
+ unless Regexp.method_defined?(:match?)
14
+ refine ::Regexp do
15
+ def match?(*args)
16
+ !match(*args).nil?
17
+ end
18
+ end
19
+ end
20
+ end
21
+ using RefineRegexp
22
+
23
+ # ASCII characters 32-126, except `,`, `=`, and ` `. At least one character.
24
+ VALID_KEY_CHARS = /\A(?:(?![,= ])[\u0020-\u007E])+\Z/.freeze
25
+ # ASCII characters 32-126, except `,`. At least one character.
26
+ VALID_VALUE_CHARS = /\A(?:(?!,)[\u0020-\u007E])+\Z/.freeze
27
+
28
+ # Serializes a {Hash<String,String>} into a `x-datadog-tags`-compatible
29
+ # String.
30
+ #
31
+ # @param tags [Hash<String,String>] trace tag hash
32
+ # @return [String] serialized tags hash
33
+ # @raise [EncodingError] if tags cannot be serialized to the `x-datadog-tags` format
34
+ def self.encode(tags)
35
+ begin
36
+ tags.map do |raw_key, raw_value|
37
+ key = raw_key.to_s
38
+ value = raw_value.to_s
39
+
40
+ raise EncodingError, "Invalid key `#{key}` for value `#{value}`" unless VALID_KEY_CHARS.match?(key)
41
+ raise EncodingError, "Invalid value `#{value}` for key `#{key}`" unless VALID_VALUE_CHARS.match?(value)
42
+
43
+ "#{key}=#{value.strip}"
44
+ end.join(',')
45
+ rescue => e
46
+ raise EncodingError, "Error encoding tags `#{tags}`: `#{e}`"
47
+ end
48
+ end
49
+
50
+ # Deserializes a `x-datadog-tags`-formatted String into a {Hash<String,String>}.
51
+ #
52
+ # @param string [String] tags as serialized by {#encode}
53
+ # @return [Hash<String,String>] decoded input as a hash of strings
54
+ # @raise [DecodingError] if string does not conform to the `x-datadog-tags` format
55
+ def self.decode(string)
56
+ result = Hash[string.split(',').map do |raw_tag|
57
+ raw_tag.split('=', 2).tap do |raw_key, raw_value|
58
+ key = raw_key.to_s
59
+ value = raw_value.to_s
60
+
61
+ raise DecodingError, "Invalid key: #{key}" unless VALID_KEY_CHARS.match?(key)
62
+ raise DecodingError, "Invalid value: #{value}" unless VALID_VALUE_CHARS.match?(value)
63
+
64
+ value.strip!
65
+ end
66
+ end]
67
+
68
+ raise DecodingError, "Invalid empty tags: #{string}" if result.empty? && !string.empty?
69
+
70
+ result
71
+ end
72
+
73
+ # An error occurred during distributed tags encoding.
74
+ # See {#message} for more information.
75
+ class EncodingError < StandardError
76
+ end
77
+
78
+ # An error occurred during distributed tags decoding.
79
+ # See {#message} for more information.
80
+ class DecodingError < StandardError
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+ # typed: true
3
+
4
+ require_relative 'helpers'
5
+
6
+ module Datadog
7
+ module Tracing
8
+ module Distributed
9
+ # Common fetcher that retrieves fields from a Hash data input
10
+ class Fetcher
11
+ # @param data [Hash]
12
+ def initialize(data)
13
+ @data = data
14
+ end
15
+
16
+ def [](key)
17
+ @data[key]
18
+ end
19
+
20
+ def id(key, base: 10)
21
+ Helpers.value_to_id(self[key], base)
22
+ end
23
+
24
+ def number(key, base: 10)
25
+ Helpers.value_to_number(self[key], base)
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -1,29 +1,33 @@
1
+ # frozen_string_literal: true
1
2
  # typed: true
2
3
 
3
4
  module Datadog
4
5
  module Tracing
5
6
  module Distributed
6
7
  module Headers
7
- # HTTP headers one should set for distributed tracing.
8
- # These are cross-language (eg: Python, Go and other implementations should honor these)
8
+ # DEV-2.0: This module only exists for backwards compatibility with the public API. It should be removed.
9
+ # @deprecated use [Datadog::Tracing::Distributed::Ext]
9
10
  # @public_api
10
11
  module Ext
11
- HTTP_HEADER_TRACE_ID = 'x-datadog-trace-id'.freeze
12
- HTTP_HEADER_PARENT_ID = 'x-datadog-parent-id'.freeze
13
- HTTP_HEADER_SAMPLING_PRIORITY = 'x-datadog-sampling-priority'.freeze
14
- HTTP_HEADER_ORIGIN = 'x-datadog-origin'.freeze
12
+ HTTP_HEADER_TRACE_ID = 'x-datadog-trace-id'
13
+ HTTP_HEADER_PARENT_ID = 'x-datadog-parent-id'
14
+ HTTP_HEADER_SAMPLING_PRIORITY = 'x-datadog-sampling-priority'
15
+ HTTP_HEADER_ORIGIN = 'x-datadog-origin'
16
+ # Distributed trace-level tags
17
+ HTTP_HEADER_TAGS = 'x-datadog-tags'
15
18
 
16
- # B3 headers used for distributed tracing
17
- B3_HEADER_TRACE_ID = 'x-b3-traceid'.freeze
18
- B3_HEADER_SPAN_ID = 'x-b3-spanid'.freeze
19
- B3_HEADER_SAMPLED = 'x-b3-sampled'.freeze
20
- B3_HEADER_SINGLE = 'b3'.freeze
19
+ # B3 keys used for distributed tracing.
20
+ # @see https://github.com/openzipkin/b3-propagation
21
+ B3_HEADER_TRACE_ID = 'x-b3-traceid'
22
+ B3_HEADER_SPAN_ID = 'x-b3-spanid'
23
+ B3_HEADER_SAMPLED = 'x-b3-sampled'
24
+ B3_HEADER_SINGLE = 'b3'
21
25
 
22
26
  # gRPC metadata keys for distributed tracing. https://github.com/grpc/grpc-go/blob/v1.10.x/Documentation/grpc-metadata.md
23
- GRPC_METADATA_TRACE_ID = 'x-datadog-trace-id'.freeze
24
- GRPC_METADATA_PARENT_ID = 'x-datadog-parent-id'.freeze
25
- GRPC_METADATA_SAMPLING_PRIORITY = 'x-datadog-sampling-priority'.freeze
26
- GRPC_METADATA_ORIGIN = 'x-datadog-origin'.freeze
27
+ GRPC_METADATA_TRACE_ID = 'x-datadog-trace-id'
28
+ GRPC_METADATA_PARENT_ID = 'x-datadog-parent-id'
29
+ GRPC_METADATA_SAMPLING_PRIORITY = 'x-datadog-sampling-priority'
30
+ GRPC_METADATA_ORIGIN = 'x-datadog-origin'
27
31
  end
28
32
  end
29
33
  end