datadog 2.7.1 → 2.17.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 (417) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +310 -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 +66 -56
  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 +10 -10
  9. data/ext/datadog_profiling_native_extension/collectors_stack.h +2 -2
  10. data/ext/datadog_profiling_native_extension/collectors_thread_context.c +314 -145
  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 +7 -8
  16. data/ext/datadog_profiling_native_extension/gvl_profiling_helper.c +2 -0
  17. data/ext/datadog_profiling_native_extension/gvl_profiling_helper.h +0 -8
  18. data/ext/datadog_profiling_native_extension/heap_recorder.c +61 -174
  19. data/ext/datadog_profiling_native_extension/heap_recorder.h +2 -2
  20. data/ext/datadog_profiling_native_extension/http_transport.c +64 -98
  21. data/ext/datadog_profiling_native_extension/private_vm_api_access.c +68 -1
  22. data/ext/datadog_profiling_native_extension/private_vm_api_access.h +10 -1
  23. data/ext/datadog_profiling_native_extension/profiling.c +19 -8
  24. data/ext/datadog_profiling_native_extension/ruby_helpers.c +8 -8
  25. data/ext/datadog_profiling_native_extension/stack_recorder.c +84 -131
  26. data/ext/datadog_profiling_native_extension/stack_recorder.h +2 -2
  27. data/ext/datadog_profiling_native_extension/time_helpers.h +1 -1
  28. data/ext/datadog_profiling_native_extension/unsafe_api_calls_check.c +47 -0
  29. data/ext/datadog_profiling_native_extension/unsafe_api_calls_check.h +31 -0
  30. data/ext/libdatadog_api/crashtracker.c +17 -15
  31. data/ext/libdatadog_api/crashtracker.h +5 -0
  32. data/ext/libdatadog_api/datadog_ruby_common.c +1 -4
  33. data/ext/libdatadog_api/datadog_ruby_common.h +10 -0
  34. data/ext/libdatadog_api/init.c +15 -0
  35. data/ext/libdatadog_api/library_config.c +122 -0
  36. data/ext/libdatadog_api/library_config.h +19 -0
  37. data/ext/libdatadog_api/macos_development.md +3 -3
  38. data/ext/libdatadog_api/process_discovery.c +117 -0
  39. data/ext/libdatadog_api/process_discovery.h +5 -0
  40. data/ext/libdatadog_extconf_helpers.rb +1 -1
  41. data/lib/datadog/appsec/actions_handler/serializable_backtrace.rb +89 -0
  42. data/lib/datadog/appsec/actions_handler.rb +49 -0
  43. data/lib/datadog/appsec/anonymizer.rb +16 -0
  44. data/lib/datadog/appsec/api_security/lru_cache.rb +49 -0
  45. data/lib/datadog/appsec/api_security.rb +9 -0
  46. data/lib/datadog/appsec/assets/waf_rules/README.md +50 -5
  47. data/lib/datadog/appsec/assets/waf_rules/processors.json +239 -10
  48. data/lib/datadog/appsec/assets/waf_rules/recommended.json +355 -157
  49. data/lib/datadog/appsec/assets/waf_rules/scanners.json +926 -17
  50. data/lib/datadog/appsec/assets/waf_rules/strict.json +62 -32
  51. data/lib/datadog/appsec/autoload.rb +1 -1
  52. data/lib/datadog/appsec/component.rb +41 -33
  53. data/lib/datadog/appsec/compressed_json.rb +40 -0
  54. data/lib/datadog/appsec/configuration/settings.rb +152 -25
  55. data/lib/datadog/appsec/context.rb +74 -0
  56. data/lib/datadog/appsec/contrib/active_record/instrumentation.rb +92 -0
  57. data/lib/datadog/appsec/contrib/active_record/integration.rb +41 -0
  58. data/lib/datadog/appsec/contrib/active_record/patcher.rb +101 -0
  59. data/lib/datadog/appsec/contrib/auto_instrument.rb +1 -1
  60. data/lib/datadog/appsec/contrib/devise/configuration.rb +52 -0
  61. data/lib/datadog/appsec/contrib/devise/data_extractor.rb +78 -0
  62. data/lib/datadog/appsec/contrib/devise/ext.rb +22 -0
  63. data/lib/datadog/appsec/contrib/devise/integration.rb +1 -2
  64. data/lib/datadog/appsec/contrib/devise/patcher.rb +33 -25
  65. data/lib/datadog/appsec/contrib/devise/patches/signin_tracking_patch.rb +102 -0
  66. data/lib/datadog/appsec/contrib/devise/patches/signup_tracking_patch.rb +69 -0
  67. data/lib/datadog/appsec/contrib/devise/{patcher/rememberable_patch.rb → patches/skip_signin_tracking_patch.rb} +3 -3
  68. data/lib/datadog/appsec/contrib/devise/tracking_middleware.rb +106 -0
  69. data/lib/datadog/appsec/contrib/excon/integration.rb +41 -0
  70. data/lib/datadog/appsec/contrib/excon/patcher.rb +28 -0
  71. data/lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb +42 -0
  72. data/lib/datadog/appsec/contrib/faraday/connection_patch.rb +22 -0
  73. data/lib/datadog/appsec/contrib/faraday/integration.rb +42 -0
  74. data/lib/datadog/appsec/contrib/faraday/patcher.rb +53 -0
  75. data/lib/datadog/appsec/contrib/faraday/rack_builder_patch.rb +22 -0
  76. data/lib/datadog/appsec/contrib/faraday/ssrf_detection_middleware.rb +41 -0
  77. data/lib/datadog/appsec/contrib/graphql/appsec_trace.rb +1 -7
  78. data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +17 -30
  79. data/lib/datadog/appsec/contrib/graphql/integration.rb +1 -1
  80. data/lib/datadog/appsec/contrib/graphql/patcher.rb +0 -3
  81. data/lib/datadog/appsec/contrib/rack/ext.rb +34 -0
  82. data/lib/datadog/appsec/contrib/rack/gateway/response.rb +3 -3
  83. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +78 -98
  84. data/lib/datadog/appsec/contrib/rack/integration.rb +1 -1
  85. data/lib/datadog/appsec/contrib/rack/patcher.rb +0 -3
  86. data/lib/datadog/appsec/contrib/rack/request_body_middleware.rb +10 -11
  87. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +52 -68
  88. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +16 -33
  89. data/lib/datadog/appsec/contrib/rails/integration.rb +1 -1
  90. data/lib/datadog/appsec/contrib/rails/patcher.rb +25 -38
  91. data/lib/datadog/appsec/contrib/rest_client/integration.rb +45 -0
  92. data/lib/datadog/appsec/contrib/rest_client/patcher.rb +28 -0
  93. data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +38 -0
  94. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +31 -68
  95. data/lib/datadog/appsec/contrib/sinatra/integration.rb +1 -1
  96. data/lib/datadog/appsec/contrib/sinatra/patcher.rb +5 -31
  97. data/lib/datadog/appsec/event.rb +96 -135
  98. data/lib/datadog/appsec/ext.rb +12 -3
  99. data/lib/datadog/appsec/instrumentation/gateway/argument.rb +7 -2
  100. data/lib/datadog/appsec/instrumentation/gateway/middleware.rb +24 -0
  101. data/lib/datadog/appsec/instrumentation/gateway.rb +17 -22
  102. data/lib/datadog/appsec/metrics/collector.rb +38 -0
  103. data/lib/datadog/appsec/metrics/exporter.rb +35 -0
  104. data/lib/datadog/appsec/metrics/telemetry.rb +23 -0
  105. data/lib/datadog/appsec/metrics.rb +13 -0
  106. data/lib/datadog/appsec/monitor/gateway/watcher.rb +52 -32
  107. data/lib/datadog/appsec/processor/rule_loader.rb +26 -31
  108. data/lib/datadog/appsec/processor/rule_merger.rb +7 -6
  109. data/lib/datadog/appsec/processor.rb +5 -4
  110. data/lib/datadog/appsec/remote.rb +26 -12
  111. data/lib/datadog/appsec/response.rb +19 -85
  112. data/lib/datadog/appsec/security_engine/result.rb +67 -0
  113. data/lib/datadog/appsec/security_engine/runner.rb +88 -0
  114. data/lib/datadog/appsec/security_engine.rb +9 -0
  115. data/lib/datadog/appsec/security_event.rb +39 -0
  116. data/lib/datadog/appsec/utils.rb +0 -2
  117. data/lib/datadog/appsec.rb +23 -10
  118. data/lib/datadog/auto_instrument.rb +3 -0
  119. data/lib/datadog/core/buffer/random.rb +18 -2
  120. data/lib/datadog/core/configuration/agent_settings_resolver.rb +42 -14
  121. data/lib/datadog/core/configuration/agentless_settings_resolver.rb +176 -0
  122. data/lib/datadog/core/configuration/components.rb +76 -32
  123. data/lib/datadog/core/configuration/components_state.rb +23 -0
  124. data/lib/datadog/core/configuration/ext.rb +5 -1
  125. data/lib/datadog/core/configuration/option.rb +79 -43
  126. data/lib/datadog/core/configuration/option_definition.rb +6 -4
  127. data/lib/datadog/core/configuration/options.rb +3 -3
  128. data/lib/datadog/core/configuration/settings.rb +100 -41
  129. data/lib/datadog/core/configuration/stable_config.rb +23 -0
  130. data/lib/datadog/core/configuration.rb +43 -11
  131. data/lib/datadog/{tracing → core}/contrib/rails/utils.rb +1 -3
  132. data/lib/datadog/core/crashtracking/component.rb +4 -13
  133. data/lib/datadog/core/diagnostics/environment_logger.rb +1 -1
  134. data/lib/datadog/core/encoding.rb +17 -1
  135. data/lib/datadog/core/environment/agent_info.rb +78 -0
  136. data/lib/datadog/core/environment/cgroup.rb +10 -12
  137. data/lib/datadog/core/environment/container.rb +38 -40
  138. data/lib/datadog/core/environment/ext.rb +6 -6
  139. data/lib/datadog/core/environment/git.rb +1 -0
  140. data/lib/datadog/core/environment/identity.rb +3 -3
  141. data/lib/datadog/core/environment/platform.rb +3 -3
  142. data/lib/datadog/core/environment/variable_helpers.rb +1 -1
  143. data/lib/datadog/core/error.rb +11 -9
  144. data/lib/datadog/core/logger.rb +2 -2
  145. data/lib/datadog/core/metrics/client.rb +27 -27
  146. data/lib/datadog/core/metrics/logging.rb +5 -5
  147. data/lib/datadog/core/process_discovery.rb +32 -0
  148. data/lib/datadog/core/rate_limiter.rb +4 -2
  149. data/lib/datadog/core/remote/client/capabilities.rb +6 -0
  150. data/lib/datadog/core/remote/client.rb +107 -92
  151. data/lib/datadog/core/remote/component.rb +18 -19
  152. data/lib/datadog/core/remote/configuration/digest.rb +7 -7
  153. data/lib/datadog/core/remote/configuration/path.rb +1 -1
  154. data/lib/datadog/core/remote/configuration/repository.rb +2 -1
  155. data/lib/datadog/core/remote/negotiation.rb +9 -9
  156. data/lib/datadog/core/remote/transport/config.rb +4 -3
  157. data/lib/datadog/core/remote/transport/http/api.rb +13 -18
  158. data/lib/datadog/core/remote/transport/http/client.rb +5 -4
  159. data/lib/datadog/core/remote/transport/http/config.rb +27 -55
  160. data/lib/datadog/core/remote/transport/http/negotiation.rb +8 -51
  161. data/lib/datadog/core/remote/transport/http.rb +25 -94
  162. data/lib/datadog/core/remote/transport/negotiation.rb +17 -4
  163. data/lib/datadog/core/remote/worker.rb +10 -7
  164. data/lib/datadog/core/runtime/metrics.rb +12 -5
  165. data/lib/datadog/core/telemetry/component.rb +84 -49
  166. data/lib/datadog/core/telemetry/emitter.rb +23 -11
  167. data/lib/datadog/core/telemetry/event/app_client_configuration_change.rb +65 -0
  168. data/lib/datadog/core/telemetry/event/app_closing.rb +18 -0
  169. data/lib/datadog/core/telemetry/event/app_dependencies_loaded.rb +33 -0
  170. data/lib/datadog/core/telemetry/event/app_heartbeat.rb +18 -0
  171. data/lib/datadog/core/telemetry/event/app_integrations_change.rb +58 -0
  172. data/lib/datadog/core/telemetry/event/app_started.rb +179 -0
  173. data/lib/datadog/core/telemetry/event/base.rb +40 -0
  174. data/lib/datadog/core/telemetry/event/distributions.rb +18 -0
  175. data/lib/datadog/core/telemetry/event/generate_metrics.rb +43 -0
  176. data/lib/datadog/core/telemetry/event/log.rb +76 -0
  177. data/lib/datadog/core/telemetry/event/message_batch.rb +42 -0
  178. data/lib/datadog/core/telemetry/event/synth_app_client_configuration_change.rb +43 -0
  179. data/lib/datadog/core/telemetry/event.rb +17 -383
  180. data/lib/datadog/core/telemetry/ext.rb +1 -0
  181. data/lib/datadog/core/telemetry/http/adapters/net.rb +12 -97
  182. data/lib/datadog/core/telemetry/logger.rb +1 -1
  183. data/lib/datadog/core/telemetry/logging.rb +2 -2
  184. data/lib/datadog/core/telemetry/metric.rb +28 -6
  185. data/lib/datadog/core/telemetry/request.rb +4 -4
  186. data/lib/datadog/core/telemetry/transport/http/api.rb +43 -0
  187. data/lib/datadog/core/telemetry/transport/http/client.rb +49 -0
  188. data/lib/datadog/core/telemetry/transport/http/telemetry.rb +92 -0
  189. data/lib/datadog/core/telemetry/transport/http.rb +63 -0
  190. data/lib/datadog/core/telemetry/transport/telemetry.rb +51 -0
  191. data/lib/datadog/core/telemetry/worker.rb +128 -25
  192. data/lib/datadog/core/transport/http/adapters/test.rb +2 -1
  193. data/lib/datadog/core/transport/http/adapters/unix_socket.rb +1 -1
  194. data/lib/datadog/{tracing → core}/transport/http/api/instance.rb +18 -1
  195. data/lib/datadog/core/transport/http/api/spec.rb +36 -0
  196. data/lib/datadog/{tracing → core}/transport/http/builder.rb +53 -31
  197. data/lib/datadog/core/transport/http.rb +75 -0
  198. data/lib/datadog/core/transport/response.rb +4 -0
  199. data/lib/datadog/core/utils/at_fork_monkey_patch.rb +6 -6
  200. data/lib/datadog/core/utils/duration.rb +32 -32
  201. data/lib/datadog/core/utils/forking.rb +2 -2
  202. data/lib/datadog/core/utils/network.rb +6 -6
  203. data/lib/datadog/core/utils/only_once_successful.rb +16 -5
  204. data/lib/datadog/core/utils/time.rb +20 -0
  205. data/lib/datadog/core/utils/truncation.rb +21 -0
  206. data/lib/datadog/core/vendor/multipart-post/multipart/post/composite_read_io.rb +1 -1
  207. data/lib/datadog/core/vendor/multipart-post/multipart/post/multipartable.rb +8 -8
  208. data/lib/datadog/core/vendor/multipart-post/multipart/post/parts.rb +7 -7
  209. data/lib/datadog/core/worker.rb +1 -1
  210. data/lib/datadog/core/workers/async.rb +29 -12
  211. data/lib/datadog/core/workers/interval_loop.rb +12 -1
  212. data/lib/datadog/core/workers/runtime_metrics.rb +2 -2
  213. data/lib/datadog/core.rb +8 -0
  214. data/lib/datadog/di/base.rb +115 -0
  215. data/lib/datadog/di/boot.rb +34 -0
  216. data/lib/datadog/di/code_tracker.rb +26 -15
  217. data/lib/datadog/di/component.rb +23 -14
  218. data/lib/datadog/di/configuration/settings.rb +25 -1
  219. data/lib/datadog/di/contrib/active_record.rb +1 -0
  220. data/lib/datadog/di/contrib/railtie.rb +15 -0
  221. data/lib/datadog/di/contrib.rb +28 -0
  222. data/lib/datadog/di/error.rb +5 -0
  223. data/lib/datadog/di/instrumenter.rb +111 -20
  224. data/lib/datadog/di/logger.rb +30 -0
  225. data/lib/datadog/di/preload.rb +18 -0
  226. data/lib/datadog/di/probe.rb +14 -7
  227. data/lib/datadog/di/probe_builder.rb +1 -0
  228. data/lib/datadog/di/probe_manager.rb +11 -5
  229. data/lib/datadog/di/probe_notification_builder.rb +34 -8
  230. data/lib/datadog/di/probe_notifier_worker.rb +52 -26
  231. data/lib/datadog/di/redactor.rb +0 -1
  232. data/lib/datadog/di/remote.rb +147 -0
  233. data/lib/datadog/di/serializer.rb +14 -7
  234. data/lib/datadog/di/transport/diagnostics.rb +62 -0
  235. data/lib/datadog/di/transport/http/api.rb +42 -0
  236. data/lib/datadog/di/transport/http/client.rb +47 -0
  237. data/lib/datadog/di/transport/http/diagnostics.rb +65 -0
  238. data/lib/datadog/di/transport/http/input.rb +67 -0
  239. data/lib/datadog/di/transport/http.rb +57 -0
  240. data/lib/datadog/di/transport/input.rb +62 -0
  241. data/lib/datadog/di/utils.rb +103 -0
  242. data/lib/datadog/di.rb +14 -76
  243. data/lib/datadog/error_tracking/collector.rb +87 -0
  244. data/lib/datadog/error_tracking/component.rb +167 -0
  245. data/lib/datadog/error_tracking/configuration/settings.rb +63 -0
  246. data/lib/datadog/error_tracking/configuration.rb +11 -0
  247. data/lib/datadog/error_tracking/ext.rb +18 -0
  248. data/lib/datadog/error_tracking/extensions.rb +16 -0
  249. data/lib/datadog/error_tracking/filters.rb +77 -0
  250. data/lib/datadog/error_tracking.rb +18 -0
  251. data/lib/datadog/kit/appsec/events.rb +15 -3
  252. data/lib/datadog/kit/identity.rb +9 -5
  253. data/lib/datadog/opentelemetry/api/baggage.rb +90 -0
  254. data/lib/datadog/opentelemetry/api/baggage.rbs +26 -0
  255. data/lib/datadog/opentelemetry/api/context.rb +16 -2
  256. data/lib/datadog/opentelemetry/sdk/trace/span.rb +1 -1
  257. data/lib/datadog/opentelemetry.rb +2 -1
  258. data/lib/datadog/profiling/collectors/code_provenance.rb +1 -1
  259. data/lib/datadog/profiling/collectors/info.rb +3 -0
  260. data/lib/datadog/profiling/collectors/thread_context.rb +1 -1
  261. data/lib/datadog/profiling/component.rb +60 -76
  262. data/lib/datadog/profiling/encoded_profile.rb +11 -0
  263. data/lib/datadog/profiling/exporter.rb +3 -4
  264. data/lib/datadog/profiling/ext.rb +0 -2
  265. data/lib/datadog/profiling/flush.rb +5 -8
  266. data/lib/datadog/profiling/http_transport.rb +6 -85
  267. data/lib/datadog/profiling/load_native_extension.rb +1 -33
  268. data/lib/datadog/profiling/scheduler.rb +8 -1
  269. data/lib/datadog/profiling/stack_recorder.rb +4 -4
  270. data/lib/datadog/profiling/tag_builder.rb +1 -5
  271. data/lib/datadog/profiling.rb +6 -2
  272. data/lib/datadog/tracing/analytics.rb +1 -1
  273. data/lib/datadog/tracing/component.rb +16 -12
  274. data/lib/datadog/tracing/configuration/ext.rb +8 -1
  275. data/lib/datadog/tracing/configuration/settings.rb +22 -10
  276. data/lib/datadog/tracing/context_provider.rb +1 -1
  277. data/lib/datadog/tracing/contrib/action_cable/integration.rb +5 -2
  278. data/lib/datadog/tracing/contrib/action_mailer/integration.rb +6 -2
  279. data/lib/datadog/tracing/contrib/action_pack/integration.rb +5 -2
  280. data/lib/datadog/tracing/contrib/action_view/integration.rb +5 -2
  281. data/lib/datadog/tracing/contrib/active_job/integration.rb +5 -2
  282. data/lib/datadog/tracing/contrib/active_record/integration.rb +7 -3
  283. data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +7 -2
  284. data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +36 -1
  285. data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +4 -0
  286. data/lib/datadog/tracing/contrib/active_support/cache/redis.rb +14 -4
  287. data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +10 -0
  288. data/lib/datadog/tracing/contrib/active_support/integration.rb +5 -2
  289. data/lib/datadog/tracing/contrib/auto_instrument.rb +2 -2
  290. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +10 -0
  291. data/lib/datadog/tracing/contrib/aws/integration.rb +3 -0
  292. data/lib/datadog/tracing/contrib/aws/parsed_context.rb +5 -1
  293. data/lib/datadog/tracing/contrib/concurrent_ruby/integration.rb +3 -0
  294. data/lib/datadog/tracing/contrib/configuration/settings.rb +1 -1
  295. data/lib/datadog/tracing/contrib/elasticsearch/configuration/settings.rb +4 -0
  296. data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +6 -1
  297. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +4 -5
  298. data/lib/datadog/tracing/contrib/excon/middleware.rb +5 -3
  299. data/lib/datadog/tracing/contrib/ext.rb +1 -0
  300. data/lib/datadog/tracing/contrib/extensions.rb +29 -3
  301. data/lib/datadog/tracing/contrib/faraday/middleware.rb +5 -3
  302. data/lib/datadog/tracing/contrib/graphql/configuration/error_extension_env_parser.rb +21 -0
  303. data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +11 -0
  304. data/lib/datadog/tracing/contrib/graphql/ext.rb +5 -0
  305. data/lib/datadog/tracing/contrib/graphql/unified_trace.rb +102 -11
  306. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +7 -1
  307. data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +3 -0
  308. data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +0 -15
  309. data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +4 -1
  310. data/lib/datadog/tracing/contrib/http/instrumentation.rb +6 -10
  311. data/lib/datadog/tracing/contrib/http/integration.rb +3 -0
  312. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +6 -16
  313. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +7 -15
  314. data/lib/datadog/tracing/contrib/httprb/integration.rb +3 -0
  315. data/lib/datadog/tracing/contrib/kafka/integration.rb +3 -0
  316. data/lib/datadog/tracing/contrib/karafka/configuration/settings.rb +27 -0
  317. data/lib/datadog/tracing/contrib/karafka/distributed/propagation.rb +48 -0
  318. data/lib/datadog/tracing/contrib/karafka/ext.rb +27 -0
  319. data/lib/datadog/tracing/contrib/karafka/integration.rb +45 -0
  320. data/lib/datadog/tracing/contrib/karafka/monitor.rb +66 -0
  321. data/lib/datadog/tracing/contrib/karafka/patcher.rb +71 -0
  322. data/lib/datadog/tracing/contrib/karafka.rb +37 -0
  323. data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +8 -0
  324. data/lib/datadog/tracing/contrib/mongodb/ext.rb +1 -0
  325. data/lib/datadog/tracing/contrib/mongodb/integration.rb +3 -0
  326. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +18 -1
  327. data/lib/datadog/tracing/contrib/opensearch/configuration/settings.rb +17 -0
  328. data/lib/datadog/tracing/contrib/opensearch/ext.rb +9 -0
  329. data/lib/datadog/tracing/contrib/opensearch/integration.rb +3 -0
  330. data/lib/datadog/tracing/contrib/opensearch/patcher.rb +5 -1
  331. data/lib/datadog/tracing/contrib/patcher.rb +5 -2
  332. data/lib/datadog/tracing/contrib/presto/integration.rb +3 -0
  333. data/lib/datadog/tracing/contrib/rack/header_collection.rb +11 -1
  334. data/lib/datadog/tracing/contrib/rack/integration.rb +2 -2
  335. data/lib/datadog/tracing/contrib/rack/middlewares.rb +1 -1
  336. data/lib/datadog/tracing/contrib/rack/request_queue.rb +1 -1
  337. data/lib/datadog/tracing/contrib/rails/framework.rb +2 -2
  338. data/lib/datadog/tracing/contrib/rails/patcher.rb +1 -1
  339. data/lib/datadog/tracing/contrib/rest_client/integration.rb +3 -0
  340. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +5 -3
  341. data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +6 -1
  342. data/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb +3 -0
  343. data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +1 -1
  344. data/lib/datadog/tracing/contrib/span_attribute_schema.rb +6 -1
  345. data/lib/datadog/tracing/contrib/support.rb +28 -0
  346. data/lib/datadog/tracing/contrib.rb +1 -0
  347. data/lib/datadog/tracing/correlation.rb +9 -2
  348. data/lib/datadog/tracing/distributed/b3_multi.rb +1 -1
  349. data/lib/datadog/tracing/distributed/b3_single.rb +1 -1
  350. data/lib/datadog/tracing/distributed/baggage.rb +131 -0
  351. data/lib/datadog/tracing/distributed/datadog.rb +4 -2
  352. data/lib/datadog/tracing/distributed/propagation.rb +25 -4
  353. data/lib/datadog/tracing/distributed/propagation_policy.rb +42 -0
  354. data/lib/datadog/tracing/metadata/errors.rb +4 -4
  355. data/lib/datadog/tracing/metadata/ext.rb +5 -0
  356. data/lib/datadog/tracing/metadata/metastruct.rb +36 -0
  357. data/lib/datadog/tracing/metadata/metastruct_tagging.rb +42 -0
  358. data/lib/datadog/tracing/metadata.rb +2 -0
  359. data/lib/datadog/tracing/sampling/rate_sampler.rb +2 -1
  360. data/lib/datadog/tracing/sampling/span/rule.rb +0 -1
  361. data/lib/datadog/tracing/span.rb +22 -5
  362. data/lib/datadog/tracing/span_event.rb +124 -4
  363. data/lib/datadog/tracing/span_operation.rb +52 -16
  364. data/lib/datadog/tracing/sync_writer.rb +9 -5
  365. data/lib/datadog/tracing/trace_digest.rb +9 -2
  366. data/lib/datadog/tracing/trace_operation.rb +44 -24
  367. data/lib/datadog/tracing/trace_segment.rb +6 -4
  368. data/lib/datadog/tracing/tracer.rb +60 -12
  369. data/lib/datadog/tracing/transport/http/api.rb +5 -4
  370. data/lib/datadog/tracing/transport/http/client.rb +5 -4
  371. data/lib/datadog/tracing/transport/http/traces.rb +13 -44
  372. data/lib/datadog/tracing/transport/http.rb +13 -70
  373. data/lib/datadog/tracing/transport/serializable_trace.rb +31 -7
  374. data/lib/datadog/tracing/transport/trace_formatter.rb +7 -0
  375. data/lib/datadog/tracing/transport/traces.rb +47 -13
  376. data/lib/datadog/tracing/utils.rb +1 -1
  377. data/lib/datadog/tracing/workers/trace_writer.rb +8 -5
  378. data/lib/datadog/tracing/workers.rb +5 -4
  379. data/lib/datadog/tracing/writer.rb +10 -6
  380. data/lib/datadog/tracing.rb +16 -3
  381. data/lib/datadog/version.rb +2 -2
  382. data/lib/datadog.rb +2 -0
  383. metadata +143 -50
  384. data/ext/datadog_profiling_loader/datadog_profiling_loader.c +0 -142
  385. data/ext/datadog_profiling_loader/extconf.rb +0 -60
  386. data/lib/datadog/appsec/contrib/devise/event.rb +0 -57
  387. data/lib/datadog/appsec/contrib/devise/patcher/authenticatable_patch.rb +0 -77
  388. data/lib/datadog/appsec/contrib/devise/patcher/registration_controller_patch.rb +0 -54
  389. data/lib/datadog/appsec/contrib/devise/resource.rb +0 -35
  390. data/lib/datadog/appsec/contrib/devise/tracking.rb +0 -57
  391. data/lib/datadog/appsec/contrib/graphql/reactive/multiplex.rb +0 -46
  392. data/lib/datadog/appsec/contrib/patcher.rb +0 -12
  393. data/lib/datadog/appsec/contrib/rack/reactive/request.rb +0 -69
  394. data/lib/datadog/appsec/contrib/rack/reactive/request_body.rb +0 -47
  395. data/lib/datadog/appsec/contrib/rack/reactive/response.rb +0 -53
  396. data/lib/datadog/appsec/contrib/rails/reactive/action.rb +0 -53
  397. data/lib/datadog/appsec/contrib/sinatra/ext.rb +0 -14
  398. data/lib/datadog/appsec/contrib/sinatra/reactive/routed.rb +0 -48
  399. data/lib/datadog/appsec/monitor/reactive/set_user.rb +0 -45
  400. data/lib/datadog/appsec/processor/actions.rb +0 -49
  401. data/lib/datadog/appsec/processor/context.rb +0 -107
  402. data/lib/datadog/appsec/reactive/address_hash.rb +0 -22
  403. data/lib/datadog/appsec/reactive/engine.rb +0 -47
  404. data/lib/datadog/appsec/reactive/operation.rb +0 -68
  405. data/lib/datadog/appsec/reactive/subscriber.rb +0 -19
  406. data/lib/datadog/appsec/scope.rb +0 -58
  407. data/lib/datadog/appsec/utils/trace_operation.rb +0 -15
  408. data/lib/datadog/core/crashtracking/agent_base_url.rb +0 -21
  409. data/lib/datadog/core/remote/transport/http/api/instance.rb +0 -39
  410. data/lib/datadog/core/remote/transport/http/api/spec.rb +0 -21
  411. data/lib/datadog/core/remote/transport/http/builder.rb +0 -219
  412. data/lib/datadog/core/telemetry/http/env.rb +0 -20
  413. data/lib/datadog/core/telemetry/http/ext.rb +0 -28
  414. data/lib/datadog/core/telemetry/http/response.rb +0 -70
  415. data/lib/datadog/core/telemetry/http/transport.rb +0 -90
  416. data/lib/datadog/di/transport.rb +0 -81
  417. data/lib/datadog/tracing/transport/http/api/spec.rb +0 -19
@@ -19,23 +19,143 @@ module Datadog
19
19
  # @return [Integer]
20
20
  attr_reader :time_unix_nano
21
21
 
22
+ # TODO: Accept {Time} as the time_unix_nano parameter, possibly in addition to the current nano integer.
22
23
  def initialize(
23
24
  name,
24
25
  attributes: nil,
25
26
  time_unix_nano: nil
26
27
  )
27
28
  @name = name
28
- @attributes = attributes || {}
29
+
30
+ @attributes = attributes.dup || {}
31
+ validate_attributes!(@attributes)
32
+ @attributes.transform_keys!(&:to_s)
33
+
29
34
  # OpenTelemetry SDK stores span event timestamps in nanoseconds (not seconds).
30
35
  # We will do the same here to avoid unnecessary conversions and inconsistencies.
31
- @time_unix_nano = time_unix_nano || (Time.now.to_r * 1_000_000_000).to_i
36
+ @time_unix_nano = time_unix_nano || (Core::Utils::Time.now.to_r * 1_000_000_000).to_i
32
37
  end
33
38
 
39
+ # Converts the span event into a hash to be used by with the span tag serialization
40
+ # (`span.set_tag('events) = [event.to_hash]`). This serialization format has the drawback
41
+ # of being limiting span events to the size limit of a span tag.
42
+ # All Datadog agents support this format.
34
43
  def to_hash
35
- h = { name: @name, time_unix_nano: @time_unix_nano }
36
- h[:attributes] = attributes unless @attributes.empty?
44
+ h = { 'name' => @name, 'time_unix_nano' => @time_unix_nano }
45
+ h['attributes'] = @attributes unless @attributes.empty?
46
+ h
47
+ end
48
+
49
+ # Converts the span event into a hash to be used by the MessagePack serialization as a
50
+ # top-level span field (span.span_events = [event.to_native_format]).
51
+ # This serialization format removes the serialization limitations of the `span.set_tag('events)` approach,
52
+ # but is only supported by newer version of the Datadog agent.
53
+ def to_native_format
54
+ h = { 'name' => @name, 'time_unix_nano' => @time_unix_nano }
55
+
56
+ attr = {}
57
+ @attributes.each do |key, value|
58
+ attr[key] = if value.is_a?(Array)
59
+ { type: ARRAY_TYPE, array_value: value.map { |v| serialize_native_attribute(v) } }
60
+ else
61
+ serialize_native_attribute(value)
62
+ end
63
+ end
64
+
65
+ h['attributes'] = attr unless @attributes.empty?
66
+
37
67
  h
38
68
  end
69
+
70
+ private
71
+
72
+ MIN_INT64_SIGNED = -2**63
73
+ MAX_INT64_SIGNED = 2 << 63 - 1
74
+
75
+ # Checks the attributes hash to ensure it only contains serializable values.
76
+ # Invalid values are removed from the hash.
77
+ def validate_attributes!(attributes)
78
+ attributes.select! do |key, value|
79
+ case value
80
+ when Array
81
+ next true if value.empty?
82
+
83
+ first = value.first
84
+ case first
85
+ when String, Integer, Float
86
+ first_type = first.class
87
+ if value.all? { |v| v.is_a?(first_type) }
88
+ value.all? { |v| validate_scalar_attribute!(key, v) }
89
+ else
90
+ Datadog.logger.warn("Attribute #{key} array must be homogenous: #{value}.")
91
+ false
92
+ end
93
+ when TrueClass, FalseClass
94
+ if value.all? { |v| v.is_a?(TrueClass) || v.is_a?(FalseClass) }
95
+ value.all? { |v| validate_scalar_attribute!(key, v) }
96
+ else
97
+ Datadog.logger.warn("Attribute #{key} array must be homogenous: #{value}.")
98
+ false
99
+ end
100
+ else
101
+ Datadog.logger.warn("Attribute #{key} must be a string, number, or boolean: #{value}.")
102
+ false
103
+ end
104
+ when String, Numeric, TrueClass, FalseClass
105
+ validate_scalar_attribute!(key, value)
106
+ else
107
+ Datadog.logger.warn("Attribute #{key} must be a string, number, boolean, or array: #{value}.")
108
+ false
109
+ end
110
+ end
111
+ end
112
+
113
+ def validate_scalar_attribute!(key, value)
114
+ case value
115
+ when String, TrueClass, FalseClass
116
+ true
117
+ when Integer
118
+ # Cannot be larger than signed 64-bit integer
119
+ if value < MIN_INT64_SIGNED || value > MAX_INT64_SIGNED
120
+ Datadog.logger.warn("Attribute #{key} must be within the range of a signed 64-bit integer: #{value}.")
121
+ false
122
+ else
123
+ true
124
+ end
125
+ when Float
126
+ # Has to be finite
127
+ return true if value.finite?
128
+
129
+ Datadog.logger.warn("Attribute #{key} must be a finite number: #{value}.")
130
+ false
131
+ else
132
+ Datadog.logger.warn("Attribute #{key} must be a string, number, or boolean: #{value}.")
133
+ false
134
+ end
135
+ end
136
+
137
+ STRING_TYPE = 0
138
+ BOOLEAN_TYPE = 1
139
+ INTEGER_TYPE = 2
140
+ DOUBLE_TYPE = 3
141
+ ARRAY_TYPE = 4
142
+
143
+ # Serializes individual scalar attributes into the native format.
144
+ def serialize_native_attribute(value)
145
+ case value
146
+ when String
147
+ { type: STRING_TYPE, string_value: value }
148
+ when TrueClass, FalseClass
149
+ { type: BOOLEAN_TYPE, bool_value: value }
150
+ when Integer
151
+ { type: INTEGER_TYPE, int_value: value }
152
+ when Float
153
+ { type: DOUBLE_TYPE, double_value: value }
154
+ else
155
+ # This is technically unreachable due to the validation in #initialize.
156
+ raise ArgumentError, "Attribute must be a string, number, or boolean: #{value}."
157
+ end
158
+ end
39
159
  end
40
160
  end
41
161
  end
@@ -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
28
  # @param [Datadog::Tracing::Configuration::AgentSettingsResolver::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,
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,11 @@ 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
109
  @tracer = tracer
110
+ @baggage = baggage
104
111
 
105
112
  # Generic tags
106
113
  set_tags(tags) if tags
@@ -173,6 +180,12 @@ module Datadog
173
180
  super || (root_span && root_span.get_metric(key))
174
181
  end
175
182
 
183
+ def set_distributed_source(product_bit)
184
+ source = get_tag(Metadata::Ext::Distributed::TAG_TRACE_SOURCE)&.to_i(16) || 0
185
+ source |= product_bit
186
+ set_tag(Metadata::Ext::Distributed::TAG_TRACE_SOURCE, format('%02X', source))
187
+ end
188
+
176
189
  def tags
177
190
  all_tags = {}
178
191
  all_tags.merge!(root_span&.tags || {}) if root_span
@@ -194,6 +207,7 @@ module Datadog
194
207
 
195
208
  def measure(
196
209
  op_name,
210
+ logger: Datadog.logger,
197
211
  events: nil,
198
212
  on_error: nil,
199
213
  resource: nil,
@@ -207,7 +221,9 @@ module Datadog
207
221
  # Don't allow more span measurements if the
208
222
  # trace is already completed. Prevents multiple
209
223
  # root spans with parent_span_id = 0.
210
- return yield(SpanOperation.new(op_name), TraceOperation.new) if finished? || full?
224
+ return yield( # rubocop:disable Style/MultilineIfModifier
225
+ SpanOperation.new(op_name, logger: logger),
226
+ TraceOperation.new(logger: logger)) if finished? || full?
211
227
 
212
228
  # Create new span
213
229
  span_op = build_span(
@@ -228,6 +244,7 @@ module Datadog
228
244
 
229
245
  def build_span(
230
246
  op_name,
247
+ logger: Datadog.logger,
231
248
  events: nil,
232
249
  on_error: nil,
233
250
  resource: nil,
@@ -249,7 +266,7 @@ module Datadog
249
266
  parent_id = parent ? parent.id : @parent_span_id || 0
250
267
 
251
268
  # Build events
252
- events ||= SpanOperation::Events.new
269
+ events ||= SpanOperation::Events.new(logger: logger)
253
270
 
254
271
  # Before start: activate the span, publish events.
255
272
  events.before_start.subscribe do |span_op|
@@ -264,6 +281,7 @@ module Datadog
264
281
  # Build a new span operation
265
282
  SpanOperation.new(
266
283
  op_name,
284
+ logger: logger,
267
285
  events: events,
268
286
  on_error: on_error,
269
287
  parent_id: parent_id,
@@ -276,10 +294,10 @@ module Datadog
276
294
  id: id
277
295
  )
278
296
  rescue StandardError => e
279
- Datadog.logger.debug { "Failed to build new span: #{e}" }
297
+ logger.debug { "Failed to build new span: #{e}" }
280
298
 
281
299
  # Return dummy span
282
- SpanOperation.new(op_name)
300
+ SpanOperation.new(op_name, logger: logger)
283
301
  end
284
302
  end
285
303
 
@@ -315,10 +333,10 @@ module Datadog
315
333
 
316
334
  TraceDigest.new(
317
335
  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),
336
+ span_name: @active_span && @active_span.name,
337
+ span_resource: @active_span && @active_span.resource,
338
+ span_service: @active_span && @active_span.service,
339
+ span_type: @active_span && @active_span.type,
322
340
  trace_distributed_tags: distributed_tags,
323
341
  trace_hostname: @hostname,
324
342
  trace_id: @id,
@@ -331,7 +349,8 @@ module Datadog
331
349
  trace_service: service,
332
350
  trace_state: @trace_state,
333
351
  trace_state_unknown_fields: @trace_state_unknown_fields,
334
- span_remote: (@remote_parent && @active_span.nil?),
352
+ span_remote: @remote_parent && @active_span.nil?,
353
+ baggage: @baggage.nil? || @baggage.empty? ? nil : @baggage
335
354
  ).freeze
336
355
  end
337
356
 
@@ -351,22 +370,22 @@ module Datadog
351
370
  def fork_clone
352
371
  self.class.new(
353
372
  agent_sample_rate: @agent_sample_rate,
354
- events: (@events && @events.dup),
355
- hostname: (@hostname && @hostname.dup),
373
+ events: @events && @events.dup,
374
+ hostname: @hostname && @hostname.dup,
356
375
  id: @id,
357
376
  max_length: @max_length,
358
- name: (name && name.dup),
359
- origin: (@origin && @origin.dup),
377
+ name: name && name.dup,
378
+ origin: @origin && @origin.dup,
360
379
  parent_span_id: (@active_span && @active_span.id) || @parent_span_id,
361
380
  rate_limiter_rate: @rate_limiter_rate,
362
- resource: (resource && resource.dup),
381
+ resource: resource && resource.dup,
363
382
  rule_sample_rate: @rule_sample_rate,
364
383
  sample_rate: @sample_rate,
365
384
  sampled: @sampled,
366
385
  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),
386
+ service: service && service.dup,
387
+ trace_state: @trace_state && @trace_state.dup,
388
+ trace_state_unknown_fields: @trace_state_unknown_fields && @trace_state_unknown_fields.dup,
370
389
  tags: meta.dup,
371
390
  metrics: metrics.dup,
372
391
  remote_parent: @remote_parent
@@ -454,7 +473,7 @@ module Datadog
454
473
  # Publish :span_before_start event
455
474
  events.span_before_start.publish(span_op, self)
456
475
  rescue StandardError => e
457
- Datadog.logger.debug { "Error starting span on trace: #{e} Backtrace: #{e.backtrace.first(3)}" }
476
+ logger.debug { "Error starting span on trace: #{e} Backtrace: #{e.backtrace.first(3)}" }
458
477
  end
459
478
  end
460
479
 
@@ -478,7 +497,7 @@ module Datadog
478
497
  # Publish :trace_finished event
479
498
  events.trace_finished.publish(self) if finished?
480
499
  rescue StandardError => e
481
- Datadog.logger.debug { "Error finishing span on trace: #{e} Backtrace: #{e.backtrace.first(3)}" }
500
+ logger.debug { "Error finishing span on trace: #{e} Backtrace: #{e.backtrace.first(3)}" }
482
501
  end
483
502
  end
484
503
 
@@ -510,6 +529,7 @@ module Datadog
510
529
  metrics: metrics,
511
530
  root_span_id: !partial ? root_span && root_span.id : nil,
512
531
  profiling_enabled: @profiling_enabled,
532
+ apm_tracing_enabled: @apm_tracing_enabled
513
533
  )
514
534
  end
515
535