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
@@ -163,20 +163,20 @@ module Datadog
163
163
  end
164
164
 
165
165
  def name
166
- @name || (root_span && root_span.name)
166
+ @name || root_span&.name
167
167
  end
168
168
 
169
169
  def resource
170
- @resource || (root_span && root_span.resource)
170
+ @resource || root_span&.resource
171
171
  end
172
172
 
173
173
  # When retrieving tags or metrics we need to include root span tags for sampling purposes
174
174
  def get_tag(key)
175
- super || (root_span && root_span.get_tag(key))
175
+ super || root_span&.get_tag(key)
176
176
  end
177
177
 
178
178
  def get_metric(key)
179
- super || (root_span && root_span.get_metric(key))
179
+ super || root_span&.get_metric(key)
180
180
  end
181
181
 
182
182
  def set_distributed_source(product_bit)
@@ -201,7 +201,7 @@ module Datadog
201
201
  end
202
202
 
203
203
  def service
204
- @service || (root_span && root_span.service)
204
+ @service || root_span&.service
205
205
  end
206
206
 
207
207
  def measure(
@@ -220,9 +220,11 @@ module Datadog
220
220
  # Don't allow more span measurements if the
221
221
  # trace is already completed. Prevents multiple
222
222
  # root spans with parent_span_id = 0.
223
- return yield( # rubocop:disable Style/MultilineIfModifier
224
- SpanOperation.new(op_name, logger: logger),
225
- TraceOperation.new(logger: logger)) if finished? || full?
223
+ if finished? || full?
224
+ return yield(
225
+ SpanOperation.new(op_name, logger: logger),
226
+ TraceOperation.new(logger: logger))
227
+ end
226
228
 
227
229
  # Create new span
228
230
  span_op = build_span(
@@ -253,51 +255,49 @@ module Datadog
253
255
  type: nil,
254
256
  id: nil
255
257
  )
256
- begin
257
- # Resolve span options:
258
- # Parent, service name, etc.
259
- # Add default options
260
- trace_id = @id
261
- parent = @active_span
262
-
263
- # Use active span's span ID if available. Otherwise, the parent span ID.
264
- # Necessary when this trace continues from another, e.g. distributed trace.
265
- parent_id = parent ? parent.id : @parent_span_id || 0
266
-
267
- # Build events
268
- events ||= SpanOperation::Events.new(logger: logger)
269
-
270
- # Before start: activate the span, publish events.
271
- events.before_start.subscribe do |span_op|
272
- start_span(span_op)
273
- end
258
+ # Resolve span options:
259
+ # Parent, service name, etc.
260
+ # Add default options
261
+ trace_id = @id
262
+ parent = @active_span
274
263
 
275
- # After finish: deactivate the span, record, publish events.
276
- events.after_finish.subscribe do |span, span_op|
277
- finish_span(span, span_op, parent)
278
- end
264
+ # Use active span's span ID if available. Otherwise, the parent span ID.
265
+ # Necessary when this trace continues from another, e.g. distributed trace.
266
+ parent_id = parent ? parent.id : @parent_span_id || 0
267
+
268
+ # Build events
269
+ events ||= SpanOperation::Events.new(logger: logger)
279
270
 
280
- # Build a new span operation
281
- SpanOperation.new(
282
- op_name,
283
- logger: logger,
284
- events: events,
285
- on_error: on_error,
286
- parent_id: parent_id,
287
- resource: resource || op_name,
288
- service: service,
289
- start_time: start_time,
290
- tags: tags,
291
- trace_id: trace_id,
292
- type: type,
293
- id: id
294
- )
295
- rescue StandardError => e
296
- logger.debug { "Failed to build new span: #{e}" }
297
-
298
- # Return dummy span
299
- SpanOperation.new(op_name, logger: logger)
271
+ # Before start: activate the span, publish events.
272
+ events.before_start.subscribe do |span_op|
273
+ start_span(span_op)
300
274
  end
275
+
276
+ # After finish: deactivate the span, record, publish events.
277
+ events.after_finish.subscribe do |span, span_op|
278
+ finish_span(span, span_op, parent)
279
+ end
280
+
281
+ # Build a new span operation
282
+ SpanOperation.new(
283
+ op_name,
284
+ logger: logger,
285
+ events: events,
286
+ on_error: on_error,
287
+ parent_id: parent_id,
288
+ resource: resource || op_name,
289
+ service: service,
290
+ start_time: start_time,
291
+ tags: tags,
292
+ trace_id: trace_id,
293
+ type: type,
294
+ id: id
295
+ )
296
+ rescue => e
297
+ logger.debug { "Failed to build new span: #{e}" }
298
+
299
+ # Return dummy span
300
+ SpanOperation.new(op_name, logger: logger)
301
301
  end
302
302
 
303
303
  # Returns a {TraceSegment} with all finished spans that can be flushed
@@ -325,7 +325,7 @@ module Datadog
325
325
  # We should move the sample call to inject and right before moving to new contexts(threads, forking etc.)
326
326
  def to_digest
327
327
  # Resolve current span ID
328
- span_id = @active_span && @active_span.id
328
+ span_id = @active_span&.id
329
329
  span_id ||= @parent_span_id unless finished?
330
330
  # sample the trace_operation with the tracer
331
331
  events.trace_propagated.publish(self)
@@ -349,13 +349,13 @@ module Datadog
349
349
  trace_state: @trace_state,
350
350
  trace_state_unknown_fields: @trace_state_unknown_fields,
351
351
  span_remote: @remote_parent && @active_span.nil?,
352
- baggage: @baggage.nil? || @baggage.empty? ? nil : @baggage
352
+ baggage: (@baggage.nil? || @baggage.empty?) ? nil : @baggage
353
353
  ).freeze
354
354
  end
355
355
 
356
356
  def to_correlation
357
357
  # Resolve current span ID
358
- span_id = @active_span && @active_span.id
358
+ span_id = @active_span&.id
359
359
  span_id ||= @parent_span_id unless finished?
360
360
 
361
361
  Correlation::Identifier.new(
@@ -369,22 +369,22 @@ module Datadog
369
369
  def fork_clone
370
370
  self.class.new(
371
371
  agent_sample_rate: @agent_sample_rate,
372
- events: @events && @events.dup,
373
- hostname: @hostname && @hostname.dup,
372
+ events: @events&.dup,
373
+ hostname: @hostname&.dup,
374
374
  id: @id,
375
375
  max_length: @max_length,
376
- name: name && name.dup,
377
- origin: @origin && @origin.dup,
378
- parent_span_id: (@active_span && @active_span.id) || @parent_span_id,
376
+ name: name&.dup,
377
+ origin: @origin&.dup,
378
+ parent_span_id: @active_span&.id || @parent_span_id,
379
379
  rate_limiter_rate: @rate_limiter_rate,
380
- resource: resource && resource.dup,
380
+ resource: resource&.dup,
381
381
  rule_sample_rate: @rule_sample_rate,
382
382
  sample_rate: @sample_rate,
383
383
  sampled: @sampled,
384
384
  sampling_priority: @sampling_priority,
385
- service: service && service.dup,
386
- trace_state: @trace_state && @trace_state.dup,
387
- trace_state_unknown_fields: @trace_state_unknown_fields && @trace_state_unknown_fields.dup,
385
+ service: service&.dup,
386
+ trace_state: @trace_state&.dup,
387
+ trace_state_unknown_fields: @trace_state_unknown_fields&.dup,
388
388
  tags: meta.dup,
389
389
  metrics: metrics.dup,
390
390
  remote_parent: @remote_parent
@@ -472,41 +472,37 @@ module Datadog
472
472
  end
473
473
 
474
474
  def start_span(span_op)
475
- begin
476
- activate_span!(span_op)
475
+ activate_span!(span_op)
477
476
 
478
- # Update active span count
479
- @active_span_count += 1
477
+ # Update active span count
478
+ @active_span_count += 1
480
479
 
481
- # Publish :span_before_start event
482
- events.span_before_start.publish(span_op, self)
483
- rescue StandardError => e
484
- logger.debug { "Error starting span on trace: #{e} Backtrace: #{e.backtrace.first(3)}" }
485
- end
480
+ # Publish :span_before_start event
481
+ events.span_before_start.publish(span_op, self)
482
+ rescue => e
483
+ logger.debug { "Error starting span on trace: #{e} Backtrace: #{e.backtrace.first(3)}" }
486
484
  end
487
485
 
488
486
  def finish_span(span, span_op, parent)
489
- begin
490
- # Save finished span & root span
491
- @spans << span unless span.nil?
487
+ # Save finished span & root span
488
+ @spans << span unless span.nil?
492
489
 
493
- # Deactivate the span, re-activate parent.
494
- deactivate_span!(span_op)
490
+ # Deactivate the span, re-activate parent.
491
+ deactivate_span!(span_op)
495
492
 
496
- # Set finished, to signal root span has completed.
497
- @finished = true if span_op == root_span
493
+ # Set finished, to signal root span has completed.
494
+ @finished = true if span_op == root_span
498
495
 
499
- # Update active span count
500
- @active_span_count -= 1
496
+ # Update active span count
497
+ @active_span_count -= 1
501
498
 
502
- # Publish :span_finished event
503
- events.span_finished.publish(span, self)
499
+ # Publish :span_finished event
500
+ events.span_finished.publish(span, self)
504
501
 
505
- # Publish :trace_finished event
506
- events.trace_finished.publish(self) if finished?
507
- rescue StandardError => e
508
- logger.debug { "Error finishing span on trace: #{e} Backtrace: #{e.backtrace.first(3)}" }
509
- end
502
+ # Publish :trace_finished event
503
+ events.trace_finished.publish(self) if finished?
504
+ rescue => e
505
+ logger.debug { "Error finishing span on trace: #{e} Backtrace: #{e.backtrace.first(3)}" }
510
506
  end
511
507
 
512
508
  # Track the root span
@@ -535,7 +531,7 @@ module Datadog
535
531
  service: service,
536
532
  tags: meta,
537
533
  metrics: metrics,
538
- root_span_id: !partial ? root_span && root_span.id : nil,
534
+ root_span_id: (!partial) ? root_span&.id : nil,
539
535
  profiling_enabled: @profiling_enabled,
540
536
  apm_tracing_enabled: @apm_tracing_enabled
541
537
  )
@@ -68,8 +68,8 @@ module Datadog
68
68
 
69
69
  # Does not make an effort to move metrics out of tags
70
70
  # The caller is expected to have done that
71
- @meta = (tags && tags.dup) || {}
72
- @metrics = (metrics && metrics.dup) || {}
71
+ @meta = tags&.dup || {}
72
+ @metrics = metrics&.dup || {}
73
73
 
74
74
  # Set well-known tags, defaulting to getting the values from tags
75
75
  @agent_sample_rate = agent_sample_rate || agent_sample_rate_tag
@@ -149,11 +149,11 @@ module Datadog
149
149
  context = call_context
150
150
  active_trace = context.active_trace
151
151
  trace = if continue_from || active_trace.nil?
152
- start_trace(continue_from: continue_from)
153
- else
154
- active_trace
155
- end
156
- rescue StandardError => e
152
+ start_trace(continue_from: continue_from)
153
+ else
154
+ active_trace
155
+ end
156
+ rescue => e
157
157
  logger.debug { "Failed to trace: #{e}" }
158
158
 
159
159
  # Tracing failed: fallback and run code without tracing.
@@ -194,7 +194,6 @@ module Datadog
194
194
  )
195
195
  end
196
196
  end
197
- # rubocop:enable Metrics/MethodLength
198
197
 
199
198
  # Set the given key / value tag pair at the tracer level. These tags will be
200
199
  # appended to each span created by the tracer. Keys and values must be strings.
@@ -225,7 +224,7 @@ module Datadog
225
224
  # @return [nil] if no trace is active, and thus no span is active
226
225
  def active_span(key = nil)
227
226
  trace = active_trace(key)
228
- trace.active_span if trace
227
+ trace&.active_span
229
228
  end
230
229
 
231
230
  # Information about the currently active trace.
@@ -272,12 +271,10 @@ module Datadog
272
271
 
273
272
  # Sample a span, tagging the trace as appropriate.
274
273
  def sample_trace(trace_op)
275
- begin
276
- @sampler.sample!(trace_op) if trace_op.sampling_priority.nil?
277
- rescue StandardError => e
278
- SAMPLE_TRACE_LOG_ONLY_ONCE.run do
279
- logger.warn { "Failed to sample trace: #{e.class.name} #{e} at #{Array(e.backtrace).first}" }
280
- end
274
+ @sampler.sample!(trace_op) if trace_op.sampling_priority.nil?
275
+ rescue => e
276
+ SAMPLE_TRACE_LOG_ONLY_ONCE.run do
277
+ logger.warn { "Failed to sample trace: #{e.class.name} #{e} at #{Array(e.backtrace).first}" }
281
278
  end
282
279
  end
283
280
 
@@ -297,7 +294,7 @@ module Datadog
297
294
  # description of and constraints on arguments.
298
295
  # rubocop:disable Lint/UselessMethodDefinition
299
296
  def publish(trace)
300
- super(trace)
297
+ super
301
298
  end
302
299
  # rubocop:enable Lint/UselessMethodDefinition
303
300
  end
@@ -315,7 +312,7 @@ module Datadog
315
312
  def shutdown!
316
313
  return unless @enabled
317
314
 
318
- @writer.stop if @writer
315
+ @writer&.stop
319
316
  end
320
317
 
321
318
  private
@@ -335,12 +332,12 @@ module Datadog
335
332
  def build_trace(digest = nil)
336
333
  # Resolve hostname if configured
337
334
  hostname = Core::Environment::Socket.hostname if Datadog.configuration.tracing.report_hostname
338
- hostname = hostname && !hostname.empty? ? hostname : nil
335
+ hostname = (hostname && !hostname.empty?) ? hostname : nil
339
336
 
340
337
  if digest
341
338
  sampling_priority = if propagate_sampling_priority?(upstream_tags: digest.trace_distributed_tags)
342
- digest.trace_sampling_priority
343
- end
339
+ digest.trace_sampling_priority
340
+ end
344
341
  TraceOperation.new(
345
342
  logger: logger,
346
343
  hostname: hostname,
@@ -369,7 +366,9 @@ module Datadog
369
366
  )
370
367
  end
371
368
  end
369
+ # rubocop:enable Metrics/MethodLength
372
370
 
371
+ # rubocop:disable Metrics/MethodLength
373
372
  def bind_trace_events!(trace_op)
374
373
  events = trace_op.send(:events)
375
374
 
@@ -388,6 +387,7 @@ module Datadog
388
387
  flush_trace(event_trace_op)
389
388
  end
390
389
  end
390
+ # rubocop:enable Metrics/MethodLength
391
391
 
392
392
  # Creates a new TraceOperation, with events bounds to this Tracer instance.
393
393
  # @return [TraceOperation]
@@ -402,6 +402,7 @@ module Datadog
402
402
  end
403
403
 
404
404
  # rubocop:disable Lint/UnderscorePrefixedVariableName
405
+ # rubocop:disable Metrics/MethodLength
405
406
  def start_span(
406
407
  name,
407
408
  continue_from: nil,
@@ -454,16 +455,17 @@ module Datadog
454
455
  end
455
456
  end
456
457
  # rubocop:enable Lint/UnderscorePrefixedVariableName
458
+ # rubocop:enable Metrics/MethodLength
457
459
 
458
460
  def resolve_tags(tags, service)
459
461
  merged_tags = if @tags.any? && tags
460
- # Combine default tags with provided tags,
461
- # preferring provided tags.
462
- @tags.merge(tags)
463
- else
464
- # Use provided tags or default tags if none.
465
- tags || @tags.dup
466
- end
462
+ # Combine default tags with provided tags,
463
+ # preferring provided tags.
464
+ @tags.merge(tags)
465
+ else
466
+ # Use provided tags or default tags if none.
467
+ tags || @tags.dup
468
+ end
467
469
  # Remove version tag if service is not the default service
468
470
  if merged_tags.key?(Core::Environment::Ext::TAG_VERSION) && service && service != @default_service
469
471
  merged_tags.delete(Core::Environment::Ext::TAG_VERSION)
@@ -507,12 +509,10 @@ module Datadog
507
509
  private_constant :SAMPLE_TRACE_LOG_ONLY_ONCE
508
510
 
509
511
  def sample_span(trace_op, span)
510
- begin
511
- @span_sampler.sample!(trace_op, span)
512
- rescue StandardError => e
513
- SAMPLE_SPAN_LOG_ONLY_ONCE.run do
514
- logger.warn { "Failed to sample span: #{e.class.name} #{e} at #{Array(e.backtrace).first}" }
515
- end
512
+ @span_sampler.sample!(trace_op, span)
513
+ rescue => e
514
+ SAMPLE_SPAN_LOG_ONLY_ONCE.run do
515
+ logger.warn { "Failed to sample span: #{e.class.name} #{e} at #{Array(e.backtrace).first}" }
516
516
  end
517
517
  end
518
518
 
@@ -521,13 +521,11 @@ module Datadog
521
521
 
522
522
  # Flush finished spans from the trace buffer, send them to writer.
523
523
  def flush_trace(trace_op)
524
- begin
525
- trace = @trace_flush.consume!(trace_op)
526
- write(trace) if trace && !trace.empty?
527
- rescue StandardError => e
528
- FLUSH_TRACE_LOG_ONLY_ONCE.run do
529
- logger.warn { "Failed to flush trace: #{e.class.name} #{e} at #{Array(e.backtrace).first}" }
530
- end
524
+ trace = @trace_flush.consume!(trace_op)
525
+ write(trace) if trace && !trace.empty?
526
+ rescue => e
527
+ FLUSH_TRACE_LOG_ONLY_ONCE.run do
528
+ logger.warn { "Failed to flush trace: #{e.class.name} #{e} at #{Array(e.backtrace).first}" }
531
529
  end
532
530
  end
533
531
 
@@ -30,7 +30,7 @@ module Datadog
30
30
  update_stats_from_response!(response)
31
31
 
32
32
  response
33
- rescue StandardError => e
33
+ rescue => e
34
34
  message =
35
35
  "Internal error during #{self.class.name} request. Cause: #{e.class.name} #{e.message} " \
36
36
  "Location: #{Array(e.backtrace).first}"
@@ -95,10 +95,10 @@ module Datadog
95
95
  env.body = env.request.parcel.data
96
96
 
97
97
  # Query for response
98
- http_response = super(env, &block)
98
+ http_response = super
99
99
 
100
100
  # Process the response
101
- response_options = { trace_count: env.request.parcel.trace_count }.tap do |options|
101
+ response_options = {trace_count: env.request.parcel.trace_count}.tap do |options|
102
102
  # Parse service rates, if configured to do so.
103
103
  if service_rates? && !http_response.payload.to_s.empty?
104
104
  body = JSON.parse(http_response.payload)
@@ -30,17 +30,17 @@ module Datadog
30
30
  # If block is given, allow it to handle writing
31
31
  # Otherwise do a standard encode/write/response.
32
32
  response = if block_given?
33
- yield(out, request)
34
- else
35
- @request_block.call(out, request)
36
- end
33
+ yield(out, request)
34
+ else
35
+ @request_block.call(out, request)
36
+ end
37
37
 
38
38
  # Update statistics
39
39
  update_stats_from_response!(response)
40
40
 
41
41
  # Return response
42
42
  response
43
- rescue StandardError => e
43
+ rescue => e
44
44
  message =
45
45
  "Internal error during IO transport request. Cause: #{e.class.name} #{e.message} " \
46
46
  "Location: #{Array(e.backtrace).first}"
@@ -33,10 +33,10 @@ module Datadog
33
33
 
34
34
  # Write to IO
35
35
  result = if block_given?
36
- yield(out, data)
37
- else
38
- write_data(out, data)
39
- end
36
+ yield(out, data)
37
+ else
38
+ write_data(out, data)
39
+ end
40
40
 
41
41
  # Generate response
42
42
  Traces::Response.new(result)
@@ -47,7 +47,7 @@ module Datadog
47
47
  end
48
48
 
49
49
  def metrics_for_exception(_exception)
50
- { api_errors: Core::Metrics::Metric.new(:api_errors, nil, 1) }
50
+ {api_errors: Core::Metrics::Metric.new(:api_errors, nil, 1)}
51
51
  end
52
52
 
53
53
  # Stat counts
@@ -66,11 +66,11 @@ module Datadog
66
66
  # number of traces
67
67
  def encode_in_chunks(traces)
68
68
  encoded_traces = if traces.respond_to?(:filter_map)
69
- # DEV Supported since Ruby 2.7, saves an intermediate object creation
70
- traces.filter_map { |t| encode_one(t) }
71
- else
72
- traces.map { |t| encode_one(t) }.reject(&:nil?)
73
- end
69
+ # DEV Supported since Ruby 2.7, saves an intermediate object creation
70
+ traces.filter_map { |t| encode_one(t) }
71
+ else
72
+ traces.map { |t| encode_one(t) }.reject(&:nil?)
73
+ end
74
74
 
75
75
  Datadog::Core::Chunker.chunk_by_size(encoded_traces, max_size).map do |chunk|
76
76
  [encoder.join(chunk), chunk.size]
@@ -45,7 +45,7 @@ module Datadog
45
45
  def write_traces(traces)
46
46
  traces = process_traces(traces)
47
47
  flush_traces(traces)
48
- rescue StandardError => e
48
+ rescue => e
49
49
  logger.warn(
50
50
  "Error while writing traces: dropped #{traces.length} items. Cause: #{e} Location: #{Array(e.backtrace).first}"
51
51
  )
@@ -119,7 +119,7 @@ module Datadog
119
119
  # WARNING: This method breaks the Liskov Substitution Principle -- TraceWriter#perform is spec'd to return the
120
120
  # result from the writer, whereas this method always returns nil.
121
121
  def perform(traces)
122
- super(traces).tap do |responses|
122
+ super.tap do |responses|
123
123
  loop_back_off! if responses.find(&:server_error?)
124
124
  end
125
125
 
@@ -152,16 +152,16 @@ module Datadog
152
152
 
153
153
  def fork_policy=(policy)
154
154
  # Translate to Workers::Async::Thread policy
155
- thread_fork_policy = case policy
156
- when Core::Workers::Async::Thread::FORK_POLICY_STOP
157
- policy
158
- when FORK_POLICY_SYNC
159
- # Stop the async thread because the writer
160
- # will bypass and run synchronously.
161
- Core::Workers::Async::Thread::FORK_POLICY_STOP
162
- else
163
- Core::Workers::Async::Thread::FORK_POLICY_RESTART
164
- end
155
+ thread_fork_policy = case policy
156
+ when Core::Workers::Async::Thread::FORK_POLICY_STOP
157
+ policy
158
+ when FORK_POLICY_SYNC
159
+ # Stop the async thread because the writer
160
+ # will bypass and run synchronously.
161
+ Core::Workers::Async::Thread::FORK_POLICY_STOP
162
+ else
163
+ Core::Workers::Async::Thread::FORK_POLICY_RESTART
164
+ end
165
165
 
166
166
  # Update thread fork policy
167
167
  super(thread_fork_policy)
@@ -53,7 +53,7 @@ module Datadog
53
53
  traces = @trace_buffer.pop
54
54
  traces = Pipeline.process!(traces)
55
55
  @trace_task.call(traces, @transport) unless @trace_task.nil? || traces.empty?
56
- rescue StandardError => e
56
+ rescue => e
57
57
  # ensures that the thread will not die because of an exception.
58
58
  # TODO[manu]: findout the reason and reschedule the send if it's not
59
59
  # a fatal exception
@@ -107,7 +107,7 @@ module Datadog
107
107
 
108
108
  private
109
109
 
110
- alias flush_data callback_traces
110
+ alias_method :flush_data, :callback_traces
111
111
 
112
112
  def perform
113
113
  loop do
@@ -81,7 +81,7 @@ module Datadog
81
81
  # @public_api
82
82
  def keep!
83
83
  trace = active_trace
84
- trace.keep! if trace
84
+ trace&.keep!
85
85
  end
86
86
 
87
87
  # (see Datadog::Tracing::TraceSegment#reject!)
@@ -89,7 +89,7 @@ module Datadog
89
89
  # @public_api
90
90
  def reject!
91
91
  trace = active_trace
92
- trace.reject! if trace
92
+ trace&.reject!
93
93
  end
94
94
 
95
95
  # (see Datadog::Tracing::Tracer#active_correlation)
@@ -3,7 +3,7 @@
3
3
  module Datadog
4
4
  module VERSION
5
5
  MAJOR = 2
6
- MINOR = 19
6
+ MINOR = 21
7
7
  PATCH = 0
8
8
  PRE = nil
9
9
  BUILD = nil