datadog 2.12.0 → 2.22.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 (570) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +348 -1
  3. data/README.md +0 -1
  4. data/ext/LIBDATADOG_DEVELOPMENT.md +60 -0
  5. data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +63 -56
  6. data/ext/datadog_profiling_native_extension/collectors_discrete_dynamic_sampler.c +1 -1
  7. data/ext/datadog_profiling_native_extension/collectors_stack.c +263 -76
  8. data/ext/datadog_profiling_native_extension/collectors_stack.h +20 -3
  9. data/ext/datadog_profiling_native_extension/collectors_thread_context.c +78 -26
  10. data/ext/datadog_profiling_native_extension/collectors_thread_context.h +1 -0
  11. data/ext/datadog_profiling_native_extension/datadog_ruby_common.c +1 -4
  12. data/ext/datadog_profiling_native_extension/datadog_ruby_common.h +10 -0
  13. data/ext/datadog_profiling_native_extension/encoded_profile.c +79 -0
  14. data/ext/datadog_profiling_native_extension/encoded_profile.h +8 -0
  15. data/ext/datadog_profiling_native_extension/extconf.rb +10 -0
  16. data/ext/datadog_profiling_native_extension/heap_recorder.c +247 -364
  17. data/ext/datadog_profiling_native_extension/heap_recorder.h +4 -6
  18. data/ext/datadog_profiling_native_extension/http_transport.c +60 -94
  19. data/ext/datadog_profiling_native_extension/libdatadog_helpers.c +22 -0
  20. data/ext/datadog_profiling_native_extension/libdatadog_helpers.h +8 -5
  21. data/ext/datadog_profiling_native_extension/private_vm_api_access.c +41 -21
  22. data/ext/datadog_profiling_native_extension/private_vm_api_access.h +6 -4
  23. data/ext/datadog_profiling_native_extension/profiling.c +2 -0
  24. data/ext/datadog_profiling_native_extension/ruby_helpers.c +1 -13
  25. data/ext/datadog_profiling_native_extension/ruby_helpers.h +3 -11
  26. data/ext/datadog_profiling_native_extension/stack_recorder.c +173 -76
  27. data/ext/libdatadog_api/crashtracker.c +11 -12
  28. data/ext/libdatadog_api/crashtracker.h +5 -0
  29. data/ext/libdatadog_api/datadog_ruby_common.c +1 -4
  30. data/ext/libdatadog_api/datadog_ruby_common.h +10 -0
  31. data/ext/libdatadog_api/ddsketch.c +106 -0
  32. data/ext/libdatadog_api/extconf.rb +5 -3
  33. data/ext/libdatadog_api/init.c +18 -0
  34. data/ext/libdatadog_api/library_config.c +172 -0
  35. data/ext/libdatadog_api/library_config.h +25 -0
  36. data/ext/libdatadog_api/process_discovery.c +118 -0
  37. data/ext/libdatadog_api/process_discovery.h +5 -0
  38. data/ext/libdatadog_extconf_helpers.rb +15 -5
  39. data/lib/datadog/appsec/actions_handler/serializable_backtrace.rb +89 -0
  40. data/lib/datadog/appsec/actions_handler.rb +24 -2
  41. data/lib/datadog/appsec/anonymizer.rb +16 -0
  42. data/lib/datadog/appsec/api_security/endpoint_collection/grape_route_serializer.rb +26 -0
  43. data/lib/datadog/appsec/api_security/endpoint_collection/rails_collector.rb +59 -0
  44. data/lib/datadog/appsec/api_security/endpoint_collection/rails_route_serializer.rb +29 -0
  45. data/lib/datadog/appsec/api_security/endpoint_collection/sinatra_route_serializer.rb +26 -0
  46. data/lib/datadog/appsec/api_security/endpoint_collection.rb +10 -0
  47. data/lib/datadog/appsec/api_security/lru_cache.rb +56 -0
  48. data/lib/datadog/appsec/api_security/route_extractor.rb +75 -0
  49. data/lib/datadog/appsec/api_security/sampler.rb +59 -0
  50. data/lib/datadog/appsec/api_security.rb +23 -0
  51. data/lib/datadog/appsec/assets/waf_rules/README.md +44 -5
  52. data/lib/datadog/appsec/assets/waf_rules/recommended.json +601 -74
  53. data/lib/datadog/appsec/assets/waf_rules/strict.json +48 -75
  54. data/lib/datadog/appsec/autoload.rb +2 -2
  55. data/lib/datadog/appsec/component.rb +46 -71
  56. data/lib/datadog/appsec/compressed_json.rb +40 -0
  57. data/lib/datadog/appsec/configuration/settings.rb +162 -30
  58. data/lib/datadog/appsec/context.rb +30 -7
  59. data/lib/datadog/appsec/contrib/active_record/instrumentation.rb +35 -18
  60. data/lib/datadog/appsec/contrib/active_record/integration.rb +2 -2
  61. data/lib/datadog/appsec/contrib/active_record/patcher.rb +62 -11
  62. data/lib/datadog/appsec/contrib/auto_instrument.rb +1 -1
  63. data/lib/datadog/appsec/contrib/devise/configuration.rb +7 -31
  64. data/lib/datadog/appsec/contrib/devise/data_extractor.rb +78 -0
  65. data/lib/datadog/appsec/contrib/devise/ext.rb +22 -0
  66. data/lib/datadog/appsec/contrib/devise/integration.rb +1 -2
  67. data/lib/datadog/appsec/contrib/devise/patcher.rb +34 -23
  68. data/lib/datadog/appsec/contrib/devise/patches/signin_tracking_patch.rb +103 -0
  69. data/lib/datadog/appsec/contrib/devise/patches/signup_tracking_patch.rb +70 -0
  70. data/lib/datadog/appsec/contrib/devise/{patcher/rememberable_patch.rb → patches/skip_signin_tracking_patch.rb} +2 -2
  71. data/lib/datadog/appsec/contrib/devise/tracking_middleware.rb +106 -0
  72. data/lib/datadog/appsec/contrib/excon/integration.rb +1 -1
  73. data/lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb +11 -12
  74. data/lib/datadog/appsec/contrib/faraday/integration.rb +1 -1
  75. data/lib/datadog/appsec/contrib/faraday/ssrf_detection_middleware.rb +10 -10
  76. data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +10 -9
  77. data/lib/datadog/appsec/contrib/graphql/integration.rb +1 -1
  78. data/lib/datadog/appsec/contrib/rack/ext.rb +34 -0
  79. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +53 -31
  80. data/lib/datadog/appsec/contrib/rack/integration.rb +1 -1
  81. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +52 -44
  82. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +35 -11
  83. data/lib/datadog/appsec/contrib/rails/integration.rb +1 -1
  84. data/lib/datadog/appsec/contrib/rails/patcher.rb +65 -47
  85. data/lib/datadog/appsec/contrib/rails/patches/process_action_patch.rb +27 -0
  86. data/lib/datadog/appsec/contrib/rails/patches/render_to_body_patch.rb +33 -0
  87. data/lib/datadog/appsec/contrib/rest_client/integration.rb +1 -1
  88. data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +12 -12
  89. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +45 -22
  90. data/lib/datadog/appsec/contrib/sinatra/integration.rb +1 -1
  91. data/lib/datadog/appsec/contrib/sinatra/patcher.rb +8 -18
  92. data/lib/datadog/appsec/contrib/sinatra/patches/json_patch.rb +31 -0
  93. data/lib/datadog/appsec/event.rb +91 -147
  94. data/lib/datadog/appsec/ext.rb +4 -2
  95. data/lib/datadog/appsec/instrumentation/gateway/argument.rb +23 -2
  96. data/lib/datadog/appsec/instrumentation/gateway/middleware.rb +24 -0
  97. data/lib/datadog/appsec/instrumentation/gateway.rb +17 -22
  98. data/lib/datadog/appsec/metrics/collector.rb +23 -3
  99. data/lib/datadog/appsec/metrics/telemetry.rb +2 -2
  100. data/lib/datadog/appsec/metrics/telemetry_exporter.rb +29 -0
  101. data/lib/datadog/appsec/metrics.rb +1 -0
  102. data/lib/datadog/appsec/monitor/gateway/watcher.rb +49 -14
  103. data/lib/datadog/appsec/processor/rule_loader.rb +30 -33
  104. data/lib/datadog/appsec/remote.rb +43 -59
  105. data/lib/datadog/appsec/response.rb +6 -6
  106. data/lib/datadog/appsec/security_engine/engine.rb +176 -0
  107. data/lib/datadog/appsec/security_engine/result.rb +44 -9
  108. data/lib/datadog/appsec/security_engine/runner.rb +44 -21
  109. data/lib/datadog/appsec/security_event.rb +37 -0
  110. data/lib/datadog/appsec/thread_safe_ref.rb +61 -0
  111. data/lib/datadog/appsec/trace_keeper.rb +24 -0
  112. data/lib/datadog/appsec/utils/hash_coercion.rb +23 -0
  113. data/lib/datadog/appsec/utils.rb +0 -2
  114. data/lib/datadog/appsec.rb +5 -15
  115. data/lib/datadog/auto_instrument_base.rb +2 -1
  116. data/lib/datadog/core/buffer/random.rb +18 -2
  117. data/lib/datadog/core/configuration/agent_settings.rb +52 -0
  118. data/lib/datadog/core/configuration/agent_settings_resolver.rb +8 -50
  119. data/lib/datadog/core/configuration/agentless_settings_resolver.rb +176 -0
  120. data/lib/datadog/core/configuration/components.rb +69 -37
  121. data/lib/datadog/core/configuration/components_state.rb +23 -0
  122. data/lib/datadog/core/configuration/config_helper.rb +100 -0
  123. data/lib/datadog/core/configuration/deprecations.rb +36 -0
  124. data/lib/datadog/core/configuration/ext.rb +4 -1
  125. data/lib/datadog/core/configuration/option.rb +117 -77
  126. data/lib/datadog/core/configuration/option_definition.rb +5 -14
  127. data/lib/datadog/core/configuration/options.rb +15 -13
  128. data/lib/datadog/core/configuration/settings.rb +117 -48
  129. data/lib/datadog/core/configuration/stable_config.rb +32 -0
  130. data/lib/datadog/core/configuration/supported_configurations.rb +337 -0
  131. data/lib/datadog/core/configuration.rb +40 -16
  132. data/lib/datadog/core/crashtracking/component.rb +3 -10
  133. data/lib/datadog/core/crashtracking/tag_builder.rb +4 -22
  134. data/lib/datadog/core/ddsketch.rb +21 -0
  135. data/lib/datadog/core/deprecations.rb +2 -2
  136. data/lib/datadog/core/diagnostics/environment_logger.rb +1 -1
  137. data/lib/datadog/core/encoding.rb +1 -1
  138. data/lib/datadog/core/environment/agent_info.rb +4 -3
  139. data/lib/datadog/core/environment/cgroup.rb +10 -12
  140. data/lib/datadog/core/environment/container.rb +38 -40
  141. data/lib/datadog/core/environment/ext.rb +6 -8
  142. data/lib/datadog/core/environment/git.rb +3 -2
  143. data/lib/datadog/core/environment/identity.rb +3 -3
  144. data/lib/datadog/core/environment/platform.rb +3 -3
  145. data/lib/datadog/core/environment/variable_helpers.rb +4 -4
  146. data/lib/datadog/core/environment/yjit.rb +2 -1
  147. data/lib/datadog/core/error.rb +11 -9
  148. data/lib/datadog/core/logger.rb +2 -2
  149. data/lib/datadog/core/metrics/client.rb +29 -29
  150. data/lib/datadog/core/metrics/logging.rb +5 -5
  151. data/lib/datadog/core/pin.rb +4 -8
  152. data/lib/datadog/core/process_discovery/tracer_memfd.rb +13 -0
  153. data/lib/datadog/core/process_discovery.rb +61 -0
  154. data/lib/datadog/core/rate_limiter.rb +4 -2
  155. data/lib/datadog/core/remote/client.rb +44 -35
  156. data/lib/datadog/core/remote/component.rb +12 -17
  157. data/lib/datadog/core/remote/configuration/digest.rb +7 -7
  158. data/lib/datadog/core/remote/configuration/path.rb +1 -1
  159. data/lib/datadog/core/remote/configuration/repository.rb +14 -1
  160. data/lib/datadog/core/remote/negotiation.rb +9 -9
  161. data/lib/datadog/core/remote/transport/config.rb +4 -3
  162. data/lib/datadog/core/remote/transport/http/client.rb +5 -4
  163. data/lib/datadog/core/remote/transport/http/config.rb +27 -37
  164. data/lib/datadog/core/remote/transport/http/negotiation.rb +7 -33
  165. data/lib/datadog/core/remote/transport/http.rb +25 -89
  166. data/lib/datadog/core/remote/transport/negotiation.rb +4 -3
  167. data/lib/datadog/core/runtime/ext.rb +0 -1
  168. data/lib/datadog/core/runtime/metrics.rb +12 -5
  169. data/lib/datadog/core/tag_builder.rb +56 -0
  170. data/lib/datadog/core/telemetry/component.rb +92 -52
  171. data/lib/datadog/core/telemetry/emitter.rb +23 -11
  172. data/lib/datadog/core/telemetry/event/app_client_configuration_change.rb +66 -0
  173. data/lib/datadog/core/telemetry/event/app_closing.rb +18 -0
  174. data/lib/datadog/core/telemetry/event/app_dependencies_loaded.rb +33 -0
  175. data/lib/datadog/core/telemetry/event/app_endpoints_loaded.rb +30 -0
  176. data/lib/datadog/core/telemetry/event/app_heartbeat.rb +18 -0
  177. data/lib/datadog/core/telemetry/event/app_integrations_change.rb +58 -0
  178. data/lib/datadog/core/telemetry/event/app_started.rb +287 -0
  179. data/lib/datadog/core/telemetry/event/base.rb +40 -0
  180. data/lib/datadog/core/telemetry/event/distributions.rb +18 -0
  181. data/lib/datadog/core/telemetry/event/generate_metrics.rb +43 -0
  182. data/lib/datadog/core/telemetry/event/log.rb +76 -0
  183. data/lib/datadog/core/telemetry/event/message_batch.rb +42 -0
  184. data/lib/datadog/core/telemetry/event/synth_app_client_configuration_change.rb +43 -0
  185. data/lib/datadog/core/telemetry/event.rb +18 -472
  186. data/lib/datadog/core/telemetry/http/adapters/net.rb +12 -97
  187. data/lib/datadog/core/telemetry/logger.rb +5 -4
  188. data/lib/datadog/core/telemetry/logging.rb +11 -5
  189. data/lib/datadog/core/telemetry/metric.rb +8 -8
  190. data/lib/datadog/core/telemetry/request.rb +4 -4
  191. data/lib/datadog/core/telemetry/transport/http/api.rb +43 -0
  192. data/lib/datadog/core/telemetry/transport/http/client.rb +49 -0
  193. data/lib/datadog/core/telemetry/transport/http/telemetry.rb +92 -0
  194. data/lib/datadog/core/telemetry/transport/http.rb +63 -0
  195. data/lib/datadog/core/telemetry/transport/telemetry.rb +51 -0
  196. data/lib/datadog/core/telemetry/worker.rb +90 -24
  197. data/lib/datadog/core/transport/http/adapters/net.rb +17 -2
  198. data/lib/datadog/core/transport/http/adapters/test.rb +2 -1
  199. data/lib/datadog/core/transport/http/api/instance.rb +17 -0
  200. data/lib/datadog/core/transport/http/api/spec.rb +17 -0
  201. data/lib/datadog/core/transport/http/builder.rb +19 -17
  202. data/lib/datadog/core/transport/http/env.rb +8 -0
  203. data/lib/datadog/core/transport/http.rb +75 -0
  204. data/lib/datadog/core/transport/response.rb +4 -1
  205. data/lib/datadog/core/utils/at_fork_monkey_patch.rb +6 -6
  206. data/lib/datadog/core/utils/duration.rb +32 -32
  207. data/lib/datadog/core/utils/forking.rb +2 -2
  208. data/lib/datadog/core/utils/network.rb +25 -6
  209. data/lib/datadog/core/utils/only_once_successful.rb +16 -5
  210. data/lib/datadog/core/utils/time.rb +20 -0
  211. data/lib/datadog/core/utils/truncation.rb +21 -0
  212. data/lib/datadog/core/utils.rb +7 -0
  213. data/lib/datadog/core/vendor/multipart-post/multipart/post/composite_read_io.rb +1 -1
  214. data/lib/datadog/core/vendor/multipart-post/multipart/post/multipartable.rb +8 -8
  215. data/lib/datadog/core/vendor/multipart-post/multipart/post/parts.rb +7 -7
  216. data/lib/datadog/core/worker.rb +1 -1
  217. data/lib/datadog/core/workers/async.rb +29 -12
  218. data/lib/datadog/core/workers/interval_loop.rb +12 -1
  219. data/lib/datadog/core/workers/runtime_metrics.rb +2 -2
  220. data/lib/datadog/core.rb +10 -0
  221. data/lib/datadog/di/boot.rb +43 -0
  222. data/lib/datadog/di/component.rb +21 -2
  223. data/lib/datadog/di/context.rb +70 -0
  224. data/lib/datadog/di/el/compiler.rb +164 -0
  225. data/lib/datadog/di/el/evaluator.rb +159 -0
  226. data/lib/datadog/di/el/expression.rb +42 -0
  227. data/lib/datadog/di/el.rb +5 -0
  228. data/lib/datadog/di/error.rb +25 -0
  229. data/lib/datadog/di/instrumenter.rb +132 -20
  230. data/lib/datadog/di/probe.rb +35 -15
  231. data/lib/datadog/di/probe_builder.rb +39 -1
  232. data/lib/datadog/di/probe_file_loader/railtie.rb +15 -0
  233. data/lib/datadog/di/probe_file_loader.rb +82 -0
  234. data/lib/datadog/di/probe_manager.rb +3 -2
  235. data/lib/datadog/di/probe_notification_builder.rb +61 -67
  236. data/lib/datadog/di/probe_notifier_worker.rb +25 -17
  237. data/lib/datadog/di/remote.rb +5 -5
  238. data/lib/datadog/di/serializer.rb +160 -8
  239. data/lib/datadog/di/transport/diagnostics.rb +4 -3
  240. data/lib/datadog/di/transport/http/api.rb +2 -12
  241. data/lib/datadog/di/transport/http/client.rb +4 -3
  242. data/lib/datadog/di/transport/http/diagnostics.rb +7 -34
  243. data/lib/datadog/di/transport/http/input.rb +18 -35
  244. data/lib/datadog/di/transport/http.rb +15 -77
  245. data/lib/datadog/di/transport/input.rb +14 -5
  246. data/lib/datadog/di/utils.rb +5 -0
  247. data/lib/datadog/di.rb +0 -34
  248. data/lib/datadog/error_tracking/collector.rb +87 -0
  249. data/lib/datadog/error_tracking/component.rb +167 -0
  250. data/lib/datadog/error_tracking/configuration/settings.rb +63 -0
  251. data/lib/datadog/error_tracking/configuration.rb +11 -0
  252. data/lib/datadog/error_tracking/ext.rb +18 -0
  253. data/lib/datadog/error_tracking/extensions.rb +16 -0
  254. data/lib/datadog/error_tracking/filters.rb +77 -0
  255. data/lib/datadog/error_tracking.rb +18 -0
  256. data/lib/datadog/kit/appsec/events/v2.rb +196 -0
  257. data/lib/datadog/kit/appsec/events.rb +17 -4
  258. data/lib/datadog/kit/identity.rb +22 -12
  259. data/lib/datadog/opentelemetry/api/baggage.rb +90 -0
  260. data/lib/datadog/opentelemetry/api/baggage.rbs +26 -0
  261. data/lib/datadog/opentelemetry/api/context.rb +21 -6
  262. data/lib/datadog/opentelemetry/sdk/configurator.rb +1 -1
  263. data/lib/datadog/opentelemetry/sdk/propagator.rb +4 -4
  264. data/lib/datadog/opentelemetry/sdk/span_processor.rb +8 -8
  265. data/lib/datadog/opentelemetry/sdk/trace/span.rb +15 -11
  266. data/lib/datadog/opentelemetry/trace.rb +4 -4
  267. data/lib/datadog/opentelemetry.rb +2 -1
  268. data/lib/datadog/profiling/collectors/code_provenance.rb +18 -9
  269. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +6 -0
  270. data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +1 -0
  271. data/lib/datadog/profiling/collectors/info.rb +44 -0
  272. data/lib/datadog/profiling/collectors/thread_context.rb +17 -2
  273. data/lib/datadog/profiling/component.rb +8 -9
  274. data/lib/datadog/profiling/encoded_profile.rb +11 -0
  275. data/lib/datadog/profiling/exporter.rb +12 -7
  276. data/lib/datadog/profiling/ext.rb +2 -15
  277. data/lib/datadog/profiling/flush.rb +5 -8
  278. data/lib/datadog/profiling/http_transport.rb +8 -62
  279. data/lib/datadog/profiling/profiler.rb +2 -0
  280. data/lib/datadog/profiling/scheduler.rb +10 -2
  281. data/lib/datadog/profiling/sequence_tracker.rb +44 -0
  282. data/lib/datadog/profiling/stack_recorder.rb +9 -9
  283. data/lib/datadog/profiling/tag_builder.rb +7 -41
  284. data/lib/datadog/profiling/tasks/exec.rb +2 -2
  285. data/lib/datadog/profiling/tasks/setup.rb +2 -0
  286. data/lib/datadog/profiling.rb +13 -10
  287. data/lib/datadog/single_step_instrument.rb +9 -0
  288. data/lib/datadog/tracing/analytics.rb +1 -1
  289. data/lib/datadog/tracing/buffer.rb +7 -7
  290. data/lib/datadog/tracing/component.rb +21 -29
  291. data/lib/datadog/tracing/configuration/dynamic.rb +6 -8
  292. data/lib/datadog/tracing/configuration/ext.rb +8 -4
  293. data/lib/datadog/tracing/configuration/settings.rb +50 -12
  294. data/lib/datadog/tracing/context.rb +2 -2
  295. data/lib/datadog/tracing/context_provider.rb +1 -1
  296. data/lib/datadog/tracing/contrib/action_cable/event.rb +1 -1
  297. data/lib/datadog/tracing/contrib/action_cable/integration.rb +1 -1
  298. data/lib/datadog/tracing/contrib/action_mailer/integration.rb +1 -1
  299. data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +19 -4
  300. data/lib/datadog/tracing/contrib/action_pack/action_dispatch/instrumentation.rb +19 -12
  301. data/lib/datadog/tracing/contrib/action_pack/ext.rb +2 -0
  302. data/lib/datadog/tracing/contrib/action_pack/integration.rb +1 -1
  303. data/lib/datadog/tracing/contrib/action_view/events/render_template.rb +1 -1
  304. data/lib/datadog/tracing/contrib/active_job/event.rb +8 -8
  305. data/lib/datadog/tracing/contrib/active_job/events/discard.rb +1 -1
  306. data/lib/datadog/tracing/contrib/active_job/events/enqueue.rb +1 -1
  307. data/lib/datadog/tracing/contrib/active_job/events/enqueue_at.rb +1 -1
  308. data/lib/datadog/tracing/contrib/active_job/events/enqueue_retry.rb +1 -1
  309. data/lib/datadog/tracing/contrib/active_job/events/perform.rb +1 -1
  310. data/lib/datadog/tracing/contrib/active_job/events/retry_stopped.rb +1 -1
  311. data/lib/datadog/tracing/contrib/active_job/integration.rb +1 -1
  312. data/lib/datadog/tracing/contrib/active_model_serializers/events/render.rb +1 -1
  313. data/lib/datadog/tracing/contrib/active_model_serializers/events/serialize.rb +3 -3
  314. data/lib/datadog/tracing/contrib/active_model_serializers/integration.rb +1 -2
  315. data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +1 -1
  316. data/lib/datadog/tracing/contrib/active_record/events/instantiation.rb +1 -1
  317. data/lib/datadog/tracing/contrib/active_record/events/sql.rb +5 -5
  318. data/lib/datadog/tracing/contrib/active_record/integration.rb +2 -2
  319. data/lib/datadog/tracing/contrib/active_record/utils.rb +15 -15
  320. data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +17 -8
  321. data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +33 -0
  322. data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +4 -0
  323. data/lib/datadog/tracing/contrib/active_support/cache/redis.rb +2 -4
  324. data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +13 -0
  325. data/lib/datadog/tracing/contrib/active_support/integration.rb +1 -1
  326. data/lib/datadog/tracing/contrib/active_support/notifications/event.rb +2 -1
  327. data/lib/datadog/tracing/contrib/active_support/notifications/subscription.rb +7 -9
  328. data/lib/datadog/tracing/contrib/aws/ext.rb +1 -1
  329. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +12 -2
  330. data/lib/datadog/tracing/contrib/aws/parsed_context.rb +8 -2
  331. data/lib/datadog/tracing/contrib/aws/patcher.rb +5 -1
  332. data/lib/datadog/tracing/contrib/aws/service/base.rb +2 -1
  333. data/lib/datadog/tracing/contrib/aws/service/dynamodb.rb +1 -1
  334. data/lib/datadog/tracing/contrib/aws/service/eventbridge.rb +1 -1
  335. data/lib/datadog/tracing/contrib/aws/service/kinesis.rb +1 -1
  336. data/lib/datadog/tracing/contrib/aws/service/s3.rb +1 -1
  337. data/lib/datadog/tracing/contrib/aws/service/sns.rb +1 -1
  338. data/lib/datadog/tracing/contrib/aws/service/sqs.rb +1 -1
  339. data/lib/datadog/tracing/contrib/aws/service/states.rb +1 -1
  340. data/lib/datadog/tracing/contrib/aws/services.rb +7 -7
  341. data/lib/datadog/tracing/contrib/component.rb +2 -2
  342. data/lib/datadog/tracing/contrib/concurrent_ruby/async_patch.rb +1 -1
  343. data/lib/datadog/tracing/contrib/concurrent_ruby/context_composite_executor_service.rb +1 -1
  344. data/lib/datadog/tracing/contrib/concurrent_ruby/future_patch.rb +1 -1
  345. data/lib/datadog/tracing/contrib/concurrent_ruby/integration.rb +1 -1
  346. data/lib/datadog/tracing/contrib/concurrent_ruby/promises_future_patch.rb +1 -1
  347. data/lib/datadog/tracing/contrib/configurable.rb +6 -6
  348. data/lib/datadog/tracing/contrib/configuration/resolvers/pattern_resolver.rb +4 -4
  349. data/lib/datadog/tracing/contrib/configuration/settings.rb +1 -1
  350. data/lib/datadog/tracing/contrib/dalli/ext.rb +3 -2
  351. data/lib/datadog/tracing/contrib/dalli/integration.rb +1 -1
  352. data/lib/datadog/tracing/contrib/delayed_job/integration.rb +1 -1
  353. data/lib/datadog/tracing/contrib/elasticsearch/ext.rb +3 -2
  354. data/lib/datadog/tracing/contrib/elasticsearch/integration.rb +4 -4
  355. data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +51 -53
  356. data/lib/datadog/tracing/contrib/elasticsearch/quantize.rb +5 -5
  357. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +6 -7
  358. data/lib/datadog/tracing/contrib/ethon/ext.rb +3 -2
  359. data/lib/datadog/tracing/contrib/ethon/integration.rb +1 -1
  360. data/lib/datadog/tracing/contrib/excon/ext.rb +3 -2
  361. data/lib/datadog/tracing/contrib/excon/integration.rb +1 -1
  362. data/lib/datadog/tracing/contrib/excon/middleware.rb +7 -5
  363. data/lib/datadog/tracing/contrib/ext.rb +4 -3
  364. data/lib/datadog/tracing/contrib/extensions.rb +9 -9
  365. data/lib/datadog/tracing/contrib/faraday/ext.rb +3 -2
  366. data/lib/datadog/tracing/contrib/faraday/integration.rb +1 -1
  367. data/lib/datadog/tracing/contrib/faraday/middleware.rb +9 -5
  368. data/lib/datadog/tracing/contrib/grape/endpoint.rb +8 -8
  369. data/lib/datadog/tracing/contrib/grape/integration.rb +1 -1
  370. data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +7 -0
  371. data/lib/datadog/tracing/contrib/graphql/ext.rb +1 -0
  372. data/lib/datadog/tracing/contrib/graphql/integration.rb +1 -1
  373. data/lib/datadog/tracing/contrib/graphql/patcher.rb +2 -2
  374. data/lib/datadog/tracing/contrib/graphql/unified_trace.rb +84 -48
  375. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +15 -9
  376. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +3 -3
  377. data/lib/datadog/tracing/contrib/grpc/distributed/fetcher.rb +1 -1
  378. data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +3 -0
  379. data/lib/datadog/tracing/contrib/grpc/integration.rb +1 -1
  380. data/lib/datadog/tracing/contrib/hanami/ext.rb +2 -2
  381. data/lib/datadog/tracing/contrib/hanami/integration.rb +1 -1
  382. data/lib/datadog/tracing/contrib/hanami/renderer_policy_tracing.rb +1 -1
  383. data/lib/datadog/tracing/contrib/hanami/router_tracing.rb +9 -11
  384. data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +0 -15
  385. data/lib/datadog/tracing/contrib/http/distributed/fetcher.rb +4 -4
  386. data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +4 -1
  387. data/lib/datadog/tracing/contrib/http/ext.rb +3 -2
  388. data/lib/datadog/tracing/contrib/http/instrumentation.rb +11 -15
  389. data/lib/datadog/tracing/contrib/httpclient/ext.rb +3 -2
  390. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +9 -19
  391. data/lib/datadog/tracing/contrib/httpclient/integration.rb +1 -1
  392. data/lib/datadog/tracing/contrib/httprb/ext.rb +3 -2
  393. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +11 -19
  394. data/lib/datadog/tracing/contrib/httprb/integration.rb +1 -1
  395. data/lib/datadog/tracing/contrib/kafka/event.rb +1 -1
  396. data/lib/datadog/tracing/contrib/kafka/events/connection/request.rb +1 -1
  397. data/lib/datadog/tracing/contrib/kafka/events/consumer/process_batch.rb +1 -1
  398. data/lib/datadog/tracing/contrib/kafka/events/consumer/process_message.rb +1 -1
  399. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/heartbeat.rb +1 -1
  400. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/join_group.rb +1 -1
  401. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/leave_group.rb +1 -1
  402. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/sync_group.rb +1 -1
  403. data/lib/datadog/tracing/contrib/kafka/events/produce_operation/send_messages.rb +1 -1
  404. data/lib/datadog/tracing/contrib/kafka/events/producer/deliver_messages.rb +1 -1
  405. data/lib/datadog/tracing/contrib/kafka/integration.rb +1 -1
  406. data/lib/datadog/tracing/contrib/karafka/configuration/settings.rb +27 -0
  407. data/lib/datadog/tracing/contrib/karafka/distributed/propagation.rb +48 -0
  408. data/lib/datadog/tracing/contrib/karafka/ext.rb +27 -0
  409. data/lib/datadog/tracing/contrib/karafka/integration.rb +45 -0
  410. data/lib/datadog/tracing/contrib/karafka/monitor.rb +66 -0
  411. data/lib/datadog/tracing/contrib/karafka/patcher.rb +71 -0
  412. data/lib/datadog/tracing/contrib/karafka.rb +37 -0
  413. data/lib/datadog/tracing/contrib/lograge/instrumentation.rb +1 -1
  414. data/lib/datadog/tracing/contrib/lograge/integration.rb +1 -1
  415. data/lib/datadog/tracing/contrib/lograge/patcher.rb +4 -2
  416. data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +9 -1
  417. data/lib/datadog/tracing/contrib/mongodb/ext.rb +2 -1
  418. data/lib/datadog/tracing/contrib/mongodb/integration.rb +1 -1
  419. data/lib/datadog/tracing/contrib/mongodb/parsers.rb +1 -1
  420. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +23 -6
  421. data/lib/datadog/tracing/contrib/mysql2/ext.rb +1 -1
  422. data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +16 -6
  423. data/lib/datadog/tracing/contrib/mysql2/integration.rb +1 -1
  424. data/lib/datadog/tracing/contrib/opensearch/configuration/settings.rb +17 -0
  425. data/lib/datadog/tracing/contrib/opensearch/ext.rb +12 -2
  426. data/lib/datadog/tracing/contrib/opensearch/integration.rb +1 -2
  427. data/lib/datadog/tracing/contrib/opensearch/patcher.rb +68 -66
  428. data/lib/datadog/tracing/contrib/opensearch/quantize.rb +5 -5
  429. data/lib/datadog/tracing/contrib/patcher.rb +12 -11
  430. data/lib/datadog/tracing/contrib/pg/integration.rb +1 -1
  431. data/lib/datadog/tracing/contrib/presto/ext.rb +1 -1
  432. data/lib/datadog/tracing/contrib/presto/instrumentation.rb +3 -3
  433. data/lib/datadog/tracing/contrib/presto/integration.rb +1 -1
  434. data/lib/datadog/tracing/contrib/propagation/sql_comment/comment.rb +1 -1
  435. data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +1 -1
  436. data/lib/datadog/tracing/contrib/que/integration.rb +1 -1
  437. data/lib/datadog/tracing/contrib/racecar/event.rb +1 -1
  438. data/lib/datadog/tracing/contrib/racecar/events/batch.rb +2 -2
  439. data/lib/datadog/tracing/contrib/racecar/events/consume.rb +1 -1
  440. data/lib/datadog/tracing/contrib/racecar/events/message.rb +2 -2
  441. data/lib/datadog/tracing/contrib/racecar/integration.rb +1 -1
  442. data/lib/datadog/tracing/contrib/rack/header_collection.rb +1 -1
  443. data/lib/datadog/tracing/contrib/rack/header_tagging.rb +32 -32
  444. data/lib/datadog/tracing/contrib/rack/integration.rb +1 -1
  445. data/lib/datadog/tracing/contrib/rack/middlewares.rb +21 -17
  446. data/lib/datadog/tracing/contrib/rack/patcher.rb +1 -1
  447. data/lib/datadog/tracing/contrib/rack/request_queue.rb +4 -3
  448. data/lib/datadog/tracing/contrib/rack/trace_proxy_middleware.rb +7 -1
  449. data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +1 -1
  450. data/lib/datadog/tracing/contrib/rails/ext.rb +2 -1
  451. data/lib/datadog/tracing/contrib/rails/integration.rb +2 -2
  452. data/lib/datadog/tracing/contrib/rails/log_injection.rb +1 -1
  453. data/lib/datadog/tracing/contrib/rails/middlewares.rb +1 -1
  454. data/lib/datadog/tracing/contrib/rails/patcher.rb +4 -1
  455. data/lib/datadog/tracing/contrib/rails/runner.rb +62 -40
  456. data/lib/datadog/tracing/contrib/rake/instrumentation.rb +4 -4
  457. data/lib/datadog/tracing/contrib/rake/integration.rb +1 -1
  458. data/lib/datadog/tracing/contrib/redis/configuration/resolver.rb +2 -2
  459. data/lib/datadog/tracing/contrib/redis/ext.rb +3 -2
  460. data/lib/datadog/tracing/contrib/redis/integration.rb +2 -2
  461. data/lib/datadog/tracing/contrib/redis/patcher.rb +4 -4
  462. data/lib/datadog/tracing/contrib/redis/quantize.rb +1 -1
  463. data/lib/datadog/tracing/contrib/redis/tags.rb +1 -1
  464. data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +4 -4
  465. data/lib/datadog/tracing/contrib/registry.rb +1 -1
  466. data/lib/datadog/tracing/contrib/resque/integration.rb +1 -1
  467. data/lib/datadog/tracing/contrib/resque/resque_job.rb +1 -1
  468. data/lib/datadog/tracing/contrib/rest_client/ext.rb +3 -2
  469. data/lib/datadog/tracing/contrib/rest_client/integration.rb +1 -1
  470. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +8 -6
  471. data/lib/datadog/tracing/contrib/roda/instrumentation.rb +1 -1
  472. data/lib/datadog/tracing/contrib/roda/integration.rb +1 -1
  473. data/lib/datadog/tracing/contrib/semantic_logger/instrumentation.rb +1 -1
  474. data/lib/datadog/tracing/contrib/semantic_logger/integration.rb +1 -1
  475. data/lib/datadog/tracing/contrib/sequel/database.rb +5 -5
  476. data/lib/datadog/tracing/contrib/sequel/dataset.rb +1 -1
  477. data/lib/datadog/tracing/contrib/sequel/integration.rb +1 -1
  478. data/lib/datadog/tracing/contrib/sequel/utils.rb +1 -1
  479. data/lib/datadog/tracing/contrib/shoryuken/integration.rb +1 -1
  480. data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +6 -1
  481. data/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb +3 -0
  482. data/lib/datadog/tracing/contrib/sidekiq/ext.rb +1 -0
  483. data/lib/datadog/tracing/contrib/sidekiq/integration.rb +1 -1
  484. data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +5 -2
  485. data/lib/datadog/tracing/contrib/sidekiq/utils.rb +1 -1
  486. data/lib/datadog/tracing/contrib/sinatra/integration.rb +1 -1
  487. data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +38 -40
  488. data/lib/datadog/tracing/contrib/sneakers/integration.rb +1 -1
  489. data/lib/datadog/tracing/contrib/span_attribute_schema.rb +1 -1
  490. data/lib/datadog/tracing/contrib/stripe/integration.rb +1 -1
  491. data/lib/datadog/tracing/contrib/stripe/request.rb +1 -1
  492. data/lib/datadog/tracing/contrib/sucker_punch/integration.rb +1 -1
  493. data/lib/datadog/tracing/contrib/support.rb +28 -0
  494. data/lib/datadog/tracing/contrib/trilogy/ext.rb +1 -1
  495. data/lib/datadog/tracing/contrib/trilogy/integration.rb +1 -1
  496. data/lib/datadog/tracing/contrib/utils/quantization/hash.rb +11 -11
  497. data/lib/datadog/tracing/contrib/utils/quantization/http.rb +6 -6
  498. data/lib/datadog/tracing/contrib.rb +1 -0
  499. data/lib/datadog/tracing/correlation.rb +9 -2
  500. data/lib/datadog/tracing/diagnostics/environment_logger.rb +8 -2
  501. data/lib/datadog/tracing/distributed/b3_multi.rb +1 -1
  502. data/lib/datadog/tracing/distributed/b3_single.rb +2 -2
  503. data/lib/datadog/tracing/distributed/baggage.rb +196 -0
  504. data/lib/datadog/tracing/distributed/datadog.rb +8 -7
  505. data/lib/datadog/tracing/distributed/datadog_tags_codec.rb +11 -13
  506. data/lib/datadog/tracing/distributed/helpers.rb +1 -1
  507. data/lib/datadog/tracing/distributed/none.rb +4 -2
  508. data/lib/datadog/tracing/distributed/propagation.rb +28 -4
  509. data/lib/datadog/tracing/distributed/propagation_policy.rb +42 -0
  510. data/lib/datadog/tracing/distributed/trace_context.rb +22 -16
  511. data/lib/datadog/tracing/event.rb +5 -7
  512. data/lib/datadog/tracing/flush.rb +1 -1
  513. data/lib/datadog/tracing/metadata/analytics.rb +1 -1
  514. data/lib/datadog/tracing/metadata/errors.rb +4 -4
  515. data/lib/datadog/tracing/metadata/ext.rb +13 -0
  516. data/lib/datadog/tracing/metadata/metastruct.rb +36 -0
  517. data/lib/datadog/tracing/metadata/metastruct_tagging.rb +42 -0
  518. data/lib/datadog/tracing/metadata/tagging.rb +4 -4
  519. data/lib/datadog/tracing/metadata.rb +2 -0
  520. data/lib/datadog/tracing/pipeline/span_filter.rb +3 -1
  521. data/lib/datadog/tracing/pipeline/span_processor.rb +3 -1
  522. data/lib/datadog/tracing/pipeline.rb +1 -1
  523. data/lib/datadog/tracing/sampling/ext.rb +0 -2
  524. data/lib/datadog/tracing/sampling/rate_sampler.rb +2 -1
  525. data/lib/datadog/tracing/sampling/rule_sampler.rb +30 -30
  526. data/lib/datadog/tracing/sampling/span/rule.rb +0 -1
  527. data/lib/datadog/tracing/sampling/span/rule_parser.rb +1 -1
  528. data/lib/datadog/tracing/sampling/span/sampler.rb +0 -7
  529. data/lib/datadog/tracing/span.rb +11 -2
  530. data/lib/datadog/tracing/span_event.rb +11 -11
  531. data/lib/datadog/tracing/span_link.rb +12 -12
  532. data/lib/datadog/tracing/span_operation.rb +76 -26
  533. data/lib/datadog/tracing/sync_writer.rb +5 -4
  534. data/lib/datadog/tracing/trace_digest.rb +29 -24
  535. data/lib/datadog/tracing/trace_operation.rb +121 -97
  536. data/lib/datadog/tracing/trace_segment.rb +8 -6
  537. data/lib/datadog/tracing/tracer.rb +90 -43
  538. data/lib/datadog/tracing/transport/http/api.rb +2 -10
  539. data/lib/datadog/tracing/transport/http/client.rb +6 -5
  540. data/lib/datadog/tracing/transport/http/traces.rb +15 -43
  541. data/lib/datadog/tracing/transport/http.rb +13 -75
  542. data/lib/datadog/tracing/transport/io/client.rb +5 -5
  543. data/lib/datadog/tracing/transport/io/traces.rb +4 -4
  544. data/lib/datadog/tracing/transport/serializable_trace.rb +3 -1
  545. data/lib/datadog/tracing/transport/statistics.rb +1 -1
  546. data/lib/datadog/tracing/transport/trace_formatter.rb +7 -0
  547. data/lib/datadog/tracing/transport/traces.rb +31 -14
  548. data/lib/datadog/tracing/utils.rb +1 -1
  549. data/lib/datadog/tracing/workers/trace_writer.rb +16 -16
  550. data/lib/datadog/tracing/workers.rb +2 -2
  551. data/lib/datadog/tracing/writer.rb +4 -4
  552. data/lib/datadog/tracing.rb +16 -3
  553. data/lib/datadog/version.rb +1 -1
  554. data/lib/datadog.rb +8 -2
  555. metadata +115 -24
  556. data/ext/libdatadog_api/macos_development.md +0 -26
  557. data/lib/datadog/appsec/assets/waf_rules/processors.json +0 -92
  558. data/lib/datadog/appsec/assets/waf_rules/scanners.json +0 -114
  559. data/lib/datadog/appsec/contrib/devise/event.rb +0 -54
  560. data/lib/datadog/appsec/contrib/devise/patcher/authenticatable_patch.rb +0 -72
  561. data/lib/datadog/appsec/contrib/devise/patcher/registration_controller_patch.rb +0 -47
  562. data/lib/datadog/appsec/contrib/devise/resource.rb +0 -35
  563. data/lib/datadog/appsec/contrib/devise/tracking.rb +0 -57
  564. data/lib/datadog/appsec/processor/rule_merger.rb +0 -170
  565. data/lib/datadog/appsec/processor.rb +0 -107
  566. data/lib/datadog/appsec/utils/trace_operation.rb +0 -15
  567. data/lib/datadog/core/telemetry/http/env.rb +0 -20
  568. data/lib/datadog/core/telemetry/http/ext.rb +0 -28
  569. data/lib/datadog/core/telemetry/http/response.rb +0 -70
  570. data/lib/datadog/core/telemetry/http/transport.rb +0 -90
@@ -0,0 +1,196 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../metadata/ext'
4
+ require_relative '../trace_digest'
5
+ require_relative 'datadog_tags_codec'
6
+ require_relative '../utils'
7
+ require_relative 'helpers'
8
+ require 'uri'
9
+
10
+ module Datadog
11
+ module Tracing
12
+ module Distributed
13
+ # W3C Baggage propagator implementation.
14
+ # The baggage header is propagated through `baggage`.
15
+ # @see https://www.w3.org/TR/baggage/
16
+ class Baggage
17
+ BAGGAGE_KEY = 'baggage'
18
+ DD_TRACE_BAGGAGE_MAX_ITEMS = 64
19
+ DD_TRACE_BAGGAGE_MAX_BYTES = 8192
20
+ BAGGAGE_TAG_KEYS_MATCH_ALL = ['*'].freeze
21
+ SAFE_CHARACTERS_KEY = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789$!#&'*+-.^_`|~"
22
+ SAFE_CHARACTERS_VALUE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789$!#&'()*+-./:<>?@[]^_`{|}~"
23
+
24
+ def initialize(
25
+ fetcher:,
26
+ baggage_key: BAGGAGE_KEY,
27
+ baggage_tag_keys: ::Datadog.configuration.tracing.baggage_tag_keys
28
+ )
29
+ @baggage_key = baggage_key
30
+ @fetcher = fetcher
31
+ @baggage_tag_keys = baggage_tag_keys
32
+ end
33
+
34
+ def inject!(digest, data)
35
+ return if digest.nil? || digest.baggage.nil?
36
+
37
+ baggage_items = digest.baggage.reject { |k, v| k.nil? || v.nil? }
38
+ return if baggage_items.empty?
39
+
40
+ begin
41
+ if baggage_items.size > DD_TRACE_BAGGAGE_MAX_ITEMS
42
+ ::Datadog.logger.warn("Baggage item limit (#{DD_TRACE_BAGGAGE_MAX_ITEMS}) exceeded, dropping excess items")
43
+ # Record telemetry for item count truncation
44
+ record_telemetry_metric(
45
+ 'context_header.truncated',
46
+ 1,
47
+ {'header_style' => 'baggage', 'truncation_reason' => 'baggage_item_count_exceeded'}
48
+ )
49
+ baggage_items = baggage_items.first(DD_TRACE_BAGGAGE_MAX_ITEMS)
50
+ end
51
+
52
+ encoded_items = []
53
+ total_size = 0
54
+
55
+ baggage_items.each do |key, value|
56
+ item = "#{encode_item(key, SAFE_CHARACTERS_KEY)}=#{encode_item(value, SAFE_CHARACTERS_VALUE)}"
57
+ item_size = item.bytesize + (encoded_items.empty? ? 0 : 1) # +1 for comma if not first item
58
+ if total_size + item_size > DD_TRACE_BAGGAGE_MAX_BYTES
59
+ ::Datadog.logger.warn("Baggage header size (#{DD_TRACE_BAGGAGE_MAX_BYTES}) exceeded, dropping excess items")
60
+ # Record telemetry for byte count truncation
61
+ record_telemetry_metric(
62
+ 'context_header.truncated',
63
+ 1,
64
+ {'header_style' => 'baggage', 'truncation_reason' => 'baggage_byte_count_exceeded'}
65
+ )
66
+ break # stop adding items when size limit is reached
67
+ end
68
+ encoded_items << item
69
+ total_size += item_size
70
+ end
71
+
72
+ # edge case where a single item is too large
73
+ return if encoded_items.empty?
74
+
75
+ data[@baggage_key] = encoded_items.join(',')
76
+
77
+ # Record telemetry for successful injection
78
+ record_telemetry_metric('context_header_style.injected', 1, {'header_style' => 'baggage'})
79
+ rescue => e
80
+ ::Datadog.logger.warn("Failed to encode and inject baggage header: #{e.class}: #{e}")
81
+ end
82
+ end
83
+
84
+ def extract(data)
85
+ fetcher = @fetcher.new(data)
86
+ data = fetcher[@baggage_key]
87
+ return unless data
88
+
89
+ baggage = parse_baggage_header(fetcher[@baggage_key])
90
+ return unless baggage
91
+
92
+ # Convert selected baggage items to span tags based on configuration
93
+ baggage_tags = build_baggage_tags(baggage)
94
+
95
+ # Record telemetry for successful extraction only if baggage is not empty
96
+ unless baggage.empty?
97
+ record_telemetry_metric('context_header_style.extracted', 1, {'header_style' => 'baggage'})
98
+ end
99
+
100
+ TraceDigest.new(
101
+ baggage: baggage,
102
+ trace_distributed_tags: baggage_tags
103
+ )
104
+ end
105
+
106
+ private
107
+
108
+ def encode_item(item, safe_characters)
109
+ # Strip whitespace and URL-encode the item
110
+ result = URI.encode_www_form_component(item.strip)
111
+ # Replace '+' with '%20' for space encoding consistency with W3C spec
112
+ result = result.gsub('+', '%20')
113
+ # Selectively decode percent-encoded characters that are considered "safe" in W3C Baggage spec
114
+ result.gsub(/%[0-9A-F]{2}/) do |encoded|
115
+ if encoded.size >= 3 && encoded[1..2] =~ /\A[0-9A-F]{2}\z/
116
+ hex_str = encoded[1..2]
117
+ next encoded unless hex_str && !hex_str.empty?
118
+
119
+ # Convert hex representation back to character
120
+ char = [hex_str.hex].pack('C')
121
+ # Keep the character as-is if it's in the safe character set, otherwise keep it encoded
122
+ safe_characters.include?(char) ? char : encoded
123
+ else
124
+ encoded
125
+ end
126
+ end
127
+ end
128
+
129
+ # Parses a W3C Baggage header string into a hash of key-value pairs
130
+ # The header format follows the W3C Baggage specification:
131
+ # - Multiple baggage items are separated by commas
132
+ # - Each baggage item is a key-value pair separated by '='
133
+ # - Keys and values are URL-encoded
134
+ # - Returns an empty hash if the baggage header is malformed
135
+ #
136
+ # @param baggage_header [String] The W3C Baggage header string to parse
137
+ # @return [Hash<String, String>] A hash of decoded baggage items
138
+ def parse_baggage_header(baggage_header)
139
+ baggage = {}
140
+ baggages = baggage_header.split(',')
141
+ baggages.each do |key_value|
142
+ key, value = key_value.split('=', 2)
143
+ # If baggage is malformed, return an empty hash
144
+ if key.nil? || value.nil?
145
+ # Record telemetry for malformed header
146
+ record_telemetry_metric('context_header_style.malformed', 1, {'header_style' => 'baggage'})
147
+ return {}
148
+ end
149
+
150
+ key = URI.decode_www_form_component(key.strip)
151
+ value = URI.decode_www_form_component(value.strip)
152
+ if key.empty? || value.empty?
153
+ # Record telemetry for malformed header
154
+ record_telemetry_metric('context_header_style.malformed', 1, {'header_style' => 'baggage'})
155
+ return {}
156
+ end
157
+
158
+ baggage[key] = value
159
+ end
160
+ baggage
161
+ end
162
+
163
+ # Convert selected baggage items to span tags
164
+ # Baggage carries important contextual information (like user.id, session.id) across distributed services,
165
+ # but isn't searchable by default.
166
+ def build_baggage_tags(baggage)
167
+ return {} if baggage.empty?
168
+
169
+ # Get the configuration for which baggage keys should become span tags
170
+ baggage_tag_keys = @baggage_tag_keys
171
+ return {} if baggage_tag_keys.empty?
172
+
173
+ # If wildcard is specified, use all baggage keys
174
+ baggage_tag_keys = baggage if baggage_tag_keys == BAGGAGE_TAG_KEYS_MATCH_ALL
175
+
176
+ tags = {}
177
+
178
+ baggage_tag_keys.each do |key, _| # rubocop:disable Style/HashEachMethods
179
+ value = baggage[key]
180
+ next if value.nil? || value.empty?
181
+
182
+ tags["baggage.#{key}"] = value
183
+ end
184
+
185
+ tags
186
+ end
187
+
188
+ # Record telemetry metrics for baggage operations
189
+ def record_telemetry_metric(metric_name, value, tags)
190
+ telemetry = ::Datadog.send(:components).telemetry
191
+ telemetry.inc('instrumentation_telemetry_data.tracers', metric_name, value, tags: tags)
192
+ end
193
+ end
194
+ end
195
+ end
196
+ end
@@ -55,17 +55,16 @@ module Datadog
55
55
  def extract(data)
56
56
  fetcher = @fetcher.new(data)
57
57
 
58
- trace_id = parse_trace_id(fetcher)
58
+ trace_id = parse_trace_id(fetcher)
59
59
  parent_id = parse_parent_id(fetcher)
60
60
 
61
61
  sampling_priority = Helpers.parse_decimal_id(fetcher[@sampling_priority_key])
62
62
  origin = fetcher[@origin_key]
63
63
 
64
64
  # Return early if this propagation is not valid
65
- # DEV: To be valid we need to have a trace id and a parent id
66
- # or when it is a synthetics trace, just the trace id.
65
+ # DEV: To be valid we need to have a trace id and a parent id or an origin id.
67
66
  # DEV: `Fetcher#id` will not return 0
68
- return unless (trace_id && parent_id) || (origin && trace_id)
67
+ return if trace_id.nil? || parent_id.nil? && origin.nil?
69
68
 
70
69
  trace_distributed_tags = extract_tags(fetcher)
71
70
 
@@ -89,7 +88,7 @@ module Datadog
89
88
  trace_id = Helpers.parse_decimal_id(fetcher_object[@trace_id_key])
90
89
 
91
90
  return unless trace_id
92
- return if trace_id <= 0 || trace_id >= Tracing::Utils::EXTERNAL_MAX_ID
91
+ return if trace_id <= 0 || trace_id > Tracing::Utils::EXTERNAL_MAX_ID
93
92
 
94
93
  trace_id
95
94
  end
@@ -98,7 +97,7 @@ module Datadog
98
97
  parent_id = Helpers.parse_decimal_id(fetcher_object[@parent_id_key])
99
98
 
100
99
  return unless parent_id
101
- return if parent_id <= 0 || parent_id >= Tracing::Utils::EXTERNAL_MAX_ID
100
+ return if parent_id <= 0 || parent_id > Tracing::Utils::EXTERNAL_MAX_ID
102
101
 
103
102
  parent_id
104
103
  end
@@ -116,6 +115,8 @@ module Datadog
116
115
  def extract_trace_id!(trace_id, tags)
117
116
  return trace_id unless tags
118
117
  return trace_id unless (high_order = tags.delete(Tracing::Metadata::Ext::Distributed::TAG_TID))
118
+ return trace_id unless high_order.size == 16
119
+ return trace_id unless /\A[0-9a-f]+\z/i.match?(high_order)
119
120
 
120
121
  Tracing::Utils::TraceId.concatenate(high_order.to_i(16), trace_id)
121
122
  end
@@ -171,7 +172,7 @@ module Datadog
171
172
 
172
173
  def set_tags_propagation_error(reason:)
173
174
  active_trace = Tracing.active_trace
174
- active_trace.set_tag('_dd.propagation_error', reason) if active_trace
175
+ active_trace&.set_tag('_dd.propagation_error', reason)
175
176
  nil
176
177
  end
177
178
 
@@ -31,19 +31,17 @@ module Datadog
31
31
  # @return [String] serialized tags hash
32
32
  # @raise [EncodingError] if tags cannot be serialized to the `x-datadog-tags` format
33
33
  def self.encode(tags)
34
- begin
35
- tags.map do |raw_key, raw_value|
36
- key = raw_key.to_s
37
- value = raw_value.to_s
34
+ tags.map do |raw_key, raw_value|
35
+ key = raw_key.to_s
36
+ value = raw_value.to_s
38
37
 
39
- raise EncodingError, "Invalid key `#{key}` for value `#{value}`" unless VALID_KEY_CHARS.match?(key)
40
- raise EncodingError, "Invalid value `#{value}` for key `#{key}`" unless VALID_VALUE_CHARS.match?(value)
38
+ raise EncodingError, "Invalid key `#{key}` for value `#{value}`" unless VALID_KEY_CHARS.match?(key)
39
+ raise EncodingError, "Invalid value `#{value}` for key `#{key}`" unless VALID_VALUE_CHARS.match?(value)
41
40
 
42
- "#{key}=#{value.strip}"
43
- end.join(',')
44
- rescue => e
45
- raise EncodingError, "Error encoding tags `#{tags}`: `#{e}`"
46
- end
41
+ "#{key}=#{value.strip}"
42
+ end.join(',')
43
+ rescue => e
44
+ raise EncodingError, "Error encoding tags `#{tags}`: `#{e}`"
47
45
  end
48
46
 
49
47
  # Deserializes a `x-datadog-tags`-formatted String into a {Hash<String,String>}.
@@ -52,7 +50,7 @@ module Datadog
52
50
  # @return [Hash<String,String>] decoded input as a hash of strings
53
51
  # @raise [DecodingError] if string does not conform to the `x-datadog-tags` format
54
52
  def self.decode(string)
55
- result = Hash[string.split(',').map do |raw_tag|
53
+ result = (string.split(',').map do |raw_tag|
56
54
  raw_tag.split('=', 2).tap do |raw_key, raw_value|
57
55
  key = raw_key.to_s
58
56
  value = raw_value.to_s
@@ -62,7 +60,7 @@ module Datadog
62
60
 
63
61
  value.strip!
64
62
  end
65
- end]
63
+ end).to_h
66
64
 
67
65
  raise DecodingError, "Invalid empty tags: #{string}" if result.empty? && !string.empty?
68
66
 
@@ -25,7 +25,7 @@ module Datadog
25
25
 
26
26
  value = value.to_s
27
27
 
28
- num = value.to_i
28
+ num = value.to_i
29
29
 
30
30
  # Ensure the parsed number is the same as the original string value
31
31
  # e.g. We want to make sure to throw away `'nan'.to_i == 0`
@@ -8,10 +8,12 @@ module Datadog
8
8
  # @see https://github.com/open-telemetry/opentelemetry-specification/blob/255a6c52b8914a2ed7e26bb5585abecab276aafc/specification/sdk-environment-variables.md?plain=1#L88
9
9
  class None
10
10
  # No-op
11
- def inject!(_digest, _data); end
11
+ def inject!(_digest, _data)
12
+ end
12
13
 
13
14
  # No-op
14
- def extract(_data); end
15
+ def extract(_data)
16
+ end
15
17
  end
16
18
  end
17
19
  end
@@ -4,6 +4,7 @@ require_relative '../configuration/ext'
4
4
  require_relative '../trace_digest'
5
5
  require_relative '../trace_operation'
6
6
  require_relative '../../core/telemetry/logger'
7
+ require_relative 'baggage'
7
8
 
8
9
  module Datadog
9
10
  module Tracing
@@ -26,9 +27,13 @@ module Datadog
26
27
  )
27
28
  @propagation_styles = propagation_styles
28
29
  @propagation_extract_first = propagation_extract_first
29
-
30
30
  @propagation_style_inject = propagation_style_inject.map { |style| propagation_styles[style] }
31
31
  @propagation_style_extract = propagation_style_extract.map { |style| propagation_styles[style] }
32
+
33
+ # The baggage propagator is unique in that baggage should always be extracted, if present.
34
+ # Therefore we remove it from the `propagation_style_extract` list.
35
+ @baggage_propagator = @propagation_style_extract.find { |propagator| propagator.is_a?(Baggage) }
36
+ @propagation_style_extract.delete(@baggage_propagator) if @baggage_propagator
32
37
  end
33
38
 
34
39
  # inject! populates the env with span ID, trace ID and sampling priority
@@ -57,9 +62,8 @@ module Datadog
57
62
  end
58
63
 
59
64
  digest = digest.to_digest if digest.respond_to?(:to_digest)
60
-
61
- if digest.trace_id.nil?
62
- ::Datadog.logger.debug('Cannot inject distributed trace data: digest.trace_id is nil.')
65
+ if digest.trace_id.nil? && digest.baggage.nil?
66
+ ::Datadog.logger.debug('Cannot inject distributed trace data: digest.trace_id and digest.baggage are both nil.')
63
67
  return nil
64
68
  end
65
69
 
@@ -138,12 +142,32 @@ module Datadog
138
142
  "Error extracting distributed trace data. Cause: #{e} Location: #{Array(e.backtrace).first}"
139
143
  )
140
144
  end
145
+ # Handle baggage after all other styles if present
146
+ extracted_trace_digest = propagate_baggage(data, extracted_trace_digest) if @baggage_propagator
141
147
 
142
148
  extracted_trace_digest
143
149
  end
144
150
 
145
151
  private
146
152
 
153
+ def propagate_baggage(data, extracted_trace_digest)
154
+ if extracted_trace_digest
155
+ # Merge with baggage if present
156
+ digest = @baggage_propagator.extract(data)
157
+ if digest
158
+ extracted_trace_digest.merge(
159
+ baggage: digest.baggage,
160
+ trace_distributed_tags: digest.trace_distributed_tags
161
+ )
162
+ else
163
+ extracted_trace_digest
164
+ end
165
+ else
166
+ # Baggage is the only style
167
+ @baggage_propagator.extract(data)
168
+ end
169
+ end
170
+
147
171
  def last_datadog_parent_id(headers, tracecontext_tags)
148
172
  dd_propagator = @propagation_style_extract.find { |propagator| propagator.is_a?(Datadog) }
149
173
  if tracecontext_tags&.fetch(
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Datadog
4
+ module Tracing
5
+ module Distributed
6
+ # Helper method to decide when to skip distributed tracing
7
+ module PropagationPolicy
8
+ module_function
9
+
10
+ # Skips distributed tracing if disabled for this instrumentation
11
+ # or if APM is disabled unless there is an AppSec event (from upstream distributed trace or local)
12
+ #
13
+ # Both pin_config and global_config are configuration for integrations.
14
+ # pin_config is a Datadog::Core::Pin object, which gives the configuration of a single instance of an integration.
15
+ # global_config is the config for all instances of an integration.
16
+ def enabled?(pin_config: nil, global_config: nil, trace: nil)
17
+ return false unless Tracing.enabled?
18
+
19
+ unless ::Datadog.configuration.apm.tracing.enabled
20
+ return false if trace.nil?
21
+
22
+ trace_source = trace.get_tag(::Datadog::Tracing::Metadata::Ext::Distributed::TAG_TRACE_SOURCE)&.to_i(16)
23
+ return false if trace_source.nil?
24
+
25
+ # If AppSec is enabled and AppSec bit is set in the trace, we should not skip distributed tracing
26
+ # Other products that will use dd.p.ts should implement similar behavior here
27
+ if ::Datadog.configuration.appsec.enabled && (trace_source & ::Datadog::AppSec::Ext::PRODUCT_BIT) != 0
28
+ return true
29
+ end
30
+
31
+ return false
32
+ end
33
+
34
+ return pin_config[:distributed_tracing] if pin_config&.key?(:distributed_tracing)
35
+ return global_config[:distributed_tracing] if global_config
36
+
37
+ true
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -52,7 +52,7 @@ module Datadog
52
52
  tags ||= {}
53
53
  tags[Tracing::Metadata::Ext::Distributed::TAG_DECISION_MAKER] = decision
54
54
  when :drop
55
- tags.delete(Tracing::Metadata::Ext::Distributed::TAG_DECISION_MAKER) if tags
55
+ tags&.delete(Tracing::Metadata::Ext::Distributed::TAG_DECISION_MAKER)
56
56
  end
57
57
  end
58
58
 
@@ -128,7 +128,7 @@ module Datadog
128
128
  # @param parent_id [Integer] 64-bit
129
129
  # @param trace_flags [Integer] 8-bit
130
130
  def build_traceparent_string(trace_id, parent_id, trace_flags)
131
- "00-#{format('%032x', trace_id)}-#{format('%016x', parent_id)}-#{format('%02x', trace_flags)}"
131
+ "00-#{format("%032x", trace_id)}-#{format("%016x", parent_id)}-#{format("%02x", trace_flags)}"
132
132
  end
133
133
 
134
134
  # Sets the trace flag to an existing `trace_flags`.
@@ -148,12 +148,14 @@ module Datadog
148
148
 
149
149
  # @see https://www.w3.org/TR/trace-context/#tracestate-header
150
150
  def build_tracestate(digest)
151
- tracestate = String.new('dd=')
151
+ tracestate = +'dd='
152
152
  tracestate << last_dd_parent_id(digest)
153
153
  tracestate << "s:#{digest.trace_sampling_priority};" if digest.trace_sampling_priority
154
154
  tracestate << "o:#{serialize_origin(digest.trace_origin)};" if digest.trace_origin
155
155
 
156
- if digest.trace_distributed_tags
156
+ # Replacing this by safe navigation seems to have a different behaviour on Rubies <= 3.0.
157
+ # It cause a LocalJumpError in the CI.
158
+ if digest.trace_distributed_tags # rubocop:disable Style/SafeNavigation
157
159
  digest.trace_distributed_tags.each do |name, value|
158
160
  tag = "t.#{serialize_tag_key(name)}:#{serialize_tag_value(value)};"
159
161
 
@@ -187,7 +189,7 @@ module Datadog
187
189
  # Ensure the list has at most 31 elements, as we need to prepend Datadog's
188
190
  # entry and the limit is 32 elements total.
189
191
  vendors = vendors[0..30]
190
- "#{tracestate},#{vendors.join(',')}"
192
+ "#{tracestate},#{vendors.join(",")}"
191
193
  else
192
194
  tracestate.to_s
193
195
  end
@@ -199,7 +201,7 @@ module Datadog
199
201
  def last_dd_parent_id(digest)
200
202
  if !digest.span_remote
201
203
  span_id = digest.span_id || 0 # Fall back to zero (invalid) if not present
202
- "p:#{format('%016x', span_id)};"
204
+ "p:#{format("%016x", span_id)};"
203
205
  elsif digest.trace_distributed_tags&.key?(Tracing::Metadata::Ext::Distributed::TAG_DD_PARENT_ID)
204
206
  "p:#{digest.trace_distributed_tags[Tracing::Metadata::Ext::Distributed::TAG_DD_PARENT_ID]};"
205
207
  else
@@ -216,10 +218,10 @@ module Datadog
216
218
  # DEV: come from Datadog-controlled sources.
217
219
  # DEV: Trying to `match?` is measurably faster than a `gsub` that does not match.
218
220
  value = if INVALID_ORIGIN_CHARS.match?(value)
219
- value.gsub(INVALID_ORIGIN_CHARS, '_')
220
- else
221
- value
222
- end
221
+ value.gsub(INVALID_ORIGIN_CHARS, '_')
222
+ else
223
+ value
224
+ end
223
225
 
224
226
  if REMAP_ORIGIN_CHARS.match?(value)
225
227
  value.gsub(REMAP_ORIGIN_CHARS, '~')
@@ -253,10 +255,10 @@ module Datadog
253
255
  # DEV: come from Datadog-controlled sources.
254
256
  # DEV: Trying to `match?` is measurably faster than a `gsub` that does not match.
255
257
  ret = if INVALID_TAG_VALUE_CHARS.match?(value)
256
- value.gsub(INVALID_TAG_VALUE_CHARS, '_')
257
- else
258
- value
259
- end
258
+ value.gsub(INVALID_TAG_VALUE_CHARS, '_')
259
+ else
260
+ value
261
+ end
260
262
 
261
263
  # DEV: Checking for an unlikely '=' is faster than a no-op `tr`.
262
264
  if ret.include?('=')
@@ -333,7 +335,11 @@ module Datadog
333
335
  key, value = pair.split(':', 2)
334
336
  case key
335
337
  when 's'
336
- sampling_priority = Integer(value) rescue nil
338
+ sampling_priority = begin
339
+ Integer(value)
340
+ rescue
341
+ nil
342
+ end
337
343
  when 'o'
338
344
  origin = value
339
345
  when 'p'
@@ -350,7 +356,7 @@ module Datadog
350
356
  tags ||= {}
351
357
  tags["#{Tracing::Metadata::Ext::Distributed::TAGS_PREFIX}#{key}"] = value
352
358
  else
353
- unknown_fields ||= String.new
359
+ unknown_fields ||= +''
354
360
  unknown_fields << pair
355
361
  unknown_fields << ';'
356
362
  end
@@ -59,13 +59,11 @@ module Datadog
59
59
 
60
60
  def publish(*args)
61
61
  subscriptions.each do |block|
62
- begin
63
- block.call(*args)
64
- rescue StandardError => e
65
- Datadog.logger.debug do
66
- "Error while handling '#{name}' event with '#{block}': #{e.class.name} #{e.message} " \
67
- "at #{Array(e.backtrace).first}"
68
- end
62
+ block.call(*args)
63
+ rescue => e
64
+ Datadog.logger.debug do
65
+ "Error while handling '#{name}' event with '#{block}': #{e.class.name} #{e.message} " \
66
+ "at #{Array(e.backtrace).first}"
69
67
  end
70
68
  end
71
69
 
@@ -59,7 +59,7 @@ module Datadog
59
59
  class Finished < Base
60
60
  # Are all spans finished?
61
61
  def flush?(trace_op)
62
- trace_op && trace_op.finished?
62
+ trace_op&.finished?
63
63
  end
64
64
  end
65
65
 
@@ -12,7 +12,7 @@ module Datadog
12
12
  case key
13
13
  when Ext::Analytics::TAG_ENABLED
14
14
  # If true, set rate to 1.0, otherwise set 0.0.
15
- value = value == true ? Ext::Analytics::DEFAULT_SAMPLE_RATE : 0.0
15
+ value = (value == true) ? Ext::Analytics::DEFAULT_SAMPLE_RATE : 0.0
16
16
  Tracing::Analytics.set_sample_rate(self, value)
17
17
  when Ext::Analytics::TAG_SAMPLE_RATE
18
18
  Tracing::Analytics.set_sample_rate(self, value)
@@ -10,17 +10,17 @@ module Datadog
10
10
  # Adds error tagging behavior
11
11
  # @public_api
12
12
  module Errors
13
- def set_error(e)
13
+ def set_error(error)
14
14
  Datadog::Core.log_deprecation do
15
15
  'Errors.set_error(..) is deprecated. ' \
16
16
  'Use Errors.set_error_tags(..) instead.'
17
17
  end
18
- set_error_tags(e)
18
+ set_error_tags(error)
19
19
  end
20
20
 
21
21
  # Mark the span with the given error.
22
- def set_error_tags(e)
23
- e = Core::Error.build_from(e)
22
+ def set_error_tags(error)
23
+ e = Core::Error.build_from(error)
24
24
 
25
25
  set_tag(Ext::Errors::TAG_TYPE, e.type) unless e.type.empty?
26
26
  set_tag(Ext::Errors::TAG_MSG, e.message) unless e.message.empty?
@@ -31,6 +31,8 @@ module Datadog
31
31
  # See Datadog-internal "RFC: Identifying which spans have profiling enabled " for details
32
32
  TAG_PROFILING_ENABLED = '_dd.profiling.enabled'
33
33
 
34
+ TAG_APM_ENABLED = '_dd.apm.enabled'
35
+
34
36
  # Defines constants for trace analytics
35
37
  # @public_api
36
38
  module Analytics
@@ -55,6 +57,9 @@ module Datadog
55
57
  # @see Datadog::Tracing::Sampling::Ext::Mechanism
56
58
  TAG_DECISION_MAKER = '_dd.p.dm'
57
59
 
60
+ # Bitmask for which product generated an event. E.g.: 2 for an AppSec event.
61
+ TAG_TRACE_SOURCE = '_dd.p.ts'
62
+
58
63
  TAG_ORIGIN = '_dd.origin'
59
64
  TAG_SAMPLING_PRIORITY = '_sampling_priority_v1'
60
65
 
@@ -77,6 +82,14 @@ module Datadog
77
82
  TAG_MSG = 'error.message'
78
83
  TAG_STACK = 'error.stack'
79
84
  TAG_TYPE = 'error.type'
85
+
86
+ # From https://opentelemetry.io/docs/specs/semconv/registry/attributes/exception/#exception-stacktrace
87
+ ATTRIBUTE_MESSAGE = 'exception.message'
88
+ ATTRIBUTE_STACKTRACE = 'exception.stacktrace'
89
+ ATTRIBUTE_TYPE = 'exception.type'
90
+
91
+ # From https://opentelemetry.io/docs/specs/semconv/exceptions/exceptions-spans/#exception-event
92
+ EVENT_NAME = 'exception'
80
93
  end
81
94
 
82
95
  # @public_api
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'forwardable'
4
+
5
+ module Datadog
6
+ module Tracing
7
+ module Metadata
8
+ # This class is a data structure that is used to store
9
+ # complex metadata, such as an array of objects.
10
+ #
11
+ # It is serialized to MessagePack format when sent to the agent.
12
+ class Metastruct
13
+ extend Forwardable
14
+
15
+ def_delegators :@metastruct, :[], :[]=, :to_h
16
+
17
+ def initialize
18
+ @metastruct = {}
19
+ end
20
+
21
+ def to_msgpack(packer = nil)
22
+ # JRuby doesn't pass the packer
23
+ packer ||= MessagePack::Packer.new
24
+
25
+ packer.write(@metastruct.transform_values(&:to_msgpack))
26
+ end
27
+
28
+ def pretty_print(q)
29
+ q.seplist @metastruct.each do |key, value|
30
+ q.text "#{key} => #{value}"
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end