datadog 2.20.0 → 2.26.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 (310) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +212 -1
  3. data/README.md +0 -1
  4. data/ext/LIBDATADOG_DEVELOPMENT.md +3 -0
  5. data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +93 -23
  6. data/ext/datadog_profiling_native_extension/collectors_discrete_dynamic_sampler.c +1 -1
  7. data/ext/datadog_profiling_native_extension/collectors_stack.c +21 -5
  8. data/ext/datadog_profiling_native_extension/crashtracking_runtime_stacks.c +239 -0
  9. data/ext/datadog_profiling_native_extension/datadog_ruby_common.h +1 -1
  10. data/ext/datadog_profiling_native_extension/extconf.rb +9 -4
  11. data/ext/datadog_profiling_native_extension/heap_recorder.c +1 -1
  12. data/ext/datadog_profiling_native_extension/http_transport.c +1 -0
  13. data/ext/datadog_profiling_native_extension/private_vm_api_access.c +12 -0
  14. data/ext/datadog_profiling_native_extension/private_vm_api_access.h +4 -0
  15. data/ext/datadog_profiling_native_extension/profiling.c +2 -0
  16. data/ext/libdatadog_api/datadog_ruby_common.h +1 -1
  17. data/ext/libdatadog_api/ddsketch.c +106 -0
  18. data/ext/libdatadog_api/feature_flags.c +554 -0
  19. data/ext/libdatadog_api/feature_flags.h +5 -0
  20. data/ext/libdatadog_api/init.c +5 -0
  21. data/ext/libdatadog_api/library_config.c +34 -25
  22. data/ext/libdatadog_api/process_discovery.c +24 -18
  23. data/ext/libdatadog_extconf_helpers.rb +1 -1
  24. data/lib/datadog/ai_guard/api_client.rb +82 -0
  25. data/lib/datadog/ai_guard/component.rb +42 -0
  26. data/lib/datadog/ai_guard/configuration/ext.rb +17 -0
  27. data/lib/datadog/ai_guard/configuration/settings.rb +98 -0
  28. data/lib/datadog/ai_guard/configuration.rb +11 -0
  29. data/lib/datadog/ai_guard/evaluation/message.rb +25 -0
  30. data/lib/datadog/ai_guard/evaluation/no_op_result.rb +34 -0
  31. data/lib/datadog/ai_guard/evaluation/request.rb +81 -0
  32. data/lib/datadog/ai_guard/evaluation/result.rb +43 -0
  33. data/lib/datadog/ai_guard/evaluation/tool_call.rb +18 -0
  34. data/lib/datadog/ai_guard/evaluation.rb +72 -0
  35. data/lib/datadog/ai_guard/ext.rb +16 -0
  36. data/lib/datadog/ai_guard.rb +153 -0
  37. data/lib/datadog/appsec/api_security/endpoint_collection/grape_route_serializer.rb +26 -0
  38. data/lib/datadog/appsec/api_security/endpoint_collection/rails_collector.rb +59 -0
  39. data/lib/datadog/appsec/api_security/endpoint_collection/rails_route_serializer.rb +29 -0
  40. data/lib/datadog/appsec/api_security/endpoint_collection/sinatra_route_serializer.rb +26 -0
  41. data/lib/datadog/appsec/api_security/endpoint_collection.rb +10 -0
  42. data/lib/datadog/appsec/api_security/route_extractor.rb +26 -5
  43. data/lib/datadog/appsec/api_security/sampler.rb +7 -4
  44. data/lib/datadog/appsec/assets/blocked.html +8 -0
  45. data/lib/datadog/appsec/assets/blocked.json +1 -1
  46. data/lib/datadog/appsec/assets/blocked.text +3 -1
  47. data/lib/datadog/appsec/assets/waf_rules/README.md +30 -36
  48. data/lib/datadog/appsec/assets/waf_rules/recommended.json +359 -4
  49. data/lib/datadog/appsec/assets/waf_rules/strict.json +43 -2
  50. data/lib/datadog/appsec/assets.rb +1 -1
  51. data/lib/datadog/appsec/autoload.rb +1 -1
  52. data/lib/datadog/appsec/compressed_json.rb +1 -1
  53. data/lib/datadog/appsec/configuration/settings.rb +9 -0
  54. data/lib/datadog/appsec/context.rb +2 -1
  55. data/lib/datadog/appsec/contrib/active_record/instrumentation.rb +3 -1
  56. data/lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb +3 -2
  57. data/lib/datadog/appsec/contrib/faraday/ssrf_detection_middleware.rb +3 -1
  58. data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +3 -1
  59. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +9 -4
  60. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +5 -1
  61. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +7 -2
  62. data/lib/datadog/appsec/contrib/rails/patcher.rb +30 -0
  63. data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +3 -1
  64. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +10 -4
  65. data/lib/datadog/appsec/event.rb +12 -14
  66. data/lib/datadog/appsec/metrics/collector.rb +19 -3
  67. data/lib/datadog/appsec/metrics/telemetry_exporter.rb +2 -1
  68. data/lib/datadog/appsec/monitor/gateway/watcher.rb +4 -4
  69. data/lib/datadog/appsec/remote.rb +34 -25
  70. data/lib/datadog/appsec/response.rb +18 -4
  71. data/lib/datadog/appsec/security_engine/engine.rb +3 -3
  72. data/lib/datadog/appsec/security_engine/result.rb +29 -9
  73. data/lib/datadog/appsec/security_engine/runner.rb +19 -9
  74. data/lib/datadog/appsec/security_event.rb +5 -7
  75. data/lib/datadog/core/configuration/agent_settings_resolver.rb +4 -4
  76. data/lib/datadog/core/configuration/components.rb +59 -11
  77. data/lib/datadog/core/configuration/config_helper.rb +100 -0
  78. data/lib/datadog/core/configuration/deprecations.rb +36 -0
  79. data/lib/datadog/core/configuration/ext.rb +0 -1
  80. data/lib/datadog/core/configuration/option.rb +38 -43
  81. data/lib/datadog/core/configuration/option_definition.rb +4 -11
  82. data/lib/datadog/core/configuration/options.rb +9 -10
  83. data/lib/datadog/core/configuration/settings.rb +38 -9
  84. data/lib/datadog/core/configuration/stable_config.rb +10 -0
  85. data/lib/datadog/core/configuration/supported_configurations.rb +373 -0
  86. data/lib/datadog/core/configuration.rb +2 -2
  87. data/lib/datadog/core/ddsketch.rb +19 -0
  88. data/lib/datadog/core/deprecations.rb +2 -2
  89. data/lib/datadog/core/environment/cgroup.rb +52 -25
  90. data/lib/datadog/core/environment/container.rb +140 -46
  91. data/lib/datadog/core/environment/ext.rb +7 -2
  92. data/lib/datadog/core/environment/git.rb +2 -2
  93. data/lib/datadog/core/environment/process.rb +87 -0
  94. data/lib/datadog/core/environment/variable_helpers.rb +3 -3
  95. data/lib/datadog/core/environment/yjit.rb +2 -1
  96. data/lib/datadog/core/error.rb +6 -6
  97. data/lib/datadog/core/feature_flags.rb +61 -0
  98. data/lib/datadog/core/metrics/client.rb +2 -2
  99. data/lib/datadog/core/pin.rb +8 -8
  100. data/lib/datadog/core/process_discovery/tracer_memfd.rb +2 -4
  101. data/lib/datadog/core/process_discovery.rb +48 -23
  102. data/lib/datadog/core/rate_limiter.rb +9 -1
  103. data/lib/datadog/core/remote/client/capabilities.rb +7 -0
  104. data/lib/datadog/core/remote/client.rb +14 -6
  105. data/lib/datadog/core/remote/component.rb +10 -10
  106. data/lib/datadog/core/remote/configuration/content.rb +15 -2
  107. data/lib/datadog/core/remote/configuration/digest.rb +14 -7
  108. data/lib/datadog/core/remote/configuration/repository.rb +1 -1
  109. data/lib/datadog/core/remote/configuration/target.rb +13 -6
  110. data/lib/datadog/core/remote/transport/config.rb +4 -25
  111. data/lib/datadog/core/remote/transport/http/config.rb +10 -50
  112. data/lib/datadog/core/remote/transport/http/negotiation.rb +14 -44
  113. data/lib/datadog/core/remote/transport/http.rb +15 -24
  114. data/lib/datadog/core/remote/transport/negotiation.rb +8 -33
  115. data/lib/datadog/core/remote/worker.rb +25 -37
  116. data/lib/datadog/core/runtime/ext.rb +0 -1
  117. data/lib/datadog/core/runtime/metrics.rb +11 -1
  118. data/lib/datadog/core/semaphore.rb +1 -4
  119. data/lib/datadog/core/tag_builder.rb +0 -4
  120. data/lib/datadog/core/tag_normalizer.rb +84 -0
  121. data/lib/datadog/core/telemetry/component.rb +69 -15
  122. data/lib/datadog/core/telemetry/emitter.rb +6 -6
  123. data/lib/datadog/core/telemetry/event/app_endpoints_loaded.rb +30 -0
  124. data/lib/datadog/core/telemetry/event/app_started.rb +89 -51
  125. data/lib/datadog/core/telemetry/event/synth_app_client_configuration_change.rb +27 -4
  126. data/lib/datadog/core/telemetry/event.rb +1 -0
  127. data/lib/datadog/core/telemetry/logger.rb +2 -2
  128. data/lib/datadog/core/telemetry/logging.rb +2 -8
  129. data/lib/datadog/core/telemetry/metrics_manager.rb +9 -0
  130. data/lib/datadog/core/telemetry/request.rb +17 -3
  131. data/lib/datadog/core/telemetry/transport/http/telemetry.rb +3 -34
  132. data/lib/datadog/core/telemetry/transport/http.rb +21 -16
  133. data/lib/datadog/core/telemetry/transport/telemetry.rb +3 -11
  134. data/lib/datadog/core/telemetry/worker.rb +88 -32
  135. data/lib/datadog/core/transport/ext.rb +2 -0
  136. data/lib/datadog/core/transport/http/api/endpoint.rb +9 -4
  137. data/lib/datadog/core/transport/http/api/instance.rb +4 -21
  138. data/lib/datadog/core/transport/http/builder.rb +9 -5
  139. data/lib/datadog/core/transport/http/client.rb +80 -0
  140. data/lib/datadog/core/transport/http.rb +22 -19
  141. data/lib/datadog/core/transport/response.rb +15 -1
  142. data/lib/datadog/core/transport/transport.rb +90 -0
  143. data/lib/datadog/core/utils/array.rb +29 -0
  144. data/lib/datadog/{appsec/api_security → core/utils}/lru_cache.rb +10 -21
  145. data/lib/datadog/core/utils/network.rb +22 -1
  146. data/lib/datadog/core/utils/only_once_successful.rb +8 -2
  147. data/lib/datadog/core/utils/safe_dup.rb +2 -2
  148. data/lib/datadog/core/utils/sequence.rb +2 -0
  149. data/lib/datadog/core/utils/time.rb +1 -1
  150. data/lib/datadog/core/utils.rb +2 -0
  151. data/lib/datadog/core/workers/async.rb +10 -1
  152. data/lib/datadog/core/workers/interval_loop.rb +44 -3
  153. data/lib/datadog/core/workers/polling.rb +2 -0
  154. data/lib/datadog/core/workers/queue.rb +100 -1
  155. data/lib/datadog/core.rb +2 -0
  156. data/lib/datadog/data_streams/configuration/settings.rb +49 -0
  157. data/lib/datadog/data_streams/configuration.rb +11 -0
  158. data/lib/datadog/data_streams/ext.rb +11 -0
  159. data/lib/datadog/data_streams/extensions.rb +16 -0
  160. data/lib/datadog/data_streams/pathway_context.rb +169 -0
  161. data/lib/datadog/data_streams/processor.rb +509 -0
  162. data/lib/datadog/data_streams/transport/http/stats.rb +52 -0
  163. data/lib/datadog/data_streams/transport/http.rb +40 -0
  164. data/lib/datadog/data_streams/transport/stats.rb +46 -0
  165. data/lib/datadog/data_streams.rb +100 -0
  166. data/lib/datadog/di/boot.rb +7 -3
  167. data/lib/datadog/di/component.rb +14 -16
  168. data/lib/datadog/di/context.rb +70 -0
  169. data/lib/datadog/di/contrib/active_record.rb +30 -5
  170. data/lib/datadog/di/el/compiler.rb +168 -0
  171. data/lib/datadog/di/el/evaluator.rb +159 -0
  172. data/lib/datadog/di/el/expression.rb +42 -0
  173. data/lib/datadog/di/el.rb +5 -0
  174. data/lib/datadog/di/error.rb +34 -0
  175. data/lib/datadog/di/instrumenter.rb +189 -55
  176. data/lib/datadog/di/logger.rb +2 -2
  177. data/lib/datadog/di/probe.rb +55 -15
  178. data/lib/datadog/di/probe_builder.rb +41 -2
  179. data/lib/datadog/di/probe_file_loader/railtie.rb +1 -1
  180. data/lib/datadog/di/probe_file_loader.rb +1 -1
  181. data/lib/datadog/di/probe_manager.rb +50 -35
  182. data/lib/datadog/di/probe_notification_builder.rb +121 -70
  183. data/lib/datadog/di/probe_notifier_worker.rb +5 -5
  184. data/lib/datadog/di/proc_responder.rb +32 -0
  185. data/lib/datadog/di/remote.rb +89 -84
  186. data/lib/datadog/di/serializer.rb +151 -7
  187. data/lib/datadog/di/transport/diagnostics.rb +8 -36
  188. data/lib/datadog/di/transport/http/diagnostics.rb +1 -33
  189. data/lib/datadog/di/transport/http/input.rb +1 -33
  190. data/lib/datadog/di/transport/http.rb +32 -17
  191. data/lib/datadog/di/transport/input.rb +67 -34
  192. data/lib/datadog/di.rb +61 -5
  193. data/lib/datadog/error_tracking/filters.rb +2 -2
  194. data/lib/datadog/kit/appsec/events/v2.rb +2 -3
  195. data/lib/datadog/open_feature/component.rb +60 -0
  196. data/lib/datadog/open_feature/configuration.rb +27 -0
  197. data/lib/datadog/open_feature/evaluation_engine.rb +70 -0
  198. data/lib/datadog/open_feature/exposures/batch_builder.rb +32 -0
  199. data/lib/datadog/open_feature/exposures/buffer.rb +43 -0
  200. data/lib/datadog/open_feature/exposures/deduplicator.rb +30 -0
  201. data/lib/datadog/open_feature/exposures/event.rb +60 -0
  202. data/lib/datadog/open_feature/exposures/reporter.rb +40 -0
  203. data/lib/datadog/open_feature/exposures/worker.rb +116 -0
  204. data/lib/datadog/open_feature/ext.rb +14 -0
  205. data/lib/datadog/open_feature/native_evaluator.rb +38 -0
  206. data/lib/datadog/open_feature/noop_evaluator.rb +26 -0
  207. data/lib/datadog/open_feature/provider.rb +141 -0
  208. data/lib/datadog/open_feature/remote.rb +67 -0
  209. data/lib/datadog/open_feature/resolution_details.rb +35 -0
  210. data/lib/datadog/open_feature/transport.rb +70 -0
  211. data/lib/datadog/open_feature.rb +19 -0
  212. data/lib/datadog/opentelemetry/api/baggage.rb +1 -1
  213. data/lib/datadog/opentelemetry/configuration/settings.rb +159 -0
  214. data/lib/datadog/opentelemetry/metrics.rb +117 -0
  215. data/lib/datadog/opentelemetry/sdk/configurator.rb +26 -2
  216. data/lib/datadog/opentelemetry/sdk/metrics_exporter.rb +35 -0
  217. data/lib/datadog/opentelemetry.rb +3 -0
  218. data/lib/datadog/profiling/collectors/code_provenance.rb +41 -7
  219. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +3 -2
  220. data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +1 -1
  221. data/lib/datadog/profiling/collectors/info.rb +6 -5
  222. data/lib/datadog/profiling/component.rb +12 -11
  223. data/lib/datadog/profiling/ext/dir_monkey_patches.rb +18 -0
  224. data/lib/datadog/profiling/ext.rb +2 -1
  225. data/lib/datadog/profiling/http_transport.rb +5 -2
  226. data/lib/datadog/profiling/profiler.rb +4 -0
  227. data/lib/datadog/profiling/tag_builder.rb +36 -3
  228. data/lib/datadog/profiling/tasks/exec.rb +2 -2
  229. data/lib/datadog/profiling.rb +1 -2
  230. data/lib/datadog/single_step_instrument.rb +1 -1
  231. data/lib/datadog/tracing/component.rb +6 -17
  232. data/lib/datadog/tracing/configuration/dynamic.rb +2 -2
  233. data/lib/datadog/tracing/configuration/ext.rb +9 -3
  234. data/lib/datadog/tracing/configuration/settings.rb +89 -10
  235. data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +4 -4
  236. data/lib/datadog/tracing/contrib/action_pack/utils.rb +1 -2
  237. data/lib/datadog/tracing/contrib/active_job/log_injection.rb +21 -7
  238. data/lib/datadog/tracing/contrib/active_job/patcher.rb +5 -1
  239. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +4 -2
  240. data/lib/datadog/tracing/contrib/component.rb +2 -2
  241. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +4 -1
  242. data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +11 -3
  243. data/lib/datadog/tracing/contrib/extensions.rb +10 -2
  244. data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +11 -7
  245. data/lib/datadog/tracing/contrib/grape/configuration/settings.rb +7 -3
  246. data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +7 -0
  247. data/lib/datadog/tracing/contrib/graphql/ext.rb +1 -0
  248. data/lib/datadog/tracing/contrib/graphql/unified_trace.rb +84 -43
  249. data/lib/datadog/tracing/contrib/http/configuration/settings.rb +11 -3
  250. data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +11 -3
  251. data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +11 -3
  252. data/lib/datadog/tracing/contrib/kafka/instrumentation/consumer.rb +66 -0
  253. data/lib/datadog/tracing/contrib/kafka/instrumentation/producer.rb +66 -0
  254. data/lib/datadog/tracing/contrib/kafka/patcher.rb +14 -0
  255. data/lib/datadog/tracing/contrib/karafka/framework.rb +30 -0
  256. data/lib/datadog/tracing/contrib/karafka/monitor.rb +11 -0
  257. data/lib/datadog/tracing/contrib/karafka/patcher.rb +35 -4
  258. data/lib/datadog/tracing/contrib/rack/middlewares.rb +59 -27
  259. data/lib/datadog/tracing/contrib/rack/request_queue.rb +1 -0
  260. data/lib/datadog/tracing/contrib/rack/route_inference.rb +53 -0
  261. data/lib/datadog/tracing/contrib/rack/trace_proxy_middleware.rb +7 -1
  262. data/lib/datadog/tracing/contrib/rails/ext.rb +2 -1
  263. data/lib/datadog/tracing/contrib/rails/integration.rb +1 -1
  264. data/lib/datadog/tracing/contrib/rails/middlewares.rb +2 -2
  265. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +4 -1
  266. data/lib/datadog/tracing/contrib/roda/instrumentation.rb +3 -1
  267. data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +3 -1
  268. data/lib/datadog/tracing/contrib/span_attribute_schema.rb +1 -1
  269. data/lib/datadog/tracing/contrib/status_range_matcher.rb +9 -1
  270. data/lib/datadog/tracing/contrib/utils/quantization/hash.rb +3 -1
  271. data/lib/datadog/tracing/contrib/waterdrop/configuration/settings.rb +27 -0
  272. data/lib/datadog/tracing/contrib/waterdrop/distributed/propagation.rb +48 -0
  273. data/lib/datadog/tracing/contrib/waterdrop/ext.rb +17 -0
  274. data/lib/datadog/tracing/contrib/waterdrop/integration.rb +43 -0
  275. data/lib/datadog/tracing/contrib/waterdrop/middleware.rb +46 -0
  276. data/lib/datadog/tracing/contrib/waterdrop/patcher.rb +49 -0
  277. data/lib/datadog/tracing/contrib/waterdrop/producer.rb +50 -0
  278. data/lib/datadog/tracing/contrib/waterdrop.rb +41 -0
  279. data/lib/datadog/tracing/contrib.rb +1 -0
  280. data/lib/datadog/tracing/diagnostics/environment_logger.rb +1 -1
  281. data/lib/datadog/tracing/distributed/baggage.rb +3 -2
  282. data/lib/datadog/tracing/metadata/ext.rb +9 -1
  283. data/lib/datadog/tracing/remote.rb +1 -9
  284. data/lib/datadog/tracing/sampling/priority_sampler.rb +3 -1
  285. data/lib/datadog/tracing/span.rb +1 -1
  286. data/lib/datadog/tracing/span_event.rb +2 -2
  287. data/lib/datadog/tracing/span_operation.rb +20 -9
  288. data/lib/datadog/tracing/trace_operation.rb +44 -6
  289. data/lib/datadog/tracing/tracer.rb +42 -16
  290. data/lib/datadog/tracing/transport/http/client.rb +12 -26
  291. data/lib/datadog/tracing/transport/http/traces.rb +2 -50
  292. data/lib/datadog/tracing/transport/http.rb +15 -9
  293. data/lib/datadog/tracing/transport/io/client.rb +1 -1
  294. data/lib/datadog/tracing/transport/trace_formatter.rb +11 -0
  295. data/lib/datadog/tracing/transport/traces.rb +9 -71
  296. data/lib/datadog/tracing/workers/trace_writer.rb +5 -0
  297. data/lib/datadog/tracing/writer.rb +1 -0
  298. data/lib/datadog/version.rb +2 -2
  299. data/lib/datadog.rb +3 -0
  300. metadata +110 -24
  301. data/ext/libdatadog_api/macos_development.md +0 -26
  302. data/lib/datadog/core/remote/transport/http/api.rb +0 -53
  303. data/lib/datadog/core/remote/transport/http/client.rb +0 -49
  304. data/lib/datadog/core/telemetry/transport/http/api.rb +0 -43
  305. data/lib/datadog/core/telemetry/transport/http/client.rb +0 -49
  306. data/lib/datadog/core/transport/http/api/spec.rb +0 -36
  307. data/lib/datadog/di/transport/http/api.rb +0 -42
  308. data/lib/datadog/di/transport/http/client.rb +0 -47
  309. data/lib/datadog/opentelemetry/api/baggage.rbs +0 -26
  310. data/lib/datadog/tracing/transport/http/api.rb +0 -44
@@ -14,10 +14,11 @@ module Datadog
14
14
 
15
15
  class SyncError < StandardError; end
16
16
 
17
- attr_reader :transport, :repository, :id, :dispatcher, :logger
17
+ attr_reader :transport, :repository, :id, :dispatcher, :settings, :logger
18
18
 
19
- def initialize(transport, capabilities, logger: Datadog.logger, repository: Configuration::Repository.new)
19
+ def initialize(transport, capabilities, settings:, logger:, repository: Configuration::Repository.new)
20
20
  @transport = transport
21
+ @settings = settings
21
22
  @logger = logger
22
23
 
23
24
  @repository = repository
@@ -97,7 +98,9 @@ module Datadog
97
98
  content = contents.find_content(path, target)
98
99
 
99
100
  # abort entirely if matching content not found
100
- raise SyncError, "no valid content for target at path '#{path}'" if content.nil?
101
+ if content.nil?
102
+ raise SyncError, "no valid content for target at path '#{path}'"
103
+ end
101
104
 
102
105
  # to be added or updated << config
103
106
  # TODO: metadata (hash, version, etc...)
@@ -153,14 +156,19 @@ module Datadog
153
156
  language: Core::Environment::Identity.lang,
154
157
  tracer_version: tracer_version,
155
158
  service: service_name,
156
- env: Datadog.configuration.env,
159
+ env: settings.env,
157
160
  tags: client_tracer_tags,
158
161
  }
159
162
 
160
- app_version = Datadog.configuration.version
163
+ app_version = settings.version
161
164
 
162
165
  client_tracer[:app_version] = app_version if app_version
163
166
 
167
+ if settings.experimental_propagate_process_tags_enabled
168
+ process_tags = Core::Environment::Process.tags
169
+ client_tracer[:process_tags] = process_tags if process_tags.any?
170
+ end
171
+
164
172
  {
165
173
  client: {
166
174
  state: {
@@ -184,7 +192,7 @@ module Datadog
184
192
  end
185
193
 
186
194
  def service_name
187
- Datadog.configuration.remote.service || Datadog.configuration.service
195
+ settings.remote.service || settings.service
188
196
  end
189
197
 
190
198
  def tracer_version
@@ -11,9 +11,11 @@ module Datadog
11
11
  module Core
12
12
  module Remote
13
13
  # Configures the HTTP transport to communicate with the agent
14
- # to fetch and sync the remote configuration
14
+ # to fetch and sync the remote configuration.
15
+ #
16
+ # @api private
15
17
  class Component
16
- attr_reader :logger, :client, :healthy
18
+ attr_reader :logger, :client, :healthy, :worker
17
19
 
18
20
  def initialize(settings, capabilities, agent_settings, logger:)
19
21
  @logger = logger
@@ -23,7 +25,7 @@ module Datadog
23
25
 
24
26
  @barrier = Barrier.new(settings.remote.boot_timeout_seconds)
25
27
 
26
- @client = Client.new(transport_v7, capabilities, logger: logger)
28
+ @client = Client.new(transport_v7, capabilities, settings: settings, logger: logger)
27
29
  @healthy = false
28
30
  logger.debug { "new remote configuration client: #{@client.id}" }
29
31
 
@@ -55,7 +57,7 @@ module Datadog
55
57
  end
56
58
 
57
59
  # client state is unknown, state might be corrupted
58
- @client = Client.new(transport_v7, capabilities, logger: logger)
60
+ @client = Client.new(transport_v7, capabilities, settings: settings, logger: logger)
59
61
  @healthy = false
60
62
  logger.debug { "new remote configuration client: #{@client.id}" }
61
63
 
@@ -135,13 +137,11 @@ module Datadog
135
137
 
136
138
  # Release all current waiters
137
139
  def lift
138
- @mutex.lock
140
+ @mutex.synchronize do
141
+ @once ||= true
139
142
 
140
- @once ||= true
141
-
142
- @condition.broadcast
143
- ensure
144
- @mutex.unlock
143
+ @condition.broadcast
144
+ end
145
145
  end
146
146
  end
147
147
 
@@ -22,6 +22,18 @@ module Datadog
22
22
  attr_accessor :version
23
23
 
24
24
  def initialize(path:, data:)
25
+ if data.nil?
26
+ # +data+ is passed to Digest calculation and also is
27
+ # unconditionally taken length of by +length+ method.
28
+ # As such, the class is not written to expect +data+ to be nil.
29
+ # Detect bad incoming values here to provide earlier diagnostics
30
+ # when developing tests, for example.
31
+ raise ArgumentError, 'data must not be nil'
32
+ end
33
+ unless String === data
34
+ raise ArgumentError, "Invalid type for data: #{data.class}: expected String"
35
+ end
36
+
25
37
  @path = path
26
38
  @data = data
27
39
  @apply_state = ApplyState::UNACKNOWLEDGED
@@ -72,8 +84,9 @@ module Datadog
72
84
  private_class_method :new
73
85
  end
74
86
 
75
- # ContentList stores a list of Conetnt instances
76
- # It provides convinient methods for finding content base on Configuration::Path and Configuration::Target
87
+ # ContentList stores a list of Content instances.
88
+ # It provides convenient methods for finding content based on
89
+ # Configuration::Path and Configuration::Target.
77
90
  class ContentList < Array
78
91
  class << self
79
92
  def parse(array)
@@ -24,10 +24,21 @@ module Datadog
24
24
  class InvalidHashTypeError < StandardError; end
25
25
  attr_reader :type, :hexdigest
26
26
 
27
- DIGEST_CHUNK = 1024
28
-
29
27
  class << self
30
28
  def hexdigest(type, data)
29
+ unless String === data
30
+ # This class (Digest) passes +data+ to the Ruby standard
31
+ # library Digest routines without validating its type.
32
+ # The stdlib Digest requires a String, and the previous
33
+ # implementation of this class that used StringIO
34
+ # unconditionally read from +data+ without validating the
35
+ # type. Meaning, passing +nil+ as +data+ has never worked.
36
+ # It still doesn't work in the present implementation.
37
+ # Flag the nil data now to get earlier diagnostics when
38
+ # developing tests for example.
39
+ raise ArgumentError, "Invalid type for data: #{data.class}: expected String"
40
+ end
41
+
31
42
  d = case type
32
43
  when :sha256
33
44
  ::Digest::SHA256.new
@@ -37,13 +48,9 @@ module Datadog
37
48
  raise InvalidHashTypeError, type
38
49
  end
39
50
 
40
- while (buf = data.read(DIGEST_CHUNK))
41
- d.update(buf)
42
- end
51
+ d.update(data)
43
52
 
44
53
  d.hexdigest
45
- ensure
46
- data.rewind
47
54
  end
48
55
  end
49
56
 
@@ -185,7 +185,7 @@ module Datadog
185
185
  end
186
186
  end
187
187
 
188
- # Update existimng repository's contents
188
+ # Update existing repository's contents
189
189
  class Update
190
190
  attr_reader :path, :target, :content
191
191
 
@@ -11,8 +11,15 @@ module Datadog
11
11
  class TargetMap < Hash
12
12
  class << self
13
13
  def parse(hash)
14
- opaque_backend_state = hash['signed']['custom']['opaque_backend_state']
15
- version = hash['signed']['version']
14
+ signed = hash.fetch('signed')
15
+ # Note that the +dig+ call permits +hash['signed']+ to be
16
+ # missing the +custom+ subtree entirely.
17
+ # Previously the subtree was required but +opaque_backend_state+
18
+ # could still be missing (and obtained here as nil).
19
+ opaque_backend_state = signed.dig('custom', 'opaque_backend_state')
20
+ # The version appears to be optional to the rest of this class,
21
+ # and we have tests that do not provide it.
22
+ version = signed['version']
16
23
 
17
24
  map = new
18
25
 
@@ -21,7 +28,7 @@ module Datadog
21
28
  @version = version
22
29
  end
23
30
 
24
- hash['signed']['targets'].each_with_object(map) do |(p, t), m|
31
+ signed.fetch('targets').each_with_object(map) do |(p, t), m|
25
32
  path = Configuration::Path.parse(p)
26
33
  target = Configuration::Target.parse(t)
27
34
 
@@ -46,9 +53,9 @@ module Datadog
46
53
  class Target
47
54
  class << self
48
55
  def parse(hash)
49
- length = Integer(hash['length'])
50
- digests = Configuration::DigestList.parse(hash['hashes'])
51
- version = Integer(hash['custom']['v'])
56
+ length = Integer(hash.fetch('length'))
57
+ digests = Configuration::DigestList.parse(hash.fetch('hashes'))
58
+ version = Integer(hash.dig('custom', 'v'))
52
59
 
53
60
  new(digests: digests, length: length, version: version)
54
61
  end
@@ -2,6 +2,8 @@
2
2
 
3
3
  require_relative '../../../core/transport/request'
4
4
  require_relative '../../../core/transport/parcel'
5
+ require_relative '../../../core/transport/transport'
6
+ require_relative 'http/config'
5
7
 
6
8
  module Datadog
7
9
  module Core
@@ -21,37 +23,14 @@ module Datadog
21
23
  class Request < Datadog::Core::Transport::Request
22
24
  end
23
25
 
24
- # Config response
25
- module Response
26
- attr_reader :roots, :targets, :target_files, :client_configs
27
-
28
- def empty?
29
- @empty
30
- end
31
- end
32
-
33
26
  # Config transport
34
- class Transport
35
- attr_reader :client, :apis, :default_api, :current_api_id, :logger
36
-
37
- def initialize(apis, default_api, logger: Datadog.logger)
38
- @apis = apis
39
- @logger = logger
40
-
41
- @client = HTTP::Client.new(current_api, logger: logger)
42
- end
43
-
44
- ##### there is only one transport! it's negotiation!
27
+ class Transport < Core::Transport::Transport
45
28
  def send_config(payload)
46
29
  json = JSON.dump(payload)
47
30
  parcel = EncodedParcel.new(json)
48
31
  request = Request.new(parcel)
49
32
 
50
- @client.send_config_payload(request)
51
- end
52
-
53
- def current_api
54
- @apis[HTTP::API::V7]
33
+ @client.send_request(:config, request)
55
34
  end
56
35
  end
57
36
  end
@@ -2,12 +2,10 @@
2
2
 
3
3
  require 'json'
4
4
 
5
- require_relative '../config'
6
- require_relative 'client'
5
+ require_relative '../../../transport/http/api/endpoint'
6
+ require_relative '../../../transport/http/response'
7
7
  require_relative '../../../utils/base64'
8
8
  require_relative '../../../utils/truncation'
9
- require_relative '../../../transport/http/response'
10
- require_relative '../../../transport/http/api/endpoint'
11
9
 
12
10
  module Datadog
13
11
  module Core
@@ -18,8 +16,7 @@ module Datadog
18
16
  module Config
19
17
  # Response from HTTP transport for remote configuration
20
18
  class Response
21
- include Datadog::Core::Transport::HTTP::Response
22
- include Core::Remote::Transport::Config::Response
19
+ include Core::Transport::HTTP::Response
23
20
 
24
21
  def initialize(http_response, options = {}) # standard:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/MethodLength,Metrics/PerceivedComplexity
25
22
  super(http_response)
@@ -103,7 +100,7 @@ module Datadog
103
100
 
104
101
  {
105
102
  path: h[:path].freeze,
106
- content: StringIO.new(content.freeze),
103
+ content: content.freeze,
107
104
  }
108
105
  end.freeze
109
106
 
@@ -114,6 +111,12 @@ module Datadog
114
111
  end.freeze
115
112
  end
116
113
 
114
+ attr_reader :roots, :targets, :target_files, :client_configs
115
+
116
+ def empty?
117
+ @empty
118
+ end
119
+
117
120
  def inspect
118
121
  "#{super}, #{
119
122
  {
@@ -174,46 +177,7 @@ module Datadog
174
177
  end
175
178
  end
176
179
 
177
- # Extensions for HTTP client
178
- module Client
179
- def send_config_payload(request)
180
- send_request(request) do |api, env|
181
- api.send_config(env)
182
- end
183
- end
184
- end
185
-
186
180
  module API
187
- # Extensions for HTTP API Spec
188
- module Spec
189
- attr_reader :config
190
-
191
- def config=(endpoint)
192
- @config = endpoint
193
- end
194
-
195
- def send_config(env, &block)
196
- raise Core::Transport::HTTP::API::Spec::EndpointNotDefinedError.new('config', self) if config.nil?
197
-
198
- config.call(env, &block)
199
- end
200
- end
201
-
202
- # Extensions for HTTP API Instance
203
- module Instance
204
- def send_config(env)
205
- unless spec.is_a?(Config::API::Spec)
206
- raise Core::Transport::HTTP::API::Instance::EndpointNotSupportedError.new(
207
- 'config', self
208
- )
209
- end
210
-
211
- spec.send_config(env) do |request_env|
212
- call(request_env)
213
- end
214
- end
215
- end
216
-
217
181
  # Endpoint for remote configuration
218
182
  class Endpoint < Datadog::Core::Transport::HTTP::API::Endpoint
219
183
  HEADER_CONTENT_TYPE = 'Content-Type'
@@ -240,10 +204,6 @@ module Datadog
240
204
  end
241
205
  end
242
206
  end
243
-
244
- # Add remote configuration behavior to transport components
245
- ###### overrides send_payload! which calls send_<endpoint>! kills any other possible endpoint!
246
- HTTP::Client.include(Config::Client)
247
207
  end
248
208
  end
249
209
  end
@@ -2,8 +2,7 @@
2
2
 
3
3
  require 'json'
4
4
 
5
- require_relative '../negotiation'
6
- require_relative 'client'
5
+ require_relative '../../../transport/http/client'
7
6
  require_relative '../../../transport/http/response'
8
7
  require_relative '../../../transport/http/api/endpoint'
9
8
 
@@ -17,7 +16,6 @@ module Datadog
17
16
  # Response from HTTP transport for agent feature negotiation
18
17
  class Response
19
18
  include Datadog::Core::Transport::HTTP::Response
20
- include Core::Remote::Transport::Negotiation::Response
21
19
 
22
20
  def initialize(http_response, options = {})
23
21
  super(http_response)
@@ -29,48 +27,23 @@ module Datadog
29
27
  @config = options[:config]
30
28
  @span_events = options[:span_events]
31
29
  end
32
- end
33
30
 
34
- # Extensions for HTTP client
35
- module Client
36
- def send_info_payload(request)
37
- send_request(request) do |api, env|
38
- api.send_info(env)
39
- end
40
- end
31
+ # @!attribute [r] version
32
+ # The version of the agent.
33
+ # @return [String]
34
+ # @!attribute [r] endpoints
35
+ # The HTTP endpoints the agent supports.
36
+ # @return [Array<String>]
37
+ # @!attribute [r] config
38
+ # The agent configuration. These are configured by the user when starting the agent, as well as any defaults.
39
+ # @return [Hash]
40
+ # @!attribute [r] span_events
41
+ # Whether the agent supports the top-level span events field in flushed spans.
42
+ # @return [Boolean,nil]
43
+ attr_reader :version, :endpoints, :config, :span_events
41
44
  end
42
45
 
43
46
  module API
44
- # Extensions for HTTP API Spec
45
- module Spec
46
- attr_reader :info
47
-
48
- def info=(endpoint)
49
- @info = endpoint
50
- end
51
-
52
- def send_info(env, &block)
53
- raise Core::Transport::HTTP::API::Spec::EndpointNotDefinedError.new('info', self) if info.nil?
54
-
55
- info.call(env, &block)
56
- end
57
- end
58
-
59
- # Extensions for HTTP API Instance
60
- module Instance
61
- def send_info(env)
62
- unless spec.is_a?(Negotiation::API::Spec)
63
- raise Core::Transport::HTTP::API::Instance::EndpointNotSupportedError.new(
64
- 'info', self
65
- )
66
- end
67
-
68
- spec.send_info(env) do |request_env|
69
- call(request_env)
70
- end
71
- end
72
- end
73
-
74
47
  # Endpoint for negotiation
75
48
  class Endpoint < Datadog::Core::Transport::HTTP::API::Endpoint
76
49
  def initialize(path)
@@ -92,9 +65,6 @@ module Datadog
92
65
  end
93
66
  end
94
67
  end
95
-
96
- # Add negotiation behavior to transport components
97
- HTTP::Client.include(Negotiation::Client)
98
68
  end
99
69
  end
100
70
  end
@@ -4,16 +4,8 @@ require_relative '../../environment/container'
4
4
  require_relative '../../environment/ext'
5
5
  require_relative '../../transport/ext'
6
6
  require_relative '../../transport/http'
7
-
8
- # TODO: Improve negotiation to allow per endpoint selection
9
- #
10
- # Since endpoint negotiation happens at the `API::Spec` level there can not be
11
- # a mix of endpoints at various versions or versionless without describing all
12
- # the possible combinations as specs. See http/api.
13
- #
14
- # Below should be:
15
- # require_relative '../../transport/http/api'
16
- require_relative 'http/api'
7
+ require_relative 'config'
8
+ require_relative 'negotiation'
17
9
 
18
10
  # TODO: Decouple transport/http
19
11
  #
@@ -27,26 +19,30 @@ module Datadog
27
19
  module Transport
28
20
  # Namespace for HTTP transport components
29
21
  module HTTP
22
+ ROOT = Negotiation::API::Endpoint.new(
23
+ '/info',
24
+ )
25
+
26
+ V7 = Config::API::Endpoint.new(
27
+ '/v0.7/config',
28
+ Core::Encoding::JSONEncoder,
29
+ )
30
+
30
31
  module_function
31
32
 
32
33
  # Builds a new Transport::HTTP::Client with default settings
33
34
  # Pass a block to override any settings.
34
35
  def root(
35
36
  agent_settings:,
36
- logger: Datadog.logger,
37
- api_version: nil,
37
+ logger:,
38
38
  headers: nil
39
39
  )
40
40
  Core::Transport::HTTP.build(
41
- api_instance_class: API::Instance,
42
41
  agent_settings: agent_settings,
43
42
  logger: logger,
44
- api_version: api_version,
45
43
  headers: headers
46
44
  ) do |transport|
47
- apis = API.defaults
48
-
49
- transport.api API::ROOT, apis[API::ROOT]
45
+ transport.api 'root', ROOT
50
46
 
51
47
  # Call block to apply any customization, if provided
52
48
  yield(transport) if block_given?
@@ -57,20 +53,15 @@ module Datadog
57
53
  # Pass a block to override any settings.
58
54
  def v7(
59
55
  agent_settings:,
60
- logger: Datadog.logger,
61
- api_version: nil,
56
+ logger:,
62
57
  headers: nil
63
58
  )
64
59
  Core::Transport::HTTP.build(
65
- api_instance_class: API::Instance,
66
60
  agent_settings: agent_settings,
67
61
  logger: logger,
68
- api_version: api_version,
69
62
  headers: headers
70
63
  ) do |transport|
71
- apis = API.defaults
72
-
73
- transport.api API::V7, apis[API::V7]
64
+ transport.api 'v7', V7
74
65
 
75
66
  # Call block to apply any customization, if provided
76
67
  yield(transport) if block_given?
@@ -1,6 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative '../../../core/transport/request'
4
+ require_relative '../../../core/transport/transport'
5
+ require_relative 'http/negotiation'
4
6
 
5
7
  # TODO: Resolve conceptual conundrum
6
8
  #
@@ -30,42 +32,15 @@ module Datadog
30
32
  class Request < Datadog::Core::Transport::Request
31
33
  end
32
34
 
33
- # Negotiation response
34
- module Response
35
- # @!attribute [r] version
36
- # The version of the agent.
37
- # @return [String]
38
- # @!attribute [r] endpoints
39
- # The HTTP endpoints the agent supports.
40
- # @return [Array<String>]
41
- # @!attribute [r] config
42
- # The agent configuration. These are configured by the user when starting the agent, as well as any defaults.
43
- # @return [Hash]
44
- # @!attribute [r] span_events
45
- # Whether the agent supports the top-level span events field in flushed spans.
46
- # @return [Boolean,nil]
47
- attr_reader :version, :endpoints, :config, :span_events
48
- end
49
-
50
35
  # Negotiation transport
51
- class Transport
52
- attr_reader :client, :apis, :default_api, :current_api_id, :logger
53
-
54
- def initialize(apis, default_api, logger: Datadog.logger)
55
- @apis = apis
56
- @logger = logger
57
-
58
- @client = HTTP::Client.new(current_api, logger: logger)
59
- end
60
-
61
- def send_info
36
+ class Transport < Core::Transport::Transport
37
+ # TODO steep is complaining about this method, I tried to make
38
+ # it work but between module inclusions and steep diagnostics
39
+ # I don't understand what the problem is or what the steep wants.
40
+ def send_info # steep:ignore
62
41
  request = Request.new
63
42
 
64
- @client.send_info_payload(request)
65
- end
66
-
67
- def current_api
68
- @apis[HTTP::API::ROOT]
43
+ @client.send_request(:info, request)
69
44
  end
70
45
  end
71
46
  end