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
@@ -13,43 +13,23 @@ module Datadog
13
13
  def initialize(agent_settings:, site:, api_key:, upload_timeout_seconds:)
14
14
  @upload_timeout_milliseconds = (upload_timeout_seconds * 1_000).to_i
15
15
 
16
- validate_agent_settings(agent_settings)
17
-
18
16
  @exporter_configuration =
19
17
  if agentless?(site, api_key)
20
18
  [:agentless, site, api_key].freeze
21
19
  else
22
- [:agent, base_url_from(agent_settings)].freeze
20
+ [:agent, agent_settings.url].freeze
23
21
  end
24
22
 
25
- status, result = validate_exporter(exporter_configuration)
23
+ status, result = self.class._native_validate_exporter(exporter_configuration)
26
24
 
27
25
  raise(ArgumentError, "Failed to initialize transport: #{result}") if status == :error
28
26
  end
29
27
 
30
28
  def export(flush)
31
- status, result = do_export(
32
- exporter_configuration: exporter_configuration,
33
- upload_timeout_milliseconds: @upload_timeout_milliseconds,
34
-
35
- # why "timespec"?
36
- # libdatadog represents time using POSIX's struct timespec, see
37
- # https://www.gnu.org/software/libc/manual/html_node/Time-Types.html
38
- # aka it represents the seconds part separate from the nanoseconds part
39
- start_timespec_seconds: flush.start.tv_sec,
40
- start_timespec_nanoseconds: flush.start.tv_nsec,
41
- finish_timespec_seconds: flush.finish.tv_sec,
42
- finish_timespec_nanoseconds: flush.finish.tv_nsec,
43
-
44
- pprof_file_name: flush.pprof_file_name,
45
- pprof_data: flush.pprof_data,
46
- code_provenance_file_name: flush.code_provenance_file_name,
47
- code_provenance_data: flush.code_provenance_data,
48
-
49
- tags_as_array: flush.tags_as_array,
50
- internal_metadata_json: flush.internal_metadata_json,
51
-
52
- info_json: flush.info_json
29
+ status, result = self.class._native_do_export(
30
+ exporter_configuration,
31
+ @upload_timeout_milliseconds,
32
+ flush
53
33
  )
54
34
 
55
35
  if status == :ok
@@ -57,7 +37,7 @@ module Datadog
57
37
  Datadog.logger.debug("Successfully reported profiling data")
58
38
  true
59
39
  else
60
- Datadog.logger.error(
40
+ Datadog.logger.warn(
61
41
  "Failed to report profiling data (#{config_without_api_key}): " \
62
42
  "server returned unexpected HTTP #{result} status code"
63
43
  )
@@ -67,7 +47,7 @@ module Datadog
67
47
  false
68
48
  end
69
49
  else
70
- Datadog.logger.error("Failed to report profiling data (#{config_without_api_key}): #{result}")
50
+ Datadog.logger.warn("Failed to report profiling data (#{config_without_api_key}): #{result}")
71
51
  Datadog::Core::Telemetry::Logger.error("Failed to report profiling data")
72
52
  false
73
53
  end
@@ -75,69 +55,10 @@ module Datadog
75
55
 
76
56
  private
77
57
 
78
- def base_url_from(agent_settings)
79
- case agent_settings.adapter
80
- when Datadog::Core::Configuration::Ext::Agent::HTTP::ADAPTER
81
- "#{agent_settings.ssl ? "https" : "http"}://#{agent_settings.hostname}:#{agent_settings.port}/"
82
- when Datadog::Core::Configuration::Ext::Agent::UnixSocket::ADAPTER
83
- "unix://#{agent_settings.uds_path}"
84
- else
85
- raise ArgumentError, "Unexpected adapter: #{agent_settings.adapter}"
86
- end
87
- end
88
-
89
- def validate_agent_settings(agent_settings)
90
- supported_adapters = [
91
- Datadog::Core::Configuration::Ext::Agent::UnixSocket::ADAPTER,
92
- Datadog::Core::Configuration::Ext::Agent::HTTP::ADAPTER
93
- ]
94
- unless supported_adapters.include?(agent_settings.adapter)
95
- raise ArgumentError,
96
- "Unsupported transport configuration for profiling: Adapter #{agent_settings.adapter} " \
97
- " is not supported"
98
- end
99
- end
100
-
101
58
  def agentless?(site, api_key)
102
59
  site && api_key && Core::Environment::VariableHelpers.env_to_bool(Profiling::Ext::ENV_AGENTLESS, false)
103
60
  end
104
61
 
105
- def validate_exporter(exporter_configuration)
106
- self.class._native_validate_exporter(exporter_configuration)
107
- end
108
-
109
- def do_export(
110
- exporter_configuration:,
111
- upload_timeout_milliseconds:,
112
- start_timespec_seconds:,
113
- start_timespec_nanoseconds:,
114
- finish_timespec_seconds:,
115
- finish_timespec_nanoseconds:,
116
- pprof_file_name:,
117
- pprof_data:,
118
- code_provenance_file_name:,
119
- code_provenance_data:,
120
- tags_as_array:,
121
- internal_metadata_json:,
122
- info_json:
123
- )
124
- self.class._native_do_export(
125
- exporter_configuration,
126
- upload_timeout_milliseconds,
127
- start_timespec_seconds,
128
- start_timespec_nanoseconds,
129
- finish_timespec_seconds,
130
- finish_timespec_nanoseconds,
131
- pprof_file_name,
132
- pprof_data,
133
- code_provenance_file_name,
134
- code_provenance_data,
135
- tags_as_array,
136
- internal_metadata_json,
137
- info_json,
138
- )
139
- end
140
-
141
62
  def config_without_api_key
142
63
  "#{exporter_configuration[0]}: #{exporter_configuration[1]}"
143
64
  end
@@ -1,41 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # This file is used to load the profiling native extension. It works in two steps:
4
- #
5
- # 1. Load the datadog_profiling_loader extension. This extension will be used to load the actual extension, but in
6
- # a special way that avoids exposing native-level code symbols. See `datadog_profiling_loader.c` for more details.
7
- #
8
- # 2. Use the Datadog::Profiling::Loader exposed by the datadog_profiling_loader extension to load the actual
9
- # profiling native extension.
10
- #
11
- # All code on this file is on-purpose at the top-level; this makes it so this file is executed only once,
12
- # the first time it gets required, to avoid any issues with the native extension being initialized more than once.
13
-
14
3
  begin
15
- require "datadog_profiling_loader.#{RUBY_VERSION}_#{RUBY_PLATFORM}"
4
+ require "datadog_profiling_native_extension.#{RUBY_VERSION}_#{RUBY_PLATFORM}"
16
5
  rescue LoadError => e
17
6
  raise LoadError,
18
7
  "Failed to load the profiling loader extension. To fix this, please remove and then reinstall datadog " \
19
8
  "(Details: #{e.message})"
20
9
  end
21
-
22
- extension_name = "datadog_profiling_native_extension.#{RUBY_VERSION}_#{RUBY_PLATFORM}"
23
- file_name = "#{extension_name}.#{RbConfig::CONFIG["DLEXT"]}"
24
- full_file_path = "#{__dir__}/../../#{file_name}"
25
-
26
- unless File.exist?(full_file_path)
27
- extension_dir = Gem.loaded_specs["datadog"].extension_dir
28
- candidate_path = "#{extension_dir}/#{file_name}"
29
- if File.exist?(candidate_path)
30
- full_file_path = candidate_path
31
- else
32
- # We found none of the files. This is unexpected. Let's go ahead anyway, the error is going to be reported further
33
- # down anyway.
34
- end
35
- end
36
-
37
- init_function_name = "Init_#{extension_name.split(".").first}"
38
-
39
- status, result = Datadog::Profiling::Loader._native_load(full_file_path, init_function_name)
40
-
41
- raise "Failure to load #{extension_name} due to #{result}" if status == :error
@@ -50,6 +50,8 @@ module Datadog
50
50
  "Detected issue with profiler (#{failed_component} component), stopping profiling. " \
51
51
  "See previous log messages for details."
52
52
  )
53
+ Datadog::Core::Telemetry::Logger
54
+ .error("Detected issue with profiler (#{failed_component} component), stopping profiling")
53
55
 
54
56
  # We explicitly not stop the crash tracker in this situation, under the assumption that, if a component failed,
55
57
  # we're operating in a degraded state and crash tracking may still be helpful.
@@ -37,6 +37,7 @@ module Datadog
37
37
  @exporter = exporter
38
38
  @transport = transport
39
39
  @profiler_failed = false
40
+ @stop_requested = false
40
41
 
41
42
  # Workers::Async::Thread settings
42
43
  self.fork_policy = fork_policy
@@ -67,6 +68,7 @@ module Datadog
67
68
  "Cause: #{e.class.name} #{e.message} Location: #{Array(e.backtrace).first}"
68
69
  )
69
70
  on_failure_proc&.call
71
+ Datadog::Core::Telemetry::Logger.report(e, description: "Profiling::Scheduler thread error")
70
72
  raise
71
73
  ensure
72
74
  Datadog.logger.debug("#flush was interrupted or failed before it could complete") if interrupted
@@ -88,7 +90,7 @@ module Datadog
88
90
  end
89
91
 
90
92
  def work_pending?
91
- !profiler_failed && exporter.can_flush?
93
+ !profiler_failed && exporter.can_flush? && (run_loop? || !stop_requested?)
92
94
  end
93
95
 
94
96
  def reset_after_fork
@@ -132,14 +134,20 @@ module Datadog
132
134
  begin
133
135
  transport.export(flush)
134
136
  rescue => e
135
- Datadog.logger.error(
137
+ Datadog.logger.warn(
136
138
  "Unable to report profile. Cause: #{e.class.name} #{e.message} Location: #{Array(e.backtrace).first}"
137
139
  )
138
140
  Datadog::Core::Telemetry::Logger.report(e, description: "Unable to report profile")
139
141
  end
140
142
 
143
+ @stop_requested = !run_loop?
144
+
141
145
  true
142
146
  end
147
+
148
+ def stop_requested?
149
+ @stop_requested
150
+ end
143
151
  end
144
152
  end
145
153
  end
@@ -23,7 +23,7 @@ module Datadog
23
23
  # This isn't something we expect to happen normally, but because it would break the assumptions of the
24
24
  # C-level mutexes (that there is a single serializer thread), we add it here as an extra safeguard against it
25
25
  # accidentally happening.
26
- @no_concurrent_synchronize_mutex = Mutex.new
26
+ @no_concurrent_serialize_mutex = Mutex.new
27
27
 
28
28
  self.class._native_initialize(
29
29
  self_instance: self,
@@ -60,31 +60,31 @@ module Datadog
60
60
  end
61
61
 
62
62
  def serialize
63
- status, result = @no_concurrent_synchronize_mutex.synchronize { self.class._native_serialize(self) }
63
+ status, result = @no_concurrent_serialize_mutex.synchronize { self.class._native_serialize(self) }
64
64
 
65
65
  if status == :ok
66
- start, finish, encoded_pprof, profile_stats = result
66
+ start, finish, encoded_profile, profile_stats = result
67
67
 
68
68
  Datadog.logger.debug { "Encoded profile covering #{start.iso8601} to #{finish.iso8601}" }
69
69
 
70
- [start, finish, encoded_pprof, profile_stats]
70
+ [start, finish, encoded_profile, profile_stats]
71
71
  else
72
72
  error_message = result
73
73
 
74
- Datadog.logger.error("Failed to serialize profiling data: #{error_message}")
75
- Datadog::Core::Telemetry::Logger.error("Failed to serialize profiling data")
74
+ Datadog.logger.warn("Failed to serialize profiling data: #{error_message}")
75
+ Datadog::Core::Telemetry::Logger.error("Failed to serialize profiling data (#{error_message})")
76
76
 
77
77
  nil
78
78
  end
79
79
  end
80
80
 
81
81
  def serialize!
82
- status, result = @no_concurrent_synchronize_mutex.synchronize { self.class._native_serialize(self) }
82
+ status, result = @no_concurrent_serialize_mutex.synchronize { self.class._native_serialize(self) }
83
83
 
84
84
  if status == :ok
85
- _start, _finish, encoded_pprof = result
85
+ _start, _finish, encoded_profile = result
86
86
 
87
- encoded_pprof
87
+ encoded_profile
88
88
  else
89
89
  error_message = result
90
90
 
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative "../core/tag_builder"
3
4
  require_relative "../core/utils"
4
- require_relative "../core/environment/git"
5
5
 
6
6
  module Datadog
7
7
  module Profiling
@@ -11,49 +11,13 @@ module Datadog
11
11
 
12
12
  def self.call(
13
13
  settings:,
14
- # Unified service tagging
15
- env: settings.env,
16
- service: settings.service,
17
- version: settings.version,
18
14
  # Other metadata
19
- host: Core::Environment::Socket.hostname,
20
- language: Core::Environment::Identity.lang,
21
- pid: Process.pid.to_s,
22
- # TODO: If profiling is extracted and its version diverges from the datadog gem, this is inaccurate.
23
- # Update if this ever occurs.
24
- profiler_version: Core::Environment::Identity.gem_datadog_version,
25
- runtime_engine: Core::Environment::Identity.lang_engine,
26
- runtime_id: Core::Environment::Identity.id,
27
- runtime_platform: Core::Environment::Identity.lang_platform,
28
- runtime_version: Core::Environment::Identity.lang_version,
29
- git_repository_url: Core::Environment::Git.git_repository_url,
30
- git_commit_sha: Core::Environment::Git.git_commit_sha,
31
- # User-provided tags
32
- user_tags: settings.tags
15
+ profiler_version: Core::Environment::Identity.gem_datadog_version
33
16
  )
34
- tags = {
35
- # When changing or adding these, make sure they are kept in sync with
36
- # https://docs.google.com/spreadsheets/d/1LOGMf4c4Avbtn36uZ2SWvhIGKRPLM1BoWkUP4JYj7hA/ (Datadog internal link)
37
- FORM_FIELD_TAG_HOST => host,
38
- FORM_FIELD_TAG_LANGUAGE => language,
39
- FORM_FIELD_TAG_PID => pid,
17
+ hash = Core::TagBuilder.tags(settings).merge(
40
18
  FORM_FIELD_TAG_PROFILER_VERSION => profiler_version,
41
- FORM_FIELD_TAG_RUNTIME => language, # This is known to be repeated from language, above
42
- FORM_FIELD_TAG_RUNTIME_ENGINE => runtime_engine,
43
- FORM_FIELD_TAG_RUNTIME_ID => runtime_id,
44
- FORM_FIELD_TAG_RUNTIME_PLATFORM => runtime_platform,
45
- FORM_FIELD_TAG_RUNTIME_VERSION => runtime_version,
46
- }
47
- tags[FORM_FIELD_TAG_ENV] = env if env
48
- tags[FORM_FIELD_TAG_SERVICE] = service if service
49
- tags[FORM_FIELD_TAG_VERSION] = version if version
50
- tags[TAG_GIT_REPOSITORY_URL] = git_repository_url if git_repository_url
51
- tags[TAG_GIT_COMMIT_SHA] = git_commit_sha if git_commit_sha
52
-
53
- # Make sure everything is an utf-8 string, to avoid encoding issues in native code/libddprof/further downstream
54
- user_tags.merge(tags).map do |key, value|
55
- [Datadog::Core::Utils.utf8_encode(key), Datadog::Core::Utils.utf8_encode(value)]
56
- end.to_h
19
+ )
20
+ Core::Utils.encode_tags(hash)
57
21
  end
58
22
  end
59
23
  end
@@ -19,6 +19,7 @@ module Datadog
19
19
  "Profiler extensions unavailable. Cause: #{e.class.name} #{e.message} " \
20
20
  "Location: #{Array(e.backtrace).first}"
21
21
  end
22
+ Datadog::Core::Telemetry::Logger.report(e, description: "Profiler extensions unavailable")
22
23
  end
23
24
  end
24
25
 
@@ -33,6 +34,7 @@ module Datadog
33
34
  "Error during post-fork hooks. Cause: #{e.class.name} #{e.message} " \
34
35
  "Location: #{Array(e.backtrace).first}"
35
36
  end
37
+ Datadog::Core::Telemetry::Logger.report(e, description: "Error during post-fork hooks")
36
38
  end
37
39
  end
38
40
  end
@@ -78,8 +78,11 @@ module Datadog
78
78
  end
79
79
 
80
80
  private_class_method def self.replace_noop_allocation_count
81
- def self.allocation_count # rubocop:disable Lint/NestedMethodDefinition (On purpose!)
82
- Datadog::Profiling::Collectors::CpuAndWallTimeWorker._native_allocation_count
81
+ class << self
82
+ remove_method :allocation_count
83
+ def allocation_count
84
+ Datadog::Profiling::Collectors::CpuAndWallTimeWorker._native_allocation_count
85
+ end
83
86
  end
84
87
  end
85
88
 
@@ -146,6 +149,7 @@ module Datadog
146
149
  require_relative 'profiling/collectors/thread_context'
147
150
  require_relative 'profiling/stack_recorder'
148
151
  require_relative 'profiling/exporter'
152
+ require_relative 'profiling/encoded_profile'
149
153
  require_relative 'profiling/flush'
150
154
  require_relative 'profiling/scheduler'
151
155
  require_relative 'profiling/tasks/setup'
@@ -16,7 +16,7 @@ module Datadog
16
16
  def set_measured(span_op, value = true)
17
17
  return if span_op.nil?
18
18
 
19
- value = value == true || value == 1 ? 1 : 0 # rubocop:disable Style/MultipleComparison
19
+ value = value == true || value == 1 ? 1 : 0
20
20
  span_op.set_metric(Metadata::Ext::Analytics::TAG_MEASURED, value)
21
21
  end
22
22
  end
@@ -6,6 +6,7 @@ require_relative 'sync_writer'
6
6
  require_relative 'sampling/span/rule_parser'
7
7
  require_relative 'sampling/span/sampler'
8
8
  require_relative 'diagnostics/environment_logger'
9
+ require_relative 'contrib/component'
9
10
 
10
11
  module Datadog
11
12
  module Tracing
@@ -49,6 +50,7 @@ module Datadog
49
50
  Tracing::Tracer.new(
50
51
  default_service: settings.service,
51
52
  enabled: settings.tracing.enabled,
53
+ logger: logger,
52
54
  trace_flush: trace_flush,
53
55
  sampler: sampler_delegator,
54
56
  span_sampler: build_span_sampler(settings),
@@ -73,18 +75,11 @@ module Datadog
73
75
  return sampler
74
76
  end
75
77
 
76
- # AppSec events are sent to the backend using traces.
77
- # Standalone ASM billing means that we don't want to charge clients for APM traces,
78
- # so we want to send the minimum amount of traces possible (idealy only traces that contains security events),
79
- # but for features such as API Security, we need to send at least one trace per minute,
80
- # to keep the service alive on the backend side.
81
- if settings.appsec.standalone.enabled
82
- post_sampler = Tracing::Sampling::RuleSampler.new(
83
- [Tracing::Sampling::SimpleRule.new(sample_rate: 1.0)],
84
- rate_limiter: Datadog::Core::TokenBucket.new(1.0 / 60, 1.0),
85
- default_sample_rate: 1.0 / 60
86
- )
87
- end
78
+ # APM Disablement means that we don't want to send traces that only contains APM data.
79
+ # Other products can then put the sampling priority to MANUAL_KEEP if they want to keep traces.
80
+ # (e.g.: AppSec will MANUAL_KEEP traces with AppSec events) and clients will be billed only for those traces.
81
+ # But to keep the service alive on the backend side, we need to send one trace per minute.
82
+ post_sampler = build_rate_limit_post_sampler(seconds: 60) unless settings.apm.tracing.enabled
88
83
 
89
84
  # Sampling rules are provided
90
85
  if (rules = settings.tracing.sampling.rules)
@@ -196,6 +191,15 @@ module Datadog
196
191
  end
197
192
  end
198
193
 
194
+ # Build a post-sampler that limits the rate of traces to one per `seconds`.
195
+ # E.g.: `build_rate_limit_post_sampler(seconds: 60)` will limit the rate to one trace per minute.
196
+ def build_rate_limit_post_sampler(seconds:)
197
+ Tracing::Sampling::RuleSampler.new(
198
+ rate_limiter: Datadog::Core::TokenBucket.new(1.0 / seconds, 1.0),
199
+ default_sample_rate: 1.0
200
+ )
201
+ end
202
+
199
203
  def build_test_mode_trace_flush(settings)
200
204
  # If context flush behavior is provided, use it instead.
201
205
  settings.tracing.test_mode.trace_flush || build_trace_flush(settings)
@@ -12,10 +12,12 @@ module Datadog
12
12
  ENV_OTEL_TRACES_EXPORTER = 'OTEL_TRACES_EXPORTER'
13
13
  ENV_HEADER_TAGS = 'DD_TRACE_HEADER_TAGS'
14
14
  ENV_TRACE_ID_128_BIT_GENERATION_ENABLED = 'DD_TRACE_128_BIT_TRACEID_GENERATION_ENABLED'
15
+ ENV_NATIVE_SPAN_EVENTS = 'DD_TRACE_NATIVE_SPAN_EVENTS'
15
16
 
16
17
  # @public_api
17
18
  module SpanAttributeSchema
18
19
  ENV_GLOBAL_DEFAULT_SERVICE_NAME_ENABLED = 'DD_TRACE_REMOVE_INTEGRATION_SERVICE_NAMES_ENABLED'
20
+ ENV_PEER_SERVICE_DEFAULTS_ENABLED = 'DD_TRACE_PEER_SERVICE_DEFAULTS_ENABLED'
19
21
  ENV_PEER_SERVICE_MAPPING = 'DD_TRACE_PEER_SERVICE_MAPPING'
20
22
  end
21
23
 
@@ -40,8 +42,13 @@ module Datadog
40
42
  # W3C Trace Context
41
43
  PROPAGATION_STYLE_TRACE_CONTEXT = 'tracecontext'
42
44
 
45
+ # W3C Baggage
46
+ # @see https://www.w3.org/TR/baggage/
47
+ PROPAGATION_STYLE_BAGGAGE = 'baggage'
48
+
43
49
  PROPAGATION_STYLE_SUPPORTED = [PROPAGATION_STYLE_DATADOG, PROPAGATION_STYLE_B3_MULTI_HEADER,
44
- PROPAGATION_STYLE_B3_SINGLE_HEADER, PROPAGATION_STYLE_TRACE_CONTEXT].freeze
50
+ PROPAGATION_STYLE_B3_SINGLE_HEADER, PROPAGATION_STYLE_TRACE_CONTEXT,
51
+ PROPAGATION_STYLE_BAGGAGE].freeze
45
52
 
46
53
  # Sets both extract and inject propagation style tho the provided value.
47
54
  # Has lower precedence than `DD_TRACE_PROPAGATION_STYLE_INJECT` or
@@ -42,7 +42,7 @@ module Datadog
42
42
  #
43
43
  # The tracer will try to find distributed headers in the order they are present in the list provided to this option.
44
44
  # The first format to have valid data present will be used.
45
- #
45
+ # Baggage style is a special case, as it will always be extracted in addition if present.
46
46
  # @default `DD_TRACE_PROPAGATION_STYLE_EXTRACT` environment variable (comma-separated list),
47
47
  # otherwise `['datadog','b3multi','b3']`.
48
48
  # @return [Array<String>]
@@ -53,6 +53,7 @@ module Datadog
53
53
  [
54
54
  Tracing::Configuration::Ext::Distributed::PROPAGATION_STYLE_DATADOG,
55
55
  Tracing::Configuration::Ext::Distributed::PROPAGATION_STYLE_TRACE_CONTEXT,
56
+ Tracing::Configuration::Ext::Distributed::PROPAGATION_STYLE_BAGGAGE,
56
57
  ]
57
58
  )
58
59
  o.after_set do |styles|
@@ -74,6 +75,7 @@ module Datadog
74
75
  o.default [
75
76
  Tracing::Configuration::Ext::Distributed::PROPAGATION_STYLE_DATADOG,
76
77
  Tracing::Configuration::Ext::Distributed::PROPAGATION_STYLE_TRACE_CONTEXT,
78
+ Tracing::Configuration::Ext::Distributed::PROPAGATION_STYLE_BAGGAGE,
77
79
  ]
78
80
  o.after_set do |styles|
79
81
  # Make values case-insensitive
@@ -186,7 +188,7 @@ module Datadog
186
188
  # It is not supported by our backend yet. Do not enable it.
187
189
  option :trace_id_128_bit_logging_enabled do |o|
188
190
  o.env Tracing::Configuration::Ext::Correlation::ENV_TRACE_ID_128_BIT_LOGGING_ENABLED
189
- o.default false
191
+ o.default true
190
192
  o.type :bool
191
193
  end
192
194
 
@@ -249,6 +251,20 @@ module Datadog
249
251
  o.type :bool
250
252
  end
251
253
 
254
+ # Forces the tracer to always send span events with the native span events format
255
+ # regardless of the agent support. This is useful in agent-less setups.
256
+ #
257
+ # When set to `nil`, the default, the agent will be queried for
258
+ # native span events support.
259
+ #
260
+ # @default `DD_TRACE_NATIVE_SPAN_EVENTS` environment variable, otherwise `false`
261
+ # @return [Boolean,nil]
262
+ option :native_span_events do |o|
263
+ o.env Tracing::Configuration::Ext::ENV_NATIVE_SPAN_EVENTS
264
+ o.default nil
265
+ o.type :bool, nilable: true
266
+ end
267
+
252
268
  # A custom sampler instance.
253
269
  # The object must respect the {Datadog::Tracing::Sampling::Sampler} interface.
254
270
  # @default `nil`
@@ -368,22 +384,18 @@ module Datadog
368
384
  end
369
385
  end
370
386
 
371
- # [Continuous Integration Visibility](https://docs.datadoghq.com/continuous_integration/) configuration.
387
+ # This is only for internal Datadog use via https://github.com/DataDog/datadog-ci-rb . It should not be
388
+ # used directly.
389
+ #
390
+ # DEV-3.0: Make this a non-public API in the next release.
372
391
  # @public_api
373
392
  settings :test_mode do
374
- # Enable test mode. This allows the tracer to collect spans from test runs.
375
- #
376
- # It also prevents the tracer from collecting spans in a production environment. Only use in a test environment.
377
- #
378
- # @default `DD_TRACE_TEST_MODE_ENABLED` environment variable, otherwise `false`
379
- # @return [Boolean]
380
393
  option :enabled do |o|
381
394
  o.type :bool
382
395
  o.default false
383
396
  o.env Tracing::Configuration::Ext::Test::ENV_MODE_ENABLED
384
397
  end
385
398
 
386
- # Use async writer in test mode
387
399
  option :async do |o|
388
400
  o.type :bool
389
401
  o.default false
@@ -49,7 +49,7 @@ module Datadog
49
49
  # To support multiple tracers simultaneously, each {Datadog::Tracing::FiberLocalContext}
50
50
  # instance has its own fiber-local variable.
51
51
  def initialize
52
- @key = "datadog_context_#{FiberLocalContext.next_instance_id}".to_sym
52
+ @key = :"datadog_context_#{FiberLocalContext.next_instance_id}"
53
53
 
54
54
  self.local = Context.new
55
55
  end
@@ -3,7 +3,7 @@
3
3
  require_relative '../integration'
4
4
  require_relative 'configuration/settings'
5
5
  require_relative 'patcher'
6
- require_relative '../rails/utils'
6
+ require_relative '../../../core/contrib/rails/utils'
7
7
 
8
8
  module Datadog
9
9
  module Tracing
@@ -17,6 +17,9 @@ module Datadog
17
17
 
18
18
  # @public_api Changing the integration name or integration options can cause breaking changes
19
19
  register_as :action_cable, auto_patch: false
20
+ def self.gem_name
21
+ 'actioncable'
22
+ end
20
23
 
21
24
  def self.version
22
25
  Gem.loaded_specs['actioncable'] && Gem.loaded_specs['actioncable'].version
@@ -33,7 +36,7 @@ module Datadog
33
36
  # enabled by rails integration so should only auto instrument
34
37
  # if detected that it is being used without rails
35
38
  def auto_instrument?
36
- !Contrib::Rails::Utils.railtie_supported?
39
+ !Core::Contrib::Rails::Utils.railtie_supported?
37
40
  end
38
41
 
39
42
  def new_configuration
@@ -3,7 +3,7 @@
3
3
  require_relative 'configuration/settings'
4
4
  require_relative 'patcher'
5
5
  require_relative '../integration'
6
- require_relative '../rails/utils'
6
+ require_relative '../../../core/contrib/rails/utils'
7
7
 
8
8
  module Datadog
9
9
  module Tracing
@@ -18,6 +18,10 @@ module Datadog
18
18
  # @public_api Changing the integration name or integration options can cause breaking changes
19
19
  register_as :action_mailer, auto_patch: false
20
20
 
21
+ def self.gem_name
22
+ 'actionmailer'
23
+ end
24
+
21
25
  def self.version
22
26
  Gem.loaded_specs['actionmailer'] && Gem.loaded_specs['actionmailer'].version
23
27
  end
@@ -33,7 +37,7 @@ module Datadog
33
37
  # enabled by rails integration so should only auto instrument
34
38
  # if detected that it is being used without rails
35
39
  def auto_instrument?
36
- !Contrib::Rails::Utils.railtie_supported?
40
+ !Core::Contrib::Rails::Utils.railtie_supported?
37
41
  end
38
42
 
39
43
  def new_configuration
@@ -68,6 +68,12 @@ module Datadog
68
68
 
69
69
  span.set_tag(Ext::TAG_ROUTE_ACTION, payload.fetch(:action))
70
70
  span.set_tag(Ext::TAG_ROUTE_CONTROLLER, payload.fetch(:controller))
71
+ if (runtime = payload[:view_runtime])
72
+ span.set_tag(Ext::TAG_VIEW_RUNTIME, runtime)
73
+ end
74
+ if (runtime = payload[:db_runtime])
75
+ span.set_tag(Ext::TAG_DB_RUNTIME, runtime)
76
+ end
71
77
 
72
78
  exception = payload[:exception_object]
73
79
  if exception.nil?
@@ -118,6 +124,15 @@ module Datadog
118
124
  payload[:exception] = [e.class.name, e.message]
119
125
  payload[:exception_object] = e
120
126
  raise e
127
+ ensure
128
+ # Database and view runtime are available for controllers
129
+ # deriving from ActionController::Base.
130
+ # They are not defined on controllers deriving from
131
+ # ActionController::Metal, unless
132
+ # ActionController::Instrumentation is explicitly included
133
+ # into the controller class.
134
+ payload[:db_runtime] = db_runtime if respond_to?(:db_runtime)
135
+ payload[:view_runtime] = view_runtime if respond_to?(:view_runtime)
121
136
  end
122
137
  # rubocop:enable Lint/RescueException
123
138
  ensure