datadog 2.12.0 → 2.22.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 (570) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +348 -1
  3. data/README.md +0 -1
  4. data/ext/LIBDATADOG_DEVELOPMENT.md +60 -0
  5. data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +63 -56
  6. data/ext/datadog_profiling_native_extension/collectors_discrete_dynamic_sampler.c +1 -1
  7. data/ext/datadog_profiling_native_extension/collectors_stack.c +263 -76
  8. data/ext/datadog_profiling_native_extension/collectors_stack.h +20 -3
  9. data/ext/datadog_profiling_native_extension/collectors_thread_context.c +78 -26
  10. data/ext/datadog_profiling_native_extension/collectors_thread_context.h +1 -0
  11. data/ext/datadog_profiling_native_extension/datadog_ruby_common.c +1 -4
  12. data/ext/datadog_profiling_native_extension/datadog_ruby_common.h +10 -0
  13. data/ext/datadog_profiling_native_extension/encoded_profile.c +79 -0
  14. data/ext/datadog_profiling_native_extension/encoded_profile.h +8 -0
  15. data/ext/datadog_profiling_native_extension/extconf.rb +10 -0
  16. data/ext/datadog_profiling_native_extension/heap_recorder.c +247 -364
  17. data/ext/datadog_profiling_native_extension/heap_recorder.h +4 -6
  18. data/ext/datadog_profiling_native_extension/http_transport.c +60 -94
  19. data/ext/datadog_profiling_native_extension/libdatadog_helpers.c +22 -0
  20. data/ext/datadog_profiling_native_extension/libdatadog_helpers.h +8 -5
  21. data/ext/datadog_profiling_native_extension/private_vm_api_access.c +41 -21
  22. data/ext/datadog_profiling_native_extension/private_vm_api_access.h +6 -4
  23. data/ext/datadog_profiling_native_extension/profiling.c +2 -0
  24. data/ext/datadog_profiling_native_extension/ruby_helpers.c +1 -13
  25. data/ext/datadog_profiling_native_extension/ruby_helpers.h +3 -11
  26. data/ext/datadog_profiling_native_extension/stack_recorder.c +173 -76
  27. data/ext/libdatadog_api/crashtracker.c +11 -12
  28. data/ext/libdatadog_api/crashtracker.h +5 -0
  29. data/ext/libdatadog_api/datadog_ruby_common.c +1 -4
  30. data/ext/libdatadog_api/datadog_ruby_common.h +10 -0
  31. data/ext/libdatadog_api/ddsketch.c +106 -0
  32. data/ext/libdatadog_api/extconf.rb +5 -3
  33. data/ext/libdatadog_api/init.c +18 -0
  34. data/ext/libdatadog_api/library_config.c +172 -0
  35. data/ext/libdatadog_api/library_config.h +25 -0
  36. data/ext/libdatadog_api/process_discovery.c +118 -0
  37. data/ext/libdatadog_api/process_discovery.h +5 -0
  38. data/ext/libdatadog_extconf_helpers.rb +15 -5
  39. data/lib/datadog/appsec/actions_handler/serializable_backtrace.rb +89 -0
  40. data/lib/datadog/appsec/actions_handler.rb +24 -2
  41. data/lib/datadog/appsec/anonymizer.rb +16 -0
  42. data/lib/datadog/appsec/api_security/endpoint_collection/grape_route_serializer.rb +26 -0
  43. data/lib/datadog/appsec/api_security/endpoint_collection/rails_collector.rb +59 -0
  44. data/lib/datadog/appsec/api_security/endpoint_collection/rails_route_serializer.rb +29 -0
  45. data/lib/datadog/appsec/api_security/endpoint_collection/sinatra_route_serializer.rb +26 -0
  46. data/lib/datadog/appsec/api_security/endpoint_collection.rb +10 -0
  47. data/lib/datadog/appsec/api_security/lru_cache.rb +56 -0
  48. data/lib/datadog/appsec/api_security/route_extractor.rb +75 -0
  49. data/lib/datadog/appsec/api_security/sampler.rb +59 -0
  50. data/lib/datadog/appsec/api_security.rb +23 -0
  51. data/lib/datadog/appsec/assets/waf_rules/README.md +44 -5
  52. data/lib/datadog/appsec/assets/waf_rules/recommended.json +601 -74
  53. data/lib/datadog/appsec/assets/waf_rules/strict.json +48 -75
  54. data/lib/datadog/appsec/autoload.rb +2 -2
  55. data/lib/datadog/appsec/component.rb +46 -71
  56. data/lib/datadog/appsec/compressed_json.rb +40 -0
  57. data/lib/datadog/appsec/configuration/settings.rb +162 -30
  58. data/lib/datadog/appsec/context.rb +30 -7
  59. data/lib/datadog/appsec/contrib/active_record/instrumentation.rb +35 -18
  60. data/lib/datadog/appsec/contrib/active_record/integration.rb +2 -2
  61. data/lib/datadog/appsec/contrib/active_record/patcher.rb +62 -11
  62. data/lib/datadog/appsec/contrib/auto_instrument.rb +1 -1
  63. data/lib/datadog/appsec/contrib/devise/configuration.rb +7 -31
  64. data/lib/datadog/appsec/contrib/devise/data_extractor.rb +78 -0
  65. data/lib/datadog/appsec/contrib/devise/ext.rb +22 -0
  66. data/lib/datadog/appsec/contrib/devise/integration.rb +1 -2
  67. data/lib/datadog/appsec/contrib/devise/patcher.rb +34 -23
  68. data/lib/datadog/appsec/contrib/devise/patches/signin_tracking_patch.rb +103 -0
  69. data/lib/datadog/appsec/contrib/devise/patches/signup_tracking_patch.rb +70 -0
  70. data/lib/datadog/appsec/contrib/devise/{patcher/rememberable_patch.rb → patches/skip_signin_tracking_patch.rb} +2 -2
  71. data/lib/datadog/appsec/contrib/devise/tracking_middleware.rb +106 -0
  72. data/lib/datadog/appsec/contrib/excon/integration.rb +1 -1
  73. data/lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb +11 -12
  74. data/lib/datadog/appsec/contrib/faraday/integration.rb +1 -1
  75. data/lib/datadog/appsec/contrib/faraday/ssrf_detection_middleware.rb +10 -10
  76. data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +10 -9
  77. data/lib/datadog/appsec/contrib/graphql/integration.rb +1 -1
  78. data/lib/datadog/appsec/contrib/rack/ext.rb +34 -0
  79. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +53 -31
  80. data/lib/datadog/appsec/contrib/rack/integration.rb +1 -1
  81. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +52 -44
  82. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +35 -11
  83. data/lib/datadog/appsec/contrib/rails/integration.rb +1 -1
  84. data/lib/datadog/appsec/contrib/rails/patcher.rb +65 -47
  85. data/lib/datadog/appsec/contrib/rails/patches/process_action_patch.rb +27 -0
  86. data/lib/datadog/appsec/contrib/rails/patches/render_to_body_patch.rb +33 -0
  87. data/lib/datadog/appsec/contrib/rest_client/integration.rb +1 -1
  88. data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +12 -12
  89. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +45 -22
  90. data/lib/datadog/appsec/contrib/sinatra/integration.rb +1 -1
  91. data/lib/datadog/appsec/contrib/sinatra/patcher.rb +8 -18
  92. data/lib/datadog/appsec/contrib/sinatra/patches/json_patch.rb +31 -0
  93. data/lib/datadog/appsec/event.rb +91 -147
  94. data/lib/datadog/appsec/ext.rb +4 -2
  95. data/lib/datadog/appsec/instrumentation/gateway/argument.rb +23 -2
  96. data/lib/datadog/appsec/instrumentation/gateway/middleware.rb +24 -0
  97. data/lib/datadog/appsec/instrumentation/gateway.rb +17 -22
  98. data/lib/datadog/appsec/metrics/collector.rb +23 -3
  99. data/lib/datadog/appsec/metrics/telemetry.rb +2 -2
  100. data/lib/datadog/appsec/metrics/telemetry_exporter.rb +29 -0
  101. data/lib/datadog/appsec/metrics.rb +1 -0
  102. data/lib/datadog/appsec/monitor/gateway/watcher.rb +49 -14
  103. data/lib/datadog/appsec/processor/rule_loader.rb +30 -33
  104. data/lib/datadog/appsec/remote.rb +43 -59
  105. data/lib/datadog/appsec/response.rb +6 -6
  106. data/lib/datadog/appsec/security_engine/engine.rb +176 -0
  107. data/lib/datadog/appsec/security_engine/result.rb +44 -9
  108. data/lib/datadog/appsec/security_engine/runner.rb +44 -21
  109. data/lib/datadog/appsec/security_event.rb +37 -0
  110. data/lib/datadog/appsec/thread_safe_ref.rb +61 -0
  111. data/lib/datadog/appsec/trace_keeper.rb +24 -0
  112. data/lib/datadog/appsec/utils/hash_coercion.rb +23 -0
  113. data/lib/datadog/appsec/utils.rb +0 -2
  114. data/lib/datadog/appsec.rb +5 -15
  115. data/lib/datadog/auto_instrument_base.rb +2 -1
  116. data/lib/datadog/core/buffer/random.rb +18 -2
  117. data/lib/datadog/core/configuration/agent_settings.rb +52 -0
  118. data/lib/datadog/core/configuration/agent_settings_resolver.rb +8 -50
  119. data/lib/datadog/core/configuration/agentless_settings_resolver.rb +176 -0
  120. data/lib/datadog/core/configuration/components.rb +69 -37
  121. data/lib/datadog/core/configuration/components_state.rb +23 -0
  122. data/lib/datadog/core/configuration/config_helper.rb +100 -0
  123. data/lib/datadog/core/configuration/deprecations.rb +36 -0
  124. data/lib/datadog/core/configuration/ext.rb +4 -1
  125. data/lib/datadog/core/configuration/option.rb +117 -77
  126. data/lib/datadog/core/configuration/option_definition.rb +5 -14
  127. data/lib/datadog/core/configuration/options.rb +15 -13
  128. data/lib/datadog/core/configuration/settings.rb +117 -48
  129. data/lib/datadog/core/configuration/stable_config.rb +32 -0
  130. data/lib/datadog/core/configuration/supported_configurations.rb +337 -0
  131. data/lib/datadog/core/configuration.rb +40 -16
  132. data/lib/datadog/core/crashtracking/component.rb +3 -10
  133. data/lib/datadog/core/crashtracking/tag_builder.rb +4 -22
  134. data/lib/datadog/core/ddsketch.rb +21 -0
  135. data/lib/datadog/core/deprecations.rb +2 -2
  136. data/lib/datadog/core/diagnostics/environment_logger.rb +1 -1
  137. data/lib/datadog/core/encoding.rb +1 -1
  138. data/lib/datadog/core/environment/agent_info.rb +4 -3
  139. data/lib/datadog/core/environment/cgroup.rb +10 -12
  140. data/lib/datadog/core/environment/container.rb +38 -40
  141. data/lib/datadog/core/environment/ext.rb +6 -8
  142. data/lib/datadog/core/environment/git.rb +3 -2
  143. data/lib/datadog/core/environment/identity.rb +3 -3
  144. data/lib/datadog/core/environment/platform.rb +3 -3
  145. data/lib/datadog/core/environment/variable_helpers.rb +4 -4
  146. data/lib/datadog/core/environment/yjit.rb +2 -1
  147. data/lib/datadog/core/error.rb +11 -9
  148. data/lib/datadog/core/logger.rb +2 -2
  149. data/lib/datadog/core/metrics/client.rb +29 -29
  150. data/lib/datadog/core/metrics/logging.rb +5 -5
  151. data/lib/datadog/core/pin.rb +4 -8
  152. data/lib/datadog/core/process_discovery/tracer_memfd.rb +13 -0
  153. data/lib/datadog/core/process_discovery.rb +61 -0
  154. data/lib/datadog/core/rate_limiter.rb +4 -2
  155. data/lib/datadog/core/remote/client.rb +44 -35
  156. data/lib/datadog/core/remote/component.rb +12 -17
  157. data/lib/datadog/core/remote/configuration/digest.rb +7 -7
  158. data/lib/datadog/core/remote/configuration/path.rb +1 -1
  159. data/lib/datadog/core/remote/configuration/repository.rb +14 -1
  160. data/lib/datadog/core/remote/negotiation.rb +9 -9
  161. data/lib/datadog/core/remote/transport/config.rb +4 -3
  162. data/lib/datadog/core/remote/transport/http/client.rb +5 -4
  163. data/lib/datadog/core/remote/transport/http/config.rb +27 -37
  164. data/lib/datadog/core/remote/transport/http/negotiation.rb +7 -33
  165. data/lib/datadog/core/remote/transport/http.rb +25 -89
  166. data/lib/datadog/core/remote/transport/negotiation.rb +4 -3
  167. data/lib/datadog/core/runtime/ext.rb +0 -1
  168. data/lib/datadog/core/runtime/metrics.rb +12 -5
  169. data/lib/datadog/core/tag_builder.rb +56 -0
  170. data/lib/datadog/core/telemetry/component.rb +92 -52
  171. data/lib/datadog/core/telemetry/emitter.rb +23 -11
  172. data/lib/datadog/core/telemetry/event/app_client_configuration_change.rb +66 -0
  173. data/lib/datadog/core/telemetry/event/app_closing.rb +18 -0
  174. data/lib/datadog/core/telemetry/event/app_dependencies_loaded.rb +33 -0
  175. data/lib/datadog/core/telemetry/event/app_endpoints_loaded.rb +30 -0
  176. data/lib/datadog/core/telemetry/event/app_heartbeat.rb +18 -0
  177. data/lib/datadog/core/telemetry/event/app_integrations_change.rb +58 -0
  178. data/lib/datadog/core/telemetry/event/app_started.rb +287 -0
  179. data/lib/datadog/core/telemetry/event/base.rb +40 -0
  180. data/lib/datadog/core/telemetry/event/distributions.rb +18 -0
  181. data/lib/datadog/core/telemetry/event/generate_metrics.rb +43 -0
  182. data/lib/datadog/core/telemetry/event/log.rb +76 -0
  183. data/lib/datadog/core/telemetry/event/message_batch.rb +42 -0
  184. data/lib/datadog/core/telemetry/event/synth_app_client_configuration_change.rb +43 -0
  185. data/lib/datadog/core/telemetry/event.rb +18 -472
  186. data/lib/datadog/core/telemetry/http/adapters/net.rb +12 -97
  187. data/lib/datadog/core/telemetry/logger.rb +5 -4
  188. data/lib/datadog/core/telemetry/logging.rb +11 -5
  189. data/lib/datadog/core/telemetry/metric.rb +8 -8
  190. data/lib/datadog/core/telemetry/request.rb +4 -4
  191. data/lib/datadog/core/telemetry/transport/http/api.rb +43 -0
  192. data/lib/datadog/core/telemetry/transport/http/client.rb +49 -0
  193. data/lib/datadog/core/telemetry/transport/http/telemetry.rb +92 -0
  194. data/lib/datadog/core/telemetry/transport/http.rb +63 -0
  195. data/lib/datadog/core/telemetry/transport/telemetry.rb +51 -0
  196. data/lib/datadog/core/telemetry/worker.rb +90 -24
  197. data/lib/datadog/core/transport/http/adapters/net.rb +17 -2
  198. data/lib/datadog/core/transport/http/adapters/test.rb +2 -1
  199. data/lib/datadog/core/transport/http/api/instance.rb +17 -0
  200. data/lib/datadog/core/transport/http/api/spec.rb +17 -0
  201. data/lib/datadog/core/transport/http/builder.rb +19 -17
  202. data/lib/datadog/core/transport/http/env.rb +8 -0
  203. data/lib/datadog/core/transport/http.rb +75 -0
  204. data/lib/datadog/core/transport/response.rb +4 -1
  205. data/lib/datadog/core/utils/at_fork_monkey_patch.rb +6 -6
  206. data/lib/datadog/core/utils/duration.rb +32 -32
  207. data/lib/datadog/core/utils/forking.rb +2 -2
  208. data/lib/datadog/core/utils/network.rb +25 -6
  209. data/lib/datadog/core/utils/only_once_successful.rb +16 -5
  210. data/lib/datadog/core/utils/time.rb +20 -0
  211. data/lib/datadog/core/utils/truncation.rb +21 -0
  212. data/lib/datadog/core/utils.rb +7 -0
  213. data/lib/datadog/core/vendor/multipart-post/multipart/post/composite_read_io.rb +1 -1
  214. data/lib/datadog/core/vendor/multipart-post/multipart/post/multipartable.rb +8 -8
  215. data/lib/datadog/core/vendor/multipart-post/multipart/post/parts.rb +7 -7
  216. data/lib/datadog/core/worker.rb +1 -1
  217. data/lib/datadog/core/workers/async.rb +29 -12
  218. data/lib/datadog/core/workers/interval_loop.rb +12 -1
  219. data/lib/datadog/core/workers/runtime_metrics.rb +2 -2
  220. data/lib/datadog/core.rb +10 -0
  221. data/lib/datadog/di/boot.rb +43 -0
  222. data/lib/datadog/di/component.rb +21 -2
  223. data/lib/datadog/di/context.rb +70 -0
  224. data/lib/datadog/di/el/compiler.rb +164 -0
  225. data/lib/datadog/di/el/evaluator.rb +159 -0
  226. data/lib/datadog/di/el/expression.rb +42 -0
  227. data/lib/datadog/di/el.rb +5 -0
  228. data/lib/datadog/di/error.rb +25 -0
  229. data/lib/datadog/di/instrumenter.rb +132 -20
  230. data/lib/datadog/di/probe.rb +35 -15
  231. data/lib/datadog/di/probe_builder.rb +39 -1
  232. data/lib/datadog/di/probe_file_loader/railtie.rb +15 -0
  233. data/lib/datadog/di/probe_file_loader.rb +82 -0
  234. data/lib/datadog/di/probe_manager.rb +3 -2
  235. data/lib/datadog/di/probe_notification_builder.rb +61 -67
  236. data/lib/datadog/di/probe_notifier_worker.rb +25 -17
  237. data/lib/datadog/di/remote.rb +5 -5
  238. data/lib/datadog/di/serializer.rb +160 -8
  239. data/lib/datadog/di/transport/diagnostics.rb +4 -3
  240. data/lib/datadog/di/transport/http/api.rb +2 -12
  241. data/lib/datadog/di/transport/http/client.rb +4 -3
  242. data/lib/datadog/di/transport/http/diagnostics.rb +7 -34
  243. data/lib/datadog/di/transport/http/input.rb +18 -35
  244. data/lib/datadog/di/transport/http.rb +15 -77
  245. data/lib/datadog/di/transport/input.rb +14 -5
  246. data/lib/datadog/di/utils.rb +5 -0
  247. data/lib/datadog/di.rb +0 -34
  248. data/lib/datadog/error_tracking/collector.rb +87 -0
  249. data/lib/datadog/error_tracking/component.rb +167 -0
  250. data/lib/datadog/error_tracking/configuration/settings.rb +63 -0
  251. data/lib/datadog/error_tracking/configuration.rb +11 -0
  252. data/lib/datadog/error_tracking/ext.rb +18 -0
  253. data/lib/datadog/error_tracking/extensions.rb +16 -0
  254. data/lib/datadog/error_tracking/filters.rb +77 -0
  255. data/lib/datadog/error_tracking.rb +18 -0
  256. data/lib/datadog/kit/appsec/events/v2.rb +196 -0
  257. data/lib/datadog/kit/appsec/events.rb +17 -4
  258. data/lib/datadog/kit/identity.rb +22 -12
  259. data/lib/datadog/opentelemetry/api/baggage.rb +90 -0
  260. data/lib/datadog/opentelemetry/api/baggage.rbs +26 -0
  261. data/lib/datadog/opentelemetry/api/context.rb +21 -6
  262. data/lib/datadog/opentelemetry/sdk/configurator.rb +1 -1
  263. data/lib/datadog/opentelemetry/sdk/propagator.rb +4 -4
  264. data/lib/datadog/opentelemetry/sdk/span_processor.rb +8 -8
  265. data/lib/datadog/opentelemetry/sdk/trace/span.rb +15 -11
  266. data/lib/datadog/opentelemetry/trace.rb +4 -4
  267. data/lib/datadog/opentelemetry.rb +2 -1
  268. data/lib/datadog/profiling/collectors/code_provenance.rb +18 -9
  269. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +6 -0
  270. data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +1 -0
  271. data/lib/datadog/profiling/collectors/info.rb +44 -0
  272. data/lib/datadog/profiling/collectors/thread_context.rb +17 -2
  273. data/lib/datadog/profiling/component.rb +8 -9
  274. data/lib/datadog/profiling/encoded_profile.rb +11 -0
  275. data/lib/datadog/profiling/exporter.rb +12 -7
  276. data/lib/datadog/profiling/ext.rb +2 -15
  277. data/lib/datadog/profiling/flush.rb +5 -8
  278. data/lib/datadog/profiling/http_transport.rb +8 -62
  279. data/lib/datadog/profiling/profiler.rb +2 -0
  280. data/lib/datadog/profiling/scheduler.rb +10 -2
  281. data/lib/datadog/profiling/sequence_tracker.rb +44 -0
  282. data/lib/datadog/profiling/stack_recorder.rb +9 -9
  283. data/lib/datadog/profiling/tag_builder.rb +7 -41
  284. data/lib/datadog/profiling/tasks/exec.rb +2 -2
  285. data/lib/datadog/profiling/tasks/setup.rb +2 -0
  286. data/lib/datadog/profiling.rb +13 -10
  287. data/lib/datadog/single_step_instrument.rb +9 -0
  288. data/lib/datadog/tracing/analytics.rb +1 -1
  289. data/lib/datadog/tracing/buffer.rb +7 -7
  290. data/lib/datadog/tracing/component.rb +21 -29
  291. data/lib/datadog/tracing/configuration/dynamic.rb +6 -8
  292. data/lib/datadog/tracing/configuration/ext.rb +8 -4
  293. data/lib/datadog/tracing/configuration/settings.rb +50 -12
  294. data/lib/datadog/tracing/context.rb +2 -2
  295. data/lib/datadog/tracing/context_provider.rb +1 -1
  296. data/lib/datadog/tracing/contrib/action_cable/event.rb +1 -1
  297. data/lib/datadog/tracing/contrib/action_cable/integration.rb +1 -1
  298. data/lib/datadog/tracing/contrib/action_mailer/integration.rb +1 -1
  299. data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +19 -4
  300. data/lib/datadog/tracing/contrib/action_pack/action_dispatch/instrumentation.rb +19 -12
  301. data/lib/datadog/tracing/contrib/action_pack/ext.rb +2 -0
  302. data/lib/datadog/tracing/contrib/action_pack/integration.rb +1 -1
  303. data/lib/datadog/tracing/contrib/action_view/events/render_template.rb +1 -1
  304. data/lib/datadog/tracing/contrib/active_job/event.rb +8 -8
  305. data/lib/datadog/tracing/contrib/active_job/events/discard.rb +1 -1
  306. data/lib/datadog/tracing/contrib/active_job/events/enqueue.rb +1 -1
  307. data/lib/datadog/tracing/contrib/active_job/events/enqueue_at.rb +1 -1
  308. data/lib/datadog/tracing/contrib/active_job/events/enqueue_retry.rb +1 -1
  309. data/lib/datadog/tracing/contrib/active_job/events/perform.rb +1 -1
  310. data/lib/datadog/tracing/contrib/active_job/events/retry_stopped.rb +1 -1
  311. data/lib/datadog/tracing/contrib/active_job/integration.rb +1 -1
  312. data/lib/datadog/tracing/contrib/active_model_serializers/events/render.rb +1 -1
  313. data/lib/datadog/tracing/contrib/active_model_serializers/events/serialize.rb +3 -3
  314. data/lib/datadog/tracing/contrib/active_model_serializers/integration.rb +1 -2
  315. data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +1 -1
  316. data/lib/datadog/tracing/contrib/active_record/events/instantiation.rb +1 -1
  317. data/lib/datadog/tracing/contrib/active_record/events/sql.rb +5 -5
  318. data/lib/datadog/tracing/contrib/active_record/integration.rb +2 -2
  319. data/lib/datadog/tracing/contrib/active_record/utils.rb +15 -15
  320. data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +17 -8
  321. data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +33 -0
  322. data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +4 -0
  323. data/lib/datadog/tracing/contrib/active_support/cache/redis.rb +2 -4
  324. data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +13 -0
  325. data/lib/datadog/tracing/contrib/active_support/integration.rb +1 -1
  326. data/lib/datadog/tracing/contrib/active_support/notifications/event.rb +2 -1
  327. data/lib/datadog/tracing/contrib/active_support/notifications/subscription.rb +7 -9
  328. data/lib/datadog/tracing/contrib/aws/ext.rb +1 -1
  329. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +12 -2
  330. data/lib/datadog/tracing/contrib/aws/parsed_context.rb +8 -2
  331. data/lib/datadog/tracing/contrib/aws/patcher.rb +5 -1
  332. data/lib/datadog/tracing/contrib/aws/service/base.rb +2 -1
  333. data/lib/datadog/tracing/contrib/aws/service/dynamodb.rb +1 -1
  334. data/lib/datadog/tracing/contrib/aws/service/eventbridge.rb +1 -1
  335. data/lib/datadog/tracing/contrib/aws/service/kinesis.rb +1 -1
  336. data/lib/datadog/tracing/contrib/aws/service/s3.rb +1 -1
  337. data/lib/datadog/tracing/contrib/aws/service/sns.rb +1 -1
  338. data/lib/datadog/tracing/contrib/aws/service/sqs.rb +1 -1
  339. data/lib/datadog/tracing/contrib/aws/service/states.rb +1 -1
  340. data/lib/datadog/tracing/contrib/aws/services.rb +7 -7
  341. data/lib/datadog/tracing/contrib/component.rb +2 -2
  342. data/lib/datadog/tracing/contrib/concurrent_ruby/async_patch.rb +1 -1
  343. data/lib/datadog/tracing/contrib/concurrent_ruby/context_composite_executor_service.rb +1 -1
  344. data/lib/datadog/tracing/contrib/concurrent_ruby/future_patch.rb +1 -1
  345. data/lib/datadog/tracing/contrib/concurrent_ruby/integration.rb +1 -1
  346. data/lib/datadog/tracing/contrib/concurrent_ruby/promises_future_patch.rb +1 -1
  347. data/lib/datadog/tracing/contrib/configurable.rb +6 -6
  348. data/lib/datadog/tracing/contrib/configuration/resolvers/pattern_resolver.rb +4 -4
  349. data/lib/datadog/tracing/contrib/configuration/settings.rb +1 -1
  350. data/lib/datadog/tracing/contrib/dalli/ext.rb +3 -2
  351. data/lib/datadog/tracing/contrib/dalli/integration.rb +1 -1
  352. data/lib/datadog/tracing/contrib/delayed_job/integration.rb +1 -1
  353. data/lib/datadog/tracing/contrib/elasticsearch/ext.rb +3 -2
  354. data/lib/datadog/tracing/contrib/elasticsearch/integration.rb +4 -4
  355. data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +51 -53
  356. data/lib/datadog/tracing/contrib/elasticsearch/quantize.rb +5 -5
  357. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +6 -7
  358. data/lib/datadog/tracing/contrib/ethon/ext.rb +3 -2
  359. data/lib/datadog/tracing/contrib/ethon/integration.rb +1 -1
  360. data/lib/datadog/tracing/contrib/excon/ext.rb +3 -2
  361. data/lib/datadog/tracing/contrib/excon/integration.rb +1 -1
  362. data/lib/datadog/tracing/contrib/excon/middleware.rb +7 -5
  363. data/lib/datadog/tracing/contrib/ext.rb +4 -3
  364. data/lib/datadog/tracing/contrib/extensions.rb +9 -9
  365. data/lib/datadog/tracing/contrib/faraday/ext.rb +3 -2
  366. data/lib/datadog/tracing/contrib/faraday/integration.rb +1 -1
  367. data/lib/datadog/tracing/contrib/faraday/middleware.rb +9 -5
  368. data/lib/datadog/tracing/contrib/grape/endpoint.rb +8 -8
  369. data/lib/datadog/tracing/contrib/grape/integration.rb +1 -1
  370. data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +7 -0
  371. data/lib/datadog/tracing/contrib/graphql/ext.rb +1 -0
  372. data/lib/datadog/tracing/contrib/graphql/integration.rb +1 -1
  373. data/lib/datadog/tracing/contrib/graphql/patcher.rb +2 -2
  374. data/lib/datadog/tracing/contrib/graphql/unified_trace.rb +84 -48
  375. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +15 -9
  376. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +3 -3
  377. data/lib/datadog/tracing/contrib/grpc/distributed/fetcher.rb +1 -1
  378. data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +3 -0
  379. data/lib/datadog/tracing/contrib/grpc/integration.rb +1 -1
  380. data/lib/datadog/tracing/contrib/hanami/ext.rb +2 -2
  381. data/lib/datadog/tracing/contrib/hanami/integration.rb +1 -1
  382. data/lib/datadog/tracing/contrib/hanami/renderer_policy_tracing.rb +1 -1
  383. data/lib/datadog/tracing/contrib/hanami/router_tracing.rb +9 -11
  384. data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +0 -15
  385. data/lib/datadog/tracing/contrib/http/distributed/fetcher.rb +4 -4
  386. data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +4 -1
  387. data/lib/datadog/tracing/contrib/http/ext.rb +3 -2
  388. data/lib/datadog/tracing/contrib/http/instrumentation.rb +11 -15
  389. data/lib/datadog/tracing/contrib/httpclient/ext.rb +3 -2
  390. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +9 -19
  391. data/lib/datadog/tracing/contrib/httpclient/integration.rb +1 -1
  392. data/lib/datadog/tracing/contrib/httprb/ext.rb +3 -2
  393. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +11 -19
  394. data/lib/datadog/tracing/contrib/httprb/integration.rb +1 -1
  395. data/lib/datadog/tracing/contrib/kafka/event.rb +1 -1
  396. data/lib/datadog/tracing/contrib/kafka/events/connection/request.rb +1 -1
  397. data/lib/datadog/tracing/contrib/kafka/events/consumer/process_batch.rb +1 -1
  398. data/lib/datadog/tracing/contrib/kafka/events/consumer/process_message.rb +1 -1
  399. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/heartbeat.rb +1 -1
  400. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/join_group.rb +1 -1
  401. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/leave_group.rb +1 -1
  402. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/sync_group.rb +1 -1
  403. data/lib/datadog/tracing/contrib/kafka/events/produce_operation/send_messages.rb +1 -1
  404. data/lib/datadog/tracing/contrib/kafka/events/producer/deliver_messages.rb +1 -1
  405. data/lib/datadog/tracing/contrib/kafka/integration.rb +1 -1
  406. data/lib/datadog/tracing/contrib/karafka/configuration/settings.rb +27 -0
  407. data/lib/datadog/tracing/contrib/karafka/distributed/propagation.rb +48 -0
  408. data/lib/datadog/tracing/contrib/karafka/ext.rb +27 -0
  409. data/lib/datadog/tracing/contrib/karafka/integration.rb +45 -0
  410. data/lib/datadog/tracing/contrib/karafka/monitor.rb +66 -0
  411. data/lib/datadog/tracing/contrib/karafka/patcher.rb +71 -0
  412. data/lib/datadog/tracing/contrib/karafka.rb +37 -0
  413. data/lib/datadog/tracing/contrib/lograge/instrumentation.rb +1 -1
  414. data/lib/datadog/tracing/contrib/lograge/integration.rb +1 -1
  415. data/lib/datadog/tracing/contrib/lograge/patcher.rb +4 -2
  416. data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +9 -1
  417. data/lib/datadog/tracing/contrib/mongodb/ext.rb +2 -1
  418. data/lib/datadog/tracing/contrib/mongodb/integration.rb +1 -1
  419. data/lib/datadog/tracing/contrib/mongodb/parsers.rb +1 -1
  420. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +23 -6
  421. data/lib/datadog/tracing/contrib/mysql2/ext.rb +1 -1
  422. data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +16 -6
  423. data/lib/datadog/tracing/contrib/mysql2/integration.rb +1 -1
  424. data/lib/datadog/tracing/contrib/opensearch/configuration/settings.rb +17 -0
  425. data/lib/datadog/tracing/contrib/opensearch/ext.rb +12 -2
  426. data/lib/datadog/tracing/contrib/opensearch/integration.rb +1 -2
  427. data/lib/datadog/tracing/contrib/opensearch/patcher.rb +68 -66
  428. data/lib/datadog/tracing/contrib/opensearch/quantize.rb +5 -5
  429. data/lib/datadog/tracing/contrib/patcher.rb +12 -11
  430. data/lib/datadog/tracing/contrib/pg/integration.rb +1 -1
  431. data/lib/datadog/tracing/contrib/presto/ext.rb +1 -1
  432. data/lib/datadog/tracing/contrib/presto/instrumentation.rb +3 -3
  433. data/lib/datadog/tracing/contrib/presto/integration.rb +1 -1
  434. data/lib/datadog/tracing/contrib/propagation/sql_comment/comment.rb +1 -1
  435. data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +1 -1
  436. data/lib/datadog/tracing/contrib/que/integration.rb +1 -1
  437. data/lib/datadog/tracing/contrib/racecar/event.rb +1 -1
  438. data/lib/datadog/tracing/contrib/racecar/events/batch.rb +2 -2
  439. data/lib/datadog/tracing/contrib/racecar/events/consume.rb +1 -1
  440. data/lib/datadog/tracing/contrib/racecar/events/message.rb +2 -2
  441. data/lib/datadog/tracing/contrib/racecar/integration.rb +1 -1
  442. data/lib/datadog/tracing/contrib/rack/header_collection.rb +1 -1
  443. data/lib/datadog/tracing/contrib/rack/header_tagging.rb +32 -32
  444. data/lib/datadog/tracing/contrib/rack/integration.rb +1 -1
  445. data/lib/datadog/tracing/contrib/rack/middlewares.rb +21 -17
  446. data/lib/datadog/tracing/contrib/rack/patcher.rb +1 -1
  447. data/lib/datadog/tracing/contrib/rack/request_queue.rb +4 -3
  448. data/lib/datadog/tracing/contrib/rack/trace_proxy_middleware.rb +7 -1
  449. data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +1 -1
  450. data/lib/datadog/tracing/contrib/rails/ext.rb +2 -1
  451. data/lib/datadog/tracing/contrib/rails/integration.rb +2 -2
  452. data/lib/datadog/tracing/contrib/rails/log_injection.rb +1 -1
  453. data/lib/datadog/tracing/contrib/rails/middlewares.rb +1 -1
  454. data/lib/datadog/tracing/contrib/rails/patcher.rb +4 -1
  455. data/lib/datadog/tracing/contrib/rails/runner.rb +62 -40
  456. data/lib/datadog/tracing/contrib/rake/instrumentation.rb +4 -4
  457. data/lib/datadog/tracing/contrib/rake/integration.rb +1 -1
  458. data/lib/datadog/tracing/contrib/redis/configuration/resolver.rb +2 -2
  459. data/lib/datadog/tracing/contrib/redis/ext.rb +3 -2
  460. data/lib/datadog/tracing/contrib/redis/integration.rb +2 -2
  461. data/lib/datadog/tracing/contrib/redis/patcher.rb +4 -4
  462. data/lib/datadog/tracing/contrib/redis/quantize.rb +1 -1
  463. data/lib/datadog/tracing/contrib/redis/tags.rb +1 -1
  464. data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +4 -4
  465. data/lib/datadog/tracing/contrib/registry.rb +1 -1
  466. data/lib/datadog/tracing/contrib/resque/integration.rb +1 -1
  467. data/lib/datadog/tracing/contrib/resque/resque_job.rb +1 -1
  468. data/lib/datadog/tracing/contrib/rest_client/ext.rb +3 -2
  469. data/lib/datadog/tracing/contrib/rest_client/integration.rb +1 -1
  470. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +8 -6
  471. data/lib/datadog/tracing/contrib/roda/instrumentation.rb +1 -1
  472. data/lib/datadog/tracing/contrib/roda/integration.rb +1 -1
  473. data/lib/datadog/tracing/contrib/semantic_logger/instrumentation.rb +1 -1
  474. data/lib/datadog/tracing/contrib/semantic_logger/integration.rb +1 -1
  475. data/lib/datadog/tracing/contrib/sequel/database.rb +5 -5
  476. data/lib/datadog/tracing/contrib/sequel/dataset.rb +1 -1
  477. data/lib/datadog/tracing/contrib/sequel/integration.rb +1 -1
  478. data/lib/datadog/tracing/contrib/sequel/utils.rb +1 -1
  479. data/lib/datadog/tracing/contrib/shoryuken/integration.rb +1 -1
  480. data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +6 -1
  481. data/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb +3 -0
  482. data/lib/datadog/tracing/contrib/sidekiq/ext.rb +1 -0
  483. data/lib/datadog/tracing/contrib/sidekiq/integration.rb +1 -1
  484. data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +5 -2
  485. data/lib/datadog/tracing/contrib/sidekiq/utils.rb +1 -1
  486. data/lib/datadog/tracing/contrib/sinatra/integration.rb +1 -1
  487. data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +38 -40
  488. data/lib/datadog/tracing/contrib/sneakers/integration.rb +1 -1
  489. data/lib/datadog/tracing/contrib/span_attribute_schema.rb +1 -1
  490. data/lib/datadog/tracing/contrib/stripe/integration.rb +1 -1
  491. data/lib/datadog/tracing/contrib/stripe/request.rb +1 -1
  492. data/lib/datadog/tracing/contrib/sucker_punch/integration.rb +1 -1
  493. data/lib/datadog/tracing/contrib/support.rb +28 -0
  494. data/lib/datadog/tracing/contrib/trilogy/ext.rb +1 -1
  495. data/lib/datadog/tracing/contrib/trilogy/integration.rb +1 -1
  496. data/lib/datadog/tracing/contrib/utils/quantization/hash.rb +11 -11
  497. data/lib/datadog/tracing/contrib/utils/quantization/http.rb +6 -6
  498. data/lib/datadog/tracing/contrib.rb +1 -0
  499. data/lib/datadog/tracing/correlation.rb +9 -2
  500. data/lib/datadog/tracing/diagnostics/environment_logger.rb +8 -2
  501. data/lib/datadog/tracing/distributed/b3_multi.rb +1 -1
  502. data/lib/datadog/tracing/distributed/b3_single.rb +2 -2
  503. data/lib/datadog/tracing/distributed/baggage.rb +196 -0
  504. data/lib/datadog/tracing/distributed/datadog.rb +8 -7
  505. data/lib/datadog/tracing/distributed/datadog_tags_codec.rb +11 -13
  506. data/lib/datadog/tracing/distributed/helpers.rb +1 -1
  507. data/lib/datadog/tracing/distributed/none.rb +4 -2
  508. data/lib/datadog/tracing/distributed/propagation.rb +28 -4
  509. data/lib/datadog/tracing/distributed/propagation_policy.rb +42 -0
  510. data/lib/datadog/tracing/distributed/trace_context.rb +22 -16
  511. data/lib/datadog/tracing/event.rb +5 -7
  512. data/lib/datadog/tracing/flush.rb +1 -1
  513. data/lib/datadog/tracing/metadata/analytics.rb +1 -1
  514. data/lib/datadog/tracing/metadata/errors.rb +4 -4
  515. data/lib/datadog/tracing/metadata/ext.rb +13 -0
  516. data/lib/datadog/tracing/metadata/metastruct.rb +36 -0
  517. data/lib/datadog/tracing/metadata/metastruct_tagging.rb +42 -0
  518. data/lib/datadog/tracing/metadata/tagging.rb +4 -4
  519. data/lib/datadog/tracing/metadata.rb +2 -0
  520. data/lib/datadog/tracing/pipeline/span_filter.rb +3 -1
  521. data/lib/datadog/tracing/pipeline/span_processor.rb +3 -1
  522. data/lib/datadog/tracing/pipeline.rb +1 -1
  523. data/lib/datadog/tracing/sampling/ext.rb +0 -2
  524. data/lib/datadog/tracing/sampling/rate_sampler.rb +2 -1
  525. data/lib/datadog/tracing/sampling/rule_sampler.rb +30 -30
  526. data/lib/datadog/tracing/sampling/span/rule.rb +0 -1
  527. data/lib/datadog/tracing/sampling/span/rule_parser.rb +1 -1
  528. data/lib/datadog/tracing/sampling/span/sampler.rb +0 -7
  529. data/lib/datadog/tracing/span.rb +11 -2
  530. data/lib/datadog/tracing/span_event.rb +11 -11
  531. data/lib/datadog/tracing/span_link.rb +12 -12
  532. data/lib/datadog/tracing/span_operation.rb +76 -26
  533. data/lib/datadog/tracing/sync_writer.rb +5 -4
  534. data/lib/datadog/tracing/trace_digest.rb +29 -24
  535. data/lib/datadog/tracing/trace_operation.rb +121 -97
  536. data/lib/datadog/tracing/trace_segment.rb +8 -6
  537. data/lib/datadog/tracing/tracer.rb +90 -43
  538. data/lib/datadog/tracing/transport/http/api.rb +2 -10
  539. data/lib/datadog/tracing/transport/http/client.rb +6 -5
  540. data/lib/datadog/tracing/transport/http/traces.rb +15 -43
  541. data/lib/datadog/tracing/transport/http.rb +13 -75
  542. data/lib/datadog/tracing/transport/io/client.rb +5 -5
  543. data/lib/datadog/tracing/transport/io/traces.rb +4 -4
  544. data/lib/datadog/tracing/transport/serializable_trace.rb +3 -1
  545. data/lib/datadog/tracing/transport/statistics.rb +1 -1
  546. data/lib/datadog/tracing/transport/trace_formatter.rb +7 -0
  547. data/lib/datadog/tracing/transport/traces.rb +31 -14
  548. data/lib/datadog/tracing/utils.rb +1 -1
  549. data/lib/datadog/tracing/workers/trace_writer.rb +16 -16
  550. data/lib/datadog/tracing/workers.rb +2 -2
  551. data/lib/datadog/tracing/writer.rb +4 -4
  552. data/lib/datadog/tracing.rb +16 -3
  553. data/lib/datadog/version.rb +1 -1
  554. data/lib/datadog.rb +8 -2
  555. metadata +115 -24
  556. data/ext/libdatadog_api/macos_development.md +0 -26
  557. data/lib/datadog/appsec/assets/waf_rules/processors.json +0 -92
  558. data/lib/datadog/appsec/assets/waf_rules/scanners.json +0 -114
  559. data/lib/datadog/appsec/contrib/devise/event.rb +0 -54
  560. data/lib/datadog/appsec/contrib/devise/patcher/authenticatable_patch.rb +0 -72
  561. data/lib/datadog/appsec/contrib/devise/patcher/registration_controller_patch.rb +0 -47
  562. data/lib/datadog/appsec/contrib/devise/resource.rb +0 -35
  563. data/lib/datadog/appsec/contrib/devise/tracking.rb +0 -57
  564. data/lib/datadog/appsec/processor/rule_merger.rb +0 -170
  565. data/lib/datadog/appsec/processor.rb +0 -107
  566. data/lib/datadog/appsec/utils/trace_operation.rb +0 -15
  567. data/lib/datadog/core/telemetry/http/env.rb +0 -20
  568. data/lib/datadog/core/telemetry/http/ext.rb +0 -28
  569. data/lib/datadog/core/telemetry/http/response.rb +0 -70
  570. data/lib/datadog/core/telemetry/http/transport.rb +0 -90
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # rubocop:disable Lint/AssignmentInCondition
4
+
3
5
  module Datadog
4
6
  module DI
5
7
  # Builds probe status notification and snapshot payloads.
@@ -39,60 +41,47 @@ module Datadog
39
41
  end
40
42
 
41
43
  # Duration is in seconds.
42
- def build_executed(probe,
43
- trace_point: nil, rv: nil, duration: nil, caller_locations: nil,
44
- args: nil, kwargs: nil, serialized_entry_args: nil)
45
- snapshot = if probe.line? && probe.capture_snapshot?
46
- if trace_point.nil?
47
- raise "Cannot create snapshot because there is no trace point"
48
- end
49
- get_local_variables(trace_point)
50
- end
51
- # TODO check how many stack frames we should be keeping/sending,
52
- # this should be all frames for enriched probes and no frames for
53
- # non-enriched probes?
54
- build_snapshot(probe, rv: rv, snapshot: snapshot,
55
- # Actual path of the instrumented file.
56
- path: trace_point&.path,
57
- duration: duration, caller_locations: caller_locations, args: args, kwargs: kwargs,
58
- serialized_entry_args: serialized_entry_args)
44
+ # path is the actual path of the instrumented file.
45
+ def build_executed(context)
46
+ build_snapshot(context)
59
47
  end
60
48
 
61
- def build_snapshot(probe, rv: nil, snapshot: nil, path: nil,
62
- duration: nil, caller_locations: nil, args: nil, kwargs: nil,
63
- serialized_entry_args: nil)
49
+ NANOSECONDS = 10**9
50
+ MILLISECONDS = 1000
51
+
52
+ def build_snapshot(context)
53
+ probe = context.probe
54
+
55
+ if probe.capture_snapshot? && !context.target_self
56
+ raise ArgumentError, "Asked to build snapshot with snapshot capture but target_self is nil"
57
+ end
58
+
64
59
  # TODO also verify that non-capturing probe does not pass
65
60
  # snapshot or vars/args into this method
66
61
  captures = if probe.capture_snapshot?
67
62
  if probe.method?
63
+ return_arguments = {
64
+ "@return": serializer.serialize_value(context.return_value,
65
+ depth: probe.max_capture_depth || settings.dynamic_instrumentation.max_capture_depth,
66
+ attribute_count: probe.max_capture_attribute_count || settings.dynamic_instrumentation.max_capture_attribute_count),
67
+ self: serializer.serialize_value(context.target_self),
68
+ }
68
69
  {
69
70
  entry: {
70
- # standard:disable all
71
- arguments: if serialized_entry_args
72
- serialized_entry_args
73
- else
74
- (args || kwargs) && serializer.serialize_args(args, kwargs,
75
- depth: probe.max_capture_depth || settings.dynamic_instrumentation.max_capture_depth,
76
- attribute_count: probe.max_capture_attribute_count || settings.dynamic_instrumentation.max_capture_attribute_count)
77
- end,
78
- throwable: nil,
79
- # standard:enable all
71
+ arguments: context.serialized_entry_args,
80
72
  },
81
73
  return: {
82
- arguments: {
83
- "@return": serializer.serialize_value(rv,
84
- depth: probe.max_capture_depth || settings.dynamic_instrumentation.max_capture_depth,
85
- attribute_count: probe.max_capture_attribute_count || settings.dynamic_instrumentation.max_capture_attribute_count),
86
- },
74
+ arguments: return_arguments,
87
75
  throwable: nil,
88
76
  },
89
77
  }
90
78
  elsif probe.line?
91
79
  {
92
- lines: snapshot && {
93
- probe.line_no => {locals: serializer.serialize_vars(snapshot,
94
- depth: probe.max_capture_depth || settings.dynamic_instrumentation.max_capture_depth,
95
- attribute_count: probe.max_capture_attribute_count || settings.dynamic_instrumentation.max_capture_attribute_count,)},
80
+ lines: (locals = context.serialized_locals) && {
81
+ probe.line_no => {
82
+ locals: locals,
83
+ arguments: {self: serializer.serialize_value(context.target_self)},
84
+ },
96
85
  },
97
86
  }
98
87
  end
@@ -100,7 +89,7 @@ module Datadog
100
89
 
101
90
  location = if probe.line?
102
91
  {
103
- file: path,
92
+ file: context.path,
104
93
  lines: [probe.line_no],
105
94
  }
106
95
  elsif probe.method?
@@ -110,17 +99,23 @@ module Datadog
110
99
  }
111
100
  end
112
101
 
113
- stack = if caller_locations
102
+ stack = if caller_locations = context.caller_locations
114
103
  format_caller_locations(caller_locations)
115
104
  end
116
105
 
117
106
  timestamp = timestamp_now
107
+ message = nil
108
+ evaluation_errors = []
109
+ if segments = probe.template_segments
110
+ message, evaluation_errors = evaluate_template(segments, context)
111
+ end
112
+ duration = context.duration
118
113
  {
119
114
  service: settings.service,
120
115
  "debugger.snapshot": {
121
116
  id: SecureRandom.uuid,
122
117
  timestamp: timestamp,
123
- evaluationErrors: [],
118
+ evaluationErrors: evaluation_errors,
124
119
  probe: {
125
120
  id: probe.id,
126
121
  version: 0,
@@ -133,7 +128,7 @@ module Datadog
133
128
  },
134
129
  # In python tracer duration is under debugger.snapshot,
135
130
  # but UI appears to expect it here at top level.
136
- duration: duration ? (duration * 10**9).to_i : 0,
131
+ duration: duration ? (duration * NANOSECONDS).to_i : 0,
137
132
  host: nil,
138
133
  logger: {
139
134
  name: probe.file,
@@ -150,8 +145,7 @@ module Datadog
150
145
  "dd.trace_id": active_trace&.id&.to_s,
151
146
  "dd.span_id": active_span&.id&.to_s,
152
147
  ddsource: 'dd_debugger',
153
- message: probe.template && evaluate_template(probe.template,
154
- duration: duration ? duration * 1000 : 0),
148
+ message: message,
155
149
  timestamp: timestamp,
156
150
  }
157
151
  end
@@ -182,31 +176,29 @@ module Datadog
182
176
  end
183
177
  end
184
178
 
185
- def evaluate_template(template, **vars)
186
- message = template.dup
187
- vars.each do |key, value|
188
- message.gsub!("{@#{key}}", value.to_s)
189
- end
190
- message
179
+ def evaluate_template(template_segments, context)
180
+ evaluation_errors = []
181
+ message = template_segments.map do |segment|
182
+ case segment
183
+ when String
184
+ segment
185
+ when EL::Expression
186
+ serializer.serialize_value_for_message(segment.evaluate(context))
187
+ else
188
+ raise ArgumentError, "Invalid template segment type: #{segment}"
189
+ end
190
+ rescue => exc
191
+ evaluation_errors << {
192
+ message: "#{exc.class}: #{exc}",
193
+ expr: segment.dsl_expr,
194
+ }
195
+ '[evaluation error]'
196
+ end.join
197
+ [message, evaluation_errors]
191
198
  end
192
199
 
193
200
  def timestamp_now
194
- (Time.now.to_f * 1000).to_i
195
- end
196
-
197
- def get_local_variables(trace_point)
198
- # binding appears to be constructed on access, therefore
199
- # 1) we should attempt to cache it and
200
- # 2) we should not call +binding+ until we actually need variable values.
201
- binding = trace_point.binding
202
-
203
- # steep hack - should never happen
204
- return {} unless binding
205
-
206
- binding.local_variables.each_with_object({}) do |name, map|
207
- value = binding.local_variable_get(name)
208
- map[name] = value
209
- end
201
+ (Core::Utils::Time.now.to_f * MILLISECONDS).to_i
210
202
  end
211
203
 
212
204
  def active_trace
@@ -223,3 +215,5 @@ module Datadog
223
215
  end
224
216
  end
225
217
  end
218
+
219
+ # rubocop:enable Lint/AssignmentInCondition
@@ -171,7 +171,7 @@ module Datadog
171
171
  attr_reader :last_sent
172
172
 
173
173
  def status_transport
174
- @status_transport ||= DI::Transport::HTTP.diagnostics(agent_settings: agent_settings)
174
+ @status_transport ||= DI::Transport::HTTP.diagnostics(agent_settings: agent_settings, logger: logger)
175
175
  end
176
176
 
177
177
  def do_send_status(batch)
@@ -179,11 +179,19 @@ module Datadog
179
179
  end
180
180
 
181
181
  def snapshot_transport
182
- @snapshot_transport ||= DI::Transport::HTTP.input(agent_settings: agent_settings)
182
+ @snapshot_transport ||= DI::Transport::HTTP.input(agent_settings: agent_settings, logger: logger)
183
183
  end
184
184
 
185
185
  def do_send_snapshot(batch)
186
- snapshot_transport.send_input(batch)
186
+ snapshot_transport.send_input(batch, tags)
187
+ end
188
+
189
+ def tags
190
+ # DEV: The tags could be cached but they need to be recreated
191
+ # when process forks (since the child receives new runtime IDs).
192
+ Core::TagBuilder.tags(settings).merge(
193
+ 'debugger_version' => Core::Environment::Identity.gem_datadog_version,
194
+ )
187
195
  end
188
196
 
189
197
  [
@@ -227,20 +235,6 @@ module Datadog
227
235
  start
228
236
  end
229
237
 
230
- # Determine how much longer the worker thread should sleep
231
- # so as not to send in less than min send interval since the last send.
232
- # Important: this method must be called when @lock is held.
233
- #
234
- # Returns the time remaining to sleep.
235
- def set_sleep_remaining
236
- now = Core::Utils::Time.get_time
237
- @sleep_remaining = if last_sent
238
- [last_sent + min_send_interval - now, 0].max
239
- else
240
- 0
241
- end
242
- end
243
-
244
238
  public "add_#{event_type}"
245
239
 
246
240
  # Sends pending probe statuses or snapshots.
@@ -288,6 +282,20 @@ module Datadog
288
282
  end
289
283
  end
290
284
 
285
+ # Determine how much longer the worker thread should sleep
286
+ # so as not to send in less than min send interval since the last send.
287
+ # Important: this method must be called when @lock is held.
288
+ #
289
+ # Returns the time remaining to sleep.
290
+ def set_sleep_remaining
291
+ now = Core::Utils::Time.get_time
292
+ @sleep_remaining = if last_sent
293
+ [last_sent + min_send_interval - now, 0].max
294
+ else
295
+ 0
296
+ end
297
+ end
298
+
291
299
  def maybe_send
292
300
  rv = maybe_send_status
293
301
  maybe_send_snapshot || rv
@@ -18,6 +18,8 @@ module Datadog
18
18
  PRODUCT = 'LIVE_DEBUGGING'
19
19
 
20
20
  def products
21
+ # TODO: do not send our product on unsupported runtimes
22
+ # (Ruby 2.5 / JRuby)
21
23
  [PRODUCT]
22
24
  end
23
25
 
@@ -41,6 +43,8 @@ module Datadog
41
43
  if component
42
44
 
43
45
  probe_manager = component.probe_manager
46
+ probe_notification_builder = component.probe_notification_builder
47
+ probe_notifier_worker = component.probe_notifier_worker
44
48
 
45
49
  current_probe_ids = {}
46
50
  repository.contents.each do |content|
@@ -48,11 +52,7 @@ module Datadog
48
52
  when PRODUCT
49
53
  begin
50
54
  probe_spec = parse_content(content)
51
- probe = ProbeBuilder.build_from_remote_config(probe_spec)
52
- probe_notification_builder = component.probe_notification_builder
53
- payload = probe_notification_builder.build_received(probe)
54
- probe_notifier_worker = component.probe_notifier_worker
55
- probe_notifier_worker.add_status(payload)
55
+ probe = component.parse_probe_spec_and_notify(probe_spec)
56
56
  component.logger.debug { "di: received #{probe.type} probe at #{probe.location} (#{probe.id}) via RC" }
57
57
 
58
58
  begin
@@ -36,6 +36,10 @@ module Datadog
36
36
  # efficient but there would be additional overhead from passing this
37
37
  # parameter all the time and the API would get more complex.
38
38
  #
39
+ # Note: "self" cannot be used as a parameter name in Ruby, therefore
40
+ # there should never be a conflict between instance variable
41
+ # serialization and method parameters.
42
+ #
39
43
  # @api private
40
44
  class Serializer
41
45
  # Third-party library integration / custom serializers.
@@ -60,6 +64,9 @@ module Datadog
60
64
  # a common base class but are all of different classes) or for Mongoid
61
65
  # models (that do not have a common base class at all but include a
62
66
  # standard Mongoid module).
67
+ #
68
+ # Important: these serializers are NOT used in log messages.
69
+ # They are only used for variables that are captured in the snapshots.
63
70
  @@flat_registry = []
64
71
  def self.register(condition: nil, &block)
65
72
  @@flat_registry << {condition: condition, proc: block}
@@ -75,6 +82,18 @@ module Datadog
75
82
  attr_reader :redactor
76
83
  attr_reader :telemetry
77
84
 
85
+ def combine_args(args, kwargs, target_self)
86
+ counter = 0
87
+ combined = args.each_with_object({}) do |value, c|
88
+ counter += 1
89
+ # Conversion to symbol is needed here to put args ahead of
90
+ # kwargs when they are merged below.
91
+ c[:"arg#{counter}"] = value
92
+ end.update(kwargs)
93
+ combined[:self] = target_self
94
+ combined
95
+ end
96
+
78
97
  # Serializes positional and keyword arguments to a method,
79
98
  # as obtained by a method probe.
80
99
  #
@@ -82,16 +101,14 @@ module Datadog
82
101
  # between positional and keyword arguments. We convert positional
83
102
  # arguments to keyword arguments ("arg1", "arg2", ...) and ensure
84
103
  # the positional arguments are listed first.
85
- def serialize_args(args, kwargs,
104
+ #
105
+ # Instance variables are technically a hash just like kwargs,
106
+ # we take them as a separate parameter to avoid a hash merge
107
+ # in upstream code.
108
+ def serialize_args(args, kwargs, target_self,
86
109
  depth: settings.dynamic_instrumentation.max_capture_depth,
87
110
  attribute_count: settings.dynamic_instrumentation.max_capture_attribute_count)
88
- counter = 0
89
- combined = args.each_with_object({}) do |value, c|
90
- counter += 1
91
- # Conversion to symbol is needed here to put args ahead of
92
- # kwargs when they are merged below.
93
- c[:"arg#{counter}"] = value
94
- end.update(kwargs)
111
+ combined = combine_args(args, kwargs, target_self)
95
112
  serialize_vars(combined, depth: depth, attribute_count: attribute_count)
96
113
  end
97
114
 
@@ -142,6 +159,8 @@ module Datadog
142
159
  end
143
160
 
144
161
  serialized = {type: class_name(cls)}
162
+ # https://github.com/soutaro/steep/issues/1860
163
+ # @type var serialized: untyped
145
164
  case value
146
165
  when NilClass
147
166
  serialized.update(isNull: true)
@@ -253,8 +272,120 @@ module Datadog
253
272
  end
254
273
  end
255
274
 
275
+ # This method is used for serializing arbitrary values into log messages.
276
+ # Because the output is meant to be human-readable, we cannot use
277
+ # the "normal" serialization format which is meant to be machine-readable.
278
+ # Serialize objects with depth of 1 and include the class name.
279
+ #
280
+ # Note that this method does not (currently) utilize the custom
281
+ # serializers that the "normal" serialization logic uses.
282
+ #
283
+ # This serializer differs from the RFC in two ways:
284
+ # 1. We omit the middle of long strings rather than the end,
285
+ # and also the inner entries in arrays/hashes/objects.
286
+ # 2. We use Ruby-ish syntax for hashes and objects.
287
+ #
288
+ # We also use the Ruby-like syntax for symbols, which don't exist
289
+ # in other languages.
290
+ def serialize_value_for_message(value, depth = 1)
291
+ # This method is more verbose than "normal" Ruby code to avoid
292
+ # array allocations.
293
+ case value
294
+ when NilClass
295
+ 'nil'
296
+ when Integer, Float, TrueClass, FalseClass, Time, Date
297
+ value.to_s
298
+ when String
299
+ serialize_string_or_symbol_for_message(value)
300
+ when Symbol
301
+ ':' + serialize_string_or_symbol_for_message(value)
302
+ when Array
303
+ return '...' if depth <= 0
304
+
305
+ max = max_capture_collection_size_for_message
306
+ if value.length > max
307
+ value_ = value[0...max - 1] || []
308
+ value_ << '...'
309
+ value_ << value[-1]
310
+ value = value_
311
+ end
312
+ '[' + value.map do |item|
313
+ serialize_value_for_message(item, depth - 1)
314
+ end.join(', ') + ']'
315
+ when Hash
316
+ return '...' if depth <= 0
317
+
318
+ max = max_capture_collection_size_for_message
319
+ keys = value.keys
320
+ truncated = false
321
+ if value.length > max
322
+ keys_ = keys[0...max - 1] || []
323
+ keys_ << keys[-1]
324
+ keys = keys_
325
+ truncated = true
326
+ end
327
+ serialized = keys.map do |key|
328
+ "#{serialize_value_for_message(key, depth - 1)} => #{serialize_value_for_message(value[key], depth - 1)}"
329
+ end
330
+ if truncated
331
+ serialized[serialized.length] = serialized[serialized.length - 1]
332
+ serialized[serialized.length - 2] = '...'
333
+ end
334
+ "{#{serialized.join(", ")}}"
335
+ else
336
+ return '...' if depth <= 0
337
+
338
+ vars = value.instance_variables
339
+ truncated = false
340
+ max = max_capture_attribute_count_for_message
341
+ if vars.length > max
342
+ vars_ = vars[0...max - 1] || []
343
+ vars_ << vars[-1]
344
+ truncated = true
345
+ vars = vars_
346
+ end
347
+ serialized = vars.map do |var|
348
+ # +var+ here is always the instance variable name which is a
349
+ # symbol, we do not need to run it through our serializer.
350
+ "#{var}=#{serialize_value_for_message(value.send(:instance_variable_get, var), depth - 1)}"
351
+ end
352
+ if truncated
353
+ serialized << serialized.last
354
+ serialized[-2] = '...'
355
+ end
356
+ serialized = if serialized.any?
357
+ ' ' + serialized.join(' ')
358
+ end
359
+ "#<#{class_name(value.class)}#{serialized}>"
360
+ end
361
+ rescue => exc
362
+ telemetry&.report(exc, description: "Error serializing for message")
363
+ # TODO class_name(foo) can also fail, which we don't handle here.
364
+ # Telemetry reporting could potentially also fail?
365
+ "#<#{class_name(value.class)}: serialization error>"
366
+ end
367
+
256
368
  private
257
369
 
370
+ MAX_MESSAGE_COLLECTION_SIZE = 3
371
+ MAX_MESSAGE_ATTRIBUTE_COUNT = 5
372
+
373
+ def max_capture_collection_size_for_message
374
+ max = settings.dynamic_instrumentation.max_capture_collection_size
375
+ if max > MAX_MESSAGE_COLLECTION_SIZE
376
+ max = MAX_MESSAGE_COLLECTION_SIZE
377
+ end
378
+ max
379
+ end
380
+
381
+ def max_capture_attribute_count_for_message
382
+ max = settings.dynamic_instrumentation.max_capture_attribute_count
383
+ if max > MAX_MESSAGE_ATTRIBUTE_COUNT
384
+ max = MAX_MESSAGE_ATTRIBUTE_COUNT
385
+ end
386
+ max
387
+ end
388
+
258
389
  # Returns the name for the specified class object.
259
390
  #
260
391
  # Ruby can have nameless classes, e.g. Class.new is a class object
@@ -265,6 +396,27 @@ module Datadog
265
396
  # and we don't want to invoke user code.
266
397
  cls.name || "[Unnamed class]"
267
398
  end
399
+
400
+ def serialize_string_or_symbol_for_message(value)
401
+ max = settings.dynamic_instrumentation.max_capture_string_length
402
+ if max > 100
403
+ max = 100
404
+ end
405
+ value = value.to_s
406
+ if (length = value.length) > max
407
+ if max < 5
408
+ value[0...max]
409
+ else
410
+ upper = length - max / 2 + 1
411
+ if max % 2 == 0
412
+ upper += 1
413
+ end
414
+ value[0...max / 2 - 1] + '...' + value[upper...length]
415
+ end
416
+ else
417
+ value
418
+ end
419
+ end
268
420
  end
269
421
  end
270
422
  end
@@ -15,12 +15,13 @@ module Datadog
15
15
  end
16
16
 
17
17
  class Transport
18
- attr_reader :client, :apis, :default_api, :current_api_id
18
+ attr_reader :client, :apis, :default_api, :current_api_id, :logger
19
19
 
20
- def initialize(apis, default_api)
20
+ def initialize(apis, default_api, logger:)
21
21
  @apis = apis
22
+ @logger = logger
22
23
 
23
- @client = HTTP::Client.new(current_api)
24
+ @client = HTTP::Client.new(current_api, logger: logger)
24
25
  end
25
26
 
26
27
  def current_api
@@ -21,13 +21,13 @@ module Datadog
21
21
 
22
22
  def defaults
23
23
  Datadog::Core::Transport::HTTP::API::Map[
24
- DIAGNOSTICS => Spec.new do |s|
24
+ DIAGNOSTICS => Diagnostics::API::Spec.new do |s|
25
25
  s.diagnostics = Diagnostics::API::Endpoint.new(
26
26
  '/debugger/v1/diagnostics',
27
27
  Core::Encoding::JSONEncoder,
28
28
  )
29
29
  end,
30
- INPUT => Spec.new do |s|
30
+ INPUT => Input::API::Spec.new do |s|
31
31
  s.input = Input::API::Endpoint.new(
32
32
  '/debugger/v1/input',
33
33
  Core::Encoding::JSONEncoder,
@@ -35,16 +35,6 @@ module Datadog
35
35
  end,
36
36
  ]
37
37
  end
38
-
39
- class Instance < Core::Transport::HTTP::API::Instance
40
- include Diagnostics::API::Instance
41
- include Input::API::Instance
42
- end
43
-
44
- class Spec < Core::Transport::HTTP::API::Spec
45
- include Diagnostics::API::Spec
46
- include Input::API::Spec
47
- end
48
38
  end
49
39
  end
50
40
  end
@@ -14,10 +14,11 @@ module Datadog
14
14
  module HTTP
15
15
  # Routes, encodes, and sends DI data to the trace agent via HTTP.
16
16
  class Client
17
- attr_reader :api
17
+ attr_reader :api, :logger
18
18
 
19
- def initialize(api)
19
+ def initialize(api, logger:)
20
20
  @api = api
21
+ @logger = logger
21
22
  end
22
23
 
23
24
  def send_request(request, &block)
@@ -31,7 +32,7 @@ module Datadog
31
32
  "Internal error during #{self.class.name} request. Cause: #{e.class.name} #{e.message} " \
32
33
  "Location: #{Array(e.backtrace).first}"
33
34
 
34
- Datadog.logger.debug(message)
35
+ logger.debug(message)
35
36
 
36
37
  Datadog::Core::Transport::InternalErrorResponse.new(e)
37
38
  end
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative '../../../core/transport/http/api/instance'
4
+ require_relative '../../../core/transport/http/api/spec'
3
5
  require_relative 'client'
4
6
 
5
7
  module Datadog
@@ -16,55 +18,26 @@ module Datadog
16
18
  end
17
19
 
18
20
  module API
19
- module Instance
21
+ class Instance < Core::Transport::HTTP::API::Instance
20
22
  def send_diagnostics(env)
21
- raise DiagnosticsNotSupportedError, spec unless spec.is_a?(Diagnostics::API::Spec)
23
+ raise Core::Transport::HTTP::API::Instance::EndpointNotSupportedError.new('diagnostics', self) unless spec.is_a?(Diagnostics::API::Spec)
22
24
 
23
25
  spec.send_diagnostics(env) do |request_env|
24
26
  call(request_env)
25
27
  end
26
28
  end
27
-
28
- class DiagnosticsNotSupportedError < StandardError
29
- attr_reader :spec
30
-
31
- def initialize(spec)
32
- super
33
-
34
- @spec = spec
35
- end
36
-
37
- def message
38
- 'Diagnostics not supported for this API!'
39
- end
40
- end
41
29
  end
42
30
 
43
- module Spec
31
+ class Spec < Core::Transport::HTTP::API::Spec
44
32
  attr_accessor :diagnostics
45
33
 
46
34
  def send_diagnostics(env, &block)
47
- raise NoDiagnosticsEndpointDefinedError, self if diagnostics.nil?
35
+ raise Core::Transport::HTTP::API::Spec::EndpointNotDefinedError.new('diagnostics', self) if diagnostics.nil?
48
36
 
49
37
  diagnostics.call(env, &block)
50
38
  end
51
-
52
- class NoDiagnosticsEndpointDefinedError < StandardError
53
- attr_reader :spec
54
-
55
- def initialize(spec)
56
- super
57
-
58
- @spec = spec
59
- end
60
-
61
- def message
62
- 'No diagnostics endpoint is defined for API specification!'
63
- end
64
- end
65
39
  end
66
40
 
67
- # Endpoint for negotiation
68
41
  class Endpoint < Datadog::Core::Transport::HTTP::API::Endpoint
69
42
  attr_reader :encoder
70
43
 
@@ -79,7 +52,7 @@ module Datadog
79
52
  )
80
53
  env.form = {'event' => event_payload}
81
54
 
82
- super(env, &block)
55
+ super
83
56
  end
84
57
  end
85
58
  end