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,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative '../../configuration/agent_settings_resolver'
3
+ require_relative '../../configuration/agent_settings'
4
4
  require_relative 'adapters/registry'
5
5
  require_relative 'api/map'
6
6
 
@@ -18,9 +18,10 @@ module Datadog
18
18
  :api_options,
19
19
  :default_adapter,
20
20
  :default_api,
21
- :default_headers
21
+ :default_headers,
22
+ :logger
22
23
 
23
- def initialize(api_instance_class:)
24
+ def initialize(api_instance_class:, logger: Datadog.logger)
24
25
  # Global settings
25
26
  @default_adapter = nil
26
27
  @default_headers = {}
@@ -33,25 +34,26 @@ module Datadog
33
34
  @api_options = {}
34
35
 
35
36
  @api_instance_class = api_instance_class
37
+ @logger = logger
36
38
 
37
39
  yield(self) if block_given?
38
40
  end
39
41
 
40
42
  def adapter(config, *args, **kwargs)
41
43
  @default_adapter = case config
42
- when Core::Configuration::AgentSettingsResolver::AgentSettings
43
- registry_klass = REGISTRY.get(config.adapter)
44
- raise UnknownAdapterError, config.adapter if registry_klass.nil?
45
-
46
- registry_klass.build(config)
47
- when Symbol
48
- registry_klass = REGISTRY.get(config)
49
- raise UnknownAdapterError, config if registry_klass.nil?
50
-
51
- registry_klass.new(*args, **kwargs)
52
- else
53
- config
54
- end
44
+ when Core::Configuration::AgentSettings
45
+ registry_klass = REGISTRY.get(config.adapter)
46
+ raise UnknownAdapterError, config.adapter if registry_klass.nil?
47
+
48
+ registry_klass.build(config)
49
+ when Symbol
50
+ registry_klass = REGISTRY.get(config)
51
+ raise UnknownAdapterError, config if registry_klass.nil?
52
+
53
+ registry_klass.new(*args, **kwargs)
54
+ else
55
+ config
56
+ end
55
57
  end
56
58
 
57
59
  def headers(values = {})
@@ -86,7 +88,7 @@ module Datadog
86
88
  def to_transport(klass)
87
89
  raise NoDefaultApiError if @default_api.nil?
88
90
 
89
- klass.new(to_api_instances, @default_api)
91
+ klass.new(to_api_instances, @default_api, logger: logger)
90
92
  end
91
93
 
92
94
  def to_api_instances
@@ -32,6 +32,14 @@ module Datadog
32
32
  self[:path] = value
33
33
  end
34
34
 
35
+ def query
36
+ self[:query]
37
+ end
38
+
39
+ def query=(value)
40
+ self[:query] = value
41
+ end
42
+
35
43
  def body
36
44
  self[:body]
37
45
  end
@@ -0,0 +1,75 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'http/builder'
4
+ require_relative 'http/adapters/net'
5
+ require_relative 'http/adapters/unix_socket'
6
+ require_relative 'http/adapters/test'
7
+
8
+ module Datadog
9
+ module Core
10
+ module Transport
11
+ # HTTP transport
12
+ module HTTP
13
+ # Add adapters to registry
14
+ Builder::REGISTRY.set(
15
+ Transport::HTTP::Adapters::Net,
16
+ Core::Configuration::Ext::Agent::HTTP::ADAPTER
17
+ )
18
+ Builder::REGISTRY.set(
19
+ Transport::HTTP::Adapters::Test,
20
+ Transport::Ext::Test::ADAPTER
21
+ )
22
+ Builder::REGISTRY.set(
23
+ Transport::HTTP::Adapters::UnixSocket,
24
+ Transport::Ext::UnixSocket::ADAPTER
25
+ )
26
+
27
+ module_function
28
+
29
+ # Helper function that delegates to Builder.new
30
+ # but is under HTTP namespace so that client code requires this file
31
+ # to get the adapters configured, and not the builder directly.
32
+ def build(api_instance_class:, agent_settings:, logger: Datadog.logger, api_version: nil, headers: nil, &block)
33
+ Builder.new(api_instance_class: api_instance_class, logger: logger) do |transport|
34
+ transport.adapter(agent_settings)
35
+ transport.headers(default_headers)
36
+
37
+ # The caller must define APIs before we set the default API.
38
+ yield transport
39
+
40
+ # Apply any settings given by options
41
+ transport.default_api = api_version if api_version
42
+ transport.headers(headers) if headers
43
+ end
44
+ end
45
+
46
+ def default_headers
47
+ {
48
+ Datadog::Core::Transport::Ext::HTTP::HEADER_CLIENT_COMPUTED_TOP_LEVEL => '1',
49
+ Datadog::Core::Transport::Ext::HTTP::HEADER_META_LANG =>
50
+ Datadog::Core::Environment::Ext::LANG,
51
+ Datadog::Core::Transport::Ext::HTTP::HEADER_META_LANG_VERSION =>
52
+ Datadog::Core::Environment::Ext::LANG_VERSION,
53
+ Datadog::Core::Transport::Ext::HTTP::HEADER_META_LANG_INTERPRETER =>
54
+ Datadog::Core::Environment::Ext::LANG_INTERPRETER,
55
+ Datadog::Core::Transport::Ext::HTTP::HEADER_META_LANG_INTERPRETER_VENDOR =>
56
+ Core::Environment::Ext::LANG_ENGINE,
57
+ Datadog::Core::Transport::Ext::HTTP::HEADER_META_TRACER_VERSION =>
58
+ Datadog::Core::Environment::Ext::GEM_DATADOG_VERSION
59
+ }.tap do |headers|
60
+ # Add container ID, if present.
61
+ if (container_id = Datadog::Core::Environment::Container.container_id)
62
+ headers[Datadog::Core::Transport::Ext::HTTP::HEADER_CONTAINER_ID] = container_id
63
+ end
64
+ # TODO: inject configuration rather than reading from global here
65
+ unless Datadog.configuration.apm.tracing.enabled
66
+ # Sending this header to the agent will disable metrics computation (and billing) on the agent side
67
+ # by pretending it has already been done on the library side.
68
+ headers[Datadog::Core::Transport::Ext::HTTP::HEADER_CLIENT_COMPUTED_STATS] = 'yes'
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
@@ -34,7 +34,10 @@ module Datadog
34
34
  end
35
35
 
36
36
  def inspect
37
- "#{self.class} ok?:#{ok?} unsupported?:#{unsupported?}, " \
37
+ maybe_code = if respond_to?(:code)
38
+ " code:#{code}," # steep:ignore
39
+ end
40
+ "#{self.class} ok?:#{ok?},#{maybe_code} unsupported?:#{unsupported?}, " \
38
41
  "not_found?:#{not_found?}, client_error?:#{client_error?}, " \
39
42
  "server_error?:#{server_error?}, internal_error?:#{internal_error?}, " \
40
43
  "payload:#{payload}"
@@ -51,13 +51,13 @@ module Datadog
51
51
  def fork
52
52
  # If a block is provided, it must be wrapped to trigger callbacks.
53
53
  child_block = if block_given?
54
- proc do
55
- AtForkMonkeyPatch.run_at_fork_blocks(:child)
54
+ proc do
55
+ AtForkMonkeyPatch.run_at_fork_blocks(:child)
56
56
 
57
- # Invoke original block
58
- yield
59
- end
60
- end
57
+ # Invoke original block
58
+ yield
59
+ end
60
+ end
61
61
 
62
62
  # Start fork
63
63
  # If a block is provided, use the wrapped version.
@@ -7,42 +7,42 @@ module Datadog
7
7
  module Duration
8
8
  def self.call(value, base: :s)
9
9
  cast = if value.include?('.')
10
- method(:Float)
11
- else
12
- method(:Integer)
13
- end
10
+ method(:Float)
11
+ else
12
+ method(:Integer)
13
+ end
14
14
 
15
15
  scale = case base
16
- when :s
17
- 1_000_000_000
18
- when :ms
19
- 1_000_000
20
- when :us
21
- 1000
22
- when :ns
23
- 1
24
- else
25
- raise ArgumentError, "invalid base: #{base.inspect}"
26
- end
16
+ when :s
17
+ 1_000_000_000
18
+ when :ms
19
+ 1_000_000
20
+ when :us
21
+ 1000
22
+ when :ns
23
+ 1
24
+ else
25
+ raise ArgumentError, "invalid base: #{base.inspect}"
26
+ end
27
27
 
28
28
  result = case value
29
- when /^(\d+(?:\.\d+)?)h$/
30
- cast.call(Regexp.last_match(1)) * 1_000_000_000 * 60 * 60 / scale
31
- when /^(\d+(?:\.\d+)?)m$/
32
- cast.call(Regexp.last_match(1)) * 1_000_000_000 * 60 / scale
33
- when /^(\d+(?:\.\d+)?)s$/
34
- cast.call(Regexp.last_match(1)) * 1_000_000_000 / scale
35
- when /^(\d+(?:\.\d+)?)ms$/
36
- cast.call(Regexp.last_match(1)) * 1_000_000 / scale
37
- when /^(\d+(?:\.\d+)?)us$/
38
- cast.call(Regexp.last_match(1)) * 1_000 / scale
39
- when /^(\d+(?:\.\d+)?)ns$/
40
- cast.call(Regexp.last_match(1)) / scale
41
- when /^(\d+(?:\.\d+)?)$/
42
- cast.call(Regexp.last_match(1))
43
- else
44
- raise ArgumentError, "invalid duration: #{value.inspect}"
45
- end
29
+ when /^(\d+(?:\.\d+)?)h$/
30
+ cast.call(Regexp.last_match(1)) * 1_000_000_000 * 60 * 60 / scale
31
+ when /^(\d+(?:\.\d+)?)m$/
32
+ cast.call(Regexp.last_match(1)) * 1_000_000_000 * 60 / scale
33
+ when /^(\d+(?:\.\d+)?)s$/
34
+ cast.call(Regexp.last_match(1)) * 1_000_000_000 / scale
35
+ when /^(\d+(?:\.\d+)?)ms$/
36
+ cast.call(Regexp.last_match(1)) * 1_000_000 / scale
37
+ when /^(\d+(?:\.\d+)?)us$/
38
+ cast.call(Regexp.last_match(1)) * 1_000 / scale
39
+ when /^(\d+(?:\.\d+)?)ns$/
40
+ cast.call(Regexp.last_match(1)) / scale
41
+ when /^(\d+(?:\.\d+)?)$/
42
+ cast.call(Regexp.last_match(1))
43
+ else
44
+ raise ArgumentError, "invalid duration: #{value.inspect}"
45
+ end
46
46
  # @type var result: Numeric
47
47
  result.round
48
48
  end
@@ -47,12 +47,12 @@ module Datadog
47
47
  # This wrapper prevents this by initializing the fork PID when the object is created.
48
48
  if RUBY_VERSION >= '3'
49
49
  def initialize(*args, **kwargs, &block)
50
- super(*args, **kwargs, &block)
50
+ super
51
51
  update_fork_pid!
52
52
  end
53
53
  else
54
54
  def initialize(*args, &block)
55
- super(*args, &block)
55
+ super
56
56
  update_fork_pid!
57
57
  end
58
58
  end
@@ -13,6 +13,7 @@ module Datadog
13
13
  true-client-ip
14
14
  x-client-ip
15
15
  x-forwarded
16
+ forwarded
16
17
  forwarded-for
17
18
  x-cluster-client-ip
18
19
  fastly-client-ip
@@ -32,7 +33,7 @@ module Datadog
32
33
  def stripped_ip_from_request_headers(headers, ip_headers_to_check: DEFAULT_IP_HEADERS_NAMES)
33
34
  ip = ip_header(headers, ip_headers_to_check)
34
35
 
35
- ip ? ip.to_s : nil
36
+ ip&.to_s
36
37
  end
37
38
 
38
39
  # @param [String] IP value.
@@ -40,7 +41,7 @@ module Datadog
40
41
  # @return [nil] when no valid IP value found.
41
42
  def stripped_ip(ip)
42
43
  ip = ip_to_ipaddr(ip)
43
- ip ? ip.to_s : nil
44
+ ip&.to_s
44
45
  end
45
46
 
46
47
  private
@@ -52,10 +53,10 @@ module Datadog
52
53
  return unless ip
53
54
 
54
55
  clean_ip = if likely_ipv4?(ip)
55
- strip_ipv4_port(ip)
56
- else
57
- strip_zone_specifier(strip_ipv6_port(ip))
58
- end
56
+ strip_ipv4_port(ip)
57
+ else
58
+ strip_zone_specifier(strip_ipv6_port(ip))
59
+ end
59
60
 
60
61
  begin
61
62
  IPAddr.new(clean_ip)
@@ -73,6 +74,8 @@ module Datadog
73
74
  next unless value
74
75
 
75
76
  ips = value.split(',')
77
+ ips = process_forwarded_header_values(ips) if name == 'forwarded'
78
+
76
79
  ips.each do |ip|
77
80
  parsed_ip = ip_to_ipaddr(ip.strip)
78
81
 
@@ -83,6 +86,22 @@ module Datadog
83
86
  nil
84
87
  end
85
88
 
89
+ def process_forwarded_header_values(values)
90
+ values.each_with_object([]) do |value, acc|
91
+ value.downcase!
92
+
93
+ value.split(';').each do |tuple_str|
94
+ tuple_str.strip!
95
+ next unless tuple_str.start_with?('for=')
96
+
97
+ tuple_str.delete_prefix!('for=')
98
+ tuple_str.delete!('"')
99
+
100
+ acc << tuple_str
101
+ end
102
+ end
103
+ end
104
+
86
105
  # Returns whether the given value is more likely to be an IPv4 than an IPv6 address.
87
106
  #
88
107
  # This is done by checking if a dot (`'.'`) character appears before a colon (`':'`) in the value.
@@ -5,14 +5,25 @@ require_relative 'only_once'
5
5
  module Datadog
6
6
  module Core
7
7
  module Utils
8
- # Helper class to execute something with only one success.
8
+ # Helper class to execute something with only one successful execution.
9
9
  #
10
- # This is useful for cases where we want to ensure that a block of code is only executed once, and only if it
11
- # succeeds. One such example is sending app-started telemetry event.
10
+ # If limit is not provided to the constructor, +run+ will execute the
11
+ # block an unlimited number of times until the block indicates that it
12
+ # executed successfully by returning a truthy value. After a block
13
+ # executes successfully, subsequent +run+ calls will not invoke the
14
+ # block.
12
15
  #
13
- # Successful execution is determined by the return value of the block: any truthy value is considered success.
16
+ # If a non-zero limit is provided to the constructor, +run+ will
17
+ # execute the block up to that many times, and will mark the instance
18
+ # of OnlyOneSuccessful as failed if none of the executions succeeded.
14
19
  #
15
- # Thread-safe when used correctly (e.g. be careful of races when lazily initializing instances of this class).
20
+ # One consumer of this class is sending the app-started telemetry event.
21
+ #
22
+ # Successful execution is determined by the return value of the block:
23
+ # any truthy value is considered success.
24
+ #
25
+ # This class is thread-safe (however, instances of it must also be
26
+ # created in a thread-safe manner).
16
27
  #
17
28
  # Note: In its current state, this class is not Ractor-safe.
18
29
  # In https://github.com/DataDog/dd-trace-rb/pull/1398#issuecomment-797378810 we have a discussion of alternatives,
@@ -31,6 +31,16 @@ module Datadog
31
31
  #
32
32
  # @param block [Proc] block that returns a `Time` object representing the current wall time
33
33
  def now_provider=(block)
34
+ class << self
35
+ # Avoid method redefinition warning.
36
+ # `rescue nil` is added in case customers remove the method
37
+ # themselves to squelch the warning.
38
+ begin
39
+ remove_method(:now)
40
+ rescue
41
+ nil
42
+ end
43
+ end
34
44
  define_singleton_method(:now, &block)
35
45
  end
36
46
 
@@ -43,6 +53,16 @@ module Datadog
43
53
  #
44
54
  # @param block [Proc] block that accepts unit and returns timestamp in the requested unit
45
55
  def get_time_provider=(block)
56
+ class << self
57
+ # Avoid method redefinition warning
58
+ # `rescue nil` is added in case customers remove the method
59
+ # themselves to squelch the warning.
60
+ begin
61
+ remove_method(:get_time)
62
+ rescue
63
+ nil
64
+ end
65
+ end
46
66
  define_singleton_method(:get_time, &block)
47
67
  end
48
68
 
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Datadog
4
+ module Core
5
+ module Utils
6
+ # Helper methods for truncating data
7
+ module Truncation
8
+ module_function
9
+
10
+ def truncate_in_middle(string, max_prefix_length, max_suffix_length)
11
+ max_length = max_prefix_length + 3 + max_suffix_length
12
+ if string.length > max_length
13
+ "#{string[0...max_prefix_length]}...#{string[-max_suffix_length..-1]}"
14
+ else
15
+ string
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -66,6 +66,13 @@ module Datadog
66
66
  placeholder
67
67
  end
68
68
 
69
+ def self.encode_tags(hash)
70
+ # Make sure everything is an utf-8 string, to avoid encoding issues in downstream
71
+ hash.each_with_object({}) do |(key, value), h|
72
+ h[utf8_encode(key)] = utf8_encode(value)
73
+ end
74
+ end
75
+
69
76
  # @!visibility private
70
77
  def self.without_warnings
71
78
  # This is typically used when monkey patching functions such as
@@ -108,7 +108,7 @@ module Datadog
108
108
  end
109
109
 
110
110
  def respond_to?(meth, include_all = false)
111
- @io.respond_to?(meth, include_all) || super(meth, include_all)
111
+ @io.respond_to?(meth, include_all) || super
112
112
  end
113
113
  end
114
114
  end
@@ -28,29 +28,29 @@ module Datadog
28
28
  "--#{SecureRandom.uuid}"
29
29
  end
30
30
 
31
- def initialize(path, params, headers={}, boundary = Multipartable.secure_boundary)
31
+ def initialize(path, params, headers = {}, boundary = Multipartable.secure_boundary)
32
32
  headers = headers.clone # don't want to modify the original variable
33
33
  parts_headers = headers.delete(:parts) || {}
34
34
  super(path, headers)
35
- parts = params.map do |k,v|
35
+ parts = params.map do |k, v|
36
36
  case v
37
37
  when Array
38
- v.map {|item| Parts::Part.new(boundary, "#{k}[]", item, parts_headers[k]) }
38
+ v.map { |item| Parts::Part.new(boundary, "#{k}[]", item, parts_headers[k]) }
39
39
  else
40
40
  Parts::Part.new(boundary, k, v, parts_headers[k])
41
41
  end
42
42
  end.flatten
43
43
  parts << Parts::EpiloguePart.new(boundary)
44
- ios = parts.map {|p| p.to_io }
45
- self.set_content_type(headers["Content-Type"] || "multipart/form-data",
46
- { "boundary" => boundary })
47
- self.content_length = parts.inject(0) {|sum,i| sum + i.length }
44
+ ios = parts.map { |p| p.to_io }
45
+ set_content_type(headers["Content-Type"] || "multipart/form-data",
46
+ {"boundary" => boundary})
47
+ self.content_length = parts.inject(0) { |sum, i| sum + i.length }
48
48
  self.body_stream = CompositeReadIO.new(*ios)
49
49
 
50
50
  @boundary = boundary
51
51
  end
52
52
 
53
- attr :boundary
53
+ attr_reader :boundary
54
54
  end
55
55
  end
56
56
  end
@@ -58,7 +58,7 @@ module Datadog
58
58
  part = ''
59
59
  part << "--#{boundary}\r\n"
60
60
  part << "Content-ID: #{headers["Content-ID"]}\r\n" if headers["Content-ID"]
61
- part << "Content-Disposition: form-data; name=\"#{name.to_s}\"\r\n"
61
+ part << "Content-Disposition: form-data; name=\"#{name}\"\r\n"
62
62
  part << "Content-Type: #{headers["Content-Type"]}\r\n" if headers["Content-Type"]
63
63
  part << "\r\n"
64
64
  part << "#{value}\r\n"
@@ -76,9 +76,9 @@ module Datadog
76
76
  # @param io [IO]
77
77
  # @param headers [Hash]
78
78
  def initialize(boundary, name, io, headers = {})
79
- file_length = io.respond_to?(:length) ? io.length : File.size(io.local_path)
79
+ file_length = io.respond_to?(:length) ? io.length : File.size(io.local_path)
80
80
  @head = build_head(boundary, name, io.original_filename, io.content_type, file_length,
81
- io.respond_to?(:opts) ? io.opts.merge(headers) : headers)
81
+ io.respond_to?(:opts) ? io.opts.merge(headers) : headers)
82
82
  @foot = "\r\n"
83
83
  @length = @head.bytesize + file_length + @foot.length
84
84
  @io = CompositeReadIO.new(StringIO.new(@head), io, StringIO.new(@foot))
@@ -98,16 +98,16 @@ module Datadog
98
98
 
99
99
  part = ''
100
100
  part << "--#{boundary}\r\n"
101
- part << "Content-Disposition: #{content_disposition}; name=\"#{name.to_s}\"; filename=\"#{filename}\"\r\n"
101
+ part << "Content-Disposition: #{content_disposition}; name=\"#{name}\"; filename=\"#{filename}\"\r\n"
102
102
  part << "Content-Length: #{content_len}\r\n"
103
103
  if content_id = opts.delete("Content-ID")
104
104
  part << "Content-ID: #{content_id}\r\n"
105
105
  end
106
106
 
107
- if opts["Content-Type"] != nil
108
- part << "Content-Type: " + opts["Content-Type"] + "\r\n"
107
+ part << if !opts["Content-Type"].nil?
108
+ "Content-Type: " + opts["Content-Type"] + "\r\n"
109
109
  else
110
- part << "Content-Type: #{type}\r\n"
110
+ "Content-Type: #{type}\r\n"
111
111
  end
112
112
 
113
113
  part << "Content-Transfer-Encoding: #{trans_encoding}\r\n"
@@ -12,7 +12,7 @@ module Datadog
12
12
  end
13
13
 
14
14
  def perform(*args)
15
- task.call(*args) unless task.nil?
15
+ task&.call(*args)
16
16
  end
17
17
 
18
18
  protected
@@ -47,6 +47,14 @@ module Datadog
47
47
  @run_async = false
48
48
  Datadog.logger.debug { "Forcibly terminating worker thread for: #{self}" }
49
49
  worker.terminate
50
+ # Wait for the worker thread to end
51
+ begin
52
+ Timeout.timeout(SHUTDOWN_TIMEOUT) do
53
+ worker.join
54
+ end
55
+ rescue Timeout::Error
56
+ Datadog.logger.debug { "Worker thread did not end after #{SHUTDOWN_TIMEOUT} seconds: #{self}" }
57
+ end
50
58
  true
51
59
  end
52
60
 
@@ -112,23 +120,33 @@ module Datadog
112
120
  @worker ||= nil
113
121
  end
114
122
 
123
+ # Returns true if worker thread is successfully started,
124
+ # false if it is not started. Reasons for not starting the worker
125
+ # thread: it is already running, or the process forked and fork
126
+ # policy is to stop the workers on fork (which means they are
127
+ # not started in children, really).
115
128
  def start_async(&block)
116
129
  mutex.synchronize do
117
- return if running?
130
+ return false if running?
118
131
 
119
132
  if forked?
120
133
  case fork_policy
121
134
  when FORK_POLICY_STOP
122
135
  stop_fork
136
+ false
123
137
  when FORK_POLICY_RESTART
138
+ # restart_after_fork should return true
124
139
  restart_after_fork(&block)
125
140
  end
126
141
  elsif !run_async?
142
+ # start_worker should return true
127
143
  start_worker(&block)
128
144
  end
129
145
  end
130
146
  end
131
147
 
148
+ # Returns true if worker thread is successfully started,
149
+ # which should generally be always.
132
150
  def start_worker
133
151
  @run_async = true
134
152
  @pid = Process.pid
@@ -136,22 +154,21 @@ module Datadog
136
154
  Datadog.logger.debug { "Starting thread for: #{self}" }
137
155
 
138
156
  @worker = ::Thread.new do
139
- begin
140
- yield
141
- # rubocop:disable Lint/RescueException
142
- rescue Exception => e
143
- @error = e
144
- Datadog.logger.debug(
145
- "Worker thread error. Cause: #{e.class.name} #{e.message} Location: #{Array(e.backtrace).first}"
146
- )
147
- raise
148
- end
157
+ yield
158
+ # rubocop:disable Lint/RescueException
159
+ rescue Exception => e
160
+ @error = e
161
+ Datadog.logger.debug(
162
+ "Worker thread error. Cause: #{e.class.name} #{e.message} Location: #{Array(e.backtrace).first}"
163
+ )
164
+ raise
165
+
149
166
  # rubocop:enable Lint/RescueException
150
167
  end
151
168
  @worker.name = self.class.name
152
169
  @worker.thread_variable_set(:fork_safe, true)
153
170
 
154
- nil
171
+ true
155
172
  end
156
173
 
157
174
  def stop_fork