datadog 2.7.1 → 2.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (441) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +353 -1
  3. data/ext/datadog_profiling_native_extension/clock_id.h +2 -2
  4. data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +78 -102
  5. data/ext/datadog_profiling_native_extension/collectors_discrete_dynamic_sampler.c +1 -1
  6. data/ext/datadog_profiling_native_extension/collectors_discrete_dynamic_sampler.h +1 -1
  7. data/ext/datadog_profiling_native_extension/collectors_idle_sampling_helper.c +16 -16
  8. data/ext/datadog_profiling_native_extension/collectors_stack.c +235 -57
  9. data/ext/datadog_profiling_native_extension/collectors_stack.h +21 -5
  10. data/ext/datadog_profiling_native_extension/collectors_thread_context.c +376 -156
  11. data/ext/datadog_profiling_native_extension/collectors_thread_context.h +1 -0
  12. data/ext/datadog_profiling_native_extension/datadog_ruby_common.c +1 -4
  13. data/ext/datadog_profiling_native_extension/datadog_ruby_common.h +10 -0
  14. data/ext/datadog_profiling_native_extension/encoded_profile.c +79 -0
  15. data/ext/datadog_profiling_native_extension/encoded_profile.h +8 -0
  16. data/ext/datadog_profiling_native_extension/extconf.rb +14 -8
  17. data/ext/datadog_profiling_native_extension/gvl_profiling_helper.c +2 -0
  18. data/ext/datadog_profiling_native_extension/gvl_profiling_helper.h +0 -8
  19. data/ext/datadog_profiling_native_extension/heap_recorder.c +295 -532
  20. data/ext/datadog_profiling_native_extension/heap_recorder.h +6 -8
  21. data/ext/datadog_profiling_native_extension/http_transport.c +64 -98
  22. data/ext/datadog_profiling_native_extension/libdatadog_helpers.c +22 -0
  23. data/ext/datadog_profiling_native_extension/libdatadog_helpers.h +8 -5
  24. data/ext/datadog_profiling_native_extension/private_vm_api_access.c +69 -1
  25. data/ext/datadog_profiling_native_extension/private_vm_api_access.h +16 -4
  26. data/ext/datadog_profiling_native_extension/profiling.c +19 -8
  27. data/ext/datadog_profiling_native_extension/ruby_helpers.c +9 -21
  28. data/ext/datadog_profiling_native_extension/ruby_helpers.h +2 -10
  29. data/ext/datadog_profiling_native_extension/stack_recorder.c +231 -181
  30. data/ext/datadog_profiling_native_extension/stack_recorder.h +2 -2
  31. data/ext/datadog_profiling_native_extension/time_helpers.h +1 -1
  32. data/ext/datadog_profiling_native_extension/unsafe_api_calls_check.c +47 -0
  33. data/ext/datadog_profiling_native_extension/unsafe_api_calls_check.h +31 -0
  34. data/ext/libdatadog_api/crashtracker.c +17 -15
  35. data/ext/libdatadog_api/crashtracker.h +5 -0
  36. data/ext/libdatadog_api/datadog_ruby_common.c +1 -4
  37. data/ext/libdatadog_api/datadog_ruby_common.h +10 -0
  38. data/ext/libdatadog_api/extconf.rb +2 -2
  39. data/ext/libdatadog_api/init.c +15 -0
  40. data/ext/libdatadog_api/library_config.c +164 -0
  41. data/ext/libdatadog_api/library_config.h +25 -0
  42. data/ext/libdatadog_api/macos_development.md +3 -3
  43. data/ext/libdatadog_api/process_discovery.c +112 -0
  44. data/ext/libdatadog_api/process_discovery.h +5 -0
  45. data/ext/libdatadog_extconf_helpers.rb +2 -2
  46. data/lib/datadog/appsec/actions_handler/serializable_backtrace.rb +89 -0
  47. data/lib/datadog/appsec/actions_handler.rb +49 -0
  48. data/lib/datadog/appsec/anonymizer.rb +16 -0
  49. data/lib/datadog/appsec/api_security/lru_cache.rb +56 -0
  50. data/lib/datadog/appsec/api_security/route_extractor.rb +65 -0
  51. data/lib/datadog/appsec/api_security/sampler.rb +59 -0
  52. data/lib/datadog/appsec/api_security.rb +23 -0
  53. data/lib/datadog/appsec/assets/waf_rules/README.md +50 -5
  54. data/lib/datadog/appsec/assets/waf_rules/recommended.json +623 -253
  55. data/lib/datadog/appsec/assets/waf_rules/strict.json +69 -107
  56. data/lib/datadog/appsec/autoload.rb +1 -1
  57. data/lib/datadog/appsec/component.rb +49 -65
  58. data/lib/datadog/appsec/compressed_json.rb +40 -0
  59. data/lib/datadog/appsec/configuration/settings.rb +212 -27
  60. data/lib/datadog/appsec/context.rb +74 -0
  61. data/lib/datadog/appsec/contrib/active_record/instrumentation.rb +92 -0
  62. data/lib/datadog/appsec/contrib/active_record/integration.rb +41 -0
  63. data/lib/datadog/appsec/contrib/active_record/patcher.rb +101 -0
  64. data/lib/datadog/appsec/contrib/auto_instrument.rb +1 -1
  65. data/lib/datadog/appsec/contrib/devise/configuration.rb +52 -0
  66. data/lib/datadog/appsec/contrib/devise/data_extractor.rb +78 -0
  67. data/lib/datadog/appsec/contrib/devise/ext.rb +22 -0
  68. data/lib/datadog/appsec/contrib/devise/integration.rb +1 -2
  69. data/lib/datadog/appsec/contrib/devise/patcher.rb +33 -25
  70. data/lib/datadog/appsec/contrib/devise/patches/signin_tracking_patch.rb +102 -0
  71. data/lib/datadog/appsec/contrib/devise/patches/signup_tracking_patch.rb +69 -0
  72. data/lib/datadog/appsec/contrib/devise/{patcher/rememberable_patch.rb → patches/skip_signin_tracking_patch.rb} +3 -3
  73. data/lib/datadog/appsec/contrib/devise/tracking_middleware.rb +106 -0
  74. data/lib/datadog/appsec/contrib/excon/integration.rb +41 -0
  75. data/lib/datadog/appsec/contrib/excon/patcher.rb +28 -0
  76. data/lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb +42 -0
  77. data/lib/datadog/appsec/contrib/faraday/connection_patch.rb +22 -0
  78. data/lib/datadog/appsec/contrib/faraday/integration.rb +42 -0
  79. data/lib/datadog/appsec/contrib/faraday/patcher.rb +53 -0
  80. data/lib/datadog/appsec/contrib/faraday/rack_builder_patch.rb +22 -0
  81. data/lib/datadog/appsec/contrib/faraday/ssrf_detection_middleware.rb +41 -0
  82. data/lib/datadog/appsec/contrib/graphql/appsec_trace.rb +1 -7
  83. data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +17 -30
  84. data/lib/datadog/appsec/contrib/graphql/integration.rb +1 -1
  85. data/lib/datadog/appsec/contrib/graphql/patcher.rb +0 -3
  86. data/lib/datadog/appsec/contrib/rack/ext.rb +34 -0
  87. data/lib/datadog/appsec/contrib/rack/gateway/response.rb +3 -3
  88. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +78 -98
  89. data/lib/datadog/appsec/contrib/rack/integration.rb +1 -1
  90. data/lib/datadog/appsec/contrib/rack/patcher.rb +0 -3
  91. data/lib/datadog/appsec/contrib/rack/request_body_middleware.rb +10 -11
  92. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +73 -78
  93. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +16 -33
  94. data/lib/datadog/appsec/contrib/rails/integration.rb +1 -1
  95. data/lib/datadog/appsec/contrib/rails/patcher.rb +25 -38
  96. data/lib/datadog/appsec/contrib/rest_client/integration.rb +45 -0
  97. data/lib/datadog/appsec/contrib/rest_client/patcher.rb +28 -0
  98. data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +38 -0
  99. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +31 -68
  100. data/lib/datadog/appsec/contrib/sinatra/integration.rb +1 -1
  101. data/lib/datadog/appsec/contrib/sinatra/patcher.rb +5 -31
  102. data/lib/datadog/appsec/event.rb +96 -135
  103. data/lib/datadog/appsec/ext.rb +12 -3
  104. data/lib/datadog/appsec/instrumentation/gateway/argument.rb +7 -2
  105. data/lib/datadog/appsec/instrumentation/gateway/middleware.rb +24 -0
  106. data/lib/datadog/appsec/instrumentation/gateway.rb +17 -22
  107. data/lib/datadog/appsec/metrics/collector.rb +38 -0
  108. data/lib/datadog/appsec/metrics/exporter.rb +35 -0
  109. data/lib/datadog/appsec/metrics/telemetry.rb +23 -0
  110. data/lib/datadog/appsec/metrics.rb +13 -0
  111. data/lib/datadog/appsec/monitor/gateway/watcher.rb +52 -32
  112. data/lib/datadog/appsec/processor/rule_loader.rb +30 -36
  113. data/lib/datadog/appsec/remote.rb +31 -57
  114. data/lib/datadog/appsec/response.rb +19 -85
  115. data/lib/datadog/appsec/security_engine/engine.rb +194 -0
  116. data/lib/datadog/appsec/security_engine/result.rb +67 -0
  117. data/lib/datadog/appsec/security_engine/runner.rb +87 -0
  118. data/lib/datadog/appsec/security_engine.rb +9 -0
  119. data/lib/datadog/appsec/security_event.rb +39 -0
  120. data/lib/datadog/appsec/utils.rb +0 -2
  121. data/lib/datadog/appsec.rb +22 -12
  122. data/lib/datadog/auto_instrument.rb +3 -0
  123. data/lib/datadog/core/buffer/random.rb +18 -2
  124. data/lib/datadog/core/configuration/agent_settings.rb +52 -0
  125. data/lib/datadog/core/configuration/agent_settings_resolver.rb +4 -18
  126. data/lib/datadog/core/configuration/agentless_settings_resolver.rb +176 -0
  127. data/lib/datadog/core/configuration/components.rb +74 -32
  128. data/lib/datadog/core/configuration/components_state.rb +23 -0
  129. data/lib/datadog/core/configuration/ext.rb +5 -1
  130. data/lib/datadog/core/configuration/option.rb +81 -45
  131. data/lib/datadog/core/configuration/option_definition.rb +6 -4
  132. data/lib/datadog/core/configuration/options.rb +3 -3
  133. data/lib/datadog/core/configuration/settings.rb +121 -50
  134. data/lib/datadog/core/configuration/stable_config.rb +22 -0
  135. data/lib/datadog/core/configuration.rb +43 -11
  136. data/lib/datadog/{tracing → core}/contrib/rails/utils.rb +1 -3
  137. data/lib/datadog/core/crashtracking/component.rb +4 -13
  138. data/lib/datadog/core/crashtracking/tag_builder.rb +4 -22
  139. data/lib/datadog/core/diagnostics/environment_logger.rb +1 -1
  140. data/lib/datadog/core/encoding.rb +17 -1
  141. data/lib/datadog/core/environment/agent_info.rb +78 -0
  142. data/lib/datadog/core/environment/cgroup.rb +10 -12
  143. data/lib/datadog/core/environment/container.rb +38 -40
  144. data/lib/datadog/core/environment/ext.rb +6 -6
  145. data/lib/datadog/core/environment/git.rb +1 -0
  146. data/lib/datadog/core/environment/identity.rb +3 -3
  147. data/lib/datadog/core/environment/platform.rb +3 -3
  148. data/lib/datadog/core/environment/variable_helpers.rb +1 -1
  149. data/lib/datadog/core/error.rb +11 -9
  150. data/lib/datadog/core/logger.rb +2 -2
  151. data/lib/datadog/core/metrics/client.rb +27 -27
  152. data/lib/datadog/core/metrics/logging.rb +5 -5
  153. data/lib/datadog/core/process_discovery/tracer_memfd.rb +15 -0
  154. data/lib/datadog/core/process_discovery.rb +36 -0
  155. data/lib/datadog/core/rate_limiter.rb +4 -2
  156. data/lib/datadog/core/remote/client/capabilities.rb +6 -0
  157. data/lib/datadog/core/remote/client.rb +107 -92
  158. data/lib/datadog/core/remote/component.rb +18 -19
  159. data/lib/datadog/core/remote/configuration/digest.rb +7 -7
  160. data/lib/datadog/core/remote/configuration/path.rb +1 -1
  161. data/lib/datadog/core/remote/configuration/repository.rb +14 -1
  162. data/lib/datadog/core/remote/negotiation.rb +9 -9
  163. data/lib/datadog/core/remote/transport/config.rb +4 -3
  164. data/lib/datadog/core/remote/transport/http/api.rb +13 -18
  165. data/lib/datadog/core/remote/transport/http/client.rb +5 -4
  166. data/lib/datadog/core/remote/transport/http/config.rb +27 -55
  167. data/lib/datadog/core/remote/transport/http/negotiation.rb +8 -51
  168. data/lib/datadog/core/remote/transport/http.rb +25 -94
  169. data/lib/datadog/core/remote/transport/negotiation.rb +17 -4
  170. data/lib/datadog/core/remote/worker.rb +10 -7
  171. data/lib/datadog/core/runtime/metrics.rb +12 -5
  172. data/lib/datadog/core/tag_builder.rb +56 -0
  173. data/lib/datadog/core/telemetry/component.rb +84 -49
  174. data/lib/datadog/core/telemetry/emitter.rb +23 -11
  175. data/lib/datadog/core/telemetry/event/app_client_configuration_change.rb +66 -0
  176. data/lib/datadog/core/telemetry/event/app_closing.rb +18 -0
  177. data/lib/datadog/core/telemetry/event/app_dependencies_loaded.rb +33 -0
  178. data/lib/datadog/core/telemetry/event/app_heartbeat.rb +18 -0
  179. data/lib/datadog/core/telemetry/event/app_integrations_change.rb +58 -0
  180. data/lib/datadog/core/telemetry/event/app_started.rb +269 -0
  181. data/lib/datadog/core/telemetry/event/base.rb +40 -0
  182. data/lib/datadog/core/telemetry/event/distributions.rb +18 -0
  183. data/lib/datadog/core/telemetry/event/generate_metrics.rb +43 -0
  184. data/lib/datadog/core/telemetry/event/log.rb +76 -0
  185. data/lib/datadog/core/telemetry/event/message_batch.rb +42 -0
  186. data/lib/datadog/core/telemetry/event/synth_app_client_configuration_change.rb +43 -0
  187. data/lib/datadog/core/telemetry/event.rb +17 -383
  188. data/lib/datadog/core/telemetry/ext.rb +1 -0
  189. data/lib/datadog/core/telemetry/http/adapters/net.rb +12 -97
  190. data/lib/datadog/core/telemetry/logger.rb +5 -4
  191. data/lib/datadog/core/telemetry/logging.rb +12 -6
  192. data/lib/datadog/core/telemetry/metric.rb +28 -6
  193. data/lib/datadog/core/telemetry/request.rb +4 -4
  194. data/lib/datadog/core/telemetry/transport/http/api.rb +43 -0
  195. data/lib/datadog/core/telemetry/transport/http/client.rb +49 -0
  196. data/lib/datadog/core/telemetry/transport/http/telemetry.rb +92 -0
  197. data/lib/datadog/core/telemetry/transport/http.rb +63 -0
  198. data/lib/datadog/core/telemetry/transport/telemetry.rb +51 -0
  199. data/lib/datadog/core/telemetry/worker.rb +128 -25
  200. data/lib/datadog/core/transport/http/adapters/net.rb +17 -2
  201. data/lib/datadog/core/transport/http/adapters/test.rb +2 -1
  202. data/lib/datadog/core/transport/http/adapters/unix_socket.rb +1 -1
  203. data/lib/datadog/{tracing → core}/transport/http/api/instance.rb +18 -1
  204. data/lib/datadog/core/transport/http/api/spec.rb +36 -0
  205. data/lib/datadog/{tracing → core}/transport/http/builder.rb +53 -31
  206. data/lib/datadog/core/transport/http/env.rb +8 -0
  207. data/lib/datadog/core/transport/http.rb +75 -0
  208. data/lib/datadog/core/transport/response.rb +4 -0
  209. data/lib/datadog/core/utils/at_fork_monkey_patch.rb +6 -6
  210. data/lib/datadog/core/utils/duration.rb +32 -32
  211. data/lib/datadog/core/utils/forking.rb +2 -2
  212. data/lib/datadog/core/utils/network.rb +6 -6
  213. data/lib/datadog/core/utils/only_once_successful.rb +16 -5
  214. data/lib/datadog/core/utils/time.rb +20 -0
  215. data/lib/datadog/core/utils/truncation.rb +21 -0
  216. data/lib/datadog/core/utils.rb +7 -0
  217. data/lib/datadog/core/vendor/multipart-post/multipart/post/composite_read_io.rb +1 -1
  218. data/lib/datadog/core/vendor/multipart-post/multipart/post/multipartable.rb +8 -8
  219. data/lib/datadog/core/vendor/multipart-post/multipart/post/parts.rb +7 -7
  220. data/lib/datadog/core/worker.rb +1 -1
  221. data/lib/datadog/core/workers/async.rb +29 -12
  222. data/lib/datadog/core/workers/interval_loop.rb +12 -1
  223. data/lib/datadog/core/workers/runtime_metrics.rb +2 -2
  224. data/lib/datadog/core.rb +8 -0
  225. data/lib/datadog/di/base.rb +115 -0
  226. data/lib/datadog/di/boot.rb +34 -0
  227. data/lib/datadog/di/code_tracker.rb +26 -15
  228. data/lib/datadog/di/component.rb +23 -14
  229. data/lib/datadog/di/configuration/settings.rb +25 -1
  230. data/lib/datadog/di/contrib/active_record.rb +1 -0
  231. data/lib/datadog/di/contrib/railtie.rb +15 -0
  232. data/lib/datadog/di/contrib.rb +28 -0
  233. data/lib/datadog/di/error.rb +5 -0
  234. data/lib/datadog/di/instrumenter.rb +162 -21
  235. data/lib/datadog/di/logger.rb +30 -0
  236. data/lib/datadog/di/preload.rb +18 -0
  237. data/lib/datadog/di/probe.rb +14 -7
  238. data/lib/datadog/di/probe_builder.rb +1 -0
  239. data/lib/datadog/di/probe_manager.rb +11 -5
  240. data/lib/datadog/di/probe_notification_builder.rb +54 -38
  241. data/lib/datadog/di/probe_notifier_worker.rb +60 -26
  242. data/lib/datadog/di/redactor.rb +0 -1
  243. data/lib/datadog/di/remote.rb +147 -0
  244. data/lib/datadog/di/serializer.rb +19 -8
  245. data/lib/datadog/di/transport/diagnostics.rb +62 -0
  246. data/lib/datadog/di/transport/http/api.rb +42 -0
  247. data/lib/datadog/di/transport/http/client.rb +47 -0
  248. data/lib/datadog/di/transport/http/diagnostics.rb +65 -0
  249. data/lib/datadog/di/transport/http/input.rb +77 -0
  250. data/lib/datadog/di/transport/http.rb +57 -0
  251. data/lib/datadog/di/transport/input.rb +70 -0
  252. data/lib/datadog/di/utils.rb +103 -0
  253. data/lib/datadog/di.rb +14 -76
  254. data/lib/datadog/error_tracking/collector.rb +87 -0
  255. data/lib/datadog/error_tracking/component.rb +167 -0
  256. data/lib/datadog/error_tracking/configuration/settings.rb +63 -0
  257. data/lib/datadog/error_tracking/configuration.rb +11 -0
  258. data/lib/datadog/error_tracking/ext.rb +18 -0
  259. data/lib/datadog/error_tracking/extensions.rb +16 -0
  260. data/lib/datadog/error_tracking/filters.rb +77 -0
  261. data/lib/datadog/error_tracking.rb +18 -0
  262. data/lib/datadog/kit/appsec/events.rb +15 -3
  263. data/lib/datadog/kit/identity.rb +9 -5
  264. data/lib/datadog/opentelemetry/api/baggage.rb +90 -0
  265. data/lib/datadog/opentelemetry/api/baggage.rbs +26 -0
  266. data/lib/datadog/opentelemetry/api/context.rb +16 -2
  267. data/lib/datadog/opentelemetry/sdk/trace/span.rb +1 -1
  268. data/lib/datadog/opentelemetry.rb +2 -1
  269. data/lib/datadog/profiling/collectors/code_provenance.rb +18 -9
  270. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +4 -0
  271. data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +1 -0
  272. data/lib/datadog/profiling/collectors/info.rb +3 -0
  273. data/lib/datadog/profiling/collectors/thread_context.rb +17 -2
  274. data/lib/datadog/profiling/component.rb +64 -82
  275. data/lib/datadog/profiling/encoded_profile.rb +11 -0
  276. data/lib/datadog/profiling/exporter.rb +3 -4
  277. data/lib/datadog/profiling/ext.rb +0 -14
  278. data/lib/datadog/profiling/flush.rb +5 -8
  279. data/lib/datadog/profiling/http_transport.rb +8 -87
  280. data/lib/datadog/profiling/load_native_extension.rb +1 -33
  281. data/lib/datadog/profiling/profiler.rb +2 -0
  282. data/lib/datadog/profiling/scheduler.rb +10 -2
  283. data/lib/datadog/profiling/stack_recorder.rb +9 -9
  284. data/lib/datadog/profiling/tag_builder.rb +5 -41
  285. data/lib/datadog/profiling/tasks/setup.rb +2 -0
  286. data/lib/datadog/profiling.rb +6 -2
  287. data/lib/datadog/tracing/analytics.rb +1 -1
  288. data/lib/datadog/tracing/component.rb +16 -12
  289. data/lib/datadog/tracing/configuration/ext.rb +8 -1
  290. data/lib/datadog/tracing/configuration/settings.rb +22 -10
  291. data/lib/datadog/tracing/context_provider.rb +1 -1
  292. data/lib/datadog/tracing/contrib/action_cable/integration.rb +5 -2
  293. data/lib/datadog/tracing/contrib/action_mailer/integration.rb +6 -2
  294. data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +15 -0
  295. data/lib/datadog/tracing/contrib/action_pack/action_dispatch/instrumentation.rb +19 -12
  296. data/lib/datadog/tracing/contrib/action_pack/ext.rb +2 -0
  297. data/lib/datadog/tracing/contrib/action_pack/integration.rb +5 -2
  298. data/lib/datadog/tracing/contrib/action_view/integration.rb +5 -2
  299. data/lib/datadog/tracing/contrib/active_job/integration.rb +5 -2
  300. data/lib/datadog/tracing/contrib/active_record/integration.rb +7 -3
  301. data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +7 -2
  302. data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +36 -1
  303. data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +4 -0
  304. data/lib/datadog/tracing/contrib/active_support/cache/redis.rb +14 -4
  305. data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +10 -0
  306. data/lib/datadog/tracing/contrib/active_support/integration.rb +5 -2
  307. data/lib/datadog/tracing/contrib/auto_instrument.rb +2 -2
  308. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +10 -0
  309. data/lib/datadog/tracing/contrib/aws/integration.rb +3 -0
  310. data/lib/datadog/tracing/contrib/aws/parsed_context.rb +5 -1
  311. data/lib/datadog/tracing/contrib/concurrent_ruby/integration.rb +3 -0
  312. data/lib/datadog/tracing/contrib/configuration/settings.rb +1 -1
  313. data/lib/datadog/tracing/contrib/elasticsearch/configuration/settings.rb +4 -0
  314. data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +6 -1
  315. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +4 -5
  316. data/lib/datadog/tracing/contrib/excon/middleware.rb +5 -3
  317. data/lib/datadog/tracing/contrib/ext.rb +1 -0
  318. data/lib/datadog/tracing/contrib/extensions.rb +29 -3
  319. data/lib/datadog/tracing/contrib/faraday/middleware.rb +5 -3
  320. data/lib/datadog/tracing/contrib/graphql/configuration/error_extension_env_parser.rb +21 -0
  321. data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +11 -0
  322. data/lib/datadog/tracing/contrib/graphql/ext.rb +5 -0
  323. data/lib/datadog/tracing/contrib/graphql/unified_trace.rb +102 -11
  324. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +7 -1
  325. data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +3 -0
  326. data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +0 -15
  327. data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +4 -1
  328. data/lib/datadog/tracing/contrib/http/instrumentation.rb +6 -10
  329. data/lib/datadog/tracing/contrib/http/integration.rb +3 -0
  330. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +6 -16
  331. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +7 -15
  332. data/lib/datadog/tracing/contrib/httprb/integration.rb +3 -0
  333. data/lib/datadog/tracing/contrib/kafka/integration.rb +3 -0
  334. data/lib/datadog/tracing/contrib/karafka/configuration/settings.rb +27 -0
  335. data/lib/datadog/tracing/contrib/karafka/distributed/propagation.rb +48 -0
  336. data/lib/datadog/tracing/contrib/karafka/ext.rb +27 -0
  337. data/lib/datadog/tracing/contrib/karafka/integration.rb +45 -0
  338. data/lib/datadog/tracing/contrib/karafka/monitor.rb +66 -0
  339. data/lib/datadog/tracing/contrib/karafka/patcher.rb +71 -0
  340. data/lib/datadog/tracing/contrib/karafka.rb +37 -0
  341. data/lib/datadog/tracing/contrib/lograge/patcher.rb +4 -2
  342. data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +8 -0
  343. data/lib/datadog/tracing/contrib/mongodb/ext.rb +1 -0
  344. data/lib/datadog/tracing/contrib/mongodb/integration.rb +3 -0
  345. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +18 -1
  346. data/lib/datadog/tracing/contrib/opensearch/configuration/settings.rb +17 -0
  347. data/lib/datadog/tracing/contrib/opensearch/ext.rb +9 -0
  348. data/lib/datadog/tracing/contrib/opensearch/integration.rb +3 -0
  349. data/lib/datadog/tracing/contrib/opensearch/patcher.rb +5 -1
  350. data/lib/datadog/tracing/contrib/patcher.rb +5 -2
  351. data/lib/datadog/tracing/contrib/presto/integration.rb +3 -0
  352. data/lib/datadog/tracing/contrib/rack/header_collection.rb +11 -1
  353. data/lib/datadog/tracing/contrib/rack/integration.rb +2 -2
  354. data/lib/datadog/tracing/contrib/rack/middlewares.rb +1 -1
  355. data/lib/datadog/tracing/contrib/rack/request_queue.rb +1 -1
  356. data/lib/datadog/tracing/contrib/rails/framework.rb +2 -2
  357. data/lib/datadog/tracing/contrib/rails/patcher.rb +1 -1
  358. data/lib/datadog/tracing/contrib/rest_client/integration.rb +3 -0
  359. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +5 -3
  360. data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +6 -1
  361. data/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb +3 -0
  362. data/lib/datadog/tracing/contrib/sidekiq/ext.rb +1 -0
  363. data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +5 -2
  364. data/lib/datadog/tracing/contrib/span_attribute_schema.rb +6 -1
  365. data/lib/datadog/tracing/contrib/support.rb +28 -0
  366. data/lib/datadog/tracing/contrib.rb +1 -0
  367. data/lib/datadog/tracing/correlation.rb +9 -2
  368. data/lib/datadog/tracing/distributed/b3_multi.rb +1 -1
  369. data/lib/datadog/tracing/distributed/b3_single.rb +1 -1
  370. data/lib/datadog/tracing/distributed/baggage.rb +131 -0
  371. data/lib/datadog/tracing/distributed/datadog.rb +4 -2
  372. data/lib/datadog/tracing/distributed/propagation.rb +25 -4
  373. data/lib/datadog/tracing/distributed/propagation_policy.rb +42 -0
  374. data/lib/datadog/tracing/metadata/errors.rb +4 -4
  375. data/lib/datadog/tracing/metadata/ext.rb +5 -0
  376. data/lib/datadog/tracing/metadata/metastruct.rb +36 -0
  377. data/lib/datadog/tracing/metadata/metastruct_tagging.rb +42 -0
  378. data/lib/datadog/tracing/metadata.rb +2 -0
  379. data/lib/datadog/tracing/sampling/rate_sampler.rb +2 -1
  380. data/lib/datadog/tracing/sampling/span/rule.rb +0 -1
  381. data/lib/datadog/tracing/span.rb +22 -5
  382. data/lib/datadog/tracing/span_event.rb +124 -4
  383. data/lib/datadog/tracing/span_operation.rb +52 -16
  384. data/lib/datadog/tracing/sync_writer.rb +10 -6
  385. data/lib/datadog/tracing/trace_digest.rb +9 -2
  386. data/lib/datadog/tracing/trace_operation.rb +55 -27
  387. data/lib/datadog/tracing/trace_segment.rb +6 -4
  388. data/lib/datadog/tracing/tracer.rb +66 -14
  389. data/lib/datadog/tracing/transport/http/api.rb +5 -4
  390. data/lib/datadog/tracing/transport/http/client.rb +5 -4
  391. data/lib/datadog/tracing/transport/http/traces.rb +13 -44
  392. data/lib/datadog/tracing/transport/http.rb +13 -70
  393. data/lib/datadog/tracing/transport/serializable_trace.rb +31 -7
  394. data/lib/datadog/tracing/transport/trace_formatter.rb +7 -0
  395. data/lib/datadog/tracing/transport/traces.rb +47 -13
  396. data/lib/datadog/tracing/utils.rb +1 -1
  397. data/lib/datadog/tracing/workers/trace_writer.rb +8 -5
  398. data/lib/datadog/tracing/workers.rb +5 -4
  399. data/lib/datadog/tracing/writer.rb +10 -6
  400. data/lib/datadog/tracing.rb +16 -3
  401. data/lib/datadog/version.rb +2 -2
  402. data/lib/datadog.rb +2 -0
  403. metadata +149 -54
  404. data/ext/datadog_profiling_loader/datadog_profiling_loader.c +0 -142
  405. data/ext/datadog_profiling_loader/extconf.rb +0 -60
  406. data/lib/datadog/appsec/assets/waf_rules/processors.json +0 -92
  407. data/lib/datadog/appsec/assets/waf_rules/scanners.json +0 -114
  408. data/lib/datadog/appsec/contrib/devise/event.rb +0 -57
  409. data/lib/datadog/appsec/contrib/devise/patcher/authenticatable_patch.rb +0 -77
  410. data/lib/datadog/appsec/contrib/devise/patcher/registration_controller_patch.rb +0 -54
  411. data/lib/datadog/appsec/contrib/devise/resource.rb +0 -35
  412. data/lib/datadog/appsec/contrib/devise/tracking.rb +0 -57
  413. data/lib/datadog/appsec/contrib/graphql/reactive/multiplex.rb +0 -46
  414. data/lib/datadog/appsec/contrib/patcher.rb +0 -12
  415. data/lib/datadog/appsec/contrib/rack/reactive/request.rb +0 -69
  416. data/lib/datadog/appsec/contrib/rack/reactive/request_body.rb +0 -47
  417. data/lib/datadog/appsec/contrib/rack/reactive/response.rb +0 -53
  418. data/lib/datadog/appsec/contrib/rails/reactive/action.rb +0 -53
  419. data/lib/datadog/appsec/contrib/sinatra/ext.rb +0 -14
  420. data/lib/datadog/appsec/contrib/sinatra/reactive/routed.rb +0 -48
  421. data/lib/datadog/appsec/monitor/reactive/set_user.rb +0 -45
  422. data/lib/datadog/appsec/processor/actions.rb +0 -49
  423. data/lib/datadog/appsec/processor/context.rb +0 -107
  424. data/lib/datadog/appsec/processor/rule_merger.rb +0 -170
  425. data/lib/datadog/appsec/processor.rb +0 -106
  426. data/lib/datadog/appsec/reactive/address_hash.rb +0 -22
  427. data/lib/datadog/appsec/reactive/engine.rb +0 -47
  428. data/lib/datadog/appsec/reactive/operation.rb +0 -68
  429. data/lib/datadog/appsec/reactive/subscriber.rb +0 -19
  430. data/lib/datadog/appsec/scope.rb +0 -58
  431. data/lib/datadog/appsec/utils/trace_operation.rb +0 -15
  432. data/lib/datadog/core/crashtracking/agent_base_url.rb +0 -21
  433. data/lib/datadog/core/remote/transport/http/api/instance.rb +0 -39
  434. data/lib/datadog/core/remote/transport/http/api/spec.rb +0 -21
  435. data/lib/datadog/core/remote/transport/http/builder.rb +0 -219
  436. data/lib/datadog/core/telemetry/http/env.rb +0 -20
  437. data/lib/datadog/core/telemetry/http/ext.rb +0 -28
  438. data/lib/datadog/core/telemetry/http/response.rb +0 -70
  439. data/lib/datadog/core/telemetry/http/transport.rb +0 -90
  440. data/lib/datadog/di/transport.rb +0 -81
  441. data/lib/datadog/tracing/transport/http/api/spec.rb +0 -19
@@ -28,7 +28,8 @@ module Datadog
28
28
  :provider,
29
29
  :sampler,
30
30
  :span_sampler,
31
- :tags
31
+ :tags,
32
+ :logger
32
33
 
33
34
  attr_accessor \
34
35
  :default_service,
@@ -48,21 +49,28 @@ module Datadog
48
49
  # @param tags [Hash] default tags added to all spans
49
50
  # @param writer [Datadog::Tracing::Writer] consumes traces returned by the provided +trace_flush+
50
51
  def initialize(
52
+ # rubocop:disable Style/KeywordParametersOrder
53
+ # https://github.com/rubocop/rubocop/issues/13933
51
54
  trace_flush: Flush::Finished.new,
52
55
  context_provider: DefaultContextProvider.new,
53
56
  default_service: Core::Environment::Ext::FALLBACK_SERVICE_NAME,
54
57
  enabled: true,
58
+ logger: Datadog.logger,
55
59
  sampler: Sampling::PrioritySampler.new(
56
60
  base_sampler: Sampling::AllSampler.new,
57
61
  post_sampler: Sampling::RuleSampler.new
58
62
  ),
59
63
  span_sampler: Sampling::Span::Sampler.new,
60
64
  tags: {},
61
- writer: Writer.new
65
+ # writer is not defaulted because creating it requires agent_settings,
66
+ # which we do not have here and otherwise do not need.
67
+ writer:
68
+ # rubocop:enable Style/KeywordParametersOrder
62
69
  )
63
70
  @trace_flush = trace_flush
64
71
  @default_service = default_service
65
72
  @enabled = enabled
73
+ @logger = logger
66
74
  @provider = context_provider
67
75
  @sampler = sampler
68
76
  @span_sampler = span_sampler
@@ -146,7 +154,7 @@ module Datadog
146
154
  active_trace
147
155
  end
148
156
  rescue StandardError => e
149
- Datadog.logger.debug { "Failed to trace: #{e}" }
157
+ logger.debug { "Failed to trace: #{e}" }
150
158
 
151
159
  # Tracing failed: fallback and run code without tracing.
152
160
  return skip_trace(name, &block)
@@ -265,10 +273,10 @@ module Datadog
265
273
  # Sample a span, tagging the trace as appropriate.
266
274
  def sample_trace(trace_op)
267
275
  begin
268
- @sampler.sample!(trace_op)
276
+ @sampler.sample!(trace_op) if trace_op.sampling_priority.nil?
269
277
  rescue StandardError => e
270
278
  SAMPLE_TRACE_LOG_ONLY_ONCE.run do
271
- Datadog.logger.warn { "Failed to sample trace: #{e.class.name} #{e} at #{Array(e.backtrace).first}" }
279
+ logger.warn { "Failed to sample trace: #{e.class.name} #{e} at #{Array(e.backtrace).first}" }
272
280
  end
273
281
  end
274
282
  end
@@ -330,24 +338,32 @@ module Datadog
330
338
  hostname = hostname && !hostname.empty? ? hostname : nil
331
339
 
332
340
  if digest
341
+ sampling_priority = if propagate_sampling_priority?(upstream_tags: digest.trace_distributed_tags)
342
+ digest.trace_sampling_priority
343
+ end
333
344
  TraceOperation.new(
345
+ logger: logger,
334
346
  hostname: hostname,
335
347
  profiling_enabled: profiling_enabled,
348
+ apm_tracing_enabled: apm_tracing_enabled,
336
349
  id: digest.trace_id,
337
350
  origin: digest.trace_origin,
338
351
  parent_span_id: digest.span_id,
339
- sampling_priority: digest.trace_sampling_priority,
352
+ sampling_priority: sampling_priority,
340
353
  # Distributed tags are just regular trace tags with special meaning to Datadog
341
354
  tags: digest.trace_distributed_tags,
342
355
  trace_state: digest.trace_state,
343
356
  trace_state_unknown_fields: digest.trace_state_unknown_fields,
344
357
  remote_parent: digest.span_remote,
345
- tracer: self
358
+ tracer: self,
359
+ baggage: digest.baggage
346
360
  )
347
361
  else
348
362
  TraceOperation.new(
363
+ logger: logger,
349
364
  hostname: hostname,
350
365
  profiling_enabled: profiling_enabled,
366
+ apm_tracing_enabled: apm_tracing_enabled,
351
367
  remote_parent: false,
352
368
  tracer: self
353
369
  )
@@ -362,7 +378,12 @@ module Datadog
362
378
  event_span_op.service ||= @default_service
363
379
  end
364
380
 
381
+ events.trace_propagated.subscribe do |event_trace_op|
382
+ sample_trace(event_trace_op)
383
+ end
384
+
365
385
  events.span_finished.subscribe do |event_span, event_trace_op|
386
+ sample_trace(trace_op) if event_trace_op.sampling_priority.nil?
366
387
  sample_span(event_trace_op, event_span)
367
388
  flush_trace(event_trace_op)
368
389
  end
@@ -396,12 +417,13 @@ module Datadog
396
417
  )
397
418
  trace = _trace || start_trace(continue_from: continue_from)
398
419
 
399
- events = SpanOperation::Events.new
420
+ events = SpanOperation::Events.new(logger: logger)
400
421
 
401
422
  if block
402
423
  # Ignore start time if a block has been given
403
424
  trace.measure(
404
425
  name,
426
+ logger: logger,
405
427
  events: events,
406
428
  on_error: on_error,
407
429
  resource: resource,
@@ -415,6 +437,7 @@ module Datadog
415
437
  # Return the new span
416
438
  span = trace.build_span(
417
439
  name,
440
+ logger: logger,
418
441
  events: events,
419
442
  on_error: on_error,
420
443
  resource: resource,
@@ -488,7 +511,7 @@ module Datadog
488
511
  @span_sampler.sample!(trace_op, span)
489
512
  rescue StandardError => e
490
513
  SAMPLE_SPAN_LOG_ONLY_ONCE.run do
491
- Datadog.logger.warn { "Failed to sample span: #{e.class.name} #{e} at #{Array(e.backtrace).first}" }
514
+ logger.warn { "Failed to sample span: #{e.class.name} #{e} at #{Array(e.backtrace).first}" }
492
515
  end
493
516
  end
494
517
  end
@@ -498,13 +521,12 @@ module Datadog
498
521
 
499
522
  # Flush finished spans from the trace buffer, send them to writer.
500
523
  def flush_trace(trace_op)
501
- sample_trace(trace_op) unless trace_op.sampling_priority
502
524
  begin
503
525
  trace = @trace_flush.consume!(trace_op)
504
526
  write(trace) if trace && !trace.empty?
505
527
  rescue StandardError => e
506
528
  FLUSH_TRACE_LOG_ONLY_ONCE.run do
507
- Datadog.logger.warn { "Failed to flush trace: #{e.class.name} #{e} at #{Array(e.backtrace).first}" }
529
+ logger.warn { "Failed to flush trace: #{e.class.name} #{e} at #{Array(e.backtrace).first}" }
508
530
  end
509
531
  end
510
532
  end
@@ -518,7 +540,7 @@ module Datadog
518
540
  return unless trace && @writer
519
541
 
520
542
  if Datadog.configuration.diagnostics.debug
521
- Datadog.logger.debug { "Writing #{trace.length} spans (enabled: #{@enabled})\n#{trace.spans.pretty_inspect}" }
543
+ logger.debug { "Writing #{trace.length} spans (enabled: #{@enabled})\n#{trace.spans.pretty_inspect}" }
522
544
  end
523
545
 
524
546
  @writer.write(trace)
@@ -527,20 +549,50 @@ module Datadog
527
549
 
528
550
  # TODO: Make these dummy objects singletons to preserve memory.
529
551
  def skip_trace(name)
530
- span = SpanOperation.new(name)
552
+ span = SpanOperation.new(name, logger: logger)
531
553
 
532
554
  if block_given?
533
- trace = TraceOperation.new
555
+ trace = TraceOperation.new(logger: logger)
534
556
  yield(span, trace)
535
557
  else
536
558
  span
537
559
  end
538
560
  end
539
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
+
540
579
  def profiling_enabled
541
580
  @profiling_enabled ||=
542
581
  !!(defined?(Datadog::Profiling) && Datadog::Profiling.respond_to?(:enabled?) && Datadog::Profiling.enabled?)
543
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
544
596
  end
545
597
  end
546
598
  end
@@ -3,7 +3,8 @@
3
3
  require_relative '../../../core/encoding'
4
4
 
5
5
  require_relative '../../../core/transport/http/api/map'
6
- require_relative 'api/spec'
6
+ require_relative '../../../core/transport/http/api/instance'
7
+ require_relative '../../../core/transport/http/api/spec'
7
8
 
8
9
  require_relative 'traces'
9
10
 
@@ -20,15 +21,15 @@ module Datadog
20
21
  module_function
21
22
 
22
23
  def defaults
23
- Datadog::Core::Transport::HTTP::API::Map[
24
- V4 => Spec.new do |s|
24
+ Core::Transport::HTTP::API::Map[
25
+ V4 => Traces::API::Spec.new do |s|
25
26
  s.traces = Traces::API::Endpoint.new(
26
27
  '/v0.4/traces',
27
28
  Core::Encoding::MsgpackEncoder,
28
29
  service_rates: true
29
30
  )
30
31
  end,
31
- V3 => Spec.new do |s|
32
+ V3 => Traces::API::Spec.new do |s|
32
33
  s.traces = Traces::API::Endpoint.new(
33
34
  '/v0.3/traces',
34
35
  Core::Encoding::MsgpackEncoder
@@ -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,7 +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 'api/instance'
9
+ require_relative '../../../core/transport/http/api/spec'
10
+ require_relative '../../../core/transport/http/api/instance'
10
11
 
11
12
  module Datadog
12
13
  module Tracing
@@ -36,16 +37,12 @@ module Datadog
36
37
  end
37
38
 
38
39
  module API
39
- # Extensions for HTTP API Spec
40
- module Spec
41
- attr_reader :traces
42
-
43
- def traces=(endpoint)
44
- @traces = endpoint
45
- end
40
+ # HTTP API Spec
41
+ class Spec < Core::Transport::HTTP::API::Spec
42
+ attr_accessor :traces
46
43
 
47
44
  def send_traces(env, &block)
48
- raise NoTraceEndpointDefinedError, self if traces.nil?
45
+ raise Core::Transport::HTTP::API::Spec::EndpointNotDefinedError.new('traces', self) if traces.nil?
49
46
 
50
47
  traces.call(env, &block)
51
48
  end
@@ -53,47 +50,21 @@ module Datadog
53
50
  def encoder
54
51
  traces.encoder
55
52
  end
56
-
57
- # Raised when traces sent but no traces endpoint is defined
58
- class NoTraceEndpointDefinedError < StandardError
59
- attr_reader :spec
60
-
61
- def initialize(spec)
62
- super
63
-
64
- @spec = spec
65
- end
66
-
67
- def message
68
- 'No trace endpoint is defined for API specification!'
69
- end
70
- end
71
53
  end
72
54
 
73
- # Extensions for HTTP API Instance
74
- module Instance
55
+ # HTTP API Instance
56
+ class Instance < Core::Transport::HTTP::API::Instance
75
57
  def send_traces(env)
76
- 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
77
63
 
78
64
  spec.send_traces(env) do |request_env|
79
65
  call(request_env)
80
66
  end
81
67
  end
82
-
83
- # Raised when traces sent to API that does not support traces
84
- class TracesNotSupportedError < StandardError
85
- attr_reader :spec
86
-
87
- def initialize(spec)
88
- super
89
-
90
- @spec = spec
91
- end
92
-
93
- def message
94
- 'Traces not supported for this API!'
95
- end
96
- end
97
68
  end
98
69
 
99
70
  # Endpoint for submitting trace data
@@ -143,8 +114,6 @@ module Datadog
143
114
 
144
115
  # Add traces behavior to transport components
145
116
  HTTP::Client.include(Traces::Client)
146
- HTTP::API::Spec.include(Traces::API::Spec)
147
- HTTP::API::Instance.include(Traces::API::Instance)
148
117
  end
149
118
  end
150
119
  end
@@ -1,15 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'uri'
4
-
5
3
  require_relative '../../core/environment/container'
6
4
  require_relative '../../core/environment/ext'
7
5
  require_relative '../../core/transport/ext'
8
- require_relative '../../core/transport/http/adapters/net'
9
- require_relative '../../core/transport/http/adapters/test'
10
- require_relative '../../core/transport/http/adapters/unix_socket'
6
+ require_relative '../../core/transport/http'
11
7
  require_relative 'http/api'
12
- require_relative 'http/builder'
13
8
  require_relative '../../../datadog/version'
14
9
 
15
10
  module Datadog
@@ -17,84 +12,32 @@ module Datadog
17
12
  module Transport
18
13
  # Namespace for HTTP transport components
19
14
  module HTTP
20
- # NOTE: Due to... legacy reasons... This class likes having a default `AgentSettings` instance to fall back to.
21
- # Because we generate this instance with an empty instance of `Settings`, the resulting `AgentSettings` below
22
- # represents only settings specified via environment variables + the usual defaults.
23
- #
24
- # DO NOT USE THIS IN NEW CODE, as it ignores any settings specified by users via `Datadog.configure`.
25
- DO_NOT_USE_ENVIRONMENT_AGENT_SETTINGS = Datadog::Core::Configuration::AgentSettingsResolver.call(
26
- Datadog::Core::Configuration::Settings.new,
27
- logger: nil,
28
- )
29
-
30
15
  module_function
31
16
 
32
- # Builds a new Transport::HTTP::Client
33
- def new(&block)
34
- Builder.new(&block).to_transport
35
- end
36
-
37
17
  # Builds a new Transport::HTTP::Client with default settings
38
18
  # Pass a block to override any settings.
39
19
  def default(
40
- agent_settings: DO_NOT_USE_ENVIRONMENT_AGENT_SETTINGS,
41
- **options
20
+ agent_settings:,
21
+ logger: Datadog.logger,
22
+ api_version: nil,
23
+ headers: nil
42
24
  )
43
- new do |transport|
44
- transport.adapter(agent_settings)
45
- transport.headers default_headers
46
-
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|
47
32
  apis = API.defaults
48
33
 
49
34
  transport.api API::V4, apis[API::V4], fallback: API::V3, default: true
50
35
  transport.api API::V3, apis[API::V3]
51
36
 
52
- # Apply any settings given by options
53
- unless options.empty?
54
- transport.default_api = options[:api_version] if options.key?(:api_version)
55
- transport.headers options[:headers] if options.key?(:headers)
56
- end
57
-
58
37
  # Call block to apply any customization, if provided
59
38
  yield(transport) if block_given?
60
- end
39
+ end.to_transport(Transport::Traces::Transport)
61
40
  end
62
-
63
- def default_headers
64
- {
65
- Datadog::Core::Transport::Ext::HTTP::HEADER_CLIENT_COMPUTED_TOP_LEVEL => '1',
66
- Datadog::Core::Transport::Ext::HTTP::HEADER_META_LANG => Datadog::Core::Environment::Ext::LANG,
67
- Datadog::Core::Transport::Ext::HTTP::HEADER_META_LANG_VERSION => Datadog::Core::Environment::Ext::LANG_VERSION,
68
- Datadog::Core::Transport::Ext::HTTP::HEADER_META_LANG_INTERPRETER =>
69
- Datadog::Core::Environment::Ext::LANG_INTERPRETER,
70
- Datadog::Core::Transport::Ext::HTTP::HEADER_META_LANG_INTERPRETER_VENDOR => Core::Environment::Ext::LANG_ENGINE,
71
- Datadog::Core::Transport::Ext::HTTP::HEADER_META_TRACER_VERSION =>
72
- Datadog::Core::Environment::Ext::GEM_DATADOG_VERSION
73
- }.tap do |headers|
74
- # Add container ID, if present.
75
- container_id = Datadog::Core::Environment::Container.container_id
76
- headers[Datadog::Core::Transport::Ext::HTTP::HEADER_CONTAINER_ID] = container_id unless container_id.nil?
77
- # Pretend that stats computation are already done by the client
78
- if Datadog.configuration.appsec.standalone.enabled
79
- headers[Datadog::Core::Transport::Ext::HTTP::HEADER_CLIENT_COMPUTED_STATS] = 'yes'
80
- end
81
- end
82
- end
83
-
84
- def default_adapter
85
- Datadog::Core::Configuration::Ext::Agent::HTTP::ADAPTER
86
- end
87
-
88
- # Add adapters to registry
89
- Builder::REGISTRY.set(
90
- Datadog::Core::Transport::HTTP::Adapters::Net,
91
- Datadog::Core::Configuration::Ext::Agent::HTTP::ADAPTER
92
- )
93
- Builder::REGISTRY.set(Datadog::Core::Transport::HTTP::Adapters::Test, Datadog::Core::Transport::Ext::Test::ADAPTER)
94
- Builder::REGISTRY.set(
95
- Datadog::Core::Transport::HTTP::Adapters::UnixSocket,
96
- Datadog::Core::Transport::Ext::UnixSocket::ADAPTER
97
- )
98
41
  end
99
42
  end
100
43
  end
@@ -12,8 +12,11 @@ module Datadog
12
12
  attr_reader \
13
13
  :trace
14
14
 
15
- def initialize(trace)
15
+ # @param trace [Datadog::Trace] the trace to serialize
16
+ # @param native_events_supported [Boolean] whether the agent supports span events as a top-level field
17
+ def initialize(trace, native_events_supported:)
16
18
  @trace = trace
19
+ @native_events_supported = native_events_supported
17
20
  end
18
21
 
19
22
  # MessagePack serializer interface. Making this object
@@ -26,13 +29,17 @@ module Datadog
26
29
  # @param packer [MessagePack::Packer] serialization buffer, can be +nil+ with JRuby
27
30
  def to_msgpack(packer = nil)
28
31
  # As of 1.3.3, JRuby implementation doesn't pass an existing packer
29
- trace.spans.map { |s| SerializableSpan.new(s) }.to_msgpack(packer)
32
+ trace.spans.map do |s|
33
+ SerializableSpan.new(s, native_events_supported: @native_events_supported)
34
+ end.to_msgpack(packer)
30
35
  end
31
36
 
32
37
  # JSON serializer interface.
33
38
  # Used by older version of the transport.
34
39
  def to_json(*args)
35
- trace.spans.map { |s| SerializableSpan.new(s).to_hash }.to_json(*args)
40
+ trace.spans.map do |s|
41
+ SerializableSpan.new(s, native_events_supported: @native_events_supported).to_hash
42
+ end.to_json(*args)
36
43
  end
37
44
  end
38
45
 
@@ -41,9 +48,12 @@ module Datadog
41
48
  attr_reader \
42
49
  :span
43
50
 
44
- def initialize(span)
51
+ # @param span [Datadog::Span] the span to serialize
52
+ # @param native_events_supported [Boolean] whether the agent supports span events as a top-level field
53
+ def initialize(span, native_events_supported:)
45
54
  @span = span
46
55
  @trace_id = Tracing::Utils::TraceId.to_low_order(span.trace_id)
56
+ @native_events_supported = native_events_supported
47
57
  end
48
58
 
49
59
  # MessagePack serializer interface. Making this object
@@ -55,10 +65,13 @@ module Datadog
55
65
  #
56
66
  # @param packer [MessagePack::Packer] serialization buffer, can be +nil+ with JRuby
57
67
  # rubocop:disable Metrics/AbcSize
68
+ # rubocop:disable Metrics/MethodLength
58
69
  def to_msgpack(packer = nil)
59
70
  packer ||= MessagePack::Packer.new
60
71
 
61
- number_of_elements_to_write = 11
72
+ number_of_elements_to_write = 12
73
+
74
+ number_of_elements_to_write += 1 if span.events.any? && @native_events_supported
62
75
 
63
76
  if span.stopped?
64
77
  packer.write_map_header(number_of_elements_to_write + 2) # Set header with how many elements in the map
@@ -72,8 +85,16 @@ module Datadog
72
85
  packer.write_map_header(number_of_elements_to_write) # Set header with how many elements in the map
73
86
  end
74
87
 
75
- # serialize span events as meta tags
76
- span.set_tag('events', span.events.map(&:to_hash).to_json) if span.events.any?
88
+ if span.events.any?
89
+ if @native_events_supported
90
+ # Use top-level field for native events
91
+ packer.write('span_events')
92
+ packer.write(span.events.map(&:to_native_format))
93
+ else
94
+ # Serialize span events as meta tags
95
+ span.set_tag('events', span.events.map(&:to_hash).to_json)
96
+ end
97
+ end
77
98
 
78
99
  # DEV: We use strings as keys here, instead of symbols, as
79
100
  # DEV: MessagePack will ultimately convert them to strings.
@@ -96,6 +117,8 @@ module Datadog
96
117
  packer.write(span.meta)
97
118
  packer.write('metrics')
98
119
  packer.write(span.metrics)
120
+ packer.write('meta_struct')
121
+ packer.write(span.metastruct)
99
122
  packer.write('span_links')
100
123
  packer.write(span.links.map(&:to_hash))
101
124
  packer.write('error')
@@ -103,6 +126,7 @@ module Datadog
103
126
  packer
104
127
  end
105
128
  # rubocop:enable Metrics/AbcSize
129
+ # rubocop:enable Metrics/MethodLength
106
130
 
107
131
  # JSON serializer interface.
108
132
  # Used by older version of the transport.
@@ -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