datadog 2.19.0 → 2.21.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 +52 -1
  3. data/README.md +0 -1
  4. data/ext/libdatadog_api/extconf.rb +3 -1
  5. data/ext/libdatadog_api/process_discovery.c +5 -5
  6. data/ext/libdatadog_extconf_helpers.rb +13 -3
  7. data/lib/datadog/appsec/api_security/route_extractor.rb +6 -2
  8. data/lib/datadog/appsec/autoload.rb +1 -1
  9. data/lib/datadog/appsec/component.rb +3 -13
  10. data/lib/datadog/appsec/context.rb +23 -0
  11. data/lib/datadog/appsec/contrib/devise/patches/signin_tracking_patch.rb +2 -1
  12. data/lib/datadog/appsec/contrib/devise/patches/signup_tracking_patch.rb +2 -1
  13. data/lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb +0 -1
  14. data/lib/datadog/appsec/contrib/faraday/ssrf_detection_middleware.rb +0 -1
  15. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +14 -22
  16. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +23 -2
  17. data/lib/datadog/appsec/contrib/rails/patcher.rb +14 -26
  18. data/lib/datadog/appsec/contrib/rails/patches/process_action_patch.rb +27 -0
  19. data/lib/datadog/appsec/contrib/rails/patches/render_to_body_patch.rb +33 -0
  20. data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +0 -1
  21. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +23 -0
  22. data/lib/datadog/appsec/contrib/sinatra/patcher.rb +8 -18
  23. data/lib/datadog/appsec/contrib/sinatra/patches/json_patch.rb +31 -0
  24. data/lib/datadog/appsec/event.rb +3 -18
  25. data/lib/datadog/appsec/instrumentation/gateway/argument.rb +16 -0
  26. data/lib/datadog/appsec/metrics/collector.rb +7 -3
  27. data/lib/datadog/appsec/metrics/telemetry.rb +1 -1
  28. data/lib/datadog/appsec/metrics/telemetry_exporter.rb +28 -0
  29. data/lib/datadog/appsec/metrics.rb +1 -0
  30. data/lib/datadog/appsec/security_engine/engine.rb +14 -32
  31. data/lib/datadog/appsec/security_engine/result.rb +16 -0
  32. data/lib/datadog/appsec/security_engine/runner.rb +18 -4
  33. data/lib/datadog/appsec/thread_safe_ref.rb +61 -0
  34. data/lib/datadog/appsec/trace_keeper.rb +24 -0
  35. data/lib/datadog/appsec/utils/hash_coercion.rb +23 -0
  36. data/lib/datadog/appsec.rb +0 -7
  37. data/lib/datadog/auto_instrument_base.rb +2 -1
  38. data/lib/datadog/core/configuration/agent_settings_resolver.rb +4 -4
  39. data/lib/datadog/core/configuration/components.rb +8 -2
  40. data/lib/datadog/core/configuration/config_helper.rb +100 -0
  41. data/lib/datadog/core/configuration/deprecations.rb +36 -0
  42. data/lib/datadog/core/configuration/ext.rb +0 -1
  43. data/lib/datadog/core/configuration/option.rb +55 -51
  44. data/lib/datadog/core/configuration/option_definition.rb +2 -11
  45. data/lib/datadog/core/configuration/options.rb +14 -12
  46. data/lib/datadog/core/configuration/settings.rb +10 -6
  47. data/lib/datadog/core/configuration/supported_configurations.rb +335 -0
  48. data/lib/datadog/core/configuration.rb +1 -1
  49. data/lib/datadog/core/deprecations.rb +2 -2
  50. data/lib/datadog/core/environment/ext.rb +0 -2
  51. data/lib/datadog/core/environment/git.rb +2 -2
  52. data/lib/datadog/core/environment/variable_helpers.rb +3 -3
  53. data/lib/datadog/core/metrics/client.rb +2 -2
  54. data/lib/datadog/core/process_discovery/tracer_memfd.rb +2 -4
  55. data/lib/datadog/core/process_discovery.rb +46 -23
  56. data/lib/datadog/core/runtime/ext.rb +0 -1
  57. data/lib/datadog/core/telemetry/event/app_started.rb +2 -2
  58. data/lib/datadog/core.rb +2 -0
  59. data/lib/datadog/di/boot.rb +9 -1
  60. data/lib/datadog/di/component.rb +7 -0
  61. data/lib/datadog/di/probe_file_loader/railtie.rb +15 -0
  62. data/lib/datadog/di/probe_file_loader.rb +82 -0
  63. data/lib/datadog/di/probe_notification_builder.rb +1 -1
  64. data/lib/datadog/di/remote.rb +3 -5
  65. data/lib/datadog/di.rb +0 -1
  66. data/lib/datadog/kit/appsec/events/v2.rb +5 -4
  67. data/lib/datadog/kit/appsec/events.rb +11 -10
  68. data/lib/datadog/kit/identity.rb +17 -11
  69. data/lib/datadog/opentelemetry/api/baggage.rb +2 -2
  70. data/lib/datadog/opentelemetry/api/context.rb +10 -9
  71. data/lib/datadog/opentelemetry/sdk/configurator.rb +1 -1
  72. data/lib/datadog/opentelemetry/sdk/propagator.rb +4 -4
  73. data/lib/datadog/opentelemetry/sdk/span_processor.rb +8 -8
  74. data/lib/datadog/opentelemetry/sdk/trace/span.rb +14 -10
  75. data/lib/datadog/opentelemetry/trace.rb +4 -4
  76. data/lib/datadog/profiling/collectors/info.rb +1 -1
  77. data/lib/datadog/profiling/ext.rb +2 -1
  78. data/lib/datadog/profiling/http_transport.rb +1 -1
  79. data/lib/datadog/profiling/tasks/exec.rb +2 -2
  80. data/lib/datadog/profiling.rb +6 -8
  81. data/lib/datadog/tracing/analytics.rb +1 -1
  82. data/lib/datadog/tracing/buffer.rb +7 -7
  83. data/lib/datadog/tracing/configuration/dynamic.rb +4 -6
  84. data/lib/datadog/tracing/configuration/ext.rb +3 -5
  85. data/lib/datadog/tracing/configuration/settings.rb +29 -7
  86. data/lib/datadog/tracing/context.rb +2 -2
  87. data/lib/datadog/tracing/contrib/action_cable/event.rb +1 -1
  88. data/lib/datadog/tracing/contrib/action_cable/integration.rb +1 -1
  89. data/lib/datadog/tracing/contrib/action_mailer/integration.rb +1 -1
  90. data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +4 -4
  91. data/lib/datadog/tracing/contrib/action_pack/integration.rb +1 -1
  92. data/lib/datadog/tracing/contrib/action_view/events/render_template.rb +1 -1
  93. data/lib/datadog/tracing/contrib/active_job/event.rb +8 -8
  94. data/lib/datadog/tracing/contrib/active_job/events/discard.rb +1 -1
  95. data/lib/datadog/tracing/contrib/active_job/events/enqueue.rb +1 -1
  96. data/lib/datadog/tracing/contrib/active_job/events/enqueue_at.rb +1 -1
  97. data/lib/datadog/tracing/contrib/active_job/events/enqueue_retry.rb +1 -1
  98. data/lib/datadog/tracing/contrib/active_job/events/perform.rb +1 -1
  99. data/lib/datadog/tracing/contrib/active_job/events/retry_stopped.rb +1 -1
  100. data/lib/datadog/tracing/contrib/active_job/integration.rb +1 -1
  101. data/lib/datadog/tracing/contrib/active_model_serializers/events/render.rb +1 -1
  102. data/lib/datadog/tracing/contrib/active_model_serializers/events/serialize.rb +3 -3
  103. data/lib/datadog/tracing/contrib/active_model_serializers/integration.rb +1 -2
  104. data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +1 -1
  105. data/lib/datadog/tracing/contrib/active_record/events/instantiation.rb +1 -1
  106. data/lib/datadog/tracing/contrib/active_record/events/sql.rb +5 -5
  107. data/lib/datadog/tracing/contrib/active_record/integration.rb +1 -1
  108. data/lib/datadog/tracing/contrib/active_record/utils.rb +15 -15
  109. data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +6 -6
  110. data/lib/datadog/tracing/contrib/active_support/integration.rb +1 -1
  111. data/lib/datadog/tracing/contrib/active_support/notifications/event.rb +2 -1
  112. data/lib/datadog/tracing/contrib/active_support/notifications/subscription.rb +7 -9
  113. data/lib/datadog/tracing/contrib/aws/ext.rb +1 -1
  114. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +2 -2
  115. data/lib/datadog/tracing/contrib/aws/parsed_context.rb +3 -1
  116. data/lib/datadog/tracing/contrib/aws/patcher.rb +5 -1
  117. data/lib/datadog/tracing/contrib/aws/service/base.rb +2 -1
  118. data/lib/datadog/tracing/contrib/aws/service/dynamodb.rb +1 -1
  119. data/lib/datadog/tracing/contrib/aws/service/eventbridge.rb +1 -1
  120. data/lib/datadog/tracing/contrib/aws/service/kinesis.rb +1 -1
  121. data/lib/datadog/tracing/contrib/aws/service/s3.rb +1 -1
  122. data/lib/datadog/tracing/contrib/aws/service/sns.rb +1 -1
  123. data/lib/datadog/tracing/contrib/aws/service/sqs.rb +1 -1
  124. data/lib/datadog/tracing/contrib/aws/service/states.rb +1 -1
  125. data/lib/datadog/tracing/contrib/aws/services.rb +7 -7
  126. data/lib/datadog/tracing/contrib/concurrent_ruby/async_patch.rb +1 -1
  127. data/lib/datadog/tracing/contrib/concurrent_ruby/context_composite_executor_service.rb +1 -1
  128. data/lib/datadog/tracing/contrib/concurrent_ruby/future_patch.rb +1 -1
  129. data/lib/datadog/tracing/contrib/concurrent_ruby/integration.rb +1 -1
  130. data/lib/datadog/tracing/contrib/concurrent_ruby/promises_future_patch.rb +1 -1
  131. data/lib/datadog/tracing/contrib/configurable.rb +6 -6
  132. data/lib/datadog/tracing/contrib/configuration/resolvers/pattern_resolver.rb +4 -4
  133. data/lib/datadog/tracing/contrib/dalli/ext.rb +3 -2
  134. data/lib/datadog/tracing/contrib/dalli/integration.rb +1 -1
  135. data/lib/datadog/tracing/contrib/delayed_job/integration.rb +1 -1
  136. data/lib/datadog/tracing/contrib/elasticsearch/ext.rb +3 -2
  137. data/lib/datadog/tracing/contrib/elasticsearch/integration.rb +4 -4
  138. data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +51 -53
  139. data/lib/datadog/tracing/contrib/elasticsearch/quantize.rb +5 -5
  140. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +2 -2
  141. data/lib/datadog/tracing/contrib/ethon/ext.rb +3 -2
  142. data/lib/datadog/tracing/contrib/ethon/integration.rb +1 -1
  143. data/lib/datadog/tracing/contrib/excon/ext.rb +3 -2
  144. data/lib/datadog/tracing/contrib/excon/integration.rb +1 -1
  145. data/lib/datadog/tracing/contrib/excon/middleware.rb +2 -2
  146. data/lib/datadog/tracing/contrib/ext.rb +3 -3
  147. data/lib/datadog/tracing/contrib/extensions.rb +9 -9
  148. data/lib/datadog/tracing/contrib/faraday/ext.rb +3 -2
  149. data/lib/datadog/tracing/contrib/faraday/integration.rb +1 -1
  150. data/lib/datadog/tracing/contrib/faraday/middleware.rb +4 -2
  151. data/lib/datadog/tracing/contrib/grape/endpoint.rb +8 -8
  152. data/lib/datadog/tracing/contrib/grape/integration.rb +1 -1
  153. data/lib/datadog/tracing/contrib/graphql/integration.rb +1 -1
  154. data/lib/datadog/tracing/contrib/graphql/patcher.rb +2 -2
  155. data/lib/datadog/tracing/contrib/graphql/unified_trace.rb +36 -25
  156. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +8 -8
  157. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +3 -3
  158. data/lib/datadog/tracing/contrib/grpc/distributed/fetcher.rb +1 -1
  159. data/lib/datadog/tracing/contrib/grpc/integration.rb +1 -1
  160. data/lib/datadog/tracing/contrib/hanami/ext.rb +2 -2
  161. data/lib/datadog/tracing/contrib/hanami/integration.rb +1 -1
  162. data/lib/datadog/tracing/contrib/hanami/renderer_policy_tracing.rb +1 -1
  163. data/lib/datadog/tracing/contrib/hanami/router_tracing.rb +9 -11
  164. data/lib/datadog/tracing/contrib/http/distributed/fetcher.rb +4 -4
  165. data/lib/datadog/tracing/contrib/http/ext.rb +3 -2
  166. data/lib/datadog/tracing/contrib/http/instrumentation.rb +5 -5
  167. data/lib/datadog/tracing/contrib/httpclient/ext.rb +3 -2
  168. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +3 -3
  169. data/lib/datadog/tracing/contrib/httpclient/integration.rb +1 -1
  170. data/lib/datadog/tracing/contrib/httprb/ext.rb +3 -2
  171. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +4 -4
  172. data/lib/datadog/tracing/contrib/httprb/integration.rb +1 -1
  173. data/lib/datadog/tracing/contrib/kafka/event.rb +1 -1
  174. data/lib/datadog/tracing/contrib/kafka/events/connection/request.rb +1 -1
  175. data/lib/datadog/tracing/contrib/kafka/events/consumer/process_batch.rb +1 -1
  176. data/lib/datadog/tracing/contrib/kafka/events/consumer/process_message.rb +1 -1
  177. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/heartbeat.rb +1 -1
  178. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/join_group.rb +1 -1
  179. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/leave_group.rb +1 -1
  180. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/sync_group.rb +1 -1
  181. data/lib/datadog/tracing/contrib/kafka/events/produce_operation/send_messages.rb +1 -1
  182. data/lib/datadog/tracing/contrib/kafka/events/producer/deliver_messages.rb +1 -1
  183. data/lib/datadog/tracing/contrib/kafka/integration.rb +1 -1
  184. data/lib/datadog/tracing/contrib/karafka/monitor.rb +13 -13
  185. data/lib/datadog/tracing/contrib/karafka/patcher.rb +4 -4
  186. data/lib/datadog/tracing/contrib/lograge/instrumentation.rb +1 -1
  187. data/lib/datadog/tracing/contrib/lograge/integration.rb +1 -1
  188. data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +1 -1
  189. data/lib/datadog/tracing/contrib/mongodb/ext.rb +1 -1
  190. data/lib/datadog/tracing/contrib/mongodb/integration.rb +1 -1
  191. data/lib/datadog/tracing/contrib/mongodb/parsers.rb +1 -1
  192. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +6 -6
  193. data/lib/datadog/tracing/contrib/mysql2/ext.rb +1 -1
  194. data/lib/datadog/tracing/contrib/mysql2/integration.rb +1 -1
  195. data/lib/datadog/tracing/contrib/opensearch/configuration/settings.rb +1 -1
  196. data/lib/datadog/tracing/contrib/opensearch/ext.rb +3 -2
  197. data/lib/datadog/tracing/contrib/opensearch/integration.rb +1 -2
  198. data/lib/datadog/tracing/contrib/opensearch/patcher.rb +68 -70
  199. data/lib/datadog/tracing/contrib/opensearch/quantize.rb +5 -5
  200. data/lib/datadog/tracing/contrib/patcher.rb +7 -9
  201. data/lib/datadog/tracing/contrib/pg/integration.rb +1 -1
  202. data/lib/datadog/tracing/contrib/presto/ext.rb +1 -1
  203. data/lib/datadog/tracing/contrib/presto/instrumentation.rb +3 -3
  204. data/lib/datadog/tracing/contrib/presto/integration.rb +1 -1
  205. data/lib/datadog/tracing/contrib/propagation/sql_comment/comment.rb +1 -1
  206. data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +1 -1
  207. data/lib/datadog/tracing/contrib/que/integration.rb +1 -1
  208. data/lib/datadog/tracing/contrib/racecar/event.rb +1 -1
  209. data/lib/datadog/tracing/contrib/racecar/events/batch.rb +2 -2
  210. data/lib/datadog/tracing/contrib/racecar/events/consume.rb +1 -1
  211. data/lib/datadog/tracing/contrib/racecar/events/message.rb +2 -2
  212. data/lib/datadog/tracing/contrib/racecar/integration.rb +1 -1
  213. data/lib/datadog/tracing/contrib/rack/header_collection.rb +1 -1
  214. data/lib/datadog/tracing/contrib/rack/header_tagging.rb +32 -32
  215. data/lib/datadog/tracing/contrib/rack/integration.rb +1 -1
  216. data/lib/datadog/tracing/contrib/rack/middlewares.rb +21 -17
  217. data/lib/datadog/tracing/contrib/rack/patcher.rb +1 -1
  218. data/lib/datadog/tracing/contrib/rack/request_queue.rb +3 -2
  219. data/lib/datadog/tracing/contrib/rack/trace_proxy_middleware.rb +7 -1
  220. data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +1 -1
  221. data/lib/datadog/tracing/contrib/rails/ext.rb +2 -1
  222. data/lib/datadog/tracing/contrib/rails/integration.rb +2 -2
  223. data/lib/datadog/tracing/contrib/rails/log_injection.rb +1 -1
  224. data/lib/datadog/tracing/contrib/rails/middlewares.rb +1 -1
  225. data/lib/datadog/tracing/contrib/rails/runner.rb +5 -4
  226. data/lib/datadog/tracing/contrib/rake/instrumentation.rb +4 -4
  227. data/lib/datadog/tracing/contrib/rake/integration.rb +1 -1
  228. data/lib/datadog/tracing/contrib/redis/configuration/resolver.rb +2 -2
  229. data/lib/datadog/tracing/contrib/redis/ext.rb +3 -2
  230. data/lib/datadog/tracing/contrib/redis/integration.rb +2 -2
  231. data/lib/datadog/tracing/contrib/redis/patcher.rb +4 -4
  232. data/lib/datadog/tracing/contrib/redis/quantize.rb +1 -1
  233. data/lib/datadog/tracing/contrib/redis/tags.rb +1 -1
  234. data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +4 -4
  235. data/lib/datadog/tracing/contrib/registry.rb +1 -1
  236. data/lib/datadog/tracing/contrib/resque/integration.rb +1 -1
  237. data/lib/datadog/tracing/contrib/resque/resque_job.rb +1 -1
  238. data/lib/datadog/tracing/contrib/rest_client/ext.rb +3 -2
  239. data/lib/datadog/tracing/contrib/rest_client/integration.rb +1 -1
  240. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +3 -3
  241. data/lib/datadog/tracing/contrib/roda/instrumentation.rb +1 -1
  242. data/lib/datadog/tracing/contrib/roda/integration.rb +1 -1
  243. data/lib/datadog/tracing/contrib/semantic_logger/instrumentation.rb +1 -1
  244. data/lib/datadog/tracing/contrib/semantic_logger/integration.rb +1 -1
  245. data/lib/datadog/tracing/contrib/sequel/database.rb +5 -5
  246. data/lib/datadog/tracing/contrib/sequel/dataset.rb +1 -1
  247. data/lib/datadog/tracing/contrib/sequel/integration.rb +1 -1
  248. data/lib/datadog/tracing/contrib/sequel/utils.rb +1 -1
  249. data/lib/datadog/tracing/contrib/shoryuken/integration.rb +1 -1
  250. data/lib/datadog/tracing/contrib/sidekiq/integration.rb +1 -1
  251. data/lib/datadog/tracing/contrib/sidekiq/utils.rb +1 -1
  252. data/lib/datadog/tracing/contrib/sinatra/integration.rb +1 -1
  253. data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +38 -40
  254. data/lib/datadog/tracing/contrib/sneakers/integration.rb +1 -1
  255. data/lib/datadog/tracing/contrib/span_attribute_schema.rb +1 -1
  256. data/lib/datadog/tracing/contrib/stripe/integration.rb +1 -1
  257. data/lib/datadog/tracing/contrib/stripe/request.rb +1 -1
  258. data/lib/datadog/tracing/contrib/sucker_punch/integration.rb +1 -1
  259. data/lib/datadog/tracing/contrib/trilogy/ext.rb +1 -1
  260. data/lib/datadog/tracing/contrib/trilogy/integration.rb +1 -1
  261. data/lib/datadog/tracing/contrib/utils/quantization/hash.rb +11 -11
  262. data/lib/datadog/tracing/contrib/utils/quantization/http.rb +6 -6
  263. data/lib/datadog/tracing/diagnostics/environment_logger.rb +5 -1
  264. data/lib/datadog/tracing/distributed/b3_single.rb +1 -1
  265. data/lib/datadog/tracing/distributed/baggage.rb +73 -8
  266. data/lib/datadog/tracing/distributed/datadog.rb +4 -5
  267. data/lib/datadog/tracing/distributed/datadog_tags_codec.rb +11 -13
  268. data/lib/datadog/tracing/distributed/helpers.rb +1 -1
  269. data/lib/datadog/tracing/distributed/none.rb +4 -2
  270. data/lib/datadog/tracing/distributed/propagation.rb +4 -1
  271. data/lib/datadog/tracing/distributed/propagation_policy.rb +1 -1
  272. data/lib/datadog/tracing/distributed/trace_context.rb +22 -16
  273. data/lib/datadog/tracing/event.rb +5 -7
  274. data/lib/datadog/tracing/flush.rb +1 -1
  275. data/lib/datadog/tracing/metadata/analytics.rb +1 -1
  276. data/lib/datadog/tracing/metadata/tagging.rb +4 -4
  277. data/lib/datadog/tracing/pipeline/span_filter.rb +3 -1
  278. data/lib/datadog/tracing/pipeline/span_processor.rb +3 -1
  279. data/lib/datadog/tracing/pipeline.rb +1 -1
  280. data/lib/datadog/tracing/sampling/ext.rb +0 -2
  281. data/lib/datadog/tracing/sampling/rule_sampler.rb +30 -30
  282. data/lib/datadog/tracing/sampling/span/rule_parser.rb +1 -1
  283. data/lib/datadog/tracing/sampling/span/sampler.rb +0 -7
  284. data/lib/datadog/tracing/span.rb +1 -1
  285. data/lib/datadog/tracing/span_event.rb +10 -10
  286. data/lib/datadog/tracing/span_link.rb +12 -12
  287. data/lib/datadog/tracing/span_operation.rb +9 -11
  288. data/lib/datadog/tracing/trace_digest.rb +21 -23
  289. data/lib/datadog/tracing/trace_operation.rb +84 -88
  290. data/lib/datadog/tracing/trace_segment.rb +2 -2
  291. data/lib/datadog/tracing/tracer.rb +36 -38
  292. data/lib/datadog/tracing/transport/http/client.rb +1 -1
  293. data/lib/datadog/tracing/transport/http/traces.rb +2 -2
  294. data/lib/datadog/tracing/transport/io/client.rb +5 -5
  295. data/lib/datadog/tracing/transport/io/traces.rb +4 -4
  296. data/lib/datadog/tracing/transport/statistics.rb +1 -1
  297. data/lib/datadog/tracing/transport/traces.rb +5 -5
  298. data/lib/datadog/tracing/workers/trace_writer.rb +12 -12
  299. data/lib/datadog/tracing/workers.rb +2 -2
  300. data/lib/datadog/tracing.rb +2 -2
  301. data/lib/datadog/version.rb +1 -1
  302. metadata +18 -6
@@ -0,0 +1,100 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'supported_configurations'
4
+ require_relative '../logger'
5
+
6
+ module Datadog
7
+ module Core
8
+ module Configuration
9
+ class ConfigHelper
10
+ def initialize(
11
+ source_env: ENV,
12
+ supported_configurations: SUPPORTED_CONFIGURATIONS,
13
+ aliases: ALIASES,
14
+ alias_to_canonical: ALIAS_TO_CANONICAL,
15
+ raise_on_unknown_env_var: false
16
+ )
17
+ @source_env = source_env
18
+ @supported_configurations = supported_configurations
19
+ @aliases = aliases
20
+ @alias_to_canonical = alias_to_canonical
21
+ @raise_on_unknown_env_var = raise_on_unknown_env_var
22
+ end
23
+
24
+ def [](name)
25
+ get_environment_variable(name)
26
+ end
27
+
28
+ def fetch(name, default_value = UNSET)
29
+ if (item = get_environment_variable(name))
30
+ return item
31
+ end
32
+
33
+ return yield(name) if block_given?
34
+ return default_value unless default_value == UNSET
35
+
36
+ raise KeyError, "key not found: #{name}"
37
+ end
38
+
39
+ def key?(name)
40
+ !get_environment_variable(name).nil?
41
+ end
42
+
43
+ alias_method :has_key?, :key?
44
+ alias_method :include?, :key?
45
+ alias_method :member?, :key?
46
+
47
+ # Returns the environment variable value if the environment variable is a supported Datadog configuration (starts with DD_ or OTEL_)
48
+ # or if it is not a Datadog configuration. Otherwise, it returns nil.
49
+ #
50
+ # @param name [String] Environment variable name
51
+ # @param default_value [String, nil] Default value to return if the environment variable is not set
52
+ # @param source_env [Hash[String, String]] Environment variables to use
53
+ # @return [String, nil] The environment variable value
54
+ # @raise [RuntimeError] if the configuration is not supported
55
+ def get_environment_variable(name, default_value = nil, source_env: @source_env)
56
+ # datadog-ci-rb is using dd-trace-rb config DSL, which uses this method.
57
+ # Until we've correctly implemented support for datadog-ci-rb, we disable config inversion if ci is enabled.
58
+ if !defined?(::Datadog::CI) &&
59
+ (name.start_with?('DD_', 'OTEL_') || @alias_to_canonical[name]) &&
60
+ !@supported_configurations[name]
61
+ if defined?(@raise_on_unknown_env_var) && @raise_on_unknown_env_var # Only enabled for tests!
62
+ if @alias_to_canonical[name]
63
+ raise "Please use #{@alias_to_canonical[name]} instead of #{name}. See docs/AccessEnvironmentVariables.md for details."
64
+ else
65
+ raise "Missing #{name} env/configuration in \"supported-configurations.json\" file. See docs/AccessEnvironmentVariables.md for details."
66
+ end
67
+ end
68
+ # TODO: Send telemetry to know if we ever miss an env var
69
+ return nil
70
+ end
71
+
72
+ env_value = source_env[name]
73
+ if env_value.nil? && @aliases[name]
74
+ @aliases[name].each do |alias_name|
75
+ return source_env[alias_name] if source_env[alias_name]
76
+ end
77
+ end
78
+
79
+ env_value || default_value
80
+ end
81
+
82
+ # Only used in error message creation. Match get_environment_variable logic to return the resolved environment variable name.
83
+ def resolve_env(name, source_env: @source_env)
84
+ if source_env[name].nil? && @aliases[name]
85
+ @aliases[name].each do |alias_name|
86
+ return alias_name if source_env[alias_name]
87
+ end
88
+ end
89
+
90
+ name
91
+ end
92
+
93
+ # Anchor object that represents an undefined default value.
94
+ # This is necessary because `nil` is a valid default value.
95
+ UNSET = Object.new
96
+ private_constant :UNSET
97
+ end
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'supported_configurations'
4
+ require_relative '../logger'
5
+ require_relative '../utils/only_once'
6
+
7
+ module Datadog
8
+ module Core
9
+ module Configuration
10
+ module Deprecations
11
+ LOG_DEPRECATIONS_ONLY_ONCE = Datadog::Core::Utils::OnlyOnce.new
12
+
13
+ def self.log_deprecations_from_all_sources(logger, deprecations: DEPRECATIONS, alias_to_canonical: ALIAS_TO_CANONICAL)
14
+ LOG_DEPRECATIONS_ONLY_ONCE.run do
15
+ log_deprecated_environment_variables(logger, ENV, 'environment', deprecations, alias_to_canonical)
16
+ customer_config = StableConfig.configuration.dig(:local, :config)
17
+ log_deprecated_environment_variables(logger, customer_config, 'local', deprecations, alias_to_canonical) if customer_config
18
+ fleet_config = StableConfig.configuration.dig(:fleet, :config)
19
+ log_deprecated_environment_variables(logger, fleet_config, 'fleet', deprecations, alias_to_canonical) if fleet_config
20
+ end
21
+ end
22
+
23
+ private_class_method def self.log_deprecated_environment_variables(logger, source_env, source_name, deprecations, alias_to_canonical)
24
+ deprecations.each do |deprecated_env_var, message|
25
+ next unless source_env.key?(deprecated_env_var)
26
+
27
+ Datadog::Core.log_deprecation(disallowed_next_major: false, logger: logger) do
28
+ "#{deprecated_env_var} #{source_name} variable is deprecated" +
29
+ (alias_to_canonical[deprecated_env_var] ? ", use #{alias_to_canonical[deprecated_env_var]} instead." : ". #{message}.")
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -9,7 +9,6 @@ module Datadog
9
9
  # @public_api
10
10
  module Diagnostics
11
11
  ENV_DEBUG_ENABLED = 'DD_TRACE_DEBUG'
12
- ENV_OTEL_LOG_LEVEL = 'OTEL_LOG_LEVEL'
13
12
  ENV_HEALTH_METRICS_ENABLED = 'DD_HEALTH_METRICS_ENABLED'
14
13
  ENV_STARTUP_LOGS_ENABLED = 'DD_TRACE_STARTUP_LOGS'
15
14
  end
@@ -15,16 +15,25 @@ module Datadog
15
15
  # @!attribute [r] precedence_set
16
16
  # When this option was last set, what was the value precedence used?
17
17
  # @return [Precedence::Value]
18
- attr_reader :definition, :precedence_set, :resolved_env
18
+ attr_reader :definition, :precedence_set
19
19
 
20
20
  # Option setting precedence.
21
21
  module Precedence
22
22
  # Represents an Option precedence level.
23
23
  # Each precedence has a `numeric` value; higher values means higher precedence.
24
24
  # `name` is for inspection purposes only.
25
- Value = Struct.new(:numeric, :name, :origin) do
25
+
26
+ class Value
26
27
  include Comparable
27
28
 
29
+ attr_accessor :numeric, :name, :origin
30
+
31
+ def initialize(numeric, name, origin)
32
+ @numeric = numeric
33
+ @name = name
34
+ @origin = origin
35
+ end
36
+
28
37
  def <=>(other)
29
38
  return nil unless other.is_a?(Value)
30
39
 
@@ -59,7 +68,6 @@ module Datadog
59
68
  @context = context
60
69
  @value = nil
61
70
  @is_set = false
62
- @resolved_env = nil
63
71
 
64
72
  # One value is stored per precedence, to allow unsetting a higher
65
73
  # precedence value and falling back to a lower precedence one.
@@ -75,7 +83,7 @@ module Datadog
75
83
  #
76
84
  # @param value [Object] the new value to be associated with this option
77
85
  # @param precedence [Precedence] from what precedence order this new value comes from
78
- def set(value, precedence: Precedence::PROGRAMMATIC, resolved_env: nil)
86
+ def set(value, precedence: Precedence::PROGRAMMATIC)
79
87
  # Is there a higher precedence value set?
80
88
  if @precedence_set > precedence
81
89
  # This should be uncommon, as higher precedence values tend to
@@ -94,7 +102,7 @@ module Datadog
94
102
  return @value
95
103
  end
96
104
 
97
- internal_set(value, precedence, resolved_env)
105
+ internal_set(value, precedence)
98
106
  end
99
107
 
100
108
  def unset(precedence)
@@ -112,7 +120,7 @@ module Datadog
112
120
  # Look for value that is set.
113
121
  # The hash `@value_per_precedence` has a custom default value of `UNSET`.
114
122
  if (value = @value_per_precedence[p]) != UNSET
115
- internal_set(value, p, nil)
123
+ internal_set(value, p)
116
124
  return nil
117
125
  end
118
126
  end
@@ -172,20 +180,17 @@ module Datadog
172
180
  private
173
181
 
174
182
  def coerce_env_variable(value)
175
- return context_exec(value, &@definition.env_parser) if @definition.env_parser
183
+ env_parser = @definition.env_parser
184
+ return context_exec(value, &env_parser) if env_parser
176
185
 
177
186
  case @definition.type
178
187
  when :hash
179
188
  values = value.split(',') # By default we only want to support comma separated strings
180
189
 
181
- values.map! do |v|
182
- v.gsub!(/\A[\s,]*|[\s,]*\Z/, '')
190
+ values.each_with_object({}) do |v, hash| # $ Hash[String, String]
191
+ v.gsub!(/\A[\s,]*+|[\s,]*+\Z/, '')
192
+ next if v.empty?
183
193
 
184
- v.empty? ? nil : v
185
- end
186
-
187
- values.compact!
188
- values.each.with_object({}) do |v, hash|
189
194
  pair = v.split(':', 2)
190
195
  hash[pair[0]] = pair[1]
191
196
  end
@@ -196,14 +201,12 @@ module Datadog
196
201
  when :array
197
202
  values = value.split(',')
198
203
 
199
- values.map! do |v|
200
- v.gsub!(/\A[\s,]*|[\s,]*\Z/, '')
204
+ values.each_with_object([]) do |v, arr| # $ Array[String]
205
+ v.gsub!(/\A[\s,]*+|[\s,]*+\Z/, '')
206
+ next if v.empty?
201
207
 
202
- v.empty? ? nil : v
208
+ arr << v
203
209
  end
204
-
205
- values.compact!
206
- values
207
210
  when :bool
208
211
  string_value = value.strip
209
212
  string_value = string_value.downcase
@@ -277,12 +280,11 @@ module Datadog
277
280
  end
278
281
 
279
282
  # Directly manipulates the current value and currently set precedence.
280
- def internal_set(value, precedence, resolved_env)
283
+ def internal_set(value, precedence)
281
284
  old_value = @value
282
285
  (@value = context_exec(validate_type(value), old_value, &definition.setter)).tap do |v|
283
286
  @is_set = true
284
287
  @precedence_set = precedence
285
- @resolved_env = resolved_env
286
288
  # Store original value to ensure we can always safely call `#internal_set`
287
289
  # when restoring a value from `@value_per_precedence`, and we are only running `definition.setter`
288
290
  # on the original value, not on a value that has already been processed by `definition.setter`.
@@ -304,54 +306,56 @@ module Datadog
304
306
  end
305
307
 
306
308
  def set_env_value
307
- value, resolved_env = get_value_and_resolved_env_from(ENV)
308
- set(value, precedence: Precedence::ENVIRONMENT, resolved_env: resolved_env) unless value.nil?
309
+ value = get_value_from_env
310
+ set(value, precedence: Precedence::ENVIRONMENT) unless value.nil?
309
311
  end
310
312
 
311
313
  def set_customer_stable_config_value
312
314
  customer_config = StableConfig.configuration.dig(:local, :config)
313
315
  return if customer_config.nil?
314
316
 
315
- value, resolved_env = get_value_and_resolved_env_from(customer_config, source: 'local stable config')
316
- set(value, precedence: Precedence::LOCAL_STABLE, resolved_env: resolved_env) unless value.nil?
317
+ value = get_value_from(customer_config, 'local')
318
+ set(value, precedence: Precedence::LOCAL_STABLE) unless value.nil?
317
319
  end
318
320
 
319
321
  def set_fleet_stable_config_value
320
322
  fleet_config = StableConfig.configuration.dig(:fleet, :config)
321
323
  return if fleet_config.nil?
322
324
 
323
- value, resolved_env = get_value_and_resolved_env_from(fleet_config, source: 'fleet stable config')
324
- set(value, precedence: Precedence::FLEET_STABLE, resolved_env: resolved_env) unless value.nil?
325
+ value = get_value_from(fleet_config, 'fleet')
326
+ set(value, precedence: Precedence::FLEET_STABLE) unless value.nil?
325
327
  end
326
328
 
327
- def get_value_and_resolved_env_from(env_vars, source: 'environment variable')
328
- value = nil
329
- resolved_env = nil
330
-
331
- if definition.env
332
- Array(definition.env).each do |env|
333
- next if env_vars[env].nil?
329
+ def get_value_from_env
330
+ env = definition.env
331
+ return unless env
334
332
 
335
- resolved_env = env
336
- value = coerce_env_variable(env_vars[env])
337
- break
338
- end
339
- end
340
-
341
- if value.nil? && definition.deprecated_env && env_vars[definition.deprecated_env]
342
- resolved_env = definition.deprecated_env
343
- value = coerce_env_variable(env_vars[definition.deprecated_env])
333
+ value = DATADOG_ENV[env]
334
+ coerce_env_variable(value) unless value.nil?
335
+ rescue ArgumentError
336
+ # This will be raised when the type is set to :int or :float but an invalid env var value is provided.
337
+ raise ArgumentError,
338
+ # ArgumentError will be thrown from coerce_env_variable, so we've already checked that env is not nil.
339
+ # @type var env: String
340
+ "Expected environment variable #{DATADOG_ENV.resolve_env(env)} " \
341
+ "to be a #{definition.type}, but '#{value}' was provided."
342
+ end
344
343
 
345
- Datadog::Core.log_deprecation do
346
- "#{definition.deprecated_env} #{source} is deprecated, use #{definition.env} instead."
347
- end
348
- end
344
+ def get_value_from(source_env, source_name)
345
+ env = definition.env
346
+ return unless env
349
347
 
350
- [value, resolved_env]
348
+ # An instance of ConfigHelper could be used with any Hash but this is the only place where
349
+ # it's used with something else than ENV, let's keep it simple for now by overriding the source_env parameter.
350
+ value = DATADOG_ENV.get_environment_variable(env, source_env: source_env)
351
+ coerce_env_variable(value) unless value.nil?
351
352
  rescue ArgumentError
353
+ # This will be raised when the type is set to :int or :float but an invalid env var value is provided.
352
354
  raise ArgumentError,
353
- "Expected #{source} #{resolved_env} to be a #{@definition.type}, " \
354
- "but '#{env_vars[resolved_env]}' was provided"
355
+ # ArgumentError will be thrown from coerce_env_variable, so we've already checked that env is not nil.
356
+ # @type var env: String
357
+ "Expected #{source_name} configuration file variable #{DATADOG_ENV.resolve_env(env, source_env: source_env)} " \
358
+ "to be a #{definition.type}, but '#{value}' was provided."
355
359
  end
356
360
 
357
361
  # Anchor object that represents a value that is not set.
@@ -13,7 +13,6 @@ module Datadog
13
13
  :default,
14
14
  :default_proc,
15
15
  :env,
16
- :deprecated_env,
17
16
  :env_parser,
18
17
  :name,
19
18
  :after_set,
@@ -22,11 +21,10 @@ module Datadog
22
21
  :type,
23
22
  :type_options
24
23
 
25
- def initialize(name, meta = {}, &block)
24
+ def initialize(name, meta, &block)
26
25
  @default = meta[:default]
27
26
  @default_proc = meta[:default_proc]
28
27
  @env = meta[:env]
29
- @deprecated_env = meta[:deprecated_env]
30
28
  @env_parser = meta[:env_parser]
31
29
  @name = name.to_sym
32
30
  @after_set = meta[:after_set]
@@ -44,14 +42,13 @@ module Datadog
44
42
  # Acts as DSL for building OptionDefinitions
45
43
  # @public_api
46
44
  class Builder
47
- class InvalidOptionError < StandardError; end
45
+ InvalidOptionError = Class.new(StandardError)
48
46
 
49
47
  attr_reader \
50
48
  :helpers
51
49
 
52
50
  def initialize(name, options = {})
53
51
  @env = nil
54
- @deprecated_env = nil
55
52
  @env_parser = nil
56
53
  @default = nil
57
54
  @default_proc = nil
@@ -75,10 +72,6 @@ module Datadog
75
72
  @env = value
76
73
  end
77
74
 
78
- def deprecated_env(value) # standard:disable Style/TrivialAccessors
79
- @deprecated_env = value
80
- end
81
-
82
75
  # Invoked when the option is first read, and {#env} is defined.
83
76
  # The block provided is only invoked if the environment variable is present (not-nil).
84
77
  def env_parser(&block)
@@ -123,7 +116,6 @@ module Datadog
123
116
  default(options[:default]) if options.key?(:default)
124
117
  default_proc(&options[:default_proc]) if options.key?(:default_proc)
125
118
  env(options[:env]) if options.key?(:env)
126
- deprecated_env(options[:deprecated_env]) if options.key?(:deprecated_env)
127
119
  env_parser(&options[:env_parser]) if options.key?(:env_parser)
128
120
  after_set(&options[:after_set]) if options.key?(:after_set)
129
121
  resetter(&options[:resetter]) if options.key?(:resetter)
@@ -140,7 +132,6 @@ module Datadog
140
132
  default: @default,
141
133
  default_proc: @default_proc,
142
134
  env: @env,
143
- deprecated_env: @deprecated_env,
144
135
  env_parser: @env_parser,
145
136
  after_set: @after_set,
146
137
  resetter: @resetter,
@@ -40,14 +40,19 @@ module Datadog
40
40
 
41
41
  def default_helpers(name)
42
42
  option_name = name.to_sym
43
-
43
+ # @type var opt_getter: Configuration::OptionDefinition::helper_proc
44
+ opt_getter = proc do
45
+ # These Procs uses `get/set_option`, but we only add them to the OptionDefinition helpers here.
46
+ # Steep is right that these methods are not defined, but we only run these Procs in instance context.
47
+ get_option(option_name) # steep:ignore NoMethod
48
+ end
49
+ # @type var opt_setter: Configuration::OptionDefinition::helper_proc
50
+ opt_setter = proc do |value|
51
+ set_option(option_name, value) # steep:ignore NoMethod
52
+ end
44
53
  {
45
- option_name.to_sym => proc do
46
- get_option(option_name)
47
- end,
48
- :"#{option_name}=" => proc do |value|
49
- set_option(option_name, value)
50
- end
54
+ option_name.to_sym => opt_getter,
55
+ :"#{option_name}=" => opt_setter
51
56
  }
52
57
  end
53
58
 
@@ -68,7 +73,7 @@ module Datadog
68
73
  end
69
74
 
70
75
  def set_option(name, value, precedence: Configuration::Option::Precedence::PROGRAMMATIC)
71
- resolve_option(name).set(value, precedence: precedence, resolved_env: resolved_env(name))
76
+ resolve_option(name).set(value, precedence: precedence)
72
77
  end
73
78
 
74
79
  def unset_option(name, precedence: Configuration::Option::Precedence::PROGRAMMATIC)
@@ -113,13 +118,10 @@ module Datadog
113
118
 
114
119
  assert_valid_option!(name)
115
120
  definition = self.class.options[name]
121
+ # @type self: Configuration::Options::GenericSettingsClass
116
122
  options[name] = definition.build(self)
117
123
  end
118
124
 
119
- def resolved_env(name)
120
- options[name].resolved_env if options.key?(name)
121
- end
122
-
123
125
  def assert_valid_option!(name)
124
126
  raise(InvalidOptionError, "#{self.class.name} doesn't define the option: #{name}") unless option_defined?(name)
125
127
  end
@@ -122,8 +122,8 @@ module Datadog
122
122
  # @default `DD_TRACE_DEBUG` environment variable, otherwise `false`
123
123
  # @return [Boolean]
124
124
  option :debug do |o|
125
- o.env [Datadog::Core::Configuration::Ext::Diagnostics::ENV_DEBUG_ENABLED,
126
- Datadog::Core::Configuration::Ext::Diagnostics::ENV_OTEL_LOG_LEVEL]
125
+ # Note: Alias (OTEL_LOG_LEVEL) defined in supported-configurations.json
126
+ o.env Datadog::Core::Configuration::Ext::Diagnostics::ENV_DEBUG_ENABLED
127
127
  o.default false
128
128
  o.type :bool
129
129
  o.env_parser do |value|
@@ -212,6 +212,7 @@ module Datadog
212
212
  # Log level for `Datadog.logger`.
213
213
  # @see Logger::Severity
214
214
  # @return Logger::Severity
215
+ # TODO: Add environment variable for this `DD_TRACE_LOG_LEVEL`
215
216
  option :level, default: ::Logger::INFO
216
217
  end
217
218
 
@@ -485,7 +486,7 @@ module Datadog
485
486
  # @default `DD_PROFILING_GVL_ENABLED` environment variable as a boolean, otherwise `true`
486
487
  option :gvl_enabled do |o|
487
488
  o.type :bool
488
- o.deprecated_env 'DD_PROFILING_PREVIEW_GVL_ENABLED'
489
+ # Note: Deprecated alias (DD_PROFILING_PREVIEW_GVL_ENABLED) defined in supported-configurations.json
489
490
  o.env 'DD_PROFILING_GVL_ENABLED'
490
491
  o.default true
491
492
  end
@@ -604,7 +605,8 @@ module Datadog
604
605
 
605
606
  option :experimental_runtime_id_enabled do |o|
606
607
  o.type :bool
607
- o.env ['DD_TRACE_EXPERIMENTAL_RUNTIME_ID_ENABLED', 'DD_RUNTIME_METRICS_RUNTIME_ID_ENABLED']
608
+ # Note: Alias (DD_TRACE_EXPERIMENTAL_RUNTIME_ID_ENABLED) defined in supported-configurations.json
609
+ o.env 'DD_RUNTIME_METRICS_RUNTIME_ID_ENABLED'
608
610
  o.default false
609
611
  end
610
612
 
@@ -620,7 +622,8 @@ module Datadog
620
622
  o.type :string, nilable: true
621
623
 
622
624
  # NOTE: service also gets set as a side effect of tags. See the WORKAROUND note in #initialize for details.
623
- o.env [Core::Environment::Ext::ENV_SERVICE, Core::Environment::Ext::ENV_OTEL_SERVICE]
625
+ # Note: Alias (OTEL_SERVICE_NAME) defined in supported-configurations.json
626
+ o.env Core::Environment::Ext::ENV_SERVICE
624
627
  o.default Core::Environment::Ext::FALLBACK_SERVICE_NAME
625
628
 
626
629
  # There's a few cases where we don't want to use the fallback service name, so this helper allows us to get a
@@ -655,7 +658,8 @@ module Datadog
655
658
  # @return [Hash<String,String>]
656
659
  option :tags do |o|
657
660
  o.type :hash, nilable: true
658
- o.env [Core::Environment::Ext::ENV_TAGS, Core::Environment::Ext::ENV_OTEL_RESOURCE_ATTRIBUTES]
661
+ # Note: Alias (OTEL_RESOURCE_ATTRIBUTES) defined in supported-configurations.json
662
+ o.env Core::Environment::Ext::ENV_TAGS
659
663
  o.env_parser do |env_value|
660
664
  # Parses a string containing key-value pairs and returns a hash.
661
665
  # Key-value pairs are delimited by ':' OR `=`, and pairs are separated by whitespace, comma, OR BOTH.