datadog 2.38.0 → 2.40.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 (834) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +46 -1
  3. data/bin/ddprofrb +4 -4
  4. data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +77 -1
  5. data/ext/datadog_profiling_native_extension/collectors_stack.c +218 -147
  6. data/ext/datadog_profiling_native_extension/collectors_stack.h +16 -2
  7. data/ext/datadog_profiling_native_extension/collectors_thread_context.c +12 -7
  8. data/ext/datadog_profiling_native_extension/crashtracking_runtime_stacks.c +5 -4
  9. data/ext/datadog_profiling_native_extension/datadog_ruby_common.c +19 -11
  10. data/ext/datadog_profiling_native_extension/datadog_ruby_common.h +7 -0
  11. data/ext/datadog_profiling_native_extension/extconf.rb +13 -8
  12. data/ext/datadog_profiling_native_extension/private_vm_api_access.c +259 -65
  13. data/ext/datadog_profiling_native_extension/private_vm_api_access.h +16 -10
  14. data/ext/datadog_profiling_native_extension/setup_signal_handler.c +2 -0
  15. data/ext/libdatadog_api/datadog_ruby_common.c +19 -11
  16. data/ext/libdatadog_api/datadog_ruby_common.h +7 -0
  17. data/ext/libdatadog_api/extconf.rb +24 -24
  18. data/ext/libdatadog_api/feature_flags.c +26 -0
  19. data/ext/libdatadog_api/init.c +4 -0
  20. data/ext/libdatadog_api/trace_exporter.c +974 -0
  21. data/ext/libdatadog_api/trace_exporter.h +5 -0
  22. data/ext/libdatadog_extconf_helpers.rb +9 -9
  23. data/lib/datadog/ai_guard/api_client.rb +2 -2
  24. data/lib/datadog/ai_guard/component.rb +10 -10
  25. data/lib/datadog/ai_guard/evaluation.rb +1 -0
  26. data/lib/datadog/ai_guard/ext.rb +2 -0
  27. data/lib/datadog/appsec/actions_handler/serializable_backtrace.rb +16 -16
  28. data/lib/datadog/appsec/actions_handler.rb +6 -6
  29. data/lib/datadog/appsec/anonymizer.rb +1 -1
  30. data/lib/datadog/appsec/api_security/endpoint_collection/grape_route_serializer.rb +1 -1
  31. data/lib/datadog/appsec/api_security/endpoint_collection/rails_collector.rb +6 -6
  32. data/lib/datadog/appsec/api_security/endpoint_collection/sinatra_route_serializer.rb +1 -1
  33. data/lib/datadog/appsec/api_security/route_extractor.rb +11 -11
  34. data/lib/datadog/appsec/api_security/sampler.rb +5 -5
  35. data/lib/datadog/appsec/api_security.rb +1 -1
  36. data/lib/datadog/appsec/assets.rb +7 -7
  37. data/lib/datadog/appsec/autoload.rb +3 -3
  38. data/lib/datadog/appsec/component.rb +15 -15
  39. data/lib/datadog/appsec/compressed_json.rb +6 -6
  40. data/lib/datadog/appsec/configuration.rb +68 -59
  41. data/lib/datadog/appsec/context.rb +6 -6
  42. data/lib/datadog/appsec/contrib/active_record/instrumentation.rb +6 -6
  43. data/lib/datadog/appsec/contrib/active_record/integration.rb +4 -4
  44. data/lib/datadog/appsec/contrib/active_record/patcher.rb +4 -4
  45. data/lib/datadog/appsec/contrib/aws_lambda/gateway/watcher.rb +7 -7
  46. data/lib/datadog/appsec/contrib/aws_lambda/integration.rb +2 -2
  47. data/lib/datadog/appsec/contrib/aws_lambda/patcher.rb +2 -2
  48. data/lib/datadog/appsec/contrib/aws_lambda/waf_addresses.rb +36 -34
  49. data/lib/datadog/appsec/contrib/devise/data_extractor.rb +3 -3
  50. data/lib/datadog/appsec/contrib/devise/ext.rb +20 -20
  51. data/lib/datadog/appsec/contrib/devise/integration.rb +4 -4
  52. data/lib/datadog/appsec/contrib/devise/patcher.rb +8 -8
  53. data/lib/datadog/appsec/contrib/devise/patches/signin_tracking_patch.rb +12 -12
  54. data/lib/datadog/appsec/contrib/devise/patches/signup_tracking_patch.rb +8 -8
  55. data/lib/datadog/appsec/contrib/devise/tracking_middleware.rb +24 -9
  56. data/lib/datadog/appsec/contrib/excon/integration.rb +4 -4
  57. data/lib/datadog/appsec/contrib/excon/patcher.rb +1 -1
  58. data/lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb +26 -26
  59. data/lib/datadog/appsec/contrib/faraday/integration.rb +4 -4
  60. data/lib/datadog/appsec/contrib/faraday/patcher.rb +4 -4
  61. data/lib/datadog/appsec/contrib/faraday/ssrf_detection_middleware.rb +22 -22
  62. data/lib/datadog/appsec/contrib/graphql/appsec_trace.rb +4 -4
  63. data/lib/datadog/appsec/contrib/graphql/gateway/multiplex.rb +2 -2
  64. data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +7 -7
  65. data/lib/datadog/appsec/contrib/graphql/integration.rb +9 -9
  66. data/lib/datadog/appsec/contrib/graphql/patcher.rb +3 -3
  67. data/lib/datadog/appsec/contrib/rack/buffered_input.rb +1 -1
  68. data/lib/datadog/appsec/contrib/rack/ext.rb +29 -29
  69. data/lib/datadog/appsec/contrib/rack/gateway/request.rb +14 -18
  70. data/lib/datadog/appsec/contrib/rack/gateway/response.rb +1 -1
  71. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +24 -24
  72. data/lib/datadog/appsec/contrib/rack/input_peeker.rb +6 -6
  73. data/lib/datadog/appsec/contrib/rack/integration.rb +6 -6
  74. data/lib/datadog/appsec/contrib/rack/patcher.rb +3 -3
  75. data/lib/datadog/appsec/contrib/rack/request_body_middleware.rb +11 -8
  76. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +26 -26
  77. data/lib/datadog/appsec/contrib/rack/response_body.rb +1 -1
  78. data/lib/datadog/appsec/contrib/rails/gateway/request.rb +10 -10
  79. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +10 -10
  80. data/lib/datadog/appsec/contrib/rails/integration.rb +5 -5
  81. data/lib/datadog/appsec/contrib/rails/patcher.rb +17 -17
  82. data/lib/datadog/appsec/contrib/rails/patches/process_action_patch.rb +2 -2
  83. data/lib/datadog/appsec/contrib/rails/patches/render_to_body_patch.rb +3 -3
  84. data/lib/datadog/appsec/contrib/rails/request.rb +3 -3
  85. data/lib/datadog/appsec/contrib/rails/request_middleware.rb +2 -1
  86. data/lib/datadog/appsec/contrib/rest_client/integration.rb +5 -5
  87. data/lib/datadog/appsec/contrib/rest_client/patcher.rb +1 -1
  88. data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +23 -23
  89. data/lib/datadog/appsec/contrib/sinatra/gateway/request.rb +1 -1
  90. data/lib/datadog/appsec/contrib/sinatra/gateway/route_params.rb +1 -1
  91. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +15 -15
  92. data/lib/datadog/appsec/contrib/sinatra/integration.rb +5 -5
  93. data/lib/datadog/appsec/contrib/sinatra/patcher.rb +11 -11
  94. data/lib/datadog/appsec/contrib/sinatra/patches/json_patch.rb +3 -3
  95. data/lib/datadog/appsec/contrib/sinatra/request_middleware.rb +2 -1
  96. data/lib/datadog/appsec/counter_sampler.rb +1 -1
  97. data/lib/datadog/appsec/event.rb +14 -14
  98. data/lib/datadog/appsec/ext.rb +11 -11
  99. data/lib/datadog/appsec/extensions.rb +2 -2
  100. data/lib/datadog/appsec/instrumentation/gateway.rb +1 -1
  101. data/lib/datadog/appsec/metrics/exporter.rb +8 -8
  102. data/lib/datadog/appsec/metrics/telemetry.rb +7 -7
  103. data/lib/datadog/appsec/metrics/telemetry_exporter.rb +4 -4
  104. data/lib/datadog/appsec/metrics.rb +4 -4
  105. data/lib/datadog/appsec/monitor/gateway/watcher.rb +16 -12
  106. data/lib/datadog/appsec/monitor.rb +1 -1
  107. data/lib/datadog/appsec/processor/rule_loader.rb +26 -26
  108. data/lib/datadog/appsec/rate_limiter.rb +1 -1
  109. data/lib/datadog/appsec/remote.rb +6 -6
  110. data/lib/datadog/appsec/response.rb +21 -21
  111. data/lib/datadog/appsec/route_normalizer/rails_route_pattern.rb +11 -11
  112. data/lib/datadog/appsec/route_normalizer/route_pattern.rb +15 -15
  113. data/lib/datadog/appsec/route_normalizer/route_text.rb +3 -3
  114. data/lib/datadog/appsec/route_normalizer.rb +15 -15
  115. data/lib/datadog/appsec/security_engine/engine.rb +37 -37
  116. data/lib/datadog/appsec/security_engine/runner.rb +2 -2
  117. data/lib/datadog/appsec/security_event.rb +2 -2
  118. data/lib/datadog/appsec/utils/http/body.rb +11 -8
  119. data/lib/datadog/appsec/utils/http/body_reader.rb +1 -1
  120. data/lib/datadog/appsec/utils/http/media_range.rb +15 -15
  121. data/lib/datadog/appsec/utils/http/media_type.rb +4 -4
  122. data/lib/datadog/appsec/utils/http/url_encoded.rb +80 -25
  123. data/lib/datadog/appsec.rb +16 -16
  124. data/lib/datadog/auto_instrument.rb +2 -2
  125. data/lib/datadog/core/buffer/cruby.rb +1 -1
  126. data/lib/datadog/core/buffer/thread_safe.rb +1 -1
  127. data/lib/datadog/core/configuration/agent_settings.rb +1 -1
  128. data/lib/datadog/core/configuration/agent_settings_resolver.rb +15 -15
  129. data/lib/datadog/core/configuration/base.rb +2 -2
  130. data/lib/datadog/core/configuration/components.rb +33 -29
  131. data/lib/datadog/core/configuration/config_helper.rb +3 -3
  132. data/lib/datadog/core/configuration/deprecations.rb +6 -6
  133. data/lib/datadog/core/configuration/ext.rb +11 -11
  134. data/lib/datadog/core/configuration/option.rb +16 -16
  135. data/lib/datadog/core/configuration/option_definition.rb +4 -4
  136. data/lib/datadog/core/configuration/options.rb +1 -1
  137. data/lib/datadog/core/configuration/settings.rb +91 -99
  138. data/lib/datadog/core/configuration/stable_config.rb +1 -1
  139. data/lib/datadog/core/configuration/supported_configurations.rb +5 -1
  140. data/lib/datadog/core/configuration.rb +8 -8
  141. data/lib/datadog/core/contrib/rails/railtie.rb +3 -3
  142. data/lib/datadog/core/crashtracking/component.rb +9 -9
  143. data/lib/datadog/core/crashtracking/tag_builder.rb +5 -5
  144. data/lib/datadog/core/deprecations.rb +1 -1
  145. data/lib/datadog/core/diagnostics/environment_logger.rb +6 -6
  146. data/lib/datadog/core/diagnostics/health.rb +2 -2
  147. data/lib/datadog/core/encoding.rb +4 -4
  148. data/lib/datadog/core/environment/agent_info.rb +2 -2
  149. data/lib/datadog/core/environment/cgroup.rb +4 -4
  150. data/lib/datadog/core/environment/container.rb +9 -9
  151. data/lib/datadog/core/environment/execution.rb +3 -3
  152. data/lib/datadog/core/environment/ext.rb +18 -18
  153. data/lib/datadog/core/environment/gc.rb +1 -1
  154. data/lib/datadog/core/environment/git.rb +2 -2
  155. data/lib/datadog/core/environment/identity.rb +10 -10
  156. data/lib/datadog/core/environment/platform.rb +8 -8
  157. data/lib/datadog/core/environment/process.rb +3 -3
  158. data/lib/datadog/core/environment/socket.rb +2 -2
  159. data/lib/datadog/core/environment/variable_helpers.rb +1 -1
  160. data/lib/datadog/core/environment/vm_cache.rb +1 -1
  161. data/lib/datadog/core/environment/yjit.rb +2 -2
  162. data/lib/datadog/core/error.rb +5 -5
  163. data/lib/datadog/core/evp.rb +2 -2
  164. data/lib/datadog/core/extensions.rb +1 -1
  165. data/lib/datadog/core/feature_flags.rb +2 -2
  166. data/lib/datadog/core/git/ext.rb +4 -4
  167. data/lib/datadog/core/logger.rb +3 -3
  168. data/lib/datadog/core/logging/ext.rb +1 -1
  169. data/lib/datadog/core/metrics/client.rb +20 -20
  170. data/lib/datadog/core/metrics/ext.rb +5 -5
  171. data/lib/datadog/core/metrics/logging.rb +2 -2
  172. data/lib/datadog/core/metrics/options.rb +3 -3
  173. data/lib/datadog/core/pin.rb +1 -1
  174. data/lib/datadog/core/process_discovery.rb +8 -8
  175. data/lib/datadog/core/rate_limiter.rb +1 -1
  176. data/lib/datadog/core/remote/client/capabilities.rb +36 -20
  177. data/lib/datadog/core/remote/client.rb +16 -16
  178. data/lib/datadog/core/remote/component.rb +20 -12
  179. data/lib/datadog/core/remote/configuration/content.rb +3 -3
  180. data/lib/datadog/core/remote/configuration/digest.rb +1 -1
  181. data/lib/datadog/core/remote/configuration/path.rb +9 -9
  182. data/lib/datadog/core/remote/configuration/repository.rb +2 -2
  183. data/lib/datadog/core/remote/configuration/target.rb +9 -9
  184. data/lib/datadog/core/remote/configuration.rb +4 -4
  185. data/lib/datadog/core/remote/ext.rb +3 -3
  186. data/lib/datadog/core/remote/negotiation.rb +1 -1
  187. data/lib/datadog/core/remote/tie/tracing.rb +7 -7
  188. data/lib/datadog/core/remote/transport/config.rb +4 -4
  189. data/lib/datadog/core/remote/transport/http/config.rb +7 -7
  190. data/lib/datadog/core/remote/transport/http/negotiation.rb +4 -4
  191. data/lib/datadog/core/remote/transport/http.rb +10 -10
  192. data/lib/datadog/core/remote/transport/negotiation.rb +3 -3
  193. data/lib/datadog/core/remote/worker.rb +5 -5
  194. data/lib/datadog/core/runtime/ext.rb +22 -22
  195. data/lib/datadog/core/runtime/metrics.rb +9 -9
  196. data/lib/datadog/core/tag_builder.rb +18 -18
  197. data/lib/datadog/core/tag_normalizer.rb +7 -7
  198. data/lib/datadog/core/telemetry/component.rb +13 -13
  199. data/lib/datadog/core/telemetry/emitter.rb +4 -4
  200. data/lib/datadog/core/telemetry/event/app_client_configuration_change.rb +5 -5
  201. data/lib/datadog/core/telemetry/event/app_closing.rb +2 -2
  202. data/lib/datadog/core/telemetry/event/app_dependencies_loaded.rb +2 -2
  203. data/lib/datadog/core/telemetry/event/app_endpoints_loaded.rb +2 -2
  204. data/lib/datadog/core/telemetry/event/app_extended_heartbeat.rb +2 -2
  205. data/lib/datadog/core/telemetry/event/app_heartbeat.rb +2 -2
  206. data/lib/datadog/core/telemetry/event/app_integrations_change.rb +2 -2
  207. data/lib/datadog/core/telemetry/event/app_started.rb +33 -33
  208. data/lib/datadog/core/telemetry/event/base.rb +1 -1
  209. data/lib/datadog/core/telemetry/event/distributions.rb +2 -2
  210. data/lib/datadog/core/telemetry/event/generate_metrics.rb +2 -2
  211. data/lib/datadog/core/telemetry/event/log.rb +4 -4
  212. data/lib/datadog/core/telemetry/event/message_batch.rb +1 -1
  213. data/lib/datadog/core/telemetry/event/synth_app_client_configuration_change.rb +3 -3
  214. data/lib/datadog/core/telemetry/event.rb +16 -16
  215. data/lib/datadog/core/telemetry/ext.rb +11 -11
  216. data/lib/datadog/core/telemetry/logger.rb +1 -1
  217. data/lib/datadog/core/telemetry/logging.rb +5 -5
  218. data/lib/datadog/core/telemetry/metric.rb +7 -7
  219. data/lib/datadog/core/telemetry/metrics_collection.rb +2 -2
  220. data/lib/datadog/core/telemetry/metrics_manager.rb +1 -1
  221. data/lib/datadog/core/telemetry/request.rb +4 -4
  222. data/lib/datadog/core/telemetry/transport/http/telemetry.rb +14 -14
  223. data/lib/datadog/core/telemetry/transport/http.rb +7 -7
  224. data/lib/datadog/core/telemetry/transport/telemetry.rb +3 -3
  225. data/lib/datadog/core/telemetry/worker.rb +6 -6
  226. data/lib/datadog/core/transport/ext.rb +14 -14
  227. data/lib/datadog/core/transport/http/adapters/net.rb +4 -4
  228. data/lib/datadog/core/transport/http/adapters/test.rb +1 -1
  229. data/lib/datadog/core/transport/http/adapters/unix_socket.rb +4 -4
  230. data/lib/datadog/core/transport/http/api/endpoint.rb +1 -1
  231. data/lib/datadog/core/transport/http/api/map.rb +1 -1
  232. data/lib/datadog/core/transport/http/builder.rb +5 -5
  233. data/lib/datadog/core/transport/http/client.rb +2 -2
  234. data/lib/datadog/core/transport/http/response.rb +1 -1
  235. data/lib/datadog/core/transport/http.rb +8 -8
  236. data/lib/datadog/core/transport/transport.rb +1 -1
  237. data/lib/datadog/core/utils/at_fork_monkey_patch.rb +82 -14
  238. data/lib/datadog/core/utils/base64_codec.rb +3 -3
  239. data/lib/datadog/core/utils/duration.rb +1 -1
  240. data/lib/datadog/core/utils/forking.rb +2 -2
  241. data/lib/datadog/core/utils/lru_cache.rb +3 -3
  242. data/lib/datadog/core/utils/network.rb +11 -11
  243. data/lib/datadog/core/utils/only_once_successful.rb +1 -1
  244. data/lib/datadog/core/utils/safe_dup.rb +2 -1
  245. data/lib/datadog/core/utils/sequence.rb +3 -6
  246. data/lib/datadog/core/utils/spawn_monkey_patch.rb +2 -2
  247. data/lib/datadog/core/utils/time.rb +16 -54
  248. data/lib/datadog/core/utils/url.rb +1 -1
  249. data/lib/datadog/core/utils.rb +4 -4
  250. data/lib/datadog/core/workers/async.rb +1 -1
  251. data/lib/datadog/core/workers/polling.rb +2 -2
  252. data/lib/datadog/core/workers/runtime_metrics.rb +4 -4
  253. data/lib/datadog/core.rb +4 -4
  254. data/lib/datadog/data_streams/configuration.rb +3 -3
  255. data/lib/datadog/data_streams/ext.rb +1 -1
  256. data/lib/datadog/data_streams/extensions.rb +2 -2
  257. data/lib/datadog/data_streams/pathway_context.rb +5 -5
  258. data/lib/datadog/data_streams/processor.rb +52 -52
  259. data/lib/datadog/data_streams/transport/http/stats.rb +5 -5
  260. data/lib/datadog/data_streams/transport/http.rb +5 -5
  261. data/lib/datadog/data_streams/transport/stats.rb +7 -7
  262. data/lib/datadog/data_streams.rb +5 -5
  263. data/lib/datadog/di/base.rb +4 -4
  264. data/lib/datadog/di/boot.rb +25 -25
  265. data/lib/datadog/di/code_tracker.rb +6 -6
  266. data/lib/datadog/di/component.rb +11 -3
  267. data/lib/datadog/di/configuration.rb +2 -2
  268. data/lib/datadog/di/contrib/railtie.rb +1 -1
  269. data/lib/datadog/di/contrib.rb +5 -5
  270. data/lib/datadog/di/el/compiler.rb +90 -37
  271. data/lib/datadog/di/el/evaluator.rb +82 -2
  272. data/lib/datadog/di/el/expression.rb +10 -2
  273. data/lib/datadog/di/el.rb +3 -3
  274. data/lib/datadog/di/instrumenter.rb +19 -9
  275. data/lib/datadog/di/logger.rb +1 -1
  276. data/lib/datadog/di/preload.rb +1 -1
  277. data/lib/datadog/di/probe_builder.rb +24 -24
  278. data/lib/datadog/di/probe_file_loader/railtie.rb +1 -1
  279. data/lib/datadog/di/probe_file_loader.rb +5 -5
  280. data/lib/datadog/di/probe_manager.rb +1 -1
  281. data/lib/datadog/di/probe_notification_builder.rb +16 -16
  282. data/lib/datadog/di/probe_notifier_worker.rb +6 -6
  283. data/lib/datadog/di/probe_repository.rb +1 -1
  284. data/lib/datadog/di/remote.rb +3 -3
  285. data/lib/datadog/di/serializer.rb +13 -13
  286. data/lib/datadog/di/transport/diagnostics.rb +5 -5
  287. data/lib/datadog/di/transport/http/diagnostics.rb +3 -3
  288. data/lib/datadog/di/transport/http/input.rb +2 -2
  289. data/lib/datadog/di/transport/http.rb +10 -10
  290. data/lib/datadog/di/transport/input.rb +9 -9
  291. data/lib/datadog/di/utils.rb +4 -4
  292. data/lib/datadog/di.rb +5 -5
  293. data/lib/datadog/error_tracking/collector.rb +2 -2
  294. data/lib/datadog/error_tracking/component.rb +12 -12
  295. data/lib/datadog/error_tracking/configuration.rb +2 -2
  296. data/lib/datadog/error_tracking/ext.rb +7 -7
  297. data/lib/datadog/error_tracking/extensions.rb +2 -2
  298. data/lib/datadog/error_tracking/filters.rb +4 -4
  299. data/lib/datadog/error_tracking.rb +6 -6
  300. data/lib/datadog/kit/appsec/events/v2.rb +39 -39
  301. data/lib/datadog/kit/appsec/events.rb +25 -25
  302. data/lib/datadog/kit/enable_core_dumps.rb +2 -2
  303. data/lib/datadog/kit/identity.rb +18 -18
  304. data/lib/datadog/kit/tracing/method_tracer.rb +7 -7
  305. data/lib/datadog/kit.rb +1 -1
  306. data/lib/datadog/open_feature/component.rb +31 -22
  307. data/lib/datadog/open_feature/configuration.rb +15 -2
  308. data/lib/datadog/open_feature/evaluation_engine.rb +7 -7
  309. data/lib/datadog/open_feature/exposures/buffer.rb +1 -1
  310. data/lib/datadog/open_feature/exposures/deduplicator.rb +1 -1
  311. data/lib/datadog/open_feature/exposures/event.rb +2 -2
  312. data/lib/datadog/open_feature/exposures/reporter.rb +3 -3
  313. data/lib/datadog/open_feature/exposures/worker.rb +6 -6
  314. data/lib/datadog/open_feature/ext.rb +13 -8
  315. data/lib/datadog/open_feature/flag_evaluation/aggregator.rb +8 -8
  316. data/lib/datadog/open_feature/flag_evaluation/writer.rb +36 -36
  317. data/lib/datadog/open_feature/hooks/flag_eval_evp_hook.rb +5 -4
  318. data/lib/datadog/open_feature/hooks/flag_eval_metrics_hook.rb +3 -1
  319. data/lib/datadog/open_feature/hooks/span_enrichment_hook/codec.rb +58 -0
  320. data/lib/datadog/open_feature/hooks/span_enrichment_hook/span_enrichment_state.rb +96 -0
  321. data/lib/datadog/open_feature/hooks/span_enrichment_hook/span_enrichment_state_store.rb +49 -0
  322. data/lib/datadog/open_feature/hooks/span_enrichment_hook.rb +184 -0
  323. data/lib/datadog/open_feature/metrics/flag_eval_metrics.rb +24 -24
  324. data/lib/datadog/open_feature/native_evaluator.rb +4 -4
  325. data/lib/datadog/open_feature/noop_evaluator.rb +3 -3
  326. data/lib/datadog/open_feature/provider.rb +45 -10
  327. data/lib/datadog/open_feature/remote.rb +2 -2
  328. data/lib/datadog/open_feature/resolution_details.rb +4 -2
  329. data/lib/datadog/open_feature/transport.rb +14 -14
  330. data/lib/datadog/open_feature.rb +2 -2
  331. data/lib/datadog/opentelemetry/api/baggage.rb +3 -3
  332. data/lib/datadog/opentelemetry/api/context.rb +4 -4
  333. data/lib/datadog/opentelemetry/configuration/settings.rb +41 -41
  334. data/lib/datadog/opentelemetry/ext.rb +1 -1
  335. data/lib/datadog/opentelemetry/logs.rb +5 -5
  336. data/lib/datadog/opentelemetry/metrics.rb +7 -7
  337. data/lib/datadog/opentelemetry/sdk/configurator.rb +8 -8
  338. data/lib/datadog/opentelemetry/sdk/id_generator.rb +2 -2
  339. data/lib/datadog/opentelemetry/sdk/logs_exporter.rb +6 -6
  340. data/lib/datadog/opentelemetry/sdk/metrics_exporter.rb +5 -5
  341. data/lib/datadog/opentelemetry/sdk/propagator.rb +7 -7
  342. data/lib/datadog/opentelemetry/sdk/span_processor.rb +15 -15
  343. data/lib/datadog/opentelemetry/sdk/trace/span.rb +32 -32
  344. data/lib/datadog/opentelemetry/sdk.rb +2 -2
  345. data/lib/datadog/opentelemetry/signal_configuration.rb +11 -11
  346. data/lib/datadog/opentelemetry/trace.rb +1 -1
  347. data/lib/datadog/opentelemetry.rb +8 -8
  348. data/lib/datadog/profiling/collectors/thread_context.rb +6 -13
  349. data/lib/datadog/profiling/component.rb +1 -0
  350. data/lib/datadog/profiling/exporter.rb +1 -1
  351. data/lib/datadog/profiling/http_transport.rb +1 -1
  352. data/lib/datadog/profiling/sequence_tracker.rb +1 -1
  353. data/lib/datadog/profiling/tag_builder.rb +19 -19
  354. data/lib/datadog/profiling.rb +31 -27
  355. data/lib/datadog/single_step_instrument.rb +1 -1
  356. data/lib/datadog/symbol_database/component.rb +15 -15
  357. data/lib/datadog/symbol_database/configuration.rb +3 -3
  358. data/lib/datadog/symbol_database/extensions.rb +2 -2
  359. data/lib/datadog/symbol_database/extractor.rb +53 -53
  360. data/lib/datadog/symbol_database/file_hash.rb +3 -3
  361. data/lib/datadog/symbol_database/logger.rb +1 -1
  362. data/lib/datadog/symbol_database/remote.rb +21 -6
  363. data/lib/datadog/symbol_database/scope.rb +2 -2
  364. data/lib/datadog/symbol_database/scope_batcher.rb +2 -2
  365. data/lib/datadog/symbol_database/service_version.rb +4 -4
  366. data/lib/datadog/symbol_database/symbol.rb +1 -1
  367. data/lib/datadog/symbol_database/transport/http/endpoint.rb +1 -1
  368. data/lib/datadog/symbol_database/transport/http.rb +6 -6
  369. data/lib/datadog/symbol_database/transport.rb +4 -4
  370. data/lib/datadog/symbol_database/uploader.rb +22 -22
  371. data/lib/datadog/symbol_database.rb +2 -2
  372. data/lib/datadog/tracing/analytics.rb +1 -1
  373. data/lib/datadog/tracing/buffer.rb +5 -5
  374. data/lib/datadog/tracing/client_ip.rb +4 -4
  375. data/lib/datadog/tracing/component.rb +28 -7
  376. data/lib/datadog/tracing/configuration/dynamic.rb +8 -8
  377. data/lib/datadog/tracing/configuration/ext.rb +43 -42
  378. data/lib/datadog/tracing/configuration/http.rb +2 -2
  379. data/lib/datadog/tracing/configuration/settings.rb +32 -16
  380. data/lib/datadog/tracing/context.rb +1 -1
  381. data/lib/datadog/tracing/context_provider.rb +2 -2
  382. data/lib/datadog/tracing/contrib/action_cable/configuration/settings.rb +2 -2
  383. data/lib/datadog/tracing/contrib/action_cable/event.rb +4 -4
  384. data/lib/datadog/tracing/contrib/action_cable/events/broadcast.rb +5 -5
  385. data/lib/datadog/tracing/contrib/action_cable/events/perform_action.rb +4 -4
  386. data/lib/datadog/tracing/contrib/action_cable/events/transmit.rb +5 -5
  387. data/lib/datadog/tracing/contrib/action_cable/events.rb +4 -4
  388. data/lib/datadog/tracing/contrib/action_cable/ext.rb +18 -18
  389. data/lib/datadog/tracing/contrib/action_cable/instrumentation.rb +4 -4
  390. data/lib/datadog/tracing/contrib/action_cable/integration.rb +7 -7
  391. data/lib/datadog/tracing/contrib/action_cable/patcher.rb +4 -4
  392. data/lib/datadog/tracing/contrib/action_mailer/configuration/settings.rb +2 -2
  393. data/lib/datadog/tracing/contrib/action_mailer/event.rb +3 -3
  394. data/lib/datadog/tracing/contrib/action_mailer/events/deliver.rb +8 -8
  395. data/lib/datadog/tracing/contrib/action_mailer/events/process.rb +4 -4
  396. data/lib/datadog/tracing/contrib/action_mailer/events.rb +2 -2
  397. data/lib/datadog/tracing/contrib/action_mailer/ext.rb +18 -18
  398. data/lib/datadog/tracing/contrib/action_mailer/integration.rb +7 -7
  399. data/lib/datadog/tracing/contrib/action_mailer/patcher.rb +3 -3
  400. data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +8 -8
  401. data/lib/datadog/tracing/contrib/action_pack/action_controller/patcher.rb +2 -2
  402. data/lib/datadog/tracing/contrib/action_pack/action_dispatch/instrumentation.rb +4 -4
  403. data/lib/datadog/tracing/contrib/action_pack/action_dispatch/patcher.rb +4 -4
  404. data/lib/datadog/tracing/contrib/action_pack/configuration/settings.rb +3 -3
  405. data/lib/datadog/tracing/contrib/action_pack/ext.rb +10 -10
  406. data/lib/datadog/tracing/contrib/action_pack/integration.rb +7 -7
  407. data/lib/datadog/tracing/contrib/action_pack/patcher.rb +3 -3
  408. data/lib/datadog/tracing/contrib/action_pack/utils.rb +1 -1
  409. data/lib/datadog/tracing/contrib/action_view/configuration/settings.rb +3 -3
  410. data/lib/datadog/tracing/contrib/action_view/event.rb +1 -1
  411. data/lib/datadog/tracing/contrib/action_view/events/render_partial.rb +6 -6
  412. data/lib/datadog/tracing/contrib/action_view/events/render_template.rb +6 -6
  413. data/lib/datadog/tracing/contrib/action_view/events.rb +2 -2
  414. data/lib/datadog/tracing/contrib/action_view/ext.rb +10 -10
  415. data/lib/datadog/tracing/contrib/action_view/integration.rb +11 -11
  416. data/lib/datadog/tracing/contrib/action_view/patcher.rb +5 -5
  417. data/lib/datadog/tracing/contrib/action_view/utils.rb +2 -2
  418. data/lib/datadog/tracing/contrib/active_job/configuration/settings.rb +2 -2
  419. data/lib/datadog/tracing/contrib/active_job/data_streams.rb +2 -2
  420. data/lib/datadog/tracing/contrib/active_job/event.rb +3 -3
  421. data/lib/datadog/tracing/contrib/active_job/events/discard.rb +5 -5
  422. data/lib/datadog/tracing/contrib/active_job/events/enqueue.rb +5 -5
  423. data/lib/datadog/tracing/contrib/active_job/events/enqueue_at.rb +5 -5
  424. data/lib/datadog/tracing/contrib/active_job/events/enqueue_retry.rb +5 -5
  425. data/lib/datadog/tracing/contrib/active_job/events/perform.rb +5 -5
  426. data/lib/datadog/tracing/contrib/active_job/events/retry_stopped.rb +5 -5
  427. data/lib/datadog/tracing/contrib/active_job/events.rb +6 -6
  428. data/lib/datadog/tracing/contrib/active_job/ext.rb +23 -23
  429. data/lib/datadog/tracing/contrib/active_job/integration.rb +7 -7
  430. data/lib/datadog/tracing/contrib/active_job/patcher.rb +7 -7
  431. data/lib/datadog/tracing/contrib/active_model_serializers/configuration/settings.rb +2 -2
  432. data/lib/datadog/tracing/contrib/active_model_serializers/event.rb +4 -4
  433. data/lib/datadog/tracing/contrib/active_model_serializers/events/render.rb +6 -6
  434. data/lib/datadog/tracing/contrib/active_model_serializers/events/serialize.rb +6 -6
  435. data/lib/datadog/tracing/contrib/active_model_serializers/events.rb +2 -2
  436. data/lib/datadog/tracing/contrib/active_model_serializers/ext.rb +10 -10
  437. data/lib/datadog/tracing/contrib/active_model_serializers/integration.rb +5 -5
  438. data/lib/datadog/tracing/contrib/active_model_serializers/patcher.rb +3 -3
  439. data/lib/datadog/tracing/contrib/active_record/configuration/makara_resolver.rb +1 -1
  440. data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +6 -6
  441. data/lib/datadog/tracing/contrib/active_record/configuration/settings.rb +4 -4
  442. data/lib/datadog/tracing/contrib/active_record/event.rb +1 -1
  443. data/lib/datadog/tracing/contrib/active_record/events/instantiation.rb +8 -8
  444. data/lib/datadog/tracing/contrib/active_record/events/sql.rb +9 -9
  445. data/lib/datadog/tracing/contrib/active_record/events.rb +2 -2
  446. data/lib/datadog/tracing/contrib/active_record/ext.rb +15 -15
  447. data/lib/datadog/tracing/contrib/active_record/integration.rb +11 -11
  448. data/lib/datadog/tracing/contrib/active_record/patcher.rb +2 -2
  449. data/lib/datadog/tracing/contrib/active_record/utils.rb +3 -3
  450. data/lib/datadog/tracing/contrib/active_support/cache/event.rb +1 -1
  451. data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +11 -11
  452. data/lib/datadog/tracing/contrib/active_support/cache/events.rb +1 -1
  453. data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +4 -4
  454. data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +5 -5
  455. data/lib/datadog/tracing/contrib/active_support/cache/redis.rb +4 -4
  456. data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +3 -3
  457. data/lib/datadog/tracing/contrib/active_support/ext.rb +16 -16
  458. data/lib/datadog/tracing/contrib/active_support/integration.rb +8 -8
  459. data/lib/datadog/tracing/contrib/active_support/notifications/event.rb +1 -1
  460. data/lib/datadog/tracing/contrib/active_support/notifications/subscriber.rb +2 -2
  461. data/lib/datadog/tracing/contrib/active_support/notifications/subscription.rb +1 -1
  462. data/lib/datadog/tracing/contrib/active_support/patcher.rb +2 -2
  463. data/lib/datadog/tracing/contrib/analytics.rb +1 -1
  464. data/lib/datadog/tracing/contrib/auto_instrument.rb +4 -4
  465. data/lib/datadog/tracing/contrib/aws/configuration/settings.rb +3 -3
  466. data/lib/datadog/tracing/contrib/aws/ext.rb +25 -25
  467. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +5 -5
  468. data/lib/datadog/tracing/contrib/aws/integration.rb +9 -9
  469. data/lib/datadog/tracing/contrib/aws/parsed_context.rb +1 -1
  470. data/lib/datadog/tracing/contrib/aws/patcher.rb +5 -5
  471. data/lib/datadog/tracing/contrib/aws/service/dynamodb.rb +2 -2
  472. data/lib/datadog/tracing/contrib/aws/service/eventbridge.rb +2 -2
  473. data/lib/datadog/tracing/contrib/aws/service/kinesis.rb +4 -4
  474. data/lib/datadog/tracing/contrib/aws/service/s3.rb +2 -2
  475. data/lib/datadog/tracing/contrib/aws/service/sns.rb +3 -3
  476. data/lib/datadog/tracing/contrib/aws/service/sqs.rb +3 -3
  477. data/lib/datadog/tracing/contrib/aws/service/states.rb +5 -5
  478. data/lib/datadog/tracing/contrib/aws/services.rb +14 -14
  479. data/lib/datadog/tracing/contrib/concurrent_ruby/async_patch.rb +1 -1
  480. data/lib/datadog/tracing/contrib/concurrent_ruby/configuration/settings.rb +2 -2
  481. data/lib/datadog/tracing/contrib/concurrent_ruby/context_composite_executor_service.rb +1 -1
  482. data/lib/datadog/tracing/contrib/concurrent_ruby/ext.rb +2 -2
  483. data/lib/datadog/tracing/contrib/concurrent_ruby/future_patch.rb +1 -1
  484. data/lib/datadog/tracing/contrib/concurrent_ruby/integration.rb +6 -6
  485. data/lib/datadog/tracing/contrib/concurrent_ruby/patcher.rb +4 -4
  486. data/lib/datadog/tracing/contrib/concurrent_ruby/promises_future_patch.rb +1 -1
  487. data/lib/datadog/tracing/contrib/configurable.rb +2 -2
  488. data/lib/datadog/tracing/contrib/configuration/resolvers/pattern_resolver.rb +1 -1
  489. data/lib/datadog/tracing/contrib/configuration/settings.rb +2 -2
  490. data/lib/datadog/tracing/contrib/dalli/configuration/settings.rb +2 -2
  491. data/lib/datadog/tracing/contrib/dalli/ext.rb +13 -13
  492. data/lib/datadog/tracing/contrib/dalli/instrumentation.rb +5 -5
  493. data/lib/datadog/tracing/contrib/dalli/integration.rb +7 -7
  494. data/lib/datadog/tracing/contrib/dalli/patcher.rb +3 -3
  495. data/lib/datadog/tracing/contrib/dalli/quantize.rb +2 -2
  496. data/lib/datadog/tracing/contrib/delayed_job/configuration/settings.rb +2 -2
  497. data/lib/datadog/tracing/contrib/delayed_job/ext.rb +14 -14
  498. data/lib/datadog/tracing/contrib/delayed_job/integration.rb +5 -5
  499. data/lib/datadog/tracing/contrib/delayed_job/patcher.rb +3 -3
  500. data/lib/datadog/tracing/contrib/delayed_job/plugin.rb +5 -5
  501. data/lib/datadog/tracing/contrib/elasticsearch/configuration/settings.rb +2 -2
  502. data/lib/datadog/tracing/contrib/elasticsearch/ext.rb +15 -15
  503. data/lib/datadog/tracing/contrib/elasticsearch/integration.rb +6 -6
  504. data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +10 -10
  505. data/lib/datadog/tracing/contrib/elasticsearch/quantize.rb +2 -2
  506. data/lib/datadog/tracing/contrib/ethon/configuration/settings.rb +2 -2
  507. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +8 -8
  508. data/lib/datadog/tracing/contrib/ethon/ext.rb +13 -13
  509. data/lib/datadog/tracing/contrib/ethon/integration.rb +6 -6
  510. data/lib/datadog/tracing/contrib/ethon/multi_patch.rb +3 -3
  511. data/lib/datadog/tracing/contrib/ethon/patcher.rb +3 -3
  512. data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +5 -5
  513. data/lib/datadog/tracing/contrib/excon/ext.rb +11 -11
  514. data/lib/datadog/tracing/contrib/excon/integration.rb +6 -6
  515. data/lib/datadog/tracing/contrib/excon/middleware.rb +8 -8
  516. data/lib/datadog/tracing/contrib/excon/patcher.rb +2 -2
  517. data/lib/datadog/tracing/contrib/ext.rb +15 -15
  518. data/lib/datadog/tracing/contrib/extensions.rb +2 -2
  519. data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +4 -4
  520. data/lib/datadog/tracing/contrib/faraday/ext.rb +11 -11
  521. data/lib/datadog/tracing/contrib/faraday/integration.rb +6 -6
  522. data/lib/datadog/tracing/contrib/faraday/middleware.rb +8 -8
  523. data/lib/datadog/tracing/contrib/faraday/patcher.rb +6 -6
  524. data/lib/datadog/tracing/contrib/grape/configuration/settings.rb +4 -4
  525. data/lib/datadog/tracing/contrib/grape/endpoint.rb +20 -20
  526. data/lib/datadog/tracing/contrib/grape/ext.rb +15 -15
  527. data/lib/datadog/tracing/contrib/grape/instrumentation.rb +3 -3
  528. data/lib/datadog/tracing/contrib/grape/integration.rb +5 -5
  529. data/lib/datadog/tracing/contrib/grape/patcher.rb +5 -5
  530. data/lib/datadog/tracing/contrib/graphql/configuration/error_extension_env_parser.rb +1 -1
  531. data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +3 -3
  532. data/lib/datadog/tracing/contrib/graphql/ext.rb +9 -9
  533. data/lib/datadog/tracing/contrib/graphql/integration.rb +9 -9
  534. data/lib/datadog/tracing/contrib/graphql/patcher.rb +7 -7
  535. data/lib/datadog/tracing/contrib/graphql/unified_trace.rb +37 -37
  536. data/lib/datadog/tracing/contrib/graphql/unified_trace_patcher.rb +2 -2
  537. data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +2 -2
  538. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +7 -7
  539. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +7 -7
  540. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor.rb +6 -6
  541. data/lib/datadog/tracing/contrib/grpc/distributed/fetcher.rb +1 -1
  542. data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +8 -8
  543. data/lib/datadog/tracing/contrib/grpc/ext.rb +14 -14
  544. data/lib/datadog/tracing/contrib/grpc/formatting.rb +7 -7
  545. data/lib/datadog/tracing/contrib/grpc/integration.rb +5 -5
  546. data/lib/datadog/tracing/contrib/grpc/intercept_with_datadog.rb +1 -1
  547. data/lib/datadog/tracing/contrib/grpc/patcher.rb +3 -3
  548. data/lib/datadog/tracing/contrib/grpc.rb +6 -6
  549. data/lib/datadog/tracing/contrib/hanami/action_tracer.rb +3 -3
  550. data/lib/datadog/tracing/contrib/hanami/configuration/settings.rb +2 -2
  551. data/lib/datadog/tracing/contrib/hanami/ext.rb +8 -8
  552. data/lib/datadog/tracing/contrib/hanami/integration.rb +6 -6
  553. data/lib/datadog/tracing/contrib/hanami/patcher.rb +5 -5
  554. data/lib/datadog/tracing/contrib/hanami/renderer_policy_tracing.rb +3 -3
  555. data/lib/datadog/tracing/contrib/hanami/router_tracing.rb +5 -4
  556. data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +1 -1
  557. data/lib/datadog/tracing/contrib/http/configuration/settings.rb +4 -4
  558. data/lib/datadog/tracing/contrib/http/distributed/fetcher.rb +3 -3
  559. data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +8 -8
  560. data/lib/datadog/tracing/contrib/http/ext.rb +11 -11
  561. data/lib/datadog/tracing/contrib/http/instrumentation.rb +6 -6
  562. data/lib/datadog/tracing/contrib/http/integration.rb +7 -7
  563. data/lib/datadog/tracing/contrib/http/patcher.rb +3 -3
  564. data/lib/datadog/tracing/contrib/http.rb +6 -6
  565. data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +4 -4
  566. data/lib/datadog/tracing/contrib/httpclient/ext.rb +11 -11
  567. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +5 -5
  568. data/lib/datadog/tracing/contrib/httpclient/integration.rb +6 -6
  569. data/lib/datadog/tracing/contrib/httpclient/patcher.rb +3 -3
  570. data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +4 -4
  571. data/lib/datadog/tracing/contrib/httprb/ext.rb +11 -11
  572. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +6 -6
  573. data/lib/datadog/tracing/contrib/httprb/integration.rb +7 -7
  574. data/lib/datadog/tracing/contrib/httprb/patcher.rb +3 -3
  575. data/lib/datadog/tracing/contrib/integration.rb +3 -3
  576. data/lib/datadog/tracing/contrib/kafka/configuration/settings.rb +2 -2
  577. data/lib/datadog/tracing/contrib/kafka/event.rb +3 -3
  578. data/lib/datadog/tracing/contrib/kafka/events/connection/request.rb +7 -3
  579. data/lib/datadog/tracing/contrib/kafka/events/consumer/process_batch.rb +4 -4
  580. data/lib/datadog/tracing/contrib/kafka/events/consumer/process_message.rb +4 -4
  581. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/heartbeat.rb +5 -5
  582. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/join_group.rb +5 -5
  583. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/leave_group.rb +5 -5
  584. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/sync_group.rb +5 -5
  585. data/lib/datadog/tracing/contrib/kafka/events/produce_operation/send_messages.rb +10 -5
  586. data/lib/datadog/tracing/contrib/kafka/events/producer/deliver_messages.rb +10 -5
  587. data/lib/datadog/tracing/contrib/kafka/events.rb +9 -9
  588. data/lib/datadog/tracing/contrib/kafka/ext.rb +40 -40
  589. data/lib/datadog/tracing/contrib/kafka/instrumentation/consumer.rb +2 -2
  590. data/lib/datadog/tracing/contrib/kafka/instrumentation/producer.rb +4 -4
  591. data/lib/datadog/tracing/contrib/kafka/integration.rb +6 -6
  592. data/lib/datadog/tracing/contrib/kafka/patcher.rb +5 -5
  593. data/lib/datadog/tracing/contrib/karafka/configuration/settings.rb +2 -2
  594. data/lib/datadog/tracing/contrib/karafka/distributed/propagation.rb +8 -8
  595. data/lib/datadog/tracing/contrib/karafka/ext.rb +13 -13
  596. data/lib/datadog/tracing/contrib/karafka/integration.rb +5 -5
  597. data/lib/datadog/tracing/contrib/karafka/monitor.rb +14 -14
  598. data/lib/datadog/tracing/contrib/karafka/patcher.rb +8 -8
  599. data/lib/datadog/tracing/contrib/karafka.rb +6 -6
  600. data/lib/datadog/tracing/contrib/lograge/configuration/settings.rb +2 -2
  601. data/lib/datadog/tracing/contrib/lograge/ext.rb +1 -1
  602. data/lib/datadog/tracing/contrib/lograge/integration.rb +5 -5
  603. data/lib/datadog/tracing/contrib/lograge/patcher.rb +9 -9
  604. data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +2 -2
  605. data/lib/datadog/tracing/contrib/mongodb/ext.rb +18 -18
  606. data/lib/datadog/tracing/contrib/mongodb/instrumentation.rb +3 -3
  607. data/lib/datadog/tracing/contrib/mongodb/integration.rb +7 -7
  608. data/lib/datadog/tracing/contrib/mongodb/parsers.rb +5 -5
  609. data/lib/datadog/tracing/contrib/mongodb/patcher.rb +3 -3
  610. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +13 -13
  611. data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +3 -3
  612. data/lib/datadog/tracing/contrib/mysql2/ext.rb +11 -11
  613. data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +6 -6
  614. data/lib/datadog/tracing/contrib/mysql2/integration.rb +5 -5
  615. data/lib/datadog/tracing/contrib/mysql2/patcher.rb +2 -2
  616. data/lib/datadog/tracing/contrib/opensearch/configuration/settings.rb +2 -2
  617. data/lib/datadog/tracing/contrib/opensearch/ext.rb +22 -22
  618. data/lib/datadog/tracing/contrib/opensearch/integration.rb +6 -6
  619. data/lib/datadog/tracing/contrib/opensearch/patcher.rb +13 -13
  620. data/lib/datadog/tracing/contrib/opensearch/quantize.rb +3 -3
  621. data/lib/datadog/tracing/contrib/patcher.rb +2 -2
  622. data/lib/datadog/tracing/contrib/pg/configuration/settings.rb +3 -3
  623. data/lib/datadog/tracing/contrib/pg/ext.rb +19 -19
  624. data/lib/datadog/tracing/contrib/pg/instrumentation.rb +6 -6
  625. data/lib/datadog/tracing/contrib/pg/integration.rb +5 -5
  626. data/lib/datadog/tracing/contrib/pg/patcher.rb +2 -2
  627. data/lib/datadog/tracing/contrib/presto/configuration/settings.rb +2 -2
  628. data/lib/datadog/tracing/contrib/presto/ext.rb +21 -21
  629. data/lib/datadog/tracing/contrib/presto/instrumentation.rb +2 -2
  630. data/lib/datadog/tracing/contrib/presto/integration.rb +6 -6
  631. data/lib/datadog/tracing/contrib/presto/patcher.rb +4 -4
  632. data/lib/datadog/tracing/contrib/propagation/sql_comment/comment.rb +2 -2
  633. data/lib/datadog/tracing/contrib/propagation/sql_comment/ext.rb +17 -17
  634. data/lib/datadog/tracing/contrib/propagation/sql_comment/mode.rb +1 -1
  635. data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +5 -5
  636. data/lib/datadog/tracing/contrib/que/configuration/settings.rb +2 -2
  637. data/lib/datadog/tracing/contrib/que/ext.rb +19 -19
  638. data/lib/datadog/tracing/contrib/que/integration.rb +6 -6
  639. data/lib/datadog/tracing/contrib/que/patcher.rb +1 -1
  640. data/lib/datadog/tracing/contrib/que/tracer.rb +1 -1
  641. data/lib/datadog/tracing/contrib/racecar/configuration/settings.rb +3 -3
  642. data/lib/datadog/tracing/contrib/racecar/event.rb +4 -4
  643. data/lib/datadog/tracing/contrib/racecar/events/batch.rb +3 -3
  644. data/lib/datadog/tracing/contrib/racecar/events/consume.rb +3 -3
  645. data/lib/datadog/tracing/contrib/racecar/events/message.rb +3 -3
  646. data/lib/datadog/tracing/contrib/racecar/events.rb +3 -3
  647. data/lib/datadog/tracing/contrib/racecar/ext.rb +18 -18
  648. data/lib/datadog/tracing/contrib/racecar/integration.rb +5 -5
  649. data/lib/datadog/tracing/contrib/racecar/patcher.rb +3 -3
  650. data/lib/datadog/tracing/contrib/rack/configuration/settings.rb +2 -2
  651. data/lib/datadog/tracing/contrib/rack/ext.rb +33 -33
  652. data/lib/datadog/tracing/contrib/rack/header_collection.rb +3 -3
  653. data/lib/datadog/tracing/contrib/rack/header_tagging.rb +4 -4
  654. data/lib/datadog/tracing/contrib/rack/integration.rb +6 -6
  655. data/lib/datadog/tracing/contrib/rack/middlewares.rb +24 -24
  656. data/lib/datadog/tracing/contrib/rack/patcher.rb +2 -2
  657. data/lib/datadog/tracing/contrib/rack/request_queue.rb +3 -3
  658. data/lib/datadog/tracing/contrib/rack/route_inference.rb +11 -11
  659. data/lib/datadog/tracing/contrib/rack/trace_proxy_middleware.rb +15 -15
  660. data/lib/datadog/tracing/contrib/rails/auto_instrument_railtie.rb +1 -1
  661. data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +3 -3
  662. data/lib/datadog/tracing/contrib/rails/ext.rb +15 -15
  663. data/lib/datadog/tracing/contrib/rails/framework.rb +11 -11
  664. data/lib/datadog/tracing/contrib/rails/integration.rb +5 -5
  665. data/lib/datadog/tracing/contrib/rails/middlewares.rb +1 -1
  666. data/lib/datadog/tracing/contrib/rails/patcher.rb +8 -8
  667. data/lib/datadog/tracing/contrib/rails/railtie.rb +4 -4
  668. data/lib/datadog/tracing/contrib/rails/runner.rb +1 -1
  669. data/lib/datadog/tracing/contrib/rake/configuration/settings.rb +3 -3
  670. data/lib/datadog/tracing/contrib/rake/ext.rb +12 -12
  671. data/lib/datadog/tracing/contrib/rake/instrumentation.rb +4 -4
  672. data/lib/datadog/tracing/contrib/rake/integration.rb +5 -5
  673. data/lib/datadog/tracing/contrib/rake/patcher.rb +3 -3
  674. data/lib/datadog/tracing/contrib/redis/configuration/resolver.rb +2 -2
  675. data/lib/datadog/tracing/contrib/redis/configuration/settings.rb +2 -2
  676. data/lib/datadog/tracing/contrib/redis/ext.rb +16 -16
  677. data/lib/datadog/tracing/contrib/redis/instrumentation.rb +6 -6
  678. data/lib/datadog/tracing/contrib/redis/integration.rb +7 -7
  679. data/lib/datadog/tracing/contrib/redis/patcher.rb +10 -10
  680. data/lib/datadog/tracing/contrib/redis/quantize.rb +4 -4
  681. data/lib/datadog/tracing/contrib/redis/tags.rb +5 -5
  682. data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +5 -5
  683. data/lib/datadog/tracing/contrib/resque/configuration/settings.rb +2 -2
  684. data/lib/datadog/tracing/contrib/resque/ext.rb +7 -7
  685. data/lib/datadog/tracing/contrib/resque/integration.rb +5 -5
  686. data/lib/datadog/tracing/contrib/resque/patcher.rb +3 -3
  687. data/lib/datadog/tracing/contrib/resque/resque_job.rb +5 -5
  688. data/lib/datadog/tracing/contrib/rest_client/configuration/settings.rb +2 -2
  689. data/lib/datadog/tracing/contrib/rest_client/ext.rb +10 -10
  690. data/lib/datadog/tracing/contrib/rest_client/integration.rb +6 -6
  691. data/lib/datadog/tracing/contrib/rest_client/patcher.rb +2 -2
  692. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +5 -5
  693. data/lib/datadog/tracing/contrib/roda/configuration/settings.rb +2 -2
  694. data/lib/datadog/tracing/contrib/roda/ext.rb +6 -6
  695. data/lib/datadog/tracing/contrib/roda/instrumentation.rb +4 -4
  696. data/lib/datadog/tracing/contrib/roda/integration.rb +6 -6
  697. data/lib/datadog/tracing/contrib/roda/patcher.rb +3 -3
  698. data/lib/datadog/tracing/contrib/semantic_logger/configuration/settings.rb +2 -2
  699. data/lib/datadog/tracing/contrib/semantic_logger/ext.rb +1 -1
  700. data/lib/datadog/tracing/contrib/semantic_logger/integration.rb +5 -5
  701. data/lib/datadog/tracing/contrib/semantic_logger/patcher.rb +2 -2
  702. data/lib/datadog/tracing/contrib/sequel/configuration/settings.rb +2 -2
  703. data/lib/datadog/tracing/contrib/sequel/database.rb +6 -10
  704. data/lib/datadog/tracing/contrib/sequel/dataset.rb +5 -5
  705. data/lib/datadog/tracing/contrib/sequel/ext.rb +12 -8
  706. data/lib/datadog/tracing/contrib/sequel/integration.rb +5 -5
  707. data/lib/datadog/tracing/contrib/sequel/patcher.rb +3 -3
  708. data/lib/datadog/tracing/contrib/sequel/utils.rb +113 -8
  709. data/lib/datadog/tracing/contrib/shoryuken/configuration/settings.rb +2 -2
  710. data/lib/datadog/tracing/contrib/shoryuken/ext.rb +12 -12
  711. data/lib/datadog/tracing/contrib/shoryuken/integration.rb +6 -6
  712. data/lib/datadog/tracing/contrib/shoryuken/patcher.rb +1 -1
  713. data/lib/datadog/tracing/contrib/shoryuken/tracer.rb +2 -2
  714. data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +8 -8
  715. data/lib/datadog/tracing/contrib/sidekiq/configuration/settings.rb +2 -2
  716. data/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb +9 -9
  717. data/lib/datadog/tracing/contrib/sidekiq/ext.rb +30 -30
  718. data/lib/datadog/tracing/contrib/sidekiq/integration.rb +7 -7
  719. data/lib/datadog/tracing/contrib/sidekiq/patcher.rb +8 -8
  720. data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +13 -13
  721. data/lib/datadog/tracing/contrib/sidekiq/utils.rb +9 -9
  722. data/lib/datadog/tracing/contrib/sidekiq.rb +6 -6
  723. data/lib/datadog/tracing/contrib/sinatra/configuration/settings.rb +2 -2
  724. data/lib/datadog/tracing/contrib/sinatra/env.rb +6 -6
  725. data/lib/datadog/tracing/contrib/sinatra/ext.rb +17 -17
  726. data/lib/datadog/tracing/contrib/sinatra/framework.rb +1 -1
  727. data/lib/datadog/tracing/contrib/sinatra/integration.rb +5 -5
  728. data/lib/datadog/tracing/contrib/sinatra/patcher.rb +5 -5
  729. data/lib/datadog/tracing/contrib/sinatra/tracer.rb +10 -10
  730. data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +8 -8
  731. data/lib/datadog/tracing/contrib/sneakers/configuration/settings.rb +1 -1
  732. data/lib/datadog/tracing/contrib/sneakers/ext.rb +12 -12
  733. data/lib/datadog/tracing/contrib/sneakers/integration.rb +7 -7
  734. data/lib/datadog/tracing/contrib/sneakers/patcher.rb +2 -2
  735. data/lib/datadog/tracing/contrib/sneakers/tracer.rb +3 -3
  736. data/lib/datadog/tracing/contrib/span_attribute_schema.rb +2 -2
  737. data/lib/datadog/tracing/contrib/status_range_env_parser.rb +2 -2
  738. data/lib/datadog/tracing/contrib/status_range_matcher.rb +1 -1
  739. data/lib/datadog/tracing/contrib/stripe/configuration/settings.rb +2 -2
  740. data/lib/datadog/tracing/contrib/stripe/ext.rb +12 -12
  741. data/lib/datadog/tracing/contrib/stripe/integration.rb +5 -5
  742. data/lib/datadog/tracing/contrib/stripe/patcher.rb +2 -2
  743. data/lib/datadog/tracing/contrib/stripe/request.rb +3 -3
  744. data/lib/datadog/tracing/contrib/sucker_punch/configuration/settings.rb +2 -2
  745. data/lib/datadog/tracing/contrib/sucker_punch/exception_handler.rb +1 -1
  746. data/lib/datadog/tracing/contrib/sucker_punch/ext.rb +13 -13
  747. data/lib/datadog/tracing/contrib/sucker_punch/instrumentation.rb +4 -4
  748. data/lib/datadog/tracing/contrib/sucker_punch/integration.rb +5 -5
  749. data/lib/datadog/tracing/contrib/sucker_punch/patcher.rb +4 -4
  750. data/lib/datadog/tracing/contrib/trilogy/configuration/settings.rb +3 -3
  751. data/lib/datadog/tracing/contrib/trilogy/ext.rb +11 -11
  752. data/lib/datadog/tracing/contrib/trilogy/instrumentation.rb +6 -6
  753. data/lib/datadog/tracing/contrib/trilogy/integration.rb +5 -5
  754. data/lib/datadog/tracing/contrib/trilogy/patcher.rb +2 -2
  755. data/lib/datadog/tracing/contrib/utils/database.rb +5 -5
  756. data/lib/datadog/tracing/contrib/utils/quantization/hash_formatter.rb +1 -1
  757. data/lib/datadog/tracing/contrib/utils/quantization/http.rb +10 -10
  758. data/lib/datadog/tracing/contrib/waterdrop/configuration/settings.rb +2 -2
  759. data/lib/datadog/tracing/contrib/waterdrop/distributed/propagation.rb +8 -8
  760. data/lib/datadog/tracing/contrib/waterdrop/ext.rb +4 -4
  761. data/lib/datadog/tracing/contrib/waterdrop/integration.rb +5 -5
  762. data/lib/datadog/tracing/contrib/waterdrop/middleware.rb +2 -2
  763. data/lib/datadog/tracing/contrib/waterdrop/patcher.rb +7 -7
  764. data/lib/datadog/tracing/contrib/waterdrop/producer.rb +3 -3
  765. data/lib/datadog/tracing/contrib/waterdrop.rb +6 -6
  766. data/lib/datadog/tracing/contrib.rb +54 -54
  767. data/lib/datadog/tracing/correlation.rb +10 -10
  768. data/lib/datadog/tracing/diagnostics/environment_logger.rb +9 -9
  769. data/lib/datadog/tracing/diagnostics/ext.rb +19 -19
  770. data/lib/datadog/tracing/diagnostics/health.rb +1 -1
  771. data/lib/datadog/tracing/distributed/b3_multi.rb +8 -8
  772. data/lib/datadog/tracing/distributed/b3_single.rb +4 -4
  773. data/lib/datadog/tracing/distributed/baggage.rb +27 -27
  774. data/lib/datadog/tracing/distributed/datadog.rb +21 -21
  775. data/lib/datadog/tracing/distributed/datadog_tags_codec.rb +3 -3
  776. data/lib/datadog/tracing/distributed/fetcher.rb +1 -1
  777. data/lib/datadog/tracing/distributed/helpers.rb +3 -3
  778. data/lib/datadog/tracing/distributed/propagation.rb +12 -12
  779. data/lib/datadog/tracing/distributed/propagation_policy.rb +5 -0
  780. data/lib/datadog/tracing/distributed/trace_context.rb +33 -33
  781. data/lib/datadog/tracing/event.rb +1 -1
  782. data/lib/datadog/tracing/ext.rb +1 -1
  783. data/lib/datadog/tracing/metadata/analytics.rb +2 -2
  784. data/lib/datadog/tracing/metadata/errors.rb +4 -4
  785. data/lib/datadog/tracing/metadata/ext.rb +69 -69
  786. data/lib/datadog/tracing/metadata/metastruct.rb +1 -1
  787. data/lib/datadog/tracing/metadata/metastruct_tagging.rb +1 -1
  788. data/lib/datadog/tracing/metadata/tagging.rb +2 -2
  789. data/lib/datadog/tracing/metadata.rb +4 -4
  790. data/lib/datadog/tracing/pipeline/span_filter.rb +2 -2
  791. data/lib/datadog/tracing/pipeline.rb +2 -2
  792. data/lib/datadog/tracing/remote.rb +23 -16
  793. data/lib/datadog/tracing/sampling/all_sampler.rb +1 -1
  794. data/lib/datadog/tracing/sampling/ext.rb +8 -8
  795. data/lib/datadog/tracing/sampling/matcher.rb +4 -4
  796. data/lib/datadog/tracing/sampling/priority_sampler.rb +4 -4
  797. data/lib/datadog/tracing/sampling/rate_by_key_sampler.rb +3 -3
  798. data/lib/datadog/tracing/sampling/rate_by_service_sampler.rb +2 -2
  799. data/lib/datadog/tracing/sampling/rate_sampler.rb +2 -2
  800. data/lib/datadog/tracing/sampling/rule.rb +4 -4
  801. data/lib/datadog/tracing/sampling/rule_sampler.rb +12 -12
  802. data/lib/datadog/tracing/sampling/sampler.rb +2 -2
  803. data/lib/datadog/tracing/sampling/span/ext.rb +3 -3
  804. data/lib/datadog/tracing/sampling/span/matcher.rb +2 -2
  805. data/lib/datadog/tracing/sampling/span/rule.rb +1 -1
  806. data/lib/datadog/tracing/sampling/span/rule_parser.rb +8 -8
  807. data/lib/datadog/tracing/span.rb +8 -8
  808. data/lib/datadog/tracing/span_event.rb +5 -5
  809. data/lib/datadog/tracing/span_operation.rb +21 -21
  810. data/lib/datadog/tracing/sync_writer.rb +12 -7
  811. data/lib/datadog/tracing/trace_operation.rb +11 -11
  812. data/lib/datadog/tracing/trace_segment.rb +10 -10
  813. data/lib/datadog/tracing/tracer.rb +23 -15
  814. data/lib/datadog/tracing/transport/http/client.rb +4 -4
  815. data/lib/datadog/tracing/transport/http/statistics.rb +2 -2
  816. data/lib/datadog/tracing/transport/http/traces.rb +8 -8
  817. data/lib/datadog/tracing/transport/http.rb +10 -10
  818. data/lib/datadog/tracing/transport/io/client.rb +2 -2
  819. data/lib/datadog/tracing/transport/io/response.rb +1 -1
  820. data/lib/datadog/tracing/transport/io/traces.rb +4 -4
  821. data/lib/datadog/tracing/transport/io.rb +3 -3
  822. data/lib/datadog/tracing/transport/native/response.rb +71 -0
  823. data/lib/datadog/tracing/transport/native.rb +363 -0
  824. data/lib/datadog/tracing/transport/serializable_trace.rb +19 -19
  825. data/lib/datadog/tracing/transport/statistics.rb +2 -2
  826. data/lib/datadog/tracing/transport/trace_formatter.rb +10 -10
  827. data/lib/datadog/tracing/transport/traces.rb +8 -8
  828. data/lib/datadog/tracing/utils.rb +2 -2
  829. data/lib/datadog/tracing/workers.rb +2 -2
  830. data/lib/datadog/tracing/writer.rb +21 -8
  831. data/lib/datadog/tracing.rb +3 -3
  832. data/lib/datadog/version.rb +4 -4
  833. data/lib/datadog.rb +13 -13
  834. metadata +13 -5
@@ -1,32 +1,36 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'transport'
4
- require_relative 'evaluation_engine'
5
- require_relative 'exposures/buffer'
6
- require_relative 'exposures/worker'
7
- require_relative 'exposures/deduplicator'
8
- require_relative 'exposures/reporter'
9
- require_relative 'metrics/flag_eval_metrics'
3
+ require_relative "transport"
4
+ require_relative "evaluation_engine"
5
+ require_relative "exposures/buffer"
6
+ require_relative "exposures/worker"
7
+ require_relative "exposures/deduplicator"
8
+ require_relative "exposures/reporter"
9
+ require_relative "metrics/flag_eval_metrics"
10
+ require_relative "flag_evaluation/writer"
11
+ require_relative "hooks/flag_eval_metrics_hook"
12
+ require_relative "hooks/flag_eval_evp_hook"
13
+ require_relative "hooks/span_enrichment_hook"
10
14
 
11
15
  module Datadog
12
16
  module OpenFeature
13
17
  # This class is the entry point for the OpenFeature component
14
18
  class Component
15
- attr_reader :engine, :flag_eval_metrics_hook, :flag_eval_evp_hook
19
+ attr_reader :engine, :flag_eval_metrics_hook, :flag_eval_evp_hook, :span_enrichment_hook
16
20
 
17
21
  def self.build(settings, agent_settings, logger:, telemetry:)
18
22
  return unless settings.respond_to?(:open_feature) && settings.open_feature.enabled
19
23
 
20
24
  unless settings.respond_to?(:remote) && settings.remote.enabled
21
- message = 'OpenFeature could not be enabled as Remote Configuration is currently disabled. ' \
22
- 'To enable Remote Configuration, see https://docs.datadoghq.com/remote_configuration/.'
25
+ message = "OpenFeature could not be enabled as Remote Configuration is currently disabled. " \
26
+ "To enable Remote Configuration, see https://docs.datadoghq.com/remote_configuration/."
23
27
 
24
28
  logger.warn(message)
25
29
  return
26
30
  end
27
31
 
28
- if RUBY_ENGINE != 'ruby'
29
- message = 'OpenFeature could not be enabled as MRI is required, ' \
32
+ if RUBY_ENGINE != "ruby"
33
+ message = "OpenFeature could not be enabled as MRI is required, " \
30
34
  "but running on #{RUBY_ENGINE.inspect}"
31
35
 
32
36
  logger.warn(message)
@@ -34,9 +38,9 @@ module Datadog
34
38
  end
35
39
 
36
40
  if (libdatadog_api_failure = Core::LIBDATADOG_API_FAILURE)
37
- message = 'OpenFeature could not be enabled as `libdatadog` is not loaded: ' \
41
+ message = "OpenFeature could not be enabled as `libdatadog` is not loaded: " \
38
42
  "#{libdatadog_api_failure.inspect}. For help solving this issue, " \
39
- 'please contact Datadog support at https://docs.datadoghq.com/help/.'
43
+ "please contact Datadog support at https://docs.datadoghq.com/help/."
40
44
 
41
45
  logger.warn(message)
42
46
  return
@@ -58,42 +62,47 @@ module Datadog
58
62
  @agent_settings = agent_settings
59
63
  @flag_eval_metrics_hook = create_flag_eval_metrics_hook
60
64
  @flag_eval_evp_hook = create_flag_eval_evp_hook
65
+ @span_enrichment_hook = create_span_enrichment_hook
61
66
  end
62
67
 
63
68
  def shutdown!
64
69
  @worker.graceful_shutdown
65
70
  @flag_eval_evp_writer&.stop
71
+ # Symmetric teardown: drop any accumulated span-enrichment state and
72
+ # subscriptions (Ruby CLAUDE.md mandates closing resources).
73
+ @span_enrichment_hook&.shutdown
66
74
  end
67
75
 
68
76
  private
69
77
 
70
78
  def create_flag_eval_metrics_hook
71
- require_relative 'hooks/flag_eval_metrics_hook'
72
79
  return unless Hooks::FlagEvalMetricsHook.available?
73
80
 
74
81
  metrics = Metrics::FlagEvalMetrics.new(telemetry: @telemetry, logger: @logger)
75
82
  Hooks::FlagEvalMetricsHook.new(metrics)
76
- rescue LoadError
77
- nil
78
83
  end
79
84
 
80
85
  # Killswitch: DD_FLAGGING_EVALUATION_COUNTS_ENABLED (default on) gates only the EVP path.
81
86
  # Read through the datadog config registry, not raw ENV.
82
87
  def create_flag_eval_evp_hook
83
88
  return unless @settings.open_feature.evaluation_counts_enabled
84
-
85
- require_relative 'hooks/flag_eval_evp_hook'
86
89
  return unless Hooks::FlagEvalEVPHook.available?
87
90
 
88
91
  evp_transport = Transport::HTTP.build_flagevaluations(
89
92
  agent_settings: @agent_settings,
90
93
  logger: @logger,
91
94
  )
92
- require_relative 'flag_evaluation/writer'
93
95
  @flag_eval_evp_writer = FlagEvaluation::Writer.new(transport: evp_transport, logger: @logger, telemetry: @telemetry)
94
96
  Hooks::FlagEvalEVPHook.new(@flag_eval_evp_writer)
95
- rescue LoadError
96
- nil
97
+ end
98
+
99
+ # Construct the span-enrichment hook only when the opt-in gate is on, so
100
+ # there is no idle per-span overhead when disabled.
101
+ def create_span_enrichment_hook
102
+ return unless @settings.open_feature.span_enrichment_enabled
103
+
104
+ store = Hooks::SpanEnrichmentHook::SpanEnrichmentStateStore.new
105
+ Hooks::SpanEnrichmentHook.new(store, logger: @logger)
97
106
  end
98
107
  end
99
108
  end
@@ -17,7 +17,20 @@ module Datadog
17
17
  settings :open_feature do
18
18
  option :enabled do |o|
19
19
  o.type :bool
20
- o.env 'DD_EXPERIMENTAL_FLAGGING_PROVIDER_ENABLED'
20
+ o.env "DD_EXPERIMENTAL_FLAGGING_PROVIDER_ENABLED"
21
+ o.default false
22
+ end
23
+
24
+ # Opt-in gate for APM feature-flag span enrichment. When enabled,
25
+ # the provider attaches `ffe_*` tags to the local root APM span on
26
+ # finish. Distinct from `:enabled` (the provider gate) and off by
27
+ # default so it can be rolled out independently.
28
+ #
29
+ # TODO: benchmark the per-span-finish overhead on a high-span-count
30
+ # trace with this gate on before enabling it by default.
31
+ option :span_enrichment_enabled do |o|
32
+ o.type :bool
33
+ o.env "DD_EXPERIMENTAL_FLAGGING_PROVIDER_SPAN_ENRICHMENT_ENABLED"
21
34
  o.default false
22
35
  end
23
36
 
@@ -25,7 +38,7 @@ module Datadog
25
38
  # disabled the existing OTel `feature_flag.evaluations` metric is unaffected.
26
39
  option :evaluation_counts_enabled do |o|
27
40
  o.type :bool
28
- o.env 'DD_FLAGGING_EVALUATION_COUNTS_ENABLED'
41
+ o.env "DD_FLAGGING_EVALUATION_COUNTS_ENABLED"
29
42
  o.default true
30
43
  end
31
44
  end
@@ -1,9 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'ext'
4
- require_relative 'noop_evaluator'
5
- require_relative 'native_evaluator'
6
- require_relative 'resolution_details'
3
+ require_relative "ext"
4
+ require_relative "noop_evaluator"
5
+ require_relative "native_evaluator"
6
+ require_relative "resolution_details"
7
7
 
8
8
  module Datadog
9
9
  module OpenFeature
@@ -39,7 +39,7 @@ module Datadog
39
39
 
40
40
  result
41
41
  rescue => e
42
- @telemetry.report(e, description: 'OpenFeature: Failed to fetch flag value')
42
+ @telemetry.report(e, description: "OpenFeature: Failed to fetch flag value")
43
43
 
44
44
  ResolutionDetails.build_error(
45
45
  value: default_value, error_code: Ext::GENERAL, error_message: "#{e.class}: #{e.message}"
@@ -51,14 +51,14 @@ module Datadog
51
51
  # in the format expected by `libdatadog` without any modifications
52
52
  def reconfigure!(configuration)
53
53
  if configuration.nil?
54
- @logger.debug('OpenFeature: Removing configuration')
54
+ @logger.debug("OpenFeature: Removing configuration")
55
55
 
56
56
  return @evaluator = NoopEvaluator.new(configuration)
57
57
  end
58
58
 
59
59
  @evaluator = NativeEvaluator.new(configuration)
60
60
  rescue => e
61
- message = 'OpenFeature: Failed to reconfigure, reverting to the previous configuration'
61
+ message = "OpenFeature: Failed to reconfigure, reverting to the previous configuration"
62
62
 
63
63
  @logger.error("#{message}, #{e.class}: #{e.message}")
64
64
  @telemetry.report(e, description: "#{message} (#{e.class})")
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative '../../core/buffer/cruby'
3
+ require_relative "../../core/buffer/cruby"
4
4
 
5
5
  module Datadog
6
6
  module OpenFeature
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative '../../core/utils/lru_cache'
3
+ require_relative "../../core/utils/lru_cache"
4
4
 
5
5
  module Datadog
6
6
  module OpenFeature
@@ -1,13 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative '../../core/utils/time'
3
+ require_relative "../../core/utils/time"
4
4
 
5
5
  module Datadog
6
6
  module OpenFeature
7
7
  module Exposures
8
8
  # A data model for an exposure event
9
9
  module Event
10
- TARGETING_KEY_FIELD = 'targeting_key'
10
+ TARGETING_KEY_FIELD = "targeting_key"
11
11
  ALLOWED_FIELD_TYPES = [String, Integer, Float, TrueClass, FalseClass].freeze
12
12
 
13
13
  class << self
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'event'
4
- require_relative 'deduplicator'
3
+ require_relative "event"
4
+ require_relative "deduplicator"
5
5
 
6
6
  module Datadog
7
7
  module OpenFeature
@@ -30,7 +30,7 @@ module Datadog
30
30
  @worker.enqueue(event)
31
31
  rescue => e
32
32
  @logger.debug { "OpenFeature: Failed to report resolution details: #{e.class}: #{e.message}" }
33
- @telemetry.report(e, description: 'OpenFeature: Failed to report resolution details')
33
+ @telemetry.report(e, description: "OpenFeature: Failed to report resolution details")
34
34
 
35
35
  false
36
36
  end
@@ -1,11 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative '../../core/utils/time'
4
- require_relative '../../core/workers/queue'
5
- require_relative '../../core/workers/polling'
3
+ require_relative "../../core/utils/time"
4
+ require_relative "../../core/workers/queue"
5
+ require_relative "../../core/workers/polling"
6
6
 
7
- require_relative 'buffer'
8
- require_relative 'batch_builder'
7
+ require_relative "buffer"
8
+ require_relative "batch_builder"
9
9
 
10
10
  module Datadog
11
11
  module OpenFeature
@@ -106,7 +106,7 @@ module Datadog
106
106
  response
107
107
  rescue => e
108
108
  @logger.debug { "OpenFeature: Failed to flush resolution details events: #{e.class}: #{e.message}" }
109
- @telemetry.report(e, description: 'OpenFeature: Failed to flush resolution details events')
109
+ @telemetry.report(e, description: "OpenFeature: Failed to flush resolution details events")
110
110
 
111
111
  nil
112
112
  end
@@ -3,14 +3,19 @@
3
3
  module Datadog
4
4
  module OpenFeature
5
5
  module Ext
6
- ERROR = 'ERROR'
7
- DEFAULT = 'DEFAULT'
8
- INITIALIZING = 'INITIALIZING'
9
- UNKNOWN_TYPE = 'UNKNOWN_TYPE'
10
- PARSE_ERROR = 'PARSE_ERROR'
11
- GENERAL = 'GENERAL'
12
- PROVIDER_FATAL = 'PROVIDER_FATAL'
13
- PROVIDER_NOT_READY = 'PROVIDER_NOT_READY'
6
+ ERROR = "ERROR"
7
+ DEFAULT = "DEFAULT"
8
+ INITIALIZING = "INITIALIZING"
9
+ UNKNOWN_TYPE = "UNKNOWN_TYPE"
10
+ PARSE_ERROR = "PARSE_ERROR"
11
+ GENERAL = "GENERAL"
12
+ PROVIDER_FATAL = "PROVIDER_FATAL"
13
+ PROVIDER_NOT_READY = "PROVIDER_NOT_READY"
14
+
15
+ # Flag-metadata key under which the provider threads the assignment's
16
+ # allocation key to the flag-evaluation hooks. The wire string is the
17
+ # value so the writer (provider) and readers (EVP/metrics hooks) can't drift.
18
+ METADATA_ALLOCATION_KEY = "__dd_allocation_key"
14
19
  end
15
20
  end
16
21
  end
@@ -18,11 +18,11 @@ module Datadog
18
18
  MAX_CONTEXT_DEPTH = 32
19
19
 
20
20
  # Type tags so values of different Ruby types never collide in the canonical key.
21
- CTX_TAG_STRING = 's'
22
- CTX_TAG_BOOL = 'b'
23
- CTX_TAG_INTEGER = 'i'
24
- CTX_TAG_FLOAT = 'f'
25
- CTX_TAG_OTHER = 'o'
21
+ CTX_TAG_STRING = "s"
22
+ CTX_TAG_BOOL = "b"
23
+ CTX_TAG_INTEGER = "i"
24
+ CTX_TAG_FLOAT = "f"
25
+ CTX_TAG_OTHER = "o"
26
26
 
27
27
  EVAL_SCALE_TARGET_FLAGS = 2_500
28
28
  EVAL_SCALE_FULL_BUCKETS_PER_FLAG = 50
@@ -176,9 +176,9 @@ module Datadog
176
176
  # 8-byte big-endian value length + value bytes.
177
177
  # No hash digest — the key IS the full encoding (collision-free, no FNV).
178
178
  def canonical_context_key(attrs)
179
- return '' if attrs.nil? || attrs.empty?
179
+ return "" if attrs.nil? || attrs.empty?
180
180
 
181
- buffer = String.new('', encoding: Encoding::BINARY)
181
+ buffer = String.new("", encoding: Encoding::BINARY)
182
182
  attrs.keys.sort.each do |key|
183
183
  value = attrs[key]
184
184
  buffer << length_delimited(key.to_s)
@@ -233,7 +233,7 @@ module Datadog
233
233
  bytes = string.encode(Encoding::BINARY, invalid: :replace, undef: :replace)
234
234
  byte_length = bytes.bytesize
235
235
  # Build 8-byte big-endian length
236
- length_bytes = String.new('', encoding: Encoding::BINARY)
236
+ length_bytes = String.new("", encoding: Encoding::BINARY)
237
237
  8.times do |index|
238
238
  length_bytes.prepend(((byte_length >> (8 * index)) & 0xFF).chr(Encoding::BINARY))
239
239
  end
@@ -1,10 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'aggregator'
4
- require_relative '../../core/encoding'
5
- require_relative '../../core/evp'
6
- require_relative '../../core/utils/time'
7
- require_relative '../../core/workers/async'
3
+ require_relative "aggregator"
4
+ require_relative "../../core/encoding"
5
+ require_relative "../../core/evp"
6
+ require_relative "../../core/utils/time"
7
+ require_relative "../../core/workers/async"
8
8
 
9
9
  module Datadog
10
10
  module OpenFeature
@@ -29,15 +29,15 @@ module Datadog
29
29
  QUEUE_SIZE = 4_096
30
30
  MAX_DRAIN_EVENTS_PER_CYCLE = 1_024
31
31
  PAYLOAD_SIZE_LIMIT_BYTES = Core::EVP::PAYLOAD_SIZE_LIMIT_BYTES
32
- TELEMETRY_NAMESPACE = 'tracers'
33
- ROWS_DROPPED_METRIC = 'flagevaluation.rows.dropped'
34
- ROWS_DEGRADED_METRIC = 'flagevaluation.rows.degraded'
35
- PAYLOAD_SPLITS_METRIC = 'flagevaluation.payload.splits'
32
+ TELEMETRY_NAMESPACE = "tracers"
33
+ ROWS_DROPPED_METRIC = "flagevaluation.rows.dropped"
34
+ ROWS_DEGRADED_METRIC = "flagevaluation.rows.degraded"
35
+ PAYLOAD_SPLITS_METRIC = "flagevaluation.payload.splits"
36
36
 
37
- REASON_QUEUE_OVERFLOW = 'queue_overflow'
38
- REASON_DEGRADED_CAP = 'degraded_cap'
39
- REASON_CARDINALITY_CAP = 'cardinality_cap'
40
- REASON_PAYLOAD_LIMIT = 'payload_limit'
37
+ REASON_QUEUE_OVERFLOW = "queue_overflow"
38
+ REASON_DEGRADED_CAP = "degraded_cap"
39
+ REASON_CARDINALITY_CAP = "cardinality_cap"
40
+ REASON_PAYLOAD_LIMIT = "payload_limit"
41
41
 
42
42
  # Service context fields for the batch wrapper.
43
43
  attr_reader :service_context
@@ -98,7 +98,7 @@ module Datadog
98
98
 
99
99
  return true if join(SHUTDOWN_TIMEOUT_SECONDS)
100
100
 
101
- @logger.debug { 'OpenFeature EVP: writer did not stop gracefully; terminating worker thread' }
101
+ @logger.debug { "OpenFeature EVP: writer did not stop gracefully; terminating worker thread" }
102
102
  terminate
103
103
  end
104
104
 
@@ -117,9 +117,9 @@ module Datadog
117
117
 
118
118
  def build_service_context
119
119
  config = Datadog.configuration
120
- ctx = {'service' => config.service.to_s}
121
- ctx['env'] = config.env if config.env && !config.env.empty?
122
- ctx['version'] = config.version if config.version && !config.version.empty?
120
+ ctx = {"service" => config.service.to_s}
121
+ ctx["env"] = config.env if config.env && !config.env.empty?
122
+ ctx["version"] = config.version if config.version && !config.version.empty?
123
123
  ctx
124
124
  end
125
125
 
@@ -261,7 +261,7 @@ module Datadog
261
261
  record_telemetry_count(ROWS_DROPPED_METRIC, dropped_overflow, reason: REASON_DEGRADED_CAP)
262
262
 
263
263
  @logger.debug do
264
- 'OpenFeature EVP: dropped events ' \
264
+ "OpenFeature EVP: dropped events " \
265
265
  "queue_overflow=#{dropped_queue} degraded_overflow=#{dropped_overflow}"
266
266
  end
267
267
  end
@@ -300,27 +300,27 @@ module Datadog
300
300
  def build_event(flag_key:, variant:, allocation_key:, targeting_key:, entry:, flush_time_ms:, tier:)
301
301
  # @type var event: ::Hash[::String, untyped]
302
302
  event = {
303
- 'timestamp' => flush_time_ms,
304
- 'flag' => {'key' => flag_key},
305
- 'first_evaluation' => entry[:first_evaluation],
306
- 'last_evaluation' => entry[:last_evaluation],
307
- 'evaluation_count' => entry[:count],
303
+ "timestamp" => flush_time_ms,
304
+ "flag" => {"key" => flag_key},
305
+ "first_evaluation" => entry[:first_evaluation],
306
+ "last_evaluation" => entry[:last_evaluation],
307
+ "evaluation_count" => entry[:count],
308
308
  }
309
309
 
310
- event['runtime_default_used'] = true if entry[:runtime_default]
311
- event['error'] = {'message' => entry[:error_message]} if entry[:error_message] && !entry[:error_message].empty?
310
+ event["runtime_default_used"] = true if entry[:runtime_default]
311
+ event["error"] = {"message" => entry[:error_message]} if entry[:error_message] && !entry[:error_message].empty?
312
312
 
313
313
  # variant + allocation are present in both tiers (omitempty per schema).
314
- event['variant'] = {'key' => variant} if variant && !variant.empty?
315
- event['allocation'] = {'key' => allocation_key} if allocation_key && !allocation_key.empty?
314
+ event["variant"] = {"key" => variant} if variant && !variant.empty?
315
+ event["allocation"] = {"key" => allocation_key} if allocation_key && !allocation_key.empty?
316
316
 
317
317
  # Full-tier additionally carries targeting_key + the pruned evaluation context;
318
318
  # the degraded tier omits both.
319
319
  if tier == :full
320
- event['targeting_key'] = targeting_key if targeting_key && !targeting_key.empty?
320
+ event["targeting_key"] = targeting_key if targeting_key && !targeting_key.empty?
321
321
 
322
322
  if entry[:context_attrs] && !entry[:context_attrs].empty?
323
- event['context'] = {'evaluation' => entry[:context_attrs]}
323
+ event["context"] = {"evaluation" => entry[:context_attrs]}
324
324
  end
325
325
  end
326
326
 
@@ -330,7 +330,7 @@ module Datadog
330
330
  def send_payload_batches(events)
331
331
  context_json = Core::Encoding::JSONEncoder.encode(@service_context)
332
332
  payload_prefix = "{\"context\":#{context_json},\"flagEvaluations\":["
333
- payload_suffix = ']}'
333
+ payload_suffix = "]}"
334
334
  base_payload_size = payload_prefix.bytesize + payload_suffix.bytesize
335
335
 
336
336
  batch = []
@@ -372,8 +372,8 @@ module Datadog
372
372
  def send_payload_batch(events)
373
373
  response = @transport.send_flag_evaluations(
374
374
  {
375
- 'context' => @service_context,
376
- 'flagEvaluations' => events,
375
+ "context" => @service_context,
376
+ "flagEvaluations" => events,
377
377
  }
378
378
  )
379
379
  if response.respond_to?(:ok?) && !response.ok?
@@ -402,11 +402,11 @@ module Datadog
402
402
  end
403
403
 
404
404
  def degrade_event_for_payload_limit(event)
405
- return unless event.key?('targeting_key') || event.key?('context')
405
+ return unless event.key?("targeting_key") || event.key?("context")
406
406
 
407
407
  degraded = event.dup
408
- degraded.delete('targeting_key')
409
- degraded.delete('context')
408
+ degraded.delete("targeting_key")
409
+ degraded.delete("context")
410
410
  degraded
411
411
  end
412
412
 
@@ -415,7 +415,7 @@ module Datadog
415
415
  end
416
416
 
417
417
  def event_count(event)
418
- count = event['evaluation_count'].to_i
418
+ count = event["evaluation_count"].to_i
419
419
  count.positive? ? count : 1
420
420
  end
421
421
 
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative "../ext"
4
+
3
5
  module Datadog
4
6
  module OpenFeature
5
7
  module Hooks
@@ -13,7 +15,7 @@ module Datadog
13
15
  # stay on the OTel path. This hook is registered as a provider hook so it receives
14
16
  # the SDK-final EvaluationDetails after hook failures and type validation.
15
17
  class FlagEvalEVPHook
16
- TYPE_MISMATCH_ERROR_CODE = 'TYPE_MISMATCH'
18
+ TYPE_MISMATCH_ERROR_CODE = "TYPE_MISMATCH"
17
19
 
18
20
  # Include the Hook module if available (SDK >= 0.5.0) for interface documentation
19
21
  # and default implementations of other hook methods (before, after, error)
@@ -37,7 +39,7 @@ module Datadog
37
39
  # Eval-time stamped by the provider at eval-entry time; fall back to hook-fire time.
38
40
  # Metadata key: 'dd.eval.timestamp_ms' (int, ms since epoch) — stamped at eval entry.
39
41
  metadata = evaluation_details.flag_metadata
40
- eval_time_ms = metadata.is_a?(Hash) ? metadata['dd.eval.timestamp_ms'] : nil
42
+ eval_time_ms = metadata.is_a?(Hash) ? metadata["dd.eval.timestamp_ms"] : nil
41
43
  eval_time_ms ||= (Core::Utils::Time.now.to_f * 1000).to_i
42
44
 
43
45
  writer.enqueue(
@@ -75,12 +77,11 @@ module Datadog
75
77
  fields.reject { |k, _| k.to_s == ::OpenFeature::SDK::EvaluationContext::TARGETING_KEY }
76
78
  end
77
79
 
78
- # Same key as OTel hook ('__dd_allocation_key') — do not diverge.
79
80
  def extract_allocation_key(evaluation_details)
80
81
  metadata = evaluation_details.flag_metadata
81
82
  return unless metadata.is_a?(Hash)
82
83
 
83
- metadata['__dd_allocation_key']
84
+ metadata[Ext::METADATA_ALLOCATION_KEY]
84
85
  end
85
86
 
86
87
  def extract_error_message(evaluation_details)
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative "../ext"
4
+
3
5
  module Datadog
4
6
  module OpenFeature
5
7
  module Hooks
@@ -41,7 +43,7 @@ module Datadog
41
43
  metadata = evaluation_details.flag_metadata
42
44
  return unless metadata.is_a?(Hash)
43
45
 
44
- metadata['__dd_allocation_key']
46
+ metadata[Ext::METADATA_ALLOCATION_KEY]
45
47
  end
46
48
  end
47
49
  end
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "digest"
4
+
5
+ module Datadog
6
+ module OpenFeature
7
+ module Hooks
8
+ class SpanEnrichmentHook
9
+ # Encoding/crypto helpers implementing the fixed cross-SDK wire format.
10
+ module Codec
11
+ module_function
12
+
13
+ # ULEB128 stores 7 bits per byte; the high bit flags that more bytes follow.
14
+ LOW_7_BITS_MASK = 0x7F
15
+ CONTINUATION_BIT = 0x80
16
+
17
+ # The `bytes` buffer built below MUST be binary (ASCII-8BIT): `String#<<`
18
+ # with an Integer on a UTF-8 string appends a Unicode *codepoint*, so any
19
+ # byte >= 0x80 would be re-encoded as a 2-byte UTF-8 sequence and corrupt
20
+ # the varint (e.g. serial 2312 -> bytes 88 12, but UTF-8 would emit
21
+ # C2 88 12 = 296002 on decode). `(+'').b` gives a mutable binary string.
22
+ def encode_varint(value)
23
+ bytes = (+"").b
24
+ while value > LOW_7_BITS_MASK
25
+ bytes << ((value & LOW_7_BITS_MASK) | CONTINUATION_BIT)
26
+ value >>= 7
27
+ end
28
+ bytes << (value & LOW_7_BITS_MASK)
29
+ bytes
30
+ end
31
+
32
+ # Encode a Set of serial ids as base64(ULEB128 delta-varint).
33
+ # Empty set -> empty string (the caller omits the tag).
34
+ def encode_delta_varint(serial_ids)
35
+ sorted = serial_ids.to_a.sort
36
+ return "" if sorted.empty?
37
+
38
+ bytes = (+"").b
39
+ prev = 0
40
+ sorted.each do |id|
41
+ bytes << encode_varint(id - prev)
42
+ prev = id
43
+ end
44
+ # `pack('m0')` is RFC 4648 base64 with no newlines (== strict_encode64)
45
+ # and needs no `base64` gem, which stopped being a default gem in Ruby 3.4.
46
+ [bytes].pack("m0")
47
+ end
48
+
49
+ # Lowercase hex SHA256 of the targeting key: it is hashed before
50
+ # emission so raw user identifiers never leave the process.
51
+ def hash_targeting_key(targeting_key)
52
+ Digest::SHA256.hexdigest(targeting_key)
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end