datadog 2.12.1 → 2.19.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 (346) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +243 -2
  3. data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +63 -56
  4. data/ext/datadog_profiling_native_extension/collectors_stack.c +263 -76
  5. data/ext/datadog_profiling_native_extension/collectors_stack.h +20 -3
  6. data/ext/datadog_profiling_native_extension/collectors_thread_context.c +78 -26
  7. data/ext/datadog_profiling_native_extension/collectors_thread_context.h +1 -0
  8. data/ext/datadog_profiling_native_extension/datadog_ruby_common.c +1 -4
  9. data/ext/datadog_profiling_native_extension/datadog_ruby_common.h +10 -0
  10. data/ext/datadog_profiling_native_extension/encoded_profile.c +79 -0
  11. data/ext/datadog_profiling_native_extension/encoded_profile.h +8 -0
  12. data/ext/datadog_profiling_native_extension/extconf.rb +10 -0
  13. data/ext/datadog_profiling_native_extension/heap_recorder.c +247 -364
  14. data/ext/datadog_profiling_native_extension/heap_recorder.h +4 -6
  15. data/ext/datadog_profiling_native_extension/http_transport.c +60 -94
  16. data/ext/datadog_profiling_native_extension/libdatadog_helpers.c +22 -0
  17. data/ext/datadog_profiling_native_extension/libdatadog_helpers.h +8 -5
  18. data/ext/datadog_profiling_native_extension/private_vm_api_access.c +41 -21
  19. data/ext/datadog_profiling_native_extension/private_vm_api_access.h +6 -4
  20. data/ext/datadog_profiling_native_extension/profiling.c +2 -0
  21. data/ext/datadog_profiling_native_extension/ruby_helpers.c +1 -13
  22. data/ext/datadog_profiling_native_extension/ruby_helpers.h +3 -11
  23. data/ext/datadog_profiling_native_extension/stack_recorder.c +173 -76
  24. data/ext/libdatadog_api/crashtracker.c +11 -12
  25. data/ext/libdatadog_api/crashtracker.h +5 -0
  26. data/ext/libdatadog_api/datadog_ruby_common.c +1 -4
  27. data/ext/libdatadog_api/datadog_ruby_common.h +10 -0
  28. data/ext/libdatadog_api/extconf.rb +2 -2
  29. data/ext/libdatadog_api/init.c +15 -0
  30. data/ext/libdatadog_api/library_config.c +164 -0
  31. data/ext/libdatadog_api/library_config.h +25 -0
  32. data/ext/libdatadog_api/macos_development.md +3 -3
  33. data/ext/libdatadog_api/process_discovery.c +112 -0
  34. data/ext/libdatadog_api/process_discovery.h +5 -0
  35. data/ext/libdatadog_extconf_helpers.rb +2 -2
  36. data/lib/datadog/appsec/actions_handler/serializable_backtrace.rb +89 -0
  37. data/lib/datadog/appsec/actions_handler.rb +24 -2
  38. data/lib/datadog/appsec/anonymizer.rb +16 -0
  39. data/lib/datadog/appsec/api_security/lru_cache.rb +56 -0
  40. data/lib/datadog/appsec/api_security/route_extractor.rb +71 -0
  41. data/lib/datadog/appsec/api_security/sampler.rb +59 -0
  42. data/lib/datadog/appsec/api_security.rb +23 -0
  43. data/lib/datadog/appsec/assets/waf_rules/README.md +50 -5
  44. data/lib/datadog/appsec/assets/waf_rules/recommended.json +257 -85
  45. data/lib/datadog/appsec/assets/waf_rules/strict.json +10 -78
  46. data/lib/datadog/appsec/autoload.rb +1 -1
  47. data/lib/datadog/appsec/component.rb +46 -61
  48. data/lib/datadog/appsec/compressed_json.rb +40 -0
  49. data/lib/datadog/appsec/configuration/settings.rb +153 -30
  50. data/lib/datadog/appsec/context.rb +7 -7
  51. data/lib/datadog/appsec/contrib/active_record/instrumentation.rb +10 -12
  52. data/lib/datadog/appsec/contrib/active_record/integration.rb +2 -2
  53. data/lib/datadog/appsec/contrib/active_record/patcher.rb +22 -22
  54. data/lib/datadog/appsec/contrib/auto_instrument.rb +1 -1
  55. data/lib/datadog/appsec/contrib/devise/configuration.rb +7 -31
  56. data/lib/datadog/appsec/contrib/devise/data_extractor.rb +78 -0
  57. data/lib/datadog/appsec/contrib/devise/ext.rb +22 -0
  58. data/lib/datadog/appsec/contrib/devise/integration.rb +1 -2
  59. data/lib/datadog/appsec/contrib/devise/patcher.rb +34 -23
  60. data/lib/datadog/appsec/contrib/devise/patches/signin_tracking_patch.rb +102 -0
  61. data/lib/datadog/appsec/contrib/devise/patches/signup_tracking_patch.rb +69 -0
  62. data/lib/datadog/appsec/contrib/devise/{patcher/rememberable_patch.rb → patches/skip_signin_tracking_patch.rb} +2 -2
  63. data/lib/datadog/appsec/contrib/devise/tracking_middleware.rb +106 -0
  64. data/lib/datadog/appsec/contrib/excon/integration.rb +1 -1
  65. data/lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb +9 -10
  66. data/lib/datadog/appsec/contrib/faraday/integration.rb +1 -1
  67. data/lib/datadog/appsec/contrib/faraday/ssrf_detection_middleware.rb +8 -9
  68. data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +8 -9
  69. data/lib/datadog/appsec/contrib/graphql/integration.rb +1 -1
  70. data/lib/datadog/appsec/contrib/rack/ext.rb +34 -0
  71. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +49 -32
  72. data/lib/datadog/appsec/contrib/rack/integration.rb +1 -1
  73. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +42 -30
  74. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +11 -13
  75. data/lib/datadog/appsec/contrib/rails/integration.rb +1 -1
  76. data/lib/datadog/appsec/contrib/rails/patcher.rb +21 -21
  77. data/lib/datadog/appsec/contrib/rest_client/integration.rb +1 -1
  78. data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +10 -11
  79. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +17 -23
  80. data/lib/datadog/appsec/contrib/sinatra/integration.rb +1 -1
  81. data/lib/datadog/appsec/event.rb +96 -135
  82. data/lib/datadog/appsec/ext.rb +4 -2
  83. data/lib/datadog/appsec/instrumentation/gateway/argument.rb +7 -2
  84. data/lib/datadog/appsec/instrumentation/gateway/middleware.rb +24 -0
  85. data/lib/datadog/appsec/instrumentation/gateway.rb +17 -22
  86. data/lib/datadog/appsec/metrics/telemetry.rb +1 -1
  87. data/lib/datadog/appsec/monitor/gateway/watcher.rb +49 -14
  88. data/lib/datadog/appsec/processor/rule_loader.rb +30 -33
  89. data/lib/datadog/appsec/remote.rb +31 -59
  90. data/lib/datadog/appsec/response.rb +6 -6
  91. data/lib/datadog/appsec/security_engine/engine.rb +194 -0
  92. data/lib/datadog/appsec/security_engine/runner.rb +13 -14
  93. data/lib/datadog/appsec/security_event.rb +39 -0
  94. data/lib/datadog/appsec/utils.rb +0 -2
  95. data/lib/datadog/appsec.rb +5 -8
  96. data/lib/datadog/core/buffer/random.rb +18 -2
  97. data/lib/datadog/core/configuration/agent_settings.rb +52 -0
  98. data/lib/datadog/core/configuration/agent_settings_resolver.rb +4 -46
  99. data/lib/datadog/core/configuration/agentless_settings_resolver.rb +176 -0
  100. data/lib/datadog/core/configuration/components.rb +48 -31
  101. data/lib/datadog/core/configuration/components_state.rb +23 -0
  102. data/lib/datadog/core/configuration/ext.rb +4 -0
  103. data/lib/datadog/core/configuration/option.rb +81 -45
  104. data/lib/datadog/core/configuration/option_definition.rb +4 -4
  105. data/lib/datadog/core/configuration/options.rb +3 -3
  106. data/lib/datadog/core/configuration/settings.rb +109 -44
  107. data/lib/datadog/core/configuration/stable_config.rb +22 -0
  108. data/lib/datadog/core/configuration.rb +40 -16
  109. data/lib/datadog/core/crashtracking/component.rb +3 -10
  110. data/lib/datadog/core/crashtracking/tag_builder.rb +4 -22
  111. data/lib/datadog/core/diagnostics/environment_logger.rb +1 -1
  112. data/lib/datadog/core/encoding.rb +1 -1
  113. data/lib/datadog/core/environment/agent_info.rb +4 -3
  114. data/lib/datadog/core/environment/cgroup.rb +10 -12
  115. data/lib/datadog/core/environment/container.rb +38 -40
  116. data/lib/datadog/core/environment/ext.rb +6 -6
  117. data/lib/datadog/core/environment/git.rb +1 -0
  118. data/lib/datadog/core/environment/identity.rb +3 -3
  119. data/lib/datadog/core/environment/platform.rb +3 -3
  120. data/lib/datadog/core/environment/variable_helpers.rb +1 -1
  121. data/lib/datadog/core/error.rb +11 -9
  122. data/lib/datadog/core/logger.rb +2 -2
  123. data/lib/datadog/core/metrics/client.rb +20 -21
  124. data/lib/datadog/core/metrics/logging.rb +5 -5
  125. data/lib/datadog/core/process_discovery/tracer_memfd.rb +15 -0
  126. data/lib/datadog/core/process_discovery.rb +36 -0
  127. data/lib/datadog/core/rate_limiter.rb +4 -2
  128. data/lib/datadog/core/remote/client.rb +40 -32
  129. data/lib/datadog/core/remote/component.rb +6 -9
  130. data/lib/datadog/core/remote/configuration/digest.rb +7 -7
  131. data/lib/datadog/core/remote/configuration/path.rb +1 -1
  132. data/lib/datadog/core/remote/configuration/repository.rb +14 -1
  133. data/lib/datadog/core/remote/negotiation.rb +9 -9
  134. data/lib/datadog/core/remote/transport/config.rb +4 -3
  135. data/lib/datadog/core/remote/transport/http/client.rb +5 -4
  136. data/lib/datadog/core/remote/transport/http/config.rb +27 -37
  137. data/lib/datadog/core/remote/transport/http/negotiation.rb +7 -33
  138. data/lib/datadog/core/remote/transport/http.rb +22 -57
  139. data/lib/datadog/core/remote/transport/negotiation.rb +4 -3
  140. data/lib/datadog/core/runtime/metrics.rb +12 -5
  141. data/lib/datadog/core/tag_builder.rb +56 -0
  142. data/lib/datadog/core/telemetry/component.rb +81 -52
  143. data/lib/datadog/core/telemetry/emitter.rb +23 -11
  144. data/lib/datadog/core/telemetry/event/app_client_configuration_change.rb +66 -0
  145. data/lib/datadog/core/telemetry/event/app_closing.rb +18 -0
  146. data/lib/datadog/core/telemetry/event/app_dependencies_loaded.rb +33 -0
  147. data/lib/datadog/core/telemetry/event/app_heartbeat.rb +18 -0
  148. data/lib/datadog/core/telemetry/event/app_integrations_change.rb +58 -0
  149. data/lib/datadog/core/telemetry/event/app_started.rb +287 -0
  150. data/lib/datadog/core/telemetry/event/base.rb +40 -0
  151. data/lib/datadog/core/telemetry/event/distributions.rb +18 -0
  152. data/lib/datadog/core/telemetry/event/generate_metrics.rb +43 -0
  153. data/lib/datadog/core/telemetry/event/log.rb +76 -0
  154. data/lib/datadog/core/telemetry/event/message_batch.rb +42 -0
  155. data/lib/datadog/core/telemetry/event/synth_app_client_configuration_change.rb +43 -0
  156. data/lib/datadog/core/telemetry/event.rb +17 -472
  157. data/lib/datadog/core/telemetry/http/adapters/net.rb +12 -97
  158. data/lib/datadog/core/telemetry/logger.rb +5 -4
  159. data/lib/datadog/core/telemetry/logging.rb +11 -5
  160. data/lib/datadog/core/telemetry/metric.rb +8 -8
  161. data/lib/datadog/core/telemetry/request.rb +4 -4
  162. data/lib/datadog/core/telemetry/transport/http/api.rb +43 -0
  163. data/lib/datadog/core/telemetry/transport/http/client.rb +49 -0
  164. data/lib/datadog/core/telemetry/transport/http/telemetry.rb +92 -0
  165. data/lib/datadog/core/telemetry/transport/http.rb +63 -0
  166. data/lib/datadog/core/telemetry/transport/telemetry.rb +51 -0
  167. data/lib/datadog/core/telemetry/worker.rb +90 -24
  168. data/lib/datadog/core/transport/http/adapters/net.rb +17 -2
  169. data/lib/datadog/core/transport/http/adapters/test.rb +2 -1
  170. data/lib/datadog/core/transport/http/api/instance.rb +17 -0
  171. data/lib/datadog/core/transport/http/api/spec.rb +17 -0
  172. data/lib/datadog/core/transport/http/builder.rb +19 -17
  173. data/lib/datadog/core/transport/http/env.rb +8 -0
  174. data/lib/datadog/core/transport/http.rb +39 -2
  175. data/lib/datadog/core/utils/at_fork_monkey_patch.rb +6 -6
  176. data/lib/datadog/core/utils/duration.rb +32 -32
  177. data/lib/datadog/core/utils/forking.rb +2 -2
  178. data/lib/datadog/core/utils/network.rb +6 -6
  179. data/lib/datadog/core/utils/only_once_successful.rb +16 -5
  180. data/lib/datadog/core/utils/time.rb +20 -0
  181. data/lib/datadog/core/utils/truncation.rb +21 -0
  182. data/lib/datadog/core/utils.rb +7 -0
  183. data/lib/datadog/core/vendor/multipart-post/multipart/post/composite_read_io.rb +1 -1
  184. data/lib/datadog/core/vendor/multipart-post/multipart/post/multipartable.rb +8 -8
  185. data/lib/datadog/core/vendor/multipart-post/multipart/post/parts.rb +7 -7
  186. data/lib/datadog/core/worker.rb +1 -1
  187. data/lib/datadog/core/workers/async.rb +29 -12
  188. data/lib/datadog/core/workers/interval_loop.rb +12 -1
  189. data/lib/datadog/core/workers/runtime_metrics.rb +2 -2
  190. data/lib/datadog/core.rb +8 -0
  191. data/lib/datadog/di/boot.rb +34 -0
  192. data/lib/datadog/di/component.rb +0 -2
  193. data/lib/datadog/di/instrumenter.rb +48 -5
  194. data/lib/datadog/di/probe_notification_builder.rb +38 -43
  195. data/lib/datadog/di/probe_notifier_worker.rb +25 -17
  196. data/lib/datadog/di/remote.rb +2 -0
  197. data/lib/datadog/di/serializer.rb +10 -2
  198. data/lib/datadog/di/transport/diagnostics.rb +4 -3
  199. data/lib/datadog/di/transport/http/api.rb +2 -12
  200. data/lib/datadog/di/transport/http/client.rb +4 -3
  201. data/lib/datadog/di/transport/http/diagnostics.rb +7 -34
  202. data/lib/datadog/di/transport/http/input.rb +18 -35
  203. data/lib/datadog/di/transport/http.rb +14 -62
  204. data/lib/datadog/di/transport/input.rb +14 -5
  205. data/lib/datadog/di/utils.rb +5 -0
  206. data/lib/datadog/di.rb +0 -33
  207. data/lib/datadog/error_tracking/collector.rb +87 -0
  208. data/lib/datadog/error_tracking/component.rb +167 -0
  209. data/lib/datadog/error_tracking/configuration/settings.rb +63 -0
  210. data/lib/datadog/error_tracking/configuration.rb +11 -0
  211. data/lib/datadog/error_tracking/ext.rb +18 -0
  212. data/lib/datadog/error_tracking/extensions.rb +16 -0
  213. data/lib/datadog/error_tracking/filters.rb +77 -0
  214. data/lib/datadog/error_tracking.rb +18 -0
  215. data/lib/datadog/kit/appsec/events/v2.rb +195 -0
  216. data/lib/datadog/kit/appsec/events.rb +12 -0
  217. data/lib/datadog/kit/identity.rb +5 -1
  218. data/lib/datadog/opentelemetry/api/baggage.rb +90 -0
  219. data/lib/datadog/opentelemetry/api/baggage.rbs +26 -0
  220. data/lib/datadog/opentelemetry/api/context.rb +16 -2
  221. data/lib/datadog/opentelemetry/sdk/trace/span.rb +1 -1
  222. data/lib/datadog/opentelemetry.rb +2 -1
  223. data/lib/datadog/profiling/collectors/code_provenance.rb +18 -9
  224. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +6 -0
  225. data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +1 -0
  226. data/lib/datadog/profiling/collectors/info.rb +44 -0
  227. data/lib/datadog/profiling/collectors/thread_context.rb +17 -2
  228. data/lib/datadog/profiling/component.rb +8 -9
  229. data/lib/datadog/profiling/encoded_profile.rb +11 -0
  230. data/lib/datadog/profiling/exporter.rb +12 -7
  231. data/lib/datadog/profiling/ext.rb +0 -14
  232. data/lib/datadog/profiling/flush.rb +5 -8
  233. data/lib/datadog/profiling/http_transport.rb +7 -61
  234. data/lib/datadog/profiling/profiler.rb +2 -0
  235. data/lib/datadog/profiling/scheduler.rb +10 -2
  236. data/lib/datadog/profiling/sequence_tracker.rb +44 -0
  237. data/lib/datadog/profiling/stack_recorder.rb +9 -9
  238. data/lib/datadog/profiling/tag_builder.rb +7 -41
  239. data/lib/datadog/profiling/tasks/setup.rb +2 -0
  240. data/lib/datadog/profiling.rb +7 -2
  241. data/lib/datadog/single_step_instrument.rb +9 -0
  242. data/lib/datadog/tracing/analytics.rb +1 -1
  243. data/lib/datadog/tracing/component.rb +15 -12
  244. data/lib/datadog/tracing/configuration/ext.rb +7 -1
  245. data/lib/datadog/tracing/configuration/settings.rb +18 -2
  246. data/lib/datadog/tracing/context_provider.rb +1 -1
  247. data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +15 -0
  248. data/lib/datadog/tracing/contrib/action_pack/action_dispatch/instrumentation.rb +19 -12
  249. data/lib/datadog/tracing/contrib/action_pack/ext.rb +2 -0
  250. data/lib/datadog/tracing/contrib/active_record/integration.rb +1 -1
  251. data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +11 -2
  252. data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +33 -0
  253. data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +4 -0
  254. data/lib/datadog/tracing/contrib/active_support/cache/redis.rb +2 -4
  255. data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +13 -0
  256. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +10 -0
  257. data/lib/datadog/tracing/contrib/aws/parsed_context.rb +5 -1
  258. data/lib/datadog/tracing/contrib/configuration/settings.rb +1 -1
  259. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +4 -5
  260. data/lib/datadog/tracing/contrib/excon/middleware.rb +5 -3
  261. data/lib/datadog/tracing/contrib/ext.rb +1 -0
  262. data/lib/datadog/tracing/contrib/faraday/middleware.rb +5 -3
  263. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +7 -1
  264. data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +3 -0
  265. data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +0 -15
  266. data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +4 -1
  267. data/lib/datadog/tracing/contrib/http/instrumentation.rb +6 -10
  268. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +6 -16
  269. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +7 -15
  270. data/lib/datadog/tracing/contrib/karafka/configuration/settings.rb +27 -0
  271. data/lib/datadog/tracing/contrib/karafka/distributed/propagation.rb +48 -0
  272. data/lib/datadog/tracing/contrib/karafka/ext.rb +27 -0
  273. data/lib/datadog/tracing/contrib/karafka/integration.rb +45 -0
  274. data/lib/datadog/tracing/contrib/karafka/monitor.rb +66 -0
  275. data/lib/datadog/tracing/contrib/karafka/patcher.rb +71 -0
  276. data/lib/datadog/tracing/contrib/karafka.rb +37 -0
  277. data/lib/datadog/tracing/contrib/lograge/patcher.rb +4 -2
  278. data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +8 -0
  279. data/lib/datadog/tracing/contrib/mongodb/ext.rb +1 -0
  280. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +18 -1
  281. data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +16 -6
  282. data/lib/datadog/tracing/contrib/opensearch/configuration/settings.rb +17 -0
  283. data/lib/datadog/tracing/contrib/opensearch/ext.rb +9 -0
  284. data/lib/datadog/tracing/contrib/opensearch/patcher.rb +5 -1
  285. data/lib/datadog/tracing/contrib/patcher.rb +5 -2
  286. data/lib/datadog/tracing/contrib/rack/request_queue.rb +1 -1
  287. data/lib/datadog/tracing/contrib/rails/patcher.rb +4 -1
  288. data/lib/datadog/tracing/contrib/rails/runner.rb +61 -40
  289. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +5 -3
  290. data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +6 -1
  291. data/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb +3 -0
  292. data/lib/datadog/tracing/contrib/sidekiq/ext.rb +1 -0
  293. data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +5 -2
  294. data/lib/datadog/tracing/contrib/support.rb +28 -0
  295. data/lib/datadog/tracing/contrib.rb +1 -0
  296. data/lib/datadog/tracing/correlation.rb +9 -2
  297. data/lib/datadog/tracing/diagnostics/environment_logger.rb +3 -1
  298. data/lib/datadog/tracing/distributed/b3_multi.rb +1 -1
  299. data/lib/datadog/tracing/distributed/b3_single.rb +1 -1
  300. data/lib/datadog/tracing/distributed/baggage.rb +131 -0
  301. data/lib/datadog/tracing/distributed/datadog.rb +4 -2
  302. data/lib/datadog/tracing/distributed/propagation.rb +25 -4
  303. data/lib/datadog/tracing/distributed/propagation_policy.rb +42 -0
  304. data/lib/datadog/tracing/metadata/errors.rb +4 -4
  305. data/lib/datadog/tracing/metadata/ext.rb +5 -0
  306. data/lib/datadog/tracing/metadata/metastruct.rb +36 -0
  307. data/lib/datadog/tracing/metadata/metastruct_tagging.rb +42 -0
  308. data/lib/datadog/tracing/metadata.rb +2 -0
  309. data/lib/datadog/tracing/sampling/rate_sampler.rb +2 -1
  310. data/lib/datadog/tracing/sampling/span/rule.rb +0 -1
  311. data/lib/datadog/tracing/span.rb +10 -1
  312. data/lib/datadog/tracing/span_event.rb +2 -2
  313. data/lib/datadog/tracing/span_operation.rb +68 -16
  314. data/lib/datadog/tracing/sync_writer.rb +2 -3
  315. data/lib/datadog/tracing/trace_digest.rb +9 -2
  316. data/lib/datadog/tracing/trace_operation.rb +55 -27
  317. data/lib/datadog/tracing/trace_segment.rb +6 -4
  318. data/lib/datadog/tracing/tracer.rb +51 -7
  319. data/lib/datadog/tracing/transport/http/api.rb +2 -10
  320. data/lib/datadog/tracing/transport/http/client.rb +5 -4
  321. data/lib/datadog/tracing/transport/http/traces.rb +13 -41
  322. data/lib/datadog/tracing/transport/http.rb +11 -44
  323. data/lib/datadog/tracing/transport/serializable_trace.rb +3 -1
  324. data/lib/datadog/tracing/transport/trace_formatter.rb +7 -0
  325. data/lib/datadog/tracing/transport/traces.rb +26 -9
  326. data/lib/datadog/tracing/utils.rb +1 -1
  327. data/lib/datadog/tracing/workers/trace_writer.rb +2 -6
  328. data/lib/datadog/tracing/writer.rb +2 -6
  329. data/lib/datadog/tracing.rb +16 -3
  330. data/lib/datadog/version.rb +2 -2
  331. data/lib/datadog.rb +8 -2
  332. metadata +88 -23
  333. data/lib/datadog/appsec/assets/waf_rules/processors.json +0 -92
  334. data/lib/datadog/appsec/assets/waf_rules/scanners.json +0 -114
  335. data/lib/datadog/appsec/contrib/devise/event.rb +0 -54
  336. data/lib/datadog/appsec/contrib/devise/patcher/authenticatable_patch.rb +0 -72
  337. data/lib/datadog/appsec/contrib/devise/patcher/registration_controller_patch.rb +0 -47
  338. data/lib/datadog/appsec/contrib/devise/resource.rb +0 -35
  339. data/lib/datadog/appsec/contrib/devise/tracking.rb +0 -57
  340. data/lib/datadog/appsec/processor/rule_merger.rb +0 -170
  341. data/lib/datadog/appsec/processor.rb +0 -107
  342. data/lib/datadog/appsec/utils/trace_operation.rb +0 -15
  343. data/lib/datadog/core/telemetry/http/env.rb +0 -20
  344. data/lib/datadog/core/telemetry/http/ext.rb +0 -28
  345. data/lib/datadog/core/telemetry/http/response.rb +0 -70
  346. data/lib/datadog/core/telemetry/http/transport.rb +0 -90
@@ -52,6 +52,17 @@ module Datadog
52
52
  # (however, Probe instances can be replaced by OpenStruct instances
53
53
  # providing the same interface with not much effort).
54
54
  #
55
+ # Instrumenter (this class) is responsible for building snapshots.
56
+ # This is because to capture values on method entry, those values need to
57
+ # be duplicated or serialized into immutable values to prevent their
58
+ # modification by the instrumented method. Therefore this class must
59
+ # do at least some serialization/snapshot building and to keep the code
60
+ # well-encapsulated, all serialization/snapshot building should thus be
61
+ # initiated from this class rather than downstream code.
62
+ #
63
+ # As a consequence of Instrumenter building snapshots, it should not
64
+ # expose TracePoint objects to any downstream code.
65
+ #
55
66
  # @api private
56
67
  class Instrumenter
57
68
  def initialize(settings, serializer, logger, code_tracker: nil, telemetry: nil)
@@ -110,8 +121,8 @@ module Datadog
110
121
  if rate_limiter.nil? || rate_limiter.allow?
111
122
  # Arguments may be mutated by the method, therefore
112
123
  # they need to be serialized prior to method invocation.
113
- entry_args = if probe.capture_snapshot?
114
- serializer.serialize_args(args, kwargs,
124
+ serialized_entry_args = if probe.capture_snapshot?
125
+ serializer.serialize_args(args, kwargs, self,
115
126
  depth: probe.max_capture_depth || settings.dynamic_instrumentation.max_capture_depth,
116
127
  attribute_count: probe.max_capture_attribute_count || settings.dynamic_instrumentation.max_capture_attribute_count)
117
128
  end
@@ -148,8 +159,10 @@ module Datadog
148
159
  caller_locs = method_frame + caller_locations # steep:ignore
149
160
  # TODO capture arguments at exit
150
161
  # & is to stop steep complaints, block is always present here.
151
- block&.call(probe: probe, rv: rv, duration: duration, caller_locations: caller_locs,
152
- serialized_entry_args: entry_args)
162
+ block&.call(probe: probe, rv: rv,
163
+ duration: duration, caller_locations: caller_locs,
164
+ target_self: self,
165
+ serialized_entry_args: serialized_entry_args)
153
166
  rv
154
167
  else
155
168
  # stop standard from trying to mess up my code
@@ -298,8 +311,21 @@ module Datadog
298
311
  probe.file == tp.path || probe.file_matches?(tp.path)
299
312
  )
300
313
  if rate_limiter.nil? || rate_limiter.allow?
314
+ serialized_locals = if probe.capture_snapshot?
315
+ serializer.serialize_vars(Instrumenter.get_local_variables(tp),
316
+ depth: probe.max_capture_depth || settings.dynamic_instrumentation.max_capture_depth,
317
+ attribute_count: probe.max_capture_attribute_count || settings.dynamic_instrumentation.max_capture_attribute_count,)
318
+ end
319
+ if probe.capture_snapshot?
320
+ serializer.serialize_value(tp.self,
321
+ depth: probe.max_capture_depth || settings.dynamic_instrumentation.max_capture_depth,
322
+ attribute_count: probe.max_capture_attribute_count || settings.dynamic_instrumentation.max_capture_attribute_count,)
323
+ end
301
324
  # & is to stop steep complaints, block is always present here.
302
- block&.call(probe: probe, trace_point: tp, caller_locations: caller_locations)
325
+ block&.call(probe: probe,
326
+ serialized_locals: serialized_locals,
327
+ target_self: tp.self,
328
+ path: tp.path, caller_locations: caller_locations)
303
329
  end
304
330
  end
305
331
  rescue => exc
@@ -371,6 +397,23 @@ module Datadog
371
397
  end
372
398
  end
373
399
 
400
+ class << self
401
+ def get_local_variables(trace_point)
402
+ # binding appears to be constructed on access, therefore
403
+ # 1) we should attempt to cache it and
404
+ # 2) we should not call +binding+ until we actually need variable values.
405
+ binding = trace_point.binding
406
+
407
+ # steep hack - should never happen
408
+ return {} unless binding
409
+
410
+ binding.local_variables.each_with_object({}) do |name, map|
411
+ value = binding.local_variable_get(name)
412
+ map[name] = value
413
+ end
414
+ end
415
+ end
416
+
374
417
  private
375
418
 
376
419
  attr_reader :lock
@@ -39,60 +39,70 @@ module Datadog
39
39
  end
40
40
 
41
41
  # Duration is in seconds.
42
+ # path is the actual path of the instrumented file.
42
43
  def build_executed(probe,
43
- trace_point: nil, rv: nil, duration: nil, caller_locations: nil,
44
- args: nil, kwargs: nil, serialized_entry_args: nil)
45
- snapshot = if probe.line? && probe.capture_snapshot?
46
- if trace_point.nil?
47
- raise "Cannot create snapshot because there is no trace point"
48
- end
49
- get_local_variables(trace_point)
50
- end
51
- # TODO check how many stack frames we should be keeping/sending,
52
- # this should be all frames for enriched probes and no frames for
53
- # non-enriched probes?
54
- build_snapshot(probe, rv: rv, snapshot: snapshot,
44
+ path: nil, rv: nil, duration: nil, caller_locations: nil,
45
+ serialized_locals: nil, args: nil, kwargs: nil, target_self: nil,
46
+ serialized_entry_args: nil)
47
+ build_snapshot(probe, rv: rv, serialized_locals: serialized_locals,
55
48
  # Actual path of the instrumented file.
56
- path: trace_point&.path,
57
- duration: duration, caller_locations: caller_locations, args: args, kwargs: kwargs,
49
+ path: path,
50
+ duration: duration,
51
+ # TODO check how many stack frames we should be keeping/sending,
52
+ # this should be all frames for enriched probes and no frames for
53
+ # non-enriched probes?
54
+ caller_locations: caller_locations,
55
+ args: args, kwargs: kwargs,
56
+ target_self: target_self,
58
57
  serialized_entry_args: serialized_entry_args)
59
58
  end
60
59
 
61
- def build_snapshot(probe, rv: nil, snapshot: nil, path: nil,
62
- duration: nil, caller_locations: nil, args: nil, kwargs: nil,
60
+ def build_snapshot(probe, rv: nil, serialized_locals: nil, path: nil,
61
+ # In Ruby everything is a method, therefore we should always have
62
+ # a target self. However, if we are not capturing a snapshot,
63
+ # there is no need to pass in the target self.
64
+ target_self: nil,
65
+ duration: nil, caller_locations: nil,
66
+ args: nil, kwargs: nil,
63
67
  serialized_entry_args: nil)
68
+ if probe.capture_snapshot? && !target_self
69
+ raise ArgumentError, "Asked to build snapshot with snapshot capture but target_self is nil"
70
+ end
71
+
64
72
  # TODO also verify that non-capturing probe does not pass
65
73
  # snapshot or vars/args into this method
66
74
  captures = if probe.capture_snapshot?
67
75
  if probe.method?
76
+ return_arguments = {
77
+ "@return": serializer.serialize_value(rv,
78
+ depth: probe.max_capture_depth || settings.dynamic_instrumentation.max_capture_depth,
79
+ attribute_count: probe.max_capture_attribute_count || settings.dynamic_instrumentation.max_capture_attribute_count),
80
+ self: serializer.serialize_value(target_self),
81
+ }
68
82
  {
69
83
  entry: {
70
84
  # standard:disable all
71
85
  arguments: if serialized_entry_args
72
86
  serialized_entry_args
73
87
  else
74
- (args || kwargs) && serializer.serialize_args(args, kwargs,
88
+ (args || kwargs) && serializer.serialize_args(args, kwargs, target_self,
75
89
  depth: probe.max_capture_depth || settings.dynamic_instrumentation.max_capture_depth,
76
90
  attribute_count: probe.max_capture_attribute_count || settings.dynamic_instrumentation.max_capture_attribute_count)
77
91
  end,
78
- throwable: nil,
79
92
  # standard:enable all
80
93
  },
81
94
  return: {
82
- arguments: {
83
- "@return": serializer.serialize_value(rv,
84
- depth: probe.max_capture_depth || settings.dynamic_instrumentation.max_capture_depth,
85
- attribute_count: probe.max_capture_attribute_count || settings.dynamic_instrumentation.max_capture_attribute_count),
86
- },
95
+ arguments: return_arguments,
87
96
  throwable: nil,
88
97
  },
89
98
  }
90
99
  elsif probe.line?
91
100
  {
92
- lines: snapshot && {
93
- probe.line_no => {locals: serializer.serialize_vars(snapshot,
94
- depth: probe.max_capture_depth || settings.dynamic_instrumentation.max_capture_depth,
95
- attribute_count: probe.max_capture_attribute_count || settings.dynamic_instrumentation.max_capture_attribute_count,)},
101
+ lines: serialized_locals && {
102
+ probe.line_no => {
103
+ locals: serialized_locals,
104
+ arguments: {self: serializer.serialize_value(target_self)},
105
+ },
96
106
  },
97
107
  }
98
108
  end
@@ -191,22 +201,7 @@ module Datadog
191
201
  end
192
202
 
193
203
  def timestamp_now
194
- (Time.now.to_f * 1000).to_i
195
- end
196
-
197
- def get_local_variables(trace_point)
198
- # binding appears to be constructed on access, therefore
199
- # 1) we should attempt to cache it and
200
- # 2) we should not call +binding+ until we actually need variable values.
201
- binding = trace_point.binding
202
-
203
- # steep hack - should never happen
204
- return {} unless binding
205
-
206
- binding.local_variables.each_with_object({}) do |name, map|
207
- value = binding.local_variable_get(name)
208
- map[name] = value
209
- end
204
+ (Core::Utils::Time.now.to_f * 1000).to_i
210
205
  end
211
206
 
212
207
  def active_trace
@@ -171,7 +171,7 @@ module Datadog
171
171
  attr_reader :last_sent
172
172
 
173
173
  def status_transport
174
- @status_transport ||= DI::Transport::HTTP.diagnostics(agent_settings: agent_settings)
174
+ @status_transport ||= DI::Transport::HTTP.diagnostics(agent_settings: agent_settings, logger: logger)
175
175
  end
176
176
 
177
177
  def do_send_status(batch)
@@ -179,11 +179,19 @@ module Datadog
179
179
  end
180
180
 
181
181
  def snapshot_transport
182
- @snapshot_transport ||= DI::Transport::HTTP.input(agent_settings: agent_settings)
182
+ @snapshot_transport ||= DI::Transport::HTTP.input(agent_settings: agent_settings, logger: logger)
183
183
  end
184
184
 
185
185
  def do_send_snapshot(batch)
186
- snapshot_transport.send_input(batch)
186
+ snapshot_transport.send_input(batch, tags)
187
+ end
188
+
189
+ def tags
190
+ # DEV: The tags could be cached but they need to be recreated
191
+ # when process forks (since the child receives new runtime IDs).
192
+ Core::TagBuilder.tags(settings).merge(
193
+ 'debugger_version' => Core::Environment::Identity.gem_datadog_version,
194
+ )
187
195
  end
188
196
 
189
197
  [
@@ -227,20 +235,6 @@ module Datadog
227
235
  start
228
236
  end
229
237
 
230
- # Determine how much longer the worker thread should sleep
231
- # so as not to send in less than min send interval since the last send.
232
- # Important: this method must be called when @lock is held.
233
- #
234
- # Returns the time remaining to sleep.
235
- def set_sleep_remaining
236
- now = Core::Utils::Time.get_time
237
- @sleep_remaining = if last_sent
238
- [last_sent + min_send_interval - now, 0].max
239
- else
240
- 0
241
- end
242
- end
243
-
244
238
  public "add_#{event_type}"
245
239
 
246
240
  # Sends pending probe statuses or snapshots.
@@ -288,6 +282,20 @@ module Datadog
288
282
  end
289
283
  end
290
284
 
285
+ # Determine how much longer the worker thread should sleep
286
+ # so as not to send in less than min send interval since the last send.
287
+ # Important: this method must be called when @lock is held.
288
+ #
289
+ # Returns the time remaining to sleep.
290
+ def set_sleep_remaining
291
+ now = Core::Utils::Time.get_time
292
+ @sleep_remaining = if last_sent
293
+ [last_sent + min_send_interval - now, 0].max
294
+ else
295
+ 0
296
+ end
297
+ end
298
+
291
299
  def maybe_send
292
300
  rv = maybe_send_status
293
301
  maybe_send_snapshot || rv
@@ -18,6 +18,8 @@ module Datadog
18
18
  PRODUCT = 'LIVE_DEBUGGING'
19
19
 
20
20
  def products
21
+ # TODO: do not send our product on unsupported runtimes
22
+ # (Ruby 2.5 / JRuby)
21
23
  [PRODUCT]
22
24
  end
23
25
 
@@ -36,6 +36,10 @@ module Datadog
36
36
  # efficient but there would be additional overhead from passing this
37
37
  # parameter all the time and the API would get more complex.
38
38
  #
39
+ # Note: "self" cannot be used as a parameter name in Ruby, therefore
40
+ # there should never be a conflict between instance variable
41
+ # serialization and method parameters.
42
+ #
39
43
  # @api private
40
44
  class Serializer
41
45
  # Third-party library integration / custom serializers.
@@ -82,7 +86,11 @@ module Datadog
82
86
  # between positional and keyword arguments. We convert positional
83
87
  # arguments to keyword arguments ("arg1", "arg2", ...) and ensure
84
88
  # the positional arguments are listed first.
85
- def serialize_args(args, kwargs,
89
+ #
90
+ # Instance variables are technically a hash just like kwargs,
91
+ # we take them as a separate parameter to avoid a hash merge
92
+ # in upstream code.
93
+ def serialize_args(args, kwargs, target_self,
86
94
  depth: settings.dynamic_instrumentation.max_capture_depth,
87
95
  attribute_count: settings.dynamic_instrumentation.max_capture_attribute_count)
88
96
  counter = 0
@@ -91,7 +99,7 @@ module Datadog
91
99
  # Conversion to symbol is needed here to put args ahead of
92
100
  # kwargs when they are merged below.
93
101
  c[:"arg#{counter}"] = value
94
- end.update(kwargs)
102
+ end.update(kwargs).update(self: target_self)
95
103
  serialize_vars(combined, depth: depth, attribute_count: attribute_count)
96
104
  end
97
105
 
@@ -15,12 +15,13 @@ module Datadog
15
15
  end
16
16
 
17
17
  class Transport
18
- attr_reader :client, :apis, :default_api, :current_api_id
18
+ attr_reader :client, :apis, :default_api, :current_api_id, :logger
19
19
 
20
- def initialize(apis, default_api)
20
+ def initialize(apis, default_api, logger:)
21
21
  @apis = apis
22
+ @logger = logger
22
23
 
23
- @client = HTTP::Client.new(current_api)
24
+ @client = HTTP::Client.new(current_api, logger: logger)
24
25
  end
25
26
 
26
27
  def current_api
@@ -21,13 +21,13 @@ module Datadog
21
21
 
22
22
  def defaults
23
23
  Datadog::Core::Transport::HTTP::API::Map[
24
- DIAGNOSTICS => Spec.new do |s|
24
+ DIAGNOSTICS => Diagnostics::API::Spec.new do |s|
25
25
  s.diagnostics = Diagnostics::API::Endpoint.new(
26
26
  '/debugger/v1/diagnostics',
27
27
  Core::Encoding::JSONEncoder,
28
28
  )
29
29
  end,
30
- INPUT => Spec.new do |s|
30
+ INPUT => Input::API::Spec.new do |s|
31
31
  s.input = Input::API::Endpoint.new(
32
32
  '/debugger/v1/input',
33
33
  Core::Encoding::JSONEncoder,
@@ -35,16 +35,6 @@ module Datadog
35
35
  end,
36
36
  ]
37
37
  end
38
-
39
- class Instance < Core::Transport::HTTP::API::Instance
40
- include Diagnostics::API::Instance
41
- include Input::API::Instance
42
- end
43
-
44
- class Spec < Core::Transport::HTTP::API::Spec
45
- include Diagnostics::API::Spec
46
- include Input::API::Spec
47
- end
48
38
  end
49
39
  end
50
40
  end
@@ -14,10 +14,11 @@ module Datadog
14
14
  module HTTP
15
15
  # Routes, encodes, and sends DI data to the trace agent via HTTP.
16
16
  class Client
17
- attr_reader :api
17
+ attr_reader :api, :logger
18
18
 
19
- def initialize(api)
19
+ def initialize(api, logger:)
20
20
  @api = api
21
+ @logger = logger
21
22
  end
22
23
 
23
24
  def send_request(request, &block)
@@ -31,7 +32,7 @@ module Datadog
31
32
  "Internal error during #{self.class.name} request. Cause: #{e.class.name} #{e.message} " \
32
33
  "Location: #{Array(e.backtrace).first}"
33
34
 
34
- Datadog.logger.debug(message)
35
+ logger.debug(message)
35
36
 
36
37
  Datadog::Core::Transport::InternalErrorResponse.new(e)
37
38
  end
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative '../../../core/transport/http/api/instance'
4
+ require_relative '../../../core/transport/http/api/spec'
3
5
  require_relative 'client'
4
6
 
5
7
  module Datadog
@@ -16,55 +18,26 @@ module Datadog
16
18
  end
17
19
 
18
20
  module API
19
- module Instance
21
+ class Instance < Core::Transport::HTTP::API::Instance
20
22
  def send_diagnostics(env)
21
- raise DiagnosticsNotSupportedError, spec unless spec.is_a?(Diagnostics::API::Spec)
23
+ raise Core::Transport::HTTP::API::Instance::EndpointNotSupportedError.new('diagnostics', self) unless spec.is_a?(Diagnostics::API::Spec)
22
24
 
23
25
  spec.send_diagnostics(env) do |request_env|
24
26
  call(request_env)
25
27
  end
26
28
  end
27
-
28
- class DiagnosticsNotSupportedError < StandardError
29
- attr_reader :spec
30
-
31
- def initialize(spec)
32
- super
33
-
34
- @spec = spec
35
- end
36
-
37
- def message
38
- 'Diagnostics not supported for this API!'
39
- end
40
- end
41
29
  end
42
30
 
43
- module Spec
31
+ class Spec < Core::Transport::HTTP::API::Spec
44
32
  attr_accessor :diagnostics
45
33
 
46
34
  def send_diagnostics(env, &block)
47
- raise NoDiagnosticsEndpointDefinedError, self if diagnostics.nil?
35
+ raise Core::Transport::HTTP::API::Spec::EndpointNotDefinedError.new('diagnostics', self) if diagnostics.nil?
48
36
 
49
37
  diagnostics.call(env, &block)
50
38
  end
51
-
52
- class NoDiagnosticsEndpointDefinedError < StandardError
53
- attr_reader :spec
54
-
55
- def initialize(spec)
56
- super
57
-
58
- @spec = spec
59
- end
60
-
61
- def message
62
- 'No diagnostics endpoint is defined for API specification!'
63
- end
64
- end
65
39
  end
66
40
 
67
- # Endpoint for negotiation
68
41
  class Endpoint < Datadog::Core::Transport::HTTP::API::Endpoint
69
42
  attr_reader :encoder
70
43
 
@@ -79,7 +52,7 @@ module Datadog
79
52
  )
80
53
  env.form = {'event' => event_payload}
81
54
 
82
- super(env, &block)
55
+ super
83
56
  end
84
57
  end
85
58
  end
@@ -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,15 +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
3
  require_relative 'diagnostics'
9
4
  require_relative 'input'
10
5
  require_relative 'http/api'
11
6
  require_relative '../../core/transport/http'
12
- require_relative '../../../datadog/version'
13
7
 
14
8
  module Datadog
15
9
  module DI
@@ -18,86 +12,44 @@ module Datadog
18
12
  module HTTP
19
13
  module_function
20
14
 
21
- # Builds a new Transport::HTTP::Client
22
- def new(klass, &block)
23
- Core::Transport::HTTP.build(
24
- api_instance_class: API::Instance, &block
25
- ).to_transport(klass)
26
- end
27
-
28
15
  # Builds a new Transport::HTTP::Client with default settings
29
16
  # Pass a block to override any settings.
30
17
  def diagnostics(
31
18
  agent_settings:,
32
- **options
19
+ logger:,
20
+ api_version: nil,
21
+ headers: nil
33
22
  )
34
- new(DI::Transport::Diagnostics::Transport) do |transport|
35
- transport.adapter(agent_settings)
36
- transport.headers default_headers
37
-
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|
38
26
  apis = API.defaults
39
27
 
40
28
  transport.api API::DIAGNOSTICS, apis[API::DIAGNOSTICS]
41
29
 
42
- # Apply any settings given by options
43
- unless options.empty?
44
- transport.default_api = options[:api_version] if options.key?(:api_version)
45
- transport.headers options[:headers] if options.key?(:headers)
46
- end
47
-
48
30
  # Call block to apply any customization, if provided
49
31
  yield(transport) if block_given?
50
- end
32
+ end.to_transport(DI::Transport::Diagnostics::Transport)
51
33
  end
52
34
 
53
35
  # Builds a new Transport::HTTP::Client with default settings
54
36
  # Pass a block to override any settings.
55
37
  def input(
56
38
  agent_settings:,
57
- **options
39
+ logger:,
40
+ api_version: nil,
41
+ headers: nil
58
42
  )
59
- new(DI::Transport::Input::Transport) do |transport|
60
- transport.adapter(agent_settings)
61
- transport.headers default_headers
62
-
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|
63
46
  apis = API.defaults
64
47
 
65
48
  transport.api API::INPUT, apis[API::INPUT]
66
49
 
67
- # Apply any settings given by options
68
- unless options.empty?
69
- transport.default_api = options[:api_version] if options.key?(:api_version)
70
- transport.headers options[:headers] if options.key?(:headers)
71
- end
72
-
73
50
  # Call block to apply any customization, if provided
74
51
  yield(transport) if block_given?
75
- end
76
- end
77
-
78
- def default_headers
79
- {
80
- Datadog::Core::Transport::Ext::HTTP::HEADER_CLIENT_COMPUTED_TOP_LEVEL => '1',
81
- Datadog::Core::Transport::Ext::HTTP::HEADER_META_LANG => Datadog::Core::Environment::Ext::LANG,
82
- Datadog::Core::Transport::Ext::HTTP::HEADER_META_LANG_VERSION => Datadog::Core::Environment::Ext::LANG_VERSION,
83
- Datadog::Core::Transport::Ext::HTTP::HEADER_META_LANG_INTERPRETER =>
84
- Datadog::Core::Environment::Ext::LANG_INTERPRETER,
85
- Datadog::Core::Transport::Ext::HTTP::HEADER_META_LANG_INTERPRETER_VENDOR => Core::Environment::Ext::LANG_ENGINE,
86
- Datadog::Core::Transport::Ext::HTTP::HEADER_META_TRACER_VERSION =>
87
- Datadog::Core::Environment::Ext::GEM_DATADOG_VERSION
88
- }.tap do |headers|
89
- # Add container ID, if present.
90
- container_id = Datadog::Core::Environment::Container.container_id
91
- headers[Datadog::Core::Transport::Ext::HTTP::HEADER_CONTAINER_ID] = container_id unless container_id.nil?
92
- # Pretend that stats computation are already done by the client
93
- if Datadog.configuration.appsec.standalone.enabled
94
- headers[Datadog::Core::Transport::Ext::HTTP::HEADER_CLIENT_COMPUTED_STATS] = 'yes'
95
- end
96
- end
97
- end
98
-
99
- def default_adapter
100
- Datadog::Core::Configuration::Ext::Agent::HTTP::ADAPTER
52
+ end.to_transport(DI::Transport::Input::Transport)
101
53
  end
102
54
  end
103
55
  end