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
@@ -1,18 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative "../core/telemetry/logger"
4
+
3
5
  module Datadog
4
6
  module Profiling
5
7
  # Responsible for wiring up the Profiler for execution
6
8
  module Component
7
- ALLOCATION_WITH_RACTORS_ONLY_ONCE = Datadog::Core::Utils::OnlyOnce.new
8
- private_constant :ALLOCATION_WITH_RACTORS_ONLY_ONCE
9
-
10
9
  # Passing in a `nil` tracer is supported and will disable the following profiling features:
11
10
  # * Profiling in the trace viewer, as well as scoping a profile down to a span
12
11
  # * Endpoint aggregation in the profiler UX, including normalization (resource per endpoint call)
13
12
  def self.build_profiler_component(settings:, agent_settings:, optional_tracer:, logger:) # rubocop:disable Metrics/MethodLength
14
- return [nil, {profiling_enabled: false}] unless settings.profiling.enabled
15
-
16
13
  # Workaround for weird dependency direction: the Core::Configuration::Components class currently has a
17
14
  # dependency on individual products, in this case the Profiler.
18
15
  # (Note "currently": in the future we want to change this so core classes don't depend on specific products)
@@ -32,7 +29,7 @@ module Datadog
32
29
  # no-op if profiling is already loaded).
33
30
  require_relative "../profiling"
34
31
 
35
- return [nil, {profiling_enabled: false}] unless Profiling.supported?
32
+ return [nil, {profiling_enabled: false}] unless settings.profiling.enabled && Profiling.supported?
36
33
 
37
34
  # Activate forking extensions
38
35
  Profiling::Tasks::Setup.new.run
@@ -40,7 +37,6 @@ module Datadog
40
37
  # NOTE: Please update the Initialization section of ProfilingDevelopment.md with any changes to this method
41
38
 
42
39
  no_signals_workaround_enabled = no_signals_workaround_enabled?(settings, logger)
43
- timeline_enabled = settings.profiling.advanced.timeline_enabled
44
40
  allocation_profiling_enabled = enable_allocation_profiling?(settings, logger)
45
41
  heap_sample_every = get_heap_sample_every(settings)
46
42
  heap_profiling_enabled = enable_heap_profiling?(settings, allocation_profiling_enabled, heap_sample_every, logger)
@@ -48,17 +44,17 @@ module Datadog
48
44
 
49
45
  overhead_target_percentage = valid_overhead_target(settings.profiling.advanced.overhead_target_percentage, logger)
50
46
  upload_period_seconds = [60, settings.profiling.advanced.upload_period_seconds].max
47
+ cpu_sampling_interval_ms =
48
+ valid_cpu_sampling_interval(settings.profiling.advanced.experimental_cpu_sampling_interval_ms, logger)
51
49
 
52
50
  recorder = Datadog::Profiling::StackRecorder.new(
53
- cpu_time_enabled: RUBY_PLATFORM.include?("linux"), # Only supported on Linux currently
54
51
  alloc_samples_enabled: allocation_profiling_enabled,
55
52
  heap_samples_enabled: heap_profiling_enabled,
56
53
  heap_size_enabled: heap_size_profiling_enabled,
57
54
  heap_sample_every: heap_sample_every,
58
- timeline_enabled: timeline_enabled,
59
55
  heap_clean_after_gc_enabled: settings.profiling.advanced.heap_clean_after_gc_enabled,
60
56
  )
61
- thread_context_collector = build_thread_context_collector(settings, recorder, optional_tracer, timeline_enabled)
57
+ thread_context_collector = build_thread_context_collector(settings, recorder, optional_tracer)
62
58
  worker = Datadog::Profiling::Collectors::CpuAndWallTimeWorker.new(
63
59
  gc_profiling_enabled: enable_gc_profiling?(settings, logger),
64
60
  no_signals_workaround_enabled: no_signals_workaround_enabled,
@@ -68,11 +64,11 @@ module Datadog
68
64
  allocation_counting_enabled: settings.profiling.advanced.allocation_counting_enabled,
69
65
  gvl_profiling_enabled: enable_gvl_profiling?(settings, logger),
70
66
  sighandler_sampling_enabled: settings.profiling.advanced.sighandler_sampling_enabled,
67
+ cpu_sampling_interval_ms: cpu_sampling_interval_ms,
71
68
  )
72
69
 
73
70
  internal_metadata = {
74
71
  no_signals_workaround_enabled: no_signals_workaround_enabled,
75
- timeline_enabled: timeline_enabled,
76
72
  heap_sample_every: heap_sample_every,
77
73
  }.freeze
78
74
 
@@ -85,16 +81,27 @@ module Datadog
85
81
  Datadog::Profiling::Ext::DirMonkeyPatches.apply!
86
82
  end
87
83
 
84
+ if can_apply_exec_monkey_patch?(settings)
85
+ Datadog::Profiling::Ext::ExecMonkeyPatch.apply!
86
+ end
87
+
88
88
  [profiler, {profiling_enabled: true}]
89
+ rescue Exception => e # rubocop:disable Lint/RescueException
90
+ logger.warn do
91
+ "Failed to initialize profiling: #{e.class}: #{e.message} " \
92
+ "Location: #{Array(e.backtrace).first}"
93
+ end
94
+ Datadog::Core::Telemetry::Logger.report(e, description: "Failed to initialize profiling")
95
+
96
+ [nil, {profiling_enabled: false}]
89
97
  end
90
98
 
91
- private_class_method def self.build_thread_context_collector(settings, recorder, optional_tracer, timeline_enabled)
99
+ private_class_method def self.build_thread_context_collector(settings, recorder, optional_tracer)
92
100
  Datadog::Profiling::Collectors::ThreadContext.new(
93
101
  recorder: recorder,
94
102
  max_frames: settings.profiling.advanced.max_frames,
95
103
  tracer: optional_tracer,
96
104
  endpoint_collection_enabled: settings.profiling.advanced.endpoint.collection.enabled,
97
- timeline_enabled: timeline_enabled,
98
105
  waiting_for_gvl_threshold_ns: settings.profiling.advanced.waiting_for_gvl_threshold_ns,
99
106
  otel_context_enabled: settings.profiling.advanced.preview_otel_context_enabled,
100
107
  native_filenames_enabled: settings.profiling.advanced.native_filenames_enabled,
@@ -122,6 +129,7 @@ module Datadog
122
129
  site: settings.site,
123
130
  api_key: settings.api_key,
124
131
  upload_timeout_seconds: settings.profiling.upload.timeout_seconds,
132
+ use_system_dns: settings.profiling.advanced.experimental_use_system_dns,
125
133
  )
126
134
  end
127
135
 
@@ -133,19 +141,18 @@ module Datadog
133
141
  # that causes a segmentation fault during garbage collection of Ractors
134
142
  # (https://bugs.ruby-lang.org/issues/18464). We don't allow enabling gc profiling on such Rubies.
135
143
  # This bug is fixed on Ruby versions 3.1.4, 3.2.3 and 3.3.0.
136
- if RUBY_VERSION.start_with?("3.0.") ||
137
- (RUBY_VERSION.start_with?("3.1.") && RUBY_VERSION < "3.1.4") ||
138
- (RUBY_VERSION.start_with?("3.2.") && RUBY_VERSION < "3.2.3")
144
+ if RubyVersion.is?(">= 3", "< 3.1.4") ||
145
+ RubyVersion.is?(">= 3.2", "< 3.2.3")
139
146
  logger.warn(
140
147
  "Current Ruby version (#{RUBY_VERSION}) has a VM bug where enabling GC profiling would cause " \
141
148
  "crashes (https://bugs.ruby-lang.org/issues/18464). GC profiling has been disabled."
142
149
  )
143
150
  return false
144
- elsif RUBY_VERSION.start_with?("3.")
151
+ elsif RubyVersion.is?(">= 3", "< 4")
145
152
  logger.debug(
146
153
  "Using Ractors may result in GC profiling unexpectedly " \
147
154
  "stopping (https://bugs.ruby-lang.org/issues/19112). Note that this stop has no impact in your " \
148
- "application stability or performance. This does not happen if Ractors are not used."
155
+ "application stability or performance. This issue is fixed on Ruby 4."
149
156
  )
150
157
  end
151
158
 
@@ -169,7 +176,7 @@ module Datadog
169
176
  # Ruby 3.2.0 to 3.2.2 have a bug in the newobj tracepoint (https://bugs.ruby-lang.org/issues/19482,
170
177
  # https://github.com/ruby/ruby/pull/7464) that makes this crash in any configuration. This bug is
171
178
  # fixed on Ruby versions 3.2.3 and 3.3.0.
172
- if RUBY_VERSION.start_with?("3.2.") && RUBY_VERSION < "3.2.3"
179
+ if RubyVersion.is?(">= 3.2", "< 3.2.3")
173
180
  logger.warn(
174
181
  "Allocation profiling is not supported in Ruby versions 3.2.0, 3.2.1 and 3.2.2 and will be forcibly " \
175
182
  "disabled. This is due to a VM bug that can lead to crashes (https://bugs.ruby-lang.org/issues/19482). " \
@@ -183,9 +190,8 @@ module Datadog
183
190
  # that causes a segmentation fault during garbage collection of Ractors
184
191
  # (https://bugs.ruby-lang.org/issues/18464). We don't recommend using this feature on such Rubies.
185
192
  # This bug is fixed on Ruby versions 3.1.4, 3.2.3 and 3.3.0.
186
- if RUBY_VERSION.start_with?("3.0.") ||
187
- (RUBY_VERSION.start_with?("3.1.") && RUBY_VERSION < "3.1.4") ||
188
- (RUBY_VERSION.start_with?("3.2.") && RUBY_VERSION < "3.2.3")
193
+ if RubyVersion.is?(">= 3", "< 3.1.4") ||
194
+ RubyVersion.is?(">= 3.2", "< 3.2.3")
189
195
  logger.warn(
190
196
  "Current Ruby version (#{RUBY_VERSION}) has a VM bug where enabling allocation profiling while using " \
191
197
  "Ractors may cause unexpected issues, including crashes (https://bugs.ruby-lang.org/issues/18464). " \
@@ -194,14 +200,12 @@ module Datadog
194
200
  # ANNOYANCE - Only with Ractors
195
201
  # On all known versions of Ruby 3.x, due to https://bugs.ruby-lang.org/issues/19112, when a ractor gets
196
202
  # garbage collected, Ruby will disable all active tracepoints, which this feature internally relies on.
197
- elsif RUBY_VERSION.start_with?("3.")
198
- ALLOCATION_WITH_RACTORS_ONLY_ONCE.run do
199
- logger.info(
200
- "Using Ractors may result in allocation profiling " \
201
- "stopping (https://bugs.ruby-lang.org/issues/19112). Note that this stop has no impact in your " \
202
- "application stability or performance. This does not happen if Ractors are not used."
203
- )
204
- end
203
+ elsif RubyVersion.is?(">= 3", "< 4")
204
+ logger.debug(
205
+ "Using Ractors may result in allocation profiling " \
206
+ "stopping (https://bugs.ruby-lang.org/issues/19112). Note that this stop has no impact in your " \
207
+ "application stability or performance. This issue is fixed on Ruby 4."
208
+ )
205
209
  end
206
210
 
207
211
  logger.debug("Enabled allocation profiling")
@@ -214,7 +218,7 @@ module Datadog
214
218
 
215
219
  return false unless heap_profiling_enabled
216
220
 
217
- if RUBY_VERSION < "3.1"
221
+ if RubyVersion.is?("< 3.1")
218
222
  logger.warn(
219
223
  "Current Ruby version (#{RUBY_VERSION}) cannot support heap profiling due to VM limitations. " \
220
224
  "Please upgrade to Ruby >= 3.1 in order to use this feature. Heap profiling has been disabled."
@@ -222,6 +226,15 @@ module Datadog
222
226
  return false
223
227
  end
224
228
 
229
+ # Heap profiling relies on `ObjectSpace._id2ref`, which was removed on Ruby 4.1
230
+ # (https://bugs.ruby-lang.org/issues/22135).
231
+ if RubyVersion.is?(">= 4.1")
232
+ logger.warn(
233
+ "Heap profiling is currently incompatible with Ruby 4.1+ and has been disabled."
234
+ )
235
+ return false
236
+ end
237
+
225
238
  unless allocation_profiling_enabled
226
239
  logger.warn(
227
240
  "Heap profiling was requested but allocation profiling is not enabled. " \
@@ -240,6 +253,14 @@ module Datadog
240
253
 
241
254
  return false unless heap_profiling_enabled && heap_size_profiling_enabled
242
255
 
256
+ if RubyVersion.is?(">= 4")
257
+ logger.info(
258
+ "Heap live size profiling is currently incompatible with Ruby 4 and has been disabled. " \
259
+ "Heap live objects is not affected and remains enabled."
260
+ )
261
+ return false
262
+ end
263
+
243
264
  true
244
265
  end
245
266
 
@@ -256,7 +277,7 @@ module Datadog
256
277
  end
257
278
 
258
279
  if setting_value == false
259
- if RUBY_VERSION.start_with?("2.5.")
280
+ if RubyVersion.is?("< 2.6")
260
281
  logger.warn(
261
282
  'The profiling "no signals" workaround has been disabled via configuration on Ruby 2.5. ' \
262
283
  "This is not recommended " \
@@ -282,7 +303,7 @@ module Datadog
282
303
  # Setting is in auto mode. Let's probe to see if we should enable it:
283
304
 
284
305
  # We don't warn users in this situation because "upgrade your Ruby" is not a great warning
285
- return true if RUBY_VERSION.start_with?("2.5.")
306
+ return true if RubyVersion.is?("< 2.6")
286
307
 
287
308
  if Gem.loaded_specs["mysql2"] && incompatible_libmysqlclient_version?(settings, logger)
288
309
  logger.warn(
@@ -365,7 +386,7 @@ module Datadog
365
386
  rescue StandardError, LoadError => e
366
387
  logger.warn(
367
388
  "Failed to probe `mysql2` gem information. " \
368
- "Cause: #{e.class.name} #{e.message} Location: #{Array(e.backtrace).first}"
389
+ "Cause: #{e.class}: #{e.message} Location: #{Array(e.backtrace).first}"
369
390
  )
370
391
 
371
392
  true
@@ -398,6 +419,22 @@ module Datadog
398
419
  end
399
420
  end
400
421
 
422
+ private_class_method def self.valid_cpu_sampling_interval(cpu_sampling_interval_ms, logger)
423
+ if cpu_sampling_interval_ms > 10
424
+ logger.warn(
425
+ "Profiling cpu_sampling_interval_ms is set to #{cpu_sampling_interval_ms}ms, but values above 10ms are " \
426
+ "not supported. Using 10ms instead. To reduce profiler overhead, consider adjusting the " \
427
+ "overhead_target_percentage setting."
428
+ )
429
+ 10
430
+ elsif cpu_sampling_interval_ms < 10
431
+ logger.debug { "Profiling cpu_sampling_interval_ms set to #{cpu_sampling_interval_ms}ms" }
432
+ cpu_sampling_interval_ms
433
+ else
434
+ cpu_sampling_interval_ms
435
+ end
436
+ end
437
+
401
438
  # To add just a bit more complexity to our detection code, in https://github.com/DataDog/dd-trace-rb/issues/3334
402
439
  # a user reported that our code was incorrectly flagging the mariadb variant of libmysqlclient as being
403
440
  # incompatible. In fact we have no reports of the mariadb variant needing the "no signals" workaround,
@@ -428,17 +465,22 @@ module Datadog
428
465
  end
429
466
 
430
467
  private_class_method def self.dir_interruption_workaround_enabled?(settings, no_signals_workaround_enabled)
431
- return false if no_signals_workaround_enabled || RUBY_VERSION >= "3.4"
468
+ return false if no_signals_workaround_enabled || RubyVersion.is?(">= 3.4")
432
469
 
433
470
  settings.profiling.advanced.dir_interruption_workaround_enabled
434
471
  end
435
472
 
436
- private_class_method def self.enable_gvl_profiling?(settings, logger)
437
- return false if RUBY_VERSION < "3.2"
473
+ private_class_method def self.can_apply_exec_monkey_patch?(settings)
474
+ return false if RubyVersion.is?("< 2.7")
438
475
 
439
- # GVL profiling only makes sense in the context of timeline. We could emit a warning here, but not sure how
440
- # useful it is -- if a customer disables timeline, there's nowhere to look for GVL profiling anyway!
441
- settings.profiling.advanced.timeline_enabled && settings.profiling.advanced.gvl_enabled
476
+ # This file is 2.7+ only so we only require it here once we've checked the Ruby version
477
+ require "datadog/profiling/ext/exec_monkey_patch"
478
+
479
+ settings.profiling.advanced.shutdown_on_exec_enabled
480
+ end
481
+
482
+ private_class_method def self.enable_gvl_profiling?(settings, logger)
483
+ RubyVersion.is?(">= 3.2") && settings.profiling.advanced.gvl_enabled
442
484
  end
443
485
  end
444
486
  end
@@ -13,24 +13,35 @@ module Datadog
13
13
  # recorders, so I've decided to make it specific until we actually need to support more recorders.
14
14
  #
15
15
  class Exporter
16
+ # @rbs @worker: Datadog::Profiling::Collectors::CpuAndWallTimeWorker
17
+
16
18
  # Profiles with duration less than this will not be reported
17
19
  PROFILE_DURATION_THRESHOLD_SECONDS = 1
18
20
 
19
21
  private
20
22
 
21
- attr_reader \
22
- :pprof_recorder,
23
- :code_provenance_collector, # The code provenance collector acts both as collector and as a recorder
24
- :minimum_duration_seconds,
25
- :time_provider,
26
- :last_flush_finish_at,
27
- :created_at,
28
- :internal_metadata,
29
- :info_json,
30
- :sequence_tracker
23
+ attr_reader :pprof_recorder #: Datadog::Profiling::StackRecorder
24
+ # The code provenance collector acts both as collector and as a recorder
25
+ attr_reader :code_provenance_collector #: Datadog::Profiling::Collectors::CodeProvenance?
26
+ attr_reader :minimum_duration_seconds #: ::Integer
27
+ attr_reader :time_provider #: singleton(::Time)
28
+ attr_reader :last_flush_finish_at #: ::Time?
29
+ attr_reader :created_at #: ::Time
30
+ attr_reader :internal_metadata #: ::Hash[::Symbol, untyped]
31
+ attr_reader :info_json #: ::String
32
+ attr_reader :sequence_tracker #: singleton(Datadog::Profiling::SequenceTracker)
31
33
 
32
34
  public
33
35
 
36
+ # @rbs pprof_recorder: Datadog::Profiling::StackRecorder
37
+ # @rbs worker: Datadog::Profiling::Collectors::CpuAndWallTimeWorker
38
+ # @rbs info_collector: Datadog::Profiling::Collectors::Info
39
+ # @rbs code_provenance_collector: Datadog::Profiling::Collectors::CodeProvenance?
40
+ # @rbs internal_metadata: ::Hash[::Symbol, untyped]
41
+ # @rbs minimum_duration_seconds: ::Integer
42
+ # @rbs time_provider: singleton(::Time)
43
+ # @rbs sequence_tracker: singleton(Datadog::Profiling::SequenceTracker)
44
+ # @rbs return: void
34
45
  def initialize(
35
46
  pprof_recorder:,
36
47
  worker:,
@@ -55,6 +66,7 @@ module Datadog
55
66
  @sequence_tracker = sequence_tracker
56
67
  end
57
68
 
69
+ #: () -> Datadog::Profiling::Flush?
58
70
  def flush
59
71
  worker_stats = @worker.stats_and_reset_not_thread_safe
60
72
  serialization_result = pprof_recorder.serialize
@@ -68,18 +80,32 @@ module Datadog
68
80
  return
69
81
  end
70
82
 
71
- uncompressed_code_provenance = code_provenance_collector.refresh.generate_json if code_provenance_collector
83
+ uncompressed_code_provenance =
84
+ if (collector = code_provenance_collector)
85
+ collector.refresh.generate_json
86
+ end
87
+
88
+ metrics = [] #: Array[[::String, ::Numeric]]
89
+
90
+ # The key is always there, but the value might be nil if GVL profiling is disabled.
91
+ # We delete it to avoid reporting the same data point twice.
92
+ gvl_waiting_time_ns_total = worker_stats.delete(:gvl_waiting_time_ns_total)
93
+ metrics << ["ruby_global_lock_wait_time_total", gvl_waiting_time_ns_total] if gvl_waiting_time_ns_total
94
+
95
+ process_tags = Datadog.configuration.experimental_propagate_process_tags_enabled ?
96
+ Core::Environment::Process.serialized : ''
72
97
 
73
98
  Flush.new(
74
99
  start: start,
75
100
  finish: finish,
76
101
  encoded_profile: encoded_profile,
77
- code_provenance_file_name: Datadog::Profiling::Ext::Transport::HTTP::CODE_PROVENANCE_FILENAME,
78
102
  code_provenance_data: uncompressed_code_provenance,
103
+ metrics: metrics,
79
104
  tags_as_array: Datadog::Profiling::TagBuilder.call(
80
105
  settings: Datadog.configuration,
81
106
  profile_seq: sequence_tracker.get_next,
82
107
  ).to_a,
108
+ process_tags: process_tags,
83
109
  internal_metadata: internal_metadata.merge(
84
110
  {
85
111
  worker_stats: worker_stats,
@@ -92,10 +118,12 @@ module Datadog
92
118
  )
93
119
  end
94
120
 
121
+ #: () -> bool
95
122
  def can_flush?
96
123
  !duration_below_threshold?(last_flush_finish_at || created_at, time_provider.now.utc)
97
124
  end
98
125
 
126
+ #: () -> void
99
127
  def reset_after_fork
100
128
  @last_flush_finish_at = time_provider.now.utc
101
129
  nil
@@ -103,6 +131,7 @@ module Datadog
103
131
 
104
132
  private
105
133
 
134
+ #: (::Time, ::Time) -> bool
106
135
  def duration_below_threshold?(start, finish)
107
136
  (finish - start) < minimum_duration_seconds
108
137
  end
@@ -4,9 +4,10 @@ module Datadog
4
4
  module Profiling
5
5
  # Monkey patches needed for profiler features and compatibility
6
6
  module Ext
7
- # All Ruby versions as of this writing have bugs in the dir class implementation, causing issues such as
7
+ # Ruby versions before 3.4 have bugs in the `Dir` class implementation, causing issues such as
8
8
  # https://github.com/DataDog/dd-trace-rb/issues/3450 .
9
- # See also https://bugs.ruby-lang.org/issues/20586 for more details.
9
+ # This was fixed upstream in https://bugs.ruby-lang.org/issues/20586 but we use this monkey patch to work around
10
+ # the issue on legacy versions (it gets applied by `Datadog::Profiling::Component`).
10
11
  #
11
12
  # This monkey patch for the Ruby `Dir` class works around these bugs for affected Ruby versions by temporarily
12
13
  # blocking the profiler from interrupting system calls.
@@ -27,9 +28,13 @@ module Datadog
27
28
  end
28
29
  end
29
30
 
30
- if RUBY_VERSION.start_with?("2.")
31
+ if RubyVersion.is?("< 3")
31
32
  # Monkey patches for Dir.singleton_class (Ruby 2 version). See DirMonkeyPatches above for more details.
32
33
  module DirClassMonkeyPatches
34
+ # Steep: Workaround that defines args and block only for Ruby 2.x.
35
+ # @type var args: ::Array[any]
36
+ # @type var block: ^(?) -> any | nil
37
+
33
38
  def [](*args, &block)
34
39
  Datadog::Profiling::Collectors::CpuAndWallTimeWorker._native_hold_signals
35
40
  super
@@ -148,6 +153,11 @@ module Datadog
148
153
  else
149
154
  # Monkey patches for Dir.singleton_class (Ruby 3 version). See DirMonkeyPatches above for more details.
150
155
  module DirClassMonkeyPatches
156
+ # Steep: Workaround that defines args, kwargs and block only for Ruby 3.x.
157
+ # @type var args: ::Array[any]
158
+ # @type var kwargs: ::Hash[::Symbol, any]
159
+ # @type var block: ^(?) -> any | nil
160
+
151
161
  def [](*args, **kwargs, &block)
152
162
  Datadog::Profiling::Collectors::CpuAndWallTimeWorker._native_hold_signals
153
163
  super
@@ -260,9 +270,13 @@ module Datadog
260
270
  end
261
271
  end
262
272
 
263
- if RUBY_VERSION.start_with?("2.")
273
+ if RubyVersion.is?("< 3")
264
274
  # Monkey patches for Dir (Ruby 2 version). See DirMonkeyPatches above for more details.
265
275
  module DirInstanceMonkeyPatches
276
+ # Steep: Workaround that defines args and block only for Ruby 2.x.
277
+ # @type var args: ::Array[any]
278
+ # @type var block: ^(?) -> any | nil
279
+
266
280
  # See note on methods that yield above.
267
281
  def each(*args, &block)
268
282
  if block
@@ -286,7 +300,7 @@ module Datadog
286
300
  end
287
301
  end
288
302
 
289
- unless RUBY_VERSION.start_with?("2.5.") # This is Ruby 2.6+
303
+ if RubyVersion.is?(">= 2.6.0") # This method is Ruby 2.6+
290
304
  # See note on methods that yield above.
291
305
  def each_child(*args, &block)
292
306
  if block
@@ -336,6 +350,11 @@ module Datadog
336
350
  else
337
351
  # Monkey patches for Dir (Ruby 3 version). See DirMonkeyPatches above for more details.
338
352
  module DirInstanceMonkeyPatches
353
+ # Steep: Workaround that defines args, kwargs and block only for Ruby 3.x.
354
+ # @type var args: ::Array[any]
355
+ # @type var kwargs: ::Hash[::Symbol, any]
356
+ # @type var block: ^(?) -> any | nil
357
+
339
358
  # See note on methods that yield above.
340
359
  def each(*args, **kwargs, &block)
341
360
  if block
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Datadog
4
+ module Profiling
5
+ module Ext
6
+ # The profiler gathers data by sending `SIGPROF` unix signals to Ruby application threads.
7
+ #
8
+ # When using `Kernel#exec` on Linux, it can happen that a signal sent before calling `exec` arrives after
9
+ # the new process is running, causing it to fail with the `Profiling timer expired` error message.
10
+ # To avoid this, the profiler installs a monkey patch on `Kernel#exec` to stop profiling before actually
11
+ # calling `exec`.
12
+ # This monkey patch is available for Ruby 2.7+; let us know if you need it on earlier Rubies.
13
+ # For more details see https://github.com/DataDog/dd-trace-rb/issues/5101 .
14
+ module ExecMonkeyPatch
15
+ def self.apply!
16
+ ::Object.prepend(ObjectMonkeyPatch)
17
+
18
+ true
19
+ end
20
+
21
+ module ObjectMonkeyPatch
22
+ private
23
+
24
+ def exec(...)
25
+ Datadog.send(:components, allow_initialization: false)&.profiler&.shutdown!(report_last_profile: false)
26
+ super
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -13,8 +13,6 @@ module Datadog
13
13
  module Transport
14
14
  module HTTP
15
15
  FORM_FIELD_TAG_PROFILER_VERSION = "profiler_version"
16
-
17
- CODE_PROVENANCE_FILENAME = "code-provenance.json"
18
16
  end
19
17
  end
20
18
  end
@@ -6,32 +6,44 @@ module Datadog
6
6
  module Profiling
7
7
  # Entity class used to represent metadata for a given profile
8
8
  class Flush
9
- attr_reader \
10
- :start,
11
- :finish,
12
- :encoded_profile,
13
- :code_provenance_file_name,
14
- :code_provenance_data,
15
- :tags_as_array,
16
- :internal_metadata_json,
17
- :info_json
9
+ attr_reader :start #: ::Time
10
+ attr_reader :finish #: ::Time
11
+ attr_reader :encoded_profile #: Datadog::Profiling::EncodedProfile
12
+ attr_reader :code_provenance_data #: ::String?
13
+ attr_reader :metrics #: ::String
14
+ attr_reader :tags_as_array #: Array[[::String, ::String]]
15
+ attr_reader :process_tags #: ::String
16
+ attr_reader :internal_metadata_json #: ::String
17
+ attr_reader :info_json #: ::String
18
18
 
19
+ # @rbs start: ::Time
20
+ # @rbs finish: ::Time
21
+ # @rbs encoded_profile: Datadog::Profiling::EncodedProfile
22
+ # @rbs code_provenance_data: ::String?
23
+ # @rbs metrics: Array[[::String, ::Numeric]]
24
+ # @rbs tags_as_array: Array[[::String, ::String]]
25
+ # @rbs process_tags: ::String
26
+ # @rbs internal_metadata: ::Hash[::Symbol, ::String | bool | ::Numeric]
27
+ # @rbs info_json: ::String
28
+ # @rbs return: void
19
29
  def initialize(
20
30
  start:,
21
31
  finish:,
22
32
  encoded_profile:,
23
- code_provenance_file_name:,
24
33
  code_provenance_data:,
34
+ metrics:,
25
35
  tags_as_array:,
36
+ process_tags:,
26
37
  internal_metadata:,
27
38
  info_json:
28
39
  )
29
40
  @start = start
30
41
  @finish = finish
31
42
  @encoded_profile = encoded_profile
32
- @code_provenance_file_name = code_provenance_file_name
33
43
  @code_provenance_data = code_provenance_data
44
+ @metrics = JSON.generate(metrics)
34
45
  @tags_as_array = tags_as_array
46
+ @process_tags = process_tags
35
47
  @internal_metadata_json = JSON.generate(internal_metadata)
36
48
  @info_json = info_json
37
49
  end
@@ -8,16 +8,27 @@ module Datadog
8
8
  # Used to report profiling data to Datadog.
9
9
  # Methods prefixed with _native_ are implemented in `http_transport.c`
10
10
  class HttpTransport
11
- attr_reader :exporter_configuration
11
+ # @rbs @exporter_configuration: exporter_configuration_array
12
12
 
13
- def initialize(agent_settings:, site:, api_key:, upload_timeout_seconds:)
14
- @upload_timeout_milliseconds = (upload_timeout_seconds * 1_000).to_i
13
+ attr_reader :exporter_configuration #: exporter_configuration_array
15
14
 
16
- @exporter_configuration =
15
+ # @rbs agent_settings: Datadog::Core::Configuration::AgentSettings
16
+ # @rbs site: ::String?
17
+ # @rbs api_key: ::String?
18
+ # @rbs upload_timeout_seconds: ::Integer
19
+ # @rbs use_system_dns: bool
20
+ # @rbs return: void
21
+ def initialize(agent_settings:, site:, api_key:, upload_timeout_seconds:, use_system_dns:)
22
+ timeout_milliseconds = (upload_timeout_seconds * 1_000).to_i
23
+
24
+ # Steep: multiple issues here
25
+ # first https://github.com/soutaro/steep/issues/363
26
+ # then https://github.com/soutaro/steep/issues/1603 (remove the .freeze to see it)
27
+ @exporter_configuration = # steep:ignore IncompatibleAssignment
17
28
  if agentless?(site, api_key)
18
- [:agentless, site, api_key].freeze
29
+ [:agentless, timeout_milliseconds, use_system_dns, site, api_key].freeze
19
30
  else
20
- [:agent, agent_settings.url].freeze
31
+ [:agent, timeout_milliseconds, use_system_dns, agent_settings.url].freeze
21
32
  end
22
33
 
23
34
  status, result = self.class._native_validate_exporter(exporter_configuration)
@@ -25,10 +36,10 @@ module Datadog
25
36
  raise(ArgumentError, "Failed to initialize transport: #{result}") if status == :error
26
37
  end
27
38
 
39
+ #: (Datadog::Profiling::Flush) -> bool
28
40
  def export(flush)
29
41
  status, result = self.class._native_do_export(
30
42
  exporter_configuration,
31
- @upload_timeout_milliseconds,
32
43
  flush
33
44
  )
34
45
 
@@ -55,12 +66,14 @@ module Datadog
55
66
 
56
67
  private
57
68
 
69
+ #: (::String?, ::String?) -> bool?
58
70
  def agentless?(site, api_key)
59
71
  site && api_key && %w[1 true].include?(ENV[Profiling::Ext::ENV_AGENTLESS] || '') # rubocop:disable CustomCops/EnvUsageCop
60
72
  end
61
73
 
74
+ #: () -> ::String
62
75
  def config_without_api_key
63
- "#{exporter_configuration[0]}: #{exporter_configuration[1]}"
76
+ "#{exporter_configuration[0]}: #{exporter_configuration[3]}"
64
77
  end
65
78
  end
66
79
  end
@@ -4,6 +4,6 @@ begin
4
4
  require "datadog_profiling_native_extension.#{RUBY_VERSION}_#{RUBY_PLATFORM}"
5
5
  rescue LoadError => e
6
6
  raise LoadError,
7
- "Failed to load the profiling loader extension. To fix this, please remove and then reinstall datadog " \
8
- "(Details: #{e.message})"
7
+ "Failed to load the profiling native extension. To fix this, please remove and then reinstall datadog " \
8
+ "(Details: #{e.class}: #{e.message})"
9
9
  end