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,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'configuration'
4
+ require_relative '../core/configuration'
5
+
6
+ module Datadog
7
+ module ErrorTracking
8
+ # Extends Datadog tracing with ErrorTracking features
9
+ module Extensions
10
+ # Inject Error Tracking into global objects.
11
+ def self.activate!
12
+ Core::Configuration::Settings.extend(Configuration::Settings)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,77 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Datadog
4
+ module ErrorTracking
5
+ # Based on configuration, the TracePoint listening to :rescue or :raise
6
+ # may report more handled errors than we want to report. Therefore we need
7
+ # a function to filter the events. As the filter function both depends
8
+ # on configuration and is called numerous time, we generate it during
9
+ # during the initialization of the feature to have the best performance
10
+ # possible.
11
+ #
12
+ # @api private
13
+ module Filters
14
+ module_function
15
+
16
+ def get_gem_name(file_path)
17
+ regex = %r{gems/([^/]+)-\d}
18
+ regex_match = regex.match(file_path)
19
+ return unless regex_match
20
+
21
+ gem_name = regex_match[1]
22
+
23
+ begin
24
+ Gem::Specification.find_by_name(gem_name) # steep:ignore
25
+ rescue Gem::MissingSpecError
26
+ nil
27
+ end
28
+ end
29
+
30
+ def user_code?(file_path)
31
+ !get_gem_name(file_path)
32
+ end
33
+
34
+ def datadog_code?(file_path)
35
+ file_path.include?('lib/datadog/')
36
+ end
37
+
38
+ def third_party_code?(file_path)
39
+ gem_name = get_gem_name(file_path)
40
+ gem_name && gem_name != "datadog"
41
+ end
42
+
43
+ def file_included?(file_path, instrumented_files)
44
+ instrumented_files.include?(file_path)
45
+ end
46
+
47
+ # Generate the proc used in the TracePoint
48
+ def generate_filter(to_instrument_scope, handled_errors_include = nil)
49
+ case to_instrument_scope
50
+ # If DD_ERROR_TRACKING_HANDLED_ERRORS is set
51
+ when 'all'
52
+ proc { |file_path| !datadog_code?(file_path) }
53
+ when 'user'
54
+ # If DD_ERROR_TRACKING_HANDLED_ERRORS_INCLUDE is set
55
+ if handled_errors_include
56
+ proc { |file_path|
57
+ user_code?(file_path) || file_included?(file_path, handled_errors_include)
58
+ }
59
+ else
60
+ proc { |file_path| user_code?(file_path) }
61
+ end
62
+ when 'third_party'
63
+ if handled_errors_include
64
+ proc { |file_path|
65
+ third_party_code?(file_path) || file_included?(file_path, handled_errors_include)
66
+ }
67
+ else
68
+ proc { |file_path| third_party_code?(file_path) }
69
+ end
70
+ else
71
+ # If only DD_ERROR_TRACKING_HANDLED_ERRORS_INCLUDE is set
72
+ proc { |file_path| file_included?(file_path, handled_errors_include) }
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'error_tracking/collector'
4
+ require_relative 'error_tracking/component'
5
+ require_relative 'error_tracking/configuration'
6
+ require_relative 'error_tracking/ext'
7
+ require_relative 'error_tracking/extensions'
8
+ require_relative 'error_tracking/filters'
9
+
10
+ module Datadog
11
+ # Namespace for Datadog ErrorTracking.
12
+ #
13
+ # @api private
14
+ module ErrorTracking
15
+ # Expose ErrorTracking to global shared objects
16
+ Extensions.activate!
17
+ end
18
+ end
@@ -0,0 +1,196 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../identity'
4
+ require_relative '../../../appsec/trace_keeper'
5
+
6
+ module Datadog
7
+ module Kit
8
+ module AppSec
9
+ module Events
10
+ # The second version of Business Logic Events SDK
11
+ module V2
12
+ LOGIN_SUCCESS_EVENT = 'users.login.success'
13
+ LOGIN_FAILURE_EVENT = 'users.login.failure'
14
+ TELEMETRY_METRICS_NAMESPACE = 'appsec'
15
+ TELEMETRY_METRICS_SDK_EVENT = 'sdk.event'
16
+ TELEMETRY_METRICS_SDK_VERSION = 'v2'
17
+ TELEMETRY_METRICS_EVENTS_INTO_TYPES = {
18
+ LOGIN_SUCCESS_EVENT => 'login_success',
19
+ LOGIN_FAILURE_EVENT => 'login_failure'
20
+ }.freeze
21
+
22
+ class << self
23
+ # Attach user login success information to the service entry span
24
+ # and trigger AppSec event processing.
25
+ #
26
+ # @param login [String] The user login (e.g., username or email).
27
+ # @param user_or_id [String, Hash<Symbol, String>] (optional) If a
28
+ # String, considered as a user ID, if a Hash, considered as a user
29
+ # attributes. The Hash must include `:id` as a key.
30
+ # @param metadata [Hash<Symbol, String>] Additional flat free-form
31
+ # metadata to attach to the event.
32
+ #
33
+ # @example Login only
34
+ # Datadog::Kit::AppSec::Events::V2.track_user_login_success('alice@example.com')
35
+ #
36
+ # @example Login and user attributes
37
+ # Datadog::Kit::AppSec::Events::V2.track_user_login_success(
38
+ # 'alice@example.com',
39
+ # { id: 'user-123', email: 'alice@example.com', name: 'Alice' },
40
+ # ip: '192.168.1.1', device: 'mobile', 'usr.country': 'US'
41
+ # )
42
+ #
43
+ # @return [void]
44
+ def track_user_login_success(login, user_or_id = nil, metadata = {})
45
+ trace = service_entry_trace
46
+ span = service_entry_span
47
+
48
+ if trace.nil? || span.nil?
49
+ return Datadog.logger.warn(
50
+ 'Kit::AppSec: Tracing is not enabled. Please enable tracing if you want to track events'
51
+ )
52
+ end
53
+
54
+ raise TypeError, '`login` argument must be a String' unless login.is_a?(String)
55
+ raise TypeError, '`metadata` argument must be a Hash' unless metadata.is_a?(Hash)
56
+
57
+ user_attributes = build_user_attributes(user_or_id, login)
58
+
59
+ set_span_tags(span, metadata, namespace: LOGIN_SUCCESS_EVENT)
60
+ set_span_tags(span, user_attributes, namespace: "#{LOGIN_SUCCESS_EVENT}.usr")
61
+ span.set_tag('appsec.events.users.login.success.track', 'true')
62
+ span.set_tag('_dd.appsec.events.users.login.success.sdk', 'true')
63
+
64
+ ::Datadog::AppSec::TraceKeeper.keep!(trace)
65
+
66
+ record_event_telemetry_metric(LOGIN_SUCCESS_EVENT)
67
+ ::Datadog::AppSec::Instrumentation.gateway.push('appsec.events.user_lifecycle', LOGIN_SUCCESS_EVENT)
68
+
69
+ # NOTE: Guard-clause will not work with Steep typechecking
70
+ return Kit::Identity.set_user(trace, span, **user_attributes) if user_attributes.key?(:id) # steep:ignore
71
+
72
+ # NOTE: This is a fallback for the case when we don't have an ID,
73
+ # but need to trigger WAF.
74
+ user = ::Datadog::AppSec::Instrumentation::Gateway::User.new(nil, login)
75
+ ::Datadog::AppSec::Instrumentation.gateway.push('identity.set_user', user)
76
+ end
77
+
78
+ # Attach user login failure information to the service entry span
79
+ # and trigger AppSec event processing.
80
+ #
81
+ # @param login [String] The user login (e.g., username or email).
82
+ # @param user_exists [Boolean] Whether the user exists in the system.
83
+ # @param metadata [Hash<Symbol, String>] Additional flat free-form
84
+ # metadata to attach to the event.
85
+ #
86
+ # @example Login only
87
+ # Datadog::Kit::AppSec::Events::V2.track_user_login_failure('alice@example.com')
88
+ #
89
+ # @example With user existence and metadata
90
+ # Datadog::Kit::AppSec::Events::V2.track_user_login_failure(
91
+ # 'alice@example.com',
92
+ # true,
93
+ # ip: '192.168.1.1', device: 'mobile', 'usr.country': 'US'
94
+ # )
95
+ #
96
+ # @return [void]
97
+ def track_user_login_failure(login, user_exists = false, metadata = {})
98
+ trace = service_entry_trace
99
+ span = service_entry_span
100
+
101
+ if trace.nil? || span.nil?
102
+ return Datadog.logger.warn(
103
+ 'Kit::AppSec: Tracing is not enabled. Please enable tracing if you want to track events'
104
+ )
105
+ end
106
+
107
+ raise TypeError, '`login` argument must be a String' unless login.is_a?(String)
108
+ raise TypeError, '`metadata` argument must be a Hash' unless metadata.is_a?(Hash)
109
+
110
+ unless user_exists.is_a?(TrueClass) || user_exists.is_a?(FalseClass)
111
+ raise TypeError, '`user_exists` argument must be a boolean'
112
+ end
113
+
114
+ set_span_tags(span, metadata, namespace: LOGIN_FAILURE_EVENT)
115
+ span.set_tag('appsec.events.users.login.failure.track', 'true')
116
+ span.set_tag('_dd.appsec.events.users.login.failure.sdk', 'true')
117
+ span.set_tag('appsec.events.users.login.failure.usr.login', login)
118
+ span.set_tag('appsec.events.users.login.failure.usr.exists', user_exists.to_s)
119
+
120
+ ::Datadog::AppSec::TraceKeeper.keep!(trace)
121
+
122
+ record_event_telemetry_metric(LOGIN_FAILURE_EVENT)
123
+ ::Datadog::AppSec::Instrumentation.gateway.push('appsec.events.user_lifecycle', LOGIN_FAILURE_EVENT)
124
+
125
+ user = ::Datadog::AppSec::Instrumentation::Gateway::User.new(nil, login)
126
+ ::Datadog::AppSec::Instrumentation.gateway.push('identity.set_user', user)
127
+ end
128
+
129
+ private
130
+
131
+ # NOTE: Current tracer implementation does not provide a way to
132
+ # get the service entry span. This is a shortcut we take now.
133
+ def service_entry_trace
134
+ return Datadog::Tracing.active_trace unless Datadog::AppSec.active_context
135
+
136
+ Datadog::AppSec.active_context&.trace
137
+ end
138
+
139
+ # NOTE: Current tracer implementation does not provide a way to
140
+ # get the service entry span. This is a shortcut we take now.
141
+ def service_entry_span
142
+ return Datadog::Tracing.active_span unless Datadog::AppSec.active_context
143
+
144
+ Datadog::AppSec.active_context&.span
145
+ end
146
+
147
+ def build_user_attributes(user_or_id, login)
148
+ raise TypeError, '`login` argument must be a String' unless login.is_a?(String)
149
+
150
+ case user_or_id
151
+ when nil
152
+ {login: login}
153
+ when String
154
+ {login: login, id: user_or_id}
155
+ when Hash
156
+ raise ArgumentError, 'missing required user key `:id`' unless user_or_id.key?(:id)
157
+ raise TypeError, 'user key `:id` must be a String' unless user_or_id[:id].is_a?(String)
158
+
159
+ user_or_id.merge(login: login)
160
+ else
161
+ raise TypeError, '`user_or_id` argument must be either String or Hash'
162
+ end
163
+ end
164
+
165
+ def set_span_tags(span, tags, namespace:)
166
+ tags.each do |name, value|
167
+ next if value.nil?
168
+
169
+ span.set_tag("appsec.events.#{namespace}.#{name}", value)
170
+ end
171
+ end
172
+
173
+ # TODO: In case if we need to introduce telemetry metrics to the SDK v1
174
+ # or highly increase the number of metrics, this method should be
175
+ # extracted into a proper module.
176
+ def record_event_telemetry_metric(event)
177
+ telemetry = ::Datadog.send(:components, allow_initialization: false)&.telemetry
178
+
179
+ if telemetry.nil?
180
+ return Datadog.logger.debug(
181
+ 'Kit::AppSec: Telemetry component is unavailable. Skip recording SDK metrics'
182
+ )
183
+ end
184
+
185
+ tags = {
186
+ event_type: TELEMETRY_METRICS_EVENTS_INTO_TYPES[event],
187
+ sdk_version: TELEMETRY_METRICS_SDK_VERSION
188
+ }
189
+ telemetry.inc(TELEMETRY_METRICS_NAMESPACE, TELEMETRY_METRICS_SDK_EVENT, 1, tags: tags)
190
+ end
191
+ end
192
+ end
193
+ end
194
+ end
195
+ end
196
+ end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative '../identity'
4
+ require_relative '../../appsec/trace_keeper'
4
5
 
5
6
  module Datadog
6
7
  module Kit
@@ -10,6 +11,7 @@ module Datadog
10
11
  LOGIN_SUCCESS_EVENT = 'users.login.success'
11
12
  LOGIN_FAILURE_EVENT = 'users.login.failure'
12
13
  SIGNUP_EVENT = 'users.signup'
14
+ USER_LOGIN_KEYS = ['usr.login', :"usr.login"].freeze
13
15
 
14
16
  class << self
15
17
  # Attach login success event information to the trace
@@ -30,11 +32,15 @@ module Datadog
30
32
  set_trace_and_span_context('track_login_success', trace, span) do |active_trace, active_span|
31
33
  user_options = user.dup
32
34
  user_id = user_options.delete(:id)
35
+ user_login = user_options[:login] || others[:"usr.login"] || others['usr.login'] || user_id
33
36
 
34
37
  raise ArgumentError, 'missing required key: :user => { :id }' if user_id.nil?
35
38
 
39
+ others = others.reject { |key, _| USER_LOGIN_KEYS.include?(key) }
40
+ others[:"usr.login"] = user_login
36
41
  track(LOGIN_SUCCESS_EVENT, active_trace, active_span, **others)
37
42
 
43
+ user_options[:login] = user_login
38
44
  Kit::Identity.set_user(active_trace, active_span, id: user_id, **user_options)
39
45
  end
40
46
  end
@@ -55,6 +61,7 @@ module Datadog
55
61
  # event information to attach to the trace.
56
62
  def track_login_failure(trace = nil, span = nil, user_exists:, user_id: nil, **others)
57
63
  set_trace_and_span_context('track_login_failure', trace, span) do |active_trace, active_span|
64
+ others[:"usr.login"] = user_id if user_id && !others.key?(:"usr.login") && !others.key?('usr.login')
58
65
  track(LOGIN_FAILURE_EVENT, active_trace, active_span, **others)
59
66
 
60
67
  active_span.set_tag('appsec.events.users.login.failure.usr.id', user_id) if user_id
@@ -80,11 +87,15 @@ module Datadog
80
87
  set_trace_and_span_context('track_signup', trace, span) do |active_trace, active_span|
81
88
  user_options = user.dup
82
89
  user_id = user_options.delete(:id)
90
+ user_login = user_options[:login] || others[:"usr.login"] || others['usr.login'] || user_id
83
91
 
84
92
  raise ArgumentError, 'missing required key: :user => { :id }' if user_id.nil?
85
93
 
94
+ others = others.reject { |key, _| USER_LOGIN_KEYS.include?(key) }
95
+ others[:"usr.login"] = user_login
86
96
  track(SIGNUP_EVENT, active_trace, active_span, **others)
87
97
 
98
+ user_options[:login] = user_login
88
99
  Kit::Identity.set_user(trace, id: user_id, **user_options)
89
100
  end
90
101
  end
@@ -116,7 +127,7 @@ module Datadog
116
127
  span.set_tag("appsec.events.#{event}.#{k}", v) unless v.nil?
117
128
  end
118
129
 
119
- trace.keep!
130
+ ::Datadog::AppSec::TraceKeeper.keep!(trace)
120
131
  else
121
132
  set_trace_and_span_context('track', trace, span) do |active_trace, active_span|
122
133
  active_span.set_tag("appsec.events.#{event}.track", 'true')
@@ -128,9 +139,11 @@ module Datadog
128
139
  active_span.set_tag("appsec.events.#{event}.#{k}", v) unless v.nil?
129
140
  end
130
141
 
131
- active_trace.keep!
142
+ ::Datadog::AppSec::TraceKeeper.keep!(active_trace)
132
143
  end
133
144
  end
145
+
146
+ ::Datadog::AppSec::Instrumentation.gateway.push('appsec.events.user_lifecycle', event)
134
147
  end
135
148
 
136
149
  private
@@ -142,11 +155,11 @@ module Datadog
142
155
  end
143
156
 
144
157
  trace ||= Datadog::Tracing.active_trace
145
- span ||= trace && trace.active_span || Datadog::Tracing.active_span
158
+ span ||= trace&.active_span || Datadog::Tracing.active_span
146
159
 
147
160
  unless trace && span
148
161
  Datadog.logger.debug(
149
- "Tracing not enabled. Method ##{method} is a no-op. Please enable tracing if you want ##{method}"\
162
+ "Tracing not enabled. Method ##{method} is a no-op. Please enable tracing if you want ##{method}" \
150
163
  ' to track this events'
151
164
  )
152
165
  return
@@ -33,6 +33,7 @@ module Datadog
33
33
  # @param others [Hash<Symbol, String>] Additional free-form
34
34
  # user information to attach to the trace.
35
35
  #
36
+ # rubocop:disable Metrics/AbcSize
36
37
  # rubocop:disable Metrics/CyclomaticComplexity
37
38
  # rubocop:disable Metrics/PerceivedComplexity
38
39
  def set_user(
@@ -42,12 +43,12 @@ module Datadog
42
43
 
43
44
  # enforce types
44
45
 
45
- raise TypeError, ':id must be a String' unless id.is_a?(String)
46
- raise TypeError, ':email must be a String' unless email.nil? || email.is_a?(String)
47
- raise TypeError, ':name must be a String' unless name.nil? || name.is_a?(String)
46
+ raise TypeError, ':id must be a String' unless id.is_a?(String)
47
+ raise TypeError, ':email must be a String' unless email.nil? || email.is_a?(String)
48
+ raise TypeError, ':name must be a String' unless name.nil? || name.is_a?(String)
48
49
  raise TypeError, ':session_id must be a String' unless session_id.nil? || session_id.is_a?(String)
49
- raise TypeError, ':role must be a String' unless role.nil? || role.is_a?(String)
50
- raise TypeError, ':scope must be a String' unless scope.nil? || scope.is_a?(String)
50
+ raise TypeError, ':role must be a String' unless role.nil? || role.is_a?(String)
51
+ raise TypeError, ':scope must be a String' unless scope.nil? || scope.is_a?(String)
51
52
 
52
53
  others.each do |k, v|
53
54
  raise TypeError, "#{k.inspect} must be a String" unless v.nil? || v.is_a?(String)
@@ -56,27 +57,33 @@ module Datadog
56
57
  set_trace_and_span_context('set_user', trace, span) do |_active_trace, active_span|
57
58
  # set tags once data is known consistent
58
59
  active_span.set_tag('usr.id', id)
59
- active_span.set_tag('usr.email', email) unless email.nil?
60
- active_span.set_tag('usr.name', name) unless name.nil?
60
+ active_span.set_tag('usr.email', email) unless email.nil?
61
+ active_span.set_tag('usr.name', name) unless name.nil?
61
62
  active_span.set_tag('usr.session_id', session_id) unless session_id.nil?
62
- active_span.set_tag('usr.role', role) unless role.nil?
63
- active_span.set_tag('usr.scope', scope) unless scope.nil?
63
+ active_span.set_tag('usr.role', role) unless role.nil?
64
+ active_span.set_tag('usr.scope', scope) unless scope.nil?
64
65
 
65
66
  others.each do |k, v|
66
67
  active_span.set_tag("usr.#{k}", v) unless v.nil?
67
68
  end
68
69
 
69
70
  if Datadog::AppSec.active_context
70
- user = ::Datadog::AppSec::Instrumentation::Gateway::User.new(id)
71
+ active_span.set_tag('_dd.appsec.user.collection_mode', 'sdk')
72
+
73
+ user = ::Datadog::AppSec::Instrumentation::Gateway::User.new(id, others[:login], session_id)
71
74
  ::Datadog::AppSec::Instrumentation.gateway.push('identity.set_user', user)
72
75
  end
73
76
  end
74
77
  end
78
+ # rubocop:enable Metrics/AbcSize
75
79
  # rubocop:enable Metrics/PerceivedComplexity
76
80
  # rubocop:enable Metrics/CyclomaticComplexity
77
81
 
78
82
  private
79
83
 
84
+ # rubocop:disable Metrics/AbcSize
85
+ # rubocop:disable Metrics/CyclomaticComplexity
86
+ # rubocop:disable Metrics/PerceivedComplexity
80
87
  def set_trace_and_span_context(method, trace = nil, span = nil)
81
88
  if (appsec_context = Datadog::AppSec.active_context)
82
89
  trace = appsec_context.trace
@@ -84,11 +91,11 @@ module Datadog
84
91
  end
85
92
 
86
93
  trace ||= Datadog::Tracing.active_trace
87
- span ||= trace && trace.active_span || Datadog::Tracing.active_span
94
+ span ||= trace&.active_span || Datadog::Tracing.active_span
88
95
 
89
96
  unless trace && span
90
97
  Datadog.logger.debug(
91
- "Tracing not enabled. Method ##{method} is a no-op. Please enable tracing if you want ##{method}"\
98
+ "Tracing not enabled. Method ##{method} is a no-op. Please enable tracing if you want ##{method}" \
92
99
  ' to track this events'
93
100
  )
94
101
  return
@@ -98,6 +105,9 @@ module Datadog
98
105
 
99
106
  yield(trace, span)
100
107
  end
108
+ # rubocop:enable Metrics/AbcSize
109
+ # rubocop:enable Metrics/PerceivedComplexity
110
+ # rubocop:enable Metrics/CyclomaticComplexity
101
111
  end
102
112
  end
103
113
  end
@@ -0,0 +1,90 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'trace/span'
4
+ require_relative '../../tracing/trace_operation'
5
+ require_relative '../trace'
6
+
7
+ module Datadog
8
+ module OpenTelemetry
9
+ module API
10
+ # The Baggage module provides an implementation of the OpenTelemetry Baggage API.
11
+ #
12
+ # Baggage is a set of name/value pairs describing user-defined properties that can be
13
+ # propagated through a distributed trace. This implementation follows the W3C Baggage
14
+ # specification and the OpenTelemetry Baggage API.
15
+ #
16
+ # @see https://www.w3.org/TR/baggage/
17
+ # @see https://opentelemetry.io/docs/specs/otel/baggage/api/
18
+ module Baggage
19
+ def initialize(trace: nil)
20
+ @trace = trace
21
+ end
22
+
23
+ # Returns a new context with empty baggage
24
+ #
25
+ # @param [optional Context] context Context to clear baggage from. Defaults
26
+ # to ::OpenTelemetry::Context.current
27
+ # @return [Context]
28
+ def clear(context: ::OpenTelemetry::Context.current)
29
+ context.ensure_trace.baggage.clear
30
+ context
31
+ end
32
+
33
+ # Returns the corresponding value for key
34
+ #
35
+ # @param [String] key The lookup key
36
+ # @param [optional Context] context The context from which to retrieve
37
+ # the key. Defaults to ::OpenTelemetry::Context.current
38
+ # @return [String, nil]
39
+ def value(key, context: ::OpenTelemetry::Context.current)
40
+ trace = context.ensure_trace
41
+ return nil if trace.nil?
42
+
43
+ trace.baggage && trace.baggage[key]
44
+ end
45
+
46
+ # Returns all baggage values
47
+ #
48
+ # @param [optional Context] context The context from which to retrieve
49
+ # the baggage. Defaults to ::OpenTelemetry::Context.current
50
+ # @return [Hash<String, String>]
51
+ def values(context: ::OpenTelemetry::Context.current)
52
+ trace = context.ensure_trace
53
+ return {} if trace.nil?
54
+
55
+ trace.baggage ? trace.baggage.dup : {}
56
+ end
57
+
58
+ # Returns a new context with new key-value pair
59
+ #
60
+ # @param [String] key The key to store this value under
61
+ # @param [String] value String value to be stored under key
62
+ # @param [optional String] metadata This is here to store properties
63
+ # received from other W3C Baggage implementations but is not exposed in
64
+ # OpenTelemetry. This is considered private API and not for use by
65
+ # end-users.
66
+ # @param [optional Context] context The context to update with new
67
+ # value. Defaults to ::OpenTelemetry::Context.current
68
+ # @return [Context]
69
+ def set_value(key, value, metadata: nil, context: ::OpenTelemetry::Context.current)
70
+ # Delegate to the context to set the value because an active trace is not guaranteed
71
+ # set_values handles this logic
72
+ context.set_values({::OpenTelemetry::Baggage.const_get(:BAGGAGE_KEY) => {key => value}})
73
+ end
74
+
75
+ # Returns a new context with value at key removed
76
+ #
77
+ # @param [String] key The key to remove
78
+ # @param [optional Context] context The context to remove baggage
79
+ # from. Defaults to ::OpenTelemetry::Context.current
80
+ # @return [Context]
81
+ def remove_value(key, context: ::OpenTelemetry::Context.current)
82
+ # Delegate to the context to remove the value because an active trace is not guaranteed
83
+ # set_values handles this logic
84
+ context.set_values({Context::BAGGAGE_REMOVE_KEY => key})
85
+ end
86
+ ::OpenTelemetry::Baggage.singleton_class.prepend(self)
87
+ end
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Datadog
4
+ module OpenTelemetry
5
+ module API
6
+ module Baggage
7
+ def initialize: (?trace: Datadog::Tracing::TraceOperation?) -> void
8
+
9
+ # Returns a new context with empty baggage
10
+ def clear: (?context: OpenTelemetry::Context) -> OpenTelemetry::Context
11
+
12
+ # Returns the corresponding value for key
13
+ def value: (String key, ?context: OpenTelemetry::Context) -> String?
14
+
15
+ # Returns all baggage values
16
+ def values: (?context: OpenTelemetry::Context) -> Hash[String, String]
17
+
18
+ # Returns a new context with key-value pair
19
+ def set_value: (String key, String value, ?metadata: String?, ?context: OpenTelemetry::Context) -> OpenTelemetry::Context
20
+
21
+ # Returns a new context with value at key removed
22
+ def remove_value: (String key, ?context: OpenTelemetry::Context) -> OpenTelemetry::Context
23
+ end
24
+ end
25
+ end
26
+ end
@@ -21,11 +21,13 @@ module Datadog
21
21
  module Context
22
22
  CURRENT_SPAN_KEY = ::OpenTelemetry::Trace.const_get(:CURRENT_SPAN_KEY)
23
23
  private_constant :CURRENT_SPAN_KEY
24
+ BAGGAGE_REMOVE_KEY = Object.new # sentinel object to indicate the deletion of a value in baggage
24
25
 
25
- def initialize(entries, trace: nil)
26
+ def initialize(entries, trace: nil, baggage: nil)
26
27
  @trace = trace || ::Datadog::Tracing.send(:tracer).send(:start_trace)
27
28
  @trace.otel_values.merge!(entries) if entries
28
29
  @trace.otel_context ||= self
30
+ @trace.baggage = baggage if baggage
29
31
  end
30
32
 
31
33
  # Because Context can be reused, we have to make sure we have
@@ -48,7 +50,8 @@ module Datadog
48
50
  @trace.otel_value(key)
49
51
  end
50
52
 
51
- alias [] value
53
+ # `alias` performed to match {::OpenTelemetry::Context} aliasing upstream
54
+ alias [] value # rubocop:disable Style/Alias
52
55
 
53
56
  # Returns a new Context where entries contains the newly added key and value
54
57
  #
@@ -78,9 +81,21 @@ module Datadog
78
81
  )
79
82
  end
80
83
 
81
- existing_values = @trace && @trace.otel_values || {}
84
+ existing_values = @trace&.otel_values || {}
85
+ existing_baggage = @trace&.baggage || {}
82
86
 
83
- ::OpenTelemetry::Context.new(existing_values.merge(values), trace: trace)
87
+ # Retrieve the baggage removal sentinel and remove it from the values hash
88
+ existing_baggage.delete(values[BAGGAGE_REMOVE_KEY]) if values.key?(BAGGAGE_REMOVE_KEY)
89
+
90
+ # If the values hash contains a BAGGAGE_KEY, merge its contents with existing baggage
91
+ # Otherwise, keep the existing baggage unchanged
92
+ new_baggage = if values.key?(::OpenTelemetry::Baggage.const_get(:BAGGAGE_KEY))
93
+ existing_baggage.merge(values[::OpenTelemetry::Baggage.const_get(:BAGGAGE_KEY)])
94
+ else
95
+ existing_baggage
96
+ end
97
+
98
+ ::OpenTelemetry::Context.new(existing_values.merge(values), trace: trace, baggage: new_baggage)
84
99
  end
85
100
 
86
101
  # The Datadog {TraceOperation} associated with this {Context}.
@@ -111,7 +126,7 @@ module Datadog
111
126
  previous_trace = Tracing.active_trace
112
127
  continue_trace!(context)
113
128
 
114
- stack.push(previous_trace && previous_trace.otel_context || ::OpenTelemetry::Context::ROOT)
129
+ stack.push(previous_trace&.otel_context || ::OpenTelemetry::Context::ROOT)
115
130
  stack.size
116
131
  end
117
132
 
@@ -154,7 +169,7 @@ module Datadog
154
169
 
155
170
  def continue_trace!(context, &block)
156
171
  call_context = Tracing.send(:tracer).send(:call_context)
157
- if context && context.trace
172
+ if context&.trace
158
173
  call_context.activate!(context.ensure_trace, &block)
159
174
  else
160
175
  call_context.activate!(nil)