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
@@ -18,7 +18,7 @@ module Datadog
18
18
  module Configuration
19
19
  # Global configuration settings for the Datadog library.
20
20
  # @public_api
21
- # rubocop:disable Metrics/BlockLength
21
+ # standard:disable Metrics/BlockLength
22
22
  class Settings
23
23
  include Base
24
24
 
@@ -123,7 +123,7 @@ module Datadog
123
123
  # @return [Boolean]
124
124
  option :debug do |o|
125
125
  o.env [Datadog::Core::Configuration::Ext::Diagnostics::ENV_DEBUG_ENABLED,
126
- Datadog::Core::Configuration::Ext::Diagnostics::ENV_OTEL_LOG_LEVEL]
126
+ Datadog::Core::Configuration::Ext::Diagnostics::ENV_OTEL_LOG_LEVEL]
127
127
  o.default false
128
128
  o.type :bool
129
129
  o.env_parser do |value|
@@ -137,7 +137,7 @@ module Datadog
137
137
  o.after_set do |enabled|
138
138
  # Enable rich debug print statements.
139
139
  # We do not need to unnecessarily load 'pp' unless in debugging mode.
140
- require 'pp' if enabled
140
+ require 'pp' if enabled # standard:disable Lint/RedundantRequireStatement
141
141
  end
142
142
  end
143
143
 
@@ -313,7 +313,7 @@ module Datadog
313
313
 
314
314
  # Can be used to enable/disable the collection of heap profiles.
315
315
  #
316
- # This feature is alpha and disabled by default
316
+ # This feature is in preview and disabled by default. Requires Ruby 3.1+.
317
317
  #
318
318
  # @warn To enable heap profiling you are required to also enable allocation profiling.
319
319
  #
@@ -326,12 +326,12 @@ module Datadog
326
326
 
327
327
  # Can be used to enable/disable the collection of heap size profiles.
328
328
  #
329
- # This feature is alpha and enabled by default when heap profiling is enabled.
329
+ # This feature is in preview and by default is enabled whenever heap profiling is enabled.
330
330
  #
331
- # @warn To enable heap size profiling you are required to also enable allocation and heap profiling.
331
+ # @warn Heap size profiling depends on allocation and heap profiling, so they must be enabled as well.
332
332
  #
333
- # @default `DD_PROFILING_EXPERIMENTAL_HEAP_SIZE_ENABLED` environment variable as a boolean, otherwise
334
- # whatever the value of DD_PROFILING_EXPERIMENTAL_HEAP_ENABLED is.
333
+ # @default `DD_PROFILING_EXPERIMENTAL_HEAP_SIZE_ENABLED` environment variable as a boolean, otherwise it
334
+ # follows the value of `experimental_heap_enabled`.
335
335
  option :experimental_heap_size_enabled do |o|
336
336
  o.type :bool
337
337
  o.env 'DD_PROFILING_EXPERIMENTAL_HEAP_SIZE_ENABLED'
@@ -341,17 +341,19 @@ module Datadog
341
341
  # Can be used to configure the heap sampling rate: a heap sample will be collected for every x allocation
342
342
  # samples.
343
343
  #
344
- # The lower the value, the more accuracy in heap tracking but the bigger the overhead. In particular, a
345
- # value of 1 will track ALL allocations samples for heap profiles.
344
+ # The higher the value, the less accuracy in heap tracking but the smaller the overhead.
345
+ #
346
+ # If you needed to tweak this, please tell us why on <https://github.com/DataDog/dd-trace-rb/issues/new>,
347
+ # so we can fix it!
346
348
  #
347
349
  # The effective heap sampling rate in terms of allocations (not allocation samples) can be calculated via
348
350
  # effective_heap_sample_rate = allocation_sample_rate * heap_sample_rate.
349
351
  #
350
- # @default `DD_PROFILING_EXPERIMENTAL_HEAP_SAMPLE_RATE` environment variable, otherwise `10`.
352
+ # @default `DD_PROFILING_EXPERIMENTAL_HEAP_SAMPLE_RATE` environment variable, otherwise `1`.
351
353
  option :experimental_heap_sample_rate do |o|
352
354
  o.type :int
353
355
  o.env 'DD_PROFILING_EXPERIMENTAL_HEAP_SAMPLE_RATE'
354
- o.default 10
356
+ o.default 1
355
357
  end
356
358
 
357
359
  # Can be used to disable checking which version of `libmysqlclient` is being used by the `mysql2` gem.
@@ -454,22 +456,38 @@ module Datadog
454
456
  o.after_set do |_, _, precedence|
455
457
  unless precedence == Datadog::Core::Configuration::Option::Precedence::DEFAULT
456
458
  Core.log_deprecation(key: :experimental_crash_tracking_enabled) do
457
- 'The profiling.advanced.experimental_crash_tracking_enabled setting has been deprecated for removal '\
459
+ 'The profiling.advanced.experimental_crash_tracking_enabled setting has been deprecated for removal ' \
458
460
  'and no longer does anything. Please remove it from your Datadog.configure block.'
459
461
  end
460
462
  end
461
463
  end
462
464
  end
463
465
 
464
- # Enables GVL profiling. This will show when threads are waiting for GVL in the timeline view.
465
- #
466
- # This is a preview feature and disabled by default. It requires Ruby 3.2+.
467
- #
468
- # @default `DD_PROFILING_PREVIEW_GVL_ENABLED` environment variable as a boolean, otherwise `false`
466
+ # @deprecated Use {:gvl_enabled} instead.
469
467
  option :preview_gvl_enabled do |o|
470
468
  o.type :bool
471
- o.env 'DD_PROFILING_PREVIEW_GVL_ENABLED'
472
469
  o.default false
470
+ o.after_set do |_, _, precedence|
471
+ unless precedence == Datadog::Core::Configuration::Option::Precedence::DEFAULT
472
+ Datadog.logger.warn(
473
+ 'The profiling.advanced.preview_gvl_enabled setting has been deprecated for removal and ' \
474
+ 'no longer does anything. Please remove it from your Datadog.configure block. ' \
475
+ 'GVL profiling is now controlled by the profiling.advanced.gvl_enabled setting instead.'
476
+ )
477
+ end
478
+ end
479
+ end
480
+
481
+ # Controls GVL profiling. This will show when threads are waiting for GVL in the timeline view.
482
+ #
483
+ # This feature requires Ruby 3.2+.
484
+ #
485
+ # @default `DD_PROFILING_GVL_ENABLED` environment variable as a boolean, otherwise `true`
486
+ option :gvl_enabled do |o|
487
+ o.type :bool
488
+ o.deprecated_env 'DD_PROFILING_PREVIEW_GVL_ENABLED'
489
+ o.env 'DD_PROFILING_GVL_ENABLED'
490
+ o.default true
473
491
  end
474
492
 
475
493
  # Controls the smallest time period the profiler will report a thread waiting for the GVL.
@@ -526,6 +544,16 @@ module Datadog
526
544
  o.env 'DD_PROFILING_HEAP_CLEAN_AFTER_GC_ENABLED'
527
545
  o.default true
528
546
  end
547
+
548
+ # Controls if the profiler should use native filenames for frames in stack traces for functions implemented using
549
+ # native code. Setting to `false` will make the profiler fall back to default Ruby stack trace behavior (only show .rb files).
550
+ #
551
+ # @default true
552
+ option :native_filenames_enabled do |o|
553
+ o.type :bool
554
+ o.env 'DD_PROFILING_NATIVE_FILENAMES_ENABLED'
555
+ o.default true
556
+ end
529
557
  end
530
558
 
531
559
  # @public_api
@@ -554,6 +582,12 @@ module Datadog
554
582
  o.type :bool
555
583
  end
556
584
 
585
+ option :experimental_runtime_id_enabled do |o|
586
+ o.type :bool
587
+ o.env ['DD_TRACE_EXPERIMENTAL_RUNTIME_ID_ENABLED', 'DD_RUNTIME_METRICS_RUNTIME_ID_ENABLED']
588
+ o.default false
589
+ end
590
+
557
591
  option :opts, default: {}, type: :hash
558
592
  option :statsd
559
593
  end
@@ -603,38 +637,31 @@ module Datadog
603
637
  o.type :hash, nilable: true
604
638
  o.env [Core::Environment::Ext::ENV_TAGS, Core::Environment::Ext::ENV_OTEL_RESOURCE_ATTRIBUTES]
605
639
  o.env_parser do |env_value|
606
- values = if env_value.include?(',')
607
- env_value.split(',')
608
- else
609
- env_value.split(' ') # rubocop:disable Style/RedundantArgument
610
- end
611
- values.map! do |v|
612
- v.gsub!(/\A[\s,]*|[\s,]*\Z/, '')
613
-
614
- v.empty? ? nil : v
615
- end
616
-
617
- values.compact!
618
- values.each_with_object({}) do |tag, tags|
619
- key, value = tag.split(':', 2)
620
- if value.nil?
621
- # support tags/attributes delimited by the OpenTelemetry separator (`=`)
622
- key, value = tag.split('=', 2)
623
- end
624
- next if value.nil? || value.empty?
625
-
626
- # maps OpenTelemetry semantic attributes to Datadog tags
627
- case key.downcase
628
- when 'deployment.environment'
629
- tags['env'] = value
630
- when 'service.version'
631
- tags['version'] = value
632
- when 'service.name'
633
- tags['service'] = value
634
- else
635
- tags[key] = value
640
+ # Parses a string containing key-value pairs and returns a hash.
641
+ # Key-value pairs are delimited by ':' OR `=`, and pairs are separated by whitespace, comma, OR BOTH.
642
+ result = {}
643
+ unless env_value.nil? || env_value.empty?
644
+ # falling back to comma as separator
645
+ sep = env_value.include?(',') ? ',' : ' '
646
+ # split by separator
647
+ env_value.split(sep).each do |tag|
648
+ tag.strip!
649
+ next if tag.empty?
650
+
651
+ # tag by : or = (for OpenTelemetry)
652
+ key, val = tag.split(/[:=]/, 2).map(&:strip)
653
+ val ||= ''
654
+ # maps OpenTelemetry semantic attributes to Datadog tags
655
+ key = case key.downcase
656
+ when 'deployment.environment' then 'env'
657
+ when 'service.version' then 'version'
658
+ when 'service.name' then 'service'
659
+ else key
660
+ end
661
+ result[key] = val unless key.empty?
636
662
  end
637
663
  end
664
+ result
638
665
  end
639
666
  o.setter do |new_value, old_value|
640
667
  raw_tags = new_value || {}
@@ -863,6 +890,26 @@ module Datadog
863
890
  o.type :float
864
891
  o.default 1.0
865
892
  end
893
+
894
+ # Enable log collection for telemetry. Log collection only works when telemetry is enabled and
895
+ # logs are enabled.
896
+ # @default `DD_TELEMETRY_LOG_COLLECTION_ENABLED` environment variable, otherwise `true`.
897
+ # @return [Boolean]
898
+ option :log_collection_enabled do |o|
899
+ o.type :bool
900
+ o.env Core::Telemetry::Ext::ENV_LOG_COLLECTION
901
+ o.default true
902
+ end
903
+
904
+ # For internal use only.
905
+ # Enables telemetry debugging through the Datadog platform.
906
+ #
907
+ # @default `false`.
908
+ # @return [Boolean]
909
+ option :debug do |o|
910
+ o.type :bool
911
+ o.default false
912
+ end
866
913
  end
867
914
 
868
915
  # Remote configuration
@@ -932,11 +979,35 @@ module Datadog
932
979
  end
933
980
  end
934
981
 
982
+ # Tracer specific configuration starting with APM (e.g. DD_APM_TRACING_ENABLED).
983
+ # @public_api
984
+ settings :apm do
985
+ # Tracing as a transport
986
+ # @public_api
987
+ settings :tracing do
988
+ # Enables tracing as transport.
989
+ # Disabling it will set sampling priority to -1 (FORCE_DROP) on most traces,
990
+ # (which tells to the agent to drop these traces)
991
+ # except heartbeat ones (1 per minute) and manually kept ones (sampling priority to 2) (e.g. appsec events)
992
+ #
993
+ # This is different than `DD_TRACE_ENABLED`, which completely disables tracing (sends no trace at all),
994
+ # while this will send heartbeat traces (1 per minute) so that the service is considered alive in the backend.
995
+ #
996
+ # @default `DD_APM_TRACING_ENABLED` environment variable, otherwise `true`
997
+ # @return [Boolean]
998
+ option :enabled do |o|
999
+ o.env Configuration::Ext::APM::ENV_TRACING_ENABLED
1000
+ o.default true
1001
+ o.type :bool
1002
+ end
1003
+ end
1004
+ end
1005
+
935
1006
  # TODO: Tracing should manage its own settings.
936
1007
  # Keep this extension here for now to keep things working.
937
1008
  extend Datadog::Tracing::Configuration::Settings
938
1009
  end
939
- # rubocop:enable Metrics/BlockLength
1010
+ # standard:enable Metrics/BlockLength
940
1011
  end
941
1012
  end
942
1013
  end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Datadog
4
+ module Core
5
+ module Configuration
6
+ # Import config from config files (fleet automation)
7
+ module StableConfig
8
+ def self.extract_configuration
9
+ if (libdatadog_api_failure = Datadog::Core::LIBDATADOG_API_FAILURE)
10
+ Datadog.config_init_logger.debug("Cannot enable stable config: #{libdatadog_api_failure}")
11
+ return {}
12
+ end
13
+ Configurator.new.get
14
+ end
15
+
16
+ def self.configuration
17
+ @configuration ||= StableConfig.extract_configuration
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -172,6 +172,10 @@ module Datadog
172
172
  end
173
173
  end
174
174
 
175
+ def config_init_logger
176
+ configuration? ? logger : logger_without_configuration
177
+ end
178
+
175
179
  # Gracefully shuts down all components.
176
180
  #
177
181
  # Components will still respond to method calls as usual,
@@ -231,19 +235,21 @@ module Datadog
231
235
  end
232
236
 
233
237
  COMPONENTS_WRITE_LOCK.synchronize do
234
- begin
235
- yield write_components
236
- rescue ThreadError => e
237
- logger_without_components.error(
238
- 'Detected deadlock during datadog initialization. ' \
239
- 'Please report this at https://github.com/DataDog/dd-trace-rb/blob/master/CONTRIBUTING.md#found-a-bug' \
240
- "\n\tSource:\n\t#{Array(e.backtrace).join("\n\t")}"
241
- )
242
- nil
243
- end
238
+ yield write_components
239
+ rescue ThreadError => e
240
+ logger_without_components.error(
241
+ 'Detected deadlock during datadog initialization. ' \
242
+ 'Please report this at https://github.com/datadog/dd-trace-rb/blob/master/CONTRIBUTING.md#found-a-bug' \
243
+ "\n\tSource:\n\t#{Array(e.backtrace).join("\n\t")}"
244
+ )
245
+ nil
244
246
  end
245
247
  end
246
248
 
249
+ def configuration?
250
+ (defined?(@configuration) && @configuration) != nil
251
+ end
252
+
247
253
  def components?
248
254
  # This does not need to grab the COMPONENTS_READ_LOCK because it's not returning the components
249
255
  (defined?(@components) && @components) != nil
@@ -258,14 +264,25 @@ module Datadog
258
264
  def replace_components!(settings, old)
259
265
  components = Components.new(settings)
260
266
 
267
+ # Carry over state from existing components to the new ones.
268
+ # Currently:
269
+ # 1. If we already started the remote component (which
270
+ # happens after a request goes through installed Rack middleware),
271
+ # we will start the new remote component as well.
272
+ # 2. If telemetry has been enabled and is enabled in the new
273
+ # component tree, we send AppConfigurationChange event instead
274
+ # of AppStarted event.
275
+ old_state = old.state
276
+
261
277
  old.shutdown!(components)
262
- components.startup!(settings)
278
+ components.startup!(settings, old_state: old_state)
263
279
  components
264
280
  end
265
281
 
266
282
  def logger_without_components
267
283
  # Use default logger without initializing components.
268
284
  # This enables logging during initialization, otherwise we'd run into deadlocks.
285
+
269
286
  @temp_logger ||= begin
270
287
  logger = configuration.logger.instance || Core::Logger.new($stdout)
271
288
  logger.level = configuration.diagnostics.debug ? ::Logger::DEBUG : configuration.logger.level
@@ -273,6 +290,21 @@ module Datadog
273
290
  end
274
291
  end
275
292
 
293
+ def logger_without_configuration
294
+ # There's rare cases where we need to use logger during configuration initialization,
295
+ # such as reading stable config. In this case we cannot access configuration.
296
+
297
+ @temp_config_logger ||= begin
298
+ debug_env_value = ENV[Ext::Diagnostics::ENV_DEBUG_ENABLED]&.strip&.downcase
299
+ debug_value = debug_env_value == 'true' || debug_env_value == '1'
300
+
301
+ logger = Core::Logger.new($stdout)
302
+ # We cannot access config and the default level is INFO, so we need to set the level manually
303
+ logger.level = debug_value ? ::Logger::DEBUG : ::Logger::INFO
304
+ logger
305
+ end
306
+ end
307
+
276
308
  # Called from our at_exit hook whenever there was a pending Interrupt exception (e.g. typically due to ctrl+c)
277
309
  # to print a nice message whenever we're taking a bit longer than usual to finish the process.
278
310
  def handle_interrupt_shutdown!
@@ -1,9 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative '../analytics'
4
-
5
3
  module Datadog
6
- module Tracing
4
+ module Core
7
5
  module Contrib
8
6
  module Rails
9
7
  # common utilities for Rails
@@ -3,7 +3,6 @@
3
3
  require 'libdatadog'
4
4
 
5
5
  require_relative 'tag_builder'
6
- require_relative 'agent_base_url'
7
6
  require_relative '../utils/only_once'
8
7
  require_relative '../utils/at_fork_monkey_patch'
9
8
 
@@ -19,20 +18,11 @@ module Datadog
19
18
  #
20
19
  # Methods prefixed with _native_ are implemented in `crashtracker.c`
21
20
  class Component
22
- LIBDATADOG_API_FAILURE =
23
- begin
24
- require "libdatadog_api.#{RUBY_VERSION[/\d+.\d+/]}_#{RUBY_PLATFORM}"
25
- nil
26
- rescue LoadError => e
27
- e.message
28
- end
29
-
30
21
  ONLY_ONCE = Core::Utils::OnlyOnce.new
31
22
 
32
23
  def self.build(settings, agent_settings, logger:)
33
24
  tags = TagBuilder.call(settings)
34
- agent_base_url = AgentBaseUrl.resolve(agent_settings)
35
- logger.warn('Missing agent base URL; cannot enable crash tracking') unless agent_base_url
25
+ agent_base_url = agent_settings.url
36
26
 
37
27
  ld_library_path = ::Libdatadog.ld_library_path
38
28
  logger.warn('Missing ld_library_path; cannot enable crash tracking') unless ld_library_path
@@ -73,7 +63,7 @@ module Datadog
73
63
  # Must NOT reference `self` here, as only the first instance will
74
64
  # be captured by the ONLY_ONCE and we want to pick the latest active one
75
65
  # (which may have different tags or agent config)
76
- Datadog.send(:components).crashtracker&.update_on_fork
66
+ Datadog.send(:components, allow_initialization: false)&.crashtracker&.update_on_fork
77
67
  end
78
68
  end
79
69
  end
@@ -102,7 +92,8 @@ module Datadog
102
92
  path_to_crashtracking_receiver_binary: path_to_crashtracking_receiver_binary,
103
93
  ld_library_path: ld_library_path,
104
94
  tags_as_array: tags.to_a,
105
- upload_timeout_seconds: 1
95
+ # @ivoanjo: On my machine this needs to be > 5 seconds, and seems to work with 10; the extra 15 is extra margin
96
+ upload_timeout_seconds: 15,
106
97
  )
107
98
  logger.debug("Crash tracking action: #{action} successful")
108
99
  rescue => e
@@ -1,9 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative '../tag_builder'
3
4
  require_relative '../utils'
4
- require_relative '../environment/socket'
5
- require_relative '../environment/identity'
6
- require_relative '../environment/git'
7
5
 
8
6
  module Datadog
9
7
  module Core
@@ -11,27 +9,11 @@ module Datadog
11
9
  # This module builds a hash of tags
12
10
  module TagBuilder
13
11
  def self.call(settings)
14
- hash = {
15
- 'host' => Environment::Socket.hostname,
16
- 'process_id' => Process.pid.to_s,
17
- 'runtime_engine' => Environment::Identity.lang_engine,
18
- 'runtime-id' => Environment::Identity.id,
19
- 'runtime_platform' => Environment::Identity.lang_platform,
20
- 'runtime_version' => Environment::Identity.lang_version,
21
- 'env' => settings.env,
22
- 'service' => settings.service,
23
- 'version' => settings.version,
24
- 'git.repository_url' => Environment::Git.git_repository_url,
25
- 'git.commit.sha' => Environment::Git.git_commit_sha,
12
+ hash = Core::TagBuilder.tags(settings).merge(
26
13
  'is_crash' => 'true',
27
- 'language' => 'ruby',
28
- 'library_version' => Core::Environment::Identity.gem_datadog_version,
29
- }.compact
14
+ )
30
15
 
31
- # Make sure everything is an utf-8 string, to avoid encoding issues in downstream
32
- settings.tags.merge(hash).each_with_object({}) do |(key, value), h|
33
- h[Utils.utf8_encode(key)] = Utils.utf8_encode(value)
34
- end
16
+ Utils.encode_tags(hash)
35
17
  end
36
18
  end
37
19
  end
@@ -79,7 +79,7 @@ module Datadog
79
79
 
80
80
  # @return [String] current time in ISO8601 format
81
81
  def date
82
- Time.now.utc.iso8601
82
+ Core::Utils::Time.now.utc.iso8601
83
83
  end
84
84
 
85
85
  # Best portable guess of OS information.
@@ -10,6 +10,7 @@ module Datadog
10
10
  # Encoder interface that provides the logic to encode traces and service
11
11
  # @abstract
12
12
  module Encoder
13
+ # :nocov:
13
14
  def content_type
14
15
  raise NotImplementedError
15
16
  end
@@ -23,6 +24,13 @@ module Datadog
23
24
  def encode(_)
24
25
  raise NotImplementedError
25
26
  end
27
+
28
+ # Deserializes a value serialized with {#encode}.
29
+ # This method is used for debugging purposes.
30
+ def decode(_)
31
+ raise NotImplementedError
32
+ end
33
+ # :nocov:
26
34
  end
27
35
 
28
36
  # Encoder for the JSON format
@@ -41,8 +49,12 @@ module Datadog
41
49
  JSON.dump(obj)
42
50
  end
43
51
 
52
+ def decode(obj)
53
+ JSON.parse(obj)
54
+ end
55
+
44
56
  def join(encoded_data)
45
- "[#{encoded_data.join(',')}]"
57
+ "[#{encoded_data.join(",")}]"
46
58
  end
47
59
  end
48
60
 
@@ -62,6 +74,10 @@ module Datadog
62
74
  MessagePack.pack(obj)
63
75
  end
64
76
 
77
+ def decode(obj)
78
+ MessagePack.unpack(obj)
79
+ end
80
+
65
81
  def join(encoded_data)
66
82
  packer = MessagePack::Packer.new
67
83
  packer.write_array_header(encoded_data.size)
@@ -0,0 +1,78 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Datadog
4
+ module Core
5
+ module Environment
6
+ # Retrieves the agent's `/info` endpoint data.
7
+ # This data can be used to determine the capabilities of the local Datadog agent.
8
+ #
9
+ # @example Example response payload
10
+ # {
11
+ # "version" : "7.57.2",
12
+ # "git_commit" : "38ba0c7",
13
+ # "endpoints" : [ "/v0.4/traces", "/v0.4/services", "/v0.7/traces", "/v0.7/config" ],
14
+ # "client_drop_p0s" : true,
15
+ # "span_meta_structs" : true,
16
+ # "long_running_spans" : true,
17
+ # "evp_proxy_allowed_headers" : [ "Content-Type", "Accept-Encoding", "Content-Encoding", "User-Agent" ],
18
+ # "config" : {
19
+ # "default_env" : "none",
20
+ # "target_tps" : 10,
21
+ # "max_eps" : 200,
22
+ # "receiver_port" : 8126,
23
+ # "receiver_socket" : "/var/run/datadog/apm.socket",
24
+ # "connection_limit" : 0,
25
+ # "receiver_timeout" : 0,
26
+ # "max_request_bytes" : 26214400,
27
+ # "statsd_port" : 8125,
28
+ # "analyzed_spans_by_service" : { },
29
+ # "obfuscation" : {
30
+ # "elastic_search" : true,
31
+ # "mongo" : true,
32
+ # "sql_exec_plan" : false,
33
+ # "sql_exec_plan_normalize" : false,
34
+ # "http" : {
35
+ # "remove_query_string" : false,
36
+ # "remove_path_digits" : false
37
+ # },
38
+ # "remove_stack_traces" : false,
39
+ # "redis" : {
40
+ # "Enabled" : true,
41
+ # "RemoveAllArgs" : false
42
+ # },
43
+ # "memcached" : {
44
+ # "Enabled" : true,
45
+ # "KeepCommand" : false
46
+ # }
47
+ # }
48
+ # },
49
+ # "peer_tags" : null
50
+ # }
51
+ #
52
+ # @see https://github.com/DataDog/datadog-agent/blob/f07df0a3c1fca0c83b5a15f553bd994091b0c8ac/pkg/trace/api/info.go#L20
53
+ class AgentInfo
54
+ attr_reader :agent_settings, :logger
55
+
56
+ def initialize(agent_settings, logger: Datadog.logger)
57
+ @agent_settings = agent_settings
58
+ @logger = logger
59
+ @client = Remote::Transport::HTTP.root(agent_settings: agent_settings, logger: logger)
60
+ end
61
+
62
+ # Fetches the information from the agent.
63
+ # @return [Datadog::Core::Remote::Transport::HTTP::Negotiation::Response] the response from the agent
64
+ # @return [nil] if an error occurred while fetching the information
65
+ def fetch
66
+ res = @client.send_info
67
+ return unless res.ok?
68
+
69
+ res
70
+ end
71
+
72
+ def ==(other)
73
+ other.is_a?(self.class) && other.agent_settings == agent_settings
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
@@ -23,20 +23,18 @@ module Datadog
23
23
 
24
24
  def descriptors(process = 'self')
25
25
  [].tap do |descriptors|
26
- begin
27
- filepath = "/proc/#{process}/cgroup"
28
-
29
- if File.exist?(filepath)
30
- File.foreach("/proc/#{process}/cgroup") do |line|
31
- line = line.strip
32
- descriptors << parse(line) unless line.empty?
33
- end
26
+ filepath = "/proc/#{process}/cgroup"
27
+
28
+ if File.exist?(filepath)
29
+ File.foreach("/proc/#{process}/cgroup") do |line|
30
+ line = line.strip
31
+ descriptors << parse(line) unless line.empty?
34
32
  end
35
- rescue StandardError => e
36
- Datadog.logger.error(
37
- "Error while parsing cgroup. Cause: #{e.class.name} #{e.message} Location: #{Array(e.backtrace).first}"
38
- )
39
33
  end
34
+ rescue => e
35
+ Datadog.logger.error(
36
+ "Error while parsing cgroup. Cause: #{e.class.name} #{e.message} Location: #{Array(e.backtrace).first}"
37
+ )
40
38
  end
41
39
  end
42
40