datadog 2.7.1 → 2.17.0

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