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
@@ -0,0 +1,511 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'zlib'
4
+ require_relative 'pathway_context'
5
+ require_relative 'transport/http'
6
+ require_relative '../version'
7
+ require_relative '../core/worker'
8
+ require_relative '../core/workers/polling'
9
+ require_relative '../core/ddsketch'
10
+ require_relative '../core/buffer/cruby'
11
+ require_relative '../core/utils/time'
12
+ require_relative '../core/utils/fnv'
13
+
14
+ module Datadog
15
+ module DataStreams
16
+ # Raised when Data Streams Monitoring cannot be initialized due to missing dependencies
17
+ class UnsupportedError < StandardError; end
18
+
19
+ # Processor for Data Streams Monitoring
20
+ # This class is responsible for collecting and reporting pathway stats
21
+ # Periodically (every interval, 10 seconds by default) flushes stats to the Datadog agent.
22
+ class Processor < Core::Worker
23
+ include Core::Workers::Polling
24
+
25
+ PROPAGATION_KEY = 'dd-pathway-ctx-base64'
26
+
27
+ # Default buffer size for lock-free event queue
28
+ # Set to handle high-throughput scenarios (e.g., 10k events/sec for 10s interval)
29
+ DEFAULT_BUFFER_SIZE = 100_000
30
+
31
+ attr_reader :pathway_context, :buckets, :bucket_size_ns
32
+
33
+ # Initialize the Data Streams Monitoring processor
34
+ #
35
+ # @param interval [Float] Flush interval in seconds (e.g., 10.0 for 10 seconds)
36
+ # @param logger [Datadog::Core::Logger] Logger instance for debugging
37
+ # @param settings [Datadog::Core::Configuration::Settings] Global configuration settings
38
+ # @param agent_settings [Datadog::Core::Configuration::AgentSettings] Agent connection settings
39
+ # @param agent_info [Datadog::Core::Environment::AgentInfo] Agent capability information
40
+ # @param buffer_size [Integer] Size of the lock-free event buffer for async stat collection
41
+ # (default: DEFAULT_BUFFER_SIZE). Higher values support more throughput but use more memory.
42
+ # @raise [UnsupportedError] if DDSketch is not available on this platform
43
+ def initialize(interval:, logger:, settings:, agent_settings:, agent_info:, buffer_size: DEFAULT_BUFFER_SIZE)
44
+ raise UnsupportedError, 'DDSketch is not supported' unless Datadog::Core::DDSketch.supported?
45
+
46
+ @settings = settings
47
+ @agent_settings = agent_settings
48
+ @agent_info = agent_info
49
+ @logger = logger
50
+
51
+ now = Core::Utils::Time.now
52
+ @pathway_context = PathwayContext.new(
53
+ hash_value: 0,
54
+ pathway_start: now,
55
+ current_edge_start: now
56
+ )
57
+ @bucket_size_ns = (interval * 1e9).to_i
58
+ @buckets = {}
59
+ @consumer_stats = []
60
+ @stats_mutex = Mutex.new
61
+ @event_buffer = Core::Buffer::CRuby.new(buffer_size)
62
+
63
+ super()
64
+ self.loop_base_interval = interval
65
+
66
+ perform
67
+ end
68
+
69
+ # Track Kafka produce offset for lag monitoring
70
+ # @param topic [String] The Kafka topic name
71
+ # @param partition [Integer] The partition number
72
+ # @param offset [Integer] The offset of the produced message
73
+ # @param now [Time] Timestamp
74
+ # @return [Boolean] true if tracking succeeded
75
+ def track_kafka_produce(topic, partition, offset, now)
76
+ @event_buffer.push(
77
+ {
78
+ type: :kafka_produce,
79
+ topic: topic,
80
+ partition: partition,
81
+ offset: offset,
82
+ timestamp_ns: (now.to_f * 1e9).to_i
83
+ }
84
+ )
85
+ true
86
+ end
87
+
88
+ # Track Kafka message consumption for consumer lag monitoring
89
+ # @param topic [String] The Kafka topic name
90
+ # @param partition [Integer] The partition number
91
+ # @param offset [Integer] The offset of the consumed message
92
+ # @param now [Time] Timestamp
93
+ # @return [Boolean] true if tracking succeeded
94
+ def track_kafka_consume(topic, partition, offset, now)
95
+ @event_buffer.push(
96
+ {
97
+ type: :kafka_consume,
98
+ topic: topic,
99
+ partition: partition,
100
+ offset: offset,
101
+ timestamp: now
102
+ }
103
+ )
104
+ true
105
+ end
106
+
107
+ # Set a produce checkpoint
108
+ # @param type [String] The type of the checkpoint (e.g., 'kafka', 'kinesis', 'sns')
109
+ # @param destination [String] The destination (e.g., topic, exchange, stream name)
110
+ # @param manual_checkpoint [Boolean] Whether this checkpoint was manually set (default: true)
111
+ # @param tags [Hash] Additional tags to include
112
+ # @yield [key, value] Block to inject context into carrier
113
+ # @return [String] Base64 encoded pathway context
114
+ def set_produce_checkpoint(type:, destination:, manual_checkpoint: true, tags: {}, &block)
115
+ checkpoint_tags = ["type:#{type}", "topic:#{destination}", 'direction:out']
116
+ checkpoint_tags << 'manual_checkpoint:true' if manual_checkpoint
117
+ checkpoint_tags.concat(tags.map { |k, v| "#{k}:#{v}" }) unless tags.empty?
118
+
119
+ span = Datadog::Tracing.active_span
120
+ pathway = set_checkpoint(tags: checkpoint_tags, span: span)
121
+
122
+ yield(PROPAGATION_KEY, pathway) if pathway && block
123
+
124
+ pathway
125
+ end
126
+
127
+ # Set a consume checkpoint
128
+ # @param type [String] The type of the checkpoint (e.g., 'kafka', 'kinesis', 'sns')
129
+ # @param source [String] The source (e.g., topic, exchange, stream name)
130
+ # @param manual_checkpoint [Boolean] Whether this checkpoint was manually set (default: true)
131
+ # @param tags [Hash] Additional tags to include
132
+ # @yield [key] Block to extract context from carrier
133
+ # @return [String] Base64 encoded pathway context
134
+ def set_consume_checkpoint(type:, source:, manual_checkpoint: true, tags: {}, &block)
135
+ if block
136
+ pathway_ctx = yield(PROPAGATION_KEY)
137
+ if pathway_ctx
138
+ decoded_ctx = decode_pathway_b64(pathway_ctx)
139
+ set_pathway_context(decoded_ctx)
140
+ end
141
+ end
142
+
143
+ checkpoint_tags = ["type:#{type}", "topic:#{source}", 'direction:in']
144
+ checkpoint_tags << 'manual_checkpoint:true' if manual_checkpoint
145
+ checkpoint_tags.concat(tags.map { |k, v| "#{k}:#{v}" }) unless tags.empty?
146
+
147
+ span = Datadog::Tracing.active_span
148
+ set_checkpoint(tags: checkpoint_tags, span: span)
149
+ end
150
+
151
+ # Called periodically by the worker to flush stats to the agent
152
+ def perform
153
+ process_events
154
+ flush_stats
155
+ true
156
+ end
157
+
158
+ private
159
+
160
+ # Drain event buffer and apply updates to shared data structures
161
+ # This runs in the background worker thread, not the critical path
162
+ def process_events
163
+ events = @event_buffer.pop
164
+ return if events.empty?
165
+
166
+ @stats_mutex.synchronize do
167
+ events.each do |event_obj|
168
+ # Buffer stores Objects; we know they're hashes with symbol keys
169
+ event = event_obj # : ::Hash[::Symbol, untyped]
170
+ case event[:type]
171
+ when :kafka_produce
172
+ process_kafka_produce_event(event)
173
+ when :kafka_consume
174
+ process_kafka_consume_event(event)
175
+ when :checkpoint
176
+ process_checkpoint_event(event)
177
+ end
178
+ end
179
+ end
180
+ end
181
+
182
+ def process_kafka_produce_event(event)
183
+ partition_key = "#{event[:topic]}:#{event[:partition]}"
184
+ bucket_time_ns = event[:timestamp_ns] - (event[:timestamp_ns] % @bucket_size_ns)
185
+ bucket = @buckets[bucket_time_ns] ||= create_bucket
186
+
187
+ bucket[:latest_produce_offsets][partition_key] = [
188
+ event[:offset],
189
+ bucket[:latest_produce_offsets][partition_key] || 0
190
+ ].max
191
+ end
192
+
193
+ def process_kafka_consume_event(event)
194
+ @consumer_stats << {
195
+ topic: event[:topic],
196
+ partition: event[:partition],
197
+ offset: event[:offset],
198
+ timestamp: event[:timestamp],
199
+ timestamp_sec: event[:timestamp].to_f
200
+ }
201
+
202
+ timestamp_ns = (event[:timestamp].to_f * 1e9).to_i
203
+ bucket_time_ns = timestamp_ns - (timestamp_ns % @bucket_size_ns)
204
+ @buckets[bucket_time_ns] ||= create_bucket
205
+
206
+ # Track offset gaps for lag detection
207
+ partition_key = "#{event[:topic]}:#{event[:partition]}"
208
+ @latest_consumer_offsets ||= {}
209
+ previous_offset = @latest_consumer_offsets[partition_key] || 0
210
+
211
+ if event[:offset] > previous_offset + 1
212
+ @consumer_lag_events ||= []
213
+ @consumer_lag_events << {
214
+ topic: event[:topic],
215
+ partition: event[:partition],
216
+ expected_offset: previous_offset + 1,
217
+ actual_offset: event[:offset],
218
+ gap_size: event[:offset] - previous_offset - 1,
219
+ timestamp_sec: event[:timestamp].to_f
220
+ }
221
+ end
222
+
223
+ @latest_consumer_offsets[partition_key] = [event[:offset], previous_offset].max
224
+ end
225
+
226
+ def process_checkpoint_event(event)
227
+ now_ns = (event[:timestamp_sec] * 1e9).to_i
228
+ bucket_time_ns = now_ns - (now_ns % @bucket_size_ns)
229
+ bucket = @buckets[bucket_time_ns] ||= create_bucket
230
+
231
+ aggr_key = [event[:tags].join(','), event[:hash], event[:parent_hash]]
232
+ stats = bucket[:pathway_stats][aggr_key] ||= create_pathway_stats
233
+
234
+ stats[:edge_latency].add(event[:edge_latency_sec])
235
+ stats[:full_pathway_latency].add(event[:full_pathway_latency_sec])
236
+ end
237
+
238
+ def encode_pathway_context
239
+ @pathway_context.encode_b64
240
+ end
241
+
242
+ def set_checkpoint(tags:, now: nil, payload_size: 0, span: nil)
243
+ now ||= Core::Utils::Time.now
244
+
245
+ current_context = get_current_context
246
+ tags = tags.sort
247
+
248
+ direction = nil # : ::String?
249
+ tags.each do |tag|
250
+ if tag.start_with?('direction:')
251
+ direction = tag
252
+ break
253
+ end
254
+ end
255
+
256
+ # Loop detection: consecutive same-direction checkpoints reuse the opposite direction's hash
257
+ if direction && direction == current_context.previous_direction
258
+ current_context.hash = current_context.closest_opposite_direction_hash
259
+ if current_context.hash == 0
260
+ current_context.current_edge_start = now
261
+ current_context.pathway_start = now
262
+ else
263
+ current_context.current_edge_start = current_context.closest_opposite_direction_edge_start
264
+ end
265
+ else
266
+ current_context.previous_direction = direction
267
+ current_context.closest_opposite_direction_hash = current_context.hash
268
+ current_context.closest_opposite_direction_edge_start = current_context.current_edge_start
269
+ end
270
+
271
+ parent_hash = current_context.hash
272
+ new_hash = compute_pathway_hash(parent_hash, tags)
273
+
274
+ # Tag the APM span with the pathway hash to link DSM and APM
275
+ span&.set_tag('pathway.hash', new_hash.to_s)
276
+
277
+ edge_latency_sec = [now - current_context.current_edge_start, 0.0].max
278
+ full_pathway_latency_sec = [now - current_context.pathway_start, 0.0].max
279
+
280
+ record_checkpoint_stats(
281
+ hash: new_hash,
282
+ parent_hash: parent_hash,
283
+ edge_latency_sec: edge_latency_sec,
284
+ full_pathway_latency_sec: full_pathway_latency_sec,
285
+ payload_size: payload_size,
286
+ tags: tags,
287
+ timestamp_sec: now.to_f
288
+ )
289
+
290
+ current_context.parent_hash = current_context.hash
291
+ current_context.hash = new_hash
292
+ current_context.current_edge_start = now
293
+
294
+ current_context.encode_b64
295
+ end
296
+
297
+ def decode_pathway_context(encoded_ctx)
298
+ PathwayContext.decode_b64(encoded_ctx)
299
+ end
300
+
301
+ def decode_pathway_b64(encoded_ctx)
302
+ PathwayContext.decode_b64(encoded_ctx)
303
+ end
304
+
305
+ def flush_stats
306
+ stats_buckets = @stats_mutex.synchronize do
307
+ return if @buckets.empty? && @consumer_stats.empty?
308
+
309
+ serialized_buckets = serialize_buckets
310
+
311
+ # Clear consumer stats even if sending fails to prevent unbounded memory growth.
312
+ # Must be done inside mutex before we release it.
313
+ @consumer_stats.clear
314
+
315
+ serialized_buckets
316
+ end
317
+
318
+ payload = {
319
+ 'Env' => @settings.env || 'none',
320
+ 'Service' => @settings.service,
321
+ 'TracerVersion' => Datadog::VERSION::STRING,
322
+ 'Lang' => 'ruby',
323
+ 'Stats' => stats_buckets,
324
+ 'Hostname' => hostname
325
+ } # : ::Hash[::String, (::String | ::Array[::String])]
326
+
327
+ payload['ProcessTags'] = Core::Environment::Process.tags if @settings.experimental_propagate_process_tags_enabled
328
+
329
+ # Send to agent outside mutex to avoid blocking customer code if agent is slow/hung.
330
+ send_stats_to_agent(payload)
331
+ rescue => e
332
+ @logger.debug("Failed to flush DSM stats to agent: #{e.class}: #{e.message}")
333
+ end
334
+
335
+ def get_current_pathway
336
+ get_current_context
337
+ end
338
+
339
+ def get_current_context
340
+ @pathway_context ||= begin
341
+ now = Core::Utils::Time.now
342
+ PathwayContext.new(
343
+ hash_value: 0,
344
+ pathway_start: now,
345
+ current_edge_start: now
346
+ )
347
+ end
348
+ end
349
+
350
+ def set_pathway_context(ctx)
351
+ if ctx
352
+ @pathway_context = ctx
353
+ @pathway_context.previous_direction = nil
354
+ @pathway_context.closest_opposite_direction_hash = 0
355
+ @pathway_context.closest_opposite_direction_edge_start = @pathway_context.current_edge_start
356
+ end
357
+ end
358
+
359
+ def decode_and_set_pathway_context(headers)
360
+ return unless headers && headers['dd-pathway-ctx-base64']
361
+
362
+ pathway_ctx = decode_pathway_context(headers['dd-pathway-ctx-base64'])
363
+ set_pathway_context(pathway_ctx) if pathway_ctx
364
+ end
365
+
366
+ # Compute new pathway hash using FNV-1a algorithm.
367
+ # Combines service, env, tags, and parent hash to create unique pathway identifier.
368
+ #
369
+ # The hash only needs to be internally consistent:
370
+ # @see Datadog::Core::Environment::AgentInfo#container_tags_checksum
371
+ def compute_pathway_hash(current_hash, tags)
372
+ service = @settings.service || 'ruby-service'
373
+ env = @settings.env || 'none'
374
+
375
+ bytes = service.bytes + env.bytes
376
+
377
+ if @settings.experimental_propagate_process_tags_enabled
378
+ propagation_checksum = @agent_info.propagation_checksum
379
+ bytes += [propagation_checksum].pack('Q<').bytes if propagation_checksum
380
+ end
381
+
382
+ tags.each { |tag| bytes += tag.bytes }
383
+ byte_string = bytes.pack('C*')
384
+
385
+ node_hash = Core::Utils::FNV.fnv1_64(byte_string)
386
+ combined_bytes = [node_hash, current_hash].pack('QQ')
387
+ Core::Utils::FNV.fnv1_64(combined_bytes)
388
+ end
389
+
390
+ def record_checkpoint_stats(
391
+ hash:, parent_hash:, edge_latency_sec:, full_pathway_latency_sec:, payload_size:, tags:,
392
+ timestamp_sec:
393
+ )
394
+ @event_buffer.push(
395
+ {
396
+ type: :checkpoint,
397
+ hash: hash,
398
+ parent_hash: parent_hash,
399
+ edge_latency_sec: edge_latency_sec,
400
+ full_pathway_latency_sec: full_pathway_latency_sec,
401
+ payload_size: payload_size,
402
+ tags: tags,
403
+ timestamp_sec: timestamp_sec
404
+ }
405
+ )
406
+ true
407
+ end
408
+
409
+ def record_consumer_stats(topic:, partition:, offset:, timestamp:)
410
+ # Already handled by track_kafka_consume pushing to buffer
411
+ # This method kept for API compatibility but does nothing
412
+ end
413
+
414
+ def send_stats_to_agent(payload)
415
+ response = transport.send_stats(payload)
416
+ @logger.debug("DSM stats sent to agent: ok=#{response.ok?}")
417
+ end
418
+
419
+ def transport
420
+ @transport ||= Transport::HTTP.default(
421
+ agent_settings: @agent_settings,
422
+ logger: @logger
423
+ )
424
+ end
425
+
426
+ def serialize_buckets
427
+ serialized_buckets = []
428
+ bucket_keys_to_clear = []
429
+
430
+ @buckets.each do |bucket_time_ns, bucket|
431
+ bucket_keys_to_clear << bucket_time_ns
432
+
433
+ bucket_stats = []
434
+ bucket[:pathway_stats].each do |aggr_key, stats|
435
+ edge_tags_str, hash_value, parent_hash = aggr_key
436
+ edge_tags_array = edge_tags_str.split(',')
437
+
438
+ bucket_stats << {
439
+ 'EdgeTags' => edge_tags_array,
440
+ 'Hash' => hash_value,
441
+ 'ParentHash' => parent_hash,
442
+ 'PathwayLatency' => stats[:full_pathway_latency].encode,
443
+ 'EdgeLatency' => stats[:edge_latency].encode,
444
+ }
445
+ end
446
+
447
+ backlogs = []
448
+ bucket[:latest_produce_offsets].each do |key, offset|
449
+ topic, partition = key.split(':', 2)
450
+ backlogs << {
451
+ 'Tags' => ['type:kafka_produce', "topic:#{topic}", "partition:#{partition}"],
452
+ 'Value' => offset
453
+ }
454
+ end
455
+ bucket[:latest_commit_offsets].each do |key, offset|
456
+ group, topic, partition = key.split(':', 3)
457
+ backlogs << {
458
+ 'Tags' => ['type:kafka_commit', "consumer_group:#{group}", "topic:#{topic}", "partition:#{partition}"],
459
+ 'Value' => offset
460
+ }
461
+ end
462
+
463
+ serialized_buckets << {
464
+ 'Start' => bucket_time_ns,
465
+ 'Duration' => @bucket_size_ns,
466
+ 'Stats' => bucket_stats,
467
+ 'Backlogs' => backlogs + serialize_consumer_backlogs
468
+ }
469
+ end
470
+
471
+ bucket_keys_to_clear.each { |key| @buckets.delete(key) }
472
+
473
+ serialized_buckets
474
+ end
475
+
476
+ def serialize_consumer_backlogs
477
+ @consumer_stats.map do |stat|
478
+ {
479
+ 'Tags' => [
480
+ 'type:kafka_commit',
481
+ "topic:#{stat[:topic]}",
482
+ "partition:#{stat[:partition]}"
483
+ ],
484
+ 'Value' => stat[:offset]
485
+ }
486
+ end
487
+ end
488
+
489
+ def hostname
490
+ Core::Environment::Socket.hostname
491
+ end
492
+
493
+ def create_bucket
494
+ {
495
+ pathway_stats: {},
496
+ latest_produce_offsets: {},
497
+ latest_commit_offsets: {}
498
+ }
499
+ end
500
+
501
+ def create_pathway_stats
502
+ {
503
+ edge_latency: Datadog::Core::DDSketch.new,
504
+ full_pathway_latency: Datadog::Core::DDSketch.new,
505
+ payload_size_sum: 0,
506
+ payload_size_count: 0
507
+ }
508
+ end
509
+ end
510
+ end
511
+ end
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../stats'
4
+ require_relative '../../../core/transport/http/api/endpoint'
5
+ require_relative '../../../core/transport/http/response'
6
+
7
+ module Datadog
8
+ module DataStreams
9
+ module Transport
10
+ module HTTP
11
+ # HTTP transport behavior for Data Streams stats
12
+ module Stats
13
+ # Response from HTTP transport for DSM stats
14
+ class Response
15
+ include Datadog::Core::Transport::HTTP::Response
16
+
17
+ def initialize(http_response)
18
+ super
19
+ end
20
+ end
21
+
22
+ module API
23
+ # Endpoint for submitting DSM stats data
24
+ class Endpoint < Core::Transport::HTTP::API::Endpoint
25
+ def initialize(path)
26
+ super(:post, path)
27
+ end
28
+
29
+ def call(env, &block)
30
+ # Build request
31
+ env.verb = verb
32
+ env.path = path
33
+ env.body = env.request.parcel.data
34
+ if (content_type = env.request.parcel.content_type)
35
+ env.headers['content-type'] = content_type
36
+ end
37
+ if (content_encoding = env.request.parcel.content_encoding)
38
+ env.headers['content-encoding'] = content_encoding
39
+ end
40
+
41
+ # Send request
42
+ http_response = yield(env)
43
+
44
+ # Build response
45
+ Response.new(http_response)
46
+ end
47
+
48
+ def encoder
49
+ # DSM handles encoding in the transport layer
50
+ nil
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../core/transport/http'
4
+ require_relative 'http/stats'
5
+ require_relative 'stats'
6
+
7
+ module Datadog
8
+ module DataStreams
9
+ module Transport
10
+ # HTTP transport for Data Streams Monitoring
11
+ module HTTP
12
+ V01 = Stats::API::Endpoint.new(
13
+ '/v0.1/pipeline_stats'
14
+ )
15
+
16
+ module_function
17
+
18
+ # Builds a new Transport::HTTP::Client with default settings
19
+ def default(
20
+ agent_settings:,
21
+ logger:
22
+ )
23
+ Core::Transport::HTTP.build(
24
+ agent_settings: agent_settings,
25
+ logger: logger,
26
+ ) do |transport|
27
+ transport.api 'v0.1', V01, default: true
28
+
29
+ # Call block to apply any customization, if provided
30
+ yield(transport) if block_given?
31
+ end.to_transport(Transport::Stats::Transport)
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'msgpack'
4
+ require 'zlib'
5
+ require_relative '../../core/transport/parcel'
6
+ require_relative '../../core/transport/request'
7
+ require_relative '../../core/transport/transport'
8
+
9
+ module Datadog
10
+ module DataStreams
11
+ module Transport
12
+ module Stats
13
+ # Request for DSM stats
14
+ class Request < Datadog::Core::Transport::Request
15
+ end
16
+
17
+ # Transport for Data Streams Monitoring stats
18
+ class Transport < Core::Transport::Transport
19
+ def send_stats(payload)
20
+ # MessagePack encode and gzip compress the payload
21
+ msgpack_data = MessagePack.pack(payload)
22
+ compressed_data = Zlib.gzip(msgpack_data)
23
+
24
+ # Create parcel and request
25
+ parcel = Core::Transport::Parcel.new(
26
+ compressed_data,
27
+ content_type: 'application/msgpack',
28
+ content_encoding: 'gzip',
29
+ )
30
+ request = Request.new(parcel)
31
+
32
+ # Send to agent
33
+ client.send_request(:stats, request)
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end