datadog 2.12.0 → 2.22.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 (570) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +348 -1
  3. data/README.md +0 -1
  4. data/ext/LIBDATADOG_DEVELOPMENT.md +60 -0
  5. data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +63 -56
  6. data/ext/datadog_profiling_native_extension/collectors_discrete_dynamic_sampler.c +1 -1
  7. data/ext/datadog_profiling_native_extension/collectors_stack.c +263 -76
  8. data/ext/datadog_profiling_native_extension/collectors_stack.h +20 -3
  9. data/ext/datadog_profiling_native_extension/collectors_thread_context.c +78 -26
  10. data/ext/datadog_profiling_native_extension/collectors_thread_context.h +1 -0
  11. data/ext/datadog_profiling_native_extension/datadog_ruby_common.c +1 -4
  12. data/ext/datadog_profiling_native_extension/datadog_ruby_common.h +10 -0
  13. data/ext/datadog_profiling_native_extension/encoded_profile.c +79 -0
  14. data/ext/datadog_profiling_native_extension/encoded_profile.h +8 -0
  15. data/ext/datadog_profiling_native_extension/extconf.rb +10 -0
  16. data/ext/datadog_profiling_native_extension/heap_recorder.c +247 -364
  17. data/ext/datadog_profiling_native_extension/heap_recorder.h +4 -6
  18. data/ext/datadog_profiling_native_extension/http_transport.c +60 -94
  19. data/ext/datadog_profiling_native_extension/libdatadog_helpers.c +22 -0
  20. data/ext/datadog_profiling_native_extension/libdatadog_helpers.h +8 -5
  21. data/ext/datadog_profiling_native_extension/private_vm_api_access.c +41 -21
  22. data/ext/datadog_profiling_native_extension/private_vm_api_access.h +6 -4
  23. data/ext/datadog_profiling_native_extension/profiling.c +2 -0
  24. data/ext/datadog_profiling_native_extension/ruby_helpers.c +1 -13
  25. data/ext/datadog_profiling_native_extension/ruby_helpers.h +3 -11
  26. data/ext/datadog_profiling_native_extension/stack_recorder.c +173 -76
  27. data/ext/libdatadog_api/crashtracker.c +11 -12
  28. data/ext/libdatadog_api/crashtracker.h +5 -0
  29. data/ext/libdatadog_api/datadog_ruby_common.c +1 -4
  30. data/ext/libdatadog_api/datadog_ruby_common.h +10 -0
  31. data/ext/libdatadog_api/ddsketch.c +106 -0
  32. data/ext/libdatadog_api/extconf.rb +5 -3
  33. data/ext/libdatadog_api/init.c +18 -0
  34. data/ext/libdatadog_api/library_config.c +172 -0
  35. data/ext/libdatadog_api/library_config.h +25 -0
  36. data/ext/libdatadog_api/process_discovery.c +118 -0
  37. data/ext/libdatadog_api/process_discovery.h +5 -0
  38. data/ext/libdatadog_extconf_helpers.rb +15 -5
  39. data/lib/datadog/appsec/actions_handler/serializable_backtrace.rb +89 -0
  40. data/lib/datadog/appsec/actions_handler.rb +24 -2
  41. data/lib/datadog/appsec/anonymizer.rb +16 -0
  42. data/lib/datadog/appsec/api_security/endpoint_collection/grape_route_serializer.rb +26 -0
  43. data/lib/datadog/appsec/api_security/endpoint_collection/rails_collector.rb +59 -0
  44. data/lib/datadog/appsec/api_security/endpoint_collection/rails_route_serializer.rb +29 -0
  45. data/lib/datadog/appsec/api_security/endpoint_collection/sinatra_route_serializer.rb +26 -0
  46. data/lib/datadog/appsec/api_security/endpoint_collection.rb +10 -0
  47. data/lib/datadog/appsec/api_security/lru_cache.rb +56 -0
  48. data/lib/datadog/appsec/api_security/route_extractor.rb +75 -0
  49. data/lib/datadog/appsec/api_security/sampler.rb +59 -0
  50. data/lib/datadog/appsec/api_security.rb +23 -0
  51. data/lib/datadog/appsec/assets/waf_rules/README.md +44 -5
  52. data/lib/datadog/appsec/assets/waf_rules/recommended.json +601 -74
  53. data/lib/datadog/appsec/assets/waf_rules/strict.json +48 -75
  54. data/lib/datadog/appsec/autoload.rb +2 -2
  55. data/lib/datadog/appsec/component.rb +46 -71
  56. data/lib/datadog/appsec/compressed_json.rb +40 -0
  57. data/lib/datadog/appsec/configuration/settings.rb +162 -30
  58. data/lib/datadog/appsec/context.rb +30 -7
  59. data/lib/datadog/appsec/contrib/active_record/instrumentation.rb +35 -18
  60. data/lib/datadog/appsec/contrib/active_record/integration.rb +2 -2
  61. data/lib/datadog/appsec/contrib/active_record/patcher.rb +62 -11
  62. data/lib/datadog/appsec/contrib/auto_instrument.rb +1 -1
  63. data/lib/datadog/appsec/contrib/devise/configuration.rb +7 -31
  64. data/lib/datadog/appsec/contrib/devise/data_extractor.rb +78 -0
  65. data/lib/datadog/appsec/contrib/devise/ext.rb +22 -0
  66. data/lib/datadog/appsec/contrib/devise/integration.rb +1 -2
  67. data/lib/datadog/appsec/contrib/devise/patcher.rb +34 -23
  68. data/lib/datadog/appsec/contrib/devise/patches/signin_tracking_patch.rb +103 -0
  69. data/lib/datadog/appsec/contrib/devise/patches/signup_tracking_patch.rb +70 -0
  70. data/lib/datadog/appsec/contrib/devise/{patcher/rememberable_patch.rb → patches/skip_signin_tracking_patch.rb} +2 -2
  71. data/lib/datadog/appsec/contrib/devise/tracking_middleware.rb +106 -0
  72. data/lib/datadog/appsec/contrib/excon/integration.rb +1 -1
  73. data/lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb +11 -12
  74. data/lib/datadog/appsec/contrib/faraday/integration.rb +1 -1
  75. data/lib/datadog/appsec/contrib/faraday/ssrf_detection_middleware.rb +10 -10
  76. data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +10 -9
  77. data/lib/datadog/appsec/contrib/graphql/integration.rb +1 -1
  78. data/lib/datadog/appsec/contrib/rack/ext.rb +34 -0
  79. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +53 -31
  80. data/lib/datadog/appsec/contrib/rack/integration.rb +1 -1
  81. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +52 -44
  82. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +35 -11
  83. data/lib/datadog/appsec/contrib/rails/integration.rb +1 -1
  84. data/lib/datadog/appsec/contrib/rails/patcher.rb +65 -47
  85. data/lib/datadog/appsec/contrib/rails/patches/process_action_patch.rb +27 -0
  86. data/lib/datadog/appsec/contrib/rails/patches/render_to_body_patch.rb +33 -0
  87. data/lib/datadog/appsec/contrib/rest_client/integration.rb +1 -1
  88. data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +12 -12
  89. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +45 -22
  90. data/lib/datadog/appsec/contrib/sinatra/integration.rb +1 -1
  91. data/lib/datadog/appsec/contrib/sinatra/patcher.rb +8 -18
  92. data/lib/datadog/appsec/contrib/sinatra/patches/json_patch.rb +31 -0
  93. data/lib/datadog/appsec/event.rb +91 -147
  94. data/lib/datadog/appsec/ext.rb +4 -2
  95. data/lib/datadog/appsec/instrumentation/gateway/argument.rb +23 -2
  96. data/lib/datadog/appsec/instrumentation/gateway/middleware.rb +24 -0
  97. data/lib/datadog/appsec/instrumentation/gateway.rb +17 -22
  98. data/lib/datadog/appsec/metrics/collector.rb +23 -3
  99. data/lib/datadog/appsec/metrics/telemetry.rb +2 -2
  100. data/lib/datadog/appsec/metrics/telemetry_exporter.rb +29 -0
  101. data/lib/datadog/appsec/metrics.rb +1 -0
  102. data/lib/datadog/appsec/monitor/gateway/watcher.rb +49 -14
  103. data/lib/datadog/appsec/processor/rule_loader.rb +30 -33
  104. data/lib/datadog/appsec/remote.rb +43 -59
  105. data/lib/datadog/appsec/response.rb +6 -6
  106. data/lib/datadog/appsec/security_engine/engine.rb +176 -0
  107. data/lib/datadog/appsec/security_engine/result.rb +44 -9
  108. data/lib/datadog/appsec/security_engine/runner.rb +44 -21
  109. data/lib/datadog/appsec/security_event.rb +37 -0
  110. data/lib/datadog/appsec/thread_safe_ref.rb +61 -0
  111. data/lib/datadog/appsec/trace_keeper.rb +24 -0
  112. data/lib/datadog/appsec/utils/hash_coercion.rb +23 -0
  113. data/lib/datadog/appsec/utils.rb +0 -2
  114. data/lib/datadog/appsec.rb +5 -15
  115. data/lib/datadog/auto_instrument_base.rb +2 -1
  116. data/lib/datadog/core/buffer/random.rb +18 -2
  117. data/lib/datadog/core/configuration/agent_settings.rb +52 -0
  118. data/lib/datadog/core/configuration/agent_settings_resolver.rb +8 -50
  119. data/lib/datadog/core/configuration/agentless_settings_resolver.rb +176 -0
  120. data/lib/datadog/core/configuration/components.rb +69 -37
  121. data/lib/datadog/core/configuration/components_state.rb +23 -0
  122. data/lib/datadog/core/configuration/config_helper.rb +100 -0
  123. data/lib/datadog/core/configuration/deprecations.rb +36 -0
  124. data/lib/datadog/core/configuration/ext.rb +4 -1
  125. data/lib/datadog/core/configuration/option.rb +117 -77
  126. data/lib/datadog/core/configuration/option_definition.rb +5 -14
  127. data/lib/datadog/core/configuration/options.rb +15 -13
  128. data/lib/datadog/core/configuration/settings.rb +117 -48
  129. data/lib/datadog/core/configuration/stable_config.rb +32 -0
  130. data/lib/datadog/core/configuration/supported_configurations.rb +337 -0
  131. data/lib/datadog/core/configuration.rb +40 -16
  132. data/lib/datadog/core/crashtracking/component.rb +3 -10
  133. data/lib/datadog/core/crashtracking/tag_builder.rb +4 -22
  134. data/lib/datadog/core/ddsketch.rb +21 -0
  135. data/lib/datadog/core/deprecations.rb +2 -2
  136. data/lib/datadog/core/diagnostics/environment_logger.rb +1 -1
  137. data/lib/datadog/core/encoding.rb +1 -1
  138. data/lib/datadog/core/environment/agent_info.rb +4 -3
  139. data/lib/datadog/core/environment/cgroup.rb +10 -12
  140. data/lib/datadog/core/environment/container.rb +38 -40
  141. data/lib/datadog/core/environment/ext.rb +6 -8
  142. data/lib/datadog/core/environment/git.rb +3 -2
  143. data/lib/datadog/core/environment/identity.rb +3 -3
  144. data/lib/datadog/core/environment/platform.rb +3 -3
  145. data/lib/datadog/core/environment/variable_helpers.rb +4 -4
  146. data/lib/datadog/core/environment/yjit.rb +2 -1
  147. data/lib/datadog/core/error.rb +11 -9
  148. data/lib/datadog/core/logger.rb +2 -2
  149. data/lib/datadog/core/metrics/client.rb +29 -29
  150. data/lib/datadog/core/metrics/logging.rb +5 -5
  151. data/lib/datadog/core/pin.rb +4 -8
  152. data/lib/datadog/core/process_discovery/tracer_memfd.rb +13 -0
  153. data/lib/datadog/core/process_discovery.rb +61 -0
  154. data/lib/datadog/core/rate_limiter.rb +4 -2
  155. data/lib/datadog/core/remote/client.rb +44 -35
  156. data/lib/datadog/core/remote/component.rb +12 -17
  157. data/lib/datadog/core/remote/configuration/digest.rb +7 -7
  158. data/lib/datadog/core/remote/configuration/path.rb +1 -1
  159. data/lib/datadog/core/remote/configuration/repository.rb +14 -1
  160. data/lib/datadog/core/remote/negotiation.rb +9 -9
  161. data/lib/datadog/core/remote/transport/config.rb +4 -3
  162. data/lib/datadog/core/remote/transport/http/client.rb +5 -4
  163. data/lib/datadog/core/remote/transport/http/config.rb +27 -37
  164. data/lib/datadog/core/remote/transport/http/negotiation.rb +7 -33
  165. data/lib/datadog/core/remote/transport/http.rb +25 -89
  166. data/lib/datadog/core/remote/transport/negotiation.rb +4 -3
  167. data/lib/datadog/core/runtime/ext.rb +0 -1
  168. data/lib/datadog/core/runtime/metrics.rb +12 -5
  169. data/lib/datadog/core/tag_builder.rb +56 -0
  170. data/lib/datadog/core/telemetry/component.rb +92 -52
  171. data/lib/datadog/core/telemetry/emitter.rb +23 -11
  172. data/lib/datadog/core/telemetry/event/app_client_configuration_change.rb +66 -0
  173. data/lib/datadog/core/telemetry/event/app_closing.rb +18 -0
  174. data/lib/datadog/core/telemetry/event/app_dependencies_loaded.rb +33 -0
  175. data/lib/datadog/core/telemetry/event/app_endpoints_loaded.rb +30 -0
  176. data/lib/datadog/core/telemetry/event/app_heartbeat.rb +18 -0
  177. data/lib/datadog/core/telemetry/event/app_integrations_change.rb +58 -0
  178. data/lib/datadog/core/telemetry/event/app_started.rb +287 -0
  179. data/lib/datadog/core/telemetry/event/base.rb +40 -0
  180. data/lib/datadog/core/telemetry/event/distributions.rb +18 -0
  181. data/lib/datadog/core/telemetry/event/generate_metrics.rb +43 -0
  182. data/lib/datadog/core/telemetry/event/log.rb +76 -0
  183. data/lib/datadog/core/telemetry/event/message_batch.rb +42 -0
  184. data/lib/datadog/core/telemetry/event/synth_app_client_configuration_change.rb +43 -0
  185. data/lib/datadog/core/telemetry/event.rb +18 -472
  186. data/lib/datadog/core/telemetry/http/adapters/net.rb +12 -97
  187. data/lib/datadog/core/telemetry/logger.rb +5 -4
  188. data/lib/datadog/core/telemetry/logging.rb +11 -5
  189. data/lib/datadog/core/telemetry/metric.rb +8 -8
  190. data/lib/datadog/core/telemetry/request.rb +4 -4
  191. data/lib/datadog/core/telemetry/transport/http/api.rb +43 -0
  192. data/lib/datadog/core/telemetry/transport/http/client.rb +49 -0
  193. data/lib/datadog/core/telemetry/transport/http/telemetry.rb +92 -0
  194. data/lib/datadog/core/telemetry/transport/http.rb +63 -0
  195. data/lib/datadog/core/telemetry/transport/telemetry.rb +51 -0
  196. data/lib/datadog/core/telemetry/worker.rb +90 -24
  197. data/lib/datadog/core/transport/http/adapters/net.rb +17 -2
  198. data/lib/datadog/core/transport/http/adapters/test.rb +2 -1
  199. data/lib/datadog/core/transport/http/api/instance.rb +17 -0
  200. data/lib/datadog/core/transport/http/api/spec.rb +17 -0
  201. data/lib/datadog/core/transport/http/builder.rb +19 -17
  202. data/lib/datadog/core/transport/http/env.rb +8 -0
  203. data/lib/datadog/core/transport/http.rb +75 -0
  204. data/lib/datadog/core/transport/response.rb +4 -1
  205. data/lib/datadog/core/utils/at_fork_monkey_patch.rb +6 -6
  206. data/lib/datadog/core/utils/duration.rb +32 -32
  207. data/lib/datadog/core/utils/forking.rb +2 -2
  208. data/lib/datadog/core/utils/network.rb +25 -6
  209. data/lib/datadog/core/utils/only_once_successful.rb +16 -5
  210. data/lib/datadog/core/utils/time.rb +20 -0
  211. data/lib/datadog/core/utils/truncation.rb +21 -0
  212. data/lib/datadog/core/utils.rb +7 -0
  213. data/lib/datadog/core/vendor/multipart-post/multipart/post/composite_read_io.rb +1 -1
  214. data/lib/datadog/core/vendor/multipart-post/multipart/post/multipartable.rb +8 -8
  215. data/lib/datadog/core/vendor/multipart-post/multipart/post/parts.rb +7 -7
  216. data/lib/datadog/core/worker.rb +1 -1
  217. data/lib/datadog/core/workers/async.rb +29 -12
  218. data/lib/datadog/core/workers/interval_loop.rb +12 -1
  219. data/lib/datadog/core/workers/runtime_metrics.rb +2 -2
  220. data/lib/datadog/core.rb +10 -0
  221. data/lib/datadog/di/boot.rb +43 -0
  222. data/lib/datadog/di/component.rb +21 -2
  223. data/lib/datadog/di/context.rb +70 -0
  224. data/lib/datadog/di/el/compiler.rb +164 -0
  225. data/lib/datadog/di/el/evaluator.rb +159 -0
  226. data/lib/datadog/di/el/expression.rb +42 -0
  227. data/lib/datadog/di/el.rb +5 -0
  228. data/lib/datadog/di/error.rb +25 -0
  229. data/lib/datadog/di/instrumenter.rb +132 -20
  230. data/lib/datadog/di/probe.rb +35 -15
  231. data/lib/datadog/di/probe_builder.rb +39 -1
  232. data/lib/datadog/di/probe_file_loader/railtie.rb +15 -0
  233. data/lib/datadog/di/probe_file_loader.rb +82 -0
  234. data/lib/datadog/di/probe_manager.rb +3 -2
  235. data/lib/datadog/di/probe_notification_builder.rb +61 -67
  236. data/lib/datadog/di/probe_notifier_worker.rb +25 -17
  237. data/lib/datadog/di/remote.rb +5 -5
  238. data/lib/datadog/di/serializer.rb +160 -8
  239. data/lib/datadog/di/transport/diagnostics.rb +4 -3
  240. data/lib/datadog/di/transport/http/api.rb +2 -12
  241. data/lib/datadog/di/transport/http/client.rb +4 -3
  242. data/lib/datadog/di/transport/http/diagnostics.rb +7 -34
  243. data/lib/datadog/di/transport/http/input.rb +18 -35
  244. data/lib/datadog/di/transport/http.rb +15 -77
  245. data/lib/datadog/di/transport/input.rb +14 -5
  246. data/lib/datadog/di/utils.rb +5 -0
  247. data/lib/datadog/di.rb +0 -34
  248. data/lib/datadog/error_tracking/collector.rb +87 -0
  249. data/lib/datadog/error_tracking/component.rb +167 -0
  250. data/lib/datadog/error_tracking/configuration/settings.rb +63 -0
  251. data/lib/datadog/error_tracking/configuration.rb +11 -0
  252. data/lib/datadog/error_tracking/ext.rb +18 -0
  253. data/lib/datadog/error_tracking/extensions.rb +16 -0
  254. data/lib/datadog/error_tracking/filters.rb +77 -0
  255. data/lib/datadog/error_tracking.rb +18 -0
  256. data/lib/datadog/kit/appsec/events/v2.rb +196 -0
  257. data/lib/datadog/kit/appsec/events.rb +17 -4
  258. data/lib/datadog/kit/identity.rb +22 -12
  259. data/lib/datadog/opentelemetry/api/baggage.rb +90 -0
  260. data/lib/datadog/opentelemetry/api/baggage.rbs +26 -0
  261. data/lib/datadog/opentelemetry/api/context.rb +21 -6
  262. data/lib/datadog/opentelemetry/sdk/configurator.rb +1 -1
  263. data/lib/datadog/opentelemetry/sdk/propagator.rb +4 -4
  264. data/lib/datadog/opentelemetry/sdk/span_processor.rb +8 -8
  265. data/lib/datadog/opentelemetry/sdk/trace/span.rb +15 -11
  266. data/lib/datadog/opentelemetry/trace.rb +4 -4
  267. data/lib/datadog/opentelemetry.rb +2 -1
  268. data/lib/datadog/profiling/collectors/code_provenance.rb +18 -9
  269. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +6 -0
  270. data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +1 -0
  271. data/lib/datadog/profiling/collectors/info.rb +44 -0
  272. data/lib/datadog/profiling/collectors/thread_context.rb +17 -2
  273. data/lib/datadog/profiling/component.rb +8 -9
  274. data/lib/datadog/profiling/encoded_profile.rb +11 -0
  275. data/lib/datadog/profiling/exporter.rb +12 -7
  276. data/lib/datadog/profiling/ext.rb +2 -15
  277. data/lib/datadog/profiling/flush.rb +5 -8
  278. data/lib/datadog/profiling/http_transport.rb +8 -62
  279. data/lib/datadog/profiling/profiler.rb +2 -0
  280. data/lib/datadog/profiling/scheduler.rb +10 -2
  281. data/lib/datadog/profiling/sequence_tracker.rb +44 -0
  282. data/lib/datadog/profiling/stack_recorder.rb +9 -9
  283. data/lib/datadog/profiling/tag_builder.rb +7 -41
  284. data/lib/datadog/profiling/tasks/exec.rb +2 -2
  285. data/lib/datadog/profiling/tasks/setup.rb +2 -0
  286. data/lib/datadog/profiling.rb +13 -10
  287. data/lib/datadog/single_step_instrument.rb +9 -0
  288. data/lib/datadog/tracing/analytics.rb +1 -1
  289. data/lib/datadog/tracing/buffer.rb +7 -7
  290. data/lib/datadog/tracing/component.rb +21 -29
  291. data/lib/datadog/tracing/configuration/dynamic.rb +6 -8
  292. data/lib/datadog/tracing/configuration/ext.rb +8 -4
  293. data/lib/datadog/tracing/configuration/settings.rb +50 -12
  294. data/lib/datadog/tracing/context.rb +2 -2
  295. data/lib/datadog/tracing/context_provider.rb +1 -1
  296. data/lib/datadog/tracing/contrib/action_cable/event.rb +1 -1
  297. data/lib/datadog/tracing/contrib/action_cable/integration.rb +1 -1
  298. data/lib/datadog/tracing/contrib/action_mailer/integration.rb +1 -1
  299. data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +19 -4
  300. data/lib/datadog/tracing/contrib/action_pack/action_dispatch/instrumentation.rb +19 -12
  301. data/lib/datadog/tracing/contrib/action_pack/ext.rb +2 -0
  302. data/lib/datadog/tracing/contrib/action_pack/integration.rb +1 -1
  303. data/lib/datadog/tracing/contrib/action_view/events/render_template.rb +1 -1
  304. data/lib/datadog/tracing/contrib/active_job/event.rb +8 -8
  305. data/lib/datadog/tracing/contrib/active_job/events/discard.rb +1 -1
  306. data/lib/datadog/tracing/contrib/active_job/events/enqueue.rb +1 -1
  307. data/lib/datadog/tracing/contrib/active_job/events/enqueue_at.rb +1 -1
  308. data/lib/datadog/tracing/contrib/active_job/events/enqueue_retry.rb +1 -1
  309. data/lib/datadog/tracing/contrib/active_job/events/perform.rb +1 -1
  310. data/lib/datadog/tracing/contrib/active_job/events/retry_stopped.rb +1 -1
  311. data/lib/datadog/tracing/contrib/active_job/integration.rb +1 -1
  312. data/lib/datadog/tracing/contrib/active_model_serializers/events/render.rb +1 -1
  313. data/lib/datadog/tracing/contrib/active_model_serializers/events/serialize.rb +3 -3
  314. data/lib/datadog/tracing/contrib/active_model_serializers/integration.rb +1 -2
  315. data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +1 -1
  316. data/lib/datadog/tracing/contrib/active_record/events/instantiation.rb +1 -1
  317. data/lib/datadog/tracing/contrib/active_record/events/sql.rb +5 -5
  318. data/lib/datadog/tracing/contrib/active_record/integration.rb +2 -2
  319. data/lib/datadog/tracing/contrib/active_record/utils.rb +15 -15
  320. data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +17 -8
  321. data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +33 -0
  322. data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +4 -0
  323. data/lib/datadog/tracing/contrib/active_support/cache/redis.rb +2 -4
  324. data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +13 -0
  325. data/lib/datadog/tracing/contrib/active_support/integration.rb +1 -1
  326. data/lib/datadog/tracing/contrib/active_support/notifications/event.rb +2 -1
  327. data/lib/datadog/tracing/contrib/active_support/notifications/subscription.rb +7 -9
  328. data/lib/datadog/tracing/contrib/aws/ext.rb +1 -1
  329. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +12 -2
  330. data/lib/datadog/tracing/contrib/aws/parsed_context.rb +8 -2
  331. data/lib/datadog/tracing/contrib/aws/patcher.rb +5 -1
  332. data/lib/datadog/tracing/contrib/aws/service/base.rb +2 -1
  333. data/lib/datadog/tracing/contrib/aws/service/dynamodb.rb +1 -1
  334. data/lib/datadog/tracing/contrib/aws/service/eventbridge.rb +1 -1
  335. data/lib/datadog/tracing/contrib/aws/service/kinesis.rb +1 -1
  336. data/lib/datadog/tracing/contrib/aws/service/s3.rb +1 -1
  337. data/lib/datadog/tracing/contrib/aws/service/sns.rb +1 -1
  338. data/lib/datadog/tracing/contrib/aws/service/sqs.rb +1 -1
  339. data/lib/datadog/tracing/contrib/aws/service/states.rb +1 -1
  340. data/lib/datadog/tracing/contrib/aws/services.rb +7 -7
  341. data/lib/datadog/tracing/contrib/component.rb +2 -2
  342. data/lib/datadog/tracing/contrib/concurrent_ruby/async_patch.rb +1 -1
  343. data/lib/datadog/tracing/contrib/concurrent_ruby/context_composite_executor_service.rb +1 -1
  344. data/lib/datadog/tracing/contrib/concurrent_ruby/future_patch.rb +1 -1
  345. data/lib/datadog/tracing/contrib/concurrent_ruby/integration.rb +1 -1
  346. data/lib/datadog/tracing/contrib/concurrent_ruby/promises_future_patch.rb +1 -1
  347. data/lib/datadog/tracing/contrib/configurable.rb +6 -6
  348. data/lib/datadog/tracing/contrib/configuration/resolvers/pattern_resolver.rb +4 -4
  349. data/lib/datadog/tracing/contrib/configuration/settings.rb +1 -1
  350. data/lib/datadog/tracing/contrib/dalli/ext.rb +3 -2
  351. data/lib/datadog/tracing/contrib/dalli/integration.rb +1 -1
  352. data/lib/datadog/tracing/contrib/delayed_job/integration.rb +1 -1
  353. data/lib/datadog/tracing/contrib/elasticsearch/ext.rb +3 -2
  354. data/lib/datadog/tracing/contrib/elasticsearch/integration.rb +4 -4
  355. data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +51 -53
  356. data/lib/datadog/tracing/contrib/elasticsearch/quantize.rb +5 -5
  357. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +6 -7
  358. data/lib/datadog/tracing/contrib/ethon/ext.rb +3 -2
  359. data/lib/datadog/tracing/contrib/ethon/integration.rb +1 -1
  360. data/lib/datadog/tracing/contrib/excon/ext.rb +3 -2
  361. data/lib/datadog/tracing/contrib/excon/integration.rb +1 -1
  362. data/lib/datadog/tracing/contrib/excon/middleware.rb +7 -5
  363. data/lib/datadog/tracing/contrib/ext.rb +4 -3
  364. data/lib/datadog/tracing/contrib/extensions.rb +9 -9
  365. data/lib/datadog/tracing/contrib/faraday/ext.rb +3 -2
  366. data/lib/datadog/tracing/contrib/faraday/integration.rb +1 -1
  367. data/lib/datadog/tracing/contrib/faraday/middleware.rb +9 -5
  368. data/lib/datadog/tracing/contrib/grape/endpoint.rb +8 -8
  369. data/lib/datadog/tracing/contrib/grape/integration.rb +1 -1
  370. data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +7 -0
  371. data/lib/datadog/tracing/contrib/graphql/ext.rb +1 -0
  372. data/lib/datadog/tracing/contrib/graphql/integration.rb +1 -1
  373. data/lib/datadog/tracing/contrib/graphql/patcher.rb +2 -2
  374. data/lib/datadog/tracing/contrib/graphql/unified_trace.rb +84 -48
  375. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +15 -9
  376. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +3 -3
  377. data/lib/datadog/tracing/contrib/grpc/distributed/fetcher.rb +1 -1
  378. data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +3 -0
  379. data/lib/datadog/tracing/contrib/grpc/integration.rb +1 -1
  380. data/lib/datadog/tracing/contrib/hanami/ext.rb +2 -2
  381. data/lib/datadog/tracing/contrib/hanami/integration.rb +1 -1
  382. data/lib/datadog/tracing/contrib/hanami/renderer_policy_tracing.rb +1 -1
  383. data/lib/datadog/tracing/contrib/hanami/router_tracing.rb +9 -11
  384. data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +0 -15
  385. data/lib/datadog/tracing/contrib/http/distributed/fetcher.rb +4 -4
  386. data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +4 -1
  387. data/lib/datadog/tracing/contrib/http/ext.rb +3 -2
  388. data/lib/datadog/tracing/contrib/http/instrumentation.rb +11 -15
  389. data/lib/datadog/tracing/contrib/httpclient/ext.rb +3 -2
  390. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +9 -19
  391. data/lib/datadog/tracing/contrib/httpclient/integration.rb +1 -1
  392. data/lib/datadog/tracing/contrib/httprb/ext.rb +3 -2
  393. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +11 -19
  394. data/lib/datadog/tracing/contrib/httprb/integration.rb +1 -1
  395. data/lib/datadog/tracing/contrib/kafka/event.rb +1 -1
  396. data/lib/datadog/tracing/contrib/kafka/events/connection/request.rb +1 -1
  397. data/lib/datadog/tracing/contrib/kafka/events/consumer/process_batch.rb +1 -1
  398. data/lib/datadog/tracing/contrib/kafka/events/consumer/process_message.rb +1 -1
  399. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/heartbeat.rb +1 -1
  400. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/join_group.rb +1 -1
  401. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/leave_group.rb +1 -1
  402. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/sync_group.rb +1 -1
  403. data/lib/datadog/tracing/contrib/kafka/events/produce_operation/send_messages.rb +1 -1
  404. data/lib/datadog/tracing/contrib/kafka/events/producer/deliver_messages.rb +1 -1
  405. data/lib/datadog/tracing/contrib/kafka/integration.rb +1 -1
  406. data/lib/datadog/tracing/contrib/karafka/configuration/settings.rb +27 -0
  407. data/lib/datadog/tracing/contrib/karafka/distributed/propagation.rb +48 -0
  408. data/lib/datadog/tracing/contrib/karafka/ext.rb +27 -0
  409. data/lib/datadog/tracing/contrib/karafka/integration.rb +45 -0
  410. data/lib/datadog/tracing/contrib/karafka/monitor.rb +66 -0
  411. data/lib/datadog/tracing/contrib/karafka/patcher.rb +71 -0
  412. data/lib/datadog/tracing/contrib/karafka.rb +37 -0
  413. data/lib/datadog/tracing/contrib/lograge/instrumentation.rb +1 -1
  414. data/lib/datadog/tracing/contrib/lograge/integration.rb +1 -1
  415. data/lib/datadog/tracing/contrib/lograge/patcher.rb +4 -2
  416. data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +9 -1
  417. data/lib/datadog/tracing/contrib/mongodb/ext.rb +2 -1
  418. data/lib/datadog/tracing/contrib/mongodb/integration.rb +1 -1
  419. data/lib/datadog/tracing/contrib/mongodb/parsers.rb +1 -1
  420. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +23 -6
  421. data/lib/datadog/tracing/contrib/mysql2/ext.rb +1 -1
  422. data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +16 -6
  423. data/lib/datadog/tracing/contrib/mysql2/integration.rb +1 -1
  424. data/lib/datadog/tracing/contrib/opensearch/configuration/settings.rb +17 -0
  425. data/lib/datadog/tracing/contrib/opensearch/ext.rb +12 -2
  426. data/lib/datadog/tracing/contrib/opensearch/integration.rb +1 -2
  427. data/lib/datadog/tracing/contrib/opensearch/patcher.rb +68 -66
  428. data/lib/datadog/tracing/contrib/opensearch/quantize.rb +5 -5
  429. data/lib/datadog/tracing/contrib/patcher.rb +12 -11
  430. data/lib/datadog/tracing/contrib/pg/integration.rb +1 -1
  431. data/lib/datadog/tracing/contrib/presto/ext.rb +1 -1
  432. data/lib/datadog/tracing/contrib/presto/instrumentation.rb +3 -3
  433. data/lib/datadog/tracing/contrib/presto/integration.rb +1 -1
  434. data/lib/datadog/tracing/contrib/propagation/sql_comment/comment.rb +1 -1
  435. data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +1 -1
  436. data/lib/datadog/tracing/contrib/que/integration.rb +1 -1
  437. data/lib/datadog/tracing/contrib/racecar/event.rb +1 -1
  438. data/lib/datadog/tracing/contrib/racecar/events/batch.rb +2 -2
  439. data/lib/datadog/tracing/contrib/racecar/events/consume.rb +1 -1
  440. data/lib/datadog/tracing/contrib/racecar/events/message.rb +2 -2
  441. data/lib/datadog/tracing/contrib/racecar/integration.rb +1 -1
  442. data/lib/datadog/tracing/contrib/rack/header_collection.rb +1 -1
  443. data/lib/datadog/tracing/contrib/rack/header_tagging.rb +32 -32
  444. data/lib/datadog/tracing/contrib/rack/integration.rb +1 -1
  445. data/lib/datadog/tracing/contrib/rack/middlewares.rb +21 -17
  446. data/lib/datadog/tracing/contrib/rack/patcher.rb +1 -1
  447. data/lib/datadog/tracing/contrib/rack/request_queue.rb +4 -3
  448. data/lib/datadog/tracing/contrib/rack/trace_proxy_middleware.rb +7 -1
  449. data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +1 -1
  450. data/lib/datadog/tracing/contrib/rails/ext.rb +2 -1
  451. data/lib/datadog/tracing/contrib/rails/integration.rb +2 -2
  452. data/lib/datadog/tracing/contrib/rails/log_injection.rb +1 -1
  453. data/lib/datadog/tracing/contrib/rails/middlewares.rb +1 -1
  454. data/lib/datadog/tracing/contrib/rails/patcher.rb +4 -1
  455. data/lib/datadog/tracing/contrib/rails/runner.rb +62 -40
  456. data/lib/datadog/tracing/contrib/rake/instrumentation.rb +4 -4
  457. data/lib/datadog/tracing/contrib/rake/integration.rb +1 -1
  458. data/lib/datadog/tracing/contrib/redis/configuration/resolver.rb +2 -2
  459. data/lib/datadog/tracing/contrib/redis/ext.rb +3 -2
  460. data/lib/datadog/tracing/contrib/redis/integration.rb +2 -2
  461. data/lib/datadog/tracing/contrib/redis/patcher.rb +4 -4
  462. data/lib/datadog/tracing/contrib/redis/quantize.rb +1 -1
  463. data/lib/datadog/tracing/contrib/redis/tags.rb +1 -1
  464. data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +4 -4
  465. data/lib/datadog/tracing/contrib/registry.rb +1 -1
  466. data/lib/datadog/tracing/contrib/resque/integration.rb +1 -1
  467. data/lib/datadog/tracing/contrib/resque/resque_job.rb +1 -1
  468. data/lib/datadog/tracing/contrib/rest_client/ext.rb +3 -2
  469. data/lib/datadog/tracing/contrib/rest_client/integration.rb +1 -1
  470. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +8 -6
  471. data/lib/datadog/tracing/contrib/roda/instrumentation.rb +1 -1
  472. data/lib/datadog/tracing/contrib/roda/integration.rb +1 -1
  473. data/lib/datadog/tracing/contrib/semantic_logger/instrumentation.rb +1 -1
  474. data/lib/datadog/tracing/contrib/semantic_logger/integration.rb +1 -1
  475. data/lib/datadog/tracing/contrib/sequel/database.rb +5 -5
  476. data/lib/datadog/tracing/contrib/sequel/dataset.rb +1 -1
  477. data/lib/datadog/tracing/contrib/sequel/integration.rb +1 -1
  478. data/lib/datadog/tracing/contrib/sequel/utils.rb +1 -1
  479. data/lib/datadog/tracing/contrib/shoryuken/integration.rb +1 -1
  480. data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +6 -1
  481. data/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb +3 -0
  482. data/lib/datadog/tracing/contrib/sidekiq/ext.rb +1 -0
  483. data/lib/datadog/tracing/contrib/sidekiq/integration.rb +1 -1
  484. data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +5 -2
  485. data/lib/datadog/tracing/contrib/sidekiq/utils.rb +1 -1
  486. data/lib/datadog/tracing/contrib/sinatra/integration.rb +1 -1
  487. data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +38 -40
  488. data/lib/datadog/tracing/contrib/sneakers/integration.rb +1 -1
  489. data/lib/datadog/tracing/contrib/span_attribute_schema.rb +1 -1
  490. data/lib/datadog/tracing/contrib/stripe/integration.rb +1 -1
  491. data/lib/datadog/tracing/contrib/stripe/request.rb +1 -1
  492. data/lib/datadog/tracing/contrib/sucker_punch/integration.rb +1 -1
  493. data/lib/datadog/tracing/contrib/support.rb +28 -0
  494. data/lib/datadog/tracing/contrib/trilogy/ext.rb +1 -1
  495. data/lib/datadog/tracing/contrib/trilogy/integration.rb +1 -1
  496. data/lib/datadog/tracing/contrib/utils/quantization/hash.rb +11 -11
  497. data/lib/datadog/tracing/contrib/utils/quantization/http.rb +6 -6
  498. data/lib/datadog/tracing/contrib.rb +1 -0
  499. data/lib/datadog/tracing/correlation.rb +9 -2
  500. data/lib/datadog/tracing/diagnostics/environment_logger.rb +8 -2
  501. data/lib/datadog/tracing/distributed/b3_multi.rb +1 -1
  502. data/lib/datadog/tracing/distributed/b3_single.rb +2 -2
  503. data/lib/datadog/tracing/distributed/baggage.rb +196 -0
  504. data/lib/datadog/tracing/distributed/datadog.rb +8 -7
  505. data/lib/datadog/tracing/distributed/datadog_tags_codec.rb +11 -13
  506. data/lib/datadog/tracing/distributed/helpers.rb +1 -1
  507. data/lib/datadog/tracing/distributed/none.rb +4 -2
  508. data/lib/datadog/tracing/distributed/propagation.rb +28 -4
  509. data/lib/datadog/tracing/distributed/propagation_policy.rb +42 -0
  510. data/lib/datadog/tracing/distributed/trace_context.rb +22 -16
  511. data/lib/datadog/tracing/event.rb +5 -7
  512. data/lib/datadog/tracing/flush.rb +1 -1
  513. data/lib/datadog/tracing/metadata/analytics.rb +1 -1
  514. data/lib/datadog/tracing/metadata/errors.rb +4 -4
  515. data/lib/datadog/tracing/metadata/ext.rb +13 -0
  516. data/lib/datadog/tracing/metadata/metastruct.rb +36 -0
  517. data/lib/datadog/tracing/metadata/metastruct_tagging.rb +42 -0
  518. data/lib/datadog/tracing/metadata/tagging.rb +4 -4
  519. data/lib/datadog/tracing/metadata.rb +2 -0
  520. data/lib/datadog/tracing/pipeline/span_filter.rb +3 -1
  521. data/lib/datadog/tracing/pipeline/span_processor.rb +3 -1
  522. data/lib/datadog/tracing/pipeline.rb +1 -1
  523. data/lib/datadog/tracing/sampling/ext.rb +0 -2
  524. data/lib/datadog/tracing/sampling/rate_sampler.rb +2 -1
  525. data/lib/datadog/tracing/sampling/rule_sampler.rb +30 -30
  526. data/lib/datadog/tracing/sampling/span/rule.rb +0 -1
  527. data/lib/datadog/tracing/sampling/span/rule_parser.rb +1 -1
  528. data/lib/datadog/tracing/sampling/span/sampler.rb +0 -7
  529. data/lib/datadog/tracing/span.rb +11 -2
  530. data/lib/datadog/tracing/span_event.rb +11 -11
  531. data/lib/datadog/tracing/span_link.rb +12 -12
  532. data/lib/datadog/tracing/span_operation.rb +76 -26
  533. data/lib/datadog/tracing/sync_writer.rb +5 -4
  534. data/lib/datadog/tracing/trace_digest.rb +29 -24
  535. data/lib/datadog/tracing/trace_operation.rb +121 -97
  536. data/lib/datadog/tracing/trace_segment.rb +8 -6
  537. data/lib/datadog/tracing/tracer.rb +90 -43
  538. data/lib/datadog/tracing/transport/http/api.rb +2 -10
  539. data/lib/datadog/tracing/transport/http/client.rb +6 -5
  540. data/lib/datadog/tracing/transport/http/traces.rb +15 -43
  541. data/lib/datadog/tracing/transport/http.rb +13 -75
  542. data/lib/datadog/tracing/transport/io/client.rb +5 -5
  543. data/lib/datadog/tracing/transport/io/traces.rb +4 -4
  544. data/lib/datadog/tracing/transport/serializable_trace.rb +3 -1
  545. data/lib/datadog/tracing/transport/statistics.rb +1 -1
  546. data/lib/datadog/tracing/transport/trace_formatter.rb +7 -0
  547. data/lib/datadog/tracing/transport/traces.rb +31 -14
  548. data/lib/datadog/tracing/utils.rb +1 -1
  549. data/lib/datadog/tracing/workers/trace_writer.rb +16 -16
  550. data/lib/datadog/tracing/workers.rb +2 -2
  551. data/lib/datadog/tracing/writer.rb +4 -4
  552. data/lib/datadog/tracing.rb +16 -3
  553. data/lib/datadog/version.rb +1 -1
  554. data/lib/datadog.rb +8 -2
  555. metadata +115 -24
  556. data/ext/libdatadog_api/macos_development.md +0 -26
  557. data/lib/datadog/appsec/assets/waf_rules/processors.json +0 -92
  558. data/lib/datadog/appsec/assets/waf_rules/scanners.json +0 -114
  559. data/lib/datadog/appsec/contrib/devise/event.rb +0 -54
  560. data/lib/datadog/appsec/contrib/devise/patcher/authenticatable_patch.rb +0 -72
  561. data/lib/datadog/appsec/contrib/devise/patcher/registration_controller_patch.rb +0 -47
  562. data/lib/datadog/appsec/contrib/devise/resource.rb +0 -35
  563. data/lib/datadog/appsec/contrib/devise/tracking.rb +0 -57
  564. data/lib/datadog/appsec/processor/rule_merger.rb +0 -170
  565. data/lib/datadog/appsec/processor.rb +0 -107
  566. data/lib/datadog/appsec/utils/trace_operation.rb +0 -15
  567. data/lib/datadog/core/telemetry/http/env.rb +0 -20
  568. data/lib/datadog/core/telemetry/http/ext.rb +0 -28
  569. data/lib/datadog/core/telemetry/http/response.rb +0 -70
  570. data/lib/datadog/core/telemetry/http/transport.rb +0 -90
@@ -19,7 +19,7 @@ module Datadog
19
19
  register_as :rack, auto_patch: false
20
20
 
21
21
  def self.version
22
- Gem.loaded_specs['rack'] && Gem.loaded_specs['rack'].version
22
+ Gem.loaded_specs['rack']&.version
23
23
  end
24
24
 
25
25
  def self.loaded?
@@ -47,7 +47,7 @@ module Datadog
47
47
  end
48
48
 
49
49
  TraceProxyMiddleware.call(env, configuration) do
50
- trace_options = { type: Tracing::Metadata::Ext::HTTP::TYPE_INBOUND }
50
+ trace_options = {type: Tracing::Metadata::Ext::HTTP::TYPE_INBOUND}
51
51
  trace_options[:service] = configuration[:service_name] if configuration[:service_name]
52
52
 
53
53
  # start a new request span and attach it to the current Rack environment;
@@ -80,7 +80,7 @@ module Datadog
80
80
  # catch exceptions that may be raised in the middleware chain
81
81
  # Note: if a middleware catches an Exception without re raising,
82
82
  # the Exception cannot be recorded here.
83
- request_span.set_error(e) unless request_span.nil?
83
+ request_span&.set_error(e)
84
84
  raise e
85
85
  ensure
86
86
  env[Ext::RACK_ENV_REQUEST_SPAN] = previous_request_span if previous_request_span
@@ -123,7 +123,7 @@ module Datadog
123
123
  # 4. Fallback with verb + status, eq `GET 200`
124
124
  request_span.resource ||=
125
125
  if configuration[:middleware_names] && env['RESPONSE_MIDDLEWARE']
126
- "#{env['RESPONSE_MIDDLEWARE']}##{original_request_method}"
126
+ "#{env["RESPONSE_MIDDLEWARE"]}##{original_request_method}"
127
127
  elsif trace.resource_override?
128
128
  trace.resource
129
129
  else
@@ -240,16 +240,18 @@ module Datadog
240
240
  Datadog.configuration.tracing[:rack]
241
241
  end
242
242
 
243
+ # rubocop:disable Metrics/AbcSize
244
+ # rubocop:disable Metrics/MethodLength
243
245
  def parse_url(env, original_env)
244
246
  request_obj = ::Rack::Request.new(env)
245
247
 
246
248
  # scheme, host, and port
247
249
  base_url = if request_obj.respond_to?(:base_url)
248
- request_obj.base_url
249
- else
250
- # Compatibility for older Rack versions
251
- request_obj.url.chomp(request_obj.fullpath)
252
- end
250
+ request_obj.base_url
251
+ else
252
+ # Compatibility for older Rack versions
253
+ request_obj.url.chomp(request_obj.fullpath)
254
+ end
253
255
 
254
256
  # https://github.com/rack/rack/blob/main/SPEC.rdoc
255
257
  #
@@ -269,18 +271,20 @@ module Datadog
269
271
  # prepended to PATH_INFO to reflect the correct user visible path.
270
272
  request_uri = env['REQUEST_URI'].to_s
271
273
  fullpath = if request_uri.empty?
272
- query_string = original_env['QUERY_STRING'].to_s
273
- path = original_env['SCRIPT_NAME'].to_s + original_env['PATH_INFO'].to_s
274
-
275
- query_string.empty? ? path : "#{path}?#{query_string}"
276
- else
277
- # normally REQUEST_URI starts at the path, but it
278
- # might contain the full URL in some cases (e.g WEBrick)
279
- request_uri.delete_prefix(base_url)
280
- end
274
+ query_string = original_env['QUERY_STRING'].to_s
275
+ path = original_env['SCRIPT_NAME'].to_s + original_env['PATH_INFO'].to_s
276
+
277
+ query_string.empty? ? path : "#{path}?#{query_string}"
278
+ else
279
+ # normally REQUEST_URI starts at the path, but it
280
+ # might contain the full URL in some cases (e.g WEBrick)
281
+ request_uri.delete_prefix(base_url)
282
+ end
281
283
 
282
284
  base_url + fullpath
283
285
  end
286
+ # rubocop:enable Metrics/AbcSize
287
+ # rubocop:enable Metrics/MethodLength
284
288
 
285
289
  def parse_user_agent_header(headers)
286
290
  headers.get(Tracing::Metadata::Ext::HTTP::HEADER_USER_AGENT)
@@ -45,7 +45,7 @@ module Datadog
45
45
  end
46
46
 
47
47
  def retain_middleware_name(middleware)
48
- return unless middleware && middleware.respond_to?(:call)
48
+ return unless middleware&.respond_to?(:call)
49
49
 
50
50
  middleware.singleton_class.class_eval do
51
51
  alias_method :__call, :call
@@ -17,13 +17,14 @@ module Datadog
17
17
 
18
18
  module_function
19
19
 
20
- def get_request_start(env, now = Time.now.utc)
20
+ def get_request_start(env, now = Core::Utils::Time.now.utc)
21
21
  header = env[REQUEST_START] || env[QUEUE_START]
22
22
  return unless header
23
23
 
24
24
  # nginx header is seconds in the format "t=1512379167.574"
25
25
  # apache header is microseconds in the format "t=1570633834463123"
26
26
  # heroku header is milliseconds in the format "1570634024294"
27
+ # @see https://github.com/heroku/vegur/blob/65d168f757e0ddb448f41cfb9e4b0281c747378d/README.md?plain=1#L383-L384
27
28
  time_string = header.to_s.delete('^0-9')
28
29
  return if time_string.nil?
29
30
 
@@ -34,8 +35,8 @@ module Datadog
34
35
  # return the request_start only if it's lesser than
35
36
  # current time, to avoid significant clock skew
36
37
  request_start = Time.at(time_value)
37
- request_start.utc > now ? nil : request_start
38
- rescue StandardError => e
38
+ (request_start.utc > now) ? nil : request_start
39
+ rescue => e
39
40
  # in case of an Exception we don't create a
40
41
  # `request.queuing` span
41
42
  Datadog.logger.debug("[rack] unable to parse request queue headers: #{e}")
@@ -43,7 +43,13 @@ module Datadog
43
43
  # excluding the time spent processing the request itself
44
44
  queue_span.finish
45
45
 
46
- yield.tap { request_span.finish }
46
+ yield
47
+ ensure
48
+ # Ensure that the spans are finished even if an exception is raised.
49
+ # **This is very important** to prevent the trace from leaking between requests,
50
+ # especially because `queue_span` is normally a root span.
51
+ queue_span&.finish
52
+ request_span&.finish
47
53
  end
48
54
  end
49
55
  end
@@ -13,7 +13,7 @@ module Datadog
13
13
  # @public_api
14
14
  class Settings < Contrib::Configuration::Settings
15
15
  def initialize(options = {})
16
- super(options)
16
+ super
17
17
 
18
18
  # NOTE: Eager load these
19
19
  # Rails integration is responsible for orchestrating other integrations.
@@ -12,7 +12,8 @@ module Datadog
12
12
  # @!visibility private
13
13
  ENV_ANALYTICS_ENABLED = 'DD_TRACE_RAILS_ANALYTICS_ENABLED'
14
14
  ENV_ANALYTICS_SAMPLE_RATE = 'DD_TRACE_RAILS_ANALYTICS_SAMPLE_RATE'
15
- ENV_DISABLE = 'DISABLE_DATADOG_RAILS'
15
+ # Note: Alias (previous name DISABLE_DATADOG_RAILS) defined in supported-configurations.json
16
+ ENV_DISABLE = 'DD_DISABLE_DATADOG_RAILS'
16
17
 
17
18
  SPAN_RUNNER_FILE = 'rails.runner.file'
18
19
  SPAN_RUNNER_INLINE = 'rails.runner.inline'
@@ -23,7 +23,7 @@ module Datadog
23
23
  register_as :rails, auto_patch: false
24
24
 
25
25
  def self.version
26
- Gem.loaded_specs['railties'] && Gem.loaded_specs['railties'].version
26
+ Gem.loaded_specs['railties']&.version
27
27
  end
28
28
 
29
29
  def self.loaded?
@@ -35,7 +35,7 @@ module Datadog
35
35
  end
36
36
 
37
37
  def self.patchable?
38
- super && !ENV.key?(Ext::ENV_DISABLE)
38
+ super && !DATADOG_ENV.key?(Ext::ENV_DISABLE)
39
39
  end
40
40
 
41
41
  def new_configuration
@@ -16,7 +16,7 @@ module Datadog
16
16
 
17
17
  app_config.log_tags ||= [] # Can be nil, we initialized it if so
18
18
  app_config.log_tags << proc { Tracing.log_correlation if Datadog.configuration.tracing.log_injection }
19
- rescue StandardError => e
19
+ rescue => e
20
20
  Datadog.logger.warn(
21
21
  "Unable to add Datadog Trace context to ActiveSupport::TaggedLogging: #{e.class.name} #{e.message}"
22
22
  )
@@ -34,7 +34,7 @@ module Datadog
34
34
  # Some exception gets handled by Rails middleware before it can be set on Rack middleware
35
35
  # The rack span is the root span of the request and should make sure it has the full exception
36
36
  # set on it.
37
- env[Contrib::Rack::Ext::RACK_ENV_REQUEST_SPAN].set_error(e) if env[Contrib::Rack::Ext::RACK_ENV_REQUEST_SPAN]
37
+ env[Contrib::Rack::Ext::RACK_ENV_REQUEST_SPAN]&.set_error(e)
38
38
  end
39
39
  raise e
40
40
  end
@@ -86,7 +86,10 @@ module Datadog
86
86
 
87
87
  # Instruments the `bin/rails runner` command.
88
88
  def patch_rails_runner
89
- ::Rails::Command.singleton_class.prepend(Command) if defined?(::Rails::Command)
89
+ # The `RunnerCommand` class is only available in Rails 5.1 and later.
90
+ if defined?(::Rails::Command::RunnerCommand) && Integration.version >= Gem::Version.new('5.1')
91
+ ::Rails::Command::RunnerCommand.prepend(Runner)
92
+ end
90
93
  end
91
94
  end
92
95
  end
@@ -10,34 +10,48 @@ module Datadog
10
10
  # * `-`: for code provided through the STDIN.
11
11
  # * File path: for code provided through a local file.
12
12
  # * `inline code`: for code provided directly as a command line argument.
13
+ #
14
+ # The difficulty in instrumenting the Rails Runner is that
15
+ # the Rails application (and as a consequence the Datadog tracing library)
16
+ # is loaded very late in the runner execution.
17
+ # The Rails application is loaded inside the same method the method
18
+ # that directly executes the code the user wants the runner to execute:
19
+ #
20
+ # ```ruby
21
+ # def perform(code_or_file = nil, *command_argv)
22
+ # boot_application! # Loads the Rails and Datadog
23
+ #
24
+ # if code_or_file == "-"
25
+ # eval($stdin.read, TOPLEVEL_BINDING, "stdin") # Calls the user code for this Runner
26
+ # # ...
27
+ # ```
28
+ #
29
+ # This means that there's no time to instrument the calling method, `perform`, which
30
+ # would be ideal. Instead, we resort to instrumenting `eval` and `load`, but
31
+ # only for calls from the `Rails::Command::RunnerCommand` class.
32
+ #
13
33
  # @see https://guides.rubyonrails.org/v6.1/command_line.html#bin-rails-runner
14
34
  module Runner
15
35
  # Limit the maximum size of the source code captured in the source tag.
16
36
  MAX_TAG_VALUE_SIZE = 4096
17
37
  private_constant :MAX_TAG_VALUE_SIZE
18
38
 
19
- def runner(code_or_file = nil, *_command_argv)
20
- if code_or_file == '-'
39
+ # Instruments the `Kernel.eval` method, but only for the
40
+ # `Rails::Command::RunnerCommand` class.
41
+ def eval(*args)
42
+ source = args[0]
43
+
44
+ if args[2] == 'stdin'
21
45
  name = Ext::SPAN_RUNNER_STDIN
22
- resource = nil
23
46
  operation = Ext::TAG_OPERATION_STDIN
24
- # The source is not yet available for STDIN, but it will be captured in `eval`.
25
- elsif File.exist?(code_or_file)
26
- name = Ext::SPAN_RUNNER_FILE
27
- resource = code_or_file
28
- operation = Ext::TAG_OPERATION_FILE
29
- source = File.read(code_or_file)
30
47
  else
31
48
  name = Ext::SPAN_RUNNER_INLINE
32
- resource = nil
33
49
  operation = Ext::TAG_OPERATION_INLINE
34
- source = code_or_file
35
50
  end
36
51
 
37
52
  Tracing.trace(
38
53
  name,
39
54
  service: Datadog.configuration.tracing[:rails][:service_name],
40
- resource: resource,
41
55
  tags: {
42
56
  Tracing::Metadata::Ext::TAG_COMPONENT => Ext::TAG_COMPONENT,
43
57
  Tracing::Metadata::Ext::TAG_OPERATION => operation,
@@ -55,39 +69,47 @@ module Datadog
55
69
  end
56
70
  end
57
71
 
58
- # Capture the executed source code when provided from STDIN.
59
- def eval(*args)
60
- span = Datadog::Tracing.active_span
61
- if span&.name == Ext::SPAN_RUNNER_STDIN
62
- source = args[0]
63
- span.set_tag(
64
- Ext::TAG_RUNNER_SOURCE,
65
- Core::Utils.truncate(source, MAX_TAG_VALUE_SIZE)
66
- )
67
- end
68
-
69
- super
72
+ def self.prepended(base)
73
+ base.const_set(:Kernel, InstrumentedKernel)
70
74
  end
71
75
 
72
- ruby2_keywords :eval if respond_to?(:ruby2_keywords, true)
73
- end
76
+ # Instruments the `Kernel.load` method, but only for the
77
+ # `Rails::Command::RunnerCommand` class.
78
+ module InstrumentedKernel
79
+ def self.load(*args)
80
+ file = args[0]
81
+ name = Ext::SPAN_RUNNER_FILE
82
+ resource = file
83
+ operation = Ext::TAG_OPERATION_FILE
84
+
85
+ begin
86
+ # Reads one more byte than the limit to allow us to check if the source exceeds the limit.
87
+ source = File.read(file, MAX_TAG_VALUE_SIZE + 1)
88
+ rescue => e
89
+ Datadog.logger.debug("Failed to read file '#{file}' for Rails runner: #{e.message}")
90
+ end
74
91
 
75
- # The instrumentation target, {Rails::Command::RunnerCommand} is only loaded
76
- # right before `bin/rails runner` is executed. This means there's not much
77
- # opportunity to patch it ahead of time.
78
- # To ensure we can patch it successfully, we patch it's caller, {Rails::Command}
79
- # and promptly patch {Rails::Command::RunnerCommand} when it is loaded.
80
- module Command
81
- def find_by_namespace(*args)
82
- ret = super
83
- # Patch RunnerCommand if it is loaded and not already patched.
84
- if defined?(::Rails::Command::RunnerCommand) && !(::Rails::Command::RunnerCommand < Runner)
85
- ::Rails::Command::RunnerCommand.prepend(Runner)
92
+ Tracing.trace(
93
+ name,
94
+ service: Datadog.configuration.tracing[:rails][:service_name],
95
+ resource: resource,
96
+ tags: {
97
+ Tracing::Metadata::Ext::TAG_COMPONENT => Ext::TAG_COMPONENT,
98
+ Tracing::Metadata::Ext::TAG_OPERATION => operation,
99
+ }
100
+ ) do |span|
101
+ if source
102
+ span.set_tag(
103
+ Ext::TAG_RUNNER_SOURCE,
104
+ Core::Utils.truncate(source, MAX_TAG_VALUE_SIZE)
105
+ )
106
+ end
107
+ Contrib::Analytics.set_rate!(span, Datadog.configuration.tracing[:rails])
108
+
109
+ super
110
+ end
86
111
  end
87
- ret
88
112
  end
89
-
90
- ruby2_keywords :find_by_namespace if respond_to?(:ruby2_keywords, true)
91
113
  end
92
114
  end
93
115
  end
@@ -65,7 +65,7 @@ module Datadog
65
65
  span.set_tag(Tracing::Metadata::Ext::TAG_OPERATION, Ext::TAG_OPERATION_INVOKE)
66
66
  span.set_tag(Ext::TAG_TASK_ARG_NAMES, arg_names)
67
67
  span.set_tag(Ext::TAG_INVOKE_ARGS, quantize_args(args)) unless args.nil?
68
- rescue StandardError => e
68
+ rescue => e
69
69
  Datadog.logger.debug("Error while tracing Rake invoke: #{e.class.name} #{e.message}")
70
70
  end
71
71
 
@@ -74,7 +74,7 @@ module Datadog
74
74
  span.set_tag(Tracing::Metadata::Ext::TAG_COMPONENT, Ext::TAG_COMPONENT)
75
75
  span.set_tag(Tracing::Metadata::Ext::TAG_OPERATION, Ext::TAG_OPERATION_EXECUTE)
76
76
  span.set_tag(Ext::TAG_EXECUTE_ARGS, quantize_args(args.to_hash)) unless args.nil?
77
- rescue StandardError => e
77
+ rescue => e
78
78
  Datadog.logger.debug("Error while tracing Rake execute: #{e.class.name} #{e.message}")
79
79
  end
80
80
 
@@ -84,12 +84,12 @@ module Datadog
84
84
  end
85
85
 
86
86
  def enabled?
87
- Datadog.configuration.tracing.enabled && \
87
+ Datadog.configuration.tracing.enabled &&
88
88
  configuration[:enabled] == true
89
89
  end
90
90
 
91
91
  def span_options
92
- { service: configuration[:service_name] }
92
+ {service: configuration[:service_name]}
93
93
  end
94
94
 
95
95
  def configuration
@@ -18,7 +18,7 @@ module Datadog
18
18
  register_as :rake
19
19
 
20
20
  def self.version
21
- Gem.loaded_specs['rake'] && Gem.loaded_specs['rake'].version
21
+ Gem.loaded_specs['rake']&.version
22
22
  end
23
23
 
24
24
  def self.loaded?
@@ -19,13 +19,13 @@ module Datadog
19
19
  protected
20
20
 
21
21
  def parse_matcher(matcher)
22
- matcher = { url: matcher } if matcher.is_a?(String)
22
+ matcher = {url: matcher} if matcher.is_a?(String)
23
23
 
24
24
  normalize(connection_resolver.resolve(matcher))
25
25
  end
26
26
 
27
27
  def normalize(hash)
28
- return { url: hash[:url] } if hash[:scheme] == UNIX_SCHEME
28
+ return {url: hash[:url]} if hash[:scheme] == UNIX_SCHEME
29
29
 
30
30
  # Connexion strings are always converted to host, port, db and scheme
31
31
  # but the host, port, db and scheme will generate the :url only after
@@ -24,10 +24,11 @@ module Datadog
24
24
  TAG_OPERATION_COMMAND = 'command'
25
25
  TAG_SYSTEM = 'redis'
26
26
  TAG_DATABASE_INDEX = 'db.redis.database_index'
27
- PEER_SERVICE_SOURCES = Array[
27
+ PEER_SERVICE_SOURCES = [
28
28
  Tracing::Metadata::Ext::TAG_PEER_HOSTNAME,
29
29
  Tracing::Metadata::Ext::NET::TAG_DESTINATION_NAME,
30
- Tracing::Metadata::Ext::NET::TAG_TARGET_HOST,].freeze
30
+ Tracing::Metadata::Ext::NET::TAG_TARGET_HOST,
31
+ ].freeze
31
32
  end
32
33
  end
33
34
  end
@@ -31,11 +31,11 @@ module Datadog
31
31
  end
32
32
 
33
33
  def self.redis_version
34
- Gem.loaded_specs['redis'] && Gem.loaded_specs['redis'].version
34
+ Gem.loaded_specs['redis']&.version
35
35
  end
36
36
 
37
37
  def self.redis_client_version
38
- Gem.loaded_specs['redis-client'] && Gem.loaded_specs['redis-client'].version
38
+ Gem.loaded_specs['redis-client']&.version
39
39
  end
40
40
 
41
41
  def self.loaded?
@@ -30,7 +30,7 @@ module Datadog
30
30
  # For `redis-rb` 3.x
31
31
  return client if respond_to?(:client)
32
32
 
33
- Datadog.logger.warn 'Fail to apply configuration on redis client instance with ' \
33
+ Datadog.logger.warn 'Fail to apply configuration on redis client instance with ' \
34
34
  '`Datadog.configure_onto(redis)`.'
35
35
 
36
36
  # Null object instead of raising error
@@ -49,8 +49,8 @@ module Datadog
49
49
  module InstanceMethods
50
50
  def datadog_pin=(_pin)
51
51
  Datadog.logger.warn \
52
- '`Datadog.configure_onto(redis)` is not supported on Redis 5+. To instrument '\
53
- "a redis instance with custom configuration, please initialize it with:\n"\
52
+ '`Datadog.configure_onto(redis)` is not supported on Redis 5+. To instrument ' \
53
+ "a redis instance with custom configuration, please initialize it with:\n" \
54
54
  " `Redis.new(..., custom: { datadog: { service_name: 'my-service' } })`.\n\n" \
55
55
  'See: https://github.com/DataDog/dd-trace-rb/blob/master/docs/GettingStarted.md#redis'
56
56
  end
@@ -61,7 +61,7 @@ module Datadog
61
61
 
62
62
  def default_tags
63
63
  [].tap do |tags|
64
- tags << "target_redis_version:#{Integration.redis_version}" if Integration.redis_version
64
+ tags << "target_redis_version:#{Integration.redis_version}" if Integration.redis_version
65
65
  tags << "target_redis_client_version:#{Integration.redis_client_version}" if Integration.redis_client_version
66
66
  end
67
67
  end
@@ -43,7 +43,7 @@ module Datadog
43
43
  return 'AUTH ?' if auth_command?(command_args)
44
44
 
45
45
  verb, *args = command_args.map { |x| format_arg(x) }
46
- Core::Utils.truncate("#{verb.upcase} #{args.join(' ')}", CMD_MAX_LEN, TOO_LONG_MARK)
46
+ Core::Utils.truncate("#{verb.upcase} #{args.join(" ")}", CMD_MAX_LEN, TOO_LONG_MARK)
47
47
  end
48
48
 
49
49
  def get_verb(command_args)
@@ -46,7 +46,7 @@ module Datadog
46
46
  span.set_tag Ext::TAG_RAW_COMMAND, raw_command
47
47
 
48
48
  Contrib::SpanAttributeSchema.set_peer_service!(span, Ext::PEER_SERVICE_SOURCES)
49
- rescue StandardError => e
49
+ rescue => e
50
50
  Datadog.logger.error(e.message)
51
51
  Datadog::Core::Telemetry::Logger.report(e)
52
52
  end
@@ -62,10 +62,10 @@ module Datadog
62
62
  # Quantizes a multi-command Redis pipeline execution
63
63
  def get_pipeline_commands(commands, command_args)
64
64
  list = if command_args
65
- commands.map { |c| Contrib::Redis::Quantize.format_command_args(c) }
66
- else
67
- commands.map { |c| Contrib::Redis::Quantize.get_verb(c) }
68
- end
65
+ commands.map { |c| Contrib::Redis::Quantize.format_command_args(c) }
66
+ else
67
+ commands.map { |c| Contrib::Redis::Quantize.get_verb(c) }
68
+ end
69
69
 
70
70
  list.empty? ? '(none)' : list.join("\n")
71
71
  end
@@ -35,7 +35,7 @@ module Datadog
35
35
  def [](name)
36
36
  @mutex.synchronize do
37
37
  entry = @data[name]
38
- entry.klass if entry
38
+ entry&.klass
39
39
  end
40
40
  end
41
41
 
@@ -18,7 +18,7 @@ module Datadog
18
18
  register_as :resque, auto_patch: true
19
19
 
20
20
  def self.version
21
- Gem.loaded_specs['resque'] && Gem.loaded_specs['resque'].version
21
+ Gem.loaded_specs['resque']&.version
22
22
  end
23
23
 
24
24
  def self.loaded?
@@ -76,7 +76,7 @@ module Datadog
76
76
  end
77
77
 
78
78
  def span_options
79
- { service: datadog_configuration[:service_name], on_error: datadog_configuration[:on_error] }
79
+ {service: datadog_configuration[:service_name], on_error: datadog_configuration[:on_error]}
80
80
  end
81
81
 
82
82
  def datadog_configuration
@@ -17,10 +17,11 @@ module Datadog
17
17
  SPAN_REQUEST = 'rest_client.request'
18
18
  TAG_COMPONENT = 'rest_client'
19
19
  TAG_OPERATION_REQUEST = 'request'
20
- PEER_SERVICE_SOURCES = Array[
20
+ PEER_SERVICE_SOURCES = [
21
21
  Tracing::Metadata::Ext::TAG_PEER_HOSTNAME,
22
22
  Tracing::Metadata::Ext::NET::TAG_DESTINATION_NAME,
23
- Tracing::Metadata::Ext::NET::TAG_TARGET_HOST,].freeze
23
+ Tracing::Metadata::Ext::NET::TAG_TARGET_HOST,
24
+ ].freeze
24
25
  end
25
26
  end
26
27
  end
@@ -21,7 +21,7 @@ module Datadog
21
21
  end
22
22
 
23
23
  def self.version
24
- Gem.loaded_specs['rest-client'] && Gem.loaded_specs['rest-client'].version
24
+ Gem.loaded_specs['rest-client']&.version
25
25
  end
26
26
 
27
27
  def self.loaded?
@@ -22,13 +22,15 @@ module Datadog
22
22
  def execute(&block)
23
23
  uri = URI.parse(url)
24
24
 
25
- return super(&block) unless Tracing.enabled?
25
+ return super unless Tracing.enabled?
26
26
 
27
27
  datadog_trace_request(uri) do |_span, trace|
28
- if Datadog::AppSec::Utils::TraceOperation.appsec_standalone_reject?(trace)
29
- trace.sampling_priority = Tracing::Sampling::Ext::Priority::AUTO_REJECT
28
+ if Tracing::Distributed::PropagationPolicy.enabled?(
29
+ global_config: datadog_configuration,
30
+ trace: trace
31
+ )
32
+ Contrib::HTTP.inject(trace, processed_headers)
30
33
  end
31
- Contrib::HTTP.inject(trace, processed_headers) if datadog_configuration[:distributed_tracing]
32
34
 
33
35
  super(&block)
34
36
  end
@@ -104,11 +106,11 @@ module Datadog
104
106
  # rubocop:disable Lint/RescueException
105
107
  rescue Exception => e
106
108
  # rubocop:enable Lint/RescueException
107
- span.set_error(e) if span
109
+ span&.set_error(e)
108
110
 
109
111
  raise e
110
112
  ensure
111
- span.finish if span
113
+ span&.finish
112
114
  end
113
115
 
114
116
  private
@@ -46,7 +46,7 @@ module Datadog
46
46
  ensure
47
47
  begin
48
48
  response = yield
49
- rescue StandardError
49
+ rescue
50
50
  # The status code is unknown to Roda and decided by the upstream web runner.
51
51
  # In this case, spans default to status code 500 rather than a blank status code.
52
52
  default_error_status = '500'
@@ -20,7 +20,7 @@ module Datadog
20
20
  register_as :roda
21
21
 
22
22
  def self.version
23
- Gem.loaded_specs['roda'] && Gem.loaded_specs['roda'].version
23
+ Gem.loaded_specs['roda']&.version
24
24
  end
25
25
 
26
26
  def self.loaded?
@@ -25,7 +25,7 @@ module Datadog
25
25
  # if the user already has conflicting log_tags
26
26
  # we want them to clobber ours, because we should allow them to override if needed.
27
27
  log.named_tags = correlation.to_h.merge(original_named_tags)
28
- super(log, message, progname, &block)
28
+ super
29
29
  end
30
30
  end
31
31
  end
@@ -21,7 +21,7 @@ module Datadog
21
21
  register_as :semantic_logger
22
22
 
23
23
  def self.version
24
- Gem.loaded_specs['semantic_logger'] && Gem.loaded_specs['semantic_logger'].version
24
+ Gem.loaded_specs['semantic_logger']&.version
25
25
  end
26
26
 
27
27
  def self.loaded?