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
+ 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_input(env)
21
- raise InputNotSupportedError, spec unless spec.is_a?(Input::API::Spec)
23
+ raise Core::Transport::HTTP::API::Instance::EndpointNotSupportedError.new('input', self) unless spec.is_a?(Input::API::Spec)
22
24
 
23
25
  spec.send_input(env) do |request_env|
24
26
  call(request_env)
25
27
  end
26
28
  end
27
-
28
- class InputNotSupportedError < StandardError
29
- attr_reader :spec
30
-
31
- def initialize(spec)
32
- super
33
-
34
- @spec = spec
35
- end
36
-
37
- def message
38
- 'Input 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 :input
45
33
 
46
34
  def send_input(env, &block)
47
- raise NoInputEndpointDefinedError, self if input.nil?
35
+ raise Core::Transport::HTTP::API::Spec::EndpointNotDefinedError.new('input', self) if input.nil?
48
36
 
49
37
  input.call(env, &block)
50
38
  end
51
-
52
- class NoInputEndpointDefinedError < StandardError
53
- attr_reader :spec
54
-
55
- def initialize(spec)
56
- super
57
-
58
- @spec = spec
59
- end
60
-
61
- def message
62
- 'No input 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
  HEADER_CONTENT_TYPE = 'Content-Type'
70
43
 
@@ -80,8 +53,18 @@ module Datadog
80
53
  # Encode body & type
81
54
  env.headers[HEADER_CONTENT_TYPE] = encoder.content_type
82
55
  env.body = env.request.parcel.data
83
-
84
- super(env, &block)
56
+ env.query = {
57
+ # DEV: In theory we could serialize the tags here
58
+ # rather than requiring them to be pre-serialized.
59
+ # In practice the tags should be relatively static
60
+ # (they would change when process forks, and hostname
61
+ # could change at any time but probably we should ignore
62
+ # those changes), therefore serializing the tags
63
+ # every time would be wasteful.
64
+ ddtags: env.request.serialized_tags,
65
+ }
66
+
67
+ super
85
68
  end
86
69
  end
87
70
  end
@@ -1,18 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'uri'
4
-
5
- require_relative '../../core/environment/container'
6
- require_relative '../../core/environment/ext'
7
- require_relative '../../core/transport/ext'
8
- require_relative '../../core/transport/http/adapters/net'
9
- require_relative '../../core/transport/http/adapters/test'
10
- require_relative '../../core/transport/http/adapters/unix_socket'
11
3
  require_relative 'diagnostics'
12
4
  require_relative 'input'
13
5
  require_relative 'http/api'
14
- require_relative '../../core/transport/http/builder'
15
- require_relative '../../../datadog/version'
6
+ require_relative '../../core/transport/http'
16
7
 
17
8
  module Datadog
18
9
  module DI
@@ -21,98 +12,45 @@ module Datadog
21
12
  module HTTP
22
13
  module_function
23
14
 
24
- # Builds a new Transport::HTTP::Client
25
- def new(klass, &block)
26
- Core::Transport::HTTP::Builder.new(
27
- api_instance_class: API::Instance, &block
28
- ).to_transport(klass)
29
- end
30
-
31
15
  # Builds a new Transport::HTTP::Client with default settings
32
16
  # Pass a block to override any settings.
33
17
  def diagnostics(
34
18
  agent_settings:,
35
- **options
19
+ logger:,
20
+ api_version: nil,
21
+ headers: nil
36
22
  )
37
- new(DI::Transport::Diagnostics::Transport) do |transport|
38
- transport.adapter(agent_settings)
39
- transport.headers default_headers
40
-
23
+ Core::Transport::HTTP.build(api_instance_class: Diagnostics::API::Instance,
24
+ logger: logger,
25
+ agent_settings: agent_settings, api_version: api_version, headers: headers) do |transport|
41
26
  apis = API.defaults
42
27
 
43
28
  transport.api API::DIAGNOSTICS, apis[API::DIAGNOSTICS]
44
29
 
45
- # Apply any settings given by options
46
- unless options.empty?
47
- transport.default_api = options[:api_version] if options.key?(:api_version)
48
- transport.headers options[:headers] if options.key?(:headers)
49
- end
50
-
51
30
  # Call block to apply any customization, if provided
52
31
  yield(transport) if block_given?
53
- end
32
+ end.to_transport(DI::Transport::Diagnostics::Transport)
54
33
  end
55
34
 
56
35
  # Builds a new Transport::HTTP::Client with default settings
57
36
  # Pass a block to override any settings.
58
37
  def input(
59
38
  agent_settings:,
60
- **options
39
+ logger:,
40
+ api_version: nil,
41
+ headers: nil
61
42
  )
62
- new(DI::Transport::Input::Transport) do |transport|
63
- transport.adapter(agent_settings)
64
- transport.headers default_headers
65
-
43
+ Core::Transport::HTTP.build(api_instance_class: Input::API::Instance,
44
+ logger: logger,
45
+ agent_settings: agent_settings, api_version: api_version, headers: headers) do |transport|
66
46
  apis = API.defaults
67
47
 
68
48
  transport.api API::INPUT, apis[API::INPUT]
69
49
 
70
- # Apply any settings given by options
71
- unless options.empty?
72
- transport.default_api = options[:api_version] if options.key?(:api_version)
73
- transport.headers options[:headers] if options.key?(:headers)
74
- end
75
-
76
50
  # Call block to apply any customization, if provided
77
51
  yield(transport) if block_given?
78
- end
52
+ end.to_transport(DI::Transport::Input::Transport)
79
53
  end
80
-
81
- def default_headers
82
- {
83
- Datadog::Core::Transport::Ext::HTTP::HEADER_CLIENT_COMPUTED_TOP_LEVEL => '1',
84
- Datadog::Core::Transport::Ext::HTTP::HEADER_META_LANG => Datadog::Core::Environment::Ext::LANG,
85
- Datadog::Core::Transport::Ext::HTTP::HEADER_META_LANG_VERSION => Datadog::Core::Environment::Ext::LANG_VERSION,
86
- Datadog::Core::Transport::Ext::HTTP::HEADER_META_LANG_INTERPRETER =>
87
- Datadog::Core::Environment::Ext::LANG_INTERPRETER,
88
- Datadog::Core::Transport::Ext::HTTP::HEADER_META_LANG_INTERPRETER_VENDOR => Core::Environment::Ext::LANG_ENGINE,
89
- Datadog::Core::Transport::Ext::HTTP::HEADER_META_TRACER_VERSION =>
90
- Datadog::Core::Environment::Ext::GEM_DATADOG_VERSION
91
- }.tap do |headers|
92
- # Add container ID, if present.
93
- container_id = Datadog::Core::Environment::Container.container_id
94
- headers[Datadog::Core::Transport::Ext::HTTP::HEADER_CONTAINER_ID] = container_id unless container_id.nil?
95
- # Pretend that stats computation are already done by the client
96
- if Datadog.configuration.appsec.standalone.enabled
97
- headers[Datadog::Core::Transport::Ext::HTTP::HEADER_CLIENT_COMPUTED_STATS] = 'yes'
98
- end
99
- end
100
- end
101
-
102
- def default_adapter
103
- Datadog::Core::Configuration::Ext::Agent::HTTP::ADAPTER
104
- end
105
-
106
- # Add adapters to registry
107
- Datadog::Core::Transport::HTTP::Builder::REGISTRY.set(
108
- Datadog::Core::Transport::HTTP::Adapters::Net,
109
- Datadog::Core::Configuration::Ext::Agent::HTTP::ADAPTER
110
- )
111
- Datadog::Core::Transport::HTTP::Builder::REGISTRY.set(Datadog::Core::Transport::HTTP::Adapters::Test, Datadog::Core::Transport::Ext::Test::ADAPTER)
112
- Datadog::Core::Transport::HTTP::Builder::REGISTRY.set(
113
- Datadog::Core::Transport::HTTP::Adapters::UnixSocket,
114
- Datadog::Core::Transport::Ext::UnixSocket::ADAPTER
115
- )
116
54
  end
117
55
  end
118
56
  end
@@ -12,25 +12,34 @@ module Datadog
12
12
  end
13
13
 
14
14
  class Request < Datadog::Core::Transport::Request
15
+ attr_reader :serialized_tags
16
+
17
+ def initialize(parcel, serialized_tags)
18
+ super(parcel)
19
+
20
+ @serialized_tags = serialized_tags
21
+ end
15
22
  end
16
23
 
17
24
  class Transport
18
- attr_reader :client, :apis, :default_api, :current_api_id
25
+ attr_reader :client, :apis, :default_api, :current_api_id, :logger
19
26
 
20
- def initialize(apis, default_api)
27
+ def initialize(apis, default_api, logger:)
21
28
  @apis = apis
29
+ @logger = logger
22
30
 
23
- @client = HTTP::Client.new(current_api)
31
+ @client = HTTP::Client.new(current_api, logger: logger)
24
32
  end
25
33
 
26
34
  def current_api
27
35
  @apis[HTTP::API::INPUT]
28
36
  end
29
37
 
30
- def send_input(payload)
38
+ def send_input(payload, tags)
31
39
  json = JSON.dump(payload)
32
40
  parcel = EncodedParcel.new(json)
33
- request = Request.new(parcel)
41
+ serialized_tags = Core::TagBuilder.serialize_tags(tags)
42
+ request = Request.new(parcel, serialized_tags)
34
43
 
35
44
  response = @client.send_input_payload(request)
36
45
  unless response.ok?
@@ -1,5 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # standard gets itself into an infinite loop over this
4
+ # rubocop:disable Layout/SpaceAfterNot
5
+
3
6
  module Datadog
4
7
  module DI
5
8
  module Utils
@@ -135,3 +138,5 @@ module Datadog
135
138
  end
136
139
  end
137
140
  end
141
+
142
+ # rubocop:enable Layout/SpaceAfterNot
data/lib/datadog/di.rb CHANGED
@@ -1,24 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'di/logger'
4
- require_relative 'di/base'
5
- require_relative 'di/error'
6
- require_relative 'di/code_tracker'
7
- require_relative 'di/component'
8
3
  require_relative 'di/configuration'
9
4
  require_relative 'di/extensions'
10
- require_relative 'di/instrumenter'
11
- require_relative 'di/probe'
12
- require_relative 'di/probe_builder'
13
- require_relative 'di/probe_manager'
14
- require_relative 'di/probe_notification_builder'
15
- require_relative 'di/probe_notifier_worker'
16
- require_relative 'di/redactor'
17
5
  require_relative 'di/remote'
18
- require_relative 'di/serializer'
19
- #require_relative 'di/transport'
20
- require_relative 'di/transport/http'
21
- require_relative 'di/utils'
22
6
 
23
7
  module Datadog
24
8
  # Namespace for Datadog dynamic instrumentation.
@@ -35,7 +19,6 @@ module Datadog
35
19
  Extensions.activate!
36
20
 
37
21
  class << self
38
-
39
22
  # This method is called from DI Remote handler to issue DI operations
40
23
  # to the probe manager (add or remove probes).
41
24
  #
@@ -51,20 +34,3 @@ module Datadog
51
34
  end
52
35
  end
53
36
  end
54
-
55
- if %w(1 true).include?(ENV['DD_DYNAMIC_INSTRUMENTATION_ENABLED']) # steep:ignore
56
- # For initial release of Dynamic Instrumentation, activate code tracking
57
- # only if DI is explicitly requested in the environment.
58
- # Code tracking is required for line probes to work; see the comments
59
- # above for the implementation of the method.
60
- #
61
- # If DI is enabled programmatically, the application can (and must,
62
- # for line probes to work) activate tracking in an initializer.
63
- # We seem to have Datadog.logger here already
64
- Datadog.logger.debug("di: activating code tracking")
65
- Datadog::DI.activate_tracking
66
- end
67
-
68
- require_relative 'di/contrib'
69
-
70
- Datadog::DI::Contrib.load_now_or_later
@@ -0,0 +1,87 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'ext'
4
+
5
+ module Datadog
6
+ module ErrorTracking
7
+ # The Collector is in charge, for a SpanOperation of storing the span events
8
+ # created when an error is handled. Each SpanOperation has a Collector as soon
9
+ # as a span event is created and the Collector has the same life time as the SpanOp.
10
+ #
11
+ # If an error is handled then rethrown, the SpanEvent corresponding to the error
12
+ # will be deleted. That is why we do not add directly the SpanEvent to the SpanOp.
13
+ #
14
+ # @api private
15
+ class Collector
16
+ SPAN_EVENTS_LIMIT = 100
17
+ LOCK = Mutex.new
18
+ # Proc called when the span_operation :after_stop event is published
19
+ def self.after_stop
20
+ @after_stop ||= proc do |span_op, error|
21
+ # if this proc is called, we are sure that span_op has a collector
22
+ collector = span_op.get_collector_or_initialize
23
+ # if an error exited the scope of the span, we delete the corresponding SpanEvent.
24
+ collector.on_error(span_op, error) if error
25
+
26
+ span_events = collector.span_events
27
+ span_op.span_events.concat(span_events)
28
+ end
29
+ end
30
+
31
+ def initialize
32
+ @span_event_per_error = {}
33
+ end
34
+
35
+ def add_span_event(span_op, span_event, error)
36
+ # When this is the first time we add a span event for a span,
37
+ # we suscribe to the :after_stop event
38
+ if @span_event_per_error.empty?
39
+ events = span_op.send(:events)
40
+ events.after_stop.subscribe(&self.class.after_stop)
41
+
42
+ # This tag is used by the Error Tracking product to report
43
+ # the error in Error Tracking
44
+ span_op.set_tag(Ext::SPAN_EVENTS_HAS_EXCEPTION, true)
45
+ end
46
+ # Set a limit to the number of span event we can store per SpanOp
47
+ # If an error has been handled several times in the same span we can still
48
+ # modify the event (even if the capacity is reached) in order to report
49
+ # the information of the last rescue
50
+ if @span_event_per_error.key?(error) || @span_event_per_error.length < SPAN_EVENTS_LIMIT
51
+ @span_event_per_error[error] = span_event
52
+ end
53
+ end
54
+
55
+ if RUBY_VERSION >= Ext::RUBY_VERSION_WITH_RESCUE_EVENT
56
+ # Starting from ruby3.3, as we are listening to :rescue event,
57
+ # we just want to remove the span event if the error was
58
+ # previously handled
59
+ def on_error(_span_op, error)
60
+ @span_event_per_error.delete(error)
61
+ end
62
+ else
63
+ # Up to ruby3.2, we are listening to :raise event. We need to ensure
64
+ # that an error exiting the scope of a span is not handled in a parent span.
65
+ # This function will propagate the span event to the parent span. If the
66
+ # error is not handled in the parent span, it will be deleted by design.
67
+ def on_error(span_op, error)
68
+ return unless @span_event_per_error.key?(error)
69
+
70
+ unless span_op.root?
71
+ parent = span_op.send(:parent)
72
+ LOCK.synchronize do
73
+ parent_collector = parent.get_collector_or_initialize { Collector.new }
74
+ parent_collector.add_span_event(parent, @span_event_per_error[error], error)
75
+ end
76
+ end
77
+
78
+ @span_event_per_error.delete(error)
79
+ end
80
+ end
81
+
82
+ def span_events
83
+ @span_event_per_error.values
84
+ end
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,167 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'set'
4
+ require_relative 'collector'
5
+ require_relative 'filters'
6
+
7
+ module Datadog
8
+ module ErrorTracking
9
+ # Component for Error Tracking.
10
+ #
11
+ # Only one instance of the Component should ever be active.
12
+ #
13
+ # The component instance records every handled exceptions from the configured scopes
14
+ # (user, third_party packages, specified files or everything).
15
+ class Component
16
+ LOCK = Mutex.new
17
+
18
+ class << self
19
+ def build(settings, tracer, logger)
20
+ return if !settings.respond_to?(:error_tracking) || (settings.error_tracking.handled_errors.nil? &&
21
+ settings.error_tracking.handled_errors_include.empty?)
22
+
23
+ return unless environment_supported?(logger)
24
+
25
+ new(
26
+ tracer: tracer,
27
+ handled_errors: settings.error_tracking.handled_errors,
28
+ handled_errors_include: settings.error_tracking.handled_errors_include,
29
+ ).tap(&:start)
30
+ end
31
+
32
+ def environment_supported?(logger)
33
+ if RUBY_ENGINE != 'ruby'
34
+ logger.warn("error tracking: cannot enable error tracking: MRI is required, but running on #{RUBY_ENGINE}")
35
+ false
36
+ elsif RUBY_VERSION < '2.7'
37
+ logger.warn(
38
+ "error tracking: cannot enable error tracking: Ruby 2.7+ is required, but running
39
+ on #{RUBY_VERSION}"
40
+ )
41
+ false
42
+ else
43
+ true
44
+ end
45
+ end
46
+ end
47
+
48
+ def initialize(tracer:, handled_errors:, handled_errors_include:)
49
+ @tracer = tracer
50
+
51
+ # Hash containing the paths to the instrumented files
52
+ @instrumented_files = Set.new unless handled_errors_include.empty?
53
+ # Array containing file paths, file names and gems names to instrument.
54
+ # This is coming from the DD_ERROR_TRACKING_HANDLED_ERRORS_INCLUDE env variable
55
+ @handled_errors_include = handled_errors_include
56
+
57
+ # Filter function is used to filter out the exception
58
+ # we do not want to report. For instance exception from gems.
59
+ @filter_function = Filters.generate_filter(handled_errors, @instrumented_files)
60
+
61
+ # :rescue event was added in Ruby 3.3
62
+ #
63
+ # Before Ruby3.3 the TracePoint listen for :raise events.
64
+ # If an error is not handled, we will delete the according
65
+ # span event in the collector.
66
+ event = (RUBY_VERSION >= '3.3') ? :rescue : :raise
67
+
68
+ # This TracePoint is in charge of capturing the handled exceptions
69
+ # and of adding the corresponding span events to the collector
70
+ @handled_exc_tracker = create_exc_tracker_trace_point(event)
71
+
72
+ if @instrumented_files
73
+ # The only thing we know about the handled errors is the path of the file
74
+ # in which the error was rescued. Therefore, we need to retrieve the path
75
+ # of the files the user want to instrument. This TracePoint is used for that
76
+ # purpose
77
+ @include_path_getter = create_script_compiled_trace_point
78
+ end
79
+ end
80
+
81
+ def create_exc_tracker_trace_point(event)
82
+ TracePoint.new(event) do |tp|
83
+ active_span = @tracer.active_span
84
+ if active_span
85
+ raised_exception = tp.raised_exception
86
+ # Note that in 3.2, this will give the path of where the error was raised
87
+ # which may cause the handled_error_include env variable to malfunction.
88
+ rescue_file_path = tp.path
89
+ if @filter_function.call(rescue_file_path)
90
+ span_event = generate_span_event(raised_exception)
91
+ LOCK.synchronize do
92
+ collector = active_span.get_collector_or_initialize { Collector.new }
93
+ collector.add_span_event(active_span, span_event, raised_exception)
94
+ end
95
+ end
96
+ end
97
+ end
98
+ end
99
+
100
+ def create_script_compiled_trace_point
101
+ TracePoint.new(:script_compiled) do |tp|
102
+ next if tp.eval_script
103
+
104
+ path = tp.instruction_sequence.path
105
+ next if path.nil?
106
+
107
+ @handled_errors_include.each do |file_to_instr|
108
+ # The user can provide either
109
+ # - absolute_path starting with '/'. In that case the path of the file
110
+ # should begin with file_to_instr
111
+ # - a relative_path starting with './'. In that case, we extend the path
112
+ # and it is the same as above
113
+ # - otherwise we just check if the name provided is in the path and is
114
+ # either the name of a folder or of a ruby file.
115
+ regex =
116
+ if file_to_instr.start_with?('/')
117
+ %r{\A#{Regexp.escape(file_to_instr)}(?:/|\.rb\z|\z)}
118
+ elsif file_to_instr.start_with?('./')
119
+ abs_path = File.expand_path(file_to_instr)
120
+ %r{\A#{Regexp.escape(abs_path)}(?:/|\.rb\z|\z)}
121
+ else
122
+ %r{/#{Regexp.escape(file_to_instr)}(?:/|\.rb\z|\z)}
123
+ end
124
+
125
+ add_instrumented_file(path) if path.match?(regex)
126
+ end
127
+ end
128
+ end
129
+
130
+ # Starts the TracePoints.
131
+ #
132
+ # Enables the script_compiled TracePoint if handled_errors_include is not empty.
133
+ def start
134
+ @handled_exc_tracker.enable
135
+ @include_path_getter&.enable
136
+ end
137
+
138
+ # Shuts down error tracker.
139
+ #
140
+ # Disables the TracePoints.
141
+ def shutdown!
142
+ @handled_exc_tracker.disable
143
+ @include_path_getter&.disable
144
+ end
145
+
146
+ private
147
+
148
+ # Generates a span event from the exception info.
149
+ #
150
+ # The event follows the otel semantics.
151
+ # https://opentelemetry.io/docs/specs/otel/trace/exceptions/
152
+ def generate_span_event(exception)
153
+ formatted_exception = Datadog::Core::Error.build_from(exception)
154
+ attributes = {
155
+ 'exception.type' => formatted_exception.type,
156
+ 'exception.message' => formatted_exception.message,
157
+ 'exception.stacktrace' => formatted_exception.backtrace
158
+ }
159
+ Datadog::Tracing::SpanEvent.new('exception', attributes: attributes)
160
+ end
161
+
162
+ def add_instrumented_file(file_path)
163
+ @instrumented_files&.add(file_path)
164
+ end
165
+ end
166
+ end
167
+ end
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../ext'
4
+
5
+ module Datadog
6
+ module ErrorTracking
7
+ module Configuration
8
+ # Settings
9
+ module Settings
10
+ def self.extended(base)
11
+ base = base.singleton_class unless base.is_a?(Class)
12
+ add_settings!(base)
13
+ end
14
+
15
+ def self.add_settings!(base)
16
+ base.class_eval do
17
+ # Error Tracking specific configurations.
18
+ # @public_api
19
+ settings :error_tracking do
20
+ # Enable automatic reporting of handled errors and defines the scope
21
+ # for which to report errors: user code, gems, or both. Possible
22
+ # values are: all | user | third_party.
23
+ #
24
+ # @default 'DD_ERROR_TRACKING_HANDLED_ERRORS' environment variable, otherwise `nil`
25
+ # @return [String, nil]
26
+ option :handled_errors do |o|
27
+ o.type :string, nilable: true
28
+ o.default Ext::DEFAULT_HANDLED_ERRORS
29
+ o.env Ext::ENV_HANDLED_ERRORS
30
+ o.setter do |value|
31
+ next value if Ext::VALID_HANDLED_ERRORS.include?(value)
32
+
33
+ unless value.nil?
34
+ Datadog.logger.warn(
35
+ "Invalid handled errors scope: #{value}. " \
36
+ "Supported values are: #{Ext::VALID_HANDLED_ERRORS.join(" | ")}. " \
37
+ 'Deactivating the feature.'
38
+ )
39
+ end
40
+
41
+ Ext::DEFAULT_HANDLED_ERRORS
42
+ end
43
+ end
44
+
45
+ # Enable automatic reporting of handled errors and specify what files should be
46
+ # instrumented. The value is a list of comma separated paths, filenames or gem names.
47
+ # The paths can be absolute, starting with '/' or relative to directory in which the program
48
+ # is launched, starting with './'.
49
+ #
50
+ # @default 'DD_ERROR_TRACKING_HANDLED_ERRORS_MODULES' environment variable, otherwise `nil`
51
+ # @return [String, nil]
52
+ option :handled_errors_include do |o|
53
+ o.type :array
54
+ o.default []
55
+ o.env Ext::ENV_HANDLED_ERRORS_INCLUDE
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Datadog
4
+ module ErrorTracking
5
+ # Configuration for ErrorTracking
6
+ module Configuration
7
+ end
8
+ end
9
+ end
10
+
11
+ require_relative 'configuration/settings'
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Datadog
4
+ module ErrorTracking
5
+ # Error Tracking constants
6
+ module Ext
7
+ ENV_HANDLED_ERRORS = 'DD_ERROR_TRACKING_HANDLED_ERRORS'
8
+ ENV_HANDLED_ERRORS_INCLUDE = 'DD_ERROR_TRACKING_HANDLED_ERRORS_INCLUDE'
9
+ HANDLED_ERRORS_ALL = 'all'
10
+ HANDLED_ERRORS_USER = 'user'
11
+ HANDLED_ERRORS_THIRD_PARTY = 'third_party'
12
+ DEFAULT_HANDLED_ERRORS = nil
13
+ VALID_HANDLED_ERRORS = [HANDLED_ERRORS_ALL, HANDLED_ERRORS_USER, HANDLED_ERRORS_THIRD_PARTY].freeze
14
+ SPAN_EVENTS_HAS_EXCEPTION = '_dd.span_events.has_exception'
15
+ RUBY_VERSION_WITH_RESCUE_EVENT = '3.3'
16
+ end
17
+ end
18
+ end