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
@@ -20,7 +20,7 @@ module Datadog
20
20
  register_as :sidekiq
21
21
 
22
22
  def self.version
23
- Gem.loaded_specs['sidekiq'] && Gem.loaded_specs['sidekiq'].version
23
+ Gem.loaded_specs['sidekiq']&.version
24
24
  end
25
25
 
26
26
  def self.loaded?
@@ -25,7 +25,7 @@ module Datadog
25
25
  job['class'].to_s
26
26
  end
27
27
  rescue => e
28
- Datadog.logger.debug { "Error retrieving Sidekiq job class name (jid:#{job['jid']}): #{e}" }
28
+ Datadog.logger.debug { "Error retrieving Sidekiq job class name (jid:#{job["jid"]}): #{e}" }
29
29
 
30
30
  job['class'].to_s
31
31
  end
@@ -18,7 +18,7 @@ module Datadog
18
18
  register_as :sinatra
19
19
 
20
20
  def self.version
21
- Gem.loaded_specs['sinatra'] && Gem.loaded_specs['sinatra'].version
21
+ Gem.loaded_specs['sinatra']&.version
22
22
  end
23
23
 
24
24
  def self.loaded?
@@ -28,63 +28,61 @@ module Datadog
28
28
  service: configuration[:service_name],
29
29
  type: Tracing::Metadata::Ext::HTTP::TYPE_INBOUND
30
30
  ) do |span|
31
- begin
32
- # this is kept nil until we set a correct one (either in the route or with a fallback in the ensure below)
33
- # the nil signals that there's no good one yet and is also seen by profiler, when sampling the resource
34
- span.resource = nil
31
+ # this is kept nil until we set a correct one (either in the route or with a fallback in the ensure below)
32
+ # the nil signals that there's no good one yet and is also seen by profiler, when sampling the resource
33
+ span.resource = nil
35
34
 
36
- Sinatra::Env.set_datadog_span(env, span)
35
+ Sinatra::Env.set_datadog_span(env, span)
37
36
 
38
- response = @app.call(env)
39
- ensure
40
- Contrib::Rack::HeaderTagging.tag_request_headers(span, env, configuration)
37
+ response = @app.call(env)
38
+ ensure
39
+ Contrib::Rack::HeaderTagging.tag_request_headers(span, env, configuration)
41
40
 
42
- span.set_tag(Tracing::Metadata::Ext::TAG_COMPONENT, Ext::TAG_COMPONENT)
43
- span.set_tag(Tracing::Metadata::Ext::TAG_OPERATION, Ext::TAG_OPERATION_REQUEST)
41
+ span.set_tag(Tracing::Metadata::Ext::TAG_COMPONENT, Ext::TAG_COMPONENT)
42
+ span.set_tag(Tracing::Metadata::Ext::TAG_OPERATION, Ext::TAG_OPERATION_REQUEST)
44
43
 
45
- request = ::Sinatra::Request.new(env)
44
+ request = ::Sinatra::Request.new(env)
46
45
 
47
- span.set_tag(Tracing::Metadata::Ext::HTTP::TAG_URL, request.path)
48
- span.set_tag(Tracing::Metadata::Ext::HTTP::TAG_METHOD, request.request_method)
46
+ span.set_tag(Tracing::Metadata::Ext::HTTP::TAG_URL, request.path)
47
+ span.set_tag(Tracing::Metadata::Ext::HTTP::TAG_METHOD, request.request_method)
49
48
 
50
- datadog_route = Sinatra::Env.route_path(env)
49
+ datadog_route = Sinatra::Env.route_path(env)
51
50
 
52
- span.set_tag(Ext::TAG_ROUTE_PATH, datadog_route) if datadog_route
51
+ span.set_tag(Ext::TAG_ROUTE_PATH, datadog_route) if datadog_route
53
52
 
54
- if request.script_name && !request.script_name.empty?
55
- span.set_tag(Ext::TAG_SCRIPT_NAME, request.script_name)
56
- end
53
+ if request.script_name && !request.script_name.empty?
54
+ span.set_tag(Ext::TAG_SCRIPT_NAME, request.script_name)
55
+ end
57
56
 
58
- # If this app handled the request, then Contrib::Sinatra::Tracer OR Contrib::Sinatra::Base set the
59
- # resource; if no resource was set, let's use a fallback
60
- span.resource = env['REQUEST_METHOD'] if span.resource.nil?
57
+ # If this app handled the request, then Contrib::Sinatra::Tracer OR Contrib::Sinatra::Base set the
58
+ # resource; if no resource was set, let's use a fallback
59
+ span.resource = env['REQUEST_METHOD'] if span.resource.nil?
61
60
 
62
- rack_request_span = env[Contrib::Rack::Ext::RACK_ENV_REQUEST_SPAN]
61
+ rack_request_span = env[Contrib::Rack::Ext::RACK_ENV_REQUEST_SPAN]
63
62
 
64
- # This propagates the Sinatra resource to the Rack span,
65
- # since the latter is unaware of what the resource might be
66
- # and would fallback to a generic resource name when unset
67
- rack_request_span.resource ||= span.resource if rack_request_span
63
+ # This propagates the Sinatra resource to the Rack span,
64
+ # since the latter is unaware of what the resource might be
65
+ # and would fallback to a generic resource name when unset
66
+ rack_request_span.resource ||= span.resource if rack_request_span
68
67
 
69
- if response
70
- if (status = response[0])
71
- sinatra_response = ::Sinatra::Response.new([], status) # Build object to use status code helpers
68
+ if response
69
+ if (status = response[0])
70
+ sinatra_response = ::Sinatra::Response.new([], status) # Build object to use status code helpers
72
71
 
73
- span.set_tag(Tracing::Metadata::Ext::HTTP::TAG_STATUS_CODE, sinatra_response.status)
74
- span.set_error(env['sinatra.error']) if sinatra_response.server_error?
75
- end
72
+ span.set_tag(Tracing::Metadata::Ext::HTTP::TAG_STATUS_CODE, sinatra_response.status)
73
+ span.set_error(env['sinatra.error']) if sinatra_response.server_error?
74
+ end
76
75
 
77
- if (headers = response[1])
78
- Contrib::Rack::HeaderTagging.tag_response_headers(span, headers, configuration)
79
- end
76
+ if (headers = response[1])
77
+ Contrib::Rack::HeaderTagging.tag_response_headers(span, headers, configuration)
80
78
  end
79
+ end
81
80
 
82
- # Set analytics sample rate
83
- Contrib::Analytics.set_sample_rate(span, analytics_sample_rate) if analytics_enabled?
81
+ # Set analytics sample rate
82
+ Contrib::Analytics.set_sample_rate(span, analytics_sample_rate) if analytics_enabled?
84
83
 
85
- # Measure service stats
86
- Contrib::Analytics.set_measured(span)
87
- end
84
+ # Measure service stats
85
+ Contrib::Analytics.set_measured(span)
88
86
  end
89
87
  end
90
88
  # rubocop:enable Metrics/MethodLength
@@ -19,7 +19,7 @@ module Datadog
19
19
  register_as :sneakers, auto_patch: true
20
20
 
21
21
  def self.version
22
- Gem.loaded_specs['sneakers'] && Gem.loaded_specs['sneakers'].version
22
+ Gem.loaded_specs['sneakers']&.version
23
23
  end
24
24
 
25
25
  def self.loaded?
@@ -11,7 +11,7 @@ module Datadog
11
11
  NO_SOURCE = [].freeze
12
12
 
13
13
  def self.fetch_service_name(env, default)
14
- ENV.fetch(env) do
14
+ DATADOG_ENV.fetch(env) do
15
15
  if Datadog.configuration.tracing.contrib.global_default_service_name.enabled
16
16
  return Datadog.configuration.service
17
17
  end
@@ -18,7 +18,7 @@ module Datadog
18
18
  register_as :stripe
19
19
 
20
20
  def self.version
21
- Gem.loaded_specs['stripe'] && Gem.loaded_specs['stripe'].version
21
+ Gem.loaded_specs['stripe']&.version
22
22
  end
23
23
 
24
24
  def self.loaded?
@@ -54,7 +54,7 @@ module Datadog
54
54
  span.set_tag(Ext::TAG_REQUEST_METHOD, event.method)
55
55
  span.set_tag(Ext::TAG_REQUEST_PATH, event.path)
56
56
  span.set_tag(Ext::TAG_REQUEST_NUM_RETRIES, event.num_retries.to_s)
57
- rescue StandardError => e
57
+ rescue => e
58
58
  Datadog.logger.debug(e.message)
59
59
  end
60
60
 
@@ -18,7 +18,7 @@ module Datadog
18
18
  register_as :sucker_punch, auto_patch: true
19
19
 
20
20
  def self.version
21
- Gem.loaded_specs['sucker_punch'] && Gem.loaded_specs['sucker_punch'].version
21
+ Gem.loaded_specs['sucker_punch']&.version
22
22
  end
23
23
 
24
24
  def self.loaded?
@@ -19,7 +19,7 @@ module Datadog
19
19
  TAG_COMPONENT = 'trilogy'
20
20
  TAG_OPERATION_QUERY = 'query'
21
21
  TAG_SYSTEM = 'mysql'
22
- PEER_SERVICE_SOURCES = (Array[Ext::TAG_DB_NAME] + Contrib::Ext::DB::PEER_SERVICE_SOURCES).freeze
22
+ PEER_SERVICE_SOURCES = ([Ext::TAG_DB_NAME] + Contrib::Ext::DB::PEER_SERVICE_SOURCES).freeze
23
23
  end
24
24
  end
25
25
  end
@@ -18,7 +18,7 @@ module Datadog
18
18
  register_as :trilogy
19
19
 
20
20
  def self.version
21
- Gem.loaded_specs['trilogy'] && Gem.loaded_specs['trilogy'].version
21
+ Gem.loaded_specs['trilogy']&.version
22
22
  end
23
23
 
24
24
  def self.loaded?
@@ -21,7 +21,7 @@ module Datadog
21
21
  def format(hash_obj, options = {})
22
22
  options ||= {}
23
23
  format!(hash_obj, options)
24
- rescue StandardError
24
+ rescue
25
25
  options[:placeholder] || PLACEHOLDER
26
26
  end
27
27
 
@@ -66,7 +66,7 @@ module Datadog
66
66
  def format_array(value, options)
67
67
  if value.any? { |v| v.class <= ::Hash || v.class <= Array }
68
68
  first_entry = format_value(value.first, options)
69
- value.size > 1 ? [first_entry, options[:placeholder]] : [first_entry]
69
+ (value.size > 1) ? [first_entry, options[:placeholder]] : [first_entry]
70
70
  # Otherwise short-circuit and return single placeholder
71
71
  else
72
72
  [options[:placeholder]]
@@ -77,19 +77,19 @@ module Datadog
77
77
  {}.tap do |options|
78
78
  # Show
79
79
  # If either is :all, value becomes :all
80
- options[:show] = if original[:show] == :all || additional[:show] == :all
81
- :all
82
- else
83
- (original[:show] || []).dup.concat(additional[:show] || []).uniq
84
- end
80
+ options[:show] = if original[:show] == :all || additional[:show] == :all
81
+ :all
82
+ else
83
+ (original[:show] || []).dup.concat(additional[:show] || []).uniq
84
+ end
85
85
 
86
86
  # Exclude
87
87
  # If either is :all, value becomes :all
88
88
  options[:exclude] = if original[:exclude] == :all || additional[:exclude] == :all
89
- :all
90
- else
91
- (original[:exclude] || []).dup.concat(additional[:exclude] || []).uniq
92
- end
89
+ :all
90
+ else
91
+ (original[:exclude] || []).dup.concat(additional[:exclude] || []).uniq
92
+ end
93
93
 
94
94
  options[:placeholder] = additional[:placeholder] || original[:placeholder]
95
95
  end
@@ -16,16 +16,16 @@ module Datadog
16
16
  # but adjusted to parse only <scheme>://<host>:<port>/ components
17
17
  # and stop there, since we don't care about the path, query string,
18
18
  # and fragment components
19
- RFC3986_URL_BASE = /\A(?<URI>(?<scheme>[A-Za-z][+\-.0-9A-Za-z]*+):(?<hier-part>\/\/(?<authority>(?:(?<userinfo>(?:%\h\h|[!$&-.0-;=A-Z_a-z~])*+)@)?(?<host>(?<IP-literal>\[(?:(?<IPv6address>(?:\h{1,4}:){6}(?<ls32>\h{1,4}:\h{1,4}|(?<IPv4address>(?<dec-octet>[1-9]\d|1\d{2}|2[0-4]\d|25[0-5]|\d)\.\g<dec-octet>\.\g<dec-octet>\.\g<dec-octet>))|::(?:\h{1,4}:){5}\g<ls32>|\h{1,4}?::(?:\h{1,4}:){4}\g<ls32>|(?:(?:\h{1,4}:)?\h{1,4})?::(?:\h{1,4}:){3}\g<ls32>|(?:(?:\h{1,4}:){,2}\h{1,4})?::(?:\h{1,4}:){2}\g<ls32>|(?:(?:\h{1,4}:){,3}\h{1,4})?::\h{1,4}:\g<ls32>|(?:(?:\h{1,4}:){,4}\h{1,4})?::\g<ls32>|(?:(?:\h{1,4}:){,5}\h{1,4})?::\h{1,4}|(?:(?:\h{1,4}:){,6}\h{1,4})?::)|(?<IPvFuture>v\h++\.[!$&-.0-;=A-Z_a-z~]++))\])|\g<IPv4address>|(?<reg-name>(?:%\h\h|[!$&-.0-9;=A-Z_a-z~])*+))(?::(?<port>\d*+))?)))(?:\/|\z)/.freeze # rubocop:disable Style/RegexpLiteral, Layout/LineLength
19
+ RFC3986_URL_BASE = /\A(?<URI>(?<scheme>[A-Za-z][+\-.0-9A-Za-z]*+):(?<hier-part>\/\/(?<authority>(?:(?<userinfo>(?:%\h\h|[!$&-.0-;=A-Z_a-z~])*+)@)?(?<host>(?<IP-literal>\[(?:(?<IPv6address>(?:\h{1,4}:){6}(?<ls32>\h{1,4}:\h{1,4}|(?<IPv4address>(?<dec-octet>[1-9]\d|1\d{2}|2[0-4]\d|25[0-5]|\d)\.\g<dec-octet>\.\g<dec-octet>\.\g<dec-octet>))|::(?:\h{1,4}:){5}\g<ls32>|\h{1,4}?::(?:\h{1,4}:){4}\g<ls32>|(?:(?:\h{1,4}:)?\h{1,4})?::(?:\h{1,4}:){3}\g<ls32>|(?:(?:\h{1,4}:){,2}\h{1,4})?::(?:\h{1,4}:){2}\g<ls32>|(?:(?:\h{1,4}:){,3}\h{1,4})?::\h{1,4}:\g<ls32>|(?:(?:\h{1,4}:){,4}\h{1,4})?::\g<ls32>|(?:(?:\h{1,4}:){,5}\h{1,4})?::\h{1,4}|(?:(?:\h{1,4}:){,6}\h{1,4})?::)|(?<IPvFuture>v\h++\.[!$&-.0-;=A-Z_a-z~]++))\])|\g<IPv4address>|(?<reg-name>(?:%\h\h|[!$&-.0-9;=A-Z_a-z~])*+))(?::(?<port>\d*+))?)))(?:\/|\z)/.freeze # rubocop:disable Layout/LineLength
20
20
 
21
21
  module_function
22
22
 
23
23
  def url(url, options = {})
24
24
  url!(url, options)
25
- rescue StandardError
25
+ rescue
26
26
  placeholder = options[:placeholder] || PLACEHOLDER
27
27
 
28
- options[:base] == :exclude ? placeholder : "#{base_url(url)}/#{placeholder}"
28
+ (options[:base] == :exclude) ? placeholder : "#{base_url(url)}/#{placeholder}"
29
29
  end
30
30
 
31
31
  def base_url(url, options = {})
@@ -43,7 +43,7 @@ module Datadog
43
43
  # Format the query string
44
44
  if uri.query
45
45
  query = query(uri.query, options[:query])
46
- uri.query = (!query.nil? && query.empty? ? nil : query)
46
+ uri.query = ((!query.nil? && query.empty?) ? nil : query)
47
47
  end
48
48
 
49
49
  # Remove any URI fragments
@@ -59,7 +59,7 @@ module Datadog
59
59
 
60
60
  def query(query, options = {})
61
61
  query!(query, options)
62
- rescue StandardError
62
+ rescue
63
63
  options[:placeholder] || PLACEHOLDER
64
64
  end
65
65
 
@@ -78,7 +78,7 @@ module Datadog
78
78
  if options[:exclude].include?(key)
79
79
  [nil, nil]
80
80
  else
81
- value = options[:show] == :all || options[:show].include?(key) ? value : nil
81
+ value = (options[:show] == :all || options[:show].include?(key)) ? value : nil
82
82
  [key, value]
83
83
  end
84
84
  end
@@ -86,7 +86,11 @@ module Datadog
86
86
  sampler = Datadog.configuration.tracing.sampler
87
87
  return Datadog.configuration.tracing.sampling.default_rate unless sampler
88
88
 
89
- sampler.sample_rate(nil) rescue nil
89
+ begin
90
+ sampler.sample_rate(nil)
91
+ rescue
92
+ nil
93
+ end
90
94
  end
91
95
 
92
96
  # DEV: We currently only support SimpleRule instances.
@@ -28,7 +28,7 @@ module Datadog
28
28
  span_id = digest.span_id || 0 # Fall back to zero (invalid) if not present
29
29
 
30
30
  # DEV: We need these to be hex encoded
31
- value = "#{format('%032x', digest.trace_id)}-#{format('%016x', span_id)}"
31
+ value = "#{format("%032x", digest.trace_id)}-#{format("%016x", span_id)}"
32
32
 
33
33
  if digest.trace_sampling_priority
34
34
  sampling_priority = Helpers.clamp_sampling_priority(
@@ -17,15 +17,18 @@ module Datadog
17
17
  BAGGAGE_KEY = 'baggage'
18
18
  DD_TRACE_BAGGAGE_MAX_ITEMS = 64
19
19
  DD_TRACE_BAGGAGE_MAX_BYTES = 8192
20
+ BAGGAGE_TAG_KEYS_MATCH_ALL = ['*'].freeze
20
21
  SAFE_CHARACTERS_KEY = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789$!#&'*+-.^_`|~"
21
22
  SAFE_CHARACTERS_VALUE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789$!#&'()*+-./:<>?@[]^_`{|}~"
22
23
 
23
24
  def initialize(
24
25
  fetcher:,
25
- baggage_key: BAGGAGE_KEY
26
+ baggage_key: BAGGAGE_KEY,
27
+ baggage_tag_keys: ::Datadog.configuration.tracing.baggage_tag_keys
26
28
  )
27
29
  @baggage_key = baggage_key
28
30
  @fetcher = fetcher
31
+ @baggage_tag_keys = baggage_tag_keys
29
32
  end
30
33
 
31
34
  def inject!(digest, data)
@@ -36,7 +39,13 @@ module Datadog
36
39
 
37
40
  begin
38
41
  if baggage_items.size > DD_TRACE_BAGGAGE_MAX_ITEMS
39
- ::Datadog.logger.warn('Baggage item limit exceeded, dropping excess items')
42
+ ::Datadog.logger.warn("Baggage item limit (#{DD_TRACE_BAGGAGE_MAX_ITEMS}) exceeded, dropping excess items")
43
+ # Record telemetry for item count truncation
44
+ record_telemetry_metric(
45
+ 'context_header.truncated',
46
+ 1,
47
+ {'header_style' => 'baggage', 'truncation_reason' => 'baggage_item_count_exceeded'}
48
+ )
40
49
  baggage_items = baggage_items.first(DD_TRACE_BAGGAGE_MAX_ITEMS)
41
50
  end
42
51
 
@@ -47,7 +56,13 @@ module Datadog
47
56
  item = "#{encode_item(key, SAFE_CHARACTERS_KEY)}=#{encode_item(value, SAFE_CHARACTERS_VALUE)}"
48
57
  item_size = item.bytesize + (encoded_items.empty? ? 0 : 1) # +1 for comma if not first item
49
58
  if total_size + item_size > DD_TRACE_BAGGAGE_MAX_BYTES
50
- ::Datadog.logger.warn('Baggage header size exceeded, dropping excess items')
59
+ ::Datadog.logger.warn("Baggage header size (#{DD_TRACE_BAGGAGE_MAX_BYTES}) exceeded, dropping excess items")
60
+ # Record telemetry for byte count truncation
61
+ record_telemetry_metric(
62
+ 'context_header.truncated',
63
+ 1,
64
+ {'header_style' => 'baggage', 'truncation_reason' => 'baggage_byte_count_exceeded'}
65
+ )
51
66
  break # stop adding items when size limit is reached
52
67
  end
53
68
  encoded_items << item
@@ -57,10 +72,12 @@ module Datadog
57
72
  # edge case where a single item is too large
58
73
  return if encoded_items.empty?
59
74
 
60
- header_value = encoded_items.join(',')
61
- data[@baggage_key] = header_value
75
+ data[@baggage_key] = encoded_items.join(',')
76
+
77
+ # Record telemetry for successful injection
78
+ record_telemetry_metric('context_header_style.injected', 1, {'header_style' => 'baggage'})
62
79
  rescue => e
63
- ::Datadog.logger.warn("Failed to encode and inject baggage header: #{e.message}")
80
+ ::Datadog.logger.warn("Failed to encode and inject baggage header: #{e.class}: #{e}")
64
81
  end
65
82
  end
66
83
 
@@ -72,8 +89,17 @@ module Datadog
72
89
  baggage = parse_baggage_header(fetcher[@baggage_key])
73
90
  return unless baggage
74
91
 
92
+ # Convert selected baggage items to span tags based on configuration
93
+ baggage_tags = build_baggage_tags(baggage)
94
+
95
+ # Record telemetry for successful extraction only if baggage is not empty
96
+ unless baggage.empty?
97
+ record_telemetry_metric('context_header_style.extracted', 1, {'header_style' => 'baggage'})
98
+ end
99
+
75
100
  TraceDigest.new(
76
101
  baggage: baggage,
102
+ trace_distributed_tags: baggage_tags
77
103
  )
78
104
  end
79
105
 
@@ -115,16 +141,55 @@ module Datadog
115
141
  baggages.each do |key_value|
116
142
  key, value = key_value.split('=', 2)
117
143
  # If baggage is malformed, return an empty hash
118
- return {} unless key && value
144
+ if key.nil? || value.nil?
145
+ # Record telemetry for malformed header
146
+ record_telemetry_metric('context_header_style.malformed', 1, {'header_style' => 'baggage'})
147
+ return {}
148
+ end
119
149
 
120
150
  key = URI.decode_www_form_component(key.strip)
121
151
  value = URI.decode_www_form_component(value.strip)
122
- return {} if key.empty? || value.empty?
152
+ if key.empty? || value.empty?
153
+ # Record telemetry for malformed header
154
+ record_telemetry_metric('context_header_style.malformed', 1, {'header_style' => 'baggage'})
155
+ return {}
156
+ end
123
157
 
124
158
  baggage[key] = value
125
159
  end
126
160
  baggage
127
161
  end
162
+
163
+ # Convert selected baggage items to span tags
164
+ # Baggage carries important contextual information (like user.id, session.id) across distributed services,
165
+ # but isn't searchable by default.
166
+ def build_baggage_tags(baggage)
167
+ return {} if baggage.empty?
168
+
169
+ # Get the configuration for which baggage keys should become span tags
170
+ baggage_tag_keys = @baggage_tag_keys
171
+ return {} if baggage_tag_keys.empty?
172
+
173
+ # If wildcard is specified, use all baggage keys
174
+ baggage_tag_keys = baggage if baggage_tag_keys == BAGGAGE_TAG_KEYS_MATCH_ALL
175
+
176
+ tags = {}
177
+
178
+ baggage_tag_keys.each do |key, _| # rubocop:disable Style/HashEachMethods
179
+ value = baggage[key]
180
+ next if value.nil? || value.empty?
181
+
182
+ tags["baggage.#{key}"] = value
183
+ end
184
+
185
+ tags
186
+ end
187
+
188
+ # Record telemetry metrics for baggage operations
189
+ def record_telemetry_metric(metric_name, value, tags)
190
+ telemetry = ::Datadog.send(:components).telemetry
191
+ telemetry.inc('instrumentation_telemetry_data.tracers', metric_name, value, tags: tags)
192
+ end
128
193
  end
129
194
  end
130
195
  end
@@ -55,17 +55,16 @@ module Datadog
55
55
  def extract(data)
56
56
  fetcher = @fetcher.new(data)
57
57
 
58
- trace_id = parse_trace_id(fetcher)
58
+ trace_id = parse_trace_id(fetcher)
59
59
  parent_id = parse_parent_id(fetcher)
60
60
 
61
61
  sampling_priority = Helpers.parse_decimal_id(fetcher[@sampling_priority_key])
62
62
  origin = fetcher[@origin_key]
63
63
 
64
64
  # Return early if this propagation is not valid
65
- # DEV: To be valid we need to have a trace id and a parent id
66
- # or when it is a synthetics trace, just the trace id.
65
+ # DEV: To be valid we need to have a trace id and a parent id or an origin id.
67
66
  # DEV: `Fetcher#id` will not return 0
68
- return unless (trace_id && parent_id) || (origin && trace_id)
67
+ return if trace_id.nil? || parent_id.nil? && origin.nil?
69
68
 
70
69
  trace_distributed_tags = extract_tags(fetcher)
71
70
 
@@ -173,7 +172,7 @@ module Datadog
173
172
 
174
173
  def set_tags_propagation_error(reason:)
175
174
  active_trace = Tracing.active_trace
176
- active_trace.set_tag('_dd.propagation_error', reason) if active_trace
175
+ active_trace&.set_tag('_dd.propagation_error', reason)
177
176
  nil
178
177
  end
179
178
 
@@ -31,19 +31,17 @@ module Datadog
31
31
  # @return [String] serialized tags hash
32
32
  # @raise [EncodingError] if tags cannot be serialized to the `x-datadog-tags` format
33
33
  def self.encode(tags)
34
- begin
35
- tags.map do |raw_key, raw_value|
36
- key = raw_key.to_s
37
- value = raw_value.to_s
34
+ tags.map do |raw_key, raw_value|
35
+ key = raw_key.to_s
36
+ value = raw_value.to_s
38
37
 
39
- raise EncodingError, "Invalid key `#{key}` for value `#{value}`" unless VALID_KEY_CHARS.match?(key)
40
- raise EncodingError, "Invalid value `#{value}` for key `#{key}`" unless VALID_VALUE_CHARS.match?(value)
38
+ raise EncodingError, "Invalid key `#{key}` for value `#{value}`" unless VALID_KEY_CHARS.match?(key)
39
+ raise EncodingError, "Invalid value `#{value}` for key `#{key}`" unless VALID_VALUE_CHARS.match?(value)
41
40
 
42
- "#{key}=#{value.strip}"
43
- end.join(',')
44
- rescue => e
45
- raise EncodingError, "Error encoding tags `#{tags}`: `#{e}`"
46
- end
41
+ "#{key}=#{value.strip}"
42
+ end.join(',')
43
+ rescue => e
44
+ raise EncodingError, "Error encoding tags `#{tags}`: `#{e}`"
47
45
  end
48
46
 
49
47
  # Deserializes a `x-datadog-tags`-formatted String into a {Hash<String,String>}.
@@ -52,7 +50,7 @@ module Datadog
52
50
  # @return [Hash<String,String>] decoded input as a hash of strings
53
51
  # @raise [DecodingError] if string does not conform to the `x-datadog-tags` format
54
52
  def self.decode(string)
55
- result = Hash[string.split(',').map do |raw_tag|
53
+ result = (string.split(',').map do |raw_tag|
56
54
  raw_tag.split('=', 2).tap do |raw_key, raw_value|
57
55
  key = raw_key.to_s
58
56
  value = raw_value.to_s
@@ -62,7 +60,7 @@ module Datadog
62
60
 
63
61
  value.strip!
64
62
  end
65
- end]
63
+ end).to_h
66
64
 
67
65
  raise DecodingError, "Invalid empty tags: #{string}" if result.empty? && !string.empty?
68
66
 
@@ -25,7 +25,7 @@ module Datadog
25
25
 
26
26
  value = value.to_s
27
27
 
28
- num = value.to_i
28
+ num = value.to_i
29
29
 
30
30
  # Ensure the parsed number is the same as the original string value
31
31
  # e.g. We want to make sure to throw away `'nan'.to_i == 0`
@@ -8,10 +8,12 @@ module Datadog
8
8
  # @see https://github.com/open-telemetry/opentelemetry-specification/blob/255a6c52b8914a2ed7e26bb5585abecab276aafc/specification/sdk-environment-variables.md?plain=1#L88
9
9
  class None
10
10
  # No-op
11
- def inject!(_digest, _data); end
11
+ def inject!(_digest, _data)
12
+ end
12
13
 
13
14
  # No-op
14
- def extract(_data); end
15
+ def extract(_data)
16
+ end
15
17
  end
16
18
  end
17
19
  end
@@ -155,7 +155,10 @@ module Datadog
155
155
  # Merge with baggage if present
156
156
  digest = @baggage_propagator.extract(data)
157
157
  if digest
158
- extracted_trace_digest.merge(baggage: digest.baggage)
158
+ extracted_trace_digest.merge(
159
+ baggage: digest.baggage,
160
+ trace_distributed_tags: digest.trace_distributed_tags
161
+ )
159
162
  else
160
163
  extracted_trace_digest
161
164
  end
@@ -31,7 +31,7 @@ module Datadog
31
31
  return false
32
32
  end
33
33
 
34
- return pin_config[:distributed_tracing] if pin_config && pin_config.key?(:distributed_tracing)
34
+ return pin_config[:distributed_tracing] if pin_config&.key?(:distributed_tracing)
35
35
  return global_config[:distributed_tracing] if global_config
36
36
 
37
37
  true