datadog 2.12.1 → 2.19.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 (346) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +243 -2
  3. data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +63 -56
  4. data/ext/datadog_profiling_native_extension/collectors_stack.c +263 -76
  5. data/ext/datadog_profiling_native_extension/collectors_stack.h +20 -3
  6. data/ext/datadog_profiling_native_extension/collectors_thread_context.c +78 -26
  7. data/ext/datadog_profiling_native_extension/collectors_thread_context.h +1 -0
  8. data/ext/datadog_profiling_native_extension/datadog_ruby_common.c +1 -4
  9. data/ext/datadog_profiling_native_extension/datadog_ruby_common.h +10 -0
  10. data/ext/datadog_profiling_native_extension/encoded_profile.c +79 -0
  11. data/ext/datadog_profiling_native_extension/encoded_profile.h +8 -0
  12. data/ext/datadog_profiling_native_extension/extconf.rb +10 -0
  13. data/ext/datadog_profiling_native_extension/heap_recorder.c +247 -364
  14. data/ext/datadog_profiling_native_extension/heap_recorder.h +4 -6
  15. data/ext/datadog_profiling_native_extension/http_transport.c +60 -94
  16. data/ext/datadog_profiling_native_extension/libdatadog_helpers.c +22 -0
  17. data/ext/datadog_profiling_native_extension/libdatadog_helpers.h +8 -5
  18. data/ext/datadog_profiling_native_extension/private_vm_api_access.c +41 -21
  19. data/ext/datadog_profiling_native_extension/private_vm_api_access.h +6 -4
  20. data/ext/datadog_profiling_native_extension/profiling.c +2 -0
  21. data/ext/datadog_profiling_native_extension/ruby_helpers.c +1 -13
  22. data/ext/datadog_profiling_native_extension/ruby_helpers.h +3 -11
  23. data/ext/datadog_profiling_native_extension/stack_recorder.c +173 -76
  24. data/ext/libdatadog_api/crashtracker.c +11 -12
  25. data/ext/libdatadog_api/crashtracker.h +5 -0
  26. data/ext/libdatadog_api/datadog_ruby_common.c +1 -4
  27. data/ext/libdatadog_api/datadog_ruby_common.h +10 -0
  28. data/ext/libdatadog_api/extconf.rb +2 -2
  29. data/ext/libdatadog_api/init.c +15 -0
  30. data/ext/libdatadog_api/library_config.c +164 -0
  31. data/ext/libdatadog_api/library_config.h +25 -0
  32. data/ext/libdatadog_api/macos_development.md +3 -3
  33. data/ext/libdatadog_api/process_discovery.c +112 -0
  34. data/ext/libdatadog_api/process_discovery.h +5 -0
  35. data/ext/libdatadog_extconf_helpers.rb +2 -2
  36. data/lib/datadog/appsec/actions_handler/serializable_backtrace.rb +89 -0
  37. data/lib/datadog/appsec/actions_handler.rb +24 -2
  38. data/lib/datadog/appsec/anonymizer.rb +16 -0
  39. data/lib/datadog/appsec/api_security/lru_cache.rb +56 -0
  40. data/lib/datadog/appsec/api_security/route_extractor.rb +71 -0
  41. data/lib/datadog/appsec/api_security/sampler.rb +59 -0
  42. data/lib/datadog/appsec/api_security.rb +23 -0
  43. data/lib/datadog/appsec/assets/waf_rules/README.md +50 -5
  44. data/lib/datadog/appsec/assets/waf_rules/recommended.json +257 -85
  45. data/lib/datadog/appsec/assets/waf_rules/strict.json +10 -78
  46. data/lib/datadog/appsec/autoload.rb +1 -1
  47. data/lib/datadog/appsec/component.rb +46 -61
  48. data/lib/datadog/appsec/compressed_json.rb +40 -0
  49. data/lib/datadog/appsec/configuration/settings.rb +153 -30
  50. data/lib/datadog/appsec/context.rb +7 -7
  51. data/lib/datadog/appsec/contrib/active_record/instrumentation.rb +10 -12
  52. data/lib/datadog/appsec/contrib/active_record/integration.rb +2 -2
  53. data/lib/datadog/appsec/contrib/active_record/patcher.rb +22 -22
  54. data/lib/datadog/appsec/contrib/auto_instrument.rb +1 -1
  55. data/lib/datadog/appsec/contrib/devise/configuration.rb +7 -31
  56. data/lib/datadog/appsec/contrib/devise/data_extractor.rb +78 -0
  57. data/lib/datadog/appsec/contrib/devise/ext.rb +22 -0
  58. data/lib/datadog/appsec/contrib/devise/integration.rb +1 -2
  59. data/lib/datadog/appsec/contrib/devise/patcher.rb +34 -23
  60. data/lib/datadog/appsec/contrib/devise/patches/signin_tracking_patch.rb +102 -0
  61. data/lib/datadog/appsec/contrib/devise/patches/signup_tracking_patch.rb +69 -0
  62. data/lib/datadog/appsec/contrib/devise/{patcher/rememberable_patch.rb → patches/skip_signin_tracking_patch.rb} +2 -2
  63. data/lib/datadog/appsec/contrib/devise/tracking_middleware.rb +106 -0
  64. data/lib/datadog/appsec/contrib/excon/integration.rb +1 -1
  65. data/lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb +9 -10
  66. data/lib/datadog/appsec/contrib/faraday/integration.rb +1 -1
  67. data/lib/datadog/appsec/contrib/faraday/ssrf_detection_middleware.rb +8 -9
  68. data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +8 -9
  69. data/lib/datadog/appsec/contrib/graphql/integration.rb +1 -1
  70. data/lib/datadog/appsec/contrib/rack/ext.rb +34 -0
  71. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +49 -32
  72. data/lib/datadog/appsec/contrib/rack/integration.rb +1 -1
  73. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +42 -30
  74. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +11 -13
  75. data/lib/datadog/appsec/contrib/rails/integration.rb +1 -1
  76. data/lib/datadog/appsec/contrib/rails/patcher.rb +21 -21
  77. data/lib/datadog/appsec/contrib/rest_client/integration.rb +1 -1
  78. data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +10 -11
  79. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +17 -23
  80. data/lib/datadog/appsec/contrib/sinatra/integration.rb +1 -1
  81. data/lib/datadog/appsec/event.rb +96 -135
  82. data/lib/datadog/appsec/ext.rb +4 -2
  83. data/lib/datadog/appsec/instrumentation/gateway/argument.rb +7 -2
  84. data/lib/datadog/appsec/instrumentation/gateway/middleware.rb +24 -0
  85. data/lib/datadog/appsec/instrumentation/gateway.rb +17 -22
  86. data/lib/datadog/appsec/metrics/telemetry.rb +1 -1
  87. data/lib/datadog/appsec/monitor/gateway/watcher.rb +49 -14
  88. data/lib/datadog/appsec/processor/rule_loader.rb +30 -33
  89. data/lib/datadog/appsec/remote.rb +31 -59
  90. data/lib/datadog/appsec/response.rb +6 -6
  91. data/lib/datadog/appsec/security_engine/engine.rb +194 -0
  92. data/lib/datadog/appsec/security_engine/runner.rb +13 -14
  93. data/lib/datadog/appsec/security_event.rb +39 -0
  94. data/lib/datadog/appsec/utils.rb +0 -2
  95. data/lib/datadog/appsec.rb +5 -8
  96. data/lib/datadog/core/buffer/random.rb +18 -2
  97. data/lib/datadog/core/configuration/agent_settings.rb +52 -0
  98. data/lib/datadog/core/configuration/agent_settings_resolver.rb +4 -46
  99. data/lib/datadog/core/configuration/agentless_settings_resolver.rb +176 -0
  100. data/lib/datadog/core/configuration/components.rb +48 -31
  101. data/lib/datadog/core/configuration/components_state.rb +23 -0
  102. data/lib/datadog/core/configuration/ext.rb +4 -0
  103. data/lib/datadog/core/configuration/option.rb +81 -45
  104. data/lib/datadog/core/configuration/option_definition.rb +4 -4
  105. data/lib/datadog/core/configuration/options.rb +3 -3
  106. data/lib/datadog/core/configuration/settings.rb +109 -44
  107. data/lib/datadog/core/configuration/stable_config.rb +22 -0
  108. data/lib/datadog/core/configuration.rb +40 -16
  109. data/lib/datadog/core/crashtracking/component.rb +3 -10
  110. data/lib/datadog/core/crashtracking/tag_builder.rb +4 -22
  111. data/lib/datadog/core/diagnostics/environment_logger.rb +1 -1
  112. data/lib/datadog/core/encoding.rb +1 -1
  113. data/lib/datadog/core/environment/agent_info.rb +4 -3
  114. data/lib/datadog/core/environment/cgroup.rb +10 -12
  115. data/lib/datadog/core/environment/container.rb +38 -40
  116. data/lib/datadog/core/environment/ext.rb +6 -6
  117. data/lib/datadog/core/environment/git.rb +1 -0
  118. data/lib/datadog/core/environment/identity.rb +3 -3
  119. data/lib/datadog/core/environment/platform.rb +3 -3
  120. data/lib/datadog/core/environment/variable_helpers.rb +1 -1
  121. data/lib/datadog/core/error.rb +11 -9
  122. data/lib/datadog/core/logger.rb +2 -2
  123. data/lib/datadog/core/metrics/client.rb +20 -21
  124. data/lib/datadog/core/metrics/logging.rb +5 -5
  125. data/lib/datadog/core/process_discovery/tracer_memfd.rb +15 -0
  126. data/lib/datadog/core/process_discovery.rb +36 -0
  127. data/lib/datadog/core/rate_limiter.rb +4 -2
  128. data/lib/datadog/core/remote/client.rb +40 -32
  129. data/lib/datadog/core/remote/component.rb +6 -9
  130. data/lib/datadog/core/remote/configuration/digest.rb +7 -7
  131. data/lib/datadog/core/remote/configuration/path.rb +1 -1
  132. data/lib/datadog/core/remote/configuration/repository.rb +14 -1
  133. data/lib/datadog/core/remote/negotiation.rb +9 -9
  134. data/lib/datadog/core/remote/transport/config.rb +4 -3
  135. data/lib/datadog/core/remote/transport/http/client.rb +5 -4
  136. data/lib/datadog/core/remote/transport/http/config.rb +27 -37
  137. data/lib/datadog/core/remote/transport/http/negotiation.rb +7 -33
  138. data/lib/datadog/core/remote/transport/http.rb +22 -57
  139. data/lib/datadog/core/remote/transport/negotiation.rb +4 -3
  140. data/lib/datadog/core/runtime/metrics.rb +12 -5
  141. data/lib/datadog/core/tag_builder.rb +56 -0
  142. data/lib/datadog/core/telemetry/component.rb +81 -52
  143. data/lib/datadog/core/telemetry/emitter.rb +23 -11
  144. data/lib/datadog/core/telemetry/event/app_client_configuration_change.rb +66 -0
  145. data/lib/datadog/core/telemetry/event/app_closing.rb +18 -0
  146. data/lib/datadog/core/telemetry/event/app_dependencies_loaded.rb +33 -0
  147. data/lib/datadog/core/telemetry/event/app_heartbeat.rb +18 -0
  148. data/lib/datadog/core/telemetry/event/app_integrations_change.rb +58 -0
  149. data/lib/datadog/core/telemetry/event/app_started.rb +287 -0
  150. data/lib/datadog/core/telemetry/event/base.rb +40 -0
  151. data/lib/datadog/core/telemetry/event/distributions.rb +18 -0
  152. data/lib/datadog/core/telemetry/event/generate_metrics.rb +43 -0
  153. data/lib/datadog/core/telemetry/event/log.rb +76 -0
  154. data/lib/datadog/core/telemetry/event/message_batch.rb +42 -0
  155. data/lib/datadog/core/telemetry/event/synth_app_client_configuration_change.rb +43 -0
  156. data/lib/datadog/core/telemetry/event.rb +17 -472
  157. data/lib/datadog/core/telemetry/http/adapters/net.rb +12 -97
  158. data/lib/datadog/core/telemetry/logger.rb +5 -4
  159. data/lib/datadog/core/telemetry/logging.rb +11 -5
  160. data/lib/datadog/core/telemetry/metric.rb +8 -8
  161. data/lib/datadog/core/telemetry/request.rb +4 -4
  162. data/lib/datadog/core/telemetry/transport/http/api.rb +43 -0
  163. data/lib/datadog/core/telemetry/transport/http/client.rb +49 -0
  164. data/lib/datadog/core/telemetry/transport/http/telemetry.rb +92 -0
  165. data/lib/datadog/core/telemetry/transport/http.rb +63 -0
  166. data/lib/datadog/core/telemetry/transport/telemetry.rb +51 -0
  167. data/lib/datadog/core/telemetry/worker.rb +90 -24
  168. data/lib/datadog/core/transport/http/adapters/net.rb +17 -2
  169. data/lib/datadog/core/transport/http/adapters/test.rb +2 -1
  170. data/lib/datadog/core/transport/http/api/instance.rb +17 -0
  171. data/lib/datadog/core/transport/http/api/spec.rb +17 -0
  172. data/lib/datadog/core/transport/http/builder.rb +19 -17
  173. data/lib/datadog/core/transport/http/env.rb +8 -0
  174. data/lib/datadog/core/transport/http.rb +39 -2
  175. data/lib/datadog/core/utils/at_fork_monkey_patch.rb +6 -6
  176. data/lib/datadog/core/utils/duration.rb +32 -32
  177. data/lib/datadog/core/utils/forking.rb +2 -2
  178. data/lib/datadog/core/utils/network.rb +6 -6
  179. data/lib/datadog/core/utils/only_once_successful.rb +16 -5
  180. data/lib/datadog/core/utils/time.rb +20 -0
  181. data/lib/datadog/core/utils/truncation.rb +21 -0
  182. data/lib/datadog/core/utils.rb +7 -0
  183. data/lib/datadog/core/vendor/multipart-post/multipart/post/composite_read_io.rb +1 -1
  184. data/lib/datadog/core/vendor/multipart-post/multipart/post/multipartable.rb +8 -8
  185. data/lib/datadog/core/vendor/multipart-post/multipart/post/parts.rb +7 -7
  186. data/lib/datadog/core/worker.rb +1 -1
  187. data/lib/datadog/core/workers/async.rb +29 -12
  188. data/lib/datadog/core/workers/interval_loop.rb +12 -1
  189. data/lib/datadog/core/workers/runtime_metrics.rb +2 -2
  190. data/lib/datadog/core.rb +8 -0
  191. data/lib/datadog/di/boot.rb +34 -0
  192. data/lib/datadog/di/component.rb +0 -2
  193. data/lib/datadog/di/instrumenter.rb +48 -5
  194. data/lib/datadog/di/probe_notification_builder.rb +38 -43
  195. data/lib/datadog/di/probe_notifier_worker.rb +25 -17
  196. data/lib/datadog/di/remote.rb +2 -0
  197. data/lib/datadog/di/serializer.rb +10 -2
  198. data/lib/datadog/di/transport/diagnostics.rb +4 -3
  199. data/lib/datadog/di/transport/http/api.rb +2 -12
  200. data/lib/datadog/di/transport/http/client.rb +4 -3
  201. data/lib/datadog/di/transport/http/diagnostics.rb +7 -34
  202. data/lib/datadog/di/transport/http/input.rb +18 -35
  203. data/lib/datadog/di/transport/http.rb +14 -62
  204. data/lib/datadog/di/transport/input.rb +14 -5
  205. data/lib/datadog/di/utils.rb +5 -0
  206. data/lib/datadog/di.rb +0 -33
  207. data/lib/datadog/error_tracking/collector.rb +87 -0
  208. data/lib/datadog/error_tracking/component.rb +167 -0
  209. data/lib/datadog/error_tracking/configuration/settings.rb +63 -0
  210. data/lib/datadog/error_tracking/configuration.rb +11 -0
  211. data/lib/datadog/error_tracking/ext.rb +18 -0
  212. data/lib/datadog/error_tracking/extensions.rb +16 -0
  213. data/lib/datadog/error_tracking/filters.rb +77 -0
  214. data/lib/datadog/error_tracking.rb +18 -0
  215. data/lib/datadog/kit/appsec/events/v2.rb +195 -0
  216. data/lib/datadog/kit/appsec/events.rb +12 -0
  217. data/lib/datadog/kit/identity.rb +5 -1
  218. data/lib/datadog/opentelemetry/api/baggage.rb +90 -0
  219. data/lib/datadog/opentelemetry/api/baggage.rbs +26 -0
  220. data/lib/datadog/opentelemetry/api/context.rb +16 -2
  221. data/lib/datadog/opentelemetry/sdk/trace/span.rb +1 -1
  222. data/lib/datadog/opentelemetry.rb +2 -1
  223. data/lib/datadog/profiling/collectors/code_provenance.rb +18 -9
  224. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +6 -0
  225. data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +1 -0
  226. data/lib/datadog/profiling/collectors/info.rb +44 -0
  227. data/lib/datadog/profiling/collectors/thread_context.rb +17 -2
  228. data/lib/datadog/profiling/component.rb +8 -9
  229. data/lib/datadog/profiling/encoded_profile.rb +11 -0
  230. data/lib/datadog/profiling/exporter.rb +12 -7
  231. data/lib/datadog/profiling/ext.rb +0 -14
  232. data/lib/datadog/profiling/flush.rb +5 -8
  233. data/lib/datadog/profiling/http_transport.rb +7 -61
  234. data/lib/datadog/profiling/profiler.rb +2 -0
  235. data/lib/datadog/profiling/scheduler.rb +10 -2
  236. data/lib/datadog/profiling/sequence_tracker.rb +44 -0
  237. data/lib/datadog/profiling/stack_recorder.rb +9 -9
  238. data/lib/datadog/profiling/tag_builder.rb +7 -41
  239. data/lib/datadog/profiling/tasks/setup.rb +2 -0
  240. data/lib/datadog/profiling.rb +7 -2
  241. data/lib/datadog/single_step_instrument.rb +9 -0
  242. data/lib/datadog/tracing/analytics.rb +1 -1
  243. data/lib/datadog/tracing/component.rb +15 -12
  244. data/lib/datadog/tracing/configuration/ext.rb +7 -1
  245. data/lib/datadog/tracing/configuration/settings.rb +18 -2
  246. data/lib/datadog/tracing/context_provider.rb +1 -1
  247. data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +15 -0
  248. data/lib/datadog/tracing/contrib/action_pack/action_dispatch/instrumentation.rb +19 -12
  249. data/lib/datadog/tracing/contrib/action_pack/ext.rb +2 -0
  250. data/lib/datadog/tracing/contrib/active_record/integration.rb +1 -1
  251. data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +11 -2
  252. data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +33 -0
  253. data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +4 -0
  254. data/lib/datadog/tracing/contrib/active_support/cache/redis.rb +2 -4
  255. data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +13 -0
  256. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +10 -0
  257. data/lib/datadog/tracing/contrib/aws/parsed_context.rb +5 -1
  258. data/lib/datadog/tracing/contrib/configuration/settings.rb +1 -1
  259. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +4 -5
  260. data/lib/datadog/tracing/contrib/excon/middleware.rb +5 -3
  261. data/lib/datadog/tracing/contrib/ext.rb +1 -0
  262. data/lib/datadog/tracing/contrib/faraday/middleware.rb +5 -3
  263. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +7 -1
  264. data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +3 -0
  265. data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +0 -15
  266. data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +4 -1
  267. data/lib/datadog/tracing/contrib/http/instrumentation.rb +6 -10
  268. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +6 -16
  269. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +7 -15
  270. data/lib/datadog/tracing/contrib/karafka/configuration/settings.rb +27 -0
  271. data/lib/datadog/tracing/contrib/karafka/distributed/propagation.rb +48 -0
  272. data/lib/datadog/tracing/contrib/karafka/ext.rb +27 -0
  273. data/lib/datadog/tracing/contrib/karafka/integration.rb +45 -0
  274. data/lib/datadog/tracing/contrib/karafka/monitor.rb +66 -0
  275. data/lib/datadog/tracing/contrib/karafka/patcher.rb +71 -0
  276. data/lib/datadog/tracing/contrib/karafka.rb +37 -0
  277. data/lib/datadog/tracing/contrib/lograge/patcher.rb +4 -2
  278. data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +8 -0
  279. data/lib/datadog/tracing/contrib/mongodb/ext.rb +1 -0
  280. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +18 -1
  281. data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +16 -6
  282. data/lib/datadog/tracing/contrib/opensearch/configuration/settings.rb +17 -0
  283. data/lib/datadog/tracing/contrib/opensearch/ext.rb +9 -0
  284. data/lib/datadog/tracing/contrib/opensearch/patcher.rb +5 -1
  285. data/lib/datadog/tracing/contrib/patcher.rb +5 -2
  286. data/lib/datadog/tracing/contrib/rack/request_queue.rb +1 -1
  287. data/lib/datadog/tracing/contrib/rails/patcher.rb +4 -1
  288. data/lib/datadog/tracing/contrib/rails/runner.rb +61 -40
  289. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +5 -3
  290. data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +6 -1
  291. data/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb +3 -0
  292. data/lib/datadog/tracing/contrib/sidekiq/ext.rb +1 -0
  293. data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +5 -2
  294. data/lib/datadog/tracing/contrib/support.rb +28 -0
  295. data/lib/datadog/tracing/contrib.rb +1 -0
  296. data/lib/datadog/tracing/correlation.rb +9 -2
  297. data/lib/datadog/tracing/diagnostics/environment_logger.rb +3 -1
  298. data/lib/datadog/tracing/distributed/b3_multi.rb +1 -1
  299. data/lib/datadog/tracing/distributed/b3_single.rb +1 -1
  300. data/lib/datadog/tracing/distributed/baggage.rb +131 -0
  301. data/lib/datadog/tracing/distributed/datadog.rb +4 -2
  302. data/lib/datadog/tracing/distributed/propagation.rb +25 -4
  303. data/lib/datadog/tracing/distributed/propagation_policy.rb +42 -0
  304. data/lib/datadog/tracing/metadata/errors.rb +4 -4
  305. data/lib/datadog/tracing/metadata/ext.rb +5 -0
  306. data/lib/datadog/tracing/metadata/metastruct.rb +36 -0
  307. data/lib/datadog/tracing/metadata/metastruct_tagging.rb +42 -0
  308. data/lib/datadog/tracing/metadata.rb +2 -0
  309. data/lib/datadog/tracing/sampling/rate_sampler.rb +2 -1
  310. data/lib/datadog/tracing/sampling/span/rule.rb +0 -1
  311. data/lib/datadog/tracing/span.rb +10 -1
  312. data/lib/datadog/tracing/span_event.rb +2 -2
  313. data/lib/datadog/tracing/span_operation.rb +68 -16
  314. data/lib/datadog/tracing/sync_writer.rb +2 -3
  315. data/lib/datadog/tracing/trace_digest.rb +9 -2
  316. data/lib/datadog/tracing/trace_operation.rb +55 -27
  317. data/lib/datadog/tracing/trace_segment.rb +6 -4
  318. data/lib/datadog/tracing/tracer.rb +51 -7
  319. data/lib/datadog/tracing/transport/http/api.rb +2 -10
  320. data/lib/datadog/tracing/transport/http/client.rb +5 -4
  321. data/lib/datadog/tracing/transport/http/traces.rb +13 -41
  322. data/lib/datadog/tracing/transport/http.rb +11 -44
  323. data/lib/datadog/tracing/transport/serializable_trace.rb +3 -1
  324. data/lib/datadog/tracing/transport/trace_formatter.rb +7 -0
  325. data/lib/datadog/tracing/transport/traces.rb +26 -9
  326. data/lib/datadog/tracing/utils.rb +1 -1
  327. data/lib/datadog/tracing/workers/trace_writer.rb +2 -6
  328. data/lib/datadog/tracing/writer.rb +2 -6
  329. data/lib/datadog/tracing.rb +16 -3
  330. data/lib/datadog/version.rb +2 -2
  331. data/lib/datadog.rb +8 -2
  332. metadata +88 -23
  333. data/lib/datadog/appsec/assets/waf_rules/processors.json +0 -92
  334. data/lib/datadog/appsec/assets/waf_rules/scanners.json +0 -114
  335. data/lib/datadog/appsec/contrib/devise/event.rb +0 -54
  336. data/lib/datadog/appsec/contrib/devise/patcher/authenticatable_patch.rb +0 -72
  337. data/lib/datadog/appsec/contrib/devise/patcher/registration_controller_patch.rb +0 -47
  338. data/lib/datadog/appsec/contrib/devise/resource.rb +0 -35
  339. data/lib/datadog/appsec/contrib/devise/tracking.rb +0 -57
  340. data/lib/datadog/appsec/processor/rule_merger.rb +0 -170
  341. data/lib/datadog/appsec/processor.rb +0 -107
  342. data/lib/datadog/appsec/utils/trace_operation.rb +0 -15
  343. data/lib/datadog/core/telemetry/http/env.rb +0 -20
  344. data/lib/datadog/core/telemetry/http/ext.rb +0 -28
  345. data/lib/datadog/core/telemetry/http/response.rb +0 -70
  346. 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, # 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.
@@ -273,7 +273,7 @@ module Datadog
273
273
  # Sample a span, tagging the trace as appropriate.
274
274
  def sample_trace(trace_op)
275
275
  begin
276
- @sampler.sample!(trace_op)
276
+ @sampler.sample!(trace_op) if trace_op.sampling_priority.nil?
277
277
  rescue StandardError => e
278
278
  SAMPLE_TRACE_LOG_ONLY_ONCE.run do
279
279
  logger.warn { "Failed to sample trace: #{e.class.name} #{e} at #{Array(e.backtrace).first}" }
@@ -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
  )
@@ -370,7 +378,12 @@ module Datadog
370
378
  event_span_op.service ||= @default_service
371
379
  end
372
380
 
381
+ events.trace_propagated.subscribe do |event_trace_op|
382
+ sample_trace(event_trace_op)
383
+ end
384
+
373
385
  events.span_finished.subscribe do |event_span, event_trace_op|
386
+ sample_trace(trace_op) if event_trace_op.sampling_priority.nil?
374
387
  sample_span(event_trace_op, event_span)
375
388
  flush_trace(event_trace_op)
376
389
  end
@@ -404,12 +417,13 @@ module Datadog
404
417
  )
405
418
  trace = _trace || start_trace(continue_from: continue_from)
406
419
 
407
- events = SpanOperation::Events.new
420
+ events = SpanOperation::Events.new(logger: logger)
408
421
 
409
422
  if block
410
423
  # Ignore start time if a block has been given
411
424
  trace.measure(
412
425
  name,
426
+ logger: logger,
413
427
  events: events,
414
428
  on_error: on_error,
415
429
  resource: resource,
@@ -423,6 +437,7 @@ module Datadog
423
437
  # Return the new span
424
438
  span = trace.build_span(
425
439
  name,
440
+ logger: logger,
426
441
  events: events,
427
442
  on_error: on_error,
428
443
  resource: resource,
@@ -506,7 +521,6 @@ module Datadog
506
521
 
507
522
  # Flush finished spans from the trace buffer, send them to writer.
508
523
  def flush_trace(trace_op)
509
- sample_trace(trace_op) unless trace_op.sampling_priority
510
524
  begin
511
525
  trace = @trace_flush.consume!(trace_op)
512
526
  write(trace) if trace && !trace.empty?
@@ -535,20 +549,50 @@ module Datadog
535
549
 
536
550
  # TODO: Make these dummy objects singletons to preserve memory.
537
551
  def skip_trace(name)
538
- span = SpanOperation.new(name)
552
+ span = SpanOperation.new(name, logger: logger)
539
553
 
540
554
  if block_given?
541
- trace = TraceOperation.new
555
+ trace = TraceOperation.new(logger: logger)
542
556
  yield(span, trace)
543
557
  else
544
558
  span
545
559
  end
546
560
  end
547
561
 
562
+ # Decide whether upstream sampling priority should be propagated, by taking into account
563
+ # the upstream tags and the configuration.
564
+ # We should always propagate if APM is enabled.
565
+ #
566
+ # e.g.: upstream tags containing dd.p.ts: 02, and appsec is enabled, return true.
567
+ def propagate_sampling_priority?(upstream_tags:)
568
+ return true if apm_tracing_enabled
569
+
570
+ if upstream_tags&.key?(Tracing::Metadata::Ext::Distributed::TAG_TRACE_SOURCE)
571
+ appsec_bit = upstream_tags[Tracing::Metadata::Ext::Distributed::TAG_TRACE_SOURCE].to_i(16) &
572
+ Datadog::AppSec::Ext::PRODUCT_BIT
573
+ return appsec_enabled if appsec_bit != 0
574
+ end
575
+
576
+ false
577
+ end
578
+
548
579
  def profiling_enabled
549
580
  @profiling_enabled ||=
550
581
  !!(defined?(Datadog::Profiling) && Datadog::Profiling.respond_to?(:enabled?) && Datadog::Profiling.enabled?)
551
582
  end
583
+
584
+ def appsec_enabled
585
+ @appsec_enabled ||= Datadog.configuration.appsec.enabled
586
+ end
587
+
588
+ # Due to APM Tracing (the product) and Tracing (the transport) being intertwined, we cannot completely disabled APM
589
+ # without also disabling the tracer. When setting `@apm_tracing_enabled` to `false`, it does not disable the tracer,
590
+ # but rather only sends heartbeat traces (1 per minutes), so that the service is considered alive in the backend.
591
+ # Other products (like ASM) can then set the sampling priority of their traces to `MANUAL_KEEP`,
592
+ # effectively allowing standalone products to work without APM.
593
+ def apm_tracing_enabled
594
+ @apm_tracing_enabled ||= Datadog.configuration.apm.tracing.enabled
595
+ end
552
596
  end
553
597
  end
554
598
  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