datadog 2.12.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 (302) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +154 -2
  3. data/ext/datadog_profiling_native_extension/collectors_thread_context.c +16 -14
  4. data/ext/datadog_profiling_native_extension/datadog_ruby_common.c +1 -4
  5. data/ext/datadog_profiling_native_extension/datadog_ruby_common.h +10 -0
  6. data/ext/datadog_profiling_native_extension/encoded_profile.c +79 -0
  7. data/ext/datadog_profiling_native_extension/encoded_profile.h +8 -0
  8. data/ext/datadog_profiling_native_extension/extconf.rb +3 -0
  9. data/ext/datadog_profiling_native_extension/heap_recorder.c +8 -1
  10. data/ext/datadog_profiling_native_extension/http_transport.c +60 -94
  11. data/ext/datadog_profiling_native_extension/private_vm_api_access.c +8 -0
  12. data/ext/datadog_profiling_native_extension/profiling.c +2 -0
  13. data/ext/datadog_profiling_native_extension/stack_recorder.c +23 -23
  14. data/ext/libdatadog_api/crashtracker.c +11 -12
  15. data/ext/libdatadog_api/crashtracker.h +5 -0
  16. data/ext/libdatadog_api/datadog_ruby_common.c +1 -4
  17. data/ext/libdatadog_api/datadog_ruby_common.h +10 -0
  18. data/ext/libdatadog_api/init.c +15 -0
  19. data/ext/libdatadog_api/library_config.c +122 -0
  20. data/ext/libdatadog_api/library_config.h +19 -0
  21. data/ext/libdatadog_api/macos_development.md +3 -3
  22. data/ext/libdatadog_api/process_discovery.c +117 -0
  23. data/ext/libdatadog_api/process_discovery.h +5 -0
  24. data/ext/libdatadog_extconf_helpers.rb +1 -1
  25. data/lib/datadog/appsec/actions_handler/serializable_backtrace.rb +89 -0
  26. data/lib/datadog/appsec/actions_handler.rb +24 -2
  27. data/lib/datadog/appsec/anonymizer.rb +16 -0
  28. data/lib/datadog/appsec/api_security/lru_cache.rb +49 -0
  29. data/lib/datadog/appsec/api_security.rb +9 -0
  30. data/lib/datadog/appsec/assets/waf_rules/README.md +50 -5
  31. data/lib/datadog/appsec/assets/waf_rules/processors.json +239 -10
  32. data/lib/datadog/appsec/assets/waf_rules/scanners.json +926 -17
  33. data/lib/datadog/appsec/autoload.rb +1 -1
  34. data/lib/datadog/appsec/component.rb +29 -20
  35. data/lib/datadog/appsec/compressed_json.rb +40 -0
  36. data/lib/datadog/appsec/configuration/settings.rb +93 -28
  37. data/lib/datadog/appsec/context.rb +1 -1
  38. data/lib/datadog/appsec/contrib/active_record/instrumentation.rb +10 -12
  39. data/lib/datadog/appsec/contrib/active_record/integration.rb +2 -2
  40. data/lib/datadog/appsec/contrib/active_record/patcher.rb +22 -22
  41. data/lib/datadog/appsec/contrib/auto_instrument.rb +1 -1
  42. data/lib/datadog/appsec/contrib/devise/configuration.rb +7 -31
  43. data/lib/datadog/appsec/contrib/devise/data_extractor.rb +78 -0
  44. data/lib/datadog/appsec/contrib/devise/ext.rb +22 -0
  45. data/lib/datadog/appsec/contrib/devise/integration.rb +1 -2
  46. data/lib/datadog/appsec/contrib/devise/patcher.rb +34 -23
  47. data/lib/datadog/appsec/contrib/devise/patches/signin_tracking_patch.rb +102 -0
  48. data/lib/datadog/appsec/contrib/devise/patches/signup_tracking_patch.rb +69 -0
  49. data/lib/datadog/appsec/contrib/devise/{patcher/rememberable_patch.rb → patches/skip_signin_tracking_patch.rb} +2 -2
  50. data/lib/datadog/appsec/contrib/devise/tracking_middleware.rb +106 -0
  51. data/lib/datadog/appsec/contrib/excon/integration.rb +1 -1
  52. data/lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb +9 -10
  53. data/lib/datadog/appsec/contrib/faraday/integration.rb +1 -1
  54. data/lib/datadog/appsec/contrib/faraday/ssrf_detection_middleware.rb +8 -9
  55. data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +8 -9
  56. data/lib/datadog/appsec/contrib/graphql/integration.rb +1 -1
  57. data/lib/datadog/appsec/contrib/rack/ext.rb +34 -0
  58. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +49 -32
  59. data/lib/datadog/appsec/contrib/rack/integration.rb +1 -1
  60. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +19 -18
  61. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +11 -13
  62. data/lib/datadog/appsec/contrib/rails/integration.rb +1 -1
  63. data/lib/datadog/appsec/contrib/rails/patcher.rb +21 -21
  64. data/lib/datadog/appsec/contrib/rest_client/integration.rb +1 -1
  65. data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +10 -11
  66. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +17 -23
  67. data/lib/datadog/appsec/contrib/sinatra/integration.rb +1 -1
  68. data/lib/datadog/appsec/event.rb +96 -135
  69. data/lib/datadog/appsec/ext.rb +4 -2
  70. data/lib/datadog/appsec/instrumentation/gateway/argument.rb +7 -2
  71. data/lib/datadog/appsec/instrumentation/gateway/middleware.rb +24 -0
  72. data/lib/datadog/appsec/instrumentation/gateway.rb +17 -22
  73. data/lib/datadog/appsec/metrics/telemetry.rb +1 -1
  74. data/lib/datadog/appsec/monitor/gateway/watcher.rb +49 -14
  75. data/lib/datadog/appsec/processor/rule_loader.rb +26 -28
  76. data/lib/datadog/appsec/processor/rule_merger.rb +7 -6
  77. data/lib/datadog/appsec/processor.rb +1 -1
  78. data/lib/datadog/appsec/remote.rb +23 -11
  79. data/lib/datadog/appsec/response.rb +6 -6
  80. data/lib/datadog/appsec/security_engine/runner.rb +3 -3
  81. data/lib/datadog/appsec/security_event.rb +39 -0
  82. data/lib/datadog/appsec/utils.rb +0 -2
  83. data/lib/datadog/appsec.rb +1 -1
  84. data/lib/datadog/core/buffer/random.rb +18 -2
  85. data/lib/datadog/core/configuration/agent_settings_resolver.rb +5 -5
  86. data/lib/datadog/core/configuration/agentless_settings_resolver.rb +176 -0
  87. data/lib/datadog/core/configuration/components.rb +50 -31
  88. data/lib/datadog/core/configuration/components_state.rb +23 -0
  89. data/lib/datadog/core/configuration/ext.rb +4 -0
  90. data/lib/datadog/core/configuration/option.rb +79 -43
  91. data/lib/datadog/core/configuration/option_definition.rb +4 -4
  92. data/lib/datadog/core/configuration/options.rb +3 -3
  93. data/lib/datadog/core/configuration/settings.rb +68 -35
  94. data/lib/datadog/core/configuration/stable_config.rb +23 -0
  95. data/lib/datadog/core/configuration.rb +40 -16
  96. data/lib/datadog/core/crashtracking/component.rb +3 -10
  97. data/lib/datadog/core/diagnostics/environment_logger.rb +1 -1
  98. data/lib/datadog/core/encoding.rb +1 -1
  99. data/lib/datadog/core/environment/agent_info.rb +4 -3
  100. data/lib/datadog/core/environment/cgroup.rb +10 -12
  101. data/lib/datadog/core/environment/container.rb +38 -40
  102. data/lib/datadog/core/environment/ext.rb +6 -6
  103. data/lib/datadog/core/environment/git.rb +1 -0
  104. data/lib/datadog/core/environment/identity.rb +3 -3
  105. data/lib/datadog/core/environment/platform.rb +3 -3
  106. data/lib/datadog/core/environment/variable_helpers.rb +1 -1
  107. data/lib/datadog/core/error.rb +11 -9
  108. data/lib/datadog/core/logger.rb +2 -2
  109. data/lib/datadog/core/metrics/client.rb +20 -21
  110. data/lib/datadog/core/metrics/logging.rb +5 -5
  111. data/lib/datadog/core/process_discovery.rb +32 -0
  112. data/lib/datadog/core/rate_limiter.rb +4 -2
  113. data/lib/datadog/core/remote/client.rb +40 -32
  114. data/lib/datadog/core/remote/component.rb +6 -9
  115. data/lib/datadog/core/remote/configuration/digest.rb +7 -7
  116. data/lib/datadog/core/remote/configuration/path.rb +1 -1
  117. data/lib/datadog/core/remote/configuration/repository.rb +2 -1
  118. data/lib/datadog/core/remote/negotiation.rb +9 -9
  119. data/lib/datadog/core/remote/transport/config.rb +4 -3
  120. data/lib/datadog/core/remote/transport/http/client.rb +5 -4
  121. data/lib/datadog/core/remote/transport/http/config.rb +27 -37
  122. data/lib/datadog/core/remote/transport/http/negotiation.rb +7 -33
  123. data/lib/datadog/core/remote/transport/http.rb +22 -57
  124. data/lib/datadog/core/remote/transport/negotiation.rb +4 -3
  125. data/lib/datadog/core/runtime/metrics.rb +12 -5
  126. data/lib/datadog/core/telemetry/component.rb +78 -53
  127. data/lib/datadog/core/telemetry/emitter.rb +23 -11
  128. data/lib/datadog/core/telemetry/event/app_client_configuration_change.rb +65 -0
  129. data/lib/datadog/core/telemetry/event/app_closing.rb +18 -0
  130. data/lib/datadog/core/telemetry/event/app_dependencies_loaded.rb +33 -0
  131. data/lib/datadog/core/telemetry/event/app_heartbeat.rb +18 -0
  132. data/lib/datadog/core/telemetry/event/app_integrations_change.rb +58 -0
  133. data/lib/datadog/core/telemetry/event/app_started.rb +179 -0
  134. data/lib/datadog/core/telemetry/event/base.rb +40 -0
  135. data/lib/datadog/core/telemetry/event/distributions.rb +18 -0
  136. data/lib/datadog/core/telemetry/event/generate_metrics.rb +43 -0
  137. data/lib/datadog/core/telemetry/event/log.rb +76 -0
  138. data/lib/datadog/core/telemetry/event/message_batch.rb +42 -0
  139. data/lib/datadog/core/telemetry/event/synth_app_client_configuration_change.rb +43 -0
  140. data/lib/datadog/core/telemetry/event.rb +17 -472
  141. data/lib/datadog/core/telemetry/http/adapters/net.rb +12 -97
  142. data/lib/datadog/core/telemetry/logger.rb +1 -1
  143. data/lib/datadog/core/telemetry/metric.rb +8 -8
  144. data/lib/datadog/core/telemetry/request.rb +4 -4
  145. data/lib/datadog/core/telemetry/transport/http/api.rb +43 -0
  146. data/lib/datadog/core/telemetry/transport/http/client.rb +49 -0
  147. data/lib/datadog/core/telemetry/transport/http/telemetry.rb +92 -0
  148. data/lib/datadog/core/telemetry/transport/http.rb +63 -0
  149. data/lib/datadog/core/telemetry/transport/telemetry.rb +51 -0
  150. data/lib/datadog/core/telemetry/worker.rb +90 -24
  151. data/lib/datadog/core/transport/http/adapters/test.rb +2 -1
  152. data/lib/datadog/core/transport/http/api/instance.rb +17 -0
  153. data/lib/datadog/core/transport/http/api/spec.rb +17 -0
  154. data/lib/datadog/core/transport/http/builder.rb +18 -16
  155. data/lib/datadog/core/transport/http.rb +39 -2
  156. data/lib/datadog/core/utils/at_fork_monkey_patch.rb +6 -6
  157. data/lib/datadog/core/utils/duration.rb +32 -32
  158. data/lib/datadog/core/utils/forking.rb +2 -2
  159. data/lib/datadog/core/utils/network.rb +6 -6
  160. data/lib/datadog/core/utils/only_once_successful.rb +16 -5
  161. data/lib/datadog/core/utils/time.rb +20 -0
  162. data/lib/datadog/core/utils/truncation.rb +21 -0
  163. data/lib/datadog/core/vendor/multipart-post/multipart/post/composite_read_io.rb +1 -1
  164. data/lib/datadog/core/vendor/multipart-post/multipart/post/multipartable.rb +8 -8
  165. data/lib/datadog/core/vendor/multipart-post/multipart/post/parts.rb +7 -7
  166. data/lib/datadog/core/worker.rb +1 -1
  167. data/lib/datadog/core/workers/async.rb +29 -12
  168. data/lib/datadog/core/workers/interval_loop.rb +12 -1
  169. data/lib/datadog/core/workers/runtime_metrics.rb +2 -2
  170. data/lib/datadog/core.rb +8 -0
  171. data/lib/datadog/di/boot.rb +34 -0
  172. data/lib/datadog/di/component.rb +0 -2
  173. data/lib/datadog/di/probe_notification_builder.rb +1 -1
  174. data/lib/datadog/di/probe_notifier_worker.rb +16 -16
  175. data/lib/datadog/di/remote.rb +2 -0
  176. data/lib/datadog/di/transport/diagnostics.rb +4 -3
  177. data/lib/datadog/di/transport/http/api.rb +2 -12
  178. data/lib/datadog/di/transport/http/client.rb +4 -3
  179. data/lib/datadog/di/transport/http/diagnostics.rb +7 -34
  180. data/lib/datadog/di/transport/http/input.rb +7 -34
  181. data/lib/datadog/di/transport/http.rb +14 -62
  182. data/lib/datadog/di/transport/input.rb +4 -3
  183. data/lib/datadog/di/utils.rb +5 -0
  184. data/lib/datadog/di.rb +5 -32
  185. data/lib/datadog/error_tracking/collector.rb +87 -0
  186. data/lib/datadog/error_tracking/component.rb +167 -0
  187. data/lib/datadog/error_tracking/configuration/settings.rb +63 -0
  188. data/lib/datadog/error_tracking/configuration.rb +11 -0
  189. data/lib/datadog/error_tracking/ext.rb +18 -0
  190. data/lib/datadog/error_tracking/extensions.rb +16 -0
  191. data/lib/datadog/error_tracking/filters.rb +77 -0
  192. data/lib/datadog/error_tracking.rb +18 -0
  193. data/lib/datadog/kit/appsec/events.rb +12 -0
  194. data/lib/datadog/kit/identity.rb +5 -1
  195. data/lib/datadog/opentelemetry/api/baggage.rb +90 -0
  196. data/lib/datadog/opentelemetry/api/baggage.rbs +26 -0
  197. data/lib/datadog/opentelemetry/api/context.rb +16 -2
  198. data/lib/datadog/opentelemetry/sdk/trace/span.rb +1 -1
  199. data/lib/datadog/opentelemetry.rb +2 -1
  200. data/lib/datadog/profiling/collectors/code_provenance.rb +1 -1
  201. data/lib/datadog/profiling/collectors/info.rb +3 -0
  202. data/lib/datadog/profiling/collectors/thread_context.rb +1 -1
  203. data/lib/datadog/profiling/encoded_profile.rb +11 -0
  204. data/lib/datadog/profiling/exporter.rb +3 -4
  205. data/lib/datadog/profiling/ext.rb +0 -2
  206. data/lib/datadog/profiling/flush.rb +5 -8
  207. data/lib/datadog/profiling/http_transport.rb +5 -59
  208. data/lib/datadog/profiling/scheduler.rb +8 -1
  209. data/lib/datadog/profiling/stack_recorder.rb +4 -4
  210. data/lib/datadog/profiling/tag_builder.rb +1 -5
  211. data/lib/datadog/profiling.rb +6 -2
  212. data/lib/datadog/tracing/analytics.rb +1 -1
  213. data/lib/datadog/tracing/component.rb +15 -12
  214. data/lib/datadog/tracing/configuration/ext.rb +7 -1
  215. data/lib/datadog/tracing/configuration/settings.rb +18 -2
  216. data/lib/datadog/tracing/context_provider.rb +1 -1
  217. data/lib/datadog/tracing/contrib/active_record/integration.rb +1 -1
  218. data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +4 -1
  219. data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +33 -0
  220. data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +4 -0
  221. data/lib/datadog/tracing/contrib/active_support/cache/redis.rb +2 -4
  222. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +10 -0
  223. data/lib/datadog/tracing/contrib/aws/parsed_context.rb +5 -1
  224. data/lib/datadog/tracing/contrib/configuration/settings.rb +1 -1
  225. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +4 -5
  226. data/lib/datadog/tracing/contrib/excon/middleware.rb +5 -3
  227. data/lib/datadog/tracing/contrib/ext.rb +1 -0
  228. data/lib/datadog/tracing/contrib/faraday/middleware.rb +5 -3
  229. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +7 -1
  230. data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +3 -0
  231. data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +0 -15
  232. data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +4 -1
  233. data/lib/datadog/tracing/contrib/http/instrumentation.rb +6 -10
  234. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +6 -16
  235. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +7 -15
  236. data/lib/datadog/tracing/contrib/karafka/configuration/settings.rb +27 -0
  237. data/lib/datadog/tracing/contrib/karafka/distributed/propagation.rb +48 -0
  238. data/lib/datadog/tracing/contrib/karafka/ext.rb +27 -0
  239. data/lib/datadog/tracing/contrib/karafka/integration.rb +45 -0
  240. data/lib/datadog/tracing/contrib/karafka/monitor.rb +66 -0
  241. data/lib/datadog/tracing/contrib/karafka/patcher.rb +71 -0
  242. data/lib/datadog/tracing/contrib/karafka.rb +37 -0
  243. data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +8 -0
  244. data/lib/datadog/tracing/contrib/mongodb/ext.rb +1 -0
  245. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +18 -1
  246. data/lib/datadog/tracing/contrib/opensearch/configuration/settings.rb +17 -0
  247. data/lib/datadog/tracing/contrib/opensearch/ext.rb +9 -0
  248. data/lib/datadog/tracing/contrib/opensearch/patcher.rb +5 -1
  249. data/lib/datadog/tracing/contrib/patcher.rb +5 -2
  250. data/lib/datadog/tracing/contrib/rack/request_queue.rb +1 -1
  251. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +5 -3
  252. data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +6 -1
  253. data/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb +3 -0
  254. data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +1 -1
  255. data/lib/datadog/tracing/contrib/support.rb +28 -0
  256. data/lib/datadog/tracing/contrib.rb +1 -0
  257. data/lib/datadog/tracing/correlation.rb +9 -2
  258. data/lib/datadog/tracing/distributed/b3_multi.rb +1 -1
  259. data/lib/datadog/tracing/distributed/b3_single.rb +1 -1
  260. data/lib/datadog/tracing/distributed/baggage.rb +131 -0
  261. data/lib/datadog/tracing/distributed/datadog.rb +4 -2
  262. data/lib/datadog/tracing/distributed/propagation.rb +25 -4
  263. data/lib/datadog/tracing/distributed/propagation_policy.rb +42 -0
  264. data/lib/datadog/tracing/metadata/errors.rb +4 -4
  265. data/lib/datadog/tracing/metadata/ext.rb +5 -0
  266. data/lib/datadog/tracing/metadata/metastruct.rb +36 -0
  267. data/lib/datadog/tracing/metadata/metastruct_tagging.rb +42 -0
  268. data/lib/datadog/tracing/metadata.rb +2 -0
  269. data/lib/datadog/tracing/sampling/rate_sampler.rb +2 -1
  270. data/lib/datadog/tracing/sampling/span/rule.rb +0 -1
  271. data/lib/datadog/tracing/span.rb +10 -1
  272. data/lib/datadog/tracing/span_event.rb +1 -1
  273. data/lib/datadog/tracing/span_operation.rb +46 -16
  274. data/lib/datadog/tracing/sync_writer.rb +1 -2
  275. data/lib/datadog/tracing/trace_digest.rb +9 -2
  276. data/lib/datadog/tracing/trace_operation.rb +44 -24
  277. data/lib/datadog/tracing/trace_segment.rb +6 -4
  278. data/lib/datadog/tracing/tracer.rb +45 -5
  279. data/lib/datadog/tracing/transport/http/api.rb +2 -10
  280. data/lib/datadog/tracing/transport/http/client.rb +5 -4
  281. data/lib/datadog/tracing/transport/http/traces.rb +13 -41
  282. data/lib/datadog/tracing/transport/http.rb +11 -44
  283. data/lib/datadog/tracing/transport/serializable_trace.rb +3 -1
  284. data/lib/datadog/tracing/transport/trace_formatter.rb +7 -0
  285. data/lib/datadog/tracing/transport/traces.rb +26 -9
  286. data/lib/datadog/tracing/utils.rb +1 -1
  287. data/lib/datadog/tracing/workers/trace_writer.rb +2 -6
  288. data/lib/datadog/tracing/writer.rb +2 -6
  289. data/lib/datadog/tracing.rb +16 -3
  290. data/lib/datadog/version.rb +2 -2
  291. data/lib/datadog.rb +2 -3
  292. metadata +80 -19
  293. data/lib/datadog/appsec/contrib/devise/event.rb +0 -54
  294. data/lib/datadog/appsec/contrib/devise/patcher/authenticatable_patch.rb +0 -72
  295. data/lib/datadog/appsec/contrib/devise/patcher/registration_controller_patch.rb +0 -47
  296. data/lib/datadog/appsec/contrib/devise/resource.rb +0 -35
  297. data/lib/datadog/appsec/contrib/devise/tracking.rb +0 -57
  298. data/lib/datadog/appsec/utils/trace_operation.rb +0 -15
  299. data/lib/datadog/core/telemetry/http/env.rb +0 -20
  300. data/lib/datadog/core/telemetry/http/ext.rb +0 -28
  301. data/lib/datadog/core/telemetry/http/response.rb +0 -70
  302. data/lib/datadog/core/telemetry/http/transport.rb +0 -90
@@ -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
 
@@ -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.
@@ -338,24 +338,32 @@ module Datadog
338
338
  hostname = hostname && !hostname.empty? ? hostname : nil
339
339
 
340
340
  if digest
341
+ sampling_priority = if propagate_sampling_priority?(upstream_tags: digest.trace_distributed_tags)
342
+ digest.trace_sampling_priority
343
+ end
341
344
  TraceOperation.new(
345
+ logger: logger,
342
346
  hostname: hostname,
343
347
  profiling_enabled: profiling_enabled,
348
+ apm_tracing_enabled: apm_tracing_enabled,
344
349
  id: digest.trace_id,
345
350
  origin: digest.trace_origin,
346
351
  parent_span_id: digest.span_id,
347
- sampling_priority: digest.trace_sampling_priority,
352
+ sampling_priority: sampling_priority,
348
353
  # Distributed tags are just regular trace tags with special meaning to Datadog
349
354
  tags: digest.trace_distributed_tags,
350
355
  trace_state: digest.trace_state,
351
356
  trace_state_unknown_fields: digest.trace_state_unknown_fields,
352
357
  remote_parent: digest.span_remote,
353
- tracer: self
358
+ tracer: self,
359
+ baggage: digest.baggage
354
360
  )
355
361
  else
356
362
  TraceOperation.new(
363
+ logger: logger,
357
364
  hostname: hostname,
358
365
  profiling_enabled: profiling_enabled,
366
+ apm_tracing_enabled: apm_tracing_enabled,
359
367
  remote_parent: false,
360
368
  tracer: self
361
369
  )
@@ -404,12 +412,13 @@ module Datadog
404
412
  )
405
413
  trace = _trace || start_trace(continue_from: continue_from)
406
414
 
407
- events = SpanOperation::Events.new
415
+ events = SpanOperation::Events.new(logger: logger)
408
416
 
409
417
  if block
410
418
  # Ignore start time if a block has been given
411
419
  trace.measure(
412
420
  name,
421
+ logger: logger,
413
422
  events: events,
414
423
  on_error: on_error,
415
424
  resource: resource,
@@ -423,6 +432,7 @@ module Datadog
423
432
  # Return the new span
424
433
  span = trace.build_span(
425
434
  name,
435
+ logger: logger,
426
436
  events: events,
427
437
  on_error: on_error,
428
438
  resource: resource,
@@ -535,20 +545,50 @@ module Datadog
535
545
 
536
546
  # TODO: Make these dummy objects singletons to preserve memory.
537
547
  def skip_trace(name)
538
- span = SpanOperation.new(name)
548
+ span = SpanOperation.new(name, logger: logger)
539
549
 
540
550
  if block_given?
541
- trace = TraceOperation.new
551
+ trace = TraceOperation.new(logger: logger)
542
552
  yield(span, trace)
543
553
  else
544
554
  span
545
555
  end
546
556
  end
547
557
 
558
+ # Decide whether upstream sampling priority should be propagated, by taking into account
559
+ # the upstream tags and the configuration.
560
+ # We should always propagate if APM is enabled.
561
+ #
562
+ # e.g.: upstream tags containing dd.p.ts: 02, and appsec is enabled, return true.
563
+ def propagate_sampling_priority?(upstream_tags:)
564
+ return true if apm_tracing_enabled
565
+
566
+ if upstream_tags&.key?(Tracing::Metadata::Ext::Distributed::TAG_TRACE_SOURCE)
567
+ appsec_bit = upstream_tags[Tracing::Metadata::Ext::Distributed::TAG_TRACE_SOURCE].to_i(16) &
568
+ Datadog::AppSec::Ext::PRODUCT_BIT
569
+ return appsec_enabled if appsec_bit != 0
570
+ end
571
+
572
+ false
573
+ end
574
+
548
575
  def profiling_enabled
549
576
  @profiling_enabled ||=
550
577
  !!(defined?(Datadog::Profiling) && Datadog::Profiling.respond_to?(:enabled?) && Datadog::Profiling.enabled?)
551
578
  end
579
+
580
+ def appsec_enabled
581
+ @appsec_enabled ||= Datadog.configuration.appsec.enabled
582
+ end
583
+
584
+ # Due to APM Tracing (the product) and Tracing (the transport) being intertwined, we cannot completely disabled APM
585
+ # without also disabling the tracer. When setting `@apm_tracing_enabled` to `false`, it does not disable the tracer,
586
+ # but rather only sends heartbeat traces (1 per minutes), so that the service is considered alive in the backend.
587
+ # Other products (like ASM) can then set the sampling priority of their traces to `MANUAL_KEEP`,
588
+ # effectively allowing standalone products to work without APM.
589
+ def apm_tracing_enabled
590
+ @apm_tracing_enabled ||= Datadog.configuration.apm.tracing.enabled
591
+ end
552
592
  end
553
593
  end
554
594
  end
@@ -22,14 +22,14 @@ module Datadog
22
22
 
23
23
  def defaults
24
24
  Core::Transport::HTTP::API::Map[
25
- V4 => Spec.new do |s|
25
+ V4 => Traces::API::Spec.new do |s|
26
26
  s.traces = Traces::API::Endpoint.new(
27
27
  '/v0.4/traces',
28
28
  Core::Encoding::MsgpackEncoder,
29
29
  service_rates: true
30
30
  )
31
31
  end,
32
- V3 => Spec.new do |s|
32
+ V3 => Traces::API::Spec.new do |s|
33
33
  s.traces = Traces::API::Endpoint.new(
34
34
  '/v0.3/traces',
35
35
  Core::Encoding::MsgpackEncoder
@@ -37,14 +37,6 @@ module Datadog
37
37
  end,
38
38
  ].with_fallbacks(V4 => V3)
39
39
  end
40
-
41
- class Instance < Core::Transport::HTTP::API::Instance
42
- include Traces::API::Instance
43
- end
44
-
45
- class Spec < Core::Transport::HTTP::API::Spec
46
- include Traces::API::Spec
47
- end
48
40
  end
49
41
  end
50
42
  end
@@ -12,10 +12,11 @@ module Datadog
12
12
  class Client
13
13
  include Datadog::Tracing::Transport::HTTP::Statistics
14
14
 
15
- attr_reader :api
15
+ attr_reader :api, :logger
16
16
 
17
- def initialize(api)
17
+ def initialize(api, logger: Datadog.logger)
18
18
  @api = api
19
+ @logger = logger
19
20
  end
20
21
 
21
22
  def send_request(request, &block)
@@ -36,10 +37,10 @@ module Datadog
36
37
 
37
38
  # Log error
38
39
  if stats.consecutive_errors > 0
39
- Datadog.logger.debug(message)
40
+ logger.debug(message)
40
41
  else
41
42
  # Not to report telemetry logs
42
- Datadog.logger.error(message)
43
+ logger.error(message)
43
44
  end
44
45
 
45
46
  # Update statistics
@@ -6,6 +6,8 @@ require_relative '../traces'
6
6
  require_relative 'client'
7
7
  require_relative '../../../core/transport/http/response'
8
8
  require_relative '../../../core/transport/http/api/endpoint'
9
+ require_relative '../../../core/transport/http/api/spec'
10
+ require_relative '../../../core/transport/http/api/instance'
9
11
 
10
12
  module Datadog
11
13
  module Tracing
@@ -35,16 +37,12 @@ module Datadog
35
37
  end
36
38
 
37
39
  module API
38
- # Extensions for HTTP API Spec
39
- module Spec
40
- attr_reader :traces
41
-
42
- def traces=(endpoint)
43
- @traces = endpoint
44
- end
40
+ # HTTP API Spec
41
+ class Spec < Core::Transport::HTTP::API::Spec
42
+ attr_accessor :traces
45
43
 
46
44
  def send_traces(env, &block)
47
- raise NoTraceEndpointDefinedError, self if traces.nil?
45
+ raise Core::Transport::HTTP::API::Spec::EndpointNotDefinedError.new('traces', self) if traces.nil?
48
46
 
49
47
  traces.call(env, &block)
50
48
  end
@@ -52,47 +50,21 @@ module Datadog
52
50
  def encoder
53
51
  traces.encoder
54
52
  end
55
-
56
- # Raised when traces sent but no traces endpoint is defined
57
- class NoTraceEndpointDefinedError < StandardError
58
- attr_reader :spec
59
-
60
- def initialize(spec)
61
- super
62
-
63
- @spec = spec
64
- end
65
-
66
- def message
67
- 'No trace endpoint is defined for API specification!'
68
- end
69
- end
70
53
  end
71
54
 
72
- # Extensions for HTTP API Instance
73
- module Instance
55
+ # HTTP API Instance
56
+ class Instance < Core::Transport::HTTP::API::Instance
74
57
  def send_traces(env)
75
- raise TracesNotSupportedError, spec unless spec.is_a?(Traces::API::Spec)
58
+ unless spec.is_a?(Traces::API::Spec)
59
+ raise Core::Transport::HTTP::API::Instance::EndpointNotSupportedError.new(
60
+ 'traces', self
61
+ )
62
+ end
76
63
 
77
64
  spec.send_traces(env) do |request_env|
78
65
  call(request_env)
79
66
  end
80
67
  end
81
-
82
- # Raised when traces sent to API that does not support traces
83
- class TracesNotSupportedError < StandardError
84
- attr_reader :spec
85
-
86
- def initialize(spec)
87
- super
88
-
89
- @spec = spec
90
- end
91
-
92
- def message
93
- 'Traces not supported for this API!'
94
- end
95
- end
96
68
  end
97
69
 
98
70
  # Endpoint for submitting trace data
@@ -14,62 +14,29 @@ module Datadog
14
14
  module HTTP
15
15
  module_function
16
16
 
17
- # Builds a new Transport::HTTP::Client
18
- def new(klass, &block)
19
- Core::Transport::HTTP.build(
20
- api_instance_class: API::Instance, &block
21
- ).to_transport(klass)
22
- end
23
-
24
17
  # Builds a new Transport::HTTP::Client with default settings
25
18
  # Pass a block to override any settings.
26
19
  def default(
27
20
  agent_settings:,
28
- **options
21
+ logger: Datadog.logger,
22
+ api_version: nil,
23
+ headers: nil
29
24
  )
30
- new(Transport::Traces::Transport) do |transport|
31
- transport.adapter(agent_settings)
32
- transport.headers default_headers
33
-
25
+ Core::Transport::HTTP.build(
26
+ api_instance_class: Traces::API::Instance,
27
+ agent_settings: agent_settings,
28
+ logger: logger,
29
+ api_version: api_version,
30
+ headers: headers
31
+ ) do |transport|
34
32
  apis = API.defaults
35
33
 
36
34
  transport.api API::V4, apis[API::V4], fallback: API::V3, default: true
37
35
  transport.api API::V3, apis[API::V3]
38
36
 
39
- # Apply any settings given by options
40
- unless options.empty?
41
- transport.default_api = options[:api_version] if options.key?(:api_version)
42
- transport.headers options[:headers] if options.key?(:headers)
43
- end
44
-
45
37
  # Call block to apply any customization, if provided
46
38
  yield(transport) if block_given?
47
- end
48
- end
49
-
50
- def default_headers
51
- {
52
- Datadog::Core::Transport::Ext::HTTP::HEADER_CLIENT_COMPUTED_TOP_LEVEL => '1',
53
- Datadog::Core::Transport::Ext::HTTP::HEADER_META_LANG => Datadog::Core::Environment::Ext::LANG,
54
- Datadog::Core::Transport::Ext::HTTP::HEADER_META_LANG_VERSION => Datadog::Core::Environment::Ext::LANG_VERSION,
55
- Datadog::Core::Transport::Ext::HTTP::HEADER_META_LANG_INTERPRETER =>
56
- Datadog::Core::Environment::Ext::LANG_INTERPRETER,
57
- Datadog::Core::Transport::Ext::HTTP::HEADER_META_LANG_INTERPRETER_VENDOR => Core::Environment::Ext::LANG_ENGINE,
58
- Datadog::Core::Transport::Ext::HTTP::HEADER_META_TRACER_VERSION =>
59
- Datadog::Core::Environment::Ext::GEM_DATADOG_VERSION
60
- }.tap do |headers|
61
- # Add container ID, if present.
62
- container_id = Datadog::Core::Environment::Container.container_id
63
- headers[Datadog::Core::Transport::Ext::HTTP::HEADER_CONTAINER_ID] = container_id unless container_id.nil?
64
- # Pretend that stats computation are already done by the client
65
- if Datadog.configuration.appsec.standalone.enabled
66
- headers[Datadog::Core::Transport::Ext::HTTP::HEADER_CLIENT_COMPUTED_STATS] = 'yes'
67
- end
68
- end
69
- end
70
-
71
- def default_adapter
72
- Datadog::Core::Configuration::Ext::Agent::HTTP::ADAPTER
39
+ end.to_transport(Transport::Traces::Transport)
73
40
  end
74
41
  end
75
42
  end
@@ -69,7 +69,7 @@ module Datadog
69
69
  def to_msgpack(packer = nil)
70
70
  packer ||= MessagePack::Packer.new
71
71
 
72
- number_of_elements_to_write = 11
72
+ number_of_elements_to_write = 12
73
73
 
74
74
  number_of_elements_to_write += 1 if span.events.any? && @native_events_supported
75
75
 
@@ -117,6 +117,8 @@ module Datadog
117
117
  packer.write(span.meta)
118
118
  packer.write('metrics')
119
119
  packer.write(span.metrics)
120
+ packer.write('meta_struct')
121
+ packer.write(span.metastruct)
120
122
  packer.write('span_links')
121
123
  packer.write(span.links.map(&:to_hash))
122
124
  packer.write('error')
@@ -59,6 +59,7 @@ module Datadog
59
59
  tag_high_order_trace_id!
60
60
  tag_sampling_priority!
61
61
  tag_profiling_enabled!
62
+ tag_apm_tracing_disabled!
62
63
 
63
64
  if first_span
64
65
  tag_git_repository_url!
@@ -196,6 +197,12 @@ module Datadog
196
197
  )
197
198
  end
198
199
 
200
+ def tag_apm_tracing_disabled!
201
+ return if trace.apm_tracing_enabled
202
+
203
+ root_span.set_tag(Tracing::Metadata::Ext::TAG_APM_ENABLED, 0)
204
+ end
205
+
199
206
  def tag_git_repository_url!
200
207
  return if git_repository_url.nil?
201
208