datadog 2.39.0 → 2.47.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 (296) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +269 -44
  3. data/README.md +3 -0
  4. data/ext/datadog_profiling_native_extension/NativeExtensionDesign.md +12 -24
  5. data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +256 -193
  6. data/ext/datadog_profiling_native_extension/collectors_discrete_dynamic_sampler.c +1 -5
  7. data/ext/datadog_profiling_native_extension/collectors_gc_profiling_helper.c +0 -2
  8. data/ext/datadog_profiling_native_extension/collectors_idle_sampling_helper.c +19 -20
  9. data/ext/datadog_profiling_native_extension/collectors_idle_sampling_helper.h +5 -1
  10. data/ext/datadog_profiling_native_extension/collectors_stack.c +267 -171
  11. data/ext/datadog_profiling_native_extension/collectors_stack.h +17 -3
  12. data/ext/datadog_profiling_native_extension/collectors_thread_context.c +307 -217
  13. data/ext/datadog_profiling_native_extension/collectors_thread_context.h +10 -5
  14. data/ext/datadog_profiling_native_extension/crashtracking_runtime_stacks.c +5 -4
  15. data/ext/datadog_profiling_native_extension/datadog_ruby_common.c +19 -11
  16. data/ext/datadog_profiling_native_extension/datadog_ruby_common.h +7 -10
  17. data/ext/datadog_profiling_native_extension/extconf.rb +67 -99
  18. data/ext/datadog_profiling_native_extension/heap_recorder.c +353 -257
  19. data/ext/datadog_profiling_native_extension/heap_recorder.h +50 -31
  20. data/ext/datadog_profiling_native_extension/native_extension_helpers.rb +3 -27
  21. data/ext/datadog_profiling_native_extension/private_vm_api_access.c +853 -496
  22. data/ext/datadog_profiling_native_extension/private_vm_api_access.h +42 -15
  23. data/ext/datadog_profiling_native_extension/profiling.c +30 -23
  24. data/ext/datadog_profiling_native_extension/ruby_helpers.c +4 -80
  25. data/ext/datadog_profiling_native_extension/ruby_helpers.h +4 -7
  26. data/ext/datadog_profiling_native_extension/setup_signal_handler.c +0 -2
  27. data/ext/datadog_profiling_native_extension/stack_recorder.c +116 -89
  28. data/ext/datadog_profiling_native_extension/stack_recorder.h +12 -5
  29. data/ext/datadog_profiling_native_extension/time_helpers.c +2 -4
  30. data/ext/datadog_profiling_native_extension/time_helpers.h +15 -15
  31. data/ext/libdatadog_api/datadog_ruby_common.c +19 -11
  32. data/ext/libdatadog_api/datadog_ruby_common.h +7 -10
  33. data/ext/libdatadog_api/di.c +43 -3
  34. data/ext/libdatadog_api/extconf.rb +6 -1
  35. data/ext/libdatadog_api/feature_flags.c +8 -0
  36. data/ext/libdatadog_api/init.c +9 -1
  37. data/ext/libdatadog_api/otel_thread_context.c +274 -0
  38. data/ext/libdatadog_api/otel_thread_context.h +5 -0
  39. data/ext/libdatadog_api/process_discovery.c +15 -1
  40. data/ext/libdatadog_api/trace_exporter.c +2078 -0
  41. data/ext/libdatadog_api/trace_exporter.h +5 -0
  42. data/ext/libdatadog_extconf_helpers.rb +14 -9
  43. data/lib/datadog/ai_guard/component.rb +17 -8
  44. data/lib/datadog/ai_guard/configuration/ext.rb +2 -0
  45. data/lib/datadog/ai_guard/configuration.rb +13 -0
  46. data/lib/datadog/ai_guard/contrib/ruby_llm/chat_instrumentation.rb +48 -55
  47. data/lib/datadog/ai_guard/contrib/ruby_llm/integration.rb +1 -1
  48. data/lib/datadog/ai_guard/contrib/ruby_llm/message_adapter.rb +76 -0
  49. data/lib/datadog/ai_guard/contrib/ruby_llm/patcher.rb +1 -0
  50. data/lib/datadog/ai_guard/contrib/ruby_llm/redaction_change_set.rb +135 -0
  51. data/lib/datadog/ai_guard/evaluation/client.rb +50 -0
  52. data/lib/datadog/ai_guard/evaluation/content_part.rb +12 -0
  53. data/lib/datadog/ai_guard/evaluation/message.rb +25 -7
  54. data/lib/datadog/ai_guard/evaluation/message_builder.rb +31 -0
  55. data/lib/datadog/ai_guard/evaluation/no_op_result.rb +6 -6
  56. data/lib/datadog/ai_guard/evaluation/outcome.rb +24 -0
  57. data/lib/datadog/ai_guard/evaluation/request.rb +8 -64
  58. data/lib/datadog/ai_guard/evaluation/response.rb +33 -0
  59. data/lib/datadog/ai_guard/evaluation/result.rb +11 -18
  60. data/lib/datadog/ai_guard/evaluation/tool_call.rb +15 -2
  61. data/lib/datadog/ai_guard/evaluation.rb +36 -14
  62. data/lib/datadog/ai_guard/ext.rb +4 -1
  63. data/lib/datadog/ai_guard/{api_client.rb → http_client.rb} +7 -5
  64. data/lib/datadog/ai_guard/metrics/telemetry.rb +43 -0
  65. data/lib/datadog/ai_guard/redaction/replacements.rb +97 -0
  66. data/lib/datadog/ai_guard/redaction/result.rb +29 -0
  67. data/lib/datadog/ai_guard/redaction.rb +80 -0
  68. data/lib/datadog/ai_guard.rb +58 -57
  69. data/lib/datadog/appsec/actions_handler/serializable_backtrace.rb +21 -42
  70. data/lib/datadog/appsec/api_security/endpoint_collection/grape_route_serializer.rb +1 -1
  71. data/lib/datadog/appsec/api_security/endpoint_collection/rails_route_serializer.rb +1 -1
  72. data/lib/datadog/appsec/api_security/endpoint_collection/sinatra_route_serializer.rb +1 -1
  73. data/lib/datadog/appsec/assets/blocked.html +1 -108
  74. data/lib/datadog/appsec/configuration.rb +11 -2
  75. data/lib/datadog/appsec/context.rb +1 -1
  76. data/lib/datadog/appsec/contrib/active_record/instrumentation.rb +1 -1
  77. data/lib/datadog/appsec/contrib/aws_lambda/waf_addresses.rb +2 -2
  78. data/lib/datadog/appsec/contrib/devise/configuration.rb +1 -1
  79. data/lib/datadog/appsec/contrib/devise/patcher.rb +1 -1
  80. data/lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb +2 -2
  81. data/lib/datadog/appsec/contrib/faraday/ssrf_detection_middleware.rb +2 -2
  82. data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +1 -1
  83. data/lib/datadog/appsec/contrib/rack/ext.rb +2 -2
  84. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +2 -2
  85. data/lib/datadog/appsec/contrib/rack/patcher.rb +1 -1
  86. data/lib/datadog/appsec/contrib/rack/request_body_middleware.rb +6 -3
  87. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +30 -3
  88. data/lib/datadog/appsec/contrib/rails/patches/render_to_body_patch.rb +8 -7
  89. data/lib/datadog/appsec/contrib/rails/request_middleware.rb +2 -1
  90. data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +2 -2
  91. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +15 -3
  92. data/lib/datadog/appsec/contrib/sinatra/patches/json_patch.rb +8 -7
  93. data/lib/datadog/appsec/contrib/sinatra/request_middleware.rb +2 -1
  94. data/lib/datadog/appsec/processor/rule_loader.rb +12 -12
  95. data/lib/datadog/appsec/response.rb +1 -1
  96. data/lib/datadog/appsec/route_normalizer/route_pattern.rb +3 -3
  97. data/lib/datadog/appsec/security_engine/engine.rb +5 -4
  98. data/lib/datadog/core/configuration/components.rb +50 -19
  99. data/lib/datadog/core/configuration/components_state.rb +8 -1
  100. data/lib/datadog/core/configuration/option_definition.rb +1 -1
  101. data/lib/datadog/core/configuration/options.rb +1 -1
  102. data/lib/datadog/core/configuration/settings.rb +38 -43
  103. data/lib/datadog/core/configuration/supported_configurations.rb +18 -2
  104. data/lib/datadog/core/crashtracking/component.rb +5 -1
  105. data/lib/datadog/core/diagnostics/environment_logger.rb +36 -1
  106. data/lib/datadog/core/environment/gc.rb +1 -1
  107. data/lib/datadog/core/environment/vm_cache.rb +1 -1
  108. data/lib/datadog/core/environment/yjit.rb +2 -2
  109. data/lib/datadog/core/metrics/helpers.rb +1 -1
  110. data/lib/datadog/core/metrics/options.rb +2 -2
  111. data/lib/datadog/core/process_discovery.rb +6 -2
  112. data/lib/datadog/core/remote/client/capabilities.rb +32 -21
  113. data/lib/datadog/core/remote/client.rb +45 -4
  114. data/lib/datadog/core/remote/component.rb +30 -7
  115. data/lib/datadog/core/remote/configuration/repository.rb +2 -2
  116. data/lib/datadog/core/remote/dispatcher.rb +47 -6
  117. data/lib/datadog/core/remote/worker.rb +8 -0
  118. data/lib/datadog/core/telemetry/configuration_value.rb +38 -0
  119. data/lib/datadog/core/telemetry/event/app_client_configuration_change.rb +3 -1
  120. data/lib/datadog/core/telemetry/event/app_endpoints_loaded.rb +1 -1
  121. data/lib/datadog/core/telemetry/event/app_started.rb +5 -24
  122. data/lib/datadog/core/telemetry/event/generate_metrics.rb +1 -1
  123. data/lib/datadog/core/telemetry/event/log.rb +2 -2
  124. data/lib/datadog/core/telemetry/event/synth_app_client_configuration_change.rb +1 -1
  125. data/lib/datadog/core/telemetry/metric.rb +2 -2
  126. data/lib/datadog/core/telemetry/request.rb +2 -2
  127. data/lib/datadog/core/transport/http.rb +1 -1
  128. data/lib/datadog/core/transport/transport.rb +1 -1
  129. data/lib/datadog/core/utils/at_fork_monkey_patch.rb +170 -18
  130. data/lib/datadog/core/utils/sequence.rb +3 -6
  131. data/lib/datadog/core/utils/time.rb +16 -54
  132. data/lib/datadog/core/workers/runtime_metrics.rb +1 -1
  133. data/lib/datadog/data_streams/pathway_context.rb +20 -22
  134. data/lib/datadog/data_streams/processor.rb +45 -14
  135. data/lib/datadog/di/boot.rb +1 -0
  136. data/lib/datadog/di/capture_expression_evaluator/result.rb +30 -0
  137. data/lib/datadog/di/capture_expression_evaluator.rb +39 -9
  138. data/lib/datadog/di/component.rb +108 -3
  139. data/lib/datadog/di/configuration.rb +53 -2
  140. data/lib/datadog/di/context.rb +7 -2
  141. data/lib/datadog/di/contrib/active_record.rb +8 -2
  142. data/lib/datadog/di/el/compiler.rb +88 -12
  143. data/lib/datadog/di/el/evaluator.rb +82 -2
  144. data/lib/datadog/di/el/expression.rb +13 -2
  145. data/lib/datadog/di/evaluation_failure.rb +28 -0
  146. data/lib/datadog/di/guardrails_telemetry/reason.rb +87 -0
  147. data/lib/datadog/di/guardrails_telemetry.rb +203 -0
  148. data/lib/datadog/di/instrumenter.rb +106 -15
  149. data/lib/datadog/di/logger.rb +32 -10
  150. data/lib/datadog/di/probe.rb +9 -1
  151. data/lib/datadog/di/probe_builder.rb +7 -6
  152. data/lib/datadog/di/probe_manager.rb +56 -8
  153. data/lib/datadog/di/probe_notification_builder.rb +31 -28
  154. data/lib/datadog/di/probe_notifier_worker.rb +56 -6
  155. data/lib/datadog/di/proc_responder.rb +1 -1
  156. data/lib/datadog/di/remote.rb +49 -5
  157. data/lib/datadog/di/serializer.rb +172 -55
  158. data/lib/datadog/di/snapshot_event.rb +38 -0
  159. data/lib/datadog/di/transport/http.rb +13 -3
  160. data/lib/datadog/di/transport/input.rb +32 -7
  161. data/lib/datadog/error_tracking/component.rb +1 -1
  162. data/lib/datadog/kit/appsec/events/v2.rb +2 -2
  163. data/lib/datadog/open_feature/activation.rb +268 -0
  164. data/lib/datadog/open_feature/agentless/configuration_source.rb +246 -0
  165. data/lib/datadog/open_feature/agentless/parser.rb +43 -0
  166. data/lib/datadog/open_feature/agentless/response.rb +19 -0
  167. data/lib/datadog/open_feature/agentless/transport.rb +103 -0
  168. data/lib/datadog/open_feature/component.rb +85 -13
  169. data/lib/datadog/open_feature/configuration/agentless_endpoint.rb +90 -0
  170. data/lib/datadog/open_feature/configuration/source/resolution.rb +22 -0
  171. data/lib/datadog/open_feature/configuration/source.rb +43 -0
  172. data/lib/datadog/open_feature/configuration.rb +124 -0
  173. data/lib/datadog/open_feature/evaluation_engine.rb +29 -3
  174. data/lib/datadog/open_feature/exposures/batch_builder.rb +1 -1
  175. data/lib/datadog/open_feature/exposures/event.rb +15 -8
  176. data/lib/datadog/open_feature/ext.rb +19 -0
  177. data/lib/datadog/open_feature/flag_evaluation/aggregator.rb +236 -80
  178. data/lib/datadog/open_feature/flag_evaluation/writer.rb +179 -68
  179. data/lib/datadog/open_feature/hooks/evaluation_telemetry_opt_out_hook.rb +25 -0
  180. data/lib/datadog/open_feature/hooks/flag_eval_evp_hook.rb +24 -21
  181. data/lib/datadog/open_feature/native_evaluator.rb +20 -6
  182. data/lib/datadog/open_feature/noop_evaluator.rb +5 -0
  183. data/lib/datadog/open_feature/provider.rb +315 -10
  184. data/lib/datadog/open_feature/remote.rb +5 -5
  185. data/lib/datadog/open_feature/transport.rb +5 -0
  186. data/lib/datadog/open_feature.rb +31 -1
  187. data/lib/datadog/opentelemetry/sdk/propagator.rb +1 -1
  188. data/lib/datadog/opentelemetry/signal_configuration.rb +13 -9
  189. data/lib/datadog/opentelemetry/trace.rb +3 -0
  190. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +10 -2
  191. data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +5 -7
  192. data/lib/datadog/profiling/collectors/info.rb +40 -13
  193. data/lib/datadog/profiling/collectors/thread_context.rb +6 -17
  194. data/lib/datadog/profiling/component.rb +33 -39
  195. data/lib/datadog/profiling/exporter.rb +10 -10
  196. data/lib/datadog/profiling/tasks/exec.rb +1 -1
  197. data/lib/datadog/profiling.rb +4 -0
  198. data/lib/datadog/symbol_database/extractor.rb +89 -107
  199. data/lib/datadog/tracing/component.rb +44 -2
  200. data/lib/datadog/tracing/configuration/dynamic/option.rb +4 -0
  201. data/lib/datadog/tracing/configuration/dynamic.rb +5 -3
  202. data/lib/datadog/tracing/configuration/ext.rb +4 -0
  203. data/lib/datadog/tracing/configuration/settings.rb +36 -0
  204. data/lib/datadog/tracing/context.rb +24 -2
  205. data/lib/datadog/tracing/context_provider.rb +17 -5
  206. data/lib/datadog/tracing/contrib/action_cable/events.rb +1 -1
  207. data/lib/datadog/tracing/contrib/action_mailer/events.rb +1 -1
  208. data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +2 -2
  209. data/lib/datadog/tracing/contrib/action_view/events.rb +1 -1
  210. data/lib/datadog/tracing/contrib/active_model_serializers/events.rb +1 -1
  211. data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +1 -1
  212. data/lib/datadog/tracing/contrib/active_record/events/sql.rb +1 -0
  213. data/lib/datadog/tracing/contrib/active_record/events.rb +1 -1
  214. data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +2 -2
  215. data/lib/datadog/tracing/contrib/aws/ext.rb +1 -1
  216. data/lib/datadog/tracing/contrib/aws/services.rb +1 -1
  217. data/lib/datadog/tracing/contrib/elasticsearch/quantize.rb +1 -1
  218. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +10 -5
  219. data/lib/datadog/tracing/contrib/excon/middleware.rb +10 -3
  220. data/lib/datadog/tracing/contrib/ext.rb +3 -3
  221. data/lib/datadog/tracing/contrib/faraday/middleware.rb +10 -4
  222. data/lib/datadog/tracing/contrib/grape/endpoint.rb +32 -5
  223. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +1 -1
  224. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +1 -1
  225. data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +1 -1
  226. data/lib/datadog/tracing/contrib/hanami/router_tracing.rb +2 -1
  227. data/lib/datadog/tracing/contrib/http/instrumentation.rb +16 -1
  228. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +8 -2
  229. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +10 -4
  230. data/lib/datadog/tracing/contrib/kafka/events/connection/request.rb +4 -0
  231. data/lib/datadog/tracing/contrib/kafka/events/produce_operation/send_messages.rb +7 -2
  232. data/lib/datadog/tracing/contrib/kafka/events/producer/deliver_messages.rb +7 -2
  233. data/lib/datadog/tracing/contrib/kafka/events.rb +1 -1
  234. data/lib/datadog/tracing/contrib/karafka/distributed/propagation.rb +1 -1
  235. data/lib/datadog/tracing/contrib/mongodb/parsers.rb +1 -1
  236. data/lib/datadog/tracing/contrib/opensearch/ext.rb +1 -1
  237. data/lib/datadog/tracing/contrib/opensearch/quantize.rb +1 -1
  238. data/lib/datadog/tracing/contrib/patchable.rb +1 -1
  239. data/lib/datadog/tracing/contrib/patcher.rb +1 -1
  240. data/lib/datadog/tracing/contrib/que/tracer.rb +1 -1
  241. data/lib/datadog/tracing/contrib/racecar/events.rb +1 -1
  242. data/lib/datadog/tracing/contrib/rack/configuration/settings.rb +1 -1
  243. data/lib/datadog/tracing/contrib/rack/header_tagging.rb +1 -1
  244. data/lib/datadog/tracing/contrib/rack/patcher.rb +1 -1
  245. data/lib/datadog/tracing/contrib/rack/trace_proxy_middleware.rb +1 -1
  246. data/lib/datadog/tracing/contrib/redis/configuration/resolver.rb +1 -1
  247. data/lib/datadog/tracing/contrib/redis/quantize.rb +36 -2
  248. data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +9 -3
  249. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +10 -3
  250. data/lib/datadog/tracing/contrib/sequel/database.rb +1 -5
  251. data/lib/datadog/tracing/contrib/sequel/jdbc_connection_string.rb +140 -0
  252. data/lib/datadog/tracing/contrib/sequel/utils.rb +50 -63
  253. data/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb +1 -1
  254. data/lib/datadog/tracing/contrib/sinatra/configuration/settings.rb +1 -1
  255. data/lib/datadog/tracing/contrib/sneakers/tracer.rb +1 -1
  256. data/lib/datadog/tracing/contrib/utils/quantization/hash_formatter.rb +1 -1
  257. data/lib/datadog/tracing/contrib/utils/quantization/http.rb +108 -3
  258. data/lib/datadog/tracing/contrib/waterdrop/distributed/propagation.rb +1 -1
  259. data/lib/datadog/tracing/correlation.rb +2 -2
  260. data/lib/datadog/tracing/diagnostics/environment_logger.rb +3 -2
  261. data/lib/datadog/tracing/distributed/baggage.rb +1 -3
  262. data/lib/datadog/tracing/distributed/datadog.rb +3 -3
  263. data/lib/datadog/tracing/distributed/propagation.rb +3 -0
  264. data/lib/datadog/tracing/distributed/propagation_policy.rb +5 -0
  265. data/lib/datadog/tracing/distributed/trace_context.rb +14 -271
  266. data/lib/datadog/tracing/distributed/trace_state/datadog.rb +233 -0
  267. data/lib/datadog/tracing/distributed/trace_state/ext.rb +44 -0
  268. data/lib/datadog/tracing/distributed/trace_state/open_telemetry.rb +156 -0
  269. data/lib/datadog/tracing/distributed/trace_state.rb +121 -0
  270. data/lib/datadog/tracing/metadata/ext.rb +3 -0
  271. data/lib/datadog/tracing/metadata/tagging.rb +1 -1
  272. data/lib/datadog/tracing/otel_thread_context.rb +97 -0
  273. data/lib/datadog/tracing/remote.rb +236 -37
  274. data/lib/datadog/tracing/sampling/rule_sampler.rb +2 -0
  275. data/lib/datadog/tracing/span.rb +1 -1
  276. data/lib/datadog/tracing/span_operation.rb +1 -1
  277. data/lib/datadog/tracing/sync_writer.rb +8 -3
  278. data/lib/datadog/tracing/trace_digest.rb +22 -4
  279. data/lib/datadog/tracing/trace_operation.rb +22 -10
  280. data/lib/datadog/tracing/tracer.rb +28 -7
  281. data/lib/datadog/tracing/transport/http/telemetry.rb +94 -0
  282. data/lib/datadog/tracing/transport/http/traces.rb +2 -0
  283. data/lib/datadog/tracing/transport/io/traces.rb +1 -1
  284. data/lib/datadog/tracing/transport/native/response.rb +71 -0
  285. data/lib/datadog/tracing/transport/native/telemetry.rb +17 -0
  286. data/lib/datadog/tracing/transport/native.rb +395 -0
  287. data/lib/datadog/tracing/transport/span_events_negotiation.rb +41 -0
  288. data/lib/datadog/tracing/transport/telemetry.rb +62 -0
  289. data/lib/datadog/tracing/transport/trace_formatter.rb +14 -4
  290. data/lib/datadog/tracing/transport/traces.rb +85 -38
  291. data/lib/datadog/tracing/writer.rb +17 -4
  292. data/lib/datadog/version.rb +1 -1
  293. metadata +51 -13
  294. data/lib/datadog/ai_guard/evaluation/content_builder.rb +0 -31
  295. data/lib/datadog/appsec/utils/hash_coercion.rb +0 -23
  296. data/lib/datadog/tracing/distributed/datadog_tags_codec.rb +0 -69
@@ -2,6 +2,8 @@
2
2
 
3
3
  require_relative "../core/semaphore"
4
4
  require_relative "fatal_exceptions"
5
+ require_relative "guardrails_telemetry"
6
+ require_relative "snapshot_event"
5
7
 
6
8
  module Datadog
7
9
  module DI
@@ -24,14 +26,23 @@ module Datadog
24
26
  #
25
27
  # @api private
26
28
  class ProbeNotifierWorker
29
+ # Initializes the background worker.
30
+ #
31
+ # @param settings [Datadog::Core::Configuration::Settings] tracer settings
32
+ # @param logger [DI::Logger] logger for worker diagnostics
33
+ # @param agent_settings [Datadog::Core::Configuration::AgentSettings] agent connection settings for the transports
27
34
  # @param probe_repository [ProbeRepository] Repository for looking up probes.
28
35
  # Used for handling serialization errors (disabling affected probes).
29
36
  # @param probe_notification_builder [ProbeNotificationBuilder] Builder for
30
37
  # creating status notifications. Used for reporting ERROR status.
38
+ # @param telemetry [Datadog::Core::Telemetry::Component, nil] component worker errors are reported through
39
+ # @param guardrails_telemetry [GuardrailsTelemetry] emitter for the canonical
40
+ # guardrails drop metric at the queue-full admission drop
31
41
  def initialize(settings, logger, agent_settings:,
32
- probe_repository:, probe_notification_builder:, telemetry: nil)
42
+ probe_repository:, probe_notification_builder:, guardrails_telemetry:, telemetry: nil)
33
43
  @settings = settings
34
44
  @telemetry = telemetry
45
+ @guardrails_telemetry = guardrails_telemetry
35
46
  @status_queue = []
36
47
  @snapshot_queue = []
37
48
  @agent_settings = agent_settings
@@ -42,6 +53,8 @@ module Datadog
42
53
  @sleep_remaining = nil
43
54
  @wake_scheduled = false
44
55
  @thread = nil
56
+ @status_transport = nil
57
+ @snapshot_transport = nil
45
58
  @pid = nil
46
59
  @flush = 0
47
60
  @probe_repository = probe_repository
@@ -51,6 +64,9 @@ module Datadog
51
64
  attr_reader :settings
52
65
  attr_reader :logger
53
66
  attr_reader :telemetry
67
+ # The guardrails metric emitter.
68
+ # @return [GuardrailsTelemetry]
69
+ attr_reader :guardrails_telemetry
54
70
  attr_reader :agent_settings
55
71
  attr_reader :probe_repository
56
72
  attr_reader :probe_notification_builder
@@ -188,6 +204,9 @@ module Datadog
188
204
 
189
205
  attr_reader :last_sent
190
206
 
207
+ # Builds and memoizes the diagnostics transport for status events.
208
+ #
209
+ # @return [DI::Transport::Diagnostics::Transport]
191
210
  def status_transport
192
211
  @status_transport ||= DI::Transport::HTTP.diagnostics(agent_settings: agent_settings, logger: logger)
193
212
  end
@@ -196,8 +215,12 @@ module Datadog
196
215
  status_transport.send_diagnostics(batch)
197
216
  end
198
217
 
218
+ # Builds and memoizes the snapshot input transport.
219
+ #
220
+ # @return [DI::Transport::Input::Transport]
199
221
  def snapshot_transport
200
- @snapshot_transport ||= DI::Transport::HTTP.input(agent_settings: agent_settings, logger: logger, telemetry: telemetry)
222
+ @snapshot_transport ||= DI::Transport::HTTP.input(agent_settings: agent_settings, logger: logger,
223
+ telemetry: telemetry, guardrails_telemetry: guardrails_telemetry,)
201
224
  end
202
225
 
203
226
  # Sends a batch of snapshot payloads to the agent.
@@ -206,7 +229,7 @@ module Datadog
206
229
  # serialization failures via callback. This allows healthy probes
207
230
  # to continue working even when one probe produces un-serializable data.
208
231
  #
209
- # @param batch [Array<Hash>] Array of snapshot payload hashes
232
+ # @param batch [Array<SnapshotEvent>] the snapshot events queued for sending
210
233
  def do_send_snapshot(batch)
211
234
  snapshot_transport.send_input(batch, tags, on_serialization_error: method(:handle_serialization_error))
212
235
  end
@@ -259,6 +282,12 @@ module Datadog
259
282
  # Signals the background thread to wake up (and do the sending)
260
283
  # if it has been more than 1 second since the last send of the same
261
284
  # event type.
285
+ #
286
+ # @param event [Hash] the status or snapshot payload to enqueue
287
+ # @param probe [Probe, nil] the probe the payload belongs to, for status log
288
+ # attribution, the queue-full drop event type, and the queued
289
+ # snapshot event's guardrails event type
290
+ # @return [void]
262
291
  define_method("add_#{event_type}") do |event, probe: nil|
263
292
  # Enqueueing reads DI configuration and writes debug/trace logs, both
264
293
  # of which can call stdlib methods (e.g. Set#include? via the
@@ -275,12 +304,28 @@ module Datadog
275
304
  begin
276
305
  @lock.synchronize do
277
306
  queue = send("#{event_type}_queue")
307
+ guardrails_event_type = if event_type == :snapshot
308
+ probe ? GuardrailsTelemetry.probe_event_type_tag(probe) : GuardrailsTelemetry::EVENT_TYPE_SNAPSHOT
309
+ end
278
310
  if queue.length > settings.dynamic_instrumentation.internal.snapshot_queue_capacity
279
311
  if event_type == :status && probe
280
312
  status = event.dig(:debugger, :diagnostics, :status)
281
- logger.debug { "di: dropping status for #{probe.type} probe at #{probe.location} (#{probe.id}): #{status} because queue is full" }
313
+ logger.debug do
314
+ "di: dropping status for #{probe.type} probe at #{probe.location}" \
315
+ " (#{probe.id}): #{status} because queue is full" \
316
+ " (#{GuardrailsTelemetry::Reason::QUEUE_FULL})"
317
+ end
282
318
  else
283
- logger.debug { "di: #{self.class.name}: dropping #{event_type} event because queue is full" }
319
+ logger.debug do
320
+ "di: #{self.class.name}: dropping #{event_type} event because queue is full" \
321
+ " (#{GuardrailsTelemetry::Reason::QUEUE_FULL})"
322
+ end
323
+ end
324
+ if event_type == :snapshot
325
+ guardrails_telemetry.dropped(
326
+ reason: GuardrailsTelemetry::Reason::QUEUE_FULL,
327
+ event_type: guardrails_event_type,
328
+ )
284
329
  end
285
330
  else
286
331
  if event_type == :status && probe
@@ -289,7 +334,11 @@ module Datadog
289
334
  else
290
335
  logger.trace { "di: #{self.class.name}: queueing #{event_type} event" }
291
336
  end
292
- queue << event
337
+ queue << if event_type == :snapshot
338
+ SnapshotEvent.new(payload: event, event_type: guardrails_event_type)
339
+ else
340
+ event
341
+ end
293
342
  end
294
343
  end
295
344
 
@@ -307,6 +356,7 @@ module Datadog
307
356
  # Worker could be not running if the process forked - check and
308
357
  # start it again in this case.
309
358
  start
359
+ nil
310
360
  ensure
311
361
  Datadog::DI.leave_probe unless was_in_probe
312
362
  end
@@ -20,7 +20,7 @@ module Datadog
20
20
  executed_proc.call(context)
21
21
  end
22
22
 
23
- def probe_condition_evaluation_failed_callback(context, exc)
23
+ def probe_condition_evaluation_failed_callback(context, _expr, exc)
24
24
  if failed_proc.nil?
25
25
  raise NotImplementedError, "Failed proc not provided"
26
26
  end
@@ -22,7 +22,7 @@ module Datadog
22
22
  # when DI is explicitly disabled, or the runtime cannot run DI
23
23
  # (JRuby, Ruby 2.5), that block — including this bit — is skipped.
24
24
  # The enable signal itself is delivered in APM_TRACING payloads and
25
- # routed here by Tracing::Remote.process_config.
25
+ # routed here by Tracing::Remote.merge_and_apply_configs.
26
26
  CAPABILITIES = [
27
27
  1 << 38, # APM_TRACING_ENABLE_DYNAMIC_INSTRUMENTATION: Implicit DI enablement
28
28
  ].freeze
@@ -37,7 +37,7 @@ module Datadog
37
37
 
38
38
  # Entry point for the RC-driven DI enable/disable path.
39
39
  #
40
- # Invoked from {Datadog::Tracing::Remote.process_config} when an
40
+ # Invoked from {Datadog::Tracing::Remote.merge_and_apply_configs} when an
41
41
  # APM_TRACING payload carries `dynamic_instrumentation_enabled`. Runs
42
42
  # on the remote-config thread; never raises.
43
43
  #
@@ -45,7 +45,7 @@ module Datadog
45
45
  # false to stop it. The `DD_DYNAMIC_INSTRUMENTATION_ENABLED=false`
46
46
  # env var blocks an enable here (see {.explicitly_disabled?}).
47
47
  # @param repository [Datadog::Core::Remote::Configuration::Repository, nil]
48
- # the RC repository, passed by {Datadog::Tracing::Remote.process_config}
48
+ # the RC repository, passed by {Datadog::Tracing::Remote.apply_lib_config}
49
49
  # so that a stopped->started transition can reconcile against probes that
50
50
  # were delivered in an earlier poll. nil when called outside the RC
51
51
  # dispatch path (e.g. unit tests), in which case no reconcile happens.
@@ -98,6 +98,9 @@ module Datadog
98
98
  # and DI.activate_tracking is defined.
99
99
  DI.activate_tracking
100
100
  was_started = component.started?
101
+ if repository && !was_started
102
+ remove_withdrawn_probes(repository, component)
103
+ end
101
104
  component.start!
102
105
  # A probe delivered in an earlier poll while the component was stopped
103
106
  # was dropped by #receivers (which ignores changes while !started?) and
@@ -145,7 +148,9 @@ module Datadog
145
148
  # DEV: Apply this refactor to AppSec as well if implemented.
146
149
 
147
150
  component = DI.component
148
- if component&.started?
151
+ if changes.empty?
152
+ remove_withdrawn_probes(repository, component) if component
153
+ elsif component&.started?
149
154
  changes.each do |change|
150
155
  case change.type
151
156
  when :insert
@@ -176,7 +181,7 @@ module Datadog
176
181
 
177
182
  def receiver(products = [PRODUCT], &block)
178
183
  matcher = Core::Remote::Dispatcher::Matcher::Product.new(products)
179
- [Core::Remote::Dispatcher::Receiver.new(matcher, &block)]
184
+ [Core::Remote::Dispatcher::Receiver.new(matcher, initial_reconcile: true, &block)]
180
185
  end
181
186
 
182
187
  private
@@ -266,6 +271,45 @@ module Datadog
266
271
  end
267
272
  end
268
273
 
274
+ # Removes every probe the component tracks whose id is absent from all
275
+ # LIVE_DEBUGGING contents in the repository. Reconciles backend deletions that
276
+ # produced no delete change for {.receivers}. Skips removal while a
277
+ # LIVE_DEBUGGING content fails to parse, because that content can hold any
278
+ # tracked probe.
279
+ def remove_withdrawn_probes(repository, component)
280
+ # @type var present_probe_ids: Array[String]
281
+ present_probe_ids = []
282
+ content_failed_to_parse = false
283
+ repository.contents.each do |content|
284
+ next unless content.path.product == PRODUCT
285
+
286
+ begin
287
+ present_probe_ids << parse_content(content)["id"]
288
+ rescue => exc
289
+ component.logger.debug do
290
+ "di: skipping withdrawn-probe reconcile, a LIVE_DEBUGGING content failed to parse: " \
291
+ "#{exc.class}: #{exc.message}"
292
+ end
293
+ content_failed_to_parse = true
294
+ break
295
+ end
296
+ end
297
+ return if content_failed_to_parse
298
+
299
+ probe_repository = component.probe_manager.probe_repository
300
+ tracked_probe_ids = probe_repository.installed_probes.keys | probe_repository.pending_probes.keys
301
+ (tracked_probe_ids - present_probe_ids).each do |probe_id|
302
+ component.logger.trace { "di: removing probe #{probe_id} withdrawn from remote configuration" }
303
+ component.probe_manager.remove_probe(probe_id)
304
+ rescue Exception => exc # standard:disable Lint/RescueException
305
+ Datadog::DI.reraise_if_fatal(exc)
306
+ raise if component.settings.dynamic_instrumentation.internal.propagate_all_exceptions
307
+
308
+ component.logger.debug { "di: error removing withdrawn probe #{probe_id}: #{exc.class}: #{exc.message}" }
309
+ component.telemetry&.report(exc, description: "Error removing withdrawn probe")
310
+ end
311
+ end
312
+
269
313
  def probe_known?(probe_id, component)
270
314
  repo = component.probe_manager.probe_repository
271
315
  !!(repo.find_installed(probe_id) ||