datadog 2.12.1 → 2.19.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 (346) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +243 -2
  3. data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +63 -56
  4. data/ext/datadog_profiling_native_extension/collectors_stack.c +263 -76
  5. data/ext/datadog_profiling_native_extension/collectors_stack.h +20 -3
  6. data/ext/datadog_profiling_native_extension/collectors_thread_context.c +78 -26
  7. data/ext/datadog_profiling_native_extension/collectors_thread_context.h +1 -0
  8. data/ext/datadog_profiling_native_extension/datadog_ruby_common.c +1 -4
  9. data/ext/datadog_profiling_native_extension/datadog_ruby_common.h +10 -0
  10. data/ext/datadog_profiling_native_extension/encoded_profile.c +79 -0
  11. data/ext/datadog_profiling_native_extension/encoded_profile.h +8 -0
  12. data/ext/datadog_profiling_native_extension/extconf.rb +10 -0
  13. data/ext/datadog_profiling_native_extension/heap_recorder.c +247 -364
  14. data/ext/datadog_profiling_native_extension/heap_recorder.h +4 -6
  15. data/ext/datadog_profiling_native_extension/http_transport.c +60 -94
  16. data/ext/datadog_profiling_native_extension/libdatadog_helpers.c +22 -0
  17. data/ext/datadog_profiling_native_extension/libdatadog_helpers.h +8 -5
  18. data/ext/datadog_profiling_native_extension/private_vm_api_access.c +41 -21
  19. data/ext/datadog_profiling_native_extension/private_vm_api_access.h +6 -4
  20. data/ext/datadog_profiling_native_extension/profiling.c +2 -0
  21. data/ext/datadog_profiling_native_extension/ruby_helpers.c +1 -13
  22. data/ext/datadog_profiling_native_extension/ruby_helpers.h +3 -11
  23. data/ext/datadog_profiling_native_extension/stack_recorder.c +173 -76
  24. data/ext/libdatadog_api/crashtracker.c +11 -12
  25. data/ext/libdatadog_api/crashtracker.h +5 -0
  26. data/ext/libdatadog_api/datadog_ruby_common.c +1 -4
  27. data/ext/libdatadog_api/datadog_ruby_common.h +10 -0
  28. data/ext/libdatadog_api/extconf.rb +2 -2
  29. data/ext/libdatadog_api/init.c +15 -0
  30. data/ext/libdatadog_api/library_config.c +164 -0
  31. data/ext/libdatadog_api/library_config.h +25 -0
  32. data/ext/libdatadog_api/macos_development.md +3 -3
  33. data/ext/libdatadog_api/process_discovery.c +112 -0
  34. data/ext/libdatadog_api/process_discovery.h +5 -0
  35. data/ext/libdatadog_extconf_helpers.rb +2 -2
  36. data/lib/datadog/appsec/actions_handler/serializable_backtrace.rb +89 -0
  37. data/lib/datadog/appsec/actions_handler.rb +24 -2
  38. data/lib/datadog/appsec/anonymizer.rb +16 -0
  39. data/lib/datadog/appsec/api_security/lru_cache.rb +56 -0
  40. data/lib/datadog/appsec/api_security/route_extractor.rb +71 -0
  41. data/lib/datadog/appsec/api_security/sampler.rb +59 -0
  42. data/lib/datadog/appsec/api_security.rb +23 -0
  43. data/lib/datadog/appsec/assets/waf_rules/README.md +50 -5
  44. data/lib/datadog/appsec/assets/waf_rules/recommended.json +257 -85
  45. data/lib/datadog/appsec/assets/waf_rules/strict.json +10 -78
  46. data/lib/datadog/appsec/autoload.rb +1 -1
  47. data/lib/datadog/appsec/component.rb +46 -61
  48. data/lib/datadog/appsec/compressed_json.rb +40 -0
  49. data/lib/datadog/appsec/configuration/settings.rb +153 -30
  50. data/lib/datadog/appsec/context.rb +7 -7
  51. data/lib/datadog/appsec/contrib/active_record/instrumentation.rb +10 -12
  52. data/lib/datadog/appsec/contrib/active_record/integration.rb +2 -2
  53. data/lib/datadog/appsec/contrib/active_record/patcher.rb +22 -22
  54. data/lib/datadog/appsec/contrib/auto_instrument.rb +1 -1
  55. data/lib/datadog/appsec/contrib/devise/configuration.rb +7 -31
  56. data/lib/datadog/appsec/contrib/devise/data_extractor.rb +78 -0
  57. data/lib/datadog/appsec/contrib/devise/ext.rb +22 -0
  58. data/lib/datadog/appsec/contrib/devise/integration.rb +1 -2
  59. data/lib/datadog/appsec/contrib/devise/patcher.rb +34 -23
  60. data/lib/datadog/appsec/contrib/devise/patches/signin_tracking_patch.rb +102 -0
  61. data/lib/datadog/appsec/contrib/devise/patches/signup_tracking_patch.rb +69 -0
  62. data/lib/datadog/appsec/contrib/devise/{patcher/rememberable_patch.rb → patches/skip_signin_tracking_patch.rb} +2 -2
  63. data/lib/datadog/appsec/contrib/devise/tracking_middleware.rb +106 -0
  64. data/lib/datadog/appsec/contrib/excon/integration.rb +1 -1
  65. data/lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb +9 -10
  66. data/lib/datadog/appsec/contrib/faraday/integration.rb +1 -1
  67. data/lib/datadog/appsec/contrib/faraday/ssrf_detection_middleware.rb +8 -9
  68. data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +8 -9
  69. data/lib/datadog/appsec/contrib/graphql/integration.rb +1 -1
  70. data/lib/datadog/appsec/contrib/rack/ext.rb +34 -0
  71. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +49 -32
  72. data/lib/datadog/appsec/contrib/rack/integration.rb +1 -1
  73. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +42 -30
  74. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +11 -13
  75. data/lib/datadog/appsec/contrib/rails/integration.rb +1 -1
  76. data/lib/datadog/appsec/contrib/rails/patcher.rb +21 -21
  77. data/lib/datadog/appsec/contrib/rest_client/integration.rb +1 -1
  78. data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +10 -11
  79. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +17 -23
  80. data/lib/datadog/appsec/contrib/sinatra/integration.rb +1 -1
  81. data/lib/datadog/appsec/event.rb +96 -135
  82. data/lib/datadog/appsec/ext.rb +4 -2
  83. data/lib/datadog/appsec/instrumentation/gateway/argument.rb +7 -2
  84. data/lib/datadog/appsec/instrumentation/gateway/middleware.rb +24 -0
  85. data/lib/datadog/appsec/instrumentation/gateway.rb +17 -22
  86. data/lib/datadog/appsec/metrics/telemetry.rb +1 -1
  87. data/lib/datadog/appsec/monitor/gateway/watcher.rb +49 -14
  88. data/lib/datadog/appsec/processor/rule_loader.rb +30 -33
  89. data/lib/datadog/appsec/remote.rb +31 -59
  90. data/lib/datadog/appsec/response.rb +6 -6
  91. data/lib/datadog/appsec/security_engine/engine.rb +194 -0
  92. data/lib/datadog/appsec/security_engine/runner.rb +13 -14
  93. data/lib/datadog/appsec/security_event.rb +39 -0
  94. data/lib/datadog/appsec/utils.rb +0 -2
  95. data/lib/datadog/appsec.rb +5 -8
  96. data/lib/datadog/core/buffer/random.rb +18 -2
  97. data/lib/datadog/core/configuration/agent_settings.rb +52 -0
  98. data/lib/datadog/core/configuration/agent_settings_resolver.rb +4 -46
  99. data/lib/datadog/core/configuration/agentless_settings_resolver.rb +176 -0
  100. data/lib/datadog/core/configuration/components.rb +48 -31
  101. data/lib/datadog/core/configuration/components_state.rb +23 -0
  102. data/lib/datadog/core/configuration/ext.rb +4 -0
  103. data/lib/datadog/core/configuration/option.rb +81 -45
  104. data/lib/datadog/core/configuration/option_definition.rb +4 -4
  105. data/lib/datadog/core/configuration/options.rb +3 -3
  106. data/lib/datadog/core/configuration/settings.rb +109 -44
  107. data/lib/datadog/core/configuration/stable_config.rb +22 -0
  108. data/lib/datadog/core/configuration.rb +40 -16
  109. data/lib/datadog/core/crashtracking/component.rb +3 -10
  110. data/lib/datadog/core/crashtracking/tag_builder.rb +4 -22
  111. data/lib/datadog/core/diagnostics/environment_logger.rb +1 -1
  112. data/lib/datadog/core/encoding.rb +1 -1
  113. data/lib/datadog/core/environment/agent_info.rb +4 -3
  114. data/lib/datadog/core/environment/cgroup.rb +10 -12
  115. data/lib/datadog/core/environment/container.rb +38 -40
  116. data/lib/datadog/core/environment/ext.rb +6 -6
  117. data/lib/datadog/core/environment/git.rb +1 -0
  118. data/lib/datadog/core/environment/identity.rb +3 -3
  119. data/lib/datadog/core/environment/platform.rb +3 -3
  120. data/lib/datadog/core/environment/variable_helpers.rb +1 -1
  121. data/lib/datadog/core/error.rb +11 -9
  122. data/lib/datadog/core/logger.rb +2 -2
  123. data/lib/datadog/core/metrics/client.rb +20 -21
  124. data/lib/datadog/core/metrics/logging.rb +5 -5
  125. data/lib/datadog/core/process_discovery/tracer_memfd.rb +15 -0
  126. data/lib/datadog/core/process_discovery.rb +36 -0
  127. data/lib/datadog/core/rate_limiter.rb +4 -2
  128. data/lib/datadog/core/remote/client.rb +40 -32
  129. data/lib/datadog/core/remote/component.rb +6 -9
  130. data/lib/datadog/core/remote/configuration/digest.rb +7 -7
  131. data/lib/datadog/core/remote/configuration/path.rb +1 -1
  132. data/lib/datadog/core/remote/configuration/repository.rb +14 -1
  133. data/lib/datadog/core/remote/negotiation.rb +9 -9
  134. data/lib/datadog/core/remote/transport/config.rb +4 -3
  135. data/lib/datadog/core/remote/transport/http/client.rb +5 -4
  136. data/lib/datadog/core/remote/transport/http/config.rb +27 -37
  137. data/lib/datadog/core/remote/transport/http/negotiation.rb +7 -33
  138. data/lib/datadog/core/remote/transport/http.rb +22 -57
  139. data/lib/datadog/core/remote/transport/negotiation.rb +4 -3
  140. data/lib/datadog/core/runtime/metrics.rb +12 -5
  141. data/lib/datadog/core/tag_builder.rb +56 -0
  142. data/lib/datadog/core/telemetry/component.rb +81 -52
  143. data/lib/datadog/core/telemetry/emitter.rb +23 -11
  144. data/lib/datadog/core/telemetry/event/app_client_configuration_change.rb +66 -0
  145. data/lib/datadog/core/telemetry/event/app_closing.rb +18 -0
  146. data/lib/datadog/core/telemetry/event/app_dependencies_loaded.rb +33 -0
  147. data/lib/datadog/core/telemetry/event/app_heartbeat.rb +18 -0
  148. data/lib/datadog/core/telemetry/event/app_integrations_change.rb +58 -0
  149. data/lib/datadog/core/telemetry/event/app_started.rb +287 -0
  150. data/lib/datadog/core/telemetry/event/base.rb +40 -0
  151. data/lib/datadog/core/telemetry/event/distributions.rb +18 -0
  152. data/lib/datadog/core/telemetry/event/generate_metrics.rb +43 -0
  153. data/lib/datadog/core/telemetry/event/log.rb +76 -0
  154. data/lib/datadog/core/telemetry/event/message_batch.rb +42 -0
  155. data/lib/datadog/core/telemetry/event/synth_app_client_configuration_change.rb +43 -0
  156. data/lib/datadog/core/telemetry/event.rb +17 -472
  157. data/lib/datadog/core/telemetry/http/adapters/net.rb +12 -97
  158. data/lib/datadog/core/telemetry/logger.rb +5 -4
  159. data/lib/datadog/core/telemetry/logging.rb +11 -5
  160. data/lib/datadog/core/telemetry/metric.rb +8 -8
  161. data/lib/datadog/core/telemetry/request.rb +4 -4
  162. data/lib/datadog/core/telemetry/transport/http/api.rb +43 -0
  163. data/lib/datadog/core/telemetry/transport/http/client.rb +49 -0
  164. data/lib/datadog/core/telemetry/transport/http/telemetry.rb +92 -0
  165. data/lib/datadog/core/telemetry/transport/http.rb +63 -0
  166. data/lib/datadog/core/telemetry/transport/telemetry.rb +51 -0
  167. data/lib/datadog/core/telemetry/worker.rb +90 -24
  168. data/lib/datadog/core/transport/http/adapters/net.rb +17 -2
  169. data/lib/datadog/core/transport/http/adapters/test.rb +2 -1
  170. data/lib/datadog/core/transport/http/api/instance.rb +17 -0
  171. data/lib/datadog/core/transport/http/api/spec.rb +17 -0
  172. data/lib/datadog/core/transport/http/builder.rb +19 -17
  173. data/lib/datadog/core/transport/http/env.rb +8 -0
  174. data/lib/datadog/core/transport/http.rb +39 -2
  175. data/lib/datadog/core/utils/at_fork_monkey_patch.rb +6 -6
  176. data/lib/datadog/core/utils/duration.rb +32 -32
  177. data/lib/datadog/core/utils/forking.rb +2 -2
  178. data/lib/datadog/core/utils/network.rb +6 -6
  179. data/lib/datadog/core/utils/only_once_successful.rb +16 -5
  180. data/lib/datadog/core/utils/time.rb +20 -0
  181. data/lib/datadog/core/utils/truncation.rb +21 -0
  182. data/lib/datadog/core/utils.rb +7 -0
  183. data/lib/datadog/core/vendor/multipart-post/multipart/post/composite_read_io.rb +1 -1
  184. data/lib/datadog/core/vendor/multipart-post/multipart/post/multipartable.rb +8 -8
  185. data/lib/datadog/core/vendor/multipart-post/multipart/post/parts.rb +7 -7
  186. data/lib/datadog/core/worker.rb +1 -1
  187. data/lib/datadog/core/workers/async.rb +29 -12
  188. data/lib/datadog/core/workers/interval_loop.rb +12 -1
  189. data/lib/datadog/core/workers/runtime_metrics.rb +2 -2
  190. data/lib/datadog/core.rb +8 -0
  191. data/lib/datadog/di/boot.rb +34 -0
  192. data/lib/datadog/di/component.rb +0 -2
  193. data/lib/datadog/di/instrumenter.rb +48 -5
  194. data/lib/datadog/di/probe_notification_builder.rb +38 -43
  195. data/lib/datadog/di/probe_notifier_worker.rb +25 -17
  196. data/lib/datadog/di/remote.rb +2 -0
  197. data/lib/datadog/di/serializer.rb +10 -2
  198. data/lib/datadog/di/transport/diagnostics.rb +4 -3
  199. data/lib/datadog/di/transport/http/api.rb +2 -12
  200. data/lib/datadog/di/transport/http/client.rb +4 -3
  201. data/lib/datadog/di/transport/http/diagnostics.rb +7 -34
  202. data/lib/datadog/di/transport/http/input.rb +18 -35
  203. data/lib/datadog/di/transport/http.rb +14 -62
  204. data/lib/datadog/di/transport/input.rb +14 -5
  205. data/lib/datadog/di/utils.rb +5 -0
  206. data/lib/datadog/di.rb +0 -33
  207. data/lib/datadog/error_tracking/collector.rb +87 -0
  208. data/lib/datadog/error_tracking/component.rb +167 -0
  209. data/lib/datadog/error_tracking/configuration/settings.rb +63 -0
  210. data/lib/datadog/error_tracking/configuration.rb +11 -0
  211. data/lib/datadog/error_tracking/ext.rb +18 -0
  212. data/lib/datadog/error_tracking/extensions.rb +16 -0
  213. data/lib/datadog/error_tracking/filters.rb +77 -0
  214. data/lib/datadog/error_tracking.rb +18 -0
  215. data/lib/datadog/kit/appsec/events/v2.rb +195 -0
  216. data/lib/datadog/kit/appsec/events.rb +12 -0
  217. data/lib/datadog/kit/identity.rb +5 -1
  218. data/lib/datadog/opentelemetry/api/baggage.rb +90 -0
  219. data/lib/datadog/opentelemetry/api/baggage.rbs +26 -0
  220. data/lib/datadog/opentelemetry/api/context.rb +16 -2
  221. data/lib/datadog/opentelemetry/sdk/trace/span.rb +1 -1
  222. data/lib/datadog/opentelemetry.rb +2 -1
  223. data/lib/datadog/profiling/collectors/code_provenance.rb +18 -9
  224. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +6 -0
  225. data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +1 -0
  226. data/lib/datadog/profiling/collectors/info.rb +44 -0
  227. data/lib/datadog/profiling/collectors/thread_context.rb +17 -2
  228. data/lib/datadog/profiling/component.rb +8 -9
  229. data/lib/datadog/profiling/encoded_profile.rb +11 -0
  230. data/lib/datadog/profiling/exporter.rb +12 -7
  231. data/lib/datadog/profiling/ext.rb +0 -14
  232. data/lib/datadog/profiling/flush.rb +5 -8
  233. data/lib/datadog/profiling/http_transport.rb +7 -61
  234. data/lib/datadog/profiling/profiler.rb +2 -0
  235. data/lib/datadog/profiling/scheduler.rb +10 -2
  236. data/lib/datadog/profiling/sequence_tracker.rb +44 -0
  237. data/lib/datadog/profiling/stack_recorder.rb +9 -9
  238. data/lib/datadog/profiling/tag_builder.rb +7 -41
  239. data/lib/datadog/profiling/tasks/setup.rb +2 -0
  240. data/lib/datadog/profiling.rb +7 -2
  241. data/lib/datadog/single_step_instrument.rb +9 -0
  242. data/lib/datadog/tracing/analytics.rb +1 -1
  243. data/lib/datadog/tracing/component.rb +15 -12
  244. data/lib/datadog/tracing/configuration/ext.rb +7 -1
  245. data/lib/datadog/tracing/configuration/settings.rb +18 -2
  246. data/lib/datadog/tracing/context_provider.rb +1 -1
  247. data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +15 -0
  248. data/lib/datadog/tracing/contrib/action_pack/action_dispatch/instrumentation.rb +19 -12
  249. data/lib/datadog/tracing/contrib/action_pack/ext.rb +2 -0
  250. data/lib/datadog/tracing/contrib/active_record/integration.rb +1 -1
  251. data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +11 -2
  252. data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +33 -0
  253. data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +4 -0
  254. data/lib/datadog/tracing/contrib/active_support/cache/redis.rb +2 -4
  255. data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +13 -0
  256. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +10 -0
  257. data/lib/datadog/tracing/contrib/aws/parsed_context.rb +5 -1
  258. data/lib/datadog/tracing/contrib/configuration/settings.rb +1 -1
  259. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +4 -5
  260. data/lib/datadog/tracing/contrib/excon/middleware.rb +5 -3
  261. data/lib/datadog/tracing/contrib/ext.rb +1 -0
  262. data/lib/datadog/tracing/contrib/faraday/middleware.rb +5 -3
  263. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +7 -1
  264. data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +3 -0
  265. data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +0 -15
  266. data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +4 -1
  267. data/lib/datadog/tracing/contrib/http/instrumentation.rb +6 -10
  268. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +6 -16
  269. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +7 -15
  270. data/lib/datadog/tracing/contrib/karafka/configuration/settings.rb +27 -0
  271. data/lib/datadog/tracing/contrib/karafka/distributed/propagation.rb +48 -0
  272. data/lib/datadog/tracing/contrib/karafka/ext.rb +27 -0
  273. data/lib/datadog/tracing/contrib/karafka/integration.rb +45 -0
  274. data/lib/datadog/tracing/contrib/karafka/monitor.rb +66 -0
  275. data/lib/datadog/tracing/contrib/karafka/patcher.rb +71 -0
  276. data/lib/datadog/tracing/contrib/karafka.rb +37 -0
  277. data/lib/datadog/tracing/contrib/lograge/patcher.rb +4 -2
  278. data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +8 -0
  279. data/lib/datadog/tracing/contrib/mongodb/ext.rb +1 -0
  280. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +18 -1
  281. data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +16 -6
  282. data/lib/datadog/tracing/contrib/opensearch/configuration/settings.rb +17 -0
  283. data/lib/datadog/tracing/contrib/opensearch/ext.rb +9 -0
  284. data/lib/datadog/tracing/contrib/opensearch/patcher.rb +5 -1
  285. data/lib/datadog/tracing/contrib/patcher.rb +5 -2
  286. data/lib/datadog/tracing/contrib/rack/request_queue.rb +1 -1
  287. data/lib/datadog/tracing/contrib/rails/patcher.rb +4 -1
  288. data/lib/datadog/tracing/contrib/rails/runner.rb +61 -40
  289. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +5 -3
  290. data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +6 -1
  291. data/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb +3 -0
  292. data/lib/datadog/tracing/contrib/sidekiq/ext.rb +1 -0
  293. data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +5 -2
  294. data/lib/datadog/tracing/contrib/support.rb +28 -0
  295. data/lib/datadog/tracing/contrib.rb +1 -0
  296. data/lib/datadog/tracing/correlation.rb +9 -2
  297. data/lib/datadog/tracing/diagnostics/environment_logger.rb +3 -1
  298. data/lib/datadog/tracing/distributed/b3_multi.rb +1 -1
  299. data/lib/datadog/tracing/distributed/b3_single.rb +1 -1
  300. data/lib/datadog/tracing/distributed/baggage.rb +131 -0
  301. data/lib/datadog/tracing/distributed/datadog.rb +4 -2
  302. data/lib/datadog/tracing/distributed/propagation.rb +25 -4
  303. data/lib/datadog/tracing/distributed/propagation_policy.rb +42 -0
  304. data/lib/datadog/tracing/metadata/errors.rb +4 -4
  305. data/lib/datadog/tracing/metadata/ext.rb +5 -0
  306. data/lib/datadog/tracing/metadata/metastruct.rb +36 -0
  307. data/lib/datadog/tracing/metadata/metastruct_tagging.rb +42 -0
  308. data/lib/datadog/tracing/metadata.rb +2 -0
  309. data/lib/datadog/tracing/sampling/rate_sampler.rb +2 -1
  310. data/lib/datadog/tracing/sampling/span/rule.rb +0 -1
  311. data/lib/datadog/tracing/span.rb +10 -1
  312. data/lib/datadog/tracing/span_event.rb +2 -2
  313. data/lib/datadog/tracing/span_operation.rb +68 -16
  314. data/lib/datadog/tracing/sync_writer.rb +2 -3
  315. data/lib/datadog/tracing/trace_digest.rb +9 -2
  316. data/lib/datadog/tracing/trace_operation.rb +55 -27
  317. data/lib/datadog/tracing/trace_segment.rb +6 -4
  318. data/lib/datadog/tracing/tracer.rb +51 -7
  319. data/lib/datadog/tracing/transport/http/api.rb +2 -10
  320. data/lib/datadog/tracing/transport/http/client.rb +5 -4
  321. data/lib/datadog/tracing/transport/http/traces.rb +13 -41
  322. data/lib/datadog/tracing/transport/http.rb +11 -44
  323. data/lib/datadog/tracing/transport/serializable_trace.rb +3 -1
  324. data/lib/datadog/tracing/transport/trace_formatter.rb +7 -0
  325. data/lib/datadog/tracing/transport/traces.rb +26 -9
  326. data/lib/datadog/tracing/utils.rb +1 -1
  327. data/lib/datadog/tracing/workers/trace_writer.rb +2 -6
  328. data/lib/datadog/tracing/writer.rb +2 -6
  329. data/lib/datadog/tracing.rb +16 -3
  330. data/lib/datadog/version.rb +2 -2
  331. data/lib/datadog.rb +8 -2
  332. metadata +88 -23
  333. data/lib/datadog/appsec/assets/waf_rules/processors.json +0 -92
  334. data/lib/datadog/appsec/assets/waf_rules/scanners.json +0 -114
  335. data/lib/datadog/appsec/contrib/devise/event.rb +0 -54
  336. data/lib/datadog/appsec/contrib/devise/patcher/authenticatable_patch.rb +0 -72
  337. data/lib/datadog/appsec/contrib/devise/patcher/registration_controller_patch.rb +0 -47
  338. data/lib/datadog/appsec/contrib/devise/resource.rb +0 -35
  339. data/lib/datadog/appsec/contrib/devise/tracking.rb +0 -57
  340. data/lib/datadog/appsec/processor/rule_merger.rb +0 -170
  341. data/lib/datadog/appsec/processor.rb +0 -107
  342. data/lib/datadog/appsec/utils/trace_operation.rb +0 -15
  343. data/lib/datadog/core/telemetry/http/env.rb +0 -20
  344. data/lib/datadog/core/telemetry/http/ext.rb +0 -28
  345. data/lib/datadog/core/telemetry/http/response.rb +0 -70
  346. data/lib/datadog/core/telemetry/http/transport.rb +0 -90
@@ -6,6 +6,7 @@ require_relative 'sync_writer'
6
6
  require_relative 'sampling/span/rule_parser'
7
7
  require_relative 'sampling/span/sampler'
8
8
  require_relative 'diagnostics/environment_logger'
9
+ require_relative 'contrib/component'
9
10
 
10
11
  module Datadog
11
12
  module Tracing
@@ -74,18 +75,11 @@ module Datadog
74
75
  return sampler
75
76
  end
76
77
 
77
- # AppSec events are sent to the backend using traces.
78
- # Standalone ASM billing means that we don't want to charge clients for APM traces,
79
- # so we want to send the minimum amount of traces possible (idealy only traces that contains security events),
80
- # but for features such as API Security, we need to send at least one trace per minute,
81
- # to keep the service alive on the backend side.
82
- if settings.appsec.standalone.enabled
83
- post_sampler = Tracing::Sampling::RuleSampler.new(
84
- [Tracing::Sampling::SimpleRule.new(sample_rate: 1.0)],
85
- rate_limiter: Datadog::Core::TokenBucket.new(1.0 / 60, 1.0),
86
- default_sample_rate: 1.0 / 60
87
- )
88
- end
78
+ # APM Disablement means that we don't want to send traces that only contains APM data.
79
+ # Other products can then put the sampling priority to MANUAL_KEEP if they want to keep traces.
80
+ # (e.g.: AppSec will MANUAL_KEEP traces with AppSec events) and clients will be billed only for those traces.
81
+ # But to keep the service alive on the backend side, we need to send one trace per minute.
82
+ post_sampler = build_rate_limit_post_sampler(seconds: 60) unless settings.apm.tracing.enabled
89
83
 
90
84
  # Sampling rules are provided
91
85
  if (rules = settings.tracing.sampling.rules)
@@ -197,6 +191,15 @@ module Datadog
197
191
  end
198
192
  end
199
193
 
194
+ # Build a post-sampler that limits the rate of traces to one per `seconds`.
195
+ # E.g.: `build_rate_limit_post_sampler(seconds: 60)` will limit the rate to one trace per minute.
196
+ def build_rate_limit_post_sampler(seconds:)
197
+ Tracing::Sampling::RuleSampler.new(
198
+ rate_limiter: Datadog::Core::TokenBucket.new(1.0 / seconds, 1.0),
199
+ default_sample_rate: 1.0
200
+ )
201
+ end
202
+
200
203
  def build_test_mode_trace_flush(settings)
201
204
  # If context flush behavior is provided, use it instead.
202
205
  settings.tracing.test_mode.trace_flush || build_trace_flush(settings)
@@ -12,6 +12,7 @@ module Datadog
12
12
  ENV_OTEL_TRACES_EXPORTER = 'OTEL_TRACES_EXPORTER'
13
13
  ENV_HEADER_TAGS = 'DD_TRACE_HEADER_TAGS'
14
14
  ENV_TRACE_ID_128_BIT_GENERATION_ENABLED = 'DD_TRACE_128_BIT_TRACEID_GENERATION_ENABLED'
15
+ ENV_NATIVE_SPAN_EVENTS = 'DD_TRACE_NATIVE_SPAN_EVENTS'
15
16
 
16
17
  # @public_api
17
18
  module SpanAttributeSchema
@@ -41,8 +42,13 @@ module Datadog
41
42
  # W3C Trace Context
42
43
  PROPAGATION_STYLE_TRACE_CONTEXT = 'tracecontext'
43
44
 
45
+ # W3C Baggage
46
+ # @see https://www.w3.org/TR/baggage/
47
+ PROPAGATION_STYLE_BAGGAGE = 'baggage'
48
+
44
49
  PROPAGATION_STYLE_SUPPORTED = [PROPAGATION_STYLE_DATADOG, PROPAGATION_STYLE_B3_MULTI_HEADER,
45
- PROPAGATION_STYLE_B3_SINGLE_HEADER, PROPAGATION_STYLE_TRACE_CONTEXT].freeze
50
+ PROPAGATION_STYLE_B3_SINGLE_HEADER, PROPAGATION_STYLE_TRACE_CONTEXT,
51
+ PROPAGATION_STYLE_BAGGAGE].freeze
46
52
 
47
53
  # Sets both extract and inject propagation style tho the provided value.
48
54
  # Has lower precedence than `DD_TRACE_PROPAGATION_STYLE_INJECT` or
@@ -42,7 +42,7 @@ module Datadog
42
42
  #
43
43
  # The tracer will try to find distributed headers in the order they are present in the list provided to this option.
44
44
  # The first format to have valid data present will be used.
45
- #
45
+ # Baggage style is a special case, as it will always be extracted in addition if present.
46
46
  # @default `DD_TRACE_PROPAGATION_STYLE_EXTRACT` environment variable (comma-separated list),
47
47
  # otherwise `['datadog','b3multi','b3']`.
48
48
  # @return [Array<String>]
@@ -53,6 +53,7 @@ module Datadog
53
53
  [
54
54
  Tracing::Configuration::Ext::Distributed::PROPAGATION_STYLE_DATADOG,
55
55
  Tracing::Configuration::Ext::Distributed::PROPAGATION_STYLE_TRACE_CONTEXT,
56
+ Tracing::Configuration::Ext::Distributed::PROPAGATION_STYLE_BAGGAGE,
56
57
  ]
57
58
  )
58
59
  o.after_set do |styles|
@@ -74,6 +75,7 @@ module Datadog
74
75
  o.default [
75
76
  Tracing::Configuration::Ext::Distributed::PROPAGATION_STYLE_DATADOG,
76
77
  Tracing::Configuration::Ext::Distributed::PROPAGATION_STYLE_TRACE_CONTEXT,
78
+ Tracing::Configuration::Ext::Distributed::PROPAGATION_STYLE_BAGGAGE,
77
79
  ]
78
80
  o.after_set do |styles|
79
81
  # Make values case-insensitive
@@ -186,7 +188,7 @@ module Datadog
186
188
  # It is not supported by our backend yet. Do not enable it.
187
189
  option :trace_id_128_bit_logging_enabled do |o|
188
190
  o.env Tracing::Configuration::Ext::Correlation::ENV_TRACE_ID_128_BIT_LOGGING_ENABLED
189
- o.default false
191
+ o.default true
190
192
  o.type :bool
191
193
  end
192
194
 
@@ -249,6 +251,20 @@ module Datadog
249
251
  o.type :bool
250
252
  end
251
253
 
254
+ # Forces the tracer to always send span events with the native span events format
255
+ # regardless of the agent support. This is useful in agent-less setups.
256
+ #
257
+ # When set to `nil`, the default, the agent will be queried for
258
+ # native span events support.
259
+ #
260
+ # @default `DD_TRACE_NATIVE_SPAN_EVENTS` environment variable, otherwise `false`
261
+ # @return [Boolean,nil]
262
+ option :native_span_events do |o|
263
+ o.env Tracing::Configuration::Ext::ENV_NATIVE_SPAN_EVENTS
264
+ o.default nil
265
+ o.type :bool, nilable: true
266
+ end
267
+
252
268
  # A custom sampler instance.
253
269
  # The object must respect the {Datadog::Tracing::Sampling::Sampler} interface.
254
270
  # @default `nil`
@@ -49,7 +49,7 @@ module Datadog
49
49
  # To support multiple tracers simultaneously, each {Datadog::Tracing::FiberLocalContext}
50
50
  # instance has its own fiber-local variable.
51
51
  def initialize
52
- @key = "datadog_context_#{FiberLocalContext.next_instance_id}".to_sym
52
+ @key = :"datadog_context_#{FiberLocalContext.next_instance_id}"
53
53
 
54
54
  self.local = Context.new
55
55
  end
@@ -68,6 +68,12 @@ module Datadog
68
68
 
69
69
  span.set_tag(Ext::TAG_ROUTE_ACTION, payload.fetch(:action))
70
70
  span.set_tag(Ext::TAG_ROUTE_CONTROLLER, payload.fetch(:controller))
71
+ if (runtime = payload[:view_runtime])
72
+ span.set_tag(Ext::TAG_VIEW_RUNTIME, runtime)
73
+ end
74
+ if (runtime = payload[:db_runtime])
75
+ span.set_tag(Ext::TAG_DB_RUNTIME, runtime)
76
+ end
71
77
 
72
78
  exception = payload[:exception_object]
73
79
  if exception.nil?
@@ -118,6 +124,15 @@ module Datadog
118
124
  payload[:exception] = [e.class.name, e.message]
119
125
  payload[:exception_object] = e
120
126
  raise e
127
+ ensure
128
+ # Database and view runtime are available for controllers
129
+ # deriving from ActionController::Base.
130
+ # They are not defined on controllers deriving from
131
+ # ActionController::Metal, unless
132
+ # ActionController::Instrumentation is explicitly included
133
+ # into the controller class.
134
+ payload[:db_runtime] = db_runtime if respond_to?(:db_runtime)
135
+ payload[:view_runtime] = view_runtime if respond_to?(:view_runtime)
121
136
  end
122
137
  # rubocop:enable Lint/RescueException
123
138
  ensure
@@ -9,9 +9,12 @@ module Datadog
9
9
  module ActionDispatch
10
10
  # Instrumentation for ActionDispatch components
11
11
  module Instrumentation
12
+ SCRIPT_NAME_KEY = 'SCRIPT_NAME'
13
+ FORMAT_SUFFIX = '(.:format)'
14
+
12
15
  module_function
13
16
 
14
- def set_http_route_tags(route_spec, script_name)
17
+ def set_http_route_tags(route_spec, route_path)
15
18
  return unless Tracing.enabled?
16
19
 
17
20
  return unless route_spec
@@ -19,10 +22,10 @@ module Datadog
19
22
  request_trace = Tracing.active_trace
20
23
  return unless request_trace
21
24
 
22
- request_trace.set_tag(Tracing::Metadata::Ext::HTTP::TAG_ROUTE, route_spec.to_s.gsub(/\(.:format\)\z/, ''))
25
+ request_trace.set_tag(Tracing::Metadata::Ext::HTTP::TAG_ROUTE, route_spec)
23
26
 
24
- if script_name && !script_name.empty?
25
- request_trace.set_tag(Tracing::Metadata::Ext::HTTP::TAG_ROUTE_PATH, script_name)
27
+ if route_path && !route_path.empty?
28
+ request_trace.set_tag(Tracing::Metadata::Ext::HTTP::TAG_ROUTE_PATH, route_path)
26
29
  end
27
30
  end
28
31
 
@@ -40,16 +43,17 @@ module Datadog
40
43
  # Instrumentation for ActionDispatch::Journey::Router for Rails versions older than 7.1
41
44
  module Router
42
45
  def find_routes(req)
46
+ # result is an array of [match, parameters, route] tuples
43
47
  result = super
48
+ result.each do |_, _, route|
49
+ next unless Instrumentation.dispatcher_route?(route)
44
50
 
45
- # result is an array of [match, parameters, route] tuples
46
- routes = result.map(&:last)
51
+ http_route = route.path.spec.to_s
52
+ http_route.delete_suffix!(FORMAT_SUFFIX)
47
53
 
48
- routes.each do |route|
49
- if Instrumentation.dispatcher_route?(route)
50
- Instrumentation.set_http_route_tags(route.path.spec, req.env['SCRIPT_NAME'])
51
- break
52
- end
54
+ Instrumentation.set_http_route_tags(http_route, req.env[SCRIPT_NAME_KEY])
55
+
56
+ break
53
57
  end
54
58
 
55
59
  result
@@ -62,7 +66,10 @@ module Datadog
62
66
  def find_routes(req)
63
67
  super do |match, parameters, route|
64
68
  if Instrumentation.dispatcher_route?(route)
65
- Instrumentation.set_http_route_tags(route.path.spec, req.env['SCRIPT_NAME'])
69
+ http_route = route.path.spec.to_s
70
+ http_route.delete_suffix!(FORMAT_SUFFIX)
71
+
72
+ Instrumentation.set_http_route_tags(http_route, req.env[SCRIPT_NAME_KEY])
66
73
  end
67
74
 
68
75
  yield [match, parameters, route]
@@ -16,6 +16,8 @@ module Datadog
16
16
  TAG_OPERATION_CONTROLLER = 'controller'
17
17
  TAG_ROUTE_ACTION = 'rails.route.action'
18
18
  TAG_ROUTE_CONTROLLER = 'rails.route.controller'
19
+ TAG_DB_RUNTIME = 'rails.db.runtime'
20
+ TAG_VIEW_RUNTIME = 'rails.view.runtime'
19
21
  end
20
22
  end
21
23
  end
@@ -57,7 +57,7 @@ module Datadog
57
57
  end
58
58
 
59
59
  def reset_resolver_cache
60
- @resolver&.reset_cache
60
+ @resolver&.reset_cache if defined?(@resolver)
61
61
  end
62
62
 
63
63
  Contrib::Component.register('activerecord') do |_config|
@@ -45,9 +45,15 @@ module Datadog
45
45
  'cache_write_multi.active_support' => { resource: Ext::RESOURCE_CACHE_MSET, multi_key: true }
46
46
  }.freeze
47
47
 
48
- def trace?(event, _payload)
48
+ def trace?(event, payload)
49
49
  return false if !Tracing.enabled? || !configuration.enabled
50
50
 
51
+ if (cache_store = configuration[:cache_store])
52
+ store = cache_backend(payload[:store])
53
+
54
+ return false unless cache_store.include?(store)
55
+ end
56
+
51
57
  # DEV-3.0: Backwards compatibility code for the 2.x gem series.
52
58
  # DEV-3.0: See documentation at {Datadog::Tracing::Contrib::ActiveSupport::Cache::Instrumentation}
53
59
  # DEV-3.0: for the complete information about this backwards compatibility code.
@@ -62,7 +68,10 @@ module Datadog
62
68
  end
63
69
 
64
70
  def on_start(span, event, _id, payload)
65
- key = payload[:key]
71
+ # Since Rails 8, `dd_original_keys` contains the denormalized key provided by the user.
72
+ # In previous versions, the denormalized key is stored in the official `key` attribute.
73
+ # We fall back to `key`, even in Rails 8, as a defensive measure.
74
+ key = payload[:dd_original_keys] || payload[:key]
66
75
  store = payload[:store]
67
76
 
68
77
  mapping = MAPPING.fetch(event)
@@ -184,6 +184,39 @@ module Datadog
184
184
  super(operation, key, polyfill_options)
185
185
  end
186
186
  end
187
+
188
+ # Save the original, user-supplied cache key, before it gets normalized.
189
+ #
190
+ # Normalized keys can include internal implementation detail,
191
+ # for example FileStore keys include temp directory names, which
192
+ # changes on every run, making it impossible to group by the cache key afterward.
193
+ # Also, the user is never exposed to the normalized key, and only sets/gets using the
194
+ # original key.
195
+ module PreserveOriginalKey
196
+ # Stores the original keys in the options hash, as an array of keys.
197
+ # It's important to keep all the keys for multi-key operations.
198
+ # For single-key operations, the key is stored as an array of a single element.
199
+ def normalize_key(key, options)
200
+ orig_keys = options[:dd_original_keys] || []
201
+ orig_keys << key
202
+ options[:dd_original_keys] = orig_keys
203
+
204
+ super
205
+ end
206
+
207
+ # Ensure we don't pollute the default Store instance `options` in {PreserveOriginalKey#normalize_key}.
208
+ # In most cases, `merged_options` returns a new hash,
209
+ # but we check for cases where it reuses the instance hash.
210
+ def merged_options(call_options)
211
+ ret = super
212
+
213
+ if ret.equal?(options)
214
+ ret.dup
215
+ else
216
+ ret
217
+ end
218
+ end
219
+ end
187
220
  end
188
221
  end
189
222
  end
@@ -22,6 +22,10 @@ module Datadog
22
22
  def patch
23
23
  Events.subscribe!
24
24
 
25
+ if Integration.version >= Gem::Version.new('8.0.0')
26
+ ::ActiveSupport::Cache::Store.prepend(Cache::Instrumentation::PreserveOriginalKey)
27
+ end
28
+
25
29
  # Backfill the `:store` key in the ActiveSupport event payload for older Rails.
26
30
  if Integration.version < Gem::Version.new('6.1.0')
27
31
  ::ActiveSupport::Cache::Store.prepend(Cache::Instrumentation::Store)
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative '../../support'
3
4
  require_relative 'patcher'
4
5
 
5
6
  module Datadog
@@ -34,10 +35,7 @@ module Datadog
34
35
  # @see https://github.com/rails/rails/blob/d0dcb8fa6073a0c4d42600c15e82e3bb386b27d3/activesupport/lib/active_support/cache/redis_cache_store.rb#L4
35
36
  def patch_redis_cache_store?(meth)
36
37
  Gem.loaded_specs['redis'] &&
37
- # Autoload constants return `constant` for `defined?`, but that doesn't mean they are loaded...
38
- defined?(::ActiveSupport::Cache::RedisCacheStore) &&
39
- # ... to check that we need to call `autoload?` and check if it returns `nil`, meaning it's loaded.
40
- ::ActiveSupport::Cache.autoload?(:RedisCacheStore).nil? &&
38
+ Support.fully_loaded?(::ActiveSupport::Cache, :RedisCacheStore) &&
41
39
  ::ActiveSupport::Cache::RedisCacheStore.instance_methods(false).include?(meth)
42
40
  end
43
41
 
@@ -49,6 +49,19 @@ module Datadog
49
49
  o.default true
50
50
  end
51
51
  end
52
+
53
+ # Specifies which cache stores to trace.
54
+ # Accepts a list, with the same format as `config.cache_store`
55
+ # (e.g. `memory_store`, `file_store`, or symbols like `:file_store`).
56
+ # Defaults to `nil`, which traces all cache stores.
57
+ # @see https://github.com/rails/rails/blob/b7520a13adda46c0cc5f3fb4a4c1726633af2bba/guides/source/caching_with_rails.md?plain=1#L576-L582
58
+ option :cache_store do |o|
59
+ o.type :array, nilable: true
60
+ o.default nil
61
+ o.after_set do |stores|
62
+ stores&.map!(&:to_s) # Convert symbols to strings to match the Rails configuration format
63
+ end
64
+ end
52
65
  end
53
66
  end
54
67
  end
@@ -35,6 +35,16 @@ module Datadog
35
35
  span.type = Tracing::Metadata::Ext::HTTP::TYPE_OUTBOUND
36
36
  span.name = Ext::SPAN_COMMAND
37
37
  span.resource = context.safely(:resource)
38
+
39
+ # Set error on the span if the Response Status Code is in error range
40
+ if Tracing::Metadata::Ext::HTTP::ERROR_RANGE.cover?(context.safely(:status_code))
41
+ # At this point we do not have any additional diagnostics
42
+ # besides the HTTP status code which is recorded in the span tags
43
+ # later in this method.
44
+ # Just set the span as errored.
45
+ span.set_error(nil)
46
+ end
47
+
38
48
  aws_service = span.resource.split('.')[0]
39
49
  span.set_tag(Ext::TAG_AWS_SERVICE, aws_service)
40
50
  params = context.safely(:params)
@@ -26,8 +26,12 @@ module Datadog
26
26
  context.params
27
27
  end
28
28
 
29
+ def http_response
30
+ context.http_response
31
+ end
32
+
29
33
  def status_code
30
- context.http_response.status_code
34
+ http_response.status_code
31
35
  end
32
36
 
33
37
  def http_method
@@ -22,7 +22,7 @@ module Datadog
22
22
  end
23
23
 
24
24
  def configure(options = {})
25
- self.class.options.each do |name, _value|
25
+ self.class.options.each_key do |name|
26
26
  self[name] = options[name] if options.key?(name)
27
27
  end
28
28
 
@@ -110,11 +110,10 @@ module Datadog
110
110
 
111
111
  datadog_tag_request
112
112
 
113
- if Datadog::AppSec::Utils::TraceOperation.appsec_standalone_reject?(datadog_trace)
114
- datadog_trace.sampling_priority = Tracing::Sampling::Ext::Priority::AUTO_REJECT
115
- end
116
-
117
- if datadog_configuration[:distributed_tracing]
113
+ if Tracing::Distributed::PropagationPolicy.enabled?(
114
+ global_config: datadog_configuration,
115
+ trace: datadog_trace
116
+ )
118
117
  @datadog_original_headers ||= {}
119
118
  Contrib::HTTP.inject(datadog_trace, @datadog_original_headers)
120
119
  self.headers = @datadog_original_headers
@@ -30,10 +30,12 @@ module Datadog
30
30
  trace = Tracing.active_trace
31
31
  datum[:datadog_span] = span
32
32
  annotate!(span, datum)
33
- if Datadog::AppSec::Utils::TraceOperation.appsec_standalone_reject?(trace)
34
- trace.sampling_priority = Tracing::Sampling::Ext::Priority::AUTO_REJECT
33
+ if Tracing::Distributed::PropagationPolicy.enabled?(
34
+ global_config: @options,
35
+ trace: trace
36
+ )
37
+ propagate!(trace, span, datum)
35
38
  end
36
- propagate!(trace, span, datum) if distributed_tracing?
37
39
 
38
40
  span
39
41
  end
@@ -48,6 +48,7 @@ module Datadog
48
48
 
49
49
  module Messaging
50
50
  TAG_SYSTEM = 'messaging.system'
51
+ TAG_DESTINATION = 'messaging.destination'
51
52
  PEER_SERVICE_SOURCES = Array[Tracing::Metadata::Ext::NET::TAG_DESTINATION_NAME,
52
53
  Tracing::Metadata::Ext::TAG_PEER_HOSTNAME,
53
54
  Tracing::Metadata::Ext::NET::TAG_TARGET_HOST,].freeze
@@ -29,10 +29,12 @@ module Datadog
29
29
 
30
30
  Tracing.trace(Ext::SPAN_REQUEST, on_error: request_options[:on_error]) do |span, trace|
31
31
  annotate!(span, env, request_options)
32
- if Datadog::AppSec::Utils::TraceOperation.appsec_standalone_reject?(trace)
33
- trace.sampling_priority = Tracing::Sampling::Ext::Priority::AUTO_REJECT
32
+ if Tracing::Distributed::PropagationPolicy.enabled?(
33
+ global_config: request_options,
34
+ trace: trace
35
+ )
36
+ propagate!(trace, span, env)
34
37
  end
35
- propagate!(trace, span, env) if request_options[:distributed_tracing] && Tracing.enabled?
36
38
  app.call(env).on_complete { |resp| handle_response(span, resp, request_options) }
37
39
  end
38
40
  end
@@ -81,7 +81,13 @@ module Datadog
81
81
  # Set analytics sample rate
82
82
  Contrib::Analytics.set_sample_rate(span, analytics_sample_rate) if analytics_enabled?
83
83
 
84
- GRPC.inject(trace, metadata) if distributed_tracing?
84
+ if Tracing::Distributed::PropagationPolicy.enabled?(
85
+ pin_config: Datadog.configuration_for(self),
86
+ global_config: datadog_configuration,
87
+ trace: trace
88
+ )
89
+ GRPC.inject(trace, metadata)
90
+ end
85
91
  Contrib::SpanAttributeSchema.set_peer_service!(span, Ext::PEER_SERVICE_SOURCES)
86
92
  rescue StandardError => e
87
93
  Datadog.logger.debug("GRPC client trace failed: #{e}")
@@ -3,6 +3,7 @@
3
3
  require_relative 'fetcher'
4
4
  require_relative '../../../distributed/b3_multi'
5
5
  require_relative '../../../distributed/b3_single'
6
+ require_relative '../../../distributed/propagation_policy'
6
7
  require_relative '../../../distributed/datadog'
7
8
  require_relative '../../../distributed/none'
8
9
  require_relative '../../../distributed/propagation'
@@ -31,6 +32,8 @@ module Datadog
31
32
  Tracing::Distributed::Datadog.new(fetcher: Fetcher),
32
33
  Tracing::Configuration::Ext::Distributed::PROPAGATION_STYLE_TRACE_CONTEXT =>
33
34
  Tracing::Distributed::TraceContext.new(fetcher: Fetcher),
35
+ Tracing::Configuration::Ext::Distributed::PROPAGATION_STYLE_BAGGAGE =>
36
+ Tracing::Distributed::Baggage.new(fetcher: Fetcher),
34
37
  Tracing::Configuration::Ext::Distributed::PROPAGATION_STYLE_NONE => Tracing::Distributed::None.new
35
38
  },
36
39
  propagation_style_inject: propagation_style_inject,
@@ -27,21 +27,6 @@ module Datadog
27
27
  !!(request[Datadog::Core::Transport::Ext::HTTP::HEADER_META_TRACER_VERSION] ||
28
28
  request[Datadog::Core::Transport::Ext::HTTP::HEADER_DD_INTERNAL_UNTRACED_REQUEST])
29
29
  end
30
-
31
- def should_skip_distributed_tracing?(client_config)
32
- if Datadog.configuration.appsec.standalone.enabled
33
- # Skip distributed tracing so that we don't bill distributed traces in case of absence of
34
- # upstream ASM event (_dd.p.appsec:1) and no local security event (which sets _dd.p.appsec:1 locally).
35
- # If there is an ASM event, we still have to check if distributed tracing is enabled or not
36
- return true unless Tracing.active_trace
37
-
38
- return true if Tracing.active_trace.get_tag(Datadog::AppSec::Ext::TAG_DISTRIBUTED_APPSEC_EVENT) != '1'
39
- end
40
-
41
- return !client_config[:distributed_tracing] if client_config && client_config.key?(:distributed_tracing)
42
-
43
- !Datadog.configuration.tracing[:http][:distributed_tracing]
44
- end
45
30
  end
46
31
  end
47
32
  end
@@ -2,6 +2,7 @@
2
2
 
3
3
  require_relative 'fetcher'
4
4
  require_relative '../../../distributed/propagation'
5
+ require_relative '../../../distributed/propagation_policy'
5
6
  require_relative '../../../distributed/b3_multi'
6
7
  require_relative '../../../distributed/b3_single'
7
8
  require_relative '../../../distributed/datadog'
@@ -30,7 +31,9 @@ module Datadog
30
31
  Tracing::Distributed::Datadog.new(fetcher: Fetcher),
31
32
  Tracing::Configuration::Ext::Distributed::PROPAGATION_STYLE_TRACE_CONTEXT =>
32
33
  Tracing::Distributed::TraceContext.new(fetcher: Fetcher),
33
- Tracing::Configuration::Ext::Distributed::PROPAGATION_STYLE_NONE => Tracing::Distributed::None.new
34
+ Tracing::Configuration::Ext::Distributed::PROPAGATION_STYLE_BAGGAGE =>
35
+ Tracing::Distributed::Baggage.new(fetcher: Fetcher),
36
+ Tracing::Configuration::Ext::Distributed::PROPAGATION_STYLE_NONE => Tracing::Distributed::None.new,
34
37
  },
35
38
  propagation_style_inject: propagation_style_inject,
36
39
  propagation_style_extract: propagation_style_extract,
@@ -30,16 +30,16 @@ module Datadog
30
30
 
31
31
  return super(req, body, &block) if Contrib::HTTP.should_skip_tracing?(req)
32
32
 
33
- Tracing.trace(Ext::SPAN_REQUEST, on_error: method(:annotate_span_with_error!)) do |span, trace|
33
+ Tracing.trace(Ext::SPAN_REQUEST) do |span, trace|
34
34
  span.service = service_name(host, request_options, client_config)
35
35
  span.type = Tracing::Metadata::Ext::HTTP::TYPE_OUTBOUND
36
36
  span.resource = req.method
37
37
 
38
- if Datadog::AppSec::Utils::TraceOperation.appsec_standalone_reject?(trace)
39
- trace.sampling_priority = Tracing::Sampling::Ext::Priority::AUTO_REJECT
40
- end
41
-
42
- if Tracing.enabled? && !Contrib::HTTP.should_skip_distributed_tracing?(client_config)
38
+ if Tracing::Distributed::PropagationPolicy.enabled?(
39
+ pin_config: client_config,
40
+ global_config: Datadog.configuration.tracing[:http],
41
+ trace: trace
42
+ )
43
43
  Contrib::HTTP.inject(trace, req)
44
44
  end
45
45
 
@@ -112,10 +112,6 @@ module Datadog
112
112
  Datadog::Core::Telemetry::Logger.report(e)
113
113
  end
114
114
 
115
- def annotate_span_with_error!(span, error)
116
- span.set_error(error)
117
- end
118
-
119
115
  def set_analytics_sample_rate(span, request_options)
120
116
  return unless analytics_enabled?(request_options)
121
117
 
@@ -25,16 +25,16 @@ module Datadog
25
25
  request_options = datadog_configuration(host)
26
26
  client_config = Datadog.configuration_for(self)
27
27
 
28
- Tracing.trace(Ext::SPAN_REQUEST, on_error: method(:annotate_span_with_error!)) do |span, trace|
28
+ Tracing.trace(Ext::SPAN_REQUEST) do |span, trace|
29
29
  begin
30
30
  span.service = service_name(host, request_options, client_config)
31
31
  span.type = Tracing::Metadata::Ext::HTTP::TYPE_OUTBOUND
32
32
 
33
- if Datadog::AppSec::Utils::TraceOperation.appsec_standalone_reject?(trace)
34
- trace.sampling_priority = Tracing::Sampling::Ext::Priority::AUTO_REJECT
35
- end
36
-
37
- if Tracing.enabled? && !should_skip_distributed_tracing?(client_config)
33
+ if Tracing::Distributed::PropagationPolicy.enabled?(
34
+ pin_config: client_config,
35
+ global_config: Datadog.configuration.tracing[:httpclient],
36
+ trace: trace
37
+ )
38
38
  Contrib::HTTP.inject(trace, req.header)
39
39
  end
40
40
 
@@ -111,10 +111,6 @@ module Datadog
111
111
  Datadog::Core::Telemetry::Logger.report(e)
112
112
  end
113
113
 
114
- def annotate_span_with_error!(span, error)
115
- span.set_error(error)
116
- end
117
-
118
114
  def datadog_configuration(host = :default)
119
115
  Datadog.configuration.tracing[:httpclient, host]
120
116
  end
@@ -123,12 +119,6 @@ module Datadog
123
119
  Contrib::Analytics.enabled?(request_options[:analytics_enabled])
124
120
  end
125
121
 
126
- def should_skip_distributed_tracing?(client_config)
127
- return !client_config[:distributed_tracing] if client_config && client_config.key?(:distributed_tracing)
128
-
129
- !Datadog.configuration.tracing[:httpclient][:distributed_tracing]
130
- end
131
-
132
122
  def set_analytics_sample_rate(span, request_options)
133
123
  return unless analytics_enabled?(request_options)
134
124