datadog 2.46.0 → 2.48.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 (286) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +56 -2
  3. data/LICENSE-3rdparty.csv +1 -0
  4. data/ext/datadog_profiling_native_extension/collectors_stack.c +143 -86
  5. data/ext/datadog_profiling_native_extension/collectors_stack.h +9 -1
  6. data/ext/datadog_profiling_native_extension/collectors_thread_context.c +6 -1
  7. data/ext/datadog_profiling_native_extension/extconf.rb +7 -13
  8. data/ext/datadog_profiling_native_extension/native_extension_helpers.rb +3 -3
  9. data/ext/datadog_profiling_native_extension/private_vm_api_access.c +67 -14
  10. data/ext/datadog_profiling_native_extension/private_vm_api_access.h +8 -1
  11. data/ext/datadog_profiling_native_extension/profiling.c +1 -1
  12. data/ext/libdatadog_api/extconf.rb +9 -7
  13. data/ext/libdatadog_api/trace_exporter.c +34 -7
  14. data/ext/libdatadog_extconf_helpers.rb +2 -2
  15. data/lib/datadog/ai_guard/component.rb +1 -1
  16. data/lib/datadog/ai_guard/contrib/rack/request_middleware.rb +1 -9
  17. data/lib/datadog/ai_guard/contrib/rails/patcher.rb +1 -1
  18. data/lib/datadog/ai_guard/contrib/ruby_llm/message_adapter.rb +1 -1
  19. data/lib/datadog/ai_guard/contrib/ruby_llm/redaction_change_set.rb +3 -3
  20. data/lib/datadog/ai_guard/evaluation/client.rb +3 -3
  21. data/lib/datadog/ai_guard/evaluation.rb +2 -2
  22. data/lib/datadog/ai_guard/http_client.rb +3 -2
  23. data/lib/datadog/ai_guard/redaction.rb +1 -1
  24. data/lib/datadog/appsec/api_security/endpoint_collection/rails_collector.rb +1 -1
  25. data/lib/datadog/appsec/assets/waf_rules/README.md +3 -3
  26. data/lib/datadog/appsec/assets/waf_rules/recommended.json +5366 -1517
  27. data/lib/datadog/appsec/assets/waf_rules/strict.json +2 -2
  28. data/lib/datadog/appsec/autoload.rb +1 -1
  29. data/lib/datadog/appsec/component.rb +1 -1
  30. data/lib/datadog/appsec/compressed_json.rb +1 -1
  31. data/lib/datadog/appsec/configuration.rb +3 -3
  32. data/lib/datadog/appsec/context.rb +1 -1
  33. data/lib/datadog/appsec/contrib/active_record/instrumentation.rb +11 -1
  34. data/lib/datadog/appsec/contrib/active_record/patcher.rb +12 -4
  35. data/lib/datadog/appsec/contrib/aws_lambda/gateway/watcher.rb +2 -2
  36. data/lib/datadog/appsec/contrib/aws_lambda/waf_addresses.rb +1 -1
  37. data/lib/datadog/appsec/contrib/devise/configuration.rb +1 -1
  38. data/lib/datadog/appsec/contrib/devise/patches/signin_tracking_patch.rb +1 -1
  39. data/lib/datadog/appsec/contrib/devise/patches/signup_tracking_patch.rb +1 -1
  40. data/lib/datadog/appsec/contrib/devise/tracking_middleware.rb +1 -1
  41. data/lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb +1 -1
  42. data/lib/datadog/appsec/contrib/faraday/ssrf_detection_middleware.rb +1 -1
  43. data/lib/datadog/appsec/contrib/graphql/gateway/multiplex.rb +7 -7
  44. data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +1 -1
  45. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +3 -3
  46. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +5 -5
  47. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +31 -4
  48. data/lib/datadog/appsec/contrib/rails/patcher.rb +2 -2
  49. data/lib/datadog/appsec/contrib/rails/patches/render_to_body_patch.rb +8 -7
  50. data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +1 -1
  51. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +17 -5
  52. data/lib/datadog/appsec/contrib/sinatra/patcher.rb +1 -1
  53. data/lib/datadog/appsec/contrib/sinatra/patches/json_patch.rb +8 -7
  54. data/lib/datadog/appsec/metrics/collector.rb +5 -5
  55. data/lib/datadog/appsec/metrics/telemetry_exporter.rb +3 -3
  56. data/lib/datadog/appsec/monitor/gateway/watcher.rb +2 -2
  57. data/lib/datadog/appsec/processor/rule_loader.rb +1 -1
  58. data/lib/datadog/appsec/response.rb +1 -1
  59. data/lib/datadog/appsec/security_engine/engine.rb +8 -7
  60. data/lib/datadog/appsec/security_engine/runner.rb +2 -2
  61. data/lib/datadog/appsec/trace_keeper.rb +1 -1
  62. data/lib/datadog/appsec.rb +1 -1
  63. data/lib/datadog/core/configuration/agent_settings_resolver.rb +14 -13
  64. data/lib/datadog/core/configuration/agentless_settings_resolver.rb +2 -2
  65. data/lib/datadog/core/configuration/components.rb +12 -11
  66. data/lib/datadog/core/configuration/components_state.rb +8 -1
  67. data/lib/datadog/core/configuration/settings.rb +5 -2
  68. data/lib/datadog/core/configuration/supported_configurations.rb +3 -0
  69. data/lib/datadog/core/configuration.rb +2 -2
  70. data/lib/datadog/core/crashtracking/component.rb +1 -1
  71. data/lib/datadog/core/diagnostics/environment_logger.rb +1 -1
  72. data/lib/datadog/core/environment/cgroup.rb +2 -2
  73. data/lib/datadog/core/environment/container.rb +3 -3
  74. data/lib/datadog/core/metrics/client.rb +6 -6
  75. data/lib/datadog/core/process_discovery.rb +1 -1
  76. data/lib/datadog/core/remote/client.rb +44 -3
  77. data/lib/datadog/core/remote/dispatcher.rb +34 -3
  78. data/lib/datadog/core/remote/tie/tracing.rb +4 -3
  79. data/lib/datadog/core/remote/transport/http.rb +2 -2
  80. data/lib/datadog/core/runtime/metrics.rb +14 -14
  81. data/lib/datadog/core/semaphore.rb +3 -1
  82. data/lib/datadog/core/telemetry/event/app_started.rb +9 -9
  83. data/lib/datadog/core/telemetry/logger.rb +1 -1
  84. data/lib/datadog/core/telemetry/logging.rb +1 -1
  85. data/lib/datadog/core/telemetry/request.rb +9 -3
  86. data/lib/datadog/core/telemetry/transport/http.rb +2 -2
  87. data/lib/datadog/core/telemetry/worker.rb +1 -1
  88. data/lib/datadog/core/transport/http/adapters/net.rb +1 -1
  89. data/lib/datadog/core/transport/http/adapters/unix_socket.rb +1 -1
  90. data/lib/datadog/core/transport/http/builder.rb +1 -1
  91. data/lib/datadog/core/transport/http.rb +3 -3
  92. data/lib/datadog/core/utils/at_fork_monkey_patch.rb +2 -2
  93. data/lib/datadog/core/workers/async.rb +1 -1
  94. data/lib/datadog/core/workers/runtime_metrics.rb +2 -2
  95. data/lib/datadog/data_streams/pathway_context.rb +1 -1
  96. data/lib/datadog/data_streams/processor.rb +48 -27
  97. data/lib/datadog/data_streams/transport/http.rb +1 -1
  98. data/lib/datadog/data_streams.rb +16 -0
  99. data/lib/datadog/di/capture_expression_evaluator.rb +48 -11
  100. data/lib/datadog/di/component.rb +73 -2
  101. data/lib/datadog/di/configuration.rb +19 -0
  102. data/lib/datadog/di/contrib/active_record.rb +1 -1
  103. data/lib/datadog/di/el/compiler.rb +4 -4
  104. data/lib/datadog/di/el/evaluator.rb +247 -43
  105. data/lib/datadog/di/el/expression.rb +36 -6
  106. data/lib/datadog/di/error.rb +16 -0
  107. data/lib/datadog/di/guardrails_telemetry/reason.rb +3 -2
  108. data/lib/datadog/di/instrumenter.rb +39 -10
  109. data/lib/datadog/di/probe_notification_builder.rb +58 -10
  110. data/lib/datadog/di/probe_notifier_worker.rb +1 -1
  111. data/lib/datadog/di/remote.rb +46 -2
  112. data/lib/datadog/di/serializer.rb +47 -13
  113. data/lib/datadog/di.rb +27 -0
  114. data/lib/datadog/error_tracking/component.rb +1 -1
  115. data/lib/datadog/error_tracking/configuration.rb +1 -1
  116. data/lib/datadog/kit/appsec/events/v2.rb +6 -6
  117. data/lib/datadog/kit/appsec/events.rb +1 -1
  118. data/lib/datadog/kit/enable_core_dumps.rb +1 -1
  119. data/lib/datadog/kit/identity.rb +1 -1
  120. data/lib/datadog/open_feature/activation.rb +26 -1
  121. data/lib/datadog/open_feature/agentless/configuration_source.rb +94 -15
  122. data/lib/datadog/open_feature/component.rb +22 -2
  123. data/lib/datadog/open_feature/configuration/agentless_endpoint.rb +6 -0
  124. data/lib/datadog/open_feature/configuration.rb +10 -4
  125. data/lib/datadog/open_feature/evaluation_engine.rb +62 -4
  126. data/lib/datadog/open_feature/exposures/buffer.rb +4 -0
  127. data/lib/datadog/open_feature/exposures/reporter.rb +17 -4
  128. data/lib/datadog/open_feature/exposures/worker.rb +37 -6
  129. data/lib/datadog/open_feature/flag_evaluation/aggregator.rb +5 -5
  130. data/lib/datadog/open_feature/flag_evaluation/writer.rb +1 -1
  131. data/lib/datadog/open_feature/hooks/debug_logging_hook.rb +56 -0
  132. data/lib/datadog/open_feature/hooks/evaluation_telemetry_opt_out_hook.rb +25 -0
  133. data/lib/datadog/open_feature/hooks/span_enrichment_hook.rb +2 -2
  134. data/lib/datadog/open_feature/metrics/flag_eval_metrics.rb +1 -1
  135. data/lib/datadog/open_feature/native_evaluator.rb +1 -1
  136. data/lib/datadog/open_feature/noop_evaluator.rb +1 -1
  137. data/lib/datadog/open_feature/provider.rb +69 -12
  138. data/lib/datadog/open_feature/remote.rb +8 -1
  139. data/lib/datadog/open_feature/resolution_details.rb +2 -2
  140. data/lib/datadog/open_feature/transport.rb +6 -6
  141. data/lib/datadog/opentelemetry/api/context.rb +3 -3
  142. data/lib/datadog/opentelemetry/logs.rb +5 -5
  143. data/lib/datadog/opentelemetry/metrics.rb +3 -3
  144. data/lib/datadog/opentelemetry/sdk/propagator.rb +3 -3
  145. data/lib/datadog/opentelemetry/sdk/span_processor.rb +2 -2
  146. data/lib/datadog/opentelemetry/sdk/trace/span.rb +1 -1
  147. data/lib/datadog/profiling/collectors/code_provenance.rb +3 -3
  148. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +4 -4
  149. data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +1 -1
  150. data/lib/datadog/profiling/collectors/info.rb +37 -6
  151. data/lib/datadog/profiling/collectors/thread_context.rb +1 -1
  152. data/lib/datadog/profiling/component.rb +41 -39
  153. data/lib/datadog/profiling/exporter.rb +4 -6
  154. data/lib/datadog/profiling/http_transport.rb +3 -3
  155. data/lib/datadog/profiling/profiler.rb +2 -2
  156. data/lib/datadog/profiling/scheduler.rb +2 -2
  157. data/lib/datadog/profiling/tag_builder.rb +1 -1
  158. data/lib/datadog/symbol_database/extractor.rb +8 -8
  159. data/lib/datadog/symbol_database/uploader.rb +1 -1
  160. data/lib/datadog/tracing/buffer.rb +3 -3
  161. data/lib/datadog/tracing/client_ip.rb +1 -1
  162. data/lib/datadog/tracing/component.rb +15 -10
  163. data/lib/datadog/tracing/configuration/dynamic/option.rb +2 -2
  164. data/lib/datadog/tracing/configuration/ext.rb +2 -0
  165. data/lib/datadog/tracing/configuration/settings.rb +14 -3
  166. data/lib/datadog/tracing/context.rb +1 -1
  167. data/lib/datadog/tracing/context_provider.rb +8 -0
  168. data/lib/datadog/tracing/contrib/action_cable/instrumentation.rb +2 -2
  169. data/lib/datadog/tracing/contrib/active_job/data_streams.rb +27 -2
  170. data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +2 -2
  171. data/lib/datadog/tracing/contrib/active_record/configuration/settings.rb +1 -1
  172. data/lib/datadog/tracing/contrib/active_record/utils.rb +1 -1
  173. data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +1 -1
  174. data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +1 -1
  175. data/lib/datadog/tracing/contrib/active_support/notifications/subscriber.rb +2 -2
  176. data/lib/datadog/tracing/contrib/active_support/notifications/subscription.rb +2 -2
  177. data/lib/datadog/tracing/contrib/aws/configuration/settings.rb +1 -1
  178. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +1 -1
  179. data/lib/datadog/tracing/contrib/dalli/configuration/settings.rb +1 -1
  180. data/lib/datadog/tracing/contrib/dalli/instrumentation.rb +1 -1
  181. data/lib/datadog/tracing/contrib/delayed_job/plugin.rb +2 -2
  182. data/lib/datadog/tracing/contrib/elasticsearch/configuration/settings.rb +1 -1
  183. data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +3 -3
  184. data/lib/datadog/tracing/contrib/ethon/configuration/settings.rb +1 -1
  185. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +17 -12
  186. data/lib/datadog/tracing/contrib/ethon/multi_patch.rb +1 -1
  187. data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +1 -1
  188. data/lib/datadog/tracing/contrib/excon/middleware.rb +16 -9
  189. data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +1 -1
  190. data/lib/datadog/tracing/contrib/faraday/middleware.rb +14 -8
  191. data/lib/datadog/tracing/contrib/grape/endpoint.rb +4 -4
  192. data/lib/datadog/tracing/contrib/graphql/patcher.rb +1 -1
  193. data/lib/datadog/tracing/contrib/graphql/unified_trace.rb +3 -3
  194. data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +1 -1
  195. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +2 -2
  196. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +1 -1
  197. data/lib/datadog/tracing/contrib/grpc.rb +1 -1
  198. data/lib/datadog/tracing/contrib/hanami/action_tracer.rb +1 -1
  199. data/lib/datadog/tracing/contrib/hanami/plugin.rb +1 -1
  200. data/lib/datadog/tracing/contrib/hanami/renderer_policy_tracing.rb +1 -1
  201. data/lib/datadog/tracing/contrib/hanami/router_tracing.rb +1 -1
  202. data/lib/datadog/tracing/contrib/http/configuration/settings.rb +1 -1
  203. data/lib/datadog/tracing/contrib/http/instrumentation.rb +21 -6
  204. data/lib/datadog/tracing/contrib/http.rb +1 -1
  205. data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +1 -1
  206. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +14 -8
  207. data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +1 -1
  208. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +14 -8
  209. data/lib/datadog/tracing/contrib/kafka/instrumentation/consumer.rb +2 -2
  210. data/lib/datadog/tracing/contrib/kafka/instrumentation/producer.rb +2 -2
  211. data/lib/datadog/tracing/contrib/karafka/monitor.rb +1 -1
  212. data/lib/datadog/tracing/contrib/karafka/patcher.rb +1 -1
  213. data/lib/datadog/tracing/contrib/karafka.rb +1 -1
  214. data/lib/datadog/tracing/contrib/lograge/patcher.rb +1 -1
  215. data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +1 -1
  216. data/lib/datadog/tracing/contrib/mongodb/parsers.rb +1 -1
  217. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +1 -1
  218. data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +1 -1
  219. data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +3 -3
  220. data/lib/datadog/tracing/contrib/opensearch/configuration/settings.rb +2 -2
  221. data/lib/datadog/tracing/contrib/opensearch/patcher.rb +3 -3
  222. data/lib/datadog/tracing/contrib/pg/configuration/settings.rb +1 -1
  223. data/lib/datadog/tracing/contrib/pg/instrumentation.rb +4 -4
  224. data/lib/datadog/tracing/contrib/presto/configuration/settings.rb +1 -1
  225. data/lib/datadog/tracing/contrib/presto/instrumentation.rb +4 -4
  226. data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +1 -1
  227. data/lib/datadog/tracing/contrib/que/tracer.rb +1 -1
  228. data/lib/datadog/tracing/contrib/racecar/configuration/settings.rb +1 -1
  229. data/lib/datadog/tracing/contrib/racecar/events/batch.rb +1 -1
  230. data/lib/datadog/tracing/contrib/racecar/events/message.rb +1 -1
  231. data/lib/datadog/tracing/contrib/rack/middlewares.rb +3 -3
  232. data/lib/datadog/tracing/contrib/rack/patcher.rb +1 -1
  233. data/lib/datadog/tracing/contrib/rails/framework.rb +7 -7
  234. data/lib/datadog/tracing/contrib/rails/log_injection.rb +1 -1
  235. data/lib/datadog/tracing/contrib/rails/runner.rb +4 -4
  236. data/lib/datadog/tracing/contrib/redis/configuration/settings.rb +1 -1
  237. data/lib/datadog/tracing/contrib/redis/quantize.rb +1 -1
  238. data/lib/datadog/tracing/contrib/redis/tags.rb +1 -1
  239. data/lib/datadog/tracing/contrib/rest_client/configuration/settings.rb +1 -1
  240. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +17 -10
  241. data/lib/datadog/tracing/contrib/sequel/database.rb +1 -1
  242. data/lib/datadog/tracing/contrib/sequel/dataset.rb +1 -1
  243. data/lib/datadog/tracing/contrib/shoryuken/tracer.rb +1 -1
  244. data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +2 -2
  245. data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +2 -2
  246. data/lib/datadog/tracing/contrib/sidekiq.rb +1 -1
  247. data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +1 -1
  248. data/lib/datadog/tracing/contrib/status_range_env_parser.rb +1 -1
  249. data/lib/datadog/tracing/contrib/sucker_punch/instrumentation.rb +1 -1
  250. data/lib/datadog/tracing/contrib/trilogy/configuration/settings.rb +1 -1
  251. data/lib/datadog/tracing/contrib/trilogy/instrumentation.rb +3 -3
  252. data/lib/datadog/tracing/contrib/utils/quantization/http.rb +102 -0
  253. data/lib/datadog/tracing/contrib/waterdrop/middleware.rb +2 -2
  254. data/lib/datadog/tracing/contrib/waterdrop.rb +1 -1
  255. data/lib/datadog/tracing/diagnostics/environment_logger.rb +1 -1
  256. data/lib/datadog/tracing/distributed/b3_multi.rb +1 -1
  257. data/lib/datadog/tracing/distributed/b3_single.rb +1 -1
  258. data/lib/datadog/tracing/distributed/baggage.rb +3 -3
  259. data/lib/datadog/tracing/distributed/datadog.rb +3 -3
  260. data/lib/datadog/tracing/distributed/propagation.rb +7 -7
  261. data/lib/datadog/tracing/distributed/trace_context.rb +1 -1
  262. data/lib/datadog/tracing/distributed/trace_state/open_telemetry.rb +1 -1
  263. data/lib/datadog/tracing/otel_thread_context.rb +3 -3
  264. data/lib/datadog/tracing/pipeline.rb +1 -1
  265. data/lib/datadog/tracing/remote.rb +50 -19
  266. data/lib/datadog/tracing/sampling/priority_sampler.rb +1 -1
  267. data/lib/datadog/tracing/sampling/rule.rb +1 -1
  268. data/lib/datadog/tracing/sampling/rule_sampler.rb +1 -1
  269. data/lib/datadog/tracing/sampling/span/rule_parser.rb +2 -2
  270. data/lib/datadog/tracing/span_operation.rb +1 -1
  271. data/lib/datadog/tracing/trace_digest.rb +1 -1
  272. data/lib/datadog/tracing/trace_operation.rb +6 -6
  273. data/lib/datadog/tracing/tracer.rb +6 -6
  274. data/lib/datadog/tracing/transport/http/telemetry.rb +1 -1
  275. data/lib/datadog/tracing/transport/http.rb +2 -2
  276. data/lib/datadog/tracing/transport/io.rb +1 -1
  277. data/lib/datadog/tracing/transport/native.rb +3 -3
  278. data/lib/datadog/tracing/transport/statistics.rb +2 -2
  279. data/lib/datadog/tracing/transport/telemetry.rb +3 -1
  280. data/lib/datadog/tracing/transport/trace_formatter.rb +12 -12
  281. data/lib/datadog/tracing/transport/traces.rb +1 -1
  282. data/lib/datadog/tracing/utils.rb +1 -1
  283. data/lib/datadog/tracing/workers.rb +1 -1
  284. data/lib/datadog/version.rb +1 -1
  285. metadata +9 -8
  286. data/lib/datadog/appsec/utils/hash_coercion.rb +0 -23
@@ -23,16 +23,39 @@ module Datadog
23
23
 
24
24
  def dispatch(changes, repository)
25
25
  receivers.each do |receiver|
26
- matching_changes = changes.select { |c| receiver.match?(c.path) }
26
+ matching = matching_changes(changes, receiver)
27
27
 
28
- receiver.call(repository, matching_changes) if matching_changes.any?
28
+ receiver.call(repository, matching) if matching.any?
29
29
  end
30
+ nil
31
+ end
32
+
33
+ # Calls each receiver that declares initial-reconcile participation and has no
34
+ # matching change in `changes`, passing an empty change list.
35
+ def reconcile(changes, repository)
36
+ receivers.each do |receiver|
37
+ next unless receiver.initial_reconcile?
38
+
39
+ receiver.call(repository, []) unless any_matching?(changes, receiver)
40
+ end
41
+ nil
42
+ end
43
+
44
+ private
45
+
46
+ def matching_changes(changes, receiver)
47
+ changes.select { |change| receiver.match?(change.path) }
48
+ end
49
+
50
+ def any_matching?(changes, receiver)
51
+ changes.any? { |change| receiver.match?(change.path) }
30
52
  end
31
53
 
32
54
  # Store Matcher and block to be executed on a match
33
55
  class Receiver
34
- def initialize(matcher, &block)
56
+ def initialize(matcher, initial_reconcile: false, &block)
35
57
  @block = block
58
+ @initial_reconcile = initial_reconcile
36
59
  @matcher = matcher
37
60
  end
38
61
 
@@ -40,6 +63,14 @@ module Datadog
40
63
  @matcher.match?(path)
41
64
  end
42
65
 
66
+ # Whether #reconcile may call this receiver with an empty change
67
+ # list on the client's first sync. A participating receiver must
68
+ # act on the repository's current contents when the change list is
69
+ # empty.
70
+ def initial_reconcile?
71
+ @initial_reconcile
72
+ end
73
+
43
74
  def call(repository, changes)
44
75
  @block.call(repository, changes)
45
76
  end
@@ -13,13 +13,14 @@ module Datadog
13
13
  return if boot.nil?
14
14
  return if span.nil?
15
15
 
16
- return if Datadog::Core::Remote.active_remote.nil?
16
+ remote = Datadog::Core::Remote.active_remote
17
+ return if remote.nil?
17
18
 
18
19
  # TODO: this is not thread-consistent
19
- ready = Datadog::Core::Remote.active_remote.healthy
20
+ ready = remote.healthy
20
21
  status = ready ? "ready" : "disconnected"
21
22
 
22
- span.set_tag("_dd.rc.client_id", Datadog::Core::Remote.active_remote.client.id)
23
+ span.set_tag("_dd.rc.client_id", remote.client.id)
23
24
  span.set_tag("_dd.rc.status", status)
24
25
 
25
26
  if boot.barrier != :pass
@@ -40,7 +40,7 @@ module Datadog
40
40
  Core::Transport::HTTP.build(
41
41
  agent_settings: agent_settings,
42
42
  logger: logger,
43
- headers: headers
43
+ headers: headers,
44
44
  ) do |transport|
45
45
  transport.api "root", ROOT
46
46
 
@@ -59,7 +59,7 @@ module Datadog
59
59
  Core::Transport::HTTP.build(
60
60
  agent_settings: agent_settings,
61
61
  logger: logger,
62
- headers: headers
62
+ headers: headers,
63
63
  ) do |transport|
64
64
  transport.api "v7", V7
65
65
 
@@ -67,23 +67,23 @@ module Datadog
67
67
  # Only on Ruby < 3.2
68
68
  gauge_if_not_nil(
69
69
  Core::Runtime::Ext::Metrics::METRIC_GLOBAL_CONSTANT_STATE,
70
- Core::Environment::VMCache.global_constant_state
70
+ Core::Environment::VMCache.global_constant_state,
71
71
  )
72
72
 
73
73
  # Only on Ruby 2.x
74
74
  gauge_if_not_nil(
75
75
  Core::Runtime::Ext::Metrics::METRIC_GLOBAL_METHOD_STATE,
76
- Core::Environment::VMCache.global_method_state
76
+ Core::Environment::VMCache.global_method_state,
77
77
  )
78
78
 
79
79
  # Only on Ruby >= 3.2
80
80
  gauge_if_not_nil(
81
81
  Core::Runtime::Ext::Metrics::METRIC_CONSTANT_CACHE_INVALIDATIONS,
82
- Core::Environment::VMCache.constant_cache_invalidations
82
+ Core::Environment::VMCache.constant_cache_invalidations,
83
83
  )
84
84
  gauge_if_not_nil(
85
85
  Core::Runtime::Ext::Metrics::METRIC_CONSTANT_CACHE_MISSES,
86
- Core::Environment::VMCache.constant_cache_misses
86
+ Core::Environment::VMCache.constant_cache_misses,
87
87
  )
88
88
  end
89
89
  end
@@ -163,43 +163,43 @@ module Datadog
163
163
  if Core::Environment::YJIT.available?
164
164
  gauge_if_not_nil(
165
165
  Core::Runtime::Ext::Metrics::METRIC_YJIT_CODE_GC_COUNT,
166
- Core::Environment::YJIT.code_gc_count
166
+ Core::Environment::YJIT.code_gc_count,
167
167
  )
168
168
  gauge_if_not_nil(
169
169
  Core::Runtime::Ext::Metrics::METRIC_YJIT_CODE_REGION_SIZE,
170
- Core::Environment::YJIT.code_region_size
170
+ Core::Environment::YJIT.code_region_size,
171
171
  )
172
172
  gauge_if_not_nil(
173
173
  Core::Runtime::Ext::Metrics::METRIC_YJIT_FREED_CODE_SIZE,
174
- Core::Environment::YJIT.freed_code_size
174
+ Core::Environment::YJIT.freed_code_size,
175
175
  )
176
176
  gauge_if_not_nil(
177
177
  Core::Runtime::Ext::Metrics::METRIC_YJIT_FREED_PAGE_COUNT,
178
- Core::Environment::YJIT.freed_page_count
178
+ Core::Environment::YJIT.freed_page_count,
179
179
  )
180
180
  gauge_if_not_nil(
181
181
  Core::Runtime::Ext::Metrics::METRIC_YJIT_INLINE_CODE_SIZE,
182
- Core::Environment::YJIT.inline_code_size
182
+ Core::Environment::YJIT.inline_code_size,
183
183
  )
184
184
  gauge_if_not_nil(
185
185
  Core::Runtime::Ext::Metrics::METRIC_YJIT_LIVE_PAGE_COUNT,
186
- Core::Environment::YJIT.live_page_count
186
+ Core::Environment::YJIT.live_page_count,
187
187
  )
188
188
  gauge_if_not_nil(
189
189
  Core::Runtime::Ext::Metrics::METRIC_YJIT_OBJECT_SHAPE_COUNT,
190
- Core::Environment::YJIT.object_shape_count
190
+ Core::Environment::YJIT.object_shape_count,
191
191
  )
192
192
  gauge_if_not_nil(
193
193
  Core::Runtime::Ext::Metrics::METRIC_YJIT_OUTLINED_CODE_SIZE,
194
- Core::Environment::YJIT.outlined_code_size
194
+ Core::Environment::YJIT.outlined_code_size,
195
195
  )
196
196
  gauge_if_not_nil(
197
197
  Core::Runtime::Ext::Metrics::METRIC_YJIT_YJIT_ALLOC_SIZE,
198
- Core::Environment::YJIT.yjit_alloc_size
198
+ Core::Environment::YJIT.yjit_alloc_size,
199
199
  )
200
200
  gauge_if_not_nil(
201
201
  Core::Runtime::Ext::Metrics::METRIC_YJIT_RATIO_IN_YJIT,
202
- Core::Environment::YJIT.ratio_in_yjit
202
+ Core::Environment::YJIT.ratio_in_yjit,
203
203
  )
204
204
  end
205
205
  end
@@ -20,7 +20,9 @@ module Datadog
20
20
 
21
21
  def wait(timeout = nil)
22
22
  wake_lock.synchronize do
23
- wake.wait(wake_lock, timeout)
23
+ # ConditionVariable#wait accepts Numeric seconds at runtime; the
24
+ # bundled core signatures only model the Timeouts module form.
25
+ wake.wait(wake_lock, timeout) # steep:ignore ArgumentTypeMismatch
24
26
  end
25
27
  end
26
28
 
@@ -85,12 +85,12 @@ module Datadog
85
85
  conf_value(
86
86
  "DD_GIT_REPOSITORY_URL",
87
87
  Core::Environment::Git.git_repository_url,
88
- (Core::Environment::Git.git_repository_url ? Configuration::Option::Precedence::ENVIRONMENT : Configuration::Option::Precedence::DEFAULT)
88
+ (Core::Environment::Git.git_repository_url ? Configuration::Option::Precedence::ENVIRONMENT : Configuration::Option::Precedence::DEFAULT),
89
89
  ),
90
90
  conf_value(
91
91
  "DD_GIT_COMMIT_SHA",
92
92
  Core::Environment::Git.git_commit_sha,
93
- (Core::Environment::Git.git_commit_sha ? Configuration::Option::Precedence::ENVIRONMENT : Configuration::Option::Precedence::DEFAULT)
93
+ (Core::Environment::Git.git_commit_sha ? Configuration::Option::Precedence::ENVIRONMENT : Configuration::Option::Precedence::DEFAULT),
94
94
  ),
95
95
 
96
96
  # Mix of env var, programmatic and default config, so we use unknown
@@ -102,13 +102,13 @@ module Datadog
102
102
  list << conf_value(
103
103
  "tracing.auto_instrument.enabled",
104
104
  auto_instrument_enabled,
105
- auto_instrument_enabled ? Configuration::Option::Precedence::PROGRAMMATIC : Configuration::Option::Precedence::DEFAULT
105
+ auto_instrument_enabled ? Configuration::Option::Precedence::PROGRAMMATIC : Configuration::Option::Precedence::DEFAULT,
106
106
  )
107
107
  opentelemetry_enabled = !defined?(Datadog::OpenTelemetry::LOADED).nil?
108
108
  list << conf_value(
109
109
  "tracing.opentelemetry.enabled",
110
110
  opentelemetry_enabled,
111
- opentelemetry_enabled ? Configuration::Option::Precedence::PROGRAMMATIC : Configuration::Option::Precedence::DEFAULT
111
+ opentelemetry_enabled ? Configuration::Option::Precedence::PROGRAMMATIC : Configuration::Option::Precedence::DEFAULT,
112
112
  )
113
113
 
114
114
  # Track ssi configurations
@@ -124,17 +124,17 @@ module Datadog
124
124
  conf_value(
125
125
  "instrumentation_source",
126
126
  instrumentation_source,
127
- (instrumentation_source == "ssi") ? Configuration::Option::Precedence::PROGRAMMATIC : Configuration::Option::Precedence::DEFAULT
127
+ (instrumentation_source == "ssi") ? Configuration::Option::Precedence::PROGRAMMATIC : Configuration::Option::Precedence::DEFAULT,
128
128
  ),
129
129
  conf_value(
130
130
  "DD_INJECT_FORCE",
131
131
  Core::Environment::VariableHelpers.env_to_bool("DD_INJECT_FORCE", false),
132
- (DATADOG_ENV.key?("DD_INJECT_FORCE") ? Configuration::Option::Precedence::ENVIRONMENT : Configuration::Option::Precedence::DEFAULT)
132
+ (DATADOG_ENV.key?("DD_INJECT_FORCE") ? Configuration::Option::Precedence::ENVIRONMENT : Configuration::Option::Precedence::DEFAULT),
133
133
  ),
134
134
  conf_value(
135
135
  "DD_INJECTION_ENABLED",
136
136
  DATADOG_ENV["DD_INJECTION_ENABLED"] || "",
137
- (DATADOG_ENV.key?("DD_INJECTION_ENABLED") ? Configuration::Option::Precedence::ENVIRONMENT : Configuration::Option::Precedence::DEFAULT)
137
+ (DATADOG_ENV.key?("DD_INJECTION_ENABLED") ? Configuration::Option::Precedence::ENVIRONMENT : Configuration::Option::Precedence::DEFAULT),
138
138
  ),
139
139
  )
140
140
 
@@ -144,13 +144,13 @@ module Datadog
144
144
  "tracing.writer_options.buffer_size",
145
145
  # Steep: Value is always a hash for writer_options (ensured by o.type :hash)
146
146
  to_telemetry_value(value[:buffer_size]), # steep:ignore NoMethod
147
- precedence
147
+ precedence,
148
148
  )
149
149
  list << conf_value(
150
150
  "tracing.writer_options.flush_interval",
151
151
  # Steep: Value is always a hash for writer_options (ensured by o.type :hash)
152
152
  to_telemetry_value(value[:flush_interval]), # steep:ignore NoMethod
153
- precedence
153
+ precedence,
154
154
  )
155
155
  end
156
156
 
@@ -42,7 +42,7 @@ module Datadog
42
42
  telemetry
43
43
  else
44
44
  Datadog.logger.warn(
45
- "Failed to send telemetry before components initialization or within components lifecycle"
45
+ "Failed to send telemetry before components initialization or within components lifecycle",
46
46
  )
47
47
  nil
48
48
  end
@@ -63,7 +63,7 @@ module Datadog
63
63
  event = Event::Log.new(
64
64
  message: message,
65
65
  level: level,
66
- stack_trace: DatadogStackTrace.from(exception)
66
+ stack_trace: DatadogStackTrace.from(exception),
67
67
  )
68
68
 
69
69
  log!(event)
@@ -28,6 +28,14 @@ module Datadog
28
28
 
29
29
  private
30
30
 
31
+ # The `ci` settings member exists only when the datadog-ci gem is
32
+ # loaded, so check for it before reading.
33
+ def datadog_ci_enabled?(config)
34
+ return false unless defined?(::Datadog::CI::VERSION) && config.respond_to?(:ci)
35
+
36
+ config.ci.enabled # steep:ignore NoMethod
37
+ end
38
+
31
39
  def application
32
40
  config = Datadog.configuration
33
41
 
@@ -38,9 +46,7 @@ module Datadog
38
46
  #
39
47
  # This code checks that Datadog::CI is loaded and ci mode is enabled and adds
40
48
  # "-ci-X.Y.Z" suffix to the tracer version.
41
- if defined?(::Datadog::CI::VERSION) && config.respond_to?(:ci) && config.ci.enabled
42
- tracer_version = "#{tracer_version}-ci-#{::Datadog::CI::VERSION::STRING}"
43
- end
49
+ tracer_version = "#{tracer_version}-ci-#{::Datadog::CI::VERSION::STRING}" if datadog_ci_enabled?(config)
44
50
 
45
51
  app = {
46
52
  env: config.env,
@@ -33,7 +33,7 @@ module Datadog
33
33
  Core::Transport::HTTP.build(
34
34
  logger: logger,
35
35
  agent_settings: agent_settings,
36
- headers: headers
36
+ headers: headers,
37
37
  ) do |transport|
38
38
  transport.api "agentless_telemetry", AGENTLESS_TELEMETRY
39
39
  # Call block to apply any customization, if provided
@@ -53,7 +53,7 @@ module Datadog
53
53
  Core::Transport::HTTP.build(
54
54
  logger: logger,
55
55
  agent_settings: agent_settings,
56
- headers: headers
56
+ headers: headers,
57
57
  ) do |transport|
58
58
  transport.api "agent_telemetry", AGENT_TELEMETRY
59
59
 
@@ -286,7 +286,7 @@ module Datadog
286
286
  # 2) don't want to keep a permanent reference to in any case.
287
287
  # Therefore we have this +reset!+ method that changes the
288
288
  # event type while keeping the payload.
289
- @initial_event.reset! # steep:ignore NoMethod
289
+ @initial_event.reset!
290
290
  end
291
291
 
292
292
  if enabled? && !worker.nil?
@@ -69,7 +69,7 @@ module Datadog
69
69
  post = ::Datadog::Core::Vendor::Net::HTTP::Post::Multipart.new(
70
70
  env.path,
71
71
  env.form,
72
- env.headers
72
+ env.headers,
73
73
  )
74
74
  end
75
75
 
@@ -37,7 +37,7 @@ module Datadog
37
37
  connection = HTTP.new(
38
38
  uds_path,
39
39
  read_timeout: timeout,
40
- continue_timeout: timeout
40
+ continue_timeout: timeout,
41
41
  )
42
42
 
43
43
  connection.start(&block)
@@ -114,7 +114,7 @@ module Datadog
114
114
  instances[key] = API::Instance.new(
115
115
  spec,
116
116
  adapter,
117
- api_options
117
+ api_options,
118
118
  )
119
119
 
120
120
  # Configure fallback, if provided.
@@ -15,15 +15,15 @@ module Datadog
15
15
  # Add adapters to registry
16
16
  Builder::REGISTRY.set(
17
17
  Core::Transport::HTTP::Adapters::Net,
18
- Core::Configuration::Ext::Agent::HTTP::ADAPTER
18
+ Core::Configuration::Ext::Agent::HTTP::ADAPTER,
19
19
  )
20
20
  Builder::REGISTRY.set(
21
21
  Core::Transport::HTTP::Adapters::Test,
22
- Core::Transport::Ext::Test::ADAPTER
22
+ Core::Transport::Ext::Test::ADAPTER,
23
23
  )
24
24
  Builder::REGISTRY.set(
25
25
  Core::Transport::HTTP::Adapters::UnixSocket,
26
- Core::Transport::Ext::UnixSocket::ADAPTER
26
+ Core::Transport::Ext::UnixSocket::ADAPTER,
27
27
  )
28
28
 
29
29
  module_function
@@ -97,7 +97,7 @@ module Datadog
97
97
  AT_FORK_REGISTRY_MUTEX.synchronize do
98
98
  current = @at_fork_blocks
99
99
  @at_fork_blocks = current.merge(
100
- stage => (blocks_for(current, stage) + [Callback.new(block)]).freeze
100
+ stage => (blocks_for(current, stage) + [Callback.new(block)]).freeze,
101
101
  ).freeze
102
102
  end
103
103
 
@@ -129,7 +129,7 @@ module Datadog
129
129
  current = @at_fork_blocks
130
130
  callbacks = blocks_for(current, stage)
131
131
  @at_fork_blocks = current.merge(
132
- stage => callbacks.reject { |callback| callback.block.equal?(block) }.freeze
132
+ stage => callbacks.reject { |callback| callback.block.equal?(block) }.freeze,
133
133
  ).freeze
134
134
  end
135
135
 
@@ -168,7 +168,7 @@ module Datadog
168
168
  rescue Exception => e
169
169
  @error = e
170
170
  Datadog.logger.debug(
171
- "Worker thread error. Cause: #{e.class}: #{e.message} Location: #{Array(e.backtrace).first}"
171
+ "Worker thread error. Cause: #{e.class}: #{e.message} Location: #{Array(e.backtrace).first}",
172
172
  )
173
173
  raise
174
174
 
@@ -27,12 +27,12 @@ module Datadog
27
27
  telemetry: telemetry,
28
28
  experimental_propagate_process_tags_enabled: options.fetch(:propagate_process_tags_enabled) do
29
29
  options.fetch(:experimental_propagate_process_tags_enabled)
30
- end
30
+ end,
31
31
  )
32
32
  end
33
33
 
34
34
  # Workers::Async::Thread settings
35
- self.fork_policy = options.fetch(:fork_policy, Workers::Async::Thread::FORK_POLICY_STOP)
35
+ self.fork_policy = options.fetch(:fork_policy, Workers::Async::Thread::FORK_POLICY_RESTART)
36
36
 
37
37
  # Workers::IntervalLoop settings
38
38
  self.loop_base_interval = options.fetch(:interval, DEFAULT_FLUSH_INTERVAL)
@@ -90,7 +90,7 @@ module Datadog
90
90
  new(
91
91
  hash_value: hash_value,
92
92
  pathway_start: pathway_start,
93
- current_edge_start: current_edge_start
93
+ current_edge_start: current_edge_start,
94
94
  )
95
95
  rescue EOFError
96
96
  # Not enough data in binary stream
@@ -10,6 +10,7 @@ require_relative "../core/ddsketch"
10
10
  require_relative "../core/buffer/cruby"
11
11
  require_relative "../core/utils/time"
12
12
  require_relative "../core/utils/fnv"
13
+ require_relative "../core/utils/sequence"
13
14
 
14
15
  module Datadog
15
16
  module DataStreams
@@ -28,7 +29,17 @@ module Datadog
28
29
  # Set to handle high-throughput scenarios (e.g., 10k events/sec for 10s interval)
29
30
  DEFAULT_BUFFER_SIZE = 100_000
30
31
 
31
- attr_reader :pathway_context, :buckets, :bucket_size_ns
32
+ attr_reader :buckets, :bucket_size_ns
33
+
34
+ UNIQUE_INSTANCE_MUTEX = Mutex.new
35
+ UNIQUE_INSTANCE_GENERATOR = Core::Utils::Sequence.new
36
+
37
+ private_constant :UNIQUE_INSTANCE_MUTEX, :UNIQUE_INSTANCE_GENERATOR
38
+
39
+ # Not object_id: the VM may reuse it, letting a new processor read a stale context.
40
+ def self.next_instance_id
41
+ UNIQUE_INSTANCE_MUTEX.synchronize { UNIQUE_INSTANCE_GENERATOR.next }
42
+ end
32
43
 
33
44
  # Initialize the Data Streams Monitoring processor
34
45
  #
@@ -48,12 +59,9 @@ module Datadog
48
59
  @agent_info = agent_info
49
60
  @logger = logger
50
61
 
51
- now = Core::Utils::Time.now
52
- @pathway_context = PathwayContext.new(
53
- hash_value: 0,
54
- pathway_start: now,
55
- current_edge_start: now
56
- )
62
+ # Fiber-local (Thread#[] is fiber-local), so a consume on one thread never rewrites the
63
+ # pathway of produces on another.
64
+ @pathway_context_key = :"datadog_data_streams_pathway_context_#{Processor.next_instance_id}"
57
65
  @bucket_size_ns = (interval * 1e9).to_i
58
66
  @buckets = {}
59
67
  @consumer_stats = []
@@ -83,6 +91,14 @@ module Datadog
83
91
  perform
84
92
  end
85
93
 
94
+ def pathway_context
95
+ Thread.current[@pathway_context_key]
96
+ end
97
+
98
+ def pathway_context=(context)
99
+ Thread.current[@pathway_context_key] = context
100
+ end
101
+
86
102
  # Track Kafka produce offset for lag monitoring
87
103
  # @param topic [String] The Kafka topic name
88
104
  # @param partition [Integer] The partition number
@@ -97,7 +113,7 @@ module Datadog
97
113
  partition: partition,
98
114
  offset: offset,
99
115
  timestamp_ns: (now.to_f * 1e9).to_i,
100
- }
116
+ },
101
117
  )
102
118
  true
103
119
  end
@@ -116,7 +132,7 @@ module Datadog
116
132
  partition: partition,
117
133
  offset: offset,
118
134
  timestamp: now,
119
- }
135
+ },
120
136
  )
121
137
  true
122
138
  end
@@ -253,7 +269,7 @@ module Datadog
253
269
  end
254
270
 
255
271
  def encode_pathway_context
256
- @pathway_context.encode_b64
272
+ get_current_context.encode_b64
257
273
  end
258
274
 
259
275
  def set_checkpoint(tags:, now: nil, payload_size: 0, span: nil)
@@ -301,7 +317,7 @@ module Datadog
301
317
  full_pathway_latency_sec: full_pathway_latency_sec,
302
318
  payload_size: payload_size,
303
319
  tags: tags,
304
- timestamp_sec: now.to_f
320
+ timestamp_sec: now.to_f,
305
321
  )
306
322
 
307
323
  current_context.parent_hash = current_context.hash
@@ -326,6 +342,8 @@ module Datadog
326
342
  # agent. Discard it instead: losing a few seconds of pre-fork stats is preferable to
327
343
  # corrupting pipeline throughput/lag numbers with duplicates.
328
344
  def discard_inherited_state_after_fork!
345
+ # Runs on the forking thread, the only one that survives into the child.
346
+ self.pathway_context = nil
329
347
  @event_buffer.pop
330
348
  @stats_mutex.synchronize do
331
349
  @buckets.clear
@@ -367,24 +385,27 @@ module Datadog
367
385
  get_current_context
368
386
  end
369
387
 
388
+ # Created at the fiber's first checkpoint rather than at processor start, so a producer
389
+ # that starts a pathway reports ~0 latency however long the process sat idle.
370
390
  def get_current_context
371
- @pathway_context ||= begin
372
- now = Core::Utils::Time.now
373
- PathwayContext.new(
374
- hash_value: 0,
375
- pathway_start: now,
376
- current_edge_start: now
377
- )
378
- end
391
+ current = pathway_context
392
+ return current if current
393
+
394
+ now = Core::Utils::Time.now
395
+ self.pathway_context = PathwayContext.new(
396
+ hash_value: 0,
397
+ pathway_start: now,
398
+ current_edge_start: now,
399
+ )
379
400
  end
380
401
 
381
402
  def set_pathway_context(ctx)
382
- if ctx
383
- @pathway_context = ctx
384
- @pathway_context.previous_direction = nil
385
- @pathway_context.closest_opposite_direction_hash = 0
386
- @pathway_context.closest_opposite_direction_edge_start = @pathway_context.current_edge_start
387
- end
403
+ return unless ctx
404
+
405
+ ctx.previous_direction = nil
406
+ ctx.closest_opposite_direction_hash = 0
407
+ ctx.closest_opposite_direction_edge_start = ctx.current_edge_start
408
+ self.pathway_context = ctx
388
409
  end
389
410
 
390
411
  def decode_and_set_pathway_context(headers)
@@ -432,7 +453,7 @@ module Datadog
432
453
  payload_size: payload_size,
433
454
  tags: tags,
434
455
  timestamp_sec: timestamp_sec,
435
- }
456
+ },
436
457
  )
437
458
  true
438
459
  end
@@ -450,7 +471,7 @@ module Datadog
450
471
  def transport
451
472
  @transport ||= Transport::HTTP.default(
452
473
  agent_settings: @agent_settings,
453
- logger: @logger
474
+ logger: @logger,
454
475
  )
455
476
  end
456
477
 
@@ -10,7 +10,7 @@ module Datadog
10
10
  # HTTP transport for Data Streams Monitoring
11
11
  module HTTP
12
12
  V01 = Stats::API::Endpoint.new(
13
- "/v0.1/pipeline_stats"
13
+ "/v0.1/pipeline_stats",
14
14
  )
15
15
 
16
16
  module_function
@@ -75,6 +75,22 @@ module Datadog
75
75
  processor&.track_kafka_consume(topic, partition, offset, Core::Utils::Time.now)
76
76
  end
77
77
 
78
+ # The calling fiber's pathway context, without creating one.
79
+ #
80
+ # @return [PathwayContext, nil]
81
+ # @!visibility private
82
+ def pathway_context
83
+ processor&.pathway_context
84
+ end
85
+
86
+ # Restores a context returned by {.pathway_context}; nil clears it.
87
+ #
88
+ # @param context [PathwayContext, nil]
89
+ # @!visibility private
90
+ def pathway_context=(context)
91
+ processor&.pathway_context = context
92
+ end
93
+
78
94
  # Check if Data Streams Monitoring is enabled and available
79
95
  #
80
96
  # @return [Boolean] true if the processor is available