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
@@ -52,7 +52,7 @@ module Datadog
52
52
  tags ||= {}
53
53
  tags[Tracing::Metadata::Ext::Distributed::TAG_DECISION_MAKER] = decision
54
54
  when :drop
55
- tags.delete(Tracing::Metadata::Ext::Distributed::TAG_DECISION_MAKER) if tags
55
+ tags&.delete(Tracing::Metadata::Ext::Distributed::TAG_DECISION_MAKER)
56
56
  end
57
57
  end
58
58
 
@@ -128,7 +128,7 @@ module Datadog
128
128
  # @param parent_id [Integer] 64-bit
129
129
  # @param trace_flags [Integer] 8-bit
130
130
  def build_traceparent_string(trace_id, parent_id, trace_flags)
131
- "00-#{format('%032x', trace_id)}-#{format('%016x', parent_id)}-#{format('%02x', trace_flags)}"
131
+ "00-#{format("%032x", trace_id)}-#{format("%016x", parent_id)}-#{format("%02x", trace_flags)}"
132
132
  end
133
133
 
134
134
  # Sets the trace flag to an existing `trace_flags`.
@@ -148,12 +148,14 @@ module Datadog
148
148
 
149
149
  # @see https://www.w3.org/TR/trace-context/#tracestate-header
150
150
  def build_tracestate(digest)
151
- tracestate = String.new('dd=')
151
+ tracestate = +'dd='
152
152
  tracestate << last_dd_parent_id(digest)
153
153
  tracestate << "s:#{digest.trace_sampling_priority};" if digest.trace_sampling_priority
154
154
  tracestate << "o:#{serialize_origin(digest.trace_origin)};" if digest.trace_origin
155
155
 
156
- if digest.trace_distributed_tags
156
+ # Replacing this by safe navigation seems to have a different behaviour on Rubies <= 3.0.
157
+ # It cause a LocalJumpError in the CI.
158
+ if digest.trace_distributed_tags # rubocop:disable Style/SafeNavigation
157
159
  digest.trace_distributed_tags.each do |name, value|
158
160
  tag = "t.#{serialize_tag_key(name)}:#{serialize_tag_value(value)};"
159
161
 
@@ -187,7 +189,7 @@ module Datadog
187
189
  # Ensure the list has at most 31 elements, as we need to prepend Datadog's
188
190
  # entry and the limit is 32 elements total.
189
191
  vendors = vendors[0..30]
190
- "#{tracestate},#{vendors.join(',')}"
192
+ "#{tracestate},#{vendors.join(",")}"
191
193
  else
192
194
  tracestate.to_s
193
195
  end
@@ -199,7 +201,7 @@ module Datadog
199
201
  def last_dd_parent_id(digest)
200
202
  if !digest.span_remote
201
203
  span_id = digest.span_id || 0 # Fall back to zero (invalid) if not present
202
- "p:#{format('%016x', span_id)};"
204
+ "p:#{format("%016x", span_id)};"
203
205
  elsif digest.trace_distributed_tags&.key?(Tracing::Metadata::Ext::Distributed::TAG_DD_PARENT_ID)
204
206
  "p:#{digest.trace_distributed_tags[Tracing::Metadata::Ext::Distributed::TAG_DD_PARENT_ID]};"
205
207
  else
@@ -216,10 +218,10 @@ module Datadog
216
218
  # DEV: come from Datadog-controlled sources.
217
219
  # DEV: Trying to `match?` is measurably faster than a `gsub` that does not match.
218
220
  value = if INVALID_ORIGIN_CHARS.match?(value)
219
- value.gsub(INVALID_ORIGIN_CHARS, '_')
220
- else
221
- value
222
- end
221
+ value.gsub(INVALID_ORIGIN_CHARS, '_')
222
+ else
223
+ value
224
+ end
223
225
 
224
226
  if REMAP_ORIGIN_CHARS.match?(value)
225
227
  value.gsub(REMAP_ORIGIN_CHARS, '~')
@@ -253,10 +255,10 @@ module Datadog
253
255
  # DEV: come from Datadog-controlled sources.
254
256
  # DEV: Trying to `match?` is measurably faster than a `gsub` that does not match.
255
257
  ret = if INVALID_TAG_VALUE_CHARS.match?(value)
256
- value.gsub(INVALID_TAG_VALUE_CHARS, '_')
257
- else
258
- value
259
- end
258
+ value.gsub(INVALID_TAG_VALUE_CHARS, '_')
259
+ else
260
+ value
261
+ end
260
262
 
261
263
  # DEV: Checking for an unlikely '=' is faster than a no-op `tr`.
262
264
  if ret.include?('=')
@@ -333,7 +335,11 @@ module Datadog
333
335
  key, value = pair.split(':', 2)
334
336
  case key
335
337
  when 's'
336
- sampling_priority = Integer(value) rescue nil
338
+ sampling_priority = begin
339
+ Integer(value)
340
+ rescue
341
+ nil
342
+ end
337
343
  when 'o'
338
344
  origin = value
339
345
  when 'p'
@@ -350,7 +356,7 @@ module Datadog
350
356
  tags ||= {}
351
357
  tags["#{Tracing::Metadata::Ext::Distributed::TAGS_PREFIX}#{key}"] = value
352
358
  else
353
- unknown_fields ||= String.new
359
+ unknown_fields ||= +''
354
360
  unknown_fields << pair
355
361
  unknown_fields << ';'
356
362
  end
@@ -59,13 +59,11 @@ module Datadog
59
59
 
60
60
  def publish(*args)
61
61
  subscriptions.each do |block|
62
- begin
63
- block.call(*args)
64
- rescue StandardError => e
65
- Datadog.logger.debug do
66
- "Error while handling '#{name}' event with '#{block}': #{e.class.name} #{e.message} " \
67
- "at #{Array(e.backtrace).first}"
68
- end
62
+ block.call(*args)
63
+ rescue => e
64
+ Datadog.logger.debug do
65
+ "Error while handling '#{name}' event with '#{block}': #{e.class.name} #{e.message} " \
66
+ "at #{Array(e.backtrace).first}"
69
67
  end
70
68
  end
71
69
 
@@ -59,7 +59,7 @@ module Datadog
59
59
  class Finished < Base
60
60
  # Are all spans finished?
61
61
  def flush?(trace_op)
62
- trace_op && trace_op.finished?
62
+ trace_op&.finished?
63
63
  end
64
64
  end
65
65
 
@@ -12,7 +12,7 @@ module Datadog
12
12
  case key
13
13
  when Ext::Analytics::TAG_ENABLED
14
14
  # If true, set rate to 1.0, otherwise set 0.0.
15
- value = value == true ? Ext::Analytics::DEFAULT_SAMPLE_RATE : 0.0
15
+ value = (value == true) ? Ext::Analytics::DEFAULT_SAMPLE_RATE : 0.0
16
16
  Tracing::Analytics.set_sample_rate(self, value)
17
17
  when Ext::Analytics::TAG_SAMPLE_RATE
18
18
  Tracing::Analytics.set_sample_rate(self, value)
@@ -51,7 +51,7 @@ module Datadog
51
51
  # Encode strings in UTF-8 to facilitate downstream serialization
52
52
  meta[Core::Utils.utf8_encode(key)] = Core::Utils.utf8_encode(value)
53
53
  end
54
- rescue StandardError => e
54
+ rescue => e
55
55
  Datadog.logger.debug("Unable to set the tag #{key}, ignoring it. Caused by: #{e}")
56
56
  end
57
57
 
@@ -80,10 +80,10 @@ module Datadog
80
80
  end
81
81
 
82
82
  # Convenient interface for setting a single tag.
83
- alias []= set_tag
83
+ alias_method :[]=, :set_tag
84
84
 
85
85
  # Convenient interface for getting a single tag.
86
- alias [] get_tag
86
+ alias_method :[], :get_tag
87
87
 
88
88
  # Return the metric with the given key, nil if it doesn't exist.
89
89
  def get_metric(key)
@@ -101,7 +101,7 @@ module Datadog
101
101
 
102
102
  # Encode strings in UTF-8 to facilitate downstream serialization
103
103
  metrics[Core::Utils.utf8_encode(key)] = value
104
- rescue StandardError => e
104
+ rescue => e
105
105
  Datadog.logger.debug("Unable to set the metric #{key}, ignoring it. Caused by: #{e}")
106
106
  end
107
107
 
@@ -38,7 +38,9 @@ module Datadog
38
38
  private
39
39
 
40
40
  def drop_it?(span)
41
- @operation.call(span) rescue false
41
+ @operation.call(span)
42
+ rescue
43
+ false
42
44
  end
43
45
  end
44
46
  end
@@ -28,7 +28,9 @@ module Datadog
28
28
  # @!visibility private
29
29
  def call(trace)
30
30
  trace.spans.each do |span|
31
- @operation.call(span) rescue next
31
+ @operation.call(span)
32
+ rescue
33
+ next
32
34
  end
33
35
 
34
36
  trace
@@ -47,7 +47,7 @@ module Datadog
47
47
  next nil if current_trace.nil? || current_trace.empty?
48
48
 
49
49
  process_result = processor.call(current_trace)
50
- process_result && process_result.empty? ? nil : process_result
50
+ (process_result && process_result.empty?) ? nil : process_result
51
51
  end
52
52
  rescue => e
53
53
  Datadog.logger.debug(
@@ -47,8 +47,6 @@ module Datadog
47
47
  MANUAL = '-4'
48
48
  # Formerly AppSec.
49
49
  ASM = '-5'
50
- # Single Span Sampled.
51
- SPAN_SAMPLING_RATE = '-8'
52
50
  # Dynamically configured rule, explicitly created by the user.
53
51
  REMOTE_USER_RULE = '-11'
54
52
  # Dynamically configured rule, automatically generated by Datadog.
@@ -30,26 +30,26 @@ module Datadog
30
30
  default_sampler: nil
31
31
  )
32
32
  @rules = if default_sample_rate && !default_sampler
33
- # Add to the end of the rule list a rule always matches any trace
34
- rules << SimpleRule.new(sample_rate: default_sample_rate)
35
- else
36
- rules
37
- end
33
+ # Add to the end of the rule list a rule always matches any trace
34
+ rules << SimpleRule.new(sample_rate: default_sample_rate)
35
+ else
36
+ rules
37
+ end
38
38
  @rate_limiter = if rate_limiter
39
- rate_limiter
40
- elsif rate_limit
41
- Core::TokenBucket.new(rate_limit)
42
- else
43
- Core::UnlimitedLimiter.new
44
- end
39
+ rate_limiter
40
+ elsif rate_limit
41
+ Core::TokenBucket.new(rate_limit)
42
+ else
43
+ Core::UnlimitedLimiter.new
44
+ end
45
45
  @default_sampler = if default_sampler
46
- default_sampler
47
- elsif default_sample_rate
48
- nil
49
- else
50
- # TODO: Simplify .tags access, as `Tracer#tags` can't be arbitrarily changed anymore
51
- RateByServiceSampler.new(1.0, env: -> { Tracing.send(:tracer).tags['env'] })
52
- end
46
+ default_sampler
47
+ elsif default_sample_rate
48
+ nil
49
+ else
50
+ # TODO: Simplify .tags access, as `Tracer#tags` can't be arbitrarily changed anymore
51
+ RateByServiceSampler.new(1.0, env: -> { Tracing.send(:tracer).tags['env'] })
52
+ end
53
53
  end
54
54
 
55
55
  def self.parse(rules, rate_limit, default_sample_rate)
@@ -130,17 +130,17 @@ module Datadog
130
130
  set_limiter_metrics(trace, rate_limiter.effective_rate)
131
131
 
132
132
  provenance = case rule.provenance
133
- when Rule::PROVENANCE_REMOTE_USER
134
- Ext::Decision::REMOTE_USER_RULE
135
- when Rule::PROVENANCE_REMOTE_DYNAMIC
136
- Ext::Decision::REMOTE_DYNAMIC_RULE
137
- else
138
- Ext::Decision::TRACE_SAMPLING_RULE
139
- end
133
+ when Rule::PROVENANCE_REMOTE_USER
134
+ Ext::Decision::REMOTE_USER_RULE
135
+ when Rule::PROVENANCE_REMOTE_DYNAMIC
136
+ Ext::Decision::REMOTE_DYNAMIC_RULE
137
+ else
138
+ Ext::Decision::TRACE_SAMPLING_RULE
139
+ end
140
140
 
141
141
  trace.set_tag(Tracing::Metadata::Ext::Distributed::TAG_DECISION_MAKER, provenance)
142
142
  end
143
- rescue StandardError => e
143
+ rescue => e
144
144
  Datadog.logger.error(
145
145
  "Rule sampling failed. Cause: #{e.class.name} #{e.message} Source: #{Array(e.backtrace).first}"
146
146
  )
@@ -153,10 +153,10 @@ module Datadog
153
153
  # was responsible for the sampling decision.
154
154
  def set_priority(trace, sampled)
155
155
  trace.sampling_priority = if sampled
156
- Sampling::Ext::Priority::USER_KEEP
157
- else
158
- Sampling::Ext::Priority::USER_REJECT
159
- end
156
+ Sampling::Ext::Priority::USER_KEEP
157
+ else
158
+ Sampling::Ext::Priority::USER_REJECT
159
+ end
160
160
  end
161
161
 
162
162
  def set_rule_metrics(trace, sample_rate)
@@ -28,7 +28,7 @@ module Datadog
28
28
  list = JSON.parse(rules)
29
29
  rescue => e
30
30
  Datadog.logger.warn(
31
- "Error parsing Span Sampling Rules `#{rules.inspect}`: "\
31
+ "Error parsing Span Sampling Rules `#{rules.inspect}`: " \
32
32
  "#{e.class.name} #{e.message} at #{Array(e.backtrace).first}"
33
33
  )
34
34
  return nil
@@ -58,13 +58,6 @@ module Datadog
58
58
 
59
59
  next if decision == :not_matched # Iterate until we find a matching decision
60
60
 
61
- if decision == :kept
62
- trace_op.set_tag(
63
- Metadata::Ext::Distributed::TAG_DECISION_MAKER,
64
- Sampling::Ext::Decision::SPAN_SAMPLING_RATE
65
- )
66
- end
67
-
68
61
  break # Found either a `kept` or `rejected` decision
69
62
  end
70
63
 
@@ -113,7 +113,7 @@ module Datadog
113
113
  def stopped?
114
114
  !@end_time.nil?
115
115
  end
116
- alias :finished? :stopped?
116
+ alias_method :finished?, :stopped?
117
117
 
118
118
  def duration
119
119
  return @duration if @duration
@@ -41,7 +41,7 @@ module Datadog
41
41
  # of being limiting span events to the size limit of a span tag.
42
42
  # All Datadog agents support this format.
43
43
  def to_hash
44
- h = { 'name' => @name, 'time_unix_nano' => @time_unix_nano }
44
+ h = {'name' => @name, 'time_unix_nano' => @time_unix_nano}
45
45
  h['attributes'] = @attributes unless @attributes.empty?
46
46
  h
47
47
  end
@@ -51,15 +51,15 @@ module Datadog
51
51
  # This serialization format removes the serialization limitations of the `span.set_tag('events)` approach,
52
52
  # but is only supported by newer version of the Datadog agent.
53
53
  def to_native_format
54
- h = { 'name' => @name, 'time_unix_nano' => @time_unix_nano }
54
+ h = {'name' => @name, 'time_unix_nano' => @time_unix_nano}
55
55
 
56
56
  attr = {}
57
57
  @attributes.each do |key, value|
58
58
  attr[key] = if value.is_a?(Array)
59
- { type: ARRAY_TYPE, array_value: { values: value.map { |v| serialize_native_attribute(v) } } }
60
- else
61
- serialize_native_attribute(value)
62
- end
59
+ {type: ARRAY_TYPE, array_value: {values: value.map { |v| serialize_native_attribute(v) }}}
60
+ else
61
+ serialize_native_attribute(value)
62
+ end
63
63
  end
64
64
 
65
65
  h['attributes'] = attr unless @attributes.empty?
@@ -144,13 +144,13 @@ module Datadog
144
144
  def serialize_native_attribute(value)
145
145
  case value
146
146
  when String
147
- { type: STRING_TYPE, string_value: value }
147
+ {type: STRING_TYPE, string_value: value}
148
148
  when TrueClass, FalseClass
149
- { type: BOOLEAN_TYPE, bool_value: value }
149
+ {type: BOOLEAN_TYPE, bool_value: value}
150
150
  when Integer
151
- { type: INTEGER_TYPE, int_value: value }
151
+ {type: INTEGER_TYPE, int_value: value}
152
152
  when Float
153
- { type: DOUBLE_TYPE, double_value: value }
153
+ {type: DOUBLE_TYPE, double_value: value}
154
154
  else
155
155
  # This is technically unreachable due to the validation in #initialize.
156
156
  raise ArgumentError, "Attribute must be a string, number, or boolean: #{value}."
@@ -47,15 +47,15 @@ module Datadog
47
47
  @span_id = digest.span_id
48
48
  @trace_id = digest.trace_id
49
49
  @trace_flags = if digest.trace_sampling_priority.nil?
50
- nil
51
- elsif digest.trace_sampling_priority > 0
52
- 1
53
- else
54
- 0
55
- end
56
- @trace_state = digest.trace_state && digest.trace_state.dup
50
+ nil
51
+ elsif digest.trace_sampling_priority > 0
52
+ 1
53
+ else
54
+ 0
55
+ end
56
+ @trace_state = digest.trace_state&.dup
57
57
  @dropped_attributes = 0
58
- @attributes = (attributes && attributes.dup) || {}
58
+ @attributes = attributes&.dup || {}
59
59
  end
60
60
 
61
61
  def to_hash
@@ -81,10 +81,10 @@ module Datadog
81
81
  # If traceflags set, the high bit (bit 31) should be set to 1 (uint32).
82
82
  # This helps us distinguish between when the sample decision is zero or not set
83
83
  h[:flags] = if @trace_flags.nil?
84
- 0
85
- else
86
- @trace_flags | (1 << 31)
87
- end
84
+ 0
85
+ else
86
+ @trace_flags | (1 << 31)
87
+ end
88
88
  h
89
89
  end
90
90
  end
@@ -157,7 +157,7 @@ module Datadog
157
157
  # running, to minimize impact on normal application function.
158
158
  begin
159
159
  start
160
- rescue StandardError => e
160
+ rescue => e
161
161
  logger.debug { "Failed to start span: #{e}" }
162
162
  ensure
163
163
  # We should yield to the provided block when possible, as this
@@ -387,7 +387,7 @@ module Datadog
387
387
  class Events
388
388
  include Tracing::Events
389
389
 
390
- DEFAULT_ON_ERROR = proc { |span_op, error| span_op.set_error(error) unless span_op.nil? }
390
+ DEFAULT_ON_ERROR = proc { |span_op, error| span_op&.set_error(error) }
391
391
 
392
392
  attr_reader \
393
393
  :logger,
@@ -448,23 +448,21 @@ module Datadog
448
448
  original = @handler
449
449
 
450
450
  @handler = proc do |op, error|
451
- begin
452
- yield(op, error)
453
- rescue StandardError => e
454
- logger.debug do
455
- "Custom on_error handler #{@handler} failed, using fallback behavior. \
451
+ yield(op, error)
452
+ rescue => e
453
+ logger.debug do
454
+ "Custom on_error handler #{@handler} failed, using fallback behavior. \
456
455
  Cause: #{e.class}: #{e} Location: #{Array(e.backtrace).first}"
457
- end
458
-
459
- original.call(op, error) if original
460
456
  end
457
+
458
+ original&.call(op, error)
461
459
  end
462
460
  end
463
461
 
464
462
  def publish(*args)
465
463
  begin
466
464
  @handler.call(*args)
467
- rescue StandardError => e
465
+ rescue => e
468
466
  logger.debug do
469
467
  "Error in on_error handler '#{@default}': #{e.class}: #{e} at #{Array(e.backtrace).first}"
470
468
  end
@@ -162,29 +162,27 @@ module Datadog
162
162
  # DEV: Because we want to sometimes freeze the values provided to `TraceDigest`, it's best
163
163
  # DEV: to let `#initialize` decide how to handle each field, instead of duplicating that logic here.
164
164
  TraceDigest.new(
165
- **{
166
- span_id: span_id,
167
- span_name: span_name,
168
- span_resource: span_resource,
169
- span_service: span_service,
170
- span_type: span_type,
171
- trace_distributed_tags: trace_distributed_tags,
172
- trace_hostname: trace_hostname,
173
- trace_id: trace_id,
174
- trace_name: trace_name,
175
- trace_origin: trace_origin,
176
- trace_process_id: trace_process_id,
177
- trace_resource: trace_resource,
178
- trace_runtime_id: trace_runtime_id,
179
- trace_sampling_priority: trace_sampling_priority,
180
- trace_service: trace_service,
181
- trace_distributed_id: trace_distributed_id,
182
- trace_flags: trace_flags,
183
- trace_state: trace_state,
184
- trace_state_unknown_fields: trace_state_unknown_fields,
185
- span_remote: span_remote,
186
- baggage: baggage
187
- }.merge!(field_value_pairs)
165
+ span_id: span_id,
166
+ span_name: span_name,
167
+ span_resource: span_resource,
168
+ span_service: span_service,
169
+ span_type: span_type,
170
+ trace_distributed_tags: trace_distributed_tags,
171
+ trace_hostname: trace_hostname,
172
+ trace_id: trace_id,
173
+ trace_name: trace_name,
174
+ trace_origin: trace_origin,
175
+ trace_process_id: trace_process_id,
176
+ trace_resource: trace_resource,
177
+ trace_runtime_id: trace_runtime_id,
178
+ trace_sampling_priority: trace_sampling_priority,
179
+ trace_service: trace_service,
180
+ trace_distributed_id: trace_distributed_id,
181
+ trace_flags: trace_flags,
182
+ trace_state: trace_state,
183
+ trace_state_unknown_fields: trace_state_unknown_fields,
184
+ span_remote: span_remote,
185
+ baggage: baggage, **field_value_pairs
188
186
  )
189
187
  end
190
188
  end