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
@@ -20,6 +20,96 @@ module Datadog
20
20
 
21
21
  module_function
22
22
 
23
+ def client_resource(method, path, enabled:)
24
+ return method unless enabled && path
25
+
26
+ resource = method.dup
27
+ resource << (+" ").force_encoding(resource.encoding)
28
+ quantized_path = quantize_path(decode_path(path))
29
+ resource << quantized_path.force_encoding(resource.encoding)
30
+ end
31
+
32
+ def decode_path(path)
33
+ decoded = String.new(encoding: Encoding::BINARY)
34
+ index = 0
35
+
36
+ while index < path.bytesize
37
+ byte = path.getbyte(index)
38
+ break unless byte
39
+
40
+ if byte == 37 && index + 2 < path.bytesize
41
+ high_byte = path.getbyte(index + 1)
42
+ low_byte = path.getbyte(index + 2)
43
+ if high_byte && low_byte
44
+ high = decode_hex_byte(high_byte)
45
+ low = decode_hex_byte(low_byte)
46
+ if high && low
47
+ decoded << high * 16 + low
48
+ index += 3
49
+ next
50
+ end
51
+ end
52
+ end
53
+
54
+ decoded << byte
55
+ index += 1
56
+ end
57
+
58
+ decoded.force_encoding(path.encoding)
59
+ end
60
+
61
+ def quantize_path(path)
62
+ slash = (+"/").force_encoding(path.encoding)
63
+ normalized = if path.getbyte(0) == 47
64
+ path
65
+ else
66
+ String.new(encoding: path.encoding) << slash << path
67
+ end
68
+
69
+ output = String.new(encoding: path.encoding)
70
+ index = 1
71
+ replacements = 0
72
+
73
+ while index < normalized.bytesize
74
+ segment_end = index
75
+ allowed = 0
76
+ digits = 0
77
+ specials = 0
78
+
79
+ while segment_end < normalized.bytesize && normalized.getbyte(segment_end) != 47
80
+ byte = normalized.getbyte(segment_end)
81
+ break unless byte
82
+
83
+ if byte.between?(48, 57)
84
+ digits += 1
85
+ elsif byte.between?(65, 90) || byte.between?(97, 122) || byte == 45 || byte == 95
86
+ allowed += 1
87
+ else
88
+ specials += 1
89
+ end
90
+ segment_end += 1
91
+ end
92
+
93
+ output << slash
94
+ segment = normalized.byteslice(index, segment_end - index) || String.new(encoding: path.encoding)
95
+ if normalized.getbyte(index) == 118 && allowed == 1 && digits > 0 && specials.zero?
96
+ output << segment
97
+ elsif specials > 0 || digits > 0
98
+ output << (+"*").force_encoding(path.encoding)
99
+ replacements += 1
100
+ else
101
+ output << segment
102
+ end
103
+
104
+ index = segment_end + 1
105
+ end
106
+
107
+ return normalized.dup if replacements.zero?
108
+
109
+ output << slash if normalized.getbyte(normalized.bytesize - 1) == 47
110
+ output
111
+ end
112
+
23
113
  def url(url, options = {})
24
114
  url!(url, options)
25
115
  rescue
@@ -118,6 +208,18 @@ module Datadog
118
208
 
119
209
  private_class_method :collect_query
120
210
 
211
+ def decode_hex_byte(byte)
212
+ if byte.between?(48, 57)
213
+ byte - 48
214
+ elsif byte.between?(65, 70)
215
+ byte - 55
216
+ elsif byte.between?(97, 102)
217
+ byte - 87
218
+ end
219
+ end
220
+
221
+ private_class_method :decode_hex_byte
222
+
121
223
  # Scans over the query string and obfuscates sensitive data by
122
224
  # replacing matches with an opaque value
123
225
  def obfuscate_query(query, options = {})
@@ -14,7 +14,7 @@ module Datadog
14
14
 
15
15
  if trace_op && Datadog::Tracing::Distributed::PropagationPolicy.enabled?(
16
16
  global_config: configuration,
17
- trace: trace_op
17
+ trace: trace_op,
18
18
  )
19
19
  WaterDrop.inject(trace_op.to_digest, message[:headers] ||= {})
20
20
  end
@@ -23,7 +23,7 @@ module Datadog
23
23
  Datadog::DataStreams.set_produce_checkpoint(
24
24
  type: "kafka",
25
25
  destination: message[:topic],
26
- auto_instrumentation: true
26
+ auto_instrumentation: true,
27
27
  ) do |key, value|
28
28
  message[:headers] ||= {}
29
29
  message[:headers][key] = value
@@ -33,7 +33,7 @@ module Datadog
33
33
  propagation_style_inject: tracing.propagation_style_inject,
34
34
  propagation_style_extract: tracing.propagation_style_extract,
35
35
  propagation_behavior_extract: tracing.propagation_behavior_extract,
36
- propagation_extract_first: tracing.propagation_extract_first
36
+ propagation_extract_first: tracing.propagation_extract_first,
37
37
  )
38
38
  end
39
39
  end
@@ -25,7 +25,7 @@ module Datadog
25
25
  end
26
26
  rescue => e
27
27
  logger.warn(
28
- "Failed to collect tracing environment information: #{e.class}: #{e.message} Location: #{Array(e.backtrace).first}"
28
+ "Failed to collect tracing environment information: #{e.class}: #{e.message} Location: #{Array(e.backtrace).first}",
29
29
  )
30
30
  end
31
31
  end
@@ -35,7 +35,7 @@ module Datadog
35
35
 
36
36
  if digest.trace_sampling_priority
37
37
  sampling_priority = Helpers.clamp_sampling_priority(
38
- digest.trace_sampling_priority
38
+ digest.trace_sampling_priority,
39
39
  )
40
40
  data[@sampled_key] = sampling_priority.to_s
41
41
  end
@@ -32,7 +32,7 @@ module Datadog
32
32
 
33
33
  if digest.trace_sampling_priority
34
34
  sampling_priority = Helpers.clamp_sampling_priority(
35
- digest.trace_sampling_priority
35
+ digest.trace_sampling_priority,
36
36
  )
37
37
  value += "-#{sampling_priority}"
38
38
  end
@@ -44,7 +44,7 @@ module Datadog
44
44
  record_telemetry_metric(
45
45
  "context_header.truncated",
46
46
  1,
47
- {"header_style" => "baggage", "truncation_reason" => "baggage_item_count_exceeded"}
47
+ {"header_style" => "baggage", "truncation_reason" => "baggage_item_count_exceeded"},
48
48
  )
49
49
  baggage_items = baggage_items.first(DD_TRACE_BAGGAGE_MAX_ITEMS)
50
50
  end
@@ -61,7 +61,7 @@ module Datadog
61
61
  record_telemetry_metric(
62
62
  "context_header.truncated",
63
63
  1,
64
- {"header_style" => "baggage", "truncation_reason" => "baggage_byte_count_exceeded"}
64
+ {"header_style" => "baggage", "truncation_reason" => "baggage_byte_count_exceeded"},
65
65
  )
66
66
  break # stop adding items when size limit is reached
67
67
  end
@@ -99,7 +99,7 @@ module Datadog
99
99
 
100
100
  TraceDigest.new(
101
101
  baggage: baggage,
102
- trace_distributed_tags: baggage_tags
102
+ trace_distributed_tags: baggage_tags,
103
103
  )
104
104
  end
105
105
 
@@ -137,7 +137,7 @@ module Datadog
137
137
  rescue => e
138
138
  set_tags_propagation_error(reason: "encoding_error")
139
139
  ::Datadog.logger.warn(
140
- "Failed to inject x-datadog-tags: #{e.class}: #{e.message} at #{Array(e.backtrace).first}"
140
+ "Failed to inject x-datadog-tags: #{e.class}: #{e.message} at #{Array(e.backtrace).first}",
141
141
  )
142
142
  nil
143
143
  end
@@ -164,7 +164,7 @@ module Datadog
164
164
  rescue => e
165
165
  set_tags_propagation_error(reason: "decoding_error")
166
166
  ::Datadog.logger.warn(
167
- "Failed to extract x-datadog-tags: #{e.class}: #{e.message} at #{Array(e.backtrace).first}"
167
+ "Failed to extract x-datadog-tags: #{e.class}: #{e.message} at #{Array(e.backtrace).first}",
168
168
  )
169
169
  nil
170
170
  end
@@ -188,7 +188,7 @@ module Datadog
188
188
  ::Datadog.logger.warn(
189
189
  "Failed to #{scenario} x-datadog-tags: tags are too large for configured limit (bytesize:#{size} >= " \
190
190
  "limit:#{max_length}). This limit can be configured " \
191
- "through the DD_TRACE_X_DATADOG_TAGS_MAX_LENGTH environment variable."
191
+ "through the DD_TRACE_X_DATADOG_TAGS_MAX_LENGTH environment variable.",
192
192
  )
193
193
 
194
194
  true
@@ -81,11 +81,11 @@ module Datadog
81
81
  rescue => e
82
82
  result = nil
83
83
  ::Datadog.logger.error(
84
- "Error injecting distributed trace data. Cause: #{e.class}: #{e.message} Location: #{Array(e.backtrace).first}"
84
+ "Error injecting distributed trace data. Cause: #{e.class}: #{e.message} Location: #{Array(e.backtrace).first}",
85
85
  )
86
86
  ::Datadog::Core::Telemetry::Logger.report(
87
87
  e,
88
- description: "Error injecting distributed trace data with #{propagator.class.name}"
88
+ description: "Error injecting distributed trace data with #{propagator.class.name}",
89
89
  )
90
90
  end
91
91
 
@@ -149,13 +149,13 @@ module Datadog
149
149
  trace_otel_random_value: tracecontext_digest.trace_otel_random_value,
150
150
  trace_otel_threshold: tracecontext_digest.trace_otel_threshold,
151
151
  trace_otel_unknown_fields: tracecontext_digest.trace_otel_unknown_fields,
152
- trace_distributed_tags: distributed_tags
152
+ trace_distributed_tags: distributed_tags,
153
153
  )
154
154
  end
155
155
  rescue => e
156
156
  # TODO: Not to report Telemetry logs for now
157
157
  ::Datadog.logger.error(
158
- "Error extracting distributed trace data. Cause: #{e.class}: #{e.message} Location: #{Array(e.backtrace).first}"
158
+ "Error extracting distributed trace data. Cause: #{e.class}: #{e.message} Location: #{Array(e.backtrace).first}",
159
159
  )
160
160
  end
161
161
  # Handle baggage after all other styles if present
@@ -171,7 +171,7 @@ module Datadog
171
171
  attributes: {
172
172
  "reason" => "propagation_behavior_extract",
173
173
  "context_headers" => extracted_style_name,
174
- }
174
+ },
175
175
  )
176
176
  baggage_tags = extracted_trace_digest.trace_distributed_tags&.select { |k, _| k.start_with?("baggage.") }
177
177
  baggage_tags = nil if baggage_tags&.empty?
@@ -192,7 +192,7 @@ module Datadog
192
192
  if digest
193
193
  extracted_trace_digest.merge(
194
194
  baggage: digest.baggage,
195
- trace_distributed_tags: digest.trace_distributed_tags
195
+ trace_distributed_tags: digest.trace_distributed_tags,
196
196
  )
197
197
  else
198
198
  extracted_trace_digest
@@ -207,7 +207,7 @@ module Datadog
207
207
  dd_propagator = @propagation_style_extract.find { |propagator| propagator.is_a?(Datadog) }
208
208
  if tracecontext_tags&.fetch(
209
209
  Tracing::Metadata::Ext::Distributed::TAG_DD_PARENT_ID,
210
- Tracing::Metadata::Ext::Distributed::DD_PARENT_ID_DEFAULT
210
+ Tracing::Metadata::Ext::Distributed::DD_PARENT_ID_DEFAULT,
211
211
  ) != Tracing::Metadata::Ext::Distributed::DD_PARENT_ID_DEFAULT
212
212
  # tracecontext headers contain a p value, ensure this value is sent to backend
213
213
  tracecontext_tags[Tracing::Metadata::Ext::Distributed::TAG_DD_PARENT_ID]
@@ -87,7 +87,7 @@ module Datadog
87
87
  build_traceparent_string(
88
88
  digest.trace_id,
89
89
  digest.span_id || 0, # Fall back to zero (invalid) if not present
90
- build_trace_flags(digest)
90
+ build_trace_flags(digest),
91
91
  )
92
92
  end
93
93
 
@@ -85,7 +85,7 @@ module Datadog
85
85
  outbound_random_value = reconcile_random_value(
86
86
  random_value_for(trace_id),
87
87
  outbound_threshold,
88
- !!trace_kept
88
+ !!trace_kept,
89
89
  )
90
90
  self.class.new(
91
91
  random_value: format_random_value(outbound_random_value),
@@ -26,7 +26,7 @@ module Datadog
26
26
  set(
27
27
  trace_id: event_trace_op.id,
28
28
  span_id: event_span_op.id,
29
- local_root_span_id: event_trace_op.send(:root_span).id
29
+ local_root_span_id: event_trace_op.send(:root_span).id,
30
30
  )
31
31
  end
32
32
 
@@ -75,14 +75,14 @@ module Datadog
75
75
  set(
76
76
  trace_id: trace_op.id,
77
77
  span_id: active_span.id,
78
- local_root_span_id: trace_op.send(:root_span).id
78
+ local_root_span_id: trace_op.send(:root_span).id,
79
79
  )
80
80
  elsif trace_op.parent_span_id && trace_op.parent_span_id != 0
81
81
  # Active distributed trace context, before first local trace is created
82
82
  set(
83
83
  trace_id: trace_op.id,
84
84
  span_id: trace_op.parent_span_id,
85
- local_root_span_id: UNKNOWN_LOCAL_ROOT_SPAN_ID
85
+ local_root_span_id: UNKNOWN_LOCAL_ROOT_SPAN_ID,
86
86
  )
87
87
  else
88
88
  clear
@@ -51,7 +51,7 @@ module Datadog
51
51
  end
52
52
  rescue => e
53
53
  Datadog.logger.debug(
54
- "trace dropped entirely due to `Pipeline.before_flush` error: #{e.class}: #{e.message}"
54
+ "trace dropped entirely due to `Pipeline.before_flush` error: #{e.class}: #{e.message}",
55
55
  )
56
56
 
57
57
  nil
@@ -62,6 +62,8 @@ module Datadog
62
62
 
63
63
  # @type var parsed: Array[[::Datadog::Core::Remote::Configuration::Content, ::Hash[::String, untyped]]]
64
64
  parsed = []
65
+ # @type var unparseable_contents: Array[Datadog::Core::Remote::Configuration::Content]
66
+ unparseable_contents = []
65
67
  repository.contents.each do |content|
66
68
  next unless content.path.product == PRODUCT
67
69
 
@@ -76,9 +78,8 @@ module Datadog
76
78
  # A present but non-object lib_config (e.g. {"lib_config": []}) is a
77
79
  # schema violation the customer can fix. Acknowledging it as applied
78
80
  # would tell the backend the config was successfully applied when it
79
- # was not, and an empty merge would revert active tracing overrides
80
- # to their non-RC values. Reject it per content so the malformed
81
- # payload is reported errored instead. A null or absent lib_config
81
+ # was not. Reject it per content so the malformed payload is
82
+ # reported errored instead. A null or absent lib_config
82
83
  # carries no overrides and is left as a no-op.
83
84
  lib_config = config["lib_config"]
84
85
  if !lib_config.nil? && !lib_config.is_a?(Hash)
@@ -92,6 +93,7 @@ module Datadog
92
93
  description: "Failed to parse APM_TRACING remote config",
93
94
  )
94
95
  content.errored("#{e.class}: #{e.message}: #{Array(e.backtrace).join("\n")}")
96
+ unparseable_contents << content
95
97
  end
96
98
  end
97
99
 
@@ -117,10 +119,26 @@ module Datadog
117
119
  # deterministic merge.
118
120
  ordered = applicable.sort_by { |content, config| [-config_priority(config), content.path.config_id] }
119
121
  merged = merge_lib_configs(ordered.map { |_content, config| config })
122
+ # The applicable configs carrying a non-null dynamic_instrumentation_enabled
123
+ # value: any of their paths can still supply the signal after a later
124
+ # replacement, so the DI component records them all.
125
+ # @type var enable_signal_paths: Array[Datadog::Core::Remote::Configuration::Path]
126
+ enable_signal_paths = Core::Utils::EnumerableCompat.filter_map(ordered) do |pair|
127
+ content, config = pair
128
+ lib_config = config["lib_config"]
129
+ if lib_config.is_a?(Hash) && !lib_config["dynamic_instrumentation_enabled"].nil?
130
+ content.path
131
+ end
132
+ end
120
133
 
121
134
  # Applied even when the set is empty: an emptied repository (last config
122
135
  # removed) reverts the tracing overrides to their non-RC values.
123
- apply_lib_config(merged, repository)
136
+ apply_lib_config(
137
+ merged,
138
+ repository,
139
+ unparseable_contents: unparseable_contents,
140
+ enable_signal_paths: enable_signal_paths,
141
+ )
124
142
 
125
143
  parsed.each { |content, _config| content.applied }
126
144
  nil
@@ -205,8 +223,10 @@ module Datadog
205
223
  #
206
224
  # @param lib_config [Hash[String, untyped]] the lib_config to apply
207
225
  # @param repository [Core::Remote::Configuration::Repository, nil] forwarded to DI enablement
226
+ # @param unparseable_contents [Array<Core::Remote::Configuration::Content>] the APM_TRACING contents that failed to parse
227
+ # @param enable_signal_paths [Array<Core::Remote::Configuration::Path>] the paths of the applicable configs carrying the field
208
228
  # @return [nil]
209
- def apply_lib_config(lib_config, repository)
229
+ def apply_lib_config(lib_config, repository, unparseable_contents:, enable_signal_paths:)
210
230
  env_vars = Datadog::Tracing::Configuration::Dynamic::OPTIONS.map do |name, env_var, option|
211
231
  value = lib_config[name]
212
232
 
@@ -218,13 +238,30 @@ module Datadog
218
238
  [env_var, telemetry_value]
219
239
  end
220
240
 
221
- if (di_enabled = lib_config["dynamic_instrumentation_enabled"]) != nil # rubocop:disable Style/NonNilCheck
222
- # repository is forwarded so that an enable signal can reconcile DI
223
- # against probes delivered in an earlier poll while DI was stopped
224
- # (see Datadog::DI::Remote.handle_rc_enablement).
241
+ di_enabled = lib_config["dynamic_instrumentation_enabled"]
242
+ # allow_initialization: false because this runs on the remote-config worker
243
+ # thread, and the default would build the component tree from that thread.
244
+ components = Datadog.send(:components, allow_initialization: false)
245
+ di_component = components&.dynamic_instrumentation
246
+ if di_enabled.nil? && di_component&.rc_enablement_signal_withdrawn?(unparseable_contents)
247
+ di_enabled = false
248
+ end
249
+
250
+ # Records the parsed carrier paths and the previously recorded paths whose
251
+ # replacements remain unparseable, on every merge including merges that keep
252
+ # the DI state.
253
+ if di_component
254
+ unparseable_recorded_paths = di_component.rc_enablement_signal_paths.select do |path|
255
+ unparseable_contents.any? { |content| content.path == path }
256
+ end
257
+ di_component.record_rc_enablement_signal_paths(enable_signal_paths + unparseable_recorded_paths)
258
+ end
259
+
260
+ unless di_enabled.nil?
261
+ # repository is forwarded for the stopped->started replay in
262
+ # Datadog::DI::Remote.handle_rc_enablement.
225
263
  Datadog::DI::Remote.handle_rc_enablement(di_enabled, repository)
226
264
 
227
- components = Datadog.send(:components, allow_initialization: false)
228
265
  di_products = Datadog::DI::Remote.products +
229
266
  Datadog::SymbolDatabase::Remote.deferred_products(Datadog.configuration)
230
267
 
@@ -236,7 +273,7 @@ module Datadog
236
273
  # by DD_DYNAMIC_INSTRUMENTATION_ENABLED=false. Advertising then would
237
274
  # report DI as in use when it is not and invite probe configs the
238
275
  # tracer must refuse; withdraw the products otherwise.
239
- if components&.dynamic_instrumentation&.started?
276
+ if di_component&.started?
240
277
  components&.remote&.add_products(*di_products)
241
278
  else
242
279
  components&.remote&.remove_products(*di_products)
@@ -249,13 +286,7 @@ module Datadog
249
286
  Datadog.logger.debug { "APM_TRACING RC: merged dynamic_instrumentation_enabled=#{di_enabled}" }
250
287
  end
251
288
 
252
- # allow_initialization: false because this runs on the remote-config
253
- # worker thread. If components haven't been built yet (e.g. during a
254
- # teardown/reset window), the default value would synchronously build
255
- # the entire component tree from this thread. The &. chain matches the
256
- # pattern used by DI::Remote.handle_rc_enablement in the same dispatch
257
- # path.
258
- Datadog.send(:components, allow_initialization: false)&.telemetry&.client_configuration_change!(env_vars)
289
+ components&.telemetry&.client_configuration_change!(env_vars)
259
290
  nil
260
291
  end
261
292
 
@@ -269,7 +300,7 @@ module Datadog
269
300
 
270
301
  def receiver(products = [PRODUCT], &block)
271
302
  matcher = Core::Remote::Dispatcher::Matcher::Product.new(products)
272
- [Core::Remote::Dispatcher::Receiver.new(matcher, &block)]
303
+ [Core::Remote::Dispatcher::Receiver.new(matcher, initial_reconcile: true, &block)]
273
304
  end
274
305
 
275
306
  private
@@ -68,7 +68,7 @@ module Datadog
68
68
  # full control over the sampling decision.
69
69
  trace.set_tag(
70
70
  Tracing::Metadata::Ext::Distributed::TAG_DECISION_MAKER,
71
- Sampling::Ext::Decision::MANUAL
71
+ Sampling::Ext::Decision::MANUAL,
72
72
  )
73
73
  end
74
74
  else
@@ -34,7 +34,7 @@ module Datadog
34
34
  @matcher.match?(trace)
35
35
  rescue => e
36
36
  Datadog.logger.error(
37
- "Matcher failed. Cause: #{e.class}: #{e.message} Source: #{Array(e.backtrace).first}"
37
+ "Matcher failed. Cause: #{e.class}: #{e.message} Source: #{Array(e.backtrace).first}",
38
38
  )
39
39
  Datadog::Core::Telemetry::Logger.report(e, description: "Matcher failed")
40
40
  nil
@@ -133,7 +133,7 @@ module Datadog
133
133
  apply_rule!(trace, rule)
134
134
  rescue => e
135
135
  Datadog.logger.error(
136
- "Rule sampling failed. Cause: #{e.class}: #{e.message} Source: #{Array(e.backtrace).first}"
136
+ "Rule sampling failed. Cause: #{e.class}: #{e.message} Source: #{Array(e.backtrace).first}",
137
137
  )
138
138
  Datadog::Core::Telemetry::Logger.report(e, description: "Rule sampling failed")
139
139
 
@@ -29,7 +29,7 @@ module Datadog
29
29
  rescue => e
30
30
  Datadog.logger.warn(
31
31
  "Error parsing Span Sampling Rules `#{rules.inspect}`: " \
32
- "#{e.class}: #{e.message} at #{Array(e.backtrace).first}"
32
+ "#{e.class}: #{e.message} at #{Array(e.backtrace).first}",
33
33
  )
34
34
  return nil
35
35
  end
@@ -61,7 +61,7 @@ module Datadog
61
61
  rescue => e
62
62
  Datadog.logger.warn(
63
63
  "Cannot parse Span Sampling Rule #{hash.inspect}: " \
64
- "#{e.class}: #{e.message} at #{Array(e.backtrace).first}"
64
+ "#{e.class}: #{e.message} at #{Array(e.backtrace).first}",
65
65
  )
66
66
  return nil
67
67
  end
@@ -535,7 +535,7 @@ module Datadog
535
535
  trace_id: @trace_id,
536
536
  links: @links,
537
537
  events: @span_events,
538
- service_entry: parent.nil? || (service && parent.service != service)
538
+ service_entry: parent.nil? || (service && parent.service != service),
539
539
  )
540
540
  end
541
541
 
@@ -207,7 +207,7 @@ module Datadog
207
207
  trace_otel_threshold: trace_otel_threshold,
208
208
  trace_otel_unknown_fields: trace_otel_unknown_fields,
209
209
  span_remote: span_remote,
210
- baggage: baggage, **field_value_pairs
210
+ baggage: baggage, **field_value_pairs,
211
211
  )
212
212
  end
213
213
  end
@@ -266,7 +266,7 @@ module Datadog
266
266
  start_time: start_time,
267
267
  tags: tags,
268
268
  type: type,
269
- id: id
269
+ id: id,
270
270
  )
271
271
 
272
272
  # Start span measurement
@@ -327,7 +327,7 @@ module Datadog
327
327
  tags: tags,
328
328
  trace_id: trace_id,
329
329
  type: type,
330
- id: id
330
+ id: id,
331
331
  )
332
332
  rescue => e
333
333
  logger.debug { "Failed to build new span: #{e.class}: #{e.message}" }
@@ -422,7 +422,7 @@ module Datadog
422
422
  trace_otel_threshold: open_telemetry.threshold,
423
423
  trace_otel_unknown_fields: open_telemetry.unknown_fields,
424
424
  span_remote: @remote_parent && @active_span.nil?,
425
- baggage: (@baggage.nil? || @baggage.empty?) ? nil : @baggage
425
+ baggage: (@baggage.nil? || @baggage.empty?) ? nil : @baggage,
426
426
  ).freeze
427
427
  end
428
428
 
@@ -433,7 +433,7 @@ module Datadog
433
433
 
434
434
  Correlation::Identifier.new(
435
435
  trace_id: @id,
436
- span_id: span_id
436
+ span_id: span_id,
437
437
  )
438
438
  end
439
439
 
@@ -460,7 +460,7 @@ module Datadog
460
460
  tags: meta.dup,
461
461
  metrics: metrics.dup,
462
462
  remote_parent: @remote_parent,
463
- distributed_sampling_priority: @distributed_sampling_priority
463
+ distributed_sampling_priority: @distributed_sampling_priority,
464
464
  )
465
465
  end
466
466
 
@@ -640,7 +640,7 @@ module Datadog
640
640
  metrics: metrics,
641
641
  root_span_id: (!partial) ? root_span&.id : nil,
642
642
  profiling_enabled: @profiling_enabled,
643
- apm_tracing_enabled: @apm_tracing_enabled
643
+ apm_tracing_enabled: @apm_tracing_enabled,
644
644
  )
645
645
  end
646
646
 
@@ -59,7 +59,7 @@ module Datadog
59
59
  otel_thread_context: nil,
60
60
  sampler: Sampling::PrioritySampler.new(
61
61
  base_sampler: Sampling::AllSampler.new,
62
- post_sampler: Sampling::RuleSampler.new
62
+ post_sampler: Sampling::RuleSampler.new,
63
63
  ),
64
64
  span_sampler: Sampling::Span::Sampler.new,
65
65
  tags: {},
@@ -80,7 +80,7 @@ module Datadog
80
80
  @otel_thread_context = otel_thread_context
81
81
 
82
82
  @provider = context_provider || DefaultContextProvider.new(
83
- otel_thread_context: otel_thread_context
83
+ otel_thread_context: otel_thread_context,
84
84
  )
85
85
  end
86
86
 
@@ -195,7 +195,7 @@ module Datadog
195
195
  tags: tags,
196
196
  type: type,
197
197
  _trace: trace,
198
- id: id
198
+ id: id,
199
199
  )
200
200
  end
201
201
  end
@@ -406,7 +406,7 @@ module Datadog
406
406
  distributed_sampling_priority: !!sampling_priority,
407
407
  tracer: self,
408
408
  baggage: digest.baggage,
409
- auto_finish: auto_finish
409
+ auto_finish: auto_finish,
410
410
  )
411
411
  else
412
412
  TraceOperation.new(
@@ -416,7 +416,7 @@ module Datadog
416
416
  apm_tracing_enabled: apm_tracing_enabled,
417
417
  remote_parent: false,
418
418
  tracer: self,
419
- auto_finish: auto_finish
419
+ auto_finish: auto_finish,
420
420
  )
421
421
  end
422
422
  end
@@ -516,7 +516,7 @@ module Datadog
516
516
  start_time: start_time,
517
517
  tags: resolve_tags(tags, service),
518
518
  type: type,
519
- id: id
519
+ id: id,
520
520
  )
521
521
 
522
522
  span.start(start_time)
@@ -36,7 +36,7 @@ module Datadog
36
36
 
37
37
  def serialization_failed
38
38
  @reporter.record(chunks_dropped_serialization_error: @remaining_chunks,
39
- spans_dropped_serialization_error: @remaining_spans,)
39
+ spans_dropped_serialization_error: @remaining_spans)
40
40
  end
41
41
 
42
42
  def sent(request, response, chunks, spans, bytes, fallback:)