datadog 2.7.1 → 2.18.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 (441) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +353 -1
  3. data/ext/datadog_profiling_native_extension/clock_id.h +2 -2
  4. data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +78 -102
  5. data/ext/datadog_profiling_native_extension/collectors_discrete_dynamic_sampler.c +1 -1
  6. data/ext/datadog_profiling_native_extension/collectors_discrete_dynamic_sampler.h +1 -1
  7. data/ext/datadog_profiling_native_extension/collectors_idle_sampling_helper.c +16 -16
  8. data/ext/datadog_profiling_native_extension/collectors_stack.c +235 -57
  9. data/ext/datadog_profiling_native_extension/collectors_stack.h +21 -5
  10. data/ext/datadog_profiling_native_extension/collectors_thread_context.c +376 -156
  11. data/ext/datadog_profiling_native_extension/collectors_thread_context.h +1 -0
  12. data/ext/datadog_profiling_native_extension/datadog_ruby_common.c +1 -4
  13. data/ext/datadog_profiling_native_extension/datadog_ruby_common.h +10 -0
  14. data/ext/datadog_profiling_native_extension/encoded_profile.c +79 -0
  15. data/ext/datadog_profiling_native_extension/encoded_profile.h +8 -0
  16. data/ext/datadog_profiling_native_extension/extconf.rb +14 -8
  17. data/ext/datadog_profiling_native_extension/gvl_profiling_helper.c +2 -0
  18. data/ext/datadog_profiling_native_extension/gvl_profiling_helper.h +0 -8
  19. data/ext/datadog_profiling_native_extension/heap_recorder.c +295 -532
  20. data/ext/datadog_profiling_native_extension/heap_recorder.h +6 -8
  21. data/ext/datadog_profiling_native_extension/http_transport.c +64 -98
  22. data/ext/datadog_profiling_native_extension/libdatadog_helpers.c +22 -0
  23. data/ext/datadog_profiling_native_extension/libdatadog_helpers.h +8 -5
  24. data/ext/datadog_profiling_native_extension/private_vm_api_access.c +69 -1
  25. data/ext/datadog_profiling_native_extension/private_vm_api_access.h +16 -4
  26. data/ext/datadog_profiling_native_extension/profiling.c +19 -8
  27. data/ext/datadog_profiling_native_extension/ruby_helpers.c +9 -21
  28. data/ext/datadog_profiling_native_extension/ruby_helpers.h +2 -10
  29. data/ext/datadog_profiling_native_extension/stack_recorder.c +231 -181
  30. data/ext/datadog_profiling_native_extension/stack_recorder.h +2 -2
  31. data/ext/datadog_profiling_native_extension/time_helpers.h +1 -1
  32. data/ext/datadog_profiling_native_extension/unsafe_api_calls_check.c +47 -0
  33. data/ext/datadog_profiling_native_extension/unsafe_api_calls_check.h +31 -0
  34. data/ext/libdatadog_api/crashtracker.c +17 -15
  35. data/ext/libdatadog_api/crashtracker.h +5 -0
  36. data/ext/libdatadog_api/datadog_ruby_common.c +1 -4
  37. data/ext/libdatadog_api/datadog_ruby_common.h +10 -0
  38. data/ext/libdatadog_api/extconf.rb +2 -2
  39. data/ext/libdatadog_api/init.c +15 -0
  40. data/ext/libdatadog_api/library_config.c +164 -0
  41. data/ext/libdatadog_api/library_config.h +25 -0
  42. data/ext/libdatadog_api/macos_development.md +3 -3
  43. data/ext/libdatadog_api/process_discovery.c +112 -0
  44. data/ext/libdatadog_api/process_discovery.h +5 -0
  45. data/ext/libdatadog_extconf_helpers.rb +2 -2
  46. data/lib/datadog/appsec/actions_handler/serializable_backtrace.rb +89 -0
  47. data/lib/datadog/appsec/actions_handler.rb +49 -0
  48. data/lib/datadog/appsec/anonymizer.rb +16 -0
  49. data/lib/datadog/appsec/api_security/lru_cache.rb +56 -0
  50. data/lib/datadog/appsec/api_security/route_extractor.rb +65 -0
  51. data/lib/datadog/appsec/api_security/sampler.rb +59 -0
  52. data/lib/datadog/appsec/api_security.rb +23 -0
  53. data/lib/datadog/appsec/assets/waf_rules/README.md +50 -5
  54. data/lib/datadog/appsec/assets/waf_rules/recommended.json +623 -253
  55. data/lib/datadog/appsec/assets/waf_rules/strict.json +69 -107
  56. data/lib/datadog/appsec/autoload.rb +1 -1
  57. data/lib/datadog/appsec/component.rb +49 -65
  58. data/lib/datadog/appsec/compressed_json.rb +40 -0
  59. data/lib/datadog/appsec/configuration/settings.rb +212 -27
  60. data/lib/datadog/appsec/context.rb +74 -0
  61. data/lib/datadog/appsec/contrib/active_record/instrumentation.rb +92 -0
  62. data/lib/datadog/appsec/contrib/active_record/integration.rb +41 -0
  63. data/lib/datadog/appsec/contrib/active_record/patcher.rb +101 -0
  64. data/lib/datadog/appsec/contrib/auto_instrument.rb +1 -1
  65. data/lib/datadog/appsec/contrib/devise/configuration.rb +52 -0
  66. data/lib/datadog/appsec/contrib/devise/data_extractor.rb +78 -0
  67. data/lib/datadog/appsec/contrib/devise/ext.rb +22 -0
  68. data/lib/datadog/appsec/contrib/devise/integration.rb +1 -2
  69. data/lib/datadog/appsec/contrib/devise/patcher.rb +33 -25
  70. data/lib/datadog/appsec/contrib/devise/patches/signin_tracking_patch.rb +102 -0
  71. data/lib/datadog/appsec/contrib/devise/patches/signup_tracking_patch.rb +69 -0
  72. data/lib/datadog/appsec/contrib/devise/{patcher/rememberable_patch.rb → patches/skip_signin_tracking_patch.rb} +3 -3
  73. data/lib/datadog/appsec/contrib/devise/tracking_middleware.rb +106 -0
  74. data/lib/datadog/appsec/contrib/excon/integration.rb +41 -0
  75. data/lib/datadog/appsec/contrib/excon/patcher.rb +28 -0
  76. data/lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb +42 -0
  77. data/lib/datadog/appsec/contrib/faraday/connection_patch.rb +22 -0
  78. data/lib/datadog/appsec/contrib/faraday/integration.rb +42 -0
  79. data/lib/datadog/appsec/contrib/faraday/patcher.rb +53 -0
  80. data/lib/datadog/appsec/contrib/faraday/rack_builder_patch.rb +22 -0
  81. data/lib/datadog/appsec/contrib/faraday/ssrf_detection_middleware.rb +41 -0
  82. data/lib/datadog/appsec/contrib/graphql/appsec_trace.rb +1 -7
  83. data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +17 -30
  84. data/lib/datadog/appsec/contrib/graphql/integration.rb +1 -1
  85. data/lib/datadog/appsec/contrib/graphql/patcher.rb +0 -3
  86. data/lib/datadog/appsec/contrib/rack/ext.rb +34 -0
  87. data/lib/datadog/appsec/contrib/rack/gateway/response.rb +3 -3
  88. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +78 -98
  89. data/lib/datadog/appsec/contrib/rack/integration.rb +1 -1
  90. data/lib/datadog/appsec/contrib/rack/patcher.rb +0 -3
  91. data/lib/datadog/appsec/contrib/rack/request_body_middleware.rb +10 -11
  92. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +73 -78
  93. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +16 -33
  94. data/lib/datadog/appsec/contrib/rails/integration.rb +1 -1
  95. data/lib/datadog/appsec/contrib/rails/patcher.rb +25 -38
  96. data/lib/datadog/appsec/contrib/rest_client/integration.rb +45 -0
  97. data/lib/datadog/appsec/contrib/rest_client/patcher.rb +28 -0
  98. data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +38 -0
  99. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +31 -68
  100. data/lib/datadog/appsec/contrib/sinatra/integration.rb +1 -1
  101. data/lib/datadog/appsec/contrib/sinatra/patcher.rb +5 -31
  102. data/lib/datadog/appsec/event.rb +96 -135
  103. data/lib/datadog/appsec/ext.rb +12 -3
  104. data/lib/datadog/appsec/instrumentation/gateway/argument.rb +7 -2
  105. data/lib/datadog/appsec/instrumentation/gateway/middleware.rb +24 -0
  106. data/lib/datadog/appsec/instrumentation/gateway.rb +17 -22
  107. data/lib/datadog/appsec/metrics/collector.rb +38 -0
  108. data/lib/datadog/appsec/metrics/exporter.rb +35 -0
  109. data/lib/datadog/appsec/metrics/telemetry.rb +23 -0
  110. data/lib/datadog/appsec/metrics.rb +13 -0
  111. data/lib/datadog/appsec/monitor/gateway/watcher.rb +52 -32
  112. data/lib/datadog/appsec/processor/rule_loader.rb +30 -36
  113. data/lib/datadog/appsec/remote.rb +31 -57
  114. data/lib/datadog/appsec/response.rb +19 -85
  115. data/lib/datadog/appsec/security_engine/engine.rb +194 -0
  116. data/lib/datadog/appsec/security_engine/result.rb +67 -0
  117. data/lib/datadog/appsec/security_engine/runner.rb +87 -0
  118. data/lib/datadog/appsec/security_engine.rb +9 -0
  119. data/lib/datadog/appsec/security_event.rb +39 -0
  120. data/lib/datadog/appsec/utils.rb +0 -2
  121. data/lib/datadog/appsec.rb +22 -12
  122. data/lib/datadog/auto_instrument.rb +3 -0
  123. data/lib/datadog/core/buffer/random.rb +18 -2
  124. data/lib/datadog/core/configuration/agent_settings.rb +52 -0
  125. data/lib/datadog/core/configuration/agent_settings_resolver.rb +4 -18
  126. data/lib/datadog/core/configuration/agentless_settings_resolver.rb +176 -0
  127. data/lib/datadog/core/configuration/components.rb +74 -32
  128. data/lib/datadog/core/configuration/components_state.rb +23 -0
  129. data/lib/datadog/core/configuration/ext.rb +5 -1
  130. data/lib/datadog/core/configuration/option.rb +81 -45
  131. data/lib/datadog/core/configuration/option_definition.rb +6 -4
  132. data/lib/datadog/core/configuration/options.rb +3 -3
  133. data/lib/datadog/core/configuration/settings.rb +121 -50
  134. data/lib/datadog/core/configuration/stable_config.rb +22 -0
  135. data/lib/datadog/core/configuration.rb +43 -11
  136. data/lib/datadog/{tracing → core}/contrib/rails/utils.rb +1 -3
  137. data/lib/datadog/core/crashtracking/component.rb +4 -13
  138. data/lib/datadog/core/crashtracking/tag_builder.rb +4 -22
  139. data/lib/datadog/core/diagnostics/environment_logger.rb +1 -1
  140. data/lib/datadog/core/encoding.rb +17 -1
  141. data/lib/datadog/core/environment/agent_info.rb +78 -0
  142. data/lib/datadog/core/environment/cgroup.rb +10 -12
  143. data/lib/datadog/core/environment/container.rb +38 -40
  144. data/lib/datadog/core/environment/ext.rb +6 -6
  145. data/lib/datadog/core/environment/git.rb +1 -0
  146. data/lib/datadog/core/environment/identity.rb +3 -3
  147. data/lib/datadog/core/environment/platform.rb +3 -3
  148. data/lib/datadog/core/environment/variable_helpers.rb +1 -1
  149. data/lib/datadog/core/error.rb +11 -9
  150. data/lib/datadog/core/logger.rb +2 -2
  151. data/lib/datadog/core/metrics/client.rb +27 -27
  152. data/lib/datadog/core/metrics/logging.rb +5 -5
  153. data/lib/datadog/core/process_discovery/tracer_memfd.rb +15 -0
  154. data/lib/datadog/core/process_discovery.rb +36 -0
  155. data/lib/datadog/core/rate_limiter.rb +4 -2
  156. data/lib/datadog/core/remote/client/capabilities.rb +6 -0
  157. data/lib/datadog/core/remote/client.rb +107 -92
  158. data/lib/datadog/core/remote/component.rb +18 -19
  159. data/lib/datadog/core/remote/configuration/digest.rb +7 -7
  160. data/lib/datadog/core/remote/configuration/path.rb +1 -1
  161. data/lib/datadog/core/remote/configuration/repository.rb +14 -1
  162. data/lib/datadog/core/remote/negotiation.rb +9 -9
  163. data/lib/datadog/core/remote/transport/config.rb +4 -3
  164. data/lib/datadog/core/remote/transport/http/api.rb +13 -18
  165. data/lib/datadog/core/remote/transport/http/client.rb +5 -4
  166. data/lib/datadog/core/remote/transport/http/config.rb +27 -55
  167. data/lib/datadog/core/remote/transport/http/negotiation.rb +8 -51
  168. data/lib/datadog/core/remote/transport/http.rb +25 -94
  169. data/lib/datadog/core/remote/transport/negotiation.rb +17 -4
  170. data/lib/datadog/core/remote/worker.rb +10 -7
  171. data/lib/datadog/core/runtime/metrics.rb +12 -5
  172. data/lib/datadog/core/tag_builder.rb +56 -0
  173. data/lib/datadog/core/telemetry/component.rb +84 -49
  174. data/lib/datadog/core/telemetry/emitter.rb +23 -11
  175. data/lib/datadog/core/telemetry/event/app_client_configuration_change.rb +66 -0
  176. data/lib/datadog/core/telemetry/event/app_closing.rb +18 -0
  177. data/lib/datadog/core/telemetry/event/app_dependencies_loaded.rb +33 -0
  178. data/lib/datadog/core/telemetry/event/app_heartbeat.rb +18 -0
  179. data/lib/datadog/core/telemetry/event/app_integrations_change.rb +58 -0
  180. data/lib/datadog/core/telemetry/event/app_started.rb +269 -0
  181. data/lib/datadog/core/telemetry/event/base.rb +40 -0
  182. data/lib/datadog/core/telemetry/event/distributions.rb +18 -0
  183. data/lib/datadog/core/telemetry/event/generate_metrics.rb +43 -0
  184. data/lib/datadog/core/telemetry/event/log.rb +76 -0
  185. data/lib/datadog/core/telemetry/event/message_batch.rb +42 -0
  186. data/lib/datadog/core/telemetry/event/synth_app_client_configuration_change.rb +43 -0
  187. data/lib/datadog/core/telemetry/event.rb +17 -383
  188. data/lib/datadog/core/telemetry/ext.rb +1 -0
  189. data/lib/datadog/core/telemetry/http/adapters/net.rb +12 -97
  190. data/lib/datadog/core/telemetry/logger.rb +5 -4
  191. data/lib/datadog/core/telemetry/logging.rb +12 -6
  192. data/lib/datadog/core/telemetry/metric.rb +28 -6
  193. data/lib/datadog/core/telemetry/request.rb +4 -4
  194. data/lib/datadog/core/telemetry/transport/http/api.rb +43 -0
  195. data/lib/datadog/core/telemetry/transport/http/client.rb +49 -0
  196. data/lib/datadog/core/telemetry/transport/http/telemetry.rb +92 -0
  197. data/lib/datadog/core/telemetry/transport/http.rb +63 -0
  198. data/lib/datadog/core/telemetry/transport/telemetry.rb +51 -0
  199. data/lib/datadog/core/telemetry/worker.rb +128 -25
  200. data/lib/datadog/core/transport/http/adapters/net.rb +17 -2
  201. data/lib/datadog/core/transport/http/adapters/test.rb +2 -1
  202. data/lib/datadog/core/transport/http/adapters/unix_socket.rb +1 -1
  203. data/lib/datadog/{tracing → core}/transport/http/api/instance.rb +18 -1
  204. data/lib/datadog/core/transport/http/api/spec.rb +36 -0
  205. data/lib/datadog/{tracing → core}/transport/http/builder.rb +53 -31
  206. data/lib/datadog/core/transport/http/env.rb +8 -0
  207. data/lib/datadog/core/transport/http.rb +75 -0
  208. data/lib/datadog/core/transport/response.rb +4 -0
  209. data/lib/datadog/core/utils/at_fork_monkey_patch.rb +6 -6
  210. data/lib/datadog/core/utils/duration.rb +32 -32
  211. data/lib/datadog/core/utils/forking.rb +2 -2
  212. data/lib/datadog/core/utils/network.rb +6 -6
  213. data/lib/datadog/core/utils/only_once_successful.rb +16 -5
  214. data/lib/datadog/core/utils/time.rb +20 -0
  215. data/lib/datadog/core/utils/truncation.rb +21 -0
  216. data/lib/datadog/core/utils.rb +7 -0
  217. data/lib/datadog/core/vendor/multipart-post/multipart/post/composite_read_io.rb +1 -1
  218. data/lib/datadog/core/vendor/multipart-post/multipart/post/multipartable.rb +8 -8
  219. data/lib/datadog/core/vendor/multipart-post/multipart/post/parts.rb +7 -7
  220. data/lib/datadog/core/worker.rb +1 -1
  221. data/lib/datadog/core/workers/async.rb +29 -12
  222. data/lib/datadog/core/workers/interval_loop.rb +12 -1
  223. data/lib/datadog/core/workers/runtime_metrics.rb +2 -2
  224. data/lib/datadog/core.rb +8 -0
  225. data/lib/datadog/di/base.rb +115 -0
  226. data/lib/datadog/di/boot.rb +34 -0
  227. data/lib/datadog/di/code_tracker.rb +26 -15
  228. data/lib/datadog/di/component.rb +23 -14
  229. data/lib/datadog/di/configuration/settings.rb +25 -1
  230. data/lib/datadog/di/contrib/active_record.rb +1 -0
  231. data/lib/datadog/di/contrib/railtie.rb +15 -0
  232. data/lib/datadog/di/contrib.rb +28 -0
  233. data/lib/datadog/di/error.rb +5 -0
  234. data/lib/datadog/di/instrumenter.rb +162 -21
  235. data/lib/datadog/di/logger.rb +30 -0
  236. data/lib/datadog/di/preload.rb +18 -0
  237. data/lib/datadog/di/probe.rb +14 -7
  238. data/lib/datadog/di/probe_builder.rb +1 -0
  239. data/lib/datadog/di/probe_manager.rb +11 -5
  240. data/lib/datadog/di/probe_notification_builder.rb +54 -38
  241. data/lib/datadog/di/probe_notifier_worker.rb +60 -26
  242. data/lib/datadog/di/redactor.rb +0 -1
  243. data/lib/datadog/di/remote.rb +147 -0
  244. data/lib/datadog/di/serializer.rb +19 -8
  245. data/lib/datadog/di/transport/diagnostics.rb +62 -0
  246. data/lib/datadog/di/transport/http/api.rb +42 -0
  247. data/lib/datadog/di/transport/http/client.rb +47 -0
  248. data/lib/datadog/di/transport/http/diagnostics.rb +65 -0
  249. data/lib/datadog/di/transport/http/input.rb +77 -0
  250. data/lib/datadog/di/transport/http.rb +57 -0
  251. data/lib/datadog/di/transport/input.rb +70 -0
  252. data/lib/datadog/di/utils.rb +103 -0
  253. data/lib/datadog/di.rb +14 -76
  254. data/lib/datadog/error_tracking/collector.rb +87 -0
  255. data/lib/datadog/error_tracking/component.rb +167 -0
  256. data/lib/datadog/error_tracking/configuration/settings.rb +63 -0
  257. data/lib/datadog/error_tracking/configuration.rb +11 -0
  258. data/lib/datadog/error_tracking/ext.rb +18 -0
  259. data/lib/datadog/error_tracking/extensions.rb +16 -0
  260. data/lib/datadog/error_tracking/filters.rb +77 -0
  261. data/lib/datadog/error_tracking.rb +18 -0
  262. data/lib/datadog/kit/appsec/events.rb +15 -3
  263. data/lib/datadog/kit/identity.rb +9 -5
  264. data/lib/datadog/opentelemetry/api/baggage.rb +90 -0
  265. data/lib/datadog/opentelemetry/api/baggage.rbs +26 -0
  266. data/lib/datadog/opentelemetry/api/context.rb +16 -2
  267. data/lib/datadog/opentelemetry/sdk/trace/span.rb +1 -1
  268. data/lib/datadog/opentelemetry.rb +2 -1
  269. data/lib/datadog/profiling/collectors/code_provenance.rb +18 -9
  270. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +4 -0
  271. data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +1 -0
  272. data/lib/datadog/profiling/collectors/info.rb +3 -0
  273. data/lib/datadog/profiling/collectors/thread_context.rb +17 -2
  274. data/lib/datadog/profiling/component.rb +64 -82
  275. data/lib/datadog/profiling/encoded_profile.rb +11 -0
  276. data/lib/datadog/profiling/exporter.rb +3 -4
  277. data/lib/datadog/profiling/ext.rb +0 -14
  278. data/lib/datadog/profiling/flush.rb +5 -8
  279. data/lib/datadog/profiling/http_transport.rb +8 -87
  280. data/lib/datadog/profiling/load_native_extension.rb +1 -33
  281. data/lib/datadog/profiling/profiler.rb +2 -0
  282. data/lib/datadog/profiling/scheduler.rb +10 -2
  283. data/lib/datadog/profiling/stack_recorder.rb +9 -9
  284. data/lib/datadog/profiling/tag_builder.rb +5 -41
  285. data/lib/datadog/profiling/tasks/setup.rb +2 -0
  286. data/lib/datadog/profiling.rb +6 -2
  287. data/lib/datadog/tracing/analytics.rb +1 -1
  288. data/lib/datadog/tracing/component.rb +16 -12
  289. data/lib/datadog/tracing/configuration/ext.rb +8 -1
  290. data/lib/datadog/tracing/configuration/settings.rb +22 -10
  291. data/lib/datadog/tracing/context_provider.rb +1 -1
  292. data/lib/datadog/tracing/contrib/action_cable/integration.rb +5 -2
  293. data/lib/datadog/tracing/contrib/action_mailer/integration.rb +6 -2
  294. data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +15 -0
  295. data/lib/datadog/tracing/contrib/action_pack/action_dispatch/instrumentation.rb +19 -12
  296. data/lib/datadog/tracing/contrib/action_pack/ext.rb +2 -0
  297. data/lib/datadog/tracing/contrib/action_pack/integration.rb +5 -2
  298. data/lib/datadog/tracing/contrib/action_view/integration.rb +5 -2
  299. data/lib/datadog/tracing/contrib/active_job/integration.rb +5 -2
  300. data/lib/datadog/tracing/contrib/active_record/integration.rb +7 -3
  301. data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +7 -2
  302. data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +36 -1
  303. data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +4 -0
  304. data/lib/datadog/tracing/contrib/active_support/cache/redis.rb +14 -4
  305. data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +10 -0
  306. data/lib/datadog/tracing/contrib/active_support/integration.rb +5 -2
  307. data/lib/datadog/tracing/contrib/auto_instrument.rb +2 -2
  308. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +10 -0
  309. data/lib/datadog/tracing/contrib/aws/integration.rb +3 -0
  310. data/lib/datadog/tracing/contrib/aws/parsed_context.rb +5 -1
  311. data/lib/datadog/tracing/contrib/concurrent_ruby/integration.rb +3 -0
  312. data/lib/datadog/tracing/contrib/configuration/settings.rb +1 -1
  313. data/lib/datadog/tracing/contrib/elasticsearch/configuration/settings.rb +4 -0
  314. data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +6 -1
  315. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +4 -5
  316. data/lib/datadog/tracing/contrib/excon/middleware.rb +5 -3
  317. data/lib/datadog/tracing/contrib/ext.rb +1 -0
  318. data/lib/datadog/tracing/contrib/extensions.rb +29 -3
  319. data/lib/datadog/tracing/contrib/faraday/middleware.rb +5 -3
  320. data/lib/datadog/tracing/contrib/graphql/configuration/error_extension_env_parser.rb +21 -0
  321. data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +11 -0
  322. data/lib/datadog/tracing/contrib/graphql/ext.rb +5 -0
  323. data/lib/datadog/tracing/contrib/graphql/unified_trace.rb +102 -11
  324. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +7 -1
  325. data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +3 -0
  326. data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +0 -15
  327. data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +4 -1
  328. data/lib/datadog/tracing/contrib/http/instrumentation.rb +6 -10
  329. data/lib/datadog/tracing/contrib/http/integration.rb +3 -0
  330. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +6 -16
  331. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +7 -15
  332. data/lib/datadog/tracing/contrib/httprb/integration.rb +3 -0
  333. data/lib/datadog/tracing/contrib/kafka/integration.rb +3 -0
  334. data/lib/datadog/tracing/contrib/karafka/configuration/settings.rb +27 -0
  335. data/lib/datadog/tracing/contrib/karafka/distributed/propagation.rb +48 -0
  336. data/lib/datadog/tracing/contrib/karafka/ext.rb +27 -0
  337. data/lib/datadog/tracing/contrib/karafka/integration.rb +45 -0
  338. data/lib/datadog/tracing/contrib/karafka/monitor.rb +66 -0
  339. data/lib/datadog/tracing/contrib/karafka/patcher.rb +71 -0
  340. data/lib/datadog/tracing/contrib/karafka.rb +37 -0
  341. data/lib/datadog/tracing/contrib/lograge/patcher.rb +4 -2
  342. data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +8 -0
  343. data/lib/datadog/tracing/contrib/mongodb/ext.rb +1 -0
  344. data/lib/datadog/tracing/contrib/mongodb/integration.rb +3 -0
  345. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +18 -1
  346. data/lib/datadog/tracing/contrib/opensearch/configuration/settings.rb +17 -0
  347. data/lib/datadog/tracing/contrib/opensearch/ext.rb +9 -0
  348. data/lib/datadog/tracing/contrib/opensearch/integration.rb +3 -0
  349. data/lib/datadog/tracing/contrib/opensearch/patcher.rb +5 -1
  350. data/lib/datadog/tracing/contrib/patcher.rb +5 -2
  351. data/lib/datadog/tracing/contrib/presto/integration.rb +3 -0
  352. data/lib/datadog/tracing/contrib/rack/header_collection.rb +11 -1
  353. data/lib/datadog/tracing/contrib/rack/integration.rb +2 -2
  354. data/lib/datadog/tracing/contrib/rack/middlewares.rb +1 -1
  355. data/lib/datadog/tracing/contrib/rack/request_queue.rb +1 -1
  356. data/lib/datadog/tracing/contrib/rails/framework.rb +2 -2
  357. data/lib/datadog/tracing/contrib/rails/patcher.rb +1 -1
  358. data/lib/datadog/tracing/contrib/rest_client/integration.rb +3 -0
  359. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +5 -3
  360. data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +6 -1
  361. data/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb +3 -0
  362. data/lib/datadog/tracing/contrib/sidekiq/ext.rb +1 -0
  363. data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +5 -2
  364. data/lib/datadog/tracing/contrib/span_attribute_schema.rb +6 -1
  365. data/lib/datadog/tracing/contrib/support.rb +28 -0
  366. data/lib/datadog/tracing/contrib.rb +1 -0
  367. data/lib/datadog/tracing/correlation.rb +9 -2
  368. data/lib/datadog/tracing/distributed/b3_multi.rb +1 -1
  369. data/lib/datadog/tracing/distributed/b3_single.rb +1 -1
  370. data/lib/datadog/tracing/distributed/baggage.rb +131 -0
  371. data/lib/datadog/tracing/distributed/datadog.rb +4 -2
  372. data/lib/datadog/tracing/distributed/propagation.rb +25 -4
  373. data/lib/datadog/tracing/distributed/propagation_policy.rb +42 -0
  374. data/lib/datadog/tracing/metadata/errors.rb +4 -4
  375. data/lib/datadog/tracing/metadata/ext.rb +5 -0
  376. data/lib/datadog/tracing/metadata/metastruct.rb +36 -0
  377. data/lib/datadog/tracing/metadata/metastruct_tagging.rb +42 -0
  378. data/lib/datadog/tracing/metadata.rb +2 -0
  379. data/lib/datadog/tracing/sampling/rate_sampler.rb +2 -1
  380. data/lib/datadog/tracing/sampling/span/rule.rb +0 -1
  381. data/lib/datadog/tracing/span.rb +22 -5
  382. data/lib/datadog/tracing/span_event.rb +124 -4
  383. data/lib/datadog/tracing/span_operation.rb +52 -16
  384. data/lib/datadog/tracing/sync_writer.rb +10 -6
  385. data/lib/datadog/tracing/trace_digest.rb +9 -2
  386. data/lib/datadog/tracing/trace_operation.rb +55 -27
  387. data/lib/datadog/tracing/trace_segment.rb +6 -4
  388. data/lib/datadog/tracing/tracer.rb +66 -14
  389. data/lib/datadog/tracing/transport/http/api.rb +5 -4
  390. data/lib/datadog/tracing/transport/http/client.rb +5 -4
  391. data/lib/datadog/tracing/transport/http/traces.rb +13 -44
  392. data/lib/datadog/tracing/transport/http.rb +13 -70
  393. data/lib/datadog/tracing/transport/serializable_trace.rb +31 -7
  394. data/lib/datadog/tracing/transport/trace_formatter.rb +7 -0
  395. data/lib/datadog/tracing/transport/traces.rb +47 -13
  396. data/lib/datadog/tracing/utils.rb +1 -1
  397. data/lib/datadog/tracing/workers/trace_writer.rb +8 -5
  398. data/lib/datadog/tracing/workers.rb +5 -4
  399. data/lib/datadog/tracing/writer.rb +10 -6
  400. data/lib/datadog/tracing.rb +16 -3
  401. data/lib/datadog/version.rb +2 -2
  402. data/lib/datadog.rb +2 -0
  403. metadata +149 -54
  404. data/ext/datadog_profiling_loader/datadog_profiling_loader.c +0 -142
  405. data/ext/datadog_profiling_loader/extconf.rb +0 -60
  406. data/lib/datadog/appsec/assets/waf_rules/processors.json +0 -92
  407. data/lib/datadog/appsec/assets/waf_rules/scanners.json +0 -114
  408. data/lib/datadog/appsec/contrib/devise/event.rb +0 -57
  409. data/lib/datadog/appsec/contrib/devise/patcher/authenticatable_patch.rb +0 -77
  410. data/lib/datadog/appsec/contrib/devise/patcher/registration_controller_patch.rb +0 -54
  411. data/lib/datadog/appsec/contrib/devise/resource.rb +0 -35
  412. data/lib/datadog/appsec/contrib/devise/tracking.rb +0 -57
  413. data/lib/datadog/appsec/contrib/graphql/reactive/multiplex.rb +0 -46
  414. data/lib/datadog/appsec/contrib/patcher.rb +0 -12
  415. data/lib/datadog/appsec/contrib/rack/reactive/request.rb +0 -69
  416. data/lib/datadog/appsec/contrib/rack/reactive/request_body.rb +0 -47
  417. data/lib/datadog/appsec/contrib/rack/reactive/response.rb +0 -53
  418. data/lib/datadog/appsec/contrib/rails/reactive/action.rb +0 -53
  419. data/lib/datadog/appsec/contrib/sinatra/ext.rb +0 -14
  420. data/lib/datadog/appsec/contrib/sinatra/reactive/routed.rb +0 -48
  421. data/lib/datadog/appsec/monitor/reactive/set_user.rb +0 -45
  422. data/lib/datadog/appsec/processor/actions.rb +0 -49
  423. data/lib/datadog/appsec/processor/context.rb +0 -107
  424. data/lib/datadog/appsec/processor/rule_merger.rb +0 -170
  425. data/lib/datadog/appsec/processor.rb +0 -106
  426. data/lib/datadog/appsec/reactive/address_hash.rb +0 -22
  427. data/lib/datadog/appsec/reactive/engine.rb +0 -47
  428. data/lib/datadog/appsec/reactive/operation.rb +0 -68
  429. data/lib/datadog/appsec/reactive/subscriber.rb +0 -19
  430. data/lib/datadog/appsec/scope.rb +0 -58
  431. data/lib/datadog/appsec/utils/trace_operation.rb +0 -15
  432. data/lib/datadog/core/crashtracking/agent_base_url.rb +0 -21
  433. data/lib/datadog/core/remote/transport/http/api/instance.rb +0 -39
  434. data/lib/datadog/core/remote/transport/http/api/spec.rb +0 -21
  435. data/lib/datadog/core/remote/transport/http/builder.rb +0 -219
  436. data/lib/datadog/core/telemetry/http/env.rb +0 -20
  437. data/lib/datadog/core/telemetry/http/ext.rb +0 -28
  438. data/lib/datadog/core/telemetry/http/response.rb +0 -70
  439. data/lib/datadog/core/telemetry/http/transport.rb +0 -90
  440. data/lib/datadog/di/transport.rb +0 -81
  441. data/lib/datadog/tracing/transport/http/api/spec.rb +0 -19
@@ -11,6 +11,8 @@ require_relative 'event'
11
11
  require_relative 'metadata'
12
12
  require_relative 'metadata/ext'
13
13
  require_relative 'span'
14
+ require_relative 'span_event'
15
+ require_relative 'span_link'
14
16
  require_relative 'utils'
15
17
 
16
18
  module Datadog
@@ -26,6 +28,7 @@ module Datadog
26
28
  # Span attributes
27
29
  # NOTE: In the future, we should drop the me
28
30
  attr_reader \
31
+ :logger,
29
32
  :end_time,
30
33
  :id,
31
34
  :name,
@@ -35,10 +38,12 @@ module Datadog
35
38
  :start_time,
36
39
  :trace_id,
37
40
  :type
41
+
38
42
  attr_accessor :links, :status, :span_events
39
43
 
40
44
  def initialize(
41
45
  name,
46
+ logger: Datadog.logger,
42
47
  events: nil,
43
48
  on_error: nil,
44
49
  parent_id: 0,
@@ -52,6 +57,8 @@ module Datadog
52
57
  span_events: nil,
53
58
  id: nil
54
59
  )
60
+ @logger = logger
61
+
55
62
  # Ensure dynamically created strings are UTF-8 encoded.
56
63
  #
57
64
  # All strings created in Ruby land are UTF-8. The only sources of non-UTF-8 string are:
@@ -88,11 +95,17 @@ module Datadog
88
95
  set_tags(tags) if tags
89
96
 
90
97
  # Some other SpanOperation-specific behavior
91
- @events = events || Events.new
98
+ @events = events || Events.new(logger: logger)
92
99
  @span = nil
93
100
 
94
- # Subscribe :on_error event
95
- @events.on_error.wrap_default(&on_error) if on_error.is_a?(Proc)
101
+ if on_error.nil?
102
+ # Nothing, default error handler is already set up.
103
+ elsif on_error.is_a?(Proc)
104
+ # Subscribe :on_error event
105
+ @events.on_error.wrap_default(&on_error)
106
+ else
107
+ logger.warn("on_error argument to SpanOperation ignored because is not a Proc: #{on_error}")
108
+ end
96
109
 
97
110
  # Start the span with start time, if given.
98
111
  start(start_time) if start_time
@@ -128,6 +141,10 @@ module Datadog
128
141
  @resource = resource.nil? ? nil : Core::Utils.utf8_encode(resource) # Allow this to be explicitly set to nil
129
142
  end
130
143
 
144
+ def get_collector_or_initialize
145
+ @collector ||= yield
146
+ end
147
+
131
148
  def measure
132
149
  raise ArgumentError, 'Must provide block to measure!' unless block_given?
133
150
  # TODO: Should we just invoke the block and skip tracing instead?
@@ -141,7 +158,7 @@ module Datadog
141
158
  begin
142
159
  start
143
160
  rescue StandardError => e
144
- Datadog.logger.debug { "Failed to start span: #{e}" }
161
+ logger.debug { "Failed to start span: #{e}" }
145
162
  ensure
146
163
  # We should yield to the provided block when possible, as this
147
164
  # block is application code that we don't want to hinder.
@@ -159,7 +176,7 @@ module Datadog
159
176
  # Stop the span first, so timing is a more accurate.
160
177
  # If the span failed to start, timing may be inaccurate,
161
178
  # but this is not really a serious concern.
162
- stop
179
+ stop(exception: e)
163
180
 
164
181
  # Trigger the on_error event
165
182
  events.on_error.publish(self, e)
@@ -197,7 +214,10 @@ module Datadog
197
214
  end
198
215
 
199
216
  # Mark the span stopped at the current time
200
- def stop(stop_time = nil)
217
+ #
218
+ # steep:ignore:start
219
+ # Steep issue fixed in https://github.com/soutaro/steep/pull/1467
220
+ def stop(stop_time = nil, exception: nil)
201
221
  # A span should not be stopped twice. Note that this is not thread-safe,
202
222
  # stop is called from multiple threads, a given span might be stopped
203
223
  # several times. Again, one should not do this, so this test is more a
@@ -215,10 +235,11 @@ module Datadog
215
235
  @duration_end = stop_time.nil? ? duration_marker : nil
216
236
 
217
237
  # Trigger after_stop event
218
- events.after_stop.publish(self)
238
+ events.after_stop.publish(self, exception)
219
239
 
220
240
  self
221
241
  end
242
+ # steep:ignore:end
222
243
 
223
244
  # Return whether the duration is started or not
224
245
  def started?
@@ -230,6 +251,10 @@ module Datadog
230
251
  !@end_time.nil?
231
252
  end
232
253
 
254
+ def root?
255
+ parent_id == 0
256
+ end
257
+
233
258
  # for backwards compatibility
234
259
  def start_time=(time)
235
260
  time.tap { start(time) }
@@ -263,7 +288,8 @@ module Datadog
263
288
 
264
289
  def duration
265
290
  return @duration_end - @duration_start if @duration_start && @duration_end
266
- return @end_time - @start_time if @start_time && @end_time
291
+
292
+ @end_time - @start_time if @start_time && @end_time
267
293
  end
268
294
 
269
295
  def set_error(e)
@@ -283,6 +309,7 @@ module Datadog
283
309
  id: @id,
284
310
  meta: meta,
285
311
  metrics: metrics,
312
+ metastruct: metastruct,
286
313
  name: @name,
287
314
  parent_id: @parent_id,
288
315
  resource: @resource,
@@ -322,12 +349,15 @@ module Datadog
322
349
  q.text "#{key} => #{value}"
323
350
  end
324
351
  end
325
- q.group(2, 'Metrics: [', ']') do
352
+ q.group(2, 'Metrics: [', "]\n") do
326
353
  q.breakable
327
354
  q.seplist metrics.each do |key, value|
328
355
  q.text "#{key} => #{value}"
329
356
  end
330
357
  end
358
+ q.group(2, 'Metastruct: [', ']') do
359
+ metastruct.pretty_print(q)
360
+ end
331
361
  end
332
362
  end
333
363
 
@@ -338,11 +368,13 @@ module Datadog
338
368
  DEFAULT_ON_ERROR = proc { |span_op, error| span_op.set_error(error) unless span_op.nil? }
339
369
 
340
370
  attr_reader \
371
+ :logger,
341
372
  :after_finish,
342
373
  :after_stop,
343
374
  :before_start
344
375
 
345
- def initialize(on_error: nil)
376
+ def initialize(logger: Datadog.logger, on_error: nil)
377
+ @logger = logger
346
378
  @after_finish = AfterFinish.new
347
379
  @after_stop = AfterStop.new
348
380
  @before_start = BeforeStart.new
@@ -351,7 +383,7 @@ module Datadog
351
383
  # This event is lazily initialized as error paths
352
384
  # are normally less common that non-error paths.
353
385
  def on_error
354
- @on_error ||= OnError.new(DEFAULT_ON_ERROR)
386
+ @on_error ||= OnError.new(DEFAULT_ON_ERROR, logger: logger)
355
387
  end
356
388
 
357
389
  # Triggered when the span is finished, regardless of error.
@@ -377,10 +409,13 @@ module Datadog
377
409
 
378
410
  # Triggered when the span raises an error during measurement.
379
411
  class OnError
380
- def initialize(default)
412
+ def initialize(default, logger: Datadog.logger)
381
413
  @handler = default
414
+ @logger = logger
382
415
  end
383
416
 
417
+ attr_reader :logger
418
+
384
419
  # Call custom error handler but fallback to default behavior on failure.
385
420
 
386
421
  # DEV: Revisit this before full 1.0 release.
@@ -394,9 +429,9 @@ module Datadog
394
429
  begin
395
430
  yield(op, error)
396
431
  rescue StandardError => e
397
- Datadog.logger.debug do
432
+ logger.debug do
398
433
  "Custom on_error handler #{@handler} failed, using fallback behavior. \
399
- Cause: #{e.class.name} #{e.message} Location: #{Array(e.backtrace).first}"
434
+ Cause: #{e.class}: #{e} Location: #{Array(e.backtrace).first}"
400
435
  end
401
436
 
402
437
  original.call(op, error) if original
@@ -408,8 +443,8 @@ module Datadog
408
443
  begin
409
444
  @handler.call(*args)
410
445
  rescue StandardError => e
411
- Datadog.logger.debug do
412
- "Error in on_error handler '#{@default}': #{e.class.name} #{e.message} at #{Array(e.backtrace).first}"
446
+ logger.debug do
447
+ "Error in on_error handler '#{@default}': #{e.class}: #{e} at #{Array(e.backtrace).first}"
413
448
  end
414
449
  end
415
450
 
@@ -450,6 +485,7 @@ module Datadog
450
485
  id: @id,
451
486
  meta: Core::Utils::SafeDup.frozen_or_dup(meta),
452
487
  metrics: Core::Utils::SafeDup.frozen_or_dup(metrics),
488
+ metastruct: Core::Utils::SafeDup.frozen_or_dup(metastruct),
453
489
  parent_id: @parent_id,
454
490
  resource: @resource,
455
491
  service: @service,
@@ -17,18 +17,22 @@ module Datadog
17
17
  # @public_api
18
18
  class SyncWriter
19
19
  attr_reader \
20
+ :logger,
20
21
  :events,
21
- :transport
22
+ :transport,
23
+ :agent_settings
22
24
 
23
25
  # @param [Datadog::Tracing::Transport::Traces::Transport] transport a custom transport instance.
24
26
  # If provided, overrides `transport_options` and `agent_settings`.
25
27
  # @param [Hash<Symbol,Object>] transport_options options for the default transport instance.
26
- # @param [Datadog::Tracing::Configuration::AgentSettingsResolver::AgentSettings] agent_settings agent options for
28
+ # @param [Datadog::Tracing::Configuration::AgentSettings] agent_settings agent options for
27
29
  # the default transport instance.
28
- def initialize(transport: nil, transport_options: {}, agent_settings: nil)
30
+ def initialize(transport: nil, transport_options: {}, agent_settings: nil, logger: Datadog.logger)
31
+ @logger = logger
32
+ @agent_settings = agent_settings
33
+
29
34
  @transport = transport || begin
30
- transport_options[:agent_settings] = agent_settings if agent_settings
31
- Transport::HTTP.default(**transport_options)
35
+ Transport::HTTP.default(agent_settings: agent_settings, logger: logger, **transport_options)
32
36
  end
33
37
 
34
38
  @events = Writer::Events.new
@@ -40,7 +44,7 @@ module Datadog
40
44
  def write(trace)
41
45
  flush_trace(trace)
42
46
  rescue => e
43
- Datadog.logger.debug(e)
47
+ logger.debug(e)
44
48
  end
45
49
 
46
50
  # Does nothing.
@@ -80,6 +80,9 @@ module Datadog
80
80
  # This allows later propagation to include those unknown fields, as they can represent future versions of the spec
81
81
  # sending data through this service. This value ends in a trailing `;` to facilitate serialization.
82
82
  # @return [String]
83
+ # @!attribute [r] baggage
84
+ # The W3C "baggage" extracted from a distributed context. This field is a hash of key/value pairs.
85
+ # @return [Hash<String,String>]
83
86
  # TODO: The documentation for the last attribute above won't be rendered.
84
87
  # TODO: This might be a YARD bug as adding an attribute, making it now second-last attribute, renders correctly.
85
88
  attr_reader \
@@ -102,7 +105,8 @@ module Datadog
102
105
  :trace_flags,
103
106
  :trace_state,
104
107
  :trace_state_unknown_fields,
105
- :span_remote
108
+ :span_remote,
109
+ :baggage
106
110
 
107
111
  def initialize(
108
112
  span_id: nil,
@@ -124,7 +128,8 @@ module Datadog
124
128
  trace_flags: nil,
125
129
  trace_state: nil,
126
130
  trace_state_unknown_fields: nil,
127
- span_remote: true
131
+ span_remote: true,
132
+ baggage: nil
128
133
  )
129
134
  @span_id = span_id
130
135
  @span_name = span_name && span_name.dup.freeze
@@ -146,6 +151,7 @@ module Datadog
146
151
  @trace_state = trace_state && trace_state.dup.freeze
147
152
  @trace_state_unknown_fields = trace_state_unknown_fields && trace_state_unknown_fields.dup.freeze
148
153
  @span_remote = span_remote
154
+ @baggage = baggage && baggage.dup.freeze
149
155
  freeze
150
156
  end
151
157
 
@@ -177,6 +183,7 @@ module Datadog
177
183
  trace_state: trace_state,
178
184
  trace_state_unknown_fields: trace_state_unknown_fields,
179
185
  span_remote: span_remote,
186
+ baggage: baggage
180
187
  }.merge!(field_value_pairs)
181
188
  )
182
189
  end
@@ -2,7 +2,6 @@
2
2
 
3
3
  require_relative '../core/environment/identity'
4
4
  require_relative '../core/utils'
5
- require_relative 'tracer'
6
5
  require_relative 'event'
7
6
  require_relative 'metadata/tagging'
8
7
  require_relative 'sampling/ext'
@@ -37,9 +36,11 @@ module Datadog
37
36
  :rule_sample_rate,
38
37
  :sample_rate,
39
38
  :sampling_priority,
40
- :remote_parent
39
+ :remote_parent,
40
+ :baggage
41
41
 
42
42
  attr_reader \
43
+ :logger,
43
44
  :active_span_count,
44
45
  :active_span,
45
46
  :id,
@@ -55,6 +56,7 @@ module Datadog
55
56
  :service
56
57
 
57
58
  def initialize(
59
+ logger: Datadog.logger,
58
60
  agent_sample_rate: nil,
59
61
  events: nil,
60
62
  hostname: nil,
@@ -71,19 +73,22 @@ module Datadog
71
73
  sampling_priority: nil,
72
74
  service: nil,
73
75
  profiling_enabled: nil,
76
+ apm_tracing_enabled: nil,
74
77
  tags: nil,
75
78
  metrics: nil,
76
79
  trace_state: nil,
77
80
  trace_state_unknown_fields: nil,
78
81
  remote_parent: false,
79
- tracer: nil
80
-
82
+ tracer: nil, # DEV-3.0: deprecated, remove in 3.0
83
+ baggage: nil
81
84
  )
85
+ @logger = logger
86
+
82
87
  # Attributes
83
88
  @id = id || Tracing::Utils::TraceId.next_id
84
89
  @max_length = max_length || DEFAULT_MAX_LENGTH
85
90
  @parent_span_id = parent_span_id
86
- @sampled = sampled.nil? ? true : sampled
91
+ @sampled = sampled.nil? || sampled
87
92
  @remote_parent = remote_parent
88
93
 
89
94
  # Tags
@@ -98,9 +103,10 @@ module Datadog
98
103
  @sampling_priority = sampling_priority
99
104
  @service = service
100
105
  @profiling_enabled = profiling_enabled
106
+ @apm_tracing_enabled = apm_tracing_enabled
101
107
  @trace_state = trace_state
102
108
  @trace_state_unknown_fields = trace_state_unknown_fields
103
- @tracer = tracer
109
+ @baggage = baggage
104
110
 
105
111
  # Generic tags
106
112
  set_tags(tags) if tags
@@ -173,6 +179,12 @@ module Datadog
173
179
  super || (root_span && root_span.get_metric(key))
174
180
  end
175
181
 
182
+ def set_distributed_source(product_bit)
183
+ source = get_tag(Metadata::Ext::Distributed::TAG_TRACE_SOURCE)&.to_i(16) || 0
184
+ source |= product_bit
185
+ set_tag(Metadata::Ext::Distributed::TAG_TRACE_SOURCE, format('%02X', source))
186
+ end
187
+
176
188
  def tags
177
189
  all_tags = {}
178
190
  all_tags.merge!(root_span&.tags || {}) if root_span
@@ -194,6 +206,7 @@ module Datadog
194
206
 
195
207
  def measure(
196
208
  op_name,
209
+ logger: Datadog.logger,
197
210
  events: nil,
198
211
  on_error: nil,
199
212
  resource: nil,
@@ -207,7 +220,9 @@ module Datadog
207
220
  # Don't allow more span measurements if the
208
221
  # trace is already completed. Prevents multiple
209
222
  # root spans with parent_span_id = 0.
210
- return yield(SpanOperation.new(op_name), TraceOperation.new) if finished? || full?
223
+ return yield( # rubocop:disable Style/MultilineIfModifier
224
+ SpanOperation.new(op_name, logger: logger),
225
+ TraceOperation.new(logger: logger)) if finished? || full?
211
226
 
212
227
  # Create new span
213
228
  span_op = build_span(
@@ -228,6 +243,7 @@ module Datadog
228
243
 
229
244
  def build_span(
230
245
  op_name,
246
+ logger: Datadog.logger,
231
247
  events: nil,
232
248
  on_error: nil,
233
249
  resource: nil,
@@ -249,7 +265,7 @@ module Datadog
249
265
  parent_id = parent ? parent.id : @parent_span_id || 0
250
266
 
251
267
  # Build events
252
- events ||= SpanOperation::Events.new
268
+ events ||= SpanOperation::Events.new(logger: logger)
253
269
 
254
270
  # Before start: activate the span, publish events.
255
271
  events.before_start.subscribe do |span_op|
@@ -264,6 +280,7 @@ module Datadog
264
280
  # Build a new span operation
265
281
  SpanOperation.new(
266
282
  op_name,
283
+ logger: logger,
267
284
  events: events,
268
285
  on_error: on_error,
269
286
  parent_id: parent_id,
@@ -276,10 +293,10 @@ module Datadog
276
293
  id: id
277
294
  )
278
295
  rescue StandardError => e
279
- Datadog.logger.debug { "Failed to build new span: #{e}" }
296
+ logger.debug { "Failed to build new span: #{e}" }
280
297
 
281
298
  # Return dummy span
282
- SpanOperation.new(op_name)
299
+ SpanOperation.new(op_name, logger: logger)
283
300
  end
284
301
  end
285
302
 
@@ -311,14 +328,14 @@ module Datadog
311
328
  span_id = @active_span && @active_span.id
312
329
  span_id ||= @parent_span_id unless finished?
313
330
  # sample the trace_operation with the tracer
314
- @tracer&.sample_trace(self) unless sampling_priority
331
+ events.trace_propagated.publish(self)
315
332
 
316
333
  TraceDigest.new(
317
334
  span_id: span_id,
318
- span_name: (@active_span && @active_span.name),
319
- span_resource: (@active_span && @active_span.resource),
320
- span_service: (@active_span && @active_span.service),
321
- span_type: (@active_span && @active_span.type),
335
+ span_name: @active_span && @active_span.name,
336
+ span_resource: @active_span && @active_span.resource,
337
+ span_service: @active_span && @active_span.service,
338
+ span_type: @active_span && @active_span.type,
322
339
  trace_distributed_tags: distributed_tags,
323
340
  trace_hostname: @hostname,
324
341
  trace_id: @id,
@@ -331,7 +348,8 @@ module Datadog
331
348
  trace_service: service,
332
349
  trace_state: @trace_state,
333
350
  trace_state_unknown_fields: @trace_state_unknown_fields,
334
- span_remote: (@remote_parent && @active_span.nil?),
351
+ span_remote: @remote_parent && @active_span.nil?,
352
+ baggage: @baggage.nil? || @baggage.empty? ? nil : @baggage
335
353
  ).freeze
336
354
  end
337
355
 
@@ -351,22 +369,22 @@ module Datadog
351
369
  def fork_clone
352
370
  self.class.new(
353
371
  agent_sample_rate: @agent_sample_rate,
354
- events: (@events && @events.dup),
355
- hostname: (@hostname && @hostname.dup),
372
+ events: @events && @events.dup,
373
+ hostname: @hostname && @hostname.dup,
356
374
  id: @id,
357
375
  max_length: @max_length,
358
- name: (name && name.dup),
359
- origin: (@origin && @origin.dup),
376
+ name: name && name.dup,
377
+ origin: @origin && @origin.dup,
360
378
  parent_span_id: (@active_span && @active_span.id) || @parent_span_id,
361
379
  rate_limiter_rate: @rate_limiter_rate,
362
- resource: (resource && resource.dup),
380
+ resource: resource && resource.dup,
363
381
  rule_sample_rate: @rule_sample_rate,
364
382
  sample_rate: @sample_rate,
365
383
  sampled: @sampled,
366
384
  sampling_priority: @sampling_priority,
367
- service: (service && service.dup),
368
- trace_state: (@trace_state && @trace_state.dup),
369
- trace_state_unknown_fields: (@trace_state_unknown_fields && @trace_state_unknown_fields.dup),
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,
370
388
  tags: meta.dup,
371
389
  metrics: metrics.dup,
372
390
  remote_parent: @remote_parent
@@ -380,12 +398,14 @@ module Datadog
380
398
  attr_reader \
381
399
  :span_before_start,
382
400
  :span_finished,
383
- :trace_finished
401
+ :trace_finished,
402
+ :trace_propagated
384
403
 
385
404
  def initialize
386
405
  @span_before_start = SpanBeforeStart.new
387
406
  @span_finished = SpanFinished.new
388
407
  @trace_finished = TraceFinished.new
408
+ @trace_propagated = TracePropagated.new
389
409
  end
390
410
 
391
411
  # Triggered before a span starts.
@@ -402,6 +422,13 @@ module Datadog
402
422
  end
403
423
  end
404
424
 
425
+ # Triggered when trace is being propagated between applications or contexts
426
+ class TracePropagated < Tracing::Event
427
+ def initialize
428
+ super(:trace_propagated)
429
+ end
430
+ end
431
+
405
432
  # Triggered when the trace finishes, regardless of error.
406
433
  class TraceFinished < Tracing::Event
407
434
  def initialize
@@ -454,7 +481,7 @@ module Datadog
454
481
  # Publish :span_before_start event
455
482
  events.span_before_start.publish(span_op, self)
456
483
  rescue StandardError => e
457
- Datadog.logger.debug { "Error starting span on trace: #{e} Backtrace: #{e.backtrace.first(3)}" }
484
+ logger.debug { "Error starting span on trace: #{e} Backtrace: #{e.backtrace.first(3)}" }
458
485
  end
459
486
  end
460
487
 
@@ -478,7 +505,7 @@ module Datadog
478
505
  # Publish :trace_finished event
479
506
  events.trace_finished.publish(self) if finished?
480
507
  rescue StandardError => e
481
- Datadog.logger.debug { "Error finishing span on trace: #{e} Backtrace: #{e.backtrace.first(3)}" }
508
+ logger.debug { "Error finishing span on trace: #{e} Backtrace: #{e.backtrace.first(3)}" }
482
509
  end
483
510
  end
484
511
 
@@ -510,6 +537,7 @@ module Datadog
510
537
  metrics: metrics,
511
538
  root_span_id: !partial ? root_span && root_span.id : nil,
512
539
  profiling_enabled: @profiling_enabled,
540
+ apm_tracing_enabled: @apm_tracing_enabled
513
541
  )
514
542
  end
515
543
 
@@ -34,7 +34,8 @@ module Datadog
34
34
  :sampling_decision_maker,
35
35
  :sampling_priority,
36
36
  :service,
37
- :profiling_enabled
37
+ :profiling_enabled,
38
+ :apm_tracing_enabled
38
39
 
39
40
  # rubocop:disable Metrics/CyclomaticComplexity
40
41
  # rubocop:disable Metrics/PerceivedComplexity
@@ -58,7 +59,8 @@ module Datadog
58
59
  service: nil,
59
60
  tags: nil,
60
61
  metrics: nil,
61
- profiling_enabled: nil
62
+ profiling_enabled: nil,
63
+ apm_tracing_enabled: nil
62
64
  )
63
65
  @id = id
64
66
  @root_span_id = root_span_id
@@ -85,6 +87,7 @@ module Datadog
85
87
  @sampling_priority = sampling_priority || sampling_priority_tag
86
88
  @service = Core::Utils::SafeDup.frozen_or_dup(service || service_tag)
87
89
  @profiling_enabled = profiling_enabled
90
+ @apm_tracing_enabled = apm_tracing_enabled
88
91
  end
89
92
  # rubocop:enable Metrics/PerceivedComplexity
90
93
  # rubocop:enable Metrics/CyclomaticComplexity
@@ -128,8 +131,7 @@ module Datadog
128
131
  end
129
132
 
130
133
  def sampled?
131
- sampling_priority == Sampling::Ext::Priority::AUTO_KEEP \
132
- || sampling_priority == Sampling::Ext::Priority::USER_KEEP
134
+ [Sampling::Ext::Priority::AUTO_KEEP, Sampling::Ext::Priority::USER_KEEP].include?(sampling_priority)
133
135
  end
134
136
 
135
137
  # Returns the high order part of the trace id as a hexadecimal string; the most significant 64 bits.