datadog 2.21.0 → 2.38.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 (623) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +574 -1
  3. data/ext/LIBDATADOG_DEVELOPMENT.md +3 -0
  4. data/ext/datadog_profiling_native_extension/clock_id.h +9 -1
  5. data/ext/datadog_profiling_native_extension/clock_id_from_mach.c +66 -0
  6. data/ext/datadog_profiling_native_extension/clock_id_from_pthread.c +3 -2
  7. data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +301 -82
  8. data/ext/datadog_profiling_native_extension/collectors_discrete_dynamic_sampler.c +4 -4
  9. data/ext/datadog_profiling_native_extension/collectors_gc_profiling_helper.c +3 -2
  10. data/ext/datadog_profiling_native_extension/collectors_idle_sampling_helper.c +18 -4
  11. data/ext/datadog_profiling_native_extension/collectors_stack.c +63 -32
  12. data/ext/datadog_profiling_native_extension/collectors_stack.h +7 -2
  13. data/ext/datadog_profiling_native_extension/collectors_thread_context.c +728 -436
  14. data/ext/datadog_profiling_native_extension/collectors_thread_context.h +19 -6
  15. data/ext/datadog_profiling_native_extension/crashtracking_runtime_stacks.c +239 -0
  16. data/ext/datadog_profiling_native_extension/datadog_ruby_common.c +65 -1
  17. data/ext/datadog_profiling_native_extension/datadog_ruby_common.h +40 -1
  18. data/ext/datadog_profiling_native_extension/encoded_profile.c +2 -1
  19. data/ext/datadog_profiling_native_extension/extconf.rb +41 -37
  20. data/ext/datadog_profiling_native_extension/gvl_profiling_helper.c +4 -43
  21. data/ext/datadog_profiling_native_extension/gvl_profiling_helper.h +15 -47
  22. data/ext/datadog_profiling_native_extension/heap_recorder.c +252 -103
  23. data/ext/datadog_profiling_native_extension/heap_recorder.h +12 -1
  24. data/ext/datadog_profiling_native_extension/http_transport.c +66 -68
  25. data/ext/datadog_profiling_native_extension/libdatadog_helpers.c +3 -22
  26. data/ext/datadog_profiling_native_extension/libdatadog_helpers.h +0 -5
  27. data/ext/datadog_profiling_native_extension/macos_sampler_thread.h +55 -0
  28. data/ext/datadog_profiling_native_extension/native_extension_helpers.rb +0 -13
  29. data/ext/datadog_profiling_native_extension/private_vm_api_access.c +40 -43
  30. data/ext/datadog_profiling_native_extension/private_vm_api_access.h +6 -0
  31. data/ext/datadog_profiling_native_extension/profiling.c +65 -19
  32. data/ext/datadog_profiling_native_extension/ruby_helpers.c +63 -46
  33. data/ext/datadog_profiling_native_extension/ruby_helpers.h +17 -5
  34. data/ext/datadog_profiling_native_extension/setup_signal_handler.c +32 -10
  35. data/ext/datadog_profiling_native_extension/setup_signal_handler.h +2 -1
  36. data/ext/datadog_profiling_native_extension/stack_recorder.c +110 -85
  37. data/ext/datadog_profiling_native_extension/stack_recorder.h +3 -1
  38. data/ext/datadog_profiling_native_extension/time_helpers.h +13 -7
  39. data/ext/datadog_profiling_native_extension/unsafe_api_calls_check.c +2 -1
  40. data/ext/datadog_profiling_native_extension/unsafe_api_calls_check.h +9 -4
  41. data/ext/libdatadog_api/crashtracker.c +16 -15
  42. data/ext/libdatadog_api/crashtracker_report_exception.c +126 -0
  43. data/ext/libdatadog_api/datadog_ruby_common.c +65 -1
  44. data/ext/libdatadog_api/datadog_ruby_common.h +40 -1
  45. data/ext/libdatadog_api/ddsketch.c +102 -0
  46. data/ext/libdatadog_api/di.c +203 -0
  47. data/ext/libdatadog_api/extconf.rb +18 -24
  48. data/ext/libdatadog_api/feature_flags.c +554 -0
  49. data/ext/libdatadog_api/feature_flags.h +5 -0
  50. data/ext/libdatadog_api/helpers.h +27 -0
  51. data/ext/libdatadog_api/init.c +13 -1
  52. data/ext/libdatadog_api/library_config.c +34 -25
  53. data/ext/libdatadog_api/process_discovery.c +19 -13
  54. data/ext/libdatadog_extconf_helpers.rb +94 -11
  55. data/lib/datadog/ai_guard/api_client.rb +84 -0
  56. data/lib/datadog/ai_guard/autoload.rb +10 -0
  57. data/lib/datadog/ai_guard/component.rb +44 -0
  58. data/lib/datadog/ai_guard/configuration/ext.rb +17 -0
  59. data/lib/datadog/ai_guard/configuration.rb +115 -0
  60. data/lib/datadog/ai_guard/contrib/auto_instrument.rb +24 -0
  61. data/lib/datadog/ai_guard/contrib/integration.rb +37 -0
  62. data/lib/datadog/ai_guard/contrib/rack/integration.rb +42 -0
  63. data/lib/datadog/ai_guard/contrib/rack/patcher.rb +26 -0
  64. data/lib/datadog/ai_guard/contrib/rack/request_middleware.rb +97 -0
  65. data/lib/datadog/ai_guard/contrib/rails/integration.rb +41 -0
  66. data/lib/datadog/ai_guard/contrib/rails/patcher.rb +97 -0
  67. data/lib/datadog/ai_guard/contrib/ruby_llm/chat_instrumentation.rb +80 -0
  68. data/lib/datadog/ai_guard/contrib/ruby_llm/integration.rb +41 -0
  69. data/lib/datadog/ai_guard/contrib/ruby_llm/patcher.rb +30 -0
  70. data/lib/datadog/ai_guard/evaluation/content_builder.rb +31 -0
  71. data/lib/datadog/ai_guard/evaluation/content_part.rb +36 -0
  72. data/lib/datadog/ai_guard/evaluation/message.rb +25 -0
  73. data/lib/datadog/ai_guard/evaluation/no_op_result.rb +36 -0
  74. data/lib/datadog/ai_guard/evaluation/request.rb +86 -0
  75. data/lib/datadog/ai_guard/evaluation/result.rb +45 -0
  76. data/lib/datadog/ai_guard/evaluation/tool_call.rb +18 -0
  77. data/lib/datadog/ai_guard/evaluation.rb +108 -0
  78. data/lib/datadog/ai_guard/ext.rb +29 -0
  79. data/lib/datadog/ai_guard.rb +181 -0
  80. data/lib/datadog/appsec/api_security/endpoint_collection/grape_route_serializer.rb +26 -0
  81. data/lib/datadog/appsec/api_security/endpoint_collection/rails_collector.rb +66 -0
  82. data/lib/datadog/appsec/api_security/endpoint_collection/rails_route_serializer.rb +36 -0
  83. data/lib/datadog/appsec/api_security/endpoint_collection/sinatra_route_serializer.rb +26 -0
  84. data/lib/datadog/appsec/api_security/endpoint_collection.rb +10 -0
  85. data/lib/datadog/appsec/api_security/route_extractor.rb +38 -9
  86. data/lib/datadog/appsec/api_security/sampler.rb +7 -4
  87. data/lib/datadog/appsec/assets/blocked.html +10 -1
  88. data/lib/datadog/appsec/assets/blocked.json +1 -1
  89. data/lib/datadog/appsec/assets/blocked.text +3 -1
  90. data/lib/datadog/appsec/assets/waf_rules/README.md +30 -36
  91. data/lib/datadog/appsec/assets/waf_rules/recommended.json +359 -4
  92. data/lib/datadog/appsec/assets/waf_rules/strict.json +43 -2
  93. data/lib/datadog/appsec/assets.rb +1 -1
  94. data/lib/datadog/appsec/autoload.rb +1 -1
  95. data/lib/datadog/appsec/component.rb +16 -9
  96. data/lib/datadog/appsec/compressed_json.rb +3 -3
  97. data/lib/datadog/appsec/configuration.rb +427 -1
  98. data/lib/datadog/appsec/context.rb +51 -13
  99. data/lib/datadog/appsec/contrib/active_record/instrumentation.rb +3 -1
  100. data/lib/datadog/appsec/contrib/active_record/integration.rb +1 -1
  101. data/lib/datadog/appsec/contrib/active_record/patcher.rb +4 -1
  102. data/lib/datadog/appsec/contrib/aws_lambda/gateway/watcher.rb +75 -0
  103. data/lib/datadog/appsec/contrib/aws_lambda/integration.rb +39 -0
  104. data/lib/datadog/appsec/contrib/aws_lambda/patcher.rb +30 -0
  105. data/lib/datadog/appsec/contrib/aws_lambda/waf_addresses.rb +144 -0
  106. data/lib/datadog/appsec/contrib/devise/integration.rb +1 -1
  107. data/lib/datadog/appsec/contrib/devise/patches/signin_tracking_patch.rb +2 -1
  108. data/lib/datadog/appsec/contrib/excon/integration.rb +1 -1
  109. data/lib/datadog/appsec/contrib/excon/patcher.rb +3 -1
  110. data/lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb +152 -12
  111. data/lib/datadog/appsec/contrib/faraday/integration.rb +1 -1
  112. data/lib/datadog/appsec/contrib/faraday/patcher.rb +1 -1
  113. data/lib/datadog/appsec/contrib/faraday/ssrf_detection_middleware.rb +138 -12
  114. data/lib/datadog/appsec/contrib/graphql/gateway/multiplex.rb +74 -24
  115. data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +4 -2
  116. data/lib/datadog/appsec/contrib/graphql/integration.rb +2 -1
  117. data/lib/datadog/appsec/contrib/rack/buffered_input.rb +83 -0
  118. data/lib/datadog/appsec/contrib/rack/ext.rb +1 -1
  119. data/lib/datadog/appsec/contrib/rack/gateway/request.rb +52 -13
  120. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +40 -19
  121. data/lib/datadog/appsec/contrib/rack/input_peeker.rb +79 -0
  122. data/lib/datadog/appsec/contrib/rack/integration.rb +1 -1
  123. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +48 -33
  124. data/lib/datadog/appsec/contrib/rack/response_body.rb +36 -0
  125. data/lib/datadog/appsec/contrib/rails/gateway/request.rb +40 -1
  126. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +26 -5
  127. data/lib/datadog/appsec/contrib/rails/integration.rb +1 -1
  128. data/lib/datadog/appsec/contrib/rails/patcher.rb +38 -0
  129. data/lib/datadog/appsec/contrib/rails/patches/process_action_patch.rb +2 -0
  130. data/lib/datadog/appsec/contrib/rest_client/integration.rb +1 -1
  131. data/lib/datadog/appsec/contrib/rest_client/patcher.rb +3 -1
  132. data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +167 -11
  133. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +43 -13
  134. data/lib/datadog/appsec/contrib/sinatra/integration.rb +1 -1
  135. data/lib/datadog/appsec/contrib/sinatra/patcher.rb +4 -4
  136. data/lib/datadog/appsec/contrib/sinatra/patches/json_patch.rb +1 -1
  137. data/lib/datadog/appsec/counter_sampler.rb +25 -0
  138. data/lib/datadog/appsec/default_header_tags.rb +52 -0
  139. data/lib/datadog/appsec/event.rb +13 -31
  140. data/lib/datadog/appsec/ext.rb +3 -0
  141. data/lib/datadog/appsec/instrumentation/gateway/middleware.rb +2 -3
  142. data/lib/datadog/appsec/instrumentation/gateway.rb +2 -15
  143. data/lib/datadog/appsec/metrics/collector.rb +43 -5
  144. data/lib/datadog/appsec/metrics/exporter.rb +16 -3
  145. data/lib/datadog/appsec/metrics/telemetry.rb +20 -3
  146. data/lib/datadog/appsec/metrics/telemetry_exporter.rb +20 -1
  147. data/lib/datadog/appsec/metrics.rb +5 -5
  148. data/lib/datadog/appsec/monitor/gateway/watcher.rb +8 -6
  149. data/lib/datadog/appsec/remote.rb +44 -29
  150. data/lib/datadog/appsec/response.rb +18 -4
  151. data/lib/datadog/appsec/route_normalizer/rails_route_pattern.rb +176 -0
  152. data/lib/datadog/appsec/route_normalizer/route_pattern.rb +378 -0
  153. data/lib/datadog/appsec/route_normalizer/route_text.rb +57 -0
  154. data/lib/datadog/appsec/route_normalizer.rb +80 -0
  155. data/lib/datadog/appsec/security_engine/engine.rb +26 -5
  156. data/lib/datadog/appsec/security_engine/result.rb +29 -9
  157. data/lib/datadog/appsec/security_engine/runner.rb +20 -10
  158. data/lib/datadog/appsec/security_event.rb +5 -7
  159. data/lib/datadog/appsec/trace_keeper.rb +18 -6
  160. data/lib/datadog/appsec/utils/http/body.rb +38 -0
  161. data/lib/datadog/appsec/utils/http/body_reader.rb +61 -0
  162. data/lib/datadog/appsec/utils/http/media_range.rb +2 -1
  163. data/lib/datadog/appsec/utils/http/media_type.rb +32 -26
  164. data/lib/datadog/appsec/utils/http/url_encoded.rb +52 -0
  165. data/lib/datadog/appsec.rb +6 -3
  166. data/lib/datadog/core/configuration/agentless_settings_resolver.rb +2 -2
  167. data/lib/datadog/core/configuration/base.rb +17 -5
  168. data/lib/datadog/core/configuration/components.rb +185 -17
  169. data/lib/datadog/core/configuration/components_state.rb +6 -1
  170. data/lib/datadog/core/configuration/config_helper.rb +11 -2
  171. data/lib/datadog/core/configuration/deprecations.rb +2 -2
  172. data/lib/datadog/core/configuration/option.rb +32 -6
  173. data/lib/datadog/core/configuration/option_definition.rb +42 -14
  174. data/lib/datadog/core/configuration/options.rb +49 -12
  175. data/lib/datadog/core/configuration/settings.rb +115 -16
  176. data/lib/datadog/core/configuration/stable_config.rb +10 -0
  177. data/lib/datadog/core/configuration/supported_configurations.rb +379 -300
  178. data/lib/datadog/core/configuration.rb +3 -3
  179. data/lib/datadog/core/contrib/rails/railtie.rb +32 -0
  180. data/lib/datadog/core/contrib/rails/utils.rb +7 -3
  181. data/lib/datadog/core/crashtracking/component.rb +73 -21
  182. data/lib/datadog/core/crashtracking/tag_builder.rb +6 -0
  183. data/lib/datadog/core/ddsketch.rb +19 -0
  184. data/lib/datadog/core/diagnostics/environment_logger.rb +3 -1
  185. data/lib/datadog/core/environment/agent_info.rb +65 -1
  186. data/lib/datadog/core/environment/cgroup.rb +52 -25
  187. data/lib/datadog/core/environment/container.rb +140 -46
  188. data/lib/datadog/core/environment/ext.rb +13 -0
  189. data/lib/datadog/core/environment/identity.rb +40 -4
  190. data/lib/datadog/core/environment/process.rb +122 -0
  191. data/lib/datadog/core/environment/socket.rb +13 -0
  192. data/lib/datadog/core/environment/yjit.rb +2 -1
  193. data/lib/datadog/core/error.rb +6 -6
  194. data/lib/datadog/core/evp.rb +11 -0
  195. data/lib/datadog/core/feature_flags.rb +61 -0
  196. data/lib/datadog/core/knuth_sampler.rb +59 -0
  197. data/lib/datadog/core/logger.rb +1 -1
  198. data/lib/datadog/core/metrics/client.rb +6 -6
  199. data/lib/datadog/core/metrics/logging.rb +1 -1
  200. data/lib/datadog/core/pin.rb +8 -8
  201. data/lib/datadog/core/process_discovery.rb +21 -18
  202. data/lib/datadog/core/rate_limiter.rb +11 -1
  203. data/lib/datadog/core/remote/client/capabilities.rb +49 -6
  204. data/lib/datadog/core/remote/client.rb +15 -7
  205. data/lib/datadog/core/remote/component.rb +64 -36
  206. data/lib/datadog/core/remote/configuration/content.rb +15 -2
  207. data/lib/datadog/core/remote/configuration/digest.rb +14 -7
  208. data/lib/datadog/core/remote/configuration/repository.rb +1 -1
  209. data/lib/datadog/core/remote/configuration/target.rb +13 -6
  210. data/lib/datadog/core/remote/transport/config.rb +9 -36
  211. data/lib/datadog/core/remote/transport/http/config.rb +15 -55
  212. data/lib/datadog/core/remote/transport/http/negotiation.rb +14 -44
  213. data/lib/datadog/core/remote/transport/http.rb +15 -24
  214. data/lib/datadog/core/remote/transport/negotiation.rb +8 -33
  215. data/lib/datadog/core/remote/worker.rb +25 -37
  216. data/lib/datadog/core/runtime/metrics.rb +11 -2
  217. data/lib/datadog/core/semaphore.rb +1 -4
  218. data/lib/datadog/core/tag_builder.rb +0 -4
  219. data/lib/datadog/core/tag_normalizer.rb +84 -0
  220. data/lib/datadog/core/telemetry/component.rb +59 -15
  221. data/lib/datadog/core/telemetry/emitter.rb +6 -6
  222. data/lib/datadog/core/telemetry/event/app_client_configuration_change.rb +2 -3
  223. data/lib/datadog/core/telemetry/event/app_endpoints_loaded.rb +30 -0
  224. data/lib/datadog/core/telemetry/event/app_extended_heartbeat.rb +32 -0
  225. data/lib/datadog/core/telemetry/event/app_started.rb +177 -171
  226. data/lib/datadog/core/telemetry/event/synth_app_client_configuration_change.rb +27 -4
  227. data/lib/datadog/core/telemetry/event.rb +2 -7
  228. data/lib/datadog/core/telemetry/ext.rb +1 -0
  229. data/lib/datadog/core/telemetry/logger.rb +4 -2
  230. data/lib/datadog/core/telemetry/logging.rb +17 -5
  231. data/lib/datadog/core/telemetry/metrics_manager.rb +9 -0
  232. data/lib/datadog/core/telemetry/request.rb +17 -5
  233. data/lib/datadog/core/telemetry/transport/http/telemetry.rb +8 -34
  234. data/lib/datadog/core/telemetry/transport/http.rb +21 -16
  235. data/lib/datadog/core/telemetry/transport/telemetry.rb +8 -17
  236. data/lib/datadog/core/telemetry/worker.rb +108 -32
  237. data/lib/datadog/core/transport/ext.rb +3 -0
  238. data/lib/datadog/core/transport/http/api/endpoint.rb +9 -4
  239. data/lib/datadog/core/transport/http/api/instance.rb +4 -21
  240. data/lib/datadog/core/transport/http/builder.rb +10 -6
  241. data/lib/datadog/core/transport/http/client.rb +80 -0
  242. data/lib/datadog/core/transport/http/response.rb +4 -0
  243. data/lib/datadog/core/transport/http.rb +24 -19
  244. data/lib/datadog/core/transport/parcel.rb +61 -9
  245. data/lib/datadog/core/transport/response.rb +16 -2
  246. data/lib/datadog/core/transport/transport.rb +90 -0
  247. data/lib/datadog/core/utils/at_fork_monkey_patch.rb +2 -2
  248. data/lib/datadog/core/utils/{base64.rb → base64_codec.rb} +4 -3
  249. data/lib/datadog/core/utils/enumerable_compat.rb +29 -0
  250. data/lib/datadog/core/utils/fnv.rb +26 -0
  251. data/lib/datadog/core/utils/forking.rb +3 -1
  252. data/lib/datadog/core/utils/hash.rb +0 -23
  253. data/lib/datadog/{appsec/api_security → core/utils}/lru_cache.rb +10 -21
  254. data/lib/datadog/core/utils/network.rb +22 -1
  255. data/lib/datadog/core/utils/only_once.rb +1 -1
  256. data/lib/datadog/core/utils/only_once_successful.rb +8 -2
  257. data/lib/datadog/core/utils/safe_dup.rb +2 -2
  258. data/lib/datadog/core/utils/sequence.rb +2 -0
  259. data/lib/datadog/core/utils/spawn_monkey_patch.rb +68 -0
  260. data/lib/datadog/core/utils/time.rb +6 -2
  261. data/lib/datadog/core/utils.rb +3 -1
  262. data/lib/datadog/core/workers/async.rb +11 -2
  263. data/lib/datadog/core/workers/interval_loop.rb +51 -3
  264. data/lib/datadog/core/workers/polling.rb +2 -0
  265. data/lib/datadog/core/workers/queue.rb +96 -1
  266. data/lib/datadog/core/workers/runtime_metrics.rb +9 -1
  267. data/lib/datadog/core.rb +10 -3
  268. data/lib/datadog/data_streams/configuration.rb +50 -0
  269. data/lib/datadog/data_streams/ext.rb +11 -0
  270. data/lib/datadog/data_streams/extensions.rb +16 -0
  271. data/lib/datadog/data_streams/pathway_context.rb +169 -0
  272. data/lib/datadog/data_streams/processor.rb +511 -0
  273. data/lib/datadog/data_streams/transport/http/stats.rb +58 -0
  274. data/lib/datadog/data_streams/transport/http.rb +36 -0
  275. data/lib/datadog/data_streams/transport/stats.rb +39 -0
  276. data/lib/datadog/data_streams.rb +100 -0
  277. data/lib/datadog/di/base.rb +15 -7
  278. data/lib/datadog/di/boot.rb +7 -2
  279. data/lib/datadog/di/capture_expression.rb +21 -0
  280. data/lib/datadog/di/capture_expression_evaluator.rb +71 -0
  281. data/lib/datadog/di/capture_limits.rb +41 -0
  282. data/lib/datadog/di/code_tracker.rb +217 -15
  283. data/lib/datadog/di/component.rb +139 -51
  284. data/lib/datadog/di/configuration.rb +241 -2
  285. data/lib/datadog/di/context.rb +82 -0
  286. data/lib/datadog/di/contrib/active_record.rb +34 -5
  287. data/lib/datadog/di/el/compiler.rb +168 -0
  288. data/lib/datadog/di/el/evaluator.rb +159 -0
  289. data/lib/datadog/di/el/expression.rb +42 -0
  290. data/lib/datadog/di/el.rb +5 -0
  291. data/lib/datadog/di/error.rb +44 -0
  292. data/lib/datadog/di/fatal_exceptions.rb +26 -0
  293. data/lib/datadog/di/instrumenter.rb +623 -147
  294. data/lib/datadog/di/logger.rb +2 -2
  295. data/lib/datadog/di/probe.rb +122 -14
  296. data/lib/datadog/di/probe_builder.rb +124 -3
  297. data/lib/datadog/di/probe_file_loader/railtie.rb +1 -1
  298. data/lib/datadog/di/probe_file_loader.rb +12 -7
  299. data/lib/datadog/di/probe_manager.rb +195 -100
  300. data/lib/datadog/di/probe_notification_builder.rb +321 -90
  301. data/lib/datadog/di/probe_notifier_worker.rb +112 -36
  302. data/lib/datadog/di/probe_repository.rb +198 -0
  303. data/lib/datadog/di/proc_responder.rb +36 -0
  304. data/lib/datadog/di/redactor.rb +24 -2
  305. data/lib/datadog/di/remote.rb +258 -93
  306. data/lib/datadog/di/serializer.rb +310 -29
  307. data/lib/datadog/di/transport/diagnostics.rb +12 -42
  308. data/lib/datadog/di/transport/http/diagnostics.rb +4 -34
  309. data/lib/datadog/di/transport/http/input.rb +2 -34
  310. data/lib/datadog/di/transport/http.rb +43 -19
  311. data/lib/datadog/di/transport/input.rb +112 -38
  312. data/lib/datadog/di/utils.rb +42 -14
  313. data/lib/datadog/di.rb +204 -4
  314. data/lib/datadog/error_tracking/collector.rb +2 -1
  315. data/lib/datadog/error_tracking/component.rb +2 -2
  316. data/lib/datadog/error_tracking/configuration.rb +55 -2
  317. data/lib/datadog/error_tracking/filters.rb +2 -2
  318. data/lib/datadog/kit/appsec/events/v2.rb +60 -3
  319. data/lib/datadog/kit/enable_core_dumps.rb +1 -1
  320. data/lib/datadog/kit/tracing/method_tracer.rb +135 -0
  321. data/lib/datadog/open_feature/component.rb +100 -0
  322. data/lib/datadog/open_feature/configuration.rb +37 -0
  323. data/lib/datadog/open_feature/evaluation_engine.rb +70 -0
  324. data/lib/datadog/open_feature/exposures/batch_builder.rb +32 -0
  325. data/lib/datadog/open_feature/exposures/buffer.rb +43 -0
  326. data/lib/datadog/open_feature/exposures/deduplicator.rb +30 -0
  327. data/lib/datadog/open_feature/exposures/event.rb +60 -0
  328. data/lib/datadog/open_feature/exposures/reporter.rb +40 -0
  329. data/lib/datadog/open_feature/exposures/worker.rb +116 -0
  330. data/lib/datadog/open_feature/ext.rb +16 -0
  331. data/lib/datadog/open_feature/flag_evaluation/aggregator.rb +286 -0
  332. data/lib/datadog/open_feature/flag_evaluation/writer.rb +433 -0
  333. data/lib/datadog/open_feature/hooks/flag_eval_evp_hook.rb +101 -0
  334. data/lib/datadog/open_feature/hooks/flag_eval_metrics_hook.rb +49 -0
  335. data/lib/datadog/open_feature/metrics/flag_eval_metrics.rb +149 -0
  336. data/lib/datadog/open_feature/native_evaluator.rb +60 -0
  337. data/lib/datadog/open_feature/noop_evaluator.rb +26 -0
  338. data/lib/datadog/open_feature/provider.rb +191 -0
  339. data/lib/datadog/open_feature/remote.rb +67 -0
  340. data/lib/datadog/open_feature/resolution_details.rb +35 -0
  341. data/lib/datadog/open_feature/transport.rb +121 -0
  342. data/lib/datadog/open_feature.rb +19 -0
  343. data/lib/datadog/opentelemetry/api/baggage.rb +1 -1
  344. data/lib/datadog/opentelemetry/configuration/settings.rb +226 -0
  345. data/lib/datadog/opentelemetry/ext.rb +9 -0
  346. data/lib/datadog/opentelemetry/logs.rb +98 -0
  347. data/lib/datadog/opentelemetry/metrics.rb +90 -0
  348. data/lib/datadog/opentelemetry/sdk/configurator.rb +65 -1
  349. data/lib/datadog/opentelemetry/sdk/id_generator.rb +16 -10
  350. data/lib/datadog/opentelemetry/sdk/logs_exporter.rb +30 -0
  351. data/lib/datadog/opentelemetry/sdk/metrics_exporter.rb +28 -0
  352. data/lib/datadog/opentelemetry/sdk/propagator.rb +9 -3
  353. data/lib/datadog/opentelemetry/sdk/span_processor.rb +4 -1
  354. data/lib/datadog/opentelemetry/sdk.rb +19 -0
  355. data/lib/datadog/opentelemetry/signal_configuration.rb +53 -0
  356. data/lib/datadog/opentelemetry.rb +4 -0
  357. data/lib/datadog/profiling/collectors/code_provenance.rb +71 -12
  358. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +52 -4
  359. data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +13 -5
  360. data/lib/datadog/profiling/collectors/info.rb +18 -4
  361. data/lib/datadog/profiling/collectors/thread_context.rb +10 -5
  362. data/lib/datadog/profiling/component.rb +82 -40
  363. data/lib/datadog/profiling/exporter.rb +41 -12
  364. data/lib/datadog/profiling/ext/dir_monkey_patches.rb +24 -5
  365. data/lib/datadog/profiling/ext/exec_monkey_patch.rb +32 -0
  366. data/lib/datadog/profiling/ext.rb +0 -2
  367. data/lib/datadog/profiling/flush.rb +23 -11
  368. data/lib/datadog/profiling/http_transport.rb +21 -8
  369. data/lib/datadog/profiling/load_native_extension.rb +2 -2
  370. data/lib/datadog/profiling/profiler.rb +31 -14
  371. data/lib/datadog/profiling/scheduler.rb +10 -9
  372. data/lib/datadog/profiling/stack_recorder.rb +0 -8
  373. data/lib/datadog/profiling/tag_builder.rb +37 -3
  374. data/lib/datadog/profiling/tasks/exec.rb +8 -3
  375. data/lib/datadog/profiling/tasks/help.rb +1 -0
  376. data/lib/datadog/profiling/tasks/setup.rb +2 -2
  377. data/lib/datadog/profiling.rb +1 -3
  378. data/lib/datadog/ruby_version.rb +25 -0
  379. data/lib/datadog/single_step_instrument.rb +2 -2
  380. data/lib/datadog/symbol_database/component.rb +734 -0
  381. data/lib/datadog/symbol_database/configuration.rb +73 -0
  382. data/lib/datadog/symbol_database/extensions.rb +19 -0
  383. data/lib/datadog/symbol_database/extractor.rb +1110 -0
  384. data/lib/datadog/symbol_database/file_hash.rb +48 -0
  385. data/lib/datadog/symbol_database/logger.rb +43 -0
  386. data/lib/datadog/symbol_database/remote.rb +180 -0
  387. data/lib/datadog/symbol_database/scope.rb +102 -0
  388. data/lib/datadog/symbol_database/scope_batcher.rb +292 -0
  389. data/lib/datadog/symbol_database/service_version.rb +66 -0
  390. data/lib/datadog/symbol_database/symbol.rb +69 -0
  391. data/lib/datadog/symbol_database/transport/http/endpoint.rb +28 -0
  392. data/lib/datadog/symbol_database/transport/http.rb +45 -0
  393. data/lib/datadog/symbol_database/transport.rb +54 -0
  394. data/lib/datadog/symbol_database/uploader.rb +230 -0
  395. data/lib/datadog/symbol_database.rb +71 -0
  396. data/lib/datadog/tracing/buffer.rb +3 -3
  397. data/lib/datadog/tracing/component.rb +17 -17
  398. data/lib/datadog/tracing/configuration/dynamic.rb +2 -2
  399. data/lib/datadog/tracing/configuration/ext.rb +22 -0
  400. data/lib/datadog/tracing/configuration/settings.rb +96 -4
  401. data/lib/datadog/tracing/contrib/action_cable/events/broadcast.rb +4 -1
  402. data/lib/datadog/tracing/contrib/action_cable/events/perform_action.rb +4 -1
  403. data/lib/datadog/tracing/contrib/action_cable/events/transmit.rb +4 -1
  404. data/lib/datadog/tracing/contrib/action_cable/instrumentation.rb +4 -1
  405. data/lib/datadog/tracing/contrib/action_mailer/event.rb +4 -1
  406. data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +10 -7
  407. data/lib/datadog/tracing/contrib/action_pack/action_dispatch/instrumentation.rb +28 -0
  408. data/lib/datadog/tracing/contrib/action_pack/action_dispatch/patcher.rb +3 -1
  409. data/lib/datadog/tracing/contrib/action_pack/utils.rb +1 -2
  410. data/lib/datadog/tracing/contrib/action_view/events/render_partial.rb +4 -1
  411. data/lib/datadog/tracing/contrib/action_view/events/render_template.rb +5 -2
  412. data/lib/datadog/tracing/contrib/active_job/data_streams.rb +62 -0
  413. data/lib/datadog/tracing/contrib/active_job/events/discard.rb +5 -2
  414. data/lib/datadog/tracing/contrib/active_job/events/enqueue.rb +5 -2
  415. data/lib/datadog/tracing/contrib/active_job/events/enqueue_at.rb +5 -2
  416. data/lib/datadog/tracing/contrib/active_job/events/enqueue_retry.rb +5 -2
  417. data/lib/datadog/tracing/contrib/active_job/events/perform.rb +5 -2
  418. data/lib/datadog/tracing/contrib/active_job/events/retry_stopped.rb +5 -2
  419. data/lib/datadog/tracing/contrib/active_job/log_injection.rb +21 -7
  420. data/lib/datadog/tracing/contrib/active_job/patcher.rb +17 -1
  421. data/lib/datadog/tracing/contrib/active_model_serializers/events/render.rb +1 -1
  422. data/lib/datadog/tracing/contrib/active_model_serializers/events/serialize.rb +3 -4
  423. data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +2 -2
  424. data/lib/datadog/tracing/contrib/active_record/events/instantiation.rb +1 -1
  425. data/lib/datadog/tracing/contrib/active_record/events/sql.rb +2 -5
  426. data/lib/datadog/tracing/contrib/active_record/utils.rb +1 -1
  427. data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +2 -5
  428. data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +1 -4
  429. data/lib/datadog/tracing/contrib/active_support/notifications/subscription.rb +2 -2
  430. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +6 -8
  431. data/lib/datadog/tracing/contrib/component.rb +3 -3
  432. data/lib/datadog/tracing/contrib/configurable.rb +18 -3
  433. data/lib/datadog/tracing/contrib/configuration/resolver.rb +14 -4
  434. data/lib/datadog/tracing/contrib/dalli/instrumentation.rb +1 -5
  435. data/lib/datadog/tracing/contrib/dalli/integration.rb +4 -1
  436. data/lib/datadog/tracing/contrib/dalli/quantize.rb +1 -1
  437. data/lib/datadog/tracing/contrib/delayed_job/plugin.rb +2 -0
  438. data/lib/datadog/tracing/contrib/delayed_job/server_internal_tracer/worker.rb +1 -0
  439. data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +2 -6
  440. data/lib/datadog/tracing/contrib/elasticsearch/quantize.rb +2 -2
  441. data/lib/datadog/tracing/contrib/ethon/configuration/settings.rb +5 -1
  442. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +5 -6
  443. data/lib/datadog/tracing/contrib/ethon/ext.rb +1 -0
  444. data/lib/datadog/tracing/contrib/ethon/multi_patch.rb +1 -8
  445. data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +16 -5
  446. data/lib/datadog/tracing/contrib/excon/ext.rb +1 -0
  447. data/lib/datadog/tracing/contrib/excon/middleware.rb +3 -7
  448. data/lib/datadog/tracing/contrib/ext.rb +3 -1
  449. data/lib/datadog/tracing/contrib/extensions.rb +19 -2
  450. data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +16 -9
  451. data/lib/datadog/tracing/contrib/faraday/ext.rb +1 -0
  452. data/lib/datadog/tracing/contrib/faraday/middleware.rb +3 -7
  453. data/lib/datadog/tracing/contrib/grape/configuration/settings.rb +7 -3
  454. data/lib/datadog/tracing/contrib/grape/endpoint.rb +10 -7
  455. data/lib/datadog/tracing/contrib/grape/instrumentation.rb +13 -8
  456. data/lib/datadog/tracing/contrib/grape/patcher.rb +6 -1
  457. data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +7 -0
  458. data/lib/datadog/tracing/contrib/graphql/ext.rb +1 -0
  459. data/lib/datadog/tracing/contrib/graphql/unified_trace.rb +75 -44
  460. data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +5 -2
  461. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +3 -7
  462. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +3 -7
  463. data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +2 -0
  464. data/lib/datadog/tracing/contrib/grpc/ext.rb +1 -0
  465. data/lib/datadog/tracing/contrib/grpc.rb +1 -0
  466. data/lib/datadog/tracing/contrib/hanami/action_tracer.rb +1 -0
  467. data/lib/datadog/tracing/contrib/hanami/renderer_policy_tracing.rb +1 -0
  468. data/lib/datadog/tracing/contrib/hanami/router_tracing.rb +1 -0
  469. data/lib/datadog/tracing/contrib/http/configuration/settings.rb +16 -5
  470. data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +2 -0
  471. data/lib/datadog/tracing/contrib/http/ext.rb +1 -0
  472. data/lib/datadog/tracing/contrib/http/instrumentation.rb +4 -8
  473. data/lib/datadog/tracing/contrib/http/integration.rb +0 -2
  474. data/lib/datadog/tracing/contrib/http.rb +1 -0
  475. data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +16 -5
  476. data/lib/datadog/tracing/contrib/httpclient/ext.rb +1 -0
  477. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +7 -7
  478. data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +16 -5
  479. data/lib/datadog/tracing/contrib/httprb/ext.rb +1 -0
  480. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +4 -8
  481. data/lib/datadog/tracing/contrib/kafka/event.rb +1 -0
  482. data/lib/datadog/tracing/contrib/kafka/instrumentation/consumer.rb +66 -0
  483. data/lib/datadog/tracing/contrib/kafka/instrumentation/producer.rb +66 -0
  484. data/lib/datadog/tracing/contrib/kafka/patcher.rb +14 -0
  485. data/lib/datadog/tracing/contrib/karafka/configuration/settings.rb +5 -1
  486. data/lib/datadog/tracing/contrib/karafka/distributed/propagation.rb +2 -0
  487. data/lib/datadog/tracing/contrib/karafka/ext.rb +1 -0
  488. data/lib/datadog/tracing/contrib/karafka/framework.rb +30 -0
  489. data/lib/datadog/tracing/contrib/karafka/monitor.rb +11 -0
  490. data/lib/datadog/tracing/contrib/karafka/patcher.rb +35 -4
  491. data/lib/datadog/tracing/contrib/karafka.rb +1 -0
  492. data/lib/datadog/tracing/contrib/mongodb/parsers.rb +5 -5
  493. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +5 -8
  494. data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +6 -0
  495. data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +3 -6
  496. data/lib/datadog/tracing/contrib/opensearch/patcher.rb +2 -6
  497. data/lib/datadog/tracing/contrib/opensearch/quantize.rb +2 -2
  498. data/lib/datadog/tracing/contrib/pg/configuration/settings.rb +6 -0
  499. data/lib/datadog/tracing/contrib/pg/instrumentation.rb +15 -18
  500. data/lib/datadog/tracing/contrib/presto/instrumentation.rb +6 -8
  501. data/lib/datadog/tracing/contrib/propagation/sql_comment/ext.rb +13 -0
  502. data/lib/datadog/tracing/contrib/propagation/sql_comment/mode.rb +6 -2
  503. data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +24 -0
  504. data/lib/datadog/tracing/contrib/que/configuration/settings.rb +5 -2
  505. data/lib/datadog/tracing/contrib/que/ext.rb +1 -0
  506. data/lib/datadog/tracing/contrib/que/tracer.rb +1 -0
  507. data/lib/datadog/tracing/contrib/racecar/event.rb +1 -5
  508. data/lib/datadog/tracing/contrib/rack/configuration/settings.rb +11 -1
  509. data/lib/datadog/tracing/contrib/rack/ext.rb +28 -0
  510. data/lib/datadog/tracing/contrib/rack/header_tagging.rb +23 -0
  511. data/lib/datadog/tracing/contrib/rack/middlewares.rb +62 -27
  512. data/lib/datadog/tracing/contrib/rack/patcher.rb +2 -2
  513. data/lib/datadog/tracing/contrib/rack/request_queue.rb +1 -1
  514. data/lib/datadog/tracing/contrib/rack/route_inference.rb +67 -0
  515. data/lib/datadog/tracing/contrib/rack/trace_proxy_middleware.rb +119 -1
  516. data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +5 -2
  517. data/lib/datadog/tracing/contrib/rails/ext.rb +1 -0
  518. data/lib/datadog/tracing/contrib/rails/log_injection.rb +1 -1
  519. data/lib/datadog/tracing/contrib/rails/middlewares.rb +2 -2
  520. data/lib/datadog/tracing/contrib/rails/patcher.rb +0 -1
  521. data/lib/datadog/tracing/contrib/rails/runner.rb +3 -1
  522. data/lib/datadog/tracing/contrib/rake/instrumentation.rb +6 -4
  523. data/lib/datadog/tracing/contrib/redis/quantize.rb +1 -1
  524. data/lib/datadog/tracing/contrib/redis/tags.rb +1 -6
  525. data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +2 -0
  526. data/lib/datadog/tracing/contrib/registerable.rb +11 -0
  527. data/lib/datadog/tracing/contrib/resque/resque_job.rb +1 -0
  528. data/lib/datadog/tracing/contrib/rest_client/configuration/settings.rb +5 -2
  529. data/lib/datadog/tracing/contrib/rest_client/ext.rb +1 -0
  530. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +5 -6
  531. data/lib/datadog/tracing/contrib/roda/ext.rb +1 -0
  532. data/lib/datadog/tracing/contrib/roda/instrumentation.rb +7 -2
  533. data/lib/datadog/tracing/contrib/sequel/database.rb +1 -0
  534. data/lib/datadog/tracing/contrib/sequel/dataset.rb +1 -0
  535. data/lib/datadog/tracing/contrib/sequel/utils.rb +2 -7
  536. data/lib/datadog/tracing/contrib/shoryuken/tracer.rb +1 -0
  537. data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +1 -0
  538. data/lib/datadog/tracing/contrib/sidekiq/configuration/settings.rb +5 -1
  539. data/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb +2 -0
  540. data/lib/datadog/tracing/contrib/sidekiq/ext.rb +1 -0
  541. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/heartbeat.rb +2 -0
  542. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/job_fetch.rb +1 -0
  543. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/redis_info.rb +1 -0
  544. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/scheduled_poller.rb +2 -0
  545. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/stop.rb +1 -0
  546. data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +3 -2
  547. data/lib/datadog/tracing/contrib/sidekiq/utils.rb +1 -1
  548. data/lib/datadog/tracing/contrib/sidekiq.rb +1 -0
  549. data/lib/datadog/tracing/contrib/sinatra/configuration/settings.rb +5 -1
  550. data/lib/datadog/tracing/contrib/sinatra/ext.rb +1 -0
  551. data/lib/datadog/tracing/contrib/sinatra/framework.rb +1 -1
  552. data/lib/datadog/tracing/contrib/sinatra/tracer.rb +1 -0
  553. data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +4 -1
  554. data/lib/datadog/tracing/contrib/sneakers/integration.rb +15 -4
  555. data/lib/datadog/tracing/contrib/sneakers/tracer.rb +1 -0
  556. data/lib/datadog/tracing/contrib/status_range_matcher.rb +13 -1
  557. data/lib/datadog/tracing/contrib/stripe/request.rb +1 -1
  558. data/lib/datadog/tracing/contrib/sucker_punch/instrumentation.rb +1 -0
  559. data/lib/datadog/tracing/contrib/trilogy/configuration/settings.rb +6 -0
  560. data/lib/datadog/tracing/contrib/trilogy/instrumentation.rb +4 -6
  561. data/lib/datadog/tracing/contrib/utils/quantization/{hash.rb → hash_formatter.rb} +4 -2
  562. data/lib/datadog/tracing/contrib/waterdrop/configuration/settings.rb +31 -0
  563. data/lib/datadog/tracing/contrib/waterdrop/distributed/propagation.rb +50 -0
  564. data/lib/datadog/tracing/contrib/waterdrop/ext.rb +18 -0
  565. data/lib/datadog/tracing/contrib/waterdrop/integration.rb +43 -0
  566. data/lib/datadog/tracing/contrib/waterdrop/middleware.rb +46 -0
  567. data/lib/datadog/tracing/contrib/waterdrop/patcher.rb +49 -0
  568. data/lib/datadog/tracing/contrib/waterdrop/producer.rb +50 -0
  569. data/lib/datadog/tracing/contrib/waterdrop.rb +42 -0
  570. data/lib/datadog/tracing/contrib.rb +9 -0
  571. data/lib/datadog/tracing/diagnostics/environment_logger.rb +4 -2
  572. data/lib/datadog/tracing/distributed/baggage.rb +64 -8
  573. data/lib/datadog/tracing/distributed/datadog.rb +13 -11
  574. data/lib/datadog/tracing/distributed/datadog_tags_codec.rb +1 -14
  575. data/lib/datadog/tracing/distributed/propagation.rb +35 -3
  576. data/lib/datadog/tracing/distributed/trace_context.rb +85 -62
  577. data/lib/datadog/tracing/event.rb +1 -1
  578. data/lib/datadog/tracing/ext.rb +9 -0
  579. data/lib/datadog/tracing/metadata/ext.rb +23 -1
  580. data/lib/datadog/tracing/metadata/tagging.rb +2 -2
  581. data/lib/datadog/tracing/pipeline.rb +1 -1
  582. data/lib/datadog/tracing/remote.rb +36 -13
  583. data/lib/datadog/tracing/sampling/ext.rb +2 -0
  584. data/lib/datadog/tracing/sampling/priority_sampler.rb +16 -1
  585. data/lib/datadog/tracing/sampling/rate_sampler.rb +8 -19
  586. data/lib/datadog/tracing/sampling/rule.rb +1 -1
  587. data/lib/datadog/tracing/sampling/rule_sampler.rb +54 -25
  588. data/lib/datadog/tracing/sampling/span/rule_parser.rb +2 -2
  589. data/lib/datadog/tracing/span.rb +1 -1
  590. data/lib/datadog/tracing/span_event.rb +2 -2
  591. data/lib/datadog/tracing/span_operation.rb +34 -10
  592. data/lib/datadog/tracing/sync_writer.rb +0 -1
  593. data/lib/datadog/tracing/trace_digest.rb +7 -0
  594. data/lib/datadog/tracing/trace_operation.rb +123 -16
  595. data/lib/datadog/tracing/tracer.rb +82 -23
  596. data/lib/datadog/tracing/transport/http/client.rb +12 -26
  597. data/lib/datadog/tracing/transport/http/traces.rb +2 -50
  598. data/lib/datadog/tracing/transport/http.rb +15 -9
  599. data/lib/datadog/tracing/transport/io/client.rb +6 -9
  600. data/lib/datadog/tracing/transport/io/traces.rb +28 -34
  601. data/lib/datadog/tracing/transport/trace_formatter.rb +22 -0
  602. data/lib/datadog/tracing/transport/traces.rb +13 -81
  603. data/lib/datadog/tracing/workers.rb +2 -1
  604. data/lib/datadog/tracing/writer.rb +1 -1
  605. data/lib/datadog/version.rb +2 -2
  606. data/lib/datadog.rb +8 -1
  607. metadata +185 -36
  608. data/ext/datadog_profiling_native_extension/clock_id_noop.c +0 -21
  609. data/ext/libdatadog_api/macos_development.md +0 -26
  610. data/lib/datadog/appsec/configuration/settings.rb +0 -400
  611. data/lib/datadog/appsec/contrib/rails/ext.rb +0 -13
  612. data/lib/datadog/core/remote/transport/http/api.rb +0 -53
  613. data/lib/datadog/core/remote/transport/http/client.rb +0 -49
  614. data/lib/datadog/core/telemetry/transport/http/api.rb +0 -43
  615. data/lib/datadog/core/telemetry/transport/http/client.rb +0 -49
  616. data/lib/datadog/core/transport/http/api/spec.rb +0 -36
  617. data/lib/datadog/di/configuration/settings.rb +0 -212
  618. data/lib/datadog/di/transport/http/api.rb +0 -42
  619. data/lib/datadog/di/transport/http/client.rb +0 -47
  620. data/lib/datadog/error_tracking/configuration/settings.rb +0 -63
  621. data/lib/datadog/opentelemetry/api/baggage.rbs +0 -26
  622. data/lib/datadog/tracing/transport/http/api.rb +0 -44
  623. data/lib/datadog/tracing/workers/trace_writer.rb +0 -199
@@ -8,8 +8,18 @@ module Datadog
8
8
  module Event
9
9
  # Telemetry class for the 'app-started' event
10
10
  class AppStarted < Base
11
- def initialize(agent_settings:)
12
- @agent_settings = agent_settings
11
+ def initialize(components:)
12
+ # To not hold a reference to the component tree, generate
13
+ # the event payload here in the constructor.
14
+ #
15
+ # Important: do not store data that contains (or is derived from)
16
+ # the runtime_id or sequence numbers.
17
+ # This event is reused when a process forks, but in the
18
+ # child process the runtime_id would be different and sequence
19
+ # number is reset.
20
+ @configuration = configuration(components.settings, components.agent_settings)
21
+ @install_signature = install_signature(components.settings)
22
+ @products = products(components)
13
23
  end
14
24
 
15
25
  def type
@@ -18,27 +28,43 @@ module Datadog
18
28
 
19
29
  def payload
20
30
  {
21
- products: products,
22
- configuration: configuration,
23
- install_signature: install_signature,
31
+ products: @products,
32
+ configuration: @configuration,
33
+ install_signature: @install_signature,
24
34
  # DEV: Not implemented yet
25
35
  # error: error, # Start-up errors
26
36
  }
27
37
  end
28
38
 
39
+ # Whether the event is actually the app-started event.
40
+ # For the app-started event we follow up by sending
41
+ # app-dependencies-loaded, if the event is
42
+ # app-client-configuration-change we don't send
43
+ # app-dependencies-loaded.
44
+ def app_started?
45
+ true
46
+ end
47
+
29
48
  private
30
49
 
31
- def products
32
- # @type var products: Hash[Symbol, Hash[Symbol, Hash[Symbol, String | Integer] | bool | nil]]
50
+ def products(components)
51
+ # @type var products: telemetry_products
33
52
  products = {
34
53
  appsec: {
35
- enabled: Datadog::AppSec.enabled?,
54
+ enabled: !!components.appsec,
36
55
  },
37
56
  profiler: {
38
- enabled: Datadog::Profiling.enabled?,
57
+ enabled: !!components.profiler,
39
58
  },
40
59
  dynamic_instrumentation: {
41
- enabled: defined?(Datadog::DI) && Datadog::DI.respond_to?(:enabled?) && Datadog::DI.enabled?,
60
+ # With always-build, the DI component is constructed by
61
+ # default (when the runtime supports DI, RC is available, and
62
+ # DI is not explicitly disabled) regardless of whether the
63
+ # customer turned DI on. Its presence therefore no longer
64
+ # indicates the enabled state. started? reflects whether DI was
65
+ # actually enabled by env var or by implicit enablement via
66
+ # remote config.
67
+ enabled: components.dynamic_instrumentation&.started? || false,
42
68
  }
43
69
  }
44
70
 
@@ -52,120 +78,39 @@ module Datadog
52
78
  products
53
79
  end
54
80
 
55
- TARGET_OPTIONS = %w[
56
- dynamic_instrumentation.enabled
57
- logger.level
58
- profiling.advanced.code_provenance_enabled
59
- profiling.advanced.endpoint.collection.enabled
60
- profiling.enabled
61
- runtime_metrics.enabled
62
- tracing.analytics.enabled
63
- tracing.propagation_style_extract
64
- tracing.propagation_style_inject
65
- tracing.enabled
66
- tracing.log_injection
67
- tracing.partial_flush.enabled
68
- tracing.partial_flush.min_spans_threshold
69
- tracing.report_hostname
70
- tracing.sampling.rate_limit
71
- apm.tracing.enabled
72
- ].freeze
73
-
74
- # standard:disable Metrics/AbcSize
75
- # standard:disable Metrics/MethodLength
76
- def configuration
77
- config = Datadog.configuration
78
- seq_id = Event.configuration_sequence.next
79
-
80
- # tracing.writer_options.buffer_size and tracing.writer_options.flush_interval have the same origin.
81
- writer_option_origin = get_telemetry_origin(config, 'tracing.writer_options')
82
-
81
+ def configuration(settings, agent_settings)
82
+ # Special values that are not tied to a configuration option
83
83
  list = [
84
- # Only set using env var as of June 2025
85
- conf_value('DD_GIT_REPOSITORY_URL', Core::Environment::Git.git_repository_url, seq_id, 'env_var'),
86
- conf_value('DD_GIT_COMMIT_SHA', Core::Environment::Git.git_commit_sha, seq_id, 'env_var'),
87
-
88
- # Set by the customer application (eg. `require 'datadog/auto_instrument'`)
89
84
  conf_value(
90
- 'tracing.auto_instrument.enabled',
91
- !defined?(Datadog::AutoInstrument::LOADED).nil?,
92
- seq_id,
93
- 'code'
85
+ 'DD_GIT_REPOSITORY_URL',
86
+ Core::Environment::Git.git_repository_url,
87
+ (Core::Environment::Git.git_repository_url ? Configuration::Option::Precedence::ENVIRONMENT : Configuration::Option::Precedence::DEFAULT)
94
88
  ),
95
89
  conf_value(
96
- 'tracing.opentelemetry.enabled',
97
- !defined?(Datadog::OpenTelemetry::LOADED).nil?,
98
- seq_id,
99
- 'code'
90
+ 'DD_GIT_COMMIT_SHA',
91
+ Core::Environment::Git.git_commit_sha,
92
+ (Core::Environment::Git.git_commit_sha ? Configuration::Option::Precedence::ENVIRONMENT : Configuration::Option::Precedence::DEFAULT)
100
93
  ),
101
94
 
102
95
  # Mix of env var, programmatic and default config, so we use unknown
103
- conf_value('DD_AGENT_TRANSPORT', agent_transport, seq_id, 'unknown'), # rubocop:disable CustomCops/EnvStringValidationCop
104
-
105
- # writer_options is defined as an option that has a Hash value.
106
- conf_value(
107
- 'tracing.writer_options.buffer_size',
108
- to_value(config.tracing.writer_options[:buffer_size]),
109
- seq_id,
110
- writer_option_origin
111
- ),
112
- conf_value(
113
- 'tracing.writer_options.flush_interval',
114
- to_value(config.tracing.writer_options[:flush_interval]),
115
- seq_id,
116
- writer_option_origin
117
- ),
118
-
119
- conf_value('DD_AGENT_HOST', config.agent.host, seq_id, get_telemetry_origin(config, 'agent.host')),
120
- conf_value(
121
- 'DD_TRACE_SAMPLE_RATE',
122
- to_value(config.tracing.sampling.default_rate),
123
- seq_id,
124
- get_telemetry_origin(config, 'tracing.sampling.default_rate')
125
- ),
126
- conf_value(
127
- 'DD_TRACE_REMOVE_INTEGRATION_SERVICE_NAMES_ENABLED',
128
- config.tracing.contrib.global_default_service_name.enabled,
129
- seq_id,
130
- get_telemetry_origin(config, 'tracing.contrib.global_default_service_name.enabled')
131
- ),
132
- conf_value(
133
- 'DD_TRACE_PEER_SERVICE_DEFAULTS_ENABLED',
134
- config.tracing.contrib.peer_service_defaults,
135
- seq_id,
136
- get_telemetry_origin(config, 'tracing.contrib.peer_service_defaults')
137
- ),
138
- conf_value(
139
- 'DD_TRACE_DEBUG',
140
- config.diagnostics.debug,
141
- seq_id,
142
- get_telemetry_origin(config, 'diagnostics.debug')
143
- )
96
+ unknown_conf_value('DD_AGENT_TRANSPORT', agent_transport(agent_settings)), # rubocop:disable CustomCops/EnvStringValidationCop
144
97
  ]
145
98
 
146
- peer_service_mapping_str = ''
147
- unless config.tracing.contrib.peer_service_mapping.empty?
148
- peer_service_mapping = config.tracing.contrib.peer_service_mapping
149
- peer_service_mapping_str = peer_service_mapping.map { |key, value| "#{key}:#{value}" }.join(',')
150
- end
99
+ # Set by the customer application (eg. `require 'datadog/auto_instrument'`)
100
+ auto_instrument_enabled = !defined?(Datadog::AutoInstrument::LOADED).nil?
151
101
  list << conf_value(
152
- 'DD_TRACE_PEER_SERVICE_MAPPING',
153
- peer_service_mapping_str,
154
- seq_id,
155
- get_telemetry_origin(config, 'tracing.contrib.peer_service_mapping')
102
+ 'tracing.auto_instrument.enabled',
103
+ auto_instrument_enabled,
104
+ auto_instrument_enabled ? Configuration::Option::Precedence::PROGRAMMATIC : Configuration::Option::Precedence::DEFAULT
105
+ )
106
+ opentelemetry_enabled = !defined?(Datadog::OpenTelemetry::LOADED).nil?
107
+ list << conf_value(
108
+ 'tracing.opentelemetry.enabled',
109
+ opentelemetry_enabled,
110
+ opentelemetry_enabled ? Configuration::Option::Precedence::PROGRAMMATIC : Configuration::Option::Precedence::DEFAULT
156
111
  )
157
112
 
158
- # Whitelist of configuration options to send in additional payload object
159
- TARGET_OPTIONS.each do |option_path|
160
- split_option = option_path.split('.')
161
- list << conf_value(
162
- option_path,
163
- to_value(config.dig(*split_option)),
164
- seq_id,
165
- get_telemetry_origin(config, option_path)
166
- )
167
- end
168
-
113
+ # Track ssi configurations
169
114
  instrumentation_source = if Datadog.const_defined?(:SingleStepInstrument, false) &&
170
115
  Datadog::SingleStepInstrument.const_defined?(:LOADED, false) &&
171
116
  Datadog::SingleStepInstrument::LOADED
@@ -173,53 +118,63 @@ module Datadog
173
118
  else
174
119
  'manual'
175
120
  end
176
- # Track ssi configurations
121
+
177
122
  list.push(
178
- conf_value('instrumentation_source', instrumentation_source, seq_id, 'code'),
179
- conf_value('DD_INJECT_FORCE', Core::Environment::VariableHelpers.env_to_bool('DD_INJECT_FORCE', false), seq_id, 'env_var'),
180
- conf_value('DD_INJECTION_ENABLED', DATADOG_ENV['DD_INJECTION_ENABLED'] || '', seq_id, 'env_var'),
123
+ conf_value(
124
+ 'instrumentation_source',
125
+ instrumentation_source,
126
+ (instrumentation_source == 'ssi') ? Configuration::Option::Precedence::PROGRAMMATIC : Configuration::Option::Precedence::DEFAULT
127
+ ),
128
+ conf_value(
129
+ 'DD_INJECT_FORCE',
130
+ Core::Environment::VariableHelpers.env_to_bool('DD_INJECT_FORCE', false),
131
+ (DATADOG_ENV.key?('DD_INJECT_FORCE') ? Configuration::Option::Precedence::ENVIRONMENT : Configuration::Option::Precedence::DEFAULT)
132
+ ),
133
+ conf_value(
134
+ 'DD_INJECTION_ENABLED',
135
+ DATADOG_ENV['DD_INJECTION_ENABLED'] || '',
136
+ (DATADOG_ENV.key?('DD_INJECTION_ENABLED') ? Configuration::Option::Precedence::ENVIRONMENT : Configuration::Option::Precedence::DEFAULT)
137
+ ),
181
138
  )
182
139
 
183
- # Add some more custom additional payload values here
184
- if config.logger.instance
140
+ # Extract writer options as separate configuration payloads.
141
+ resolve_option(settings, 'tracing.writer_options').values_per_precedence.each do |precedence, value|
185
142
  list << conf_value(
186
- 'logger.instance',
187
- config.logger.instance.class.to_s,
188
- seq_id,
189
- get_telemetry_origin(config, 'logger.instance')
190
- )
191
- end
192
- if config.respond_to?('appsec')
193
- list << conf_value(
194
- 'appsec.enabled',
195
- config.dig('appsec', 'enabled'),
196
- seq_id,
197
- get_telemetry_origin(config, 'appsec.enabled')
143
+ 'tracing.writer_options.buffer_size',
144
+ # Steep: Value is always a hash for writer_options (ensured by o.type :hash)
145
+ to_telemetry_value(value[:buffer_size]), # steep:ignore NoMethod
146
+ precedence
198
147
  )
199
148
  list << conf_value(
200
- 'appsec.sca_enabled',
201
- config.dig('appsec', 'sca_enabled'),
202
- seq_id,
203
- get_telemetry_origin(config, 'appsec.sca_enabled')
149
+ 'tracing.writer_options.flush_interval',
150
+ # Steep: Value is always a hash for writer_options (ensured by o.type :hash)
151
+ to_telemetry_value(value[:flush_interval]), # steep:ignore NoMethod
152
+ precedence
204
153
  )
205
154
  end
206
- if config.respond_to?('ci')
207
- list << conf_value(
208
- 'ci.enabled',
209
- config.dig('ci', 'enabled'),
210
- seq_id,
211
- get_telemetry_origin(config, 'ci.enabled')
212
- )
155
+
156
+ # Add some more custom additional payload values here
157
+ if settings.logger.instance
158
+ logger_instance_option = resolve_option(settings, 'logger.instance')
159
+ logger_instance_option.values_per_precedence.each do |precedence, value|
160
+ list << conf_value(option_telemetry_name(logger_instance_option), value.nil? ? nil : value.class.to_s, precedence)
161
+ end
162
+ end
163
+
164
+ # Configuration options (regular + integration specific)
165
+ collect_all_configuration_options(settings).each do |option|
166
+ option.values_per_precedence.each do |precedence, value|
167
+ list << conf_value(option_telemetry_name(option), to_telemetry_value(value), precedence)
168
+ end
213
169
  end
214
170
 
215
- list.reject! { |entry| entry[:value].nil? }
171
+ # We still want to report nil default and programmatic values as they are valid values
172
+ list.reject! { |entry| entry[:origin] != 'default' && entry[:origin] != 'code' && entry[:value].nil? }
216
173
  list
217
174
  end
218
- # standard:enable Metrics/AbcSize
219
- # standard:enable Metrics/MethodLength
220
175
 
221
- def agent_transport
222
- adapter = @agent_settings.adapter
176
+ def agent_transport(agent_settings)
177
+ adapter = agent_settings.adapter
223
178
  if adapter == Datadog::Core::Transport::Ext::UnixSocket::ADAPTER
224
179
  'UDS'
225
180
  else
@@ -228,18 +183,25 @@ module Datadog
228
183
  end
229
184
 
230
185
  # `origin`: Source of the configuration. One of :
231
- # - `fleet_stable_config`: configuration is set via the fleet automation Datadog UI
232
- # - `local_stable_config`: configuration set via a user-managed file
233
- # - `env_var`: configurations that are set through environment variables
234
- # - `jvm_prop`: JVM system properties passed on the command line
235
- # - `code`: configurations that are set through the customer application
236
- # - `dd_config`: set by the dd.yaml file or json
237
- # - `remote_config`: values that are set using remote config
238
- # - `app.config`: only applies to .NET
239
- # - `default`: set when the user has not set any configuration for the key (defaults to a value)
240
- # - `unknown`: set for cases where it is difficult/not possible to determine the source of a config.
241
- def conf_value(name, value, seq_id, origin)
186
+ # - 1: `default`: set when the user has not set any configuration for the key (defaults to a value)
187
+ # - 2:`local_stable_config`: configuration set via a user-managed file
188
+ # - 3:`env_var`: configurations that are set through environment variables
189
+ # - 4:`fleet_stable_config`: configuration is set via the fleet automation Datadog UI
190
+ # - 5:`code`: configurations that are set through the customer application
191
+ # - 6:`remote_config`: values that are set using remote config
192
+ # - 7:`unknown`: set for cases where it is difficult/not possible to determine the source of a config.
193
+ def conf_value(name, value, precedence)
194
+ build_conf_value(name, value, precedence.origin, precedence.numeric + 1)
195
+ end
196
+
197
+ def unknown_conf_value(name, value)
198
+ build_conf_value(name, value, 'unknown', Configuration::Option::Precedence::LIST.size + 1)
199
+ end
200
+
201
+ def build_conf_value(name, value, origin, seq_id)
202
+ # @type var result: Event::telemetry_configuration
242
203
  result = {name: name, value: value, origin: origin, seq_id: seq_id}
204
+
243
205
  if origin == 'fleet_stable_config'
244
206
  fleet_id = Core::Configuration::StableConfig.configuration.dig(:fleet, :id)
245
207
  result[:config_id] = fleet_id if fleet_id
@@ -247,38 +209,82 @@ module Datadog
247
209
  local_id = Core::Configuration::StableConfig.configuration.dig(:local, :id)
248
210
  result[:config_id] = local_id if local_id
249
211
  end
212
+
250
213
  result
251
214
  end
252
215
 
253
- def to_value(value)
216
+ def to_telemetry_value(value)
254
217
  # TODO: Add float if telemetry starts accepting it
255
218
  case value
256
219
  when Integer, String, true, false, nil
257
220
  value
221
+ when Hash
222
+ value.map { |key, entry_value| "#{key}:#{entry_value}" }.join(',')
223
+ when Array
224
+ value.join(',')
225
+ when Module
226
+ value.name.to_s
258
227
  else
259
- value.to_s
228
+ if implements_to_s?(value)
229
+ value.to_s
230
+ else
231
+ value.class.to_s
232
+ end
260
233
  end
261
234
  end
262
235
 
263
- def install_signature
264
- config = Datadog.configuration
236
+ def install_signature(settings)
265
237
  {
266
- install_id: config.dig('telemetry', 'install_id'),
267
- install_type: config.dig('telemetry', 'install_type'),
268
- install_time: config.dig('telemetry', 'install_time'),
238
+ install_id: settings.dig('telemetry', 'install_id'),
239
+ install_type: settings.dig('telemetry', 'install_type'),
240
+ install_time: settings.dig('telemetry', 'install_time'),
269
241
  }
270
242
  end
271
243
 
272
- def get_telemetry_origin(config, config_path)
244
+ def collect_all_configuration_options(settings)
245
+ collect_configuration_options_from(settings).concat(collect_integration_configuration_options(settings.tracing))
246
+ end
247
+
248
+ def collect_integration_configuration_options(tracing_settings)
249
+ return [] unless tracing_settings.respond_to?(:instrumented_built_in_integrations)
250
+
251
+ tracing_settings.instrumented_built_in_integrations.each_with_object([]) do |integration, entries|
252
+ integration.configurations.each_value do |configuration|
253
+ entries.concat(collect_configuration_options_from(configuration))
254
+ end
255
+ end
256
+ end
257
+
258
+ def collect_configuration_options_from(settings)
259
+ settings.class.options.each_key.with_object([]) do |name, options|
260
+ option = settings.send(:resolve_option, name)
261
+ next if option.definition.skip_telemetry
262
+
263
+ if option.settings?
264
+ options.concat(collect_configuration_options_from(option.get))
265
+ else
266
+ options << option
267
+ end
268
+ end
269
+ end
270
+
271
+ def option_telemetry_name(option)
272
+ option.definition.env || option.name_with_settings_path
273
+ end
274
+
275
+ def resolve_option(settings, config_path)
273
276
  split_option = config_path.split('.')
274
277
  option_name = split_option.pop
275
- return 'unknown' if option_name.nil?
278
+ raise ArgumentError, "Invalid config path: #{config_path}" if option_name.nil?
279
+
280
+ parent_setting = settings.dig(*split_option)
281
+ parent_setting.send(:resolve_option, option_name.to_sym)
282
+ end
276
283
 
277
- # @type var parent_setting: Core::Configuration::Options
278
- # @type var option: Core::Configuration::Option
279
- parent_setting = config.dig(*split_option)
280
- option = parent_setting.send(:resolve_option, option_name.to_sym)
281
- option.precedence_set&.origin || 'unknown'
284
+ def implements_to_s?(value)
285
+ value.method(:to_s).owner != Kernel
286
+ rescue NameError
287
+ false
282
288
  end
283
289
  end
284
290
  end
@@ -28,13 +28,36 @@ module Datadog
28
28
  # and app-closing events.
29
29
  class SynthAppClientConfigurationChange < AppStarted
30
30
  def type
31
- 'app-client-configuration-change'
31
+ if reset?
32
+ super
33
+ else
34
+ 'app-client-configuration-change'
35
+ end
32
36
  end
33
37
 
34
38
  def payload
35
- {
36
- configuration: configuration,
37
- }
39
+ if reset?
40
+ super
41
+ else
42
+ {
43
+ configuration: @configuration,
44
+ }
45
+ end
46
+ end
47
+
48
+ def app_started?
49
+ reset?
50
+ end
51
+
52
+ # Revert this event to a "regular" AppStarted event.
53
+ #
54
+ # Used in after_fork to send the AppStarted event in child processes.
55
+ def reset!
56
+ @reset = true
57
+ end
58
+
59
+ def reset?
60
+ defined?(@reset) && !!@reset
38
61
  end
39
62
  end
40
63
  end
@@ -10,13 +10,6 @@ module Datadog
10
10
  #
11
11
  # @api private
12
12
  module Event
13
- extend Core::Utils::Forking
14
-
15
- # returns sequence that increments every time the configuration changes
16
- def self.configuration_sequence
17
- after_fork! { @sequence = Datadog::Core::Utils::Sequence.new(1) }
18
- @sequence ||= Datadog::Core::Utils::Sequence.new(1)
19
- end
20
13
  end
21
14
  end
22
15
  end
@@ -25,7 +18,9 @@ end
25
18
  require_relative 'event/base'
26
19
  require_relative 'event/app_client_configuration_change'
27
20
  require_relative 'event/app_closing'
21
+ require_relative 'event/app_extended_heartbeat'
28
22
  require_relative 'event/app_dependencies_loaded'
23
+ require_relative 'event/app_endpoints_loaded'
29
24
  require_relative 'event/app_heartbeat'
30
25
  require_relative 'event/app_integrations_change'
31
26
  require_relative 'event/app_started'
@@ -7,6 +7,7 @@ module Datadog
7
7
  ENV_ENABLED = 'DD_INSTRUMENTATION_TELEMETRY_ENABLED'
8
8
  ENV_METRICS_ENABLED = 'DD_TELEMETRY_METRICS_ENABLED'
9
9
  ENV_HEARTBEAT_INTERVAL = 'DD_TELEMETRY_HEARTBEAT_INTERVAL'
10
+ ENV_EXTENDED_HEARTBEAT_INTERVAL = 'DD_TELEMETRY_EXTENDED_HEARTBEAT_INTERVAL'
10
11
  ENV_METRICS_AGGREGATION_INTERVAL = 'DD_TELEMETRY_METRICS_AGGREGATION_INTERVAL'
11
12
  ENV_DEPENDENCY_COLLECTION = 'DD_TELEMETRY_DEPENDENCY_COLLECTION_ENABLED'
12
13
  ENV_INSTALL_ID = 'DD_INSTRUMENTATION_INSTALL_ID'
@@ -14,10 +14,12 @@ module Datadog
14
14
  # read: lib/datadog/core/telemetry/logging.rb
15
15
  module Logger
16
16
  class << self
17
- def report(exception, level: :error, description: nil, pii_safe: false)
18
- instance&.report(exception, level: level, description: description, pii_safe: pii_safe)
17
+ # (see Datadog::Core::Telemetry::Logging#report)
18
+ def report(exception, level: :error, description: nil)
19
+ instance&.report(exception, level: level, description: description)
19
20
  end
20
21
 
22
+ # (see Datadog::Core::Telemetry::Logging#error)
21
23
  def error(description)
22
24
  instance&.error(description)
23
25
  end
@@ -45,16 +45,19 @@ module Datadog
45
45
  end
46
46
  end
47
47
 
48
- def report(exception, level: :error, description: nil, pii_safe: false)
48
+ # @param exception [Exception] The exception to report
49
+ # @param level [Symbol] The log level (:error, :warn, :info, :debug)
50
+ # @param description [String, nil] A low cardinality description, without dynamic data
51
+ def report(exception, level: :error, description: nil)
49
52
  # Anonymous exceptions to be logged as <Class:0x00007f8b1c0b3b40>
50
- message = +"#{exception.class.name || exception.class.inspect}" # standard:disable Style/RedundantInterpolation
53
+ message = +(exception.class.name || exception.class.inspect)
51
54
 
52
- exception_message = pii_safe ? exception.message : nil
55
+ telemetry_message = message_for_telemetry(exception)
53
56
 
54
- if description || exception_message
57
+ if description || telemetry_message
55
58
  message << ':'
56
59
  message << " #{description}" if description
57
- message << " (#{exception.message})" if exception_message
60
+ message << " (#{telemetry_message})" if telemetry_message
58
61
  end
59
62
 
60
63
  event = Event::Log.new(
@@ -71,6 +74,15 @@ module Datadog
71
74
 
72
75
  log!(event)
73
76
  end
77
+
78
+ private
79
+
80
+ # A constant string representing the exception
81
+ def message_for_telemetry(exception)
82
+ return unless exception.instance_variable_defined?(:@telemetry_message)
83
+
84
+ exception.instance_variable_get(:@telemetry_message)
85
+ end
74
86
  end
75
87
  end
76
88
  end
@@ -6,8 +6,11 @@ module Datadog
6
6
  module Core
7
7
  module Telemetry
8
8
  # MetricsManager aggregates and flushes metrics and distributions
9
+ #
10
+ # @api private
9
11
  class MetricsManager
10
12
  attr_reader :enabled
13
+ attr_reader :collections
11
14
 
12
15
  def initialize(aggregation_interval:, enabled:)
13
16
  @interval = aggregation_interval
@@ -68,6 +71,12 @@ module Datadog
68
71
  @enabled = false
69
72
  end
70
73
 
74
+ def clear
75
+ @mutex.synchronize do
76
+ @collections = {}
77
+ end
78
+ end
79
+
71
80
  private
72
81
 
73
82
  def fetch_or_create_collection(namespace)
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative '../environment/platform'
4
+ require_relative '../environment/process'
4
5
  require_relative '../utils/hash'
5
6
 
6
7
  module Datadog
@@ -9,11 +10,9 @@ module Datadog
9
10
  # Module defining methods for collecting metadata for telemetry
10
11
  module Request
11
12
  class << self
12
- using Core::Utils::Hash::Refinement
13
-
14
- def build_payload(event, seq_id, api_version: 'v2', debug: false)
13
+ def build_payload(event, seq_id, debug: false)
15
14
  hash = {
16
- api_version: api_version,
15
+ api_version: 'v2',
17
16
  application: application,
18
17
  debug: debug,
19
18
  host: host,
@@ -43,7 +42,7 @@ module Datadog
43
42
  tracer_version = "#{tracer_version}-ci-#{::Datadog::CI::VERSION::STRING}"
44
43
  end
45
44
 
46
- {
45
+ app = {
47
46
  env: config.env,
48
47
  language_name: Core::Environment::Ext::LANG,
49
48
  language_version: Core::Environment::Ext::LANG_VERSION,
@@ -53,6 +52,10 @@ module Datadog
53
52
  service_version: config.version,
54
53
  tracer_version: tracer_version
55
54
  }
55
+
56
+ tag_process_tags!(app, config)
57
+
58
+ app
56
59
  end
57
60
 
58
61
  def host
@@ -64,6 +67,15 @@ module Datadog
64
67
  kernel_version: Core::Environment::Platform.kernel_version
65
68
  }
66
69
  end
70
+
71
+ def tag_process_tags!(app, config)
72
+ return unless config.experimental_propagate_process_tags_enabled
73
+
74
+ process_tags = Core::Environment::Process.serialized
75
+ return if process_tags.empty?
76
+
77
+ app[:process_tags] = process_tags
78
+ end
67
79
  end
68
80
  end
69
81
  end