datadog 2.12.1 → 2.17.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 (302) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +154 -2
  3. data/ext/datadog_profiling_native_extension/collectors_thread_context.c +16 -14
  4. data/ext/datadog_profiling_native_extension/datadog_ruby_common.c +1 -4
  5. data/ext/datadog_profiling_native_extension/datadog_ruby_common.h +10 -0
  6. data/ext/datadog_profiling_native_extension/encoded_profile.c +79 -0
  7. data/ext/datadog_profiling_native_extension/encoded_profile.h +8 -0
  8. data/ext/datadog_profiling_native_extension/extconf.rb +3 -0
  9. data/ext/datadog_profiling_native_extension/heap_recorder.c +8 -1
  10. data/ext/datadog_profiling_native_extension/http_transport.c +60 -94
  11. data/ext/datadog_profiling_native_extension/private_vm_api_access.c +8 -0
  12. data/ext/datadog_profiling_native_extension/profiling.c +2 -0
  13. data/ext/datadog_profiling_native_extension/stack_recorder.c +23 -23
  14. data/ext/libdatadog_api/crashtracker.c +11 -12
  15. data/ext/libdatadog_api/crashtracker.h +5 -0
  16. data/ext/libdatadog_api/datadog_ruby_common.c +1 -4
  17. data/ext/libdatadog_api/datadog_ruby_common.h +10 -0
  18. data/ext/libdatadog_api/init.c +15 -0
  19. data/ext/libdatadog_api/library_config.c +122 -0
  20. data/ext/libdatadog_api/library_config.h +19 -0
  21. data/ext/libdatadog_api/macos_development.md +3 -3
  22. data/ext/libdatadog_api/process_discovery.c +117 -0
  23. data/ext/libdatadog_api/process_discovery.h +5 -0
  24. data/ext/libdatadog_extconf_helpers.rb +1 -1
  25. data/lib/datadog/appsec/actions_handler/serializable_backtrace.rb +89 -0
  26. data/lib/datadog/appsec/actions_handler.rb +24 -2
  27. data/lib/datadog/appsec/anonymizer.rb +16 -0
  28. data/lib/datadog/appsec/api_security/lru_cache.rb +49 -0
  29. data/lib/datadog/appsec/api_security.rb +9 -0
  30. data/lib/datadog/appsec/assets/waf_rules/README.md +50 -5
  31. data/lib/datadog/appsec/assets/waf_rules/processors.json +239 -10
  32. data/lib/datadog/appsec/assets/waf_rules/scanners.json +926 -17
  33. data/lib/datadog/appsec/autoload.rb +1 -1
  34. data/lib/datadog/appsec/component.rb +29 -20
  35. data/lib/datadog/appsec/compressed_json.rb +40 -0
  36. data/lib/datadog/appsec/configuration/settings.rb +93 -28
  37. data/lib/datadog/appsec/context.rb +1 -1
  38. data/lib/datadog/appsec/contrib/active_record/instrumentation.rb +10 -12
  39. data/lib/datadog/appsec/contrib/active_record/integration.rb +2 -2
  40. data/lib/datadog/appsec/contrib/active_record/patcher.rb +22 -22
  41. data/lib/datadog/appsec/contrib/auto_instrument.rb +1 -1
  42. data/lib/datadog/appsec/contrib/devise/configuration.rb +7 -31
  43. data/lib/datadog/appsec/contrib/devise/data_extractor.rb +78 -0
  44. data/lib/datadog/appsec/contrib/devise/ext.rb +22 -0
  45. data/lib/datadog/appsec/contrib/devise/integration.rb +1 -2
  46. data/lib/datadog/appsec/contrib/devise/patcher.rb +34 -23
  47. data/lib/datadog/appsec/contrib/devise/patches/signin_tracking_patch.rb +102 -0
  48. data/lib/datadog/appsec/contrib/devise/patches/signup_tracking_patch.rb +69 -0
  49. data/lib/datadog/appsec/contrib/devise/{patcher/rememberable_patch.rb → patches/skip_signin_tracking_patch.rb} +2 -2
  50. data/lib/datadog/appsec/contrib/devise/tracking_middleware.rb +106 -0
  51. data/lib/datadog/appsec/contrib/excon/integration.rb +1 -1
  52. data/lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb +9 -10
  53. data/lib/datadog/appsec/contrib/faraday/integration.rb +1 -1
  54. data/lib/datadog/appsec/contrib/faraday/ssrf_detection_middleware.rb +8 -9
  55. data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +8 -9
  56. data/lib/datadog/appsec/contrib/graphql/integration.rb +1 -1
  57. data/lib/datadog/appsec/contrib/rack/ext.rb +34 -0
  58. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +49 -32
  59. data/lib/datadog/appsec/contrib/rack/integration.rb +1 -1
  60. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +19 -18
  61. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +11 -13
  62. data/lib/datadog/appsec/contrib/rails/integration.rb +1 -1
  63. data/lib/datadog/appsec/contrib/rails/patcher.rb +21 -21
  64. data/lib/datadog/appsec/contrib/rest_client/integration.rb +1 -1
  65. data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +10 -11
  66. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +17 -23
  67. data/lib/datadog/appsec/contrib/sinatra/integration.rb +1 -1
  68. data/lib/datadog/appsec/event.rb +96 -135
  69. data/lib/datadog/appsec/ext.rb +4 -2
  70. data/lib/datadog/appsec/instrumentation/gateway/argument.rb +7 -2
  71. data/lib/datadog/appsec/instrumentation/gateway/middleware.rb +24 -0
  72. data/lib/datadog/appsec/instrumentation/gateway.rb +17 -22
  73. data/lib/datadog/appsec/metrics/telemetry.rb +1 -1
  74. data/lib/datadog/appsec/monitor/gateway/watcher.rb +49 -14
  75. data/lib/datadog/appsec/processor/rule_loader.rb +26 -28
  76. data/lib/datadog/appsec/processor/rule_merger.rb +7 -6
  77. data/lib/datadog/appsec/processor.rb +1 -1
  78. data/lib/datadog/appsec/remote.rb +23 -11
  79. data/lib/datadog/appsec/response.rb +6 -6
  80. data/lib/datadog/appsec/security_engine/runner.rb +3 -3
  81. data/lib/datadog/appsec/security_event.rb +39 -0
  82. data/lib/datadog/appsec/utils.rb +0 -2
  83. data/lib/datadog/appsec.rb +1 -1
  84. data/lib/datadog/core/buffer/random.rb +18 -2
  85. data/lib/datadog/core/configuration/agent_settings_resolver.rb +5 -5
  86. data/lib/datadog/core/configuration/agentless_settings_resolver.rb +176 -0
  87. data/lib/datadog/core/configuration/components.rb +50 -31
  88. data/lib/datadog/core/configuration/components_state.rb +23 -0
  89. data/lib/datadog/core/configuration/ext.rb +4 -0
  90. data/lib/datadog/core/configuration/option.rb +79 -43
  91. data/lib/datadog/core/configuration/option_definition.rb +4 -4
  92. data/lib/datadog/core/configuration/options.rb +3 -3
  93. data/lib/datadog/core/configuration/settings.rb +68 -35
  94. data/lib/datadog/core/configuration/stable_config.rb +23 -0
  95. data/lib/datadog/core/configuration.rb +40 -16
  96. data/lib/datadog/core/crashtracking/component.rb +3 -10
  97. data/lib/datadog/core/diagnostics/environment_logger.rb +1 -1
  98. data/lib/datadog/core/encoding.rb +1 -1
  99. data/lib/datadog/core/environment/agent_info.rb +4 -3
  100. data/lib/datadog/core/environment/cgroup.rb +10 -12
  101. data/lib/datadog/core/environment/container.rb +38 -40
  102. data/lib/datadog/core/environment/ext.rb +6 -6
  103. data/lib/datadog/core/environment/git.rb +1 -0
  104. data/lib/datadog/core/environment/identity.rb +3 -3
  105. data/lib/datadog/core/environment/platform.rb +3 -3
  106. data/lib/datadog/core/environment/variable_helpers.rb +1 -1
  107. data/lib/datadog/core/error.rb +11 -9
  108. data/lib/datadog/core/logger.rb +2 -2
  109. data/lib/datadog/core/metrics/client.rb +20 -21
  110. data/lib/datadog/core/metrics/logging.rb +5 -5
  111. data/lib/datadog/core/process_discovery.rb +32 -0
  112. data/lib/datadog/core/rate_limiter.rb +4 -2
  113. data/lib/datadog/core/remote/client.rb +40 -32
  114. data/lib/datadog/core/remote/component.rb +6 -9
  115. data/lib/datadog/core/remote/configuration/digest.rb +7 -7
  116. data/lib/datadog/core/remote/configuration/path.rb +1 -1
  117. data/lib/datadog/core/remote/configuration/repository.rb +2 -1
  118. data/lib/datadog/core/remote/negotiation.rb +9 -9
  119. data/lib/datadog/core/remote/transport/config.rb +4 -3
  120. data/lib/datadog/core/remote/transport/http/client.rb +5 -4
  121. data/lib/datadog/core/remote/transport/http/config.rb +27 -37
  122. data/lib/datadog/core/remote/transport/http/negotiation.rb +7 -33
  123. data/lib/datadog/core/remote/transport/http.rb +22 -57
  124. data/lib/datadog/core/remote/transport/negotiation.rb +4 -3
  125. data/lib/datadog/core/runtime/metrics.rb +12 -5
  126. data/lib/datadog/core/telemetry/component.rb +78 -53
  127. data/lib/datadog/core/telemetry/emitter.rb +23 -11
  128. data/lib/datadog/core/telemetry/event/app_client_configuration_change.rb +65 -0
  129. data/lib/datadog/core/telemetry/event/app_closing.rb +18 -0
  130. data/lib/datadog/core/telemetry/event/app_dependencies_loaded.rb +33 -0
  131. data/lib/datadog/core/telemetry/event/app_heartbeat.rb +18 -0
  132. data/lib/datadog/core/telemetry/event/app_integrations_change.rb +58 -0
  133. data/lib/datadog/core/telemetry/event/app_started.rb +179 -0
  134. data/lib/datadog/core/telemetry/event/base.rb +40 -0
  135. data/lib/datadog/core/telemetry/event/distributions.rb +18 -0
  136. data/lib/datadog/core/telemetry/event/generate_metrics.rb +43 -0
  137. data/lib/datadog/core/telemetry/event/log.rb +76 -0
  138. data/lib/datadog/core/telemetry/event/message_batch.rb +42 -0
  139. data/lib/datadog/core/telemetry/event/synth_app_client_configuration_change.rb +43 -0
  140. data/lib/datadog/core/telemetry/event.rb +17 -472
  141. data/lib/datadog/core/telemetry/http/adapters/net.rb +12 -97
  142. data/lib/datadog/core/telemetry/logger.rb +1 -1
  143. data/lib/datadog/core/telemetry/metric.rb +8 -8
  144. data/lib/datadog/core/telemetry/request.rb +4 -4
  145. data/lib/datadog/core/telemetry/transport/http/api.rb +43 -0
  146. data/lib/datadog/core/telemetry/transport/http/client.rb +49 -0
  147. data/lib/datadog/core/telemetry/transport/http/telemetry.rb +92 -0
  148. data/lib/datadog/core/telemetry/transport/http.rb +63 -0
  149. data/lib/datadog/core/telemetry/transport/telemetry.rb +51 -0
  150. data/lib/datadog/core/telemetry/worker.rb +90 -24
  151. data/lib/datadog/core/transport/http/adapters/test.rb +2 -1
  152. data/lib/datadog/core/transport/http/api/instance.rb +17 -0
  153. data/lib/datadog/core/transport/http/api/spec.rb +17 -0
  154. data/lib/datadog/core/transport/http/builder.rb +18 -16
  155. data/lib/datadog/core/transport/http.rb +39 -2
  156. data/lib/datadog/core/utils/at_fork_monkey_patch.rb +6 -6
  157. data/lib/datadog/core/utils/duration.rb +32 -32
  158. data/lib/datadog/core/utils/forking.rb +2 -2
  159. data/lib/datadog/core/utils/network.rb +6 -6
  160. data/lib/datadog/core/utils/only_once_successful.rb +16 -5
  161. data/lib/datadog/core/utils/time.rb +20 -0
  162. data/lib/datadog/core/utils/truncation.rb +21 -0
  163. data/lib/datadog/core/vendor/multipart-post/multipart/post/composite_read_io.rb +1 -1
  164. data/lib/datadog/core/vendor/multipart-post/multipart/post/multipartable.rb +8 -8
  165. data/lib/datadog/core/vendor/multipart-post/multipart/post/parts.rb +7 -7
  166. data/lib/datadog/core/worker.rb +1 -1
  167. data/lib/datadog/core/workers/async.rb +29 -12
  168. data/lib/datadog/core/workers/interval_loop.rb +12 -1
  169. data/lib/datadog/core/workers/runtime_metrics.rb +2 -2
  170. data/lib/datadog/core.rb +8 -0
  171. data/lib/datadog/di/boot.rb +34 -0
  172. data/lib/datadog/di/component.rb +0 -2
  173. data/lib/datadog/di/probe_notification_builder.rb +1 -1
  174. data/lib/datadog/di/probe_notifier_worker.rb +16 -16
  175. data/lib/datadog/di/remote.rb +2 -0
  176. data/lib/datadog/di/transport/diagnostics.rb +4 -3
  177. data/lib/datadog/di/transport/http/api.rb +2 -12
  178. data/lib/datadog/di/transport/http/client.rb +4 -3
  179. data/lib/datadog/di/transport/http/diagnostics.rb +7 -34
  180. data/lib/datadog/di/transport/http/input.rb +7 -34
  181. data/lib/datadog/di/transport/http.rb +14 -62
  182. data/lib/datadog/di/transport/input.rb +4 -3
  183. data/lib/datadog/di/utils.rb +5 -0
  184. data/lib/datadog/di.rb +5 -32
  185. data/lib/datadog/error_tracking/collector.rb +87 -0
  186. data/lib/datadog/error_tracking/component.rb +167 -0
  187. data/lib/datadog/error_tracking/configuration/settings.rb +63 -0
  188. data/lib/datadog/error_tracking/configuration.rb +11 -0
  189. data/lib/datadog/error_tracking/ext.rb +18 -0
  190. data/lib/datadog/error_tracking/extensions.rb +16 -0
  191. data/lib/datadog/error_tracking/filters.rb +77 -0
  192. data/lib/datadog/error_tracking.rb +18 -0
  193. data/lib/datadog/kit/appsec/events.rb +12 -0
  194. data/lib/datadog/kit/identity.rb +5 -1
  195. data/lib/datadog/opentelemetry/api/baggage.rb +90 -0
  196. data/lib/datadog/opentelemetry/api/baggage.rbs +26 -0
  197. data/lib/datadog/opentelemetry/api/context.rb +16 -2
  198. data/lib/datadog/opentelemetry/sdk/trace/span.rb +1 -1
  199. data/lib/datadog/opentelemetry.rb +2 -1
  200. data/lib/datadog/profiling/collectors/code_provenance.rb +1 -1
  201. data/lib/datadog/profiling/collectors/info.rb +3 -0
  202. data/lib/datadog/profiling/collectors/thread_context.rb +1 -1
  203. data/lib/datadog/profiling/encoded_profile.rb +11 -0
  204. data/lib/datadog/profiling/exporter.rb +3 -4
  205. data/lib/datadog/profiling/ext.rb +0 -2
  206. data/lib/datadog/profiling/flush.rb +5 -8
  207. data/lib/datadog/profiling/http_transport.rb +5 -59
  208. data/lib/datadog/profiling/scheduler.rb +8 -1
  209. data/lib/datadog/profiling/stack_recorder.rb +4 -4
  210. data/lib/datadog/profiling/tag_builder.rb +1 -5
  211. data/lib/datadog/profiling.rb +6 -2
  212. data/lib/datadog/tracing/analytics.rb +1 -1
  213. data/lib/datadog/tracing/component.rb +15 -12
  214. data/lib/datadog/tracing/configuration/ext.rb +7 -1
  215. data/lib/datadog/tracing/configuration/settings.rb +18 -2
  216. data/lib/datadog/tracing/context_provider.rb +1 -1
  217. data/lib/datadog/tracing/contrib/active_record/integration.rb +1 -1
  218. data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +4 -1
  219. data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +33 -0
  220. data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +4 -0
  221. data/lib/datadog/tracing/contrib/active_support/cache/redis.rb +2 -4
  222. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +10 -0
  223. data/lib/datadog/tracing/contrib/aws/parsed_context.rb +5 -1
  224. data/lib/datadog/tracing/contrib/configuration/settings.rb +1 -1
  225. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +4 -5
  226. data/lib/datadog/tracing/contrib/excon/middleware.rb +5 -3
  227. data/lib/datadog/tracing/contrib/ext.rb +1 -0
  228. data/lib/datadog/tracing/contrib/faraday/middleware.rb +5 -3
  229. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +7 -1
  230. data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +3 -0
  231. data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +0 -15
  232. data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +4 -1
  233. data/lib/datadog/tracing/contrib/http/instrumentation.rb +6 -10
  234. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +6 -16
  235. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +7 -15
  236. data/lib/datadog/tracing/contrib/karafka/configuration/settings.rb +27 -0
  237. data/lib/datadog/tracing/contrib/karafka/distributed/propagation.rb +48 -0
  238. data/lib/datadog/tracing/contrib/karafka/ext.rb +27 -0
  239. data/lib/datadog/tracing/contrib/karafka/integration.rb +45 -0
  240. data/lib/datadog/tracing/contrib/karafka/monitor.rb +66 -0
  241. data/lib/datadog/tracing/contrib/karafka/patcher.rb +71 -0
  242. data/lib/datadog/tracing/contrib/karafka.rb +37 -0
  243. data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +8 -0
  244. data/lib/datadog/tracing/contrib/mongodb/ext.rb +1 -0
  245. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +18 -1
  246. data/lib/datadog/tracing/contrib/opensearch/configuration/settings.rb +17 -0
  247. data/lib/datadog/tracing/contrib/opensearch/ext.rb +9 -0
  248. data/lib/datadog/tracing/contrib/opensearch/patcher.rb +5 -1
  249. data/lib/datadog/tracing/contrib/patcher.rb +5 -2
  250. data/lib/datadog/tracing/contrib/rack/request_queue.rb +1 -1
  251. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +5 -3
  252. data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +6 -1
  253. data/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb +3 -0
  254. data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +1 -1
  255. data/lib/datadog/tracing/contrib/support.rb +28 -0
  256. data/lib/datadog/tracing/contrib.rb +1 -0
  257. data/lib/datadog/tracing/correlation.rb +9 -2
  258. data/lib/datadog/tracing/distributed/b3_multi.rb +1 -1
  259. data/lib/datadog/tracing/distributed/b3_single.rb +1 -1
  260. data/lib/datadog/tracing/distributed/baggage.rb +131 -0
  261. data/lib/datadog/tracing/distributed/datadog.rb +4 -2
  262. data/lib/datadog/tracing/distributed/propagation.rb +25 -4
  263. data/lib/datadog/tracing/distributed/propagation_policy.rb +42 -0
  264. data/lib/datadog/tracing/metadata/errors.rb +4 -4
  265. data/lib/datadog/tracing/metadata/ext.rb +5 -0
  266. data/lib/datadog/tracing/metadata/metastruct.rb +36 -0
  267. data/lib/datadog/tracing/metadata/metastruct_tagging.rb +42 -0
  268. data/lib/datadog/tracing/metadata.rb +2 -0
  269. data/lib/datadog/tracing/sampling/rate_sampler.rb +2 -1
  270. data/lib/datadog/tracing/sampling/span/rule.rb +0 -1
  271. data/lib/datadog/tracing/span.rb +10 -1
  272. data/lib/datadog/tracing/span_event.rb +1 -1
  273. data/lib/datadog/tracing/span_operation.rb +46 -16
  274. data/lib/datadog/tracing/sync_writer.rb +1 -2
  275. data/lib/datadog/tracing/trace_digest.rb +9 -2
  276. data/lib/datadog/tracing/trace_operation.rb +44 -24
  277. data/lib/datadog/tracing/trace_segment.rb +6 -4
  278. data/lib/datadog/tracing/tracer.rb +45 -5
  279. data/lib/datadog/tracing/transport/http/api.rb +2 -10
  280. data/lib/datadog/tracing/transport/http/client.rb +5 -4
  281. data/lib/datadog/tracing/transport/http/traces.rb +13 -41
  282. data/lib/datadog/tracing/transport/http.rb +11 -44
  283. data/lib/datadog/tracing/transport/serializable_trace.rb +3 -1
  284. data/lib/datadog/tracing/transport/trace_formatter.rb +7 -0
  285. data/lib/datadog/tracing/transport/traces.rb +26 -9
  286. data/lib/datadog/tracing/utils.rb +1 -1
  287. data/lib/datadog/tracing/workers/trace_writer.rb +2 -6
  288. data/lib/datadog/tracing/writer.rb +2 -6
  289. data/lib/datadog/tracing.rb +16 -3
  290. data/lib/datadog/version.rb +2 -2
  291. data/lib/datadog.rb +2 -3
  292. metadata +80 -19
  293. data/lib/datadog/appsec/contrib/devise/event.rb +0 -54
  294. data/lib/datadog/appsec/contrib/devise/patcher/authenticatable_patch.rb +0 -72
  295. data/lib/datadog/appsec/contrib/devise/patcher/registration_controller_patch.rb +0 -47
  296. data/lib/datadog/appsec/contrib/devise/resource.rb +0 -35
  297. data/lib/datadog/appsec/contrib/devise/tracking.rb +0 -57
  298. data/lib/datadog/appsec/utils/trace_operation.rb +0 -15
  299. data/lib/datadog/core/telemetry/http/env.rb +0 -20
  300. data/lib/datadog/core/telemetry/http/ext.rb +0 -28
  301. data/lib/datadog/core/telemetry/http/response.rb +0 -70
  302. data/lib/datadog/core/telemetry/http/transport.rb +0 -90
@@ -7,11 +7,11 @@ module Datadog
7
7
  module Remote
8
8
  # Endpoint negotiation
9
9
  class Negotiation
10
- def initialize(_settings, agent_settings, suppress_logging: {})
11
- transport_options = {}
12
- transport_options[:agent_settings] = agent_settings if agent_settings
10
+ attr_reader :logger
13
11
 
14
- @transport_root = Datadog::Core::Remote::Transport::HTTP.root(**transport_options) # steep:ignore
12
+ def initialize(_settings, agent_settings, logger: Datadog.logger, suppress_logging: {})
13
+ @logger = logger
14
+ @transport_root = Datadog::Core::Remote::Transport::HTTP.root(agent_settings: agent_settings, logger: logger)
15
15
  @logged = suppress_logging
16
16
  end
17
17
 
@@ -20,7 +20,7 @@ module Datadog
20
20
 
21
21
  if res.internal_error? && network_error?(res.error)
22
22
  unless @logged[:agent_unreachable]
23
- Datadog.logger.warn { "agent unreachable: cannot negotiate #{path}" }
23
+ logger.warn { "agent unreachable: cannot negotiate #{path}" }
24
24
  @logged[:agent_unreachable] = true
25
25
  end
26
26
 
@@ -29,7 +29,7 @@ module Datadog
29
29
 
30
30
  if res.not_found?
31
31
  unless @logged[:no_info_endpoint]
32
- Datadog.logger.warn { "agent reachable but has no /info endpoint: cannot negotiate #{path}" }
32
+ logger.warn { "agent reachable but has no /info endpoint: cannot negotiate #{path}" }
33
33
  @logged[:no_info_endpoint] = true
34
34
  end
35
35
 
@@ -38,7 +38,7 @@ module Datadog
38
38
 
39
39
  unless res.ok?
40
40
  unless @logged[:unexpected_response]
41
- Datadog.logger.warn { "agent reachable but unexpected response: cannot negotiate #{path}" }
41
+ logger.warn { "agent reachable but unexpected response: cannot negotiate #{path}" }
42
42
  @logged[:unexpected_response] = true
43
43
  end
44
44
 
@@ -47,14 +47,14 @@ module Datadog
47
47
 
48
48
  unless res.endpoints.include?(path)
49
49
  unless @logged[:no_config_endpoint]
50
- Datadog.logger.warn { "agent reachable but does not report #{path}" }
50
+ logger.warn { "agent reachable but does not report #{path}" }
51
51
  @logged[:no_config_endpoint] = true
52
52
  end
53
53
 
54
54
  return false
55
55
  end
56
56
 
57
- Datadog.logger.debug { "agent reachable and reports #{path}" }
57
+ logger.debug { "agent reachable and reports #{path}" }
58
58
 
59
59
  true
60
60
  end
@@ -32,12 +32,13 @@ module Datadog
32
32
 
33
33
  # Config transport
34
34
  class Transport
35
- attr_reader :client, :apis, :default_api, :current_api_id
35
+ attr_reader :client, :apis, :default_api, :current_api_id, :logger
36
36
 
37
- def initialize(apis, default_api)
37
+ def initialize(apis, default_api, logger: Datadog.logger)
38
38
  @apis = apis
39
+ @logger = logger
39
40
 
40
- @client = HTTP::Client.new(current_api)
41
+ @client = HTTP::Client.new(current_api, logger: logger)
41
42
  end
42
43
 
43
44
  ##### there is only one transport! it's negotiation!
@@ -15,10 +15,11 @@ module Datadog
15
15
  module HTTP
16
16
  # Routes, encodes, and sends tracer data to the trace agent via HTTP.
17
17
  class Client
18
- attr_reader :api
18
+ attr_reader :api, :logger
19
19
 
20
- def initialize(api)
20
+ def initialize(api, logger: Datadog.logger)
21
21
  @api = api
22
+ @logger = logger
22
23
  end
23
24
 
24
25
  def send_request(request, &block)
@@ -27,12 +28,12 @@ module Datadog
27
28
 
28
29
  # Get responses from API
29
30
  yield(api, env)
30
- rescue StandardError => e
31
+ rescue => e
31
32
  message =
32
33
  "Internal error during #{self.class.name} request. Cause: #{e.class.name} #{e.message} " \
33
34
  "Location: #{Array(e.backtrace).first}"
34
35
 
35
- Datadog.logger.debug(message)
36
+ logger.debug(message)
36
37
 
37
38
  Datadog::Core::Transport::InternalErrorResponse.new(e)
38
39
  end
@@ -5,6 +5,7 @@ require 'json'
5
5
  require_relative '../config'
6
6
  require_relative 'client'
7
7
  require_relative '../../../utils/base64'
8
+ require_relative '../../../utils/truncation'
8
9
  require_relative '../../../transport/http/response'
9
10
  require_relative '../../../transport/http/api/endpoint'
10
11
 
@@ -20,9 +21,11 @@ module Datadog
20
21
  include Datadog::Core::Transport::HTTP::Response
21
22
  include Core::Remote::Transport::Config::Response
22
23
 
23
- def initialize(http_response, options = {}) # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/MethodLength,Metrics/PerceivedComplexity
24
+ def initialize(http_response, options = {}) # standard:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/MethodLength,Metrics/PerceivedComplexity
24
25
  super(http_response)
25
26
 
27
+ raise AgentErrorResponse.new(http_response.code, http_response.payload) if http_response.code != 200
28
+
26
29
  begin
27
30
  payload = JSON.parse(http_response.payload, symbolize_names: true)
28
31
  rescue JSON::ParserError => e
@@ -130,8 +133,21 @@ module Datadog
130
133
  end
131
134
  end
132
135
 
136
+ # Base class for Remote Configuration Config errors
137
+ class ConfigError < StandardError
138
+ end
139
+
140
+ # When the agent returned an error response to our request
141
+ class AgentErrorResponse < ConfigError
142
+ def initialize(code, body)
143
+ truncated_body = Core::Utils::Truncation.truncate_in_middle(body, 700, 300)
144
+ message = "Agent returned an error response: #{code}: #{truncated_body}"
145
+ super(message)
146
+ end
147
+ end
148
+
133
149
  # When an expected value type is incorrect
134
- class TypeError < StandardError
150
+ class TypeError < ConfigError
135
151
  def initialize(type, value)
136
152
  message = "not a #{type}: #{value.inspect}"
137
153
 
@@ -140,7 +156,7 @@ module Datadog
140
156
  end
141
157
 
142
158
  # When value decoding fails
143
- class DecodeError < StandardError
159
+ class DecodeError < ConfigError
144
160
  def initialize(key, value)
145
161
  message = "could not decode key #{key.inspect}: #{value.inspect}"
146
162
 
@@ -149,7 +165,7 @@ module Datadog
149
165
  end
150
166
 
151
167
  # When value parsing fails
152
- class ParseError < StandardError
168
+ class ParseError < ConfigError
153
169
  def initialize(key, value)
154
170
  message = "could not parse key #{key.inspect}: #{value.inspect}"
155
171
 
@@ -177,51 +193,25 @@ module Datadog
177
193
  end
178
194
 
179
195
  def send_config(env, &block)
180
- raise NoConfigEndpointDefinedError, self if config.nil?
196
+ raise Core::Transport::HTTP::API::Spec::EndpointNotDefinedError.new('config', self) if config.nil?
181
197
 
182
198
  config.call(env, &block)
183
199
  end
184
-
185
- # Raised when traces sent but no traces endpoint is defined
186
- class NoConfigEndpointDefinedError < StandardError
187
- attr_reader :spec
188
-
189
- def initialize(spec)
190
- super()
191
-
192
- @spec = spec
193
- end
194
-
195
- def message
196
- 'No config endpoint is defined for API specification!'
197
- end
198
- end
199
200
  end
200
201
 
201
202
  # Extensions for HTTP API Instance
202
203
  module Instance
203
204
  def send_config(env)
204
- raise ConfigNotSupportedError, spec unless spec.is_a?(Config::API::Spec)
205
+ unless spec.is_a?(Config::API::Spec)
206
+ raise Core::Transport::HTTP::API::Instance::EndpointNotSupportedError.new(
207
+ 'config', self
208
+ )
209
+ end
205
210
 
206
211
  spec.send_config(env) do |request_env|
207
212
  call(request_env)
208
213
  end
209
214
  end
210
-
211
- # Raised when traces sent to API that does not support traces
212
- class ConfigNotSupportedError < StandardError
213
- attr_reader :spec
214
-
215
- def initialize(spec)
216
- super()
217
-
218
- @spec = spec
219
- end
220
-
221
- def message
222
- 'Config not supported for this API!'
223
- end
224
- end
225
215
  end
226
216
 
227
217
  # Endpoint for remote configuration
@@ -241,7 +231,7 @@ module Datadog
241
231
  env.body = env.request.parcel.data
242
232
 
243
233
  # Query for response
244
- http_response = super(env, &block)
234
+ http_response = super
245
235
 
246
236
  response_options = {}
247
237
 
@@ -50,51 +50,25 @@ module Datadog
50
50
  end
51
51
 
52
52
  def send_info(env, &block)
53
- raise NoNegotiationEndpointDefinedError, self if info.nil?
53
+ raise Core::Transport::HTTP::API::Spec::EndpointNotDefinedError.new('info', self) if info.nil?
54
54
 
55
55
  info.call(env, &block)
56
56
  end
57
-
58
- # Raised when traces sent but no traces endpoint is defined
59
- class NoNegotiationEndpointDefinedError < StandardError
60
- attr_reader :spec
61
-
62
- def initialize(spec)
63
- super()
64
-
65
- @spec = spec
66
- end
67
-
68
- def message
69
- 'No info endpoint is defined for API specification!'
70
- end
71
- end
72
57
  end
73
58
 
74
59
  # Extensions for HTTP API Instance
75
60
  module Instance
76
61
  def send_info(env)
77
- raise NegotiationNotSupportedError, spec unless spec.is_a?(Negotiation::API::Spec)
62
+ unless spec.is_a?(Negotiation::API::Spec)
63
+ raise Core::Transport::HTTP::API::Instance::EndpointNotSupportedError.new(
64
+ 'info', self
65
+ )
66
+ end
78
67
 
79
68
  spec.send_info(env) do |request_env|
80
69
  call(request_env)
81
70
  end
82
71
  end
83
-
84
- # Raised when traces sent to API that does not support traces
85
- class NegotiationNotSupportedError < StandardError
86
- attr_reader :spec
87
-
88
- def initialize(spec)
89
- super()
90
-
91
- @spec = spec
92
- end
93
-
94
- def message
95
- 'Info not supported for this API!'
96
- end
97
- end
98
72
  end
99
73
 
100
74
  # Endpoint for negotiation
@@ -105,7 +79,7 @@ module Datadog
105
79
 
106
80
  def call(env, &block)
107
81
  # Query for response
108
- http_response = super(env, &block)
82
+ http_response = super
109
83
 
110
84
  # Process the response
111
85
  body = JSON.parse(http_response.payload, symbolize_names: true) if http_response.ok?
@@ -29,87 +29,52 @@ module Datadog
29
29
  module HTTP
30
30
  module_function
31
31
 
32
- # Builds a new Transport::HTTP::Client
33
- def new(klass, &block)
34
- Core::Transport::HTTP.build(
35
- api_instance_class: API::Instance, &block
36
- ).to_transport(klass)
37
- end
38
-
39
32
  # Builds a new Transport::HTTP::Client with default settings
40
33
  # Pass a block to override any settings.
41
34
  def root(
42
35
  agent_settings:,
43
- **options
36
+ logger: Datadog.logger,
37
+ api_version: nil,
38
+ headers: nil
44
39
  )
45
- new(Core::Remote::Transport::Negotiation::Transport) do |transport|
46
- transport.adapter(agent_settings)
47
- transport.headers(default_headers)
48
-
40
+ Core::Transport::HTTP.build(
41
+ api_instance_class: API::Instance,
42
+ agent_settings: agent_settings,
43
+ logger: logger,
44
+ api_version: api_version,
45
+ headers: headers
46
+ ) do |transport|
49
47
  apis = API.defaults
50
48
 
51
49
  transport.api API::ROOT, apis[API::ROOT]
52
50
 
53
- # Apply any settings given by options
54
- unless options.empty?
55
- transport.default_api = options[:api_version] if options.key?(:api_version)
56
- transport.headers options[:headers] if options.key?(:headers)
57
- end
58
-
59
51
  # Call block to apply any customization, if provided
60
52
  yield(transport) if block_given?
61
- end
53
+ end.to_transport(Core::Remote::Transport::Negotiation::Transport)
62
54
  end
63
55
 
64
56
  # Builds a new Transport::HTTP::Client with default settings
65
57
  # Pass a block to override any settings.
66
58
  def v7(
67
59
  agent_settings:,
68
- **options
60
+ logger: Datadog.logger,
61
+ api_version: nil,
62
+ headers: nil
69
63
  )
70
- new(Core::Remote::Transport::Config::Transport) do |transport|
71
- transport.adapter(agent_settings)
72
- transport.headers default_headers
73
-
64
+ Core::Transport::HTTP.build(
65
+ api_instance_class: API::Instance,
66
+ agent_settings: agent_settings,
67
+ logger: logger,
68
+ api_version: api_version,
69
+ headers: headers
70
+ ) do |transport|
74
71
  apis = API.defaults
75
72
 
76
73
  transport.api API::V7, apis[API::V7]
77
74
 
78
- # Apply any settings given by options
79
- unless options.empty?
80
- transport.default_api = options[:api_version] if options.key?(:api_version)
81
- transport.headers options[:headers] if options.key?(:headers)
82
- end
83
-
84
75
  # Call block to apply any customization, if provided
85
76
  yield(transport) if block_given?
86
- end
87
- end
88
-
89
- def default_headers
90
- {
91
- Datadog::Core::Transport::Ext::HTTP::HEADER_CLIENT_COMPUTED_TOP_LEVEL => '1',
92
- Datadog::Core::Transport::Ext::HTTP::HEADER_META_LANG => Datadog::Core::Environment::Ext::LANG,
93
- Datadog::Core::Transport::Ext::HTTP::HEADER_META_LANG_VERSION =>
94
- Datadog::Core::Environment::Ext::LANG_VERSION,
95
- Datadog::Core::Transport::Ext::HTTP::HEADER_META_LANG_INTERPRETER =>
96
- Datadog::Core::Environment::Ext::LANG_INTERPRETER,
97
- Datadog::Core::Transport::Ext::HTTP::HEADER_META_TRACER_VERSION =>
98
- Datadog::Core::Environment::Ext::GEM_DATADOG_VERSION
99
- }.tap do |headers|
100
- # Add container ID, if present.
101
- container_id = Datadog::Core::Environment::Container.container_id
102
- headers[Datadog::Core::Transport::Ext::HTTP::HEADER_CONTAINER_ID] = container_id unless container_id.nil?
103
- # Sending this header to the agent will disable metrics computation (and billing) on the agent side
104
- # by pretending it has already been done on the library side.
105
- if Datadog.configuration.appsec.standalone.enabled
106
- headers[Datadog::Core::Transport::Ext::HTTP::HEADER_CLIENT_COMPUTED_STATS] = 'yes'
107
- end
108
- end
109
- end
110
-
111
- def default_adapter
112
- Datadog::Core::Configuration::Ext::Agent::HTTP::ADAPTER
77
+ end.to_transport(Core::Remote::Transport::Config::Transport)
113
78
  end
114
79
  end
115
80
  end
@@ -49,12 +49,13 @@ module Datadog
49
49
 
50
50
  # Negotiation transport
51
51
  class Transport
52
- attr_reader :client, :apis, :default_api, :current_api_id
52
+ attr_reader :client, :apis, :default_api, :current_api_id, :logger
53
53
 
54
- def initialize(apis, default_api)
54
+ def initialize(apis, default_api, logger: Datadog.logger)
55
55
  @apis = apis
56
+ @logger = logger
56
57
 
57
- @client = HTTP::Client.new(current_api)
58
+ @client = HTTP::Client.new(current_api, logger: logger)
58
59
  end
59
60
 
60
61
  def send_info
@@ -14,13 +14,16 @@ module Datadog
14
14
  module Runtime
15
15
  # For generating runtime metrics
16
16
  class Metrics < Core::Metrics::Client
17
- def initialize(**options)
17
+ def initialize(telemetry:, **options)
18
18
  super
19
19
 
20
20
  # Initialize service list
21
21
  @services = Set.new(options.fetch(:services, []))
22
22
  @service_tags = nil
23
23
  compile_service_tags!
24
+
25
+ # Initialize the collection of runtime-id
26
+ @runtime_id_enabled = options.fetch(:experimental_runtime_id_enabled, false)
24
27
  end
25
28
 
26
29
  # Associate service with runtime metrics
@@ -93,7 +96,7 @@ module Datadog
93
96
 
94
97
  def try_flush
95
98
  yield
96
- rescue StandardError => e
99
+ rescue => e
97
100
  Datadog.logger.warn("Error while sending runtime metric. Cause: #{e.class.name} #{e.message}")
98
101
  end
99
102
 
@@ -105,6 +108,9 @@ module Datadog
105
108
 
106
109
  # Add services dynamically because they might change during runtime.
107
110
  options[:tags].concat(service_tags) unless service_tags.nil?
111
+
112
+ # Add runtime-id dynamically because it might change during runtime.
113
+ options[:tags].concat(["runtime-id:#{Core::Environment::Identity.id}"]) if @runtime_id_enabled
108
114
  end
109
115
  end
110
116
 
@@ -112,7 +118,8 @@ module Datadog
112
118
 
113
119
  attr_reader \
114
120
  :service_tags,
115
- :services
121
+ :services,
122
+ :runtime_id_enabled
116
123
 
117
124
  def compile_service_tags!
118
125
  @service_tags = services.to_a.collect do |service|
@@ -140,7 +147,7 @@ module Datadog
140
147
  gauge(metric_name, metric_value) if metric_value
141
148
  end
142
149
 
143
- # rubocop:disable Metrics/MethodLength
150
+ # standard:disable Metrics/MethodLength
144
151
  def flush_yjit_stats
145
152
  # Only on Ruby >= 3.2
146
153
  try_flush do
@@ -188,7 +195,7 @@ module Datadog
188
195
  end
189
196
  end
190
197
  end
191
- # rubocop:enable Metrics/MethodLength
198
+ # standard:enable Metrics/MethodLength
192
199
  end
193
200
  end
194
201
  end