datadog 2.7.1 → 2.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (417) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +310 -1
  3. data/ext/datadog_profiling_native_extension/clock_id.h +2 -2
  4. data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +66 -56
  5. data/ext/datadog_profiling_native_extension/collectors_discrete_dynamic_sampler.c +1 -1
  6. data/ext/datadog_profiling_native_extension/collectors_discrete_dynamic_sampler.h +1 -1
  7. data/ext/datadog_profiling_native_extension/collectors_idle_sampling_helper.c +16 -16
  8. data/ext/datadog_profiling_native_extension/collectors_stack.c +10 -10
  9. data/ext/datadog_profiling_native_extension/collectors_stack.h +2 -2
  10. data/ext/datadog_profiling_native_extension/collectors_thread_context.c +314 -145
  11. data/ext/datadog_profiling_native_extension/datadog_ruby_common.c +1 -4
  12. data/ext/datadog_profiling_native_extension/datadog_ruby_common.h +10 -0
  13. data/ext/datadog_profiling_native_extension/encoded_profile.c +79 -0
  14. data/ext/datadog_profiling_native_extension/encoded_profile.h +8 -0
  15. data/ext/datadog_profiling_native_extension/extconf.rb +7 -8
  16. data/ext/datadog_profiling_native_extension/gvl_profiling_helper.c +2 -0
  17. data/ext/datadog_profiling_native_extension/gvl_profiling_helper.h +0 -8
  18. data/ext/datadog_profiling_native_extension/heap_recorder.c +61 -174
  19. data/ext/datadog_profiling_native_extension/heap_recorder.h +2 -2
  20. data/ext/datadog_profiling_native_extension/http_transport.c +64 -98
  21. data/ext/datadog_profiling_native_extension/private_vm_api_access.c +68 -1
  22. data/ext/datadog_profiling_native_extension/private_vm_api_access.h +10 -1
  23. data/ext/datadog_profiling_native_extension/profiling.c +19 -8
  24. data/ext/datadog_profiling_native_extension/ruby_helpers.c +8 -8
  25. data/ext/datadog_profiling_native_extension/stack_recorder.c +84 -131
  26. data/ext/datadog_profiling_native_extension/stack_recorder.h +2 -2
  27. data/ext/datadog_profiling_native_extension/time_helpers.h +1 -1
  28. data/ext/datadog_profiling_native_extension/unsafe_api_calls_check.c +47 -0
  29. data/ext/datadog_profiling_native_extension/unsafe_api_calls_check.h +31 -0
  30. data/ext/libdatadog_api/crashtracker.c +17 -15
  31. data/ext/libdatadog_api/crashtracker.h +5 -0
  32. data/ext/libdatadog_api/datadog_ruby_common.c +1 -4
  33. data/ext/libdatadog_api/datadog_ruby_common.h +10 -0
  34. data/ext/libdatadog_api/init.c +15 -0
  35. data/ext/libdatadog_api/library_config.c +122 -0
  36. data/ext/libdatadog_api/library_config.h +19 -0
  37. data/ext/libdatadog_api/macos_development.md +3 -3
  38. data/ext/libdatadog_api/process_discovery.c +117 -0
  39. data/ext/libdatadog_api/process_discovery.h +5 -0
  40. data/ext/libdatadog_extconf_helpers.rb +1 -1
  41. data/lib/datadog/appsec/actions_handler/serializable_backtrace.rb +89 -0
  42. data/lib/datadog/appsec/actions_handler.rb +49 -0
  43. data/lib/datadog/appsec/anonymizer.rb +16 -0
  44. data/lib/datadog/appsec/api_security/lru_cache.rb +49 -0
  45. data/lib/datadog/appsec/api_security.rb +9 -0
  46. data/lib/datadog/appsec/assets/waf_rules/README.md +50 -5
  47. data/lib/datadog/appsec/assets/waf_rules/processors.json +239 -10
  48. data/lib/datadog/appsec/assets/waf_rules/recommended.json +355 -157
  49. data/lib/datadog/appsec/assets/waf_rules/scanners.json +926 -17
  50. data/lib/datadog/appsec/assets/waf_rules/strict.json +62 -32
  51. data/lib/datadog/appsec/autoload.rb +1 -1
  52. data/lib/datadog/appsec/component.rb +41 -33
  53. data/lib/datadog/appsec/compressed_json.rb +40 -0
  54. data/lib/datadog/appsec/configuration/settings.rb +152 -25
  55. data/lib/datadog/appsec/context.rb +74 -0
  56. data/lib/datadog/appsec/contrib/active_record/instrumentation.rb +92 -0
  57. data/lib/datadog/appsec/contrib/active_record/integration.rb +41 -0
  58. data/lib/datadog/appsec/contrib/active_record/patcher.rb +101 -0
  59. data/lib/datadog/appsec/contrib/auto_instrument.rb +1 -1
  60. data/lib/datadog/appsec/contrib/devise/configuration.rb +52 -0
  61. data/lib/datadog/appsec/contrib/devise/data_extractor.rb +78 -0
  62. data/lib/datadog/appsec/contrib/devise/ext.rb +22 -0
  63. data/lib/datadog/appsec/contrib/devise/integration.rb +1 -2
  64. data/lib/datadog/appsec/contrib/devise/patcher.rb +33 -25
  65. data/lib/datadog/appsec/contrib/devise/patches/signin_tracking_patch.rb +102 -0
  66. data/lib/datadog/appsec/contrib/devise/patches/signup_tracking_patch.rb +69 -0
  67. data/lib/datadog/appsec/contrib/devise/{patcher/rememberable_patch.rb → patches/skip_signin_tracking_patch.rb} +3 -3
  68. data/lib/datadog/appsec/contrib/devise/tracking_middleware.rb +106 -0
  69. data/lib/datadog/appsec/contrib/excon/integration.rb +41 -0
  70. data/lib/datadog/appsec/contrib/excon/patcher.rb +28 -0
  71. data/lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb +42 -0
  72. data/lib/datadog/appsec/contrib/faraday/connection_patch.rb +22 -0
  73. data/lib/datadog/appsec/contrib/faraday/integration.rb +42 -0
  74. data/lib/datadog/appsec/contrib/faraday/patcher.rb +53 -0
  75. data/lib/datadog/appsec/contrib/faraday/rack_builder_patch.rb +22 -0
  76. data/lib/datadog/appsec/contrib/faraday/ssrf_detection_middleware.rb +41 -0
  77. data/lib/datadog/appsec/contrib/graphql/appsec_trace.rb +1 -7
  78. data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +17 -30
  79. data/lib/datadog/appsec/contrib/graphql/integration.rb +1 -1
  80. data/lib/datadog/appsec/contrib/graphql/patcher.rb +0 -3
  81. data/lib/datadog/appsec/contrib/rack/ext.rb +34 -0
  82. data/lib/datadog/appsec/contrib/rack/gateway/response.rb +3 -3
  83. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +78 -98
  84. data/lib/datadog/appsec/contrib/rack/integration.rb +1 -1
  85. data/lib/datadog/appsec/contrib/rack/patcher.rb +0 -3
  86. data/lib/datadog/appsec/contrib/rack/request_body_middleware.rb +10 -11
  87. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +52 -68
  88. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +16 -33
  89. data/lib/datadog/appsec/contrib/rails/integration.rb +1 -1
  90. data/lib/datadog/appsec/contrib/rails/patcher.rb +25 -38
  91. data/lib/datadog/appsec/contrib/rest_client/integration.rb +45 -0
  92. data/lib/datadog/appsec/contrib/rest_client/patcher.rb +28 -0
  93. data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +38 -0
  94. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +31 -68
  95. data/lib/datadog/appsec/contrib/sinatra/integration.rb +1 -1
  96. data/lib/datadog/appsec/contrib/sinatra/patcher.rb +5 -31
  97. data/lib/datadog/appsec/event.rb +96 -135
  98. data/lib/datadog/appsec/ext.rb +12 -3
  99. data/lib/datadog/appsec/instrumentation/gateway/argument.rb +7 -2
  100. data/lib/datadog/appsec/instrumentation/gateway/middleware.rb +24 -0
  101. data/lib/datadog/appsec/instrumentation/gateway.rb +17 -22
  102. data/lib/datadog/appsec/metrics/collector.rb +38 -0
  103. data/lib/datadog/appsec/metrics/exporter.rb +35 -0
  104. data/lib/datadog/appsec/metrics/telemetry.rb +23 -0
  105. data/lib/datadog/appsec/metrics.rb +13 -0
  106. data/lib/datadog/appsec/monitor/gateway/watcher.rb +52 -32
  107. data/lib/datadog/appsec/processor/rule_loader.rb +26 -31
  108. data/lib/datadog/appsec/processor/rule_merger.rb +7 -6
  109. data/lib/datadog/appsec/processor.rb +5 -4
  110. data/lib/datadog/appsec/remote.rb +26 -12
  111. data/lib/datadog/appsec/response.rb +19 -85
  112. data/lib/datadog/appsec/security_engine/result.rb +67 -0
  113. data/lib/datadog/appsec/security_engine/runner.rb +88 -0
  114. data/lib/datadog/appsec/security_engine.rb +9 -0
  115. data/lib/datadog/appsec/security_event.rb +39 -0
  116. data/lib/datadog/appsec/utils.rb +0 -2
  117. data/lib/datadog/appsec.rb +23 -10
  118. data/lib/datadog/auto_instrument.rb +3 -0
  119. data/lib/datadog/core/buffer/random.rb +18 -2
  120. data/lib/datadog/core/configuration/agent_settings_resolver.rb +42 -14
  121. data/lib/datadog/core/configuration/agentless_settings_resolver.rb +176 -0
  122. data/lib/datadog/core/configuration/components.rb +76 -32
  123. data/lib/datadog/core/configuration/components_state.rb +23 -0
  124. data/lib/datadog/core/configuration/ext.rb +5 -1
  125. data/lib/datadog/core/configuration/option.rb +79 -43
  126. data/lib/datadog/core/configuration/option_definition.rb +6 -4
  127. data/lib/datadog/core/configuration/options.rb +3 -3
  128. data/lib/datadog/core/configuration/settings.rb +100 -41
  129. data/lib/datadog/core/configuration/stable_config.rb +23 -0
  130. data/lib/datadog/core/configuration.rb +43 -11
  131. data/lib/datadog/{tracing → core}/contrib/rails/utils.rb +1 -3
  132. data/lib/datadog/core/crashtracking/component.rb +4 -13
  133. data/lib/datadog/core/diagnostics/environment_logger.rb +1 -1
  134. data/lib/datadog/core/encoding.rb +17 -1
  135. data/lib/datadog/core/environment/agent_info.rb +78 -0
  136. data/lib/datadog/core/environment/cgroup.rb +10 -12
  137. data/lib/datadog/core/environment/container.rb +38 -40
  138. data/lib/datadog/core/environment/ext.rb +6 -6
  139. data/lib/datadog/core/environment/git.rb +1 -0
  140. data/lib/datadog/core/environment/identity.rb +3 -3
  141. data/lib/datadog/core/environment/platform.rb +3 -3
  142. data/lib/datadog/core/environment/variable_helpers.rb +1 -1
  143. data/lib/datadog/core/error.rb +11 -9
  144. data/lib/datadog/core/logger.rb +2 -2
  145. data/lib/datadog/core/metrics/client.rb +27 -27
  146. data/lib/datadog/core/metrics/logging.rb +5 -5
  147. data/lib/datadog/core/process_discovery.rb +32 -0
  148. data/lib/datadog/core/rate_limiter.rb +4 -2
  149. data/lib/datadog/core/remote/client/capabilities.rb +6 -0
  150. data/lib/datadog/core/remote/client.rb +107 -92
  151. data/lib/datadog/core/remote/component.rb +18 -19
  152. data/lib/datadog/core/remote/configuration/digest.rb +7 -7
  153. data/lib/datadog/core/remote/configuration/path.rb +1 -1
  154. data/lib/datadog/core/remote/configuration/repository.rb +2 -1
  155. data/lib/datadog/core/remote/negotiation.rb +9 -9
  156. data/lib/datadog/core/remote/transport/config.rb +4 -3
  157. data/lib/datadog/core/remote/transport/http/api.rb +13 -18
  158. data/lib/datadog/core/remote/transport/http/client.rb +5 -4
  159. data/lib/datadog/core/remote/transport/http/config.rb +27 -55
  160. data/lib/datadog/core/remote/transport/http/negotiation.rb +8 -51
  161. data/lib/datadog/core/remote/transport/http.rb +25 -94
  162. data/lib/datadog/core/remote/transport/negotiation.rb +17 -4
  163. data/lib/datadog/core/remote/worker.rb +10 -7
  164. data/lib/datadog/core/runtime/metrics.rb +12 -5
  165. data/lib/datadog/core/telemetry/component.rb +84 -49
  166. data/lib/datadog/core/telemetry/emitter.rb +23 -11
  167. data/lib/datadog/core/telemetry/event/app_client_configuration_change.rb +65 -0
  168. data/lib/datadog/core/telemetry/event/app_closing.rb +18 -0
  169. data/lib/datadog/core/telemetry/event/app_dependencies_loaded.rb +33 -0
  170. data/lib/datadog/core/telemetry/event/app_heartbeat.rb +18 -0
  171. data/lib/datadog/core/telemetry/event/app_integrations_change.rb +58 -0
  172. data/lib/datadog/core/telemetry/event/app_started.rb +179 -0
  173. data/lib/datadog/core/telemetry/event/base.rb +40 -0
  174. data/lib/datadog/core/telemetry/event/distributions.rb +18 -0
  175. data/lib/datadog/core/telemetry/event/generate_metrics.rb +43 -0
  176. data/lib/datadog/core/telemetry/event/log.rb +76 -0
  177. data/lib/datadog/core/telemetry/event/message_batch.rb +42 -0
  178. data/lib/datadog/core/telemetry/event/synth_app_client_configuration_change.rb +43 -0
  179. data/lib/datadog/core/telemetry/event.rb +17 -383
  180. data/lib/datadog/core/telemetry/ext.rb +1 -0
  181. data/lib/datadog/core/telemetry/http/adapters/net.rb +12 -97
  182. data/lib/datadog/core/telemetry/logger.rb +1 -1
  183. data/lib/datadog/core/telemetry/logging.rb +2 -2
  184. data/lib/datadog/core/telemetry/metric.rb +28 -6
  185. data/lib/datadog/core/telemetry/request.rb +4 -4
  186. data/lib/datadog/core/telemetry/transport/http/api.rb +43 -0
  187. data/lib/datadog/core/telemetry/transport/http/client.rb +49 -0
  188. data/lib/datadog/core/telemetry/transport/http/telemetry.rb +92 -0
  189. data/lib/datadog/core/telemetry/transport/http.rb +63 -0
  190. data/lib/datadog/core/telemetry/transport/telemetry.rb +51 -0
  191. data/lib/datadog/core/telemetry/worker.rb +128 -25
  192. data/lib/datadog/core/transport/http/adapters/test.rb +2 -1
  193. data/lib/datadog/core/transport/http/adapters/unix_socket.rb +1 -1
  194. data/lib/datadog/{tracing → core}/transport/http/api/instance.rb +18 -1
  195. data/lib/datadog/core/transport/http/api/spec.rb +36 -0
  196. data/lib/datadog/{tracing → core}/transport/http/builder.rb +53 -31
  197. data/lib/datadog/core/transport/http.rb +75 -0
  198. data/lib/datadog/core/transport/response.rb +4 -0
  199. data/lib/datadog/core/utils/at_fork_monkey_patch.rb +6 -6
  200. data/lib/datadog/core/utils/duration.rb +32 -32
  201. data/lib/datadog/core/utils/forking.rb +2 -2
  202. data/lib/datadog/core/utils/network.rb +6 -6
  203. data/lib/datadog/core/utils/only_once_successful.rb +16 -5
  204. data/lib/datadog/core/utils/time.rb +20 -0
  205. data/lib/datadog/core/utils/truncation.rb +21 -0
  206. data/lib/datadog/core/vendor/multipart-post/multipart/post/composite_read_io.rb +1 -1
  207. data/lib/datadog/core/vendor/multipart-post/multipart/post/multipartable.rb +8 -8
  208. data/lib/datadog/core/vendor/multipart-post/multipart/post/parts.rb +7 -7
  209. data/lib/datadog/core/worker.rb +1 -1
  210. data/lib/datadog/core/workers/async.rb +29 -12
  211. data/lib/datadog/core/workers/interval_loop.rb +12 -1
  212. data/lib/datadog/core/workers/runtime_metrics.rb +2 -2
  213. data/lib/datadog/core.rb +8 -0
  214. data/lib/datadog/di/base.rb +115 -0
  215. data/lib/datadog/di/boot.rb +34 -0
  216. data/lib/datadog/di/code_tracker.rb +26 -15
  217. data/lib/datadog/di/component.rb +23 -14
  218. data/lib/datadog/di/configuration/settings.rb +25 -1
  219. data/lib/datadog/di/contrib/active_record.rb +1 -0
  220. data/lib/datadog/di/contrib/railtie.rb +15 -0
  221. data/lib/datadog/di/contrib.rb +28 -0
  222. data/lib/datadog/di/error.rb +5 -0
  223. data/lib/datadog/di/instrumenter.rb +111 -20
  224. data/lib/datadog/di/logger.rb +30 -0
  225. data/lib/datadog/di/preload.rb +18 -0
  226. data/lib/datadog/di/probe.rb +14 -7
  227. data/lib/datadog/di/probe_builder.rb +1 -0
  228. data/lib/datadog/di/probe_manager.rb +11 -5
  229. data/lib/datadog/di/probe_notification_builder.rb +34 -8
  230. data/lib/datadog/di/probe_notifier_worker.rb +52 -26
  231. data/lib/datadog/di/redactor.rb +0 -1
  232. data/lib/datadog/di/remote.rb +147 -0
  233. data/lib/datadog/di/serializer.rb +14 -7
  234. data/lib/datadog/di/transport/diagnostics.rb +62 -0
  235. data/lib/datadog/di/transport/http/api.rb +42 -0
  236. data/lib/datadog/di/transport/http/client.rb +47 -0
  237. data/lib/datadog/di/transport/http/diagnostics.rb +65 -0
  238. data/lib/datadog/di/transport/http/input.rb +67 -0
  239. data/lib/datadog/di/transport/http.rb +57 -0
  240. data/lib/datadog/di/transport/input.rb +62 -0
  241. data/lib/datadog/di/utils.rb +103 -0
  242. data/lib/datadog/di.rb +14 -76
  243. data/lib/datadog/error_tracking/collector.rb +87 -0
  244. data/lib/datadog/error_tracking/component.rb +167 -0
  245. data/lib/datadog/error_tracking/configuration/settings.rb +63 -0
  246. data/lib/datadog/error_tracking/configuration.rb +11 -0
  247. data/lib/datadog/error_tracking/ext.rb +18 -0
  248. data/lib/datadog/error_tracking/extensions.rb +16 -0
  249. data/lib/datadog/error_tracking/filters.rb +77 -0
  250. data/lib/datadog/error_tracking.rb +18 -0
  251. data/lib/datadog/kit/appsec/events.rb +15 -3
  252. data/lib/datadog/kit/identity.rb +9 -5
  253. data/lib/datadog/opentelemetry/api/baggage.rb +90 -0
  254. data/lib/datadog/opentelemetry/api/baggage.rbs +26 -0
  255. data/lib/datadog/opentelemetry/api/context.rb +16 -2
  256. data/lib/datadog/opentelemetry/sdk/trace/span.rb +1 -1
  257. data/lib/datadog/opentelemetry.rb +2 -1
  258. data/lib/datadog/profiling/collectors/code_provenance.rb +1 -1
  259. data/lib/datadog/profiling/collectors/info.rb +3 -0
  260. data/lib/datadog/profiling/collectors/thread_context.rb +1 -1
  261. data/lib/datadog/profiling/component.rb +60 -76
  262. data/lib/datadog/profiling/encoded_profile.rb +11 -0
  263. data/lib/datadog/profiling/exporter.rb +3 -4
  264. data/lib/datadog/profiling/ext.rb +0 -2
  265. data/lib/datadog/profiling/flush.rb +5 -8
  266. data/lib/datadog/profiling/http_transport.rb +6 -85
  267. data/lib/datadog/profiling/load_native_extension.rb +1 -33
  268. data/lib/datadog/profiling/scheduler.rb +8 -1
  269. data/lib/datadog/profiling/stack_recorder.rb +4 -4
  270. data/lib/datadog/profiling/tag_builder.rb +1 -5
  271. data/lib/datadog/profiling.rb +6 -2
  272. data/lib/datadog/tracing/analytics.rb +1 -1
  273. data/lib/datadog/tracing/component.rb +16 -12
  274. data/lib/datadog/tracing/configuration/ext.rb +8 -1
  275. data/lib/datadog/tracing/configuration/settings.rb +22 -10
  276. data/lib/datadog/tracing/context_provider.rb +1 -1
  277. data/lib/datadog/tracing/contrib/action_cable/integration.rb +5 -2
  278. data/lib/datadog/tracing/contrib/action_mailer/integration.rb +6 -2
  279. data/lib/datadog/tracing/contrib/action_pack/integration.rb +5 -2
  280. data/lib/datadog/tracing/contrib/action_view/integration.rb +5 -2
  281. data/lib/datadog/tracing/contrib/active_job/integration.rb +5 -2
  282. data/lib/datadog/tracing/contrib/active_record/integration.rb +7 -3
  283. data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +7 -2
  284. data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +36 -1
  285. data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +4 -0
  286. data/lib/datadog/tracing/contrib/active_support/cache/redis.rb +14 -4
  287. data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +10 -0
  288. data/lib/datadog/tracing/contrib/active_support/integration.rb +5 -2
  289. data/lib/datadog/tracing/contrib/auto_instrument.rb +2 -2
  290. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +10 -0
  291. data/lib/datadog/tracing/contrib/aws/integration.rb +3 -0
  292. data/lib/datadog/tracing/contrib/aws/parsed_context.rb +5 -1
  293. data/lib/datadog/tracing/contrib/concurrent_ruby/integration.rb +3 -0
  294. data/lib/datadog/tracing/contrib/configuration/settings.rb +1 -1
  295. data/lib/datadog/tracing/contrib/elasticsearch/configuration/settings.rb +4 -0
  296. data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +6 -1
  297. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +4 -5
  298. data/lib/datadog/tracing/contrib/excon/middleware.rb +5 -3
  299. data/lib/datadog/tracing/contrib/ext.rb +1 -0
  300. data/lib/datadog/tracing/contrib/extensions.rb +29 -3
  301. data/lib/datadog/tracing/contrib/faraday/middleware.rb +5 -3
  302. data/lib/datadog/tracing/contrib/graphql/configuration/error_extension_env_parser.rb +21 -0
  303. data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +11 -0
  304. data/lib/datadog/tracing/contrib/graphql/ext.rb +5 -0
  305. data/lib/datadog/tracing/contrib/graphql/unified_trace.rb +102 -11
  306. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +7 -1
  307. data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +3 -0
  308. data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +0 -15
  309. data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +4 -1
  310. data/lib/datadog/tracing/contrib/http/instrumentation.rb +6 -10
  311. data/lib/datadog/tracing/contrib/http/integration.rb +3 -0
  312. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +6 -16
  313. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +7 -15
  314. data/lib/datadog/tracing/contrib/httprb/integration.rb +3 -0
  315. data/lib/datadog/tracing/contrib/kafka/integration.rb +3 -0
  316. data/lib/datadog/tracing/contrib/karafka/configuration/settings.rb +27 -0
  317. data/lib/datadog/tracing/contrib/karafka/distributed/propagation.rb +48 -0
  318. data/lib/datadog/tracing/contrib/karafka/ext.rb +27 -0
  319. data/lib/datadog/tracing/contrib/karafka/integration.rb +45 -0
  320. data/lib/datadog/tracing/contrib/karafka/monitor.rb +66 -0
  321. data/lib/datadog/tracing/contrib/karafka/patcher.rb +71 -0
  322. data/lib/datadog/tracing/contrib/karafka.rb +37 -0
  323. data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +8 -0
  324. data/lib/datadog/tracing/contrib/mongodb/ext.rb +1 -0
  325. data/lib/datadog/tracing/contrib/mongodb/integration.rb +3 -0
  326. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +18 -1
  327. data/lib/datadog/tracing/contrib/opensearch/configuration/settings.rb +17 -0
  328. data/lib/datadog/tracing/contrib/opensearch/ext.rb +9 -0
  329. data/lib/datadog/tracing/contrib/opensearch/integration.rb +3 -0
  330. data/lib/datadog/tracing/contrib/opensearch/patcher.rb +5 -1
  331. data/lib/datadog/tracing/contrib/patcher.rb +5 -2
  332. data/lib/datadog/tracing/contrib/presto/integration.rb +3 -0
  333. data/lib/datadog/tracing/contrib/rack/header_collection.rb +11 -1
  334. data/lib/datadog/tracing/contrib/rack/integration.rb +2 -2
  335. data/lib/datadog/tracing/contrib/rack/middlewares.rb +1 -1
  336. data/lib/datadog/tracing/contrib/rack/request_queue.rb +1 -1
  337. data/lib/datadog/tracing/contrib/rails/framework.rb +2 -2
  338. data/lib/datadog/tracing/contrib/rails/patcher.rb +1 -1
  339. data/lib/datadog/tracing/contrib/rest_client/integration.rb +3 -0
  340. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +5 -3
  341. data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +6 -1
  342. data/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb +3 -0
  343. data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +1 -1
  344. data/lib/datadog/tracing/contrib/span_attribute_schema.rb +6 -1
  345. data/lib/datadog/tracing/contrib/support.rb +28 -0
  346. data/lib/datadog/tracing/contrib.rb +1 -0
  347. data/lib/datadog/tracing/correlation.rb +9 -2
  348. data/lib/datadog/tracing/distributed/b3_multi.rb +1 -1
  349. data/lib/datadog/tracing/distributed/b3_single.rb +1 -1
  350. data/lib/datadog/tracing/distributed/baggage.rb +131 -0
  351. data/lib/datadog/tracing/distributed/datadog.rb +4 -2
  352. data/lib/datadog/tracing/distributed/propagation.rb +25 -4
  353. data/lib/datadog/tracing/distributed/propagation_policy.rb +42 -0
  354. data/lib/datadog/tracing/metadata/errors.rb +4 -4
  355. data/lib/datadog/tracing/metadata/ext.rb +5 -0
  356. data/lib/datadog/tracing/metadata/metastruct.rb +36 -0
  357. data/lib/datadog/tracing/metadata/metastruct_tagging.rb +42 -0
  358. data/lib/datadog/tracing/metadata.rb +2 -0
  359. data/lib/datadog/tracing/sampling/rate_sampler.rb +2 -1
  360. data/lib/datadog/tracing/sampling/span/rule.rb +0 -1
  361. data/lib/datadog/tracing/span.rb +22 -5
  362. data/lib/datadog/tracing/span_event.rb +124 -4
  363. data/lib/datadog/tracing/span_operation.rb +52 -16
  364. data/lib/datadog/tracing/sync_writer.rb +9 -5
  365. data/lib/datadog/tracing/trace_digest.rb +9 -2
  366. data/lib/datadog/tracing/trace_operation.rb +44 -24
  367. data/lib/datadog/tracing/trace_segment.rb +6 -4
  368. data/lib/datadog/tracing/tracer.rb +60 -12
  369. data/lib/datadog/tracing/transport/http/api.rb +5 -4
  370. data/lib/datadog/tracing/transport/http/client.rb +5 -4
  371. data/lib/datadog/tracing/transport/http/traces.rb +13 -44
  372. data/lib/datadog/tracing/transport/http.rb +13 -70
  373. data/lib/datadog/tracing/transport/serializable_trace.rb +31 -7
  374. data/lib/datadog/tracing/transport/trace_formatter.rb +7 -0
  375. data/lib/datadog/tracing/transport/traces.rb +47 -13
  376. data/lib/datadog/tracing/utils.rb +1 -1
  377. data/lib/datadog/tracing/workers/trace_writer.rb +8 -5
  378. data/lib/datadog/tracing/workers.rb +5 -4
  379. data/lib/datadog/tracing/writer.rb +10 -6
  380. data/lib/datadog/tracing.rb +16 -3
  381. data/lib/datadog/version.rb +2 -2
  382. data/lib/datadog.rb +2 -0
  383. metadata +143 -50
  384. data/ext/datadog_profiling_loader/datadog_profiling_loader.c +0 -142
  385. data/ext/datadog_profiling_loader/extconf.rb +0 -60
  386. data/lib/datadog/appsec/contrib/devise/event.rb +0 -57
  387. data/lib/datadog/appsec/contrib/devise/patcher/authenticatable_patch.rb +0 -77
  388. data/lib/datadog/appsec/contrib/devise/patcher/registration_controller_patch.rb +0 -54
  389. data/lib/datadog/appsec/contrib/devise/resource.rb +0 -35
  390. data/lib/datadog/appsec/contrib/devise/tracking.rb +0 -57
  391. data/lib/datadog/appsec/contrib/graphql/reactive/multiplex.rb +0 -46
  392. data/lib/datadog/appsec/contrib/patcher.rb +0 -12
  393. data/lib/datadog/appsec/contrib/rack/reactive/request.rb +0 -69
  394. data/lib/datadog/appsec/contrib/rack/reactive/request_body.rb +0 -47
  395. data/lib/datadog/appsec/contrib/rack/reactive/response.rb +0 -53
  396. data/lib/datadog/appsec/contrib/rails/reactive/action.rb +0 -53
  397. data/lib/datadog/appsec/contrib/sinatra/ext.rb +0 -14
  398. data/lib/datadog/appsec/contrib/sinatra/reactive/routed.rb +0 -48
  399. data/lib/datadog/appsec/monitor/reactive/set_user.rb +0 -45
  400. data/lib/datadog/appsec/processor/actions.rb +0 -49
  401. data/lib/datadog/appsec/processor/context.rb +0 -107
  402. data/lib/datadog/appsec/reactive/address_hash.rb +0 -22
  403. data/lib/datadog/appsec/reactive/engine.rb +0 -47
  404. data/lib/datadog/appsec/reactive/operation.rb +0 -68
  405. data/lib/datadog/appsec/reactive/subscriber.rb +0 -19
  406. data/lib/datadog/appsec/scope.rb +0 -58
  407. data/lib/datadog/appsec/utils/trace_operation.rb +0 -15
  408. data/lib/datadog/core/crashtracking/agent_base_url.rb +0 -21
  409. data/lib/datadog/core/remote/transport/http/api/instance.rb +0 -39
  410. data/lib/datadog/core/remote/transport/http/api/spec.rb +0 -21
  411. data/lib/datadog/core/remote/transport/http/builder.rb +0 -219
  412. data/lib/datadog/core/telemetry/http/env.rb +0 -20
  413. data/lib/datadog/core/telemetry/http/ext.rb +0 -28
  414. data/lib/datadog/core/telemetry/http/response.rb +0 -70
  415. data/lib/datadog/core/telemetry/http/transport.rb +0 -90
  416. data/lib/datadog/di/transport.rb +0 -81
  417. data/lib/datadog/tracing/transport/http/api/spec.rb +0 -19
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Datadog
4
+ module AppSec
5
+ # A class that represents a security event of any kind. It could be an event
6
+ # representing an attack or fingerprinting results as derivatives or an API
7
+ # security check with extracted schema.
8
+ class SecurityEvent
9
+ SCHEMA_KEY_PREFIX = '_dd.appsec.s.'
10
+ FINGERPRINT_KEY_PREFIX = '_dd.appsec.fp.'
11
+
12
+ attr_reader :waf_result, :trace, :span
13
+
14
+ def initialize(waf_result, trace:, span:)
15
+ @waf_result = waf_result
16
+ @trace = trace
17
+ @span = span
18
+ end
19
+
20
+ def attack?
21
+ return @is_attack if defined?(@is_attack)
22
+
23
+ @is_attack = @waf_result.is_a?(SecurityEngine::Result::Match)
24
+ end
25
+
26
+ def schema?
27
+ return @has_schema if defined?(@has_schema)
28
+
29
+ @has_schema = @waf_result.derivatives.any? { |name, _| name.start_with?(SCHEMA_KEY_PREFIX) }
30
+ end
31
+
32
+ def fingerprint?
33
+ return @has_fingerprint if defined?(@has_fingerprint)
34
+
35
+ @has_fingerprint = @waf_result.derivatives.any? { |name, _| name.start_with?(FINGERPRINT_KEY_PREFIX) }
36
+ end
37
+ end
38
+ end
39
+ end
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'utils/trace_operation'
4
-
5
3
  module Datadog
6
4
  module AppSec
7
5
  # Utilities for AppSec
@@ -2,7 +2,7 @@
2
2
 
3
3
  require_relative 'appsec/configuration'
4
4
  require_relative 'appsec/extensions'
5
- require_relative 'appsec/scope'
5
+ require_relative 'appsec/context'
6
6
  require_relative 'appsec/ext'
7
7
  require_relative 'appsec/utils'
8
8
 
@@ -14,32 +14,41 @@ module Datadog
14
14
  Datadog.configuration.appsec.enabled
15
15
  end
16
16
 
17
- def active_scope
18
- Datadog::AppSec::Scope.active_scope
17
+ def rasp_enabled?
18
+ Datadog.configuration.appsec.rasp_enabled
19
19
  end
20
20
 
21
- def processor
22
- appsec_component = components.appsec
21
+ def active_context
22
+ Datadog::AppSec::Context.active
23
+ end
23
24
 
24
- appsec_component.processor if appsec_component
25
+ def telemetry
26
+ components.appsec&.telemetry
25
27
  end
26
28
 
27
- def reconfigure(ruleset:, actions:, telemetry:)
28
- appsec_component = components.appsec
29
+ def processor
30
+ components.appsec&.processor
31
+ end
29
32
 
33
+ def reconfigure(ruleset:, telemetry:)
34
+ appsec_component = components.appsec
30
35
  return unless appsec_component
31
36
 
32
- appsec_component.reconfigure(ruleset: ruleset, actions: actions, telemetry: telemetry)
37
+ appsec_component.reconfigure(ruleset: ruleset, telemetry: telemetry)
33
38
  end
34
39
 
35
40
  def reconfigure_lock(&block)
36
41
  appsec_component = components.appsec
37
-
38
42
  return unless appsec_component
39
43
 
40
44
  appsec_component.reconfigure_lock(&block)
41
45
  end
42
46
 
47
+ def perform_api_security_check?
48
+ Datadog.configuration.appsec.api_security.enabled &&
49
+ Datadog.configuration.appsec.api_security.sample_rate.sample?
50
+ end
51
+
43
52
  private
44
53
 
45
54
  def components
@@ -56,7 +65,11 @@ end
56
65
  require_relative 'appsec/contrib/rack/integration'
57
66
  require_relative 'appsec/contrib/sinatra/integration'
58
67
  require_relative 'appsec/contrib/rails/integration'
68
+ require_relative 'appsec/contrib/active_record/integration'
59
69
  require_relative 'appsec/contrib/devise/integration'
60
70
  require_relative 'appsec/contrib/graphql/integration'
71
+ require_relative 'appsec/contrib/faraday/integration'
72
+ require_relative 'appsec/contrib/excon/integration'
73
+ require_relative 'appsec/contrib/rest_client/integration'
61
74
 
62
75
  require_relative 'appsec/autoload'
@@ -6,6 +6,9 @@
6
6
  require_relative '../datadog'
7
7
  require_relative 'tracing/contrib/auto_instrument'
8
8
 
9
+ # DI is not loaded on Ruby 2.5 and JRuby
10
+ Datadog::DI::Contrib.load_now_or_later if defined?(Datadog::DI::Contrib)
11
+
9
12
  Datadog::Profiling.start_if_enabled
10
13
 
11
14
  module Datadog
@@ -40,7 +40,23 @@ module Datadog
40
40
  add_all!(underflow) unless underflow.nil?
41
41
 
42
42
  # Iteratively replace items, to ensure pseudo-random replacement.
43
- overflow.each { |item| replace!(item) } unless overflow.nil?
43
+ overflow&.each { |item| replace!(item) }
44
+ end
45
+
46
+ def unshift(*items)
47
+ # TODO The existing concat implementation does not always append
48
+ # to the end of the buffer - if the buffer is full, a random
49
+ # item is deleted and the new item is added in the position of
50
+ # removed item.
51
+ # Therefore, if we want to preserve the item order, concat
52
+ # would also need to be changed to maintain order.
53
+ # With the existing implementation, the idea is to not move
54
+ # existing items around, which is what sets unshift apart from
55
+ # concat to begin with.
56
+ #
57
+ # Since this method currently delegates to +concat+, it does not
58
+ # have a matching definition in the thread-safe worker.
59
+ concat(items)
44
60
  end
45
61
 
46
62
  # Stored items are returned and the local buffer is reset.
@@ -78,7 +94,7 @@ module Datadog
78
94
  underflow = nil
79
95
  overflow = nil
80
96
 
81
- overflow_size = @max_size > 0 ? (@items.length + items.length) - @max_size : 0
97
+ overflow_size = (@max_size > 0) ? (@items.length + items.length) - @max_size : 0
82
98
 
83
99
  if overflow_size > 0
84
100
  # Items will overflow
@@ -19,21 +19,49 @@ module Datadog
19
19
  # Whenever there is a conflict (different configurations are provided in different orders), it MUST warn the users
20
20
  # about it and pick a value based on the following priority: code > environment variable > defaults.
21
21
  class AgentSettingsResolver
22
- AgentSettings = Struct.new(
23
- :adapter,
24
- :ssl,
25
- :hostname,
26
- :port,
27
- :uds_path,
28
- :timeout_seconds,
29
- keyword_init: true
30
- ) do
31
- def initialize(*)
32
- super
22
+ # Immutable container for the resulting settings
23
+ class AgentSettings
24
+ attr_reader :adapter, :ssl, :hostname, :port, :uds_path, :timeout_seconds
25
+
26
+ def initialize(adapter: nil, ssl: nil, hostname: nil, port: nil, uds_path: nil, timeout_seconds: nil)
27
+ @adapter = adapter
28
+ @ssl = ssl
29
+ @hostname = hostname
30
+ @port = port
31
+ @uds_path = uds_path
32
+ @timeout_seconds = timeout_seconds
33
33
  freeze
34
34
  end
35
+
36
+ def url
37
+ case adapter
38
+ when Datadog::Core::Configuration::Ext::Agent::HTTP::ADAPTER
39
+ hostname = self.hostname
40
+ hostname = "[#{hostname}]" if IPV6_REGEXP.match?(hostname)
41
+ "#{ssl ? "https" : "http"}://#{hostname}:#{port}/"
42
+ when Datadog::Core::Configuration::Ext::Agent::UnixSocket::ADAPTER
43
+ "unix://#{uds_path}"
44
+ else
45
+ raise ArgumentError, "Unexpected adapter: #{adapter}"
46
+ end
47
+ end
48
+
49
+ def ==(other)
50
+ self.class == other.class &&
51
+ adapter == other.adapter &&
52
+ ssl == other.ssl &&
53
+ hostname == other.hostname &&
54
+ port == other.port &&
55
+ uds_path == other.uds_path &&
56
+ timeout_seconds == other.timeout_seconds
57
+ end
35
58
  end
36
59
 
60
+ # IPv6 regular expression from
61
+ # https://stackoverflow.com/questions/53497/regular-expression-that-matches-valid-ipv6-addresses
62
+ # Does not match IPv4 addresses.
63
+ IPV6_REGEXP = /\A(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\z)/.freeze # rubocop:disable Layout/LineLength
64
+
37
65
  def self.call(settings, logger: Datadog.logger)
38
66
  new(settings, logger: logger).send(:call)
39
67
  end
@@ -130,7 +158,7 @@ module Datadog
130
158
  value: settings.agent.timeout_seconds,
131
159
  ),
132
160
  try_parsing_as_integer(
133
- friendly_name: "#{Datadog::Core::Configuration::Ext::Agent::ENV_DEFAULT_TIMEOUT_SECONDS} "\
161
+ friendly_name: "#{Datadog::Core::Configuration::Ext::Agent::ENV_DEFAULT_TIMEOUT_SECONDS} " \
134
162
  'environment variable',
135
163
  value: ENV[Datadog::Core::Configuration::Ext::Agent::ENV_DEFAULT_TIMEOUT_SECONDS],
136
164
  )
@@ -310,13 +338,13 @@ module Datadog
310
338
  log_warning(
311
339
  'Configuration mismatch: values differ between ' \
312
340
  "#{detected_configurations_in_priority_order
313
- .map { |config| "#{config.friendly_name} (#{config.value.inspect})" }.join(' and ')}" \
341
+ .map { |config| "#{config.friendly_name} (#{config.value.inspect})" }.join(" and ")}" \
314
342
  ". Using #{detected_configurations_in_priority_order.first.value.inspect} and ignoring other configuration."
315
343
  )
316
344
  end
317
345
 
318
346
  def log_warning(message)
319
- logger.warn(message) if logger
347
+ logger&.warn(message)
320
348
  end
321
349
 
322
350
  def http_scheme?(uri)
@@ -0,0 +1,176 @@
1
+ # frozen_string_literal: true
2
+
3
+ # rubocop:disable Style/*
4
+
5
+ require 'uri'
6
+
7
+ require_relative 'agent_settings_resolver'
8
+
9
+ module Datadog
10
+ module Core
11
+ module Configuration
12
+ # Agent settings resolver for agentless operations (currently, telemetry
13
+ # in agentless mode).
14
+ #
15
+ # The terminology gets a little confusing here, but transports communicate
16
+ # with servers which are - for most components in the tracer - the
17
+ # (local) agent. Hence, "agent settings" to refer to where the server
18
+ # is located. Telemetry supports sending to the local agent but also
19
+ # implements agentless mode where it sends directly to Datadog intake
20
+ # endpoints. The agentless mode is configured using different settings,
21
+ # and this class produces AgentSettings instances when in agentless mode.
22
+ #
23
+ # Agentless settings resolver uses the following configuration sources:
24
+ #
25
+ # 1. url_override constructor parameter, if provided
26
+ # 2. Built-in default host/port/TLS settings for the backend
27
+ # intake endpoint
28
+ #
29
+ # The agentless resolver does NOT use agent settings (since it is
30
+ # for agentless operation), specifically it ignores:
31
+ #
32
+ # - c.agent.host
33
+ # - DD_AGENT_HOST
34
+ # - c.agent.port
35
+ # - DD_AGENT_PORT
36
+ #
37
+ # However, agentless resolver does respect the timeout specified via
38
+ # c.agent.timeout_seconds or DD_TRACE_AGENT_TIMEOUT_SECONDS.
39
+ class AgentlessSettingsResolver < AgentSettingsResolver
40
+ # To avoid coupling this class to telemetry, the URL override is
41
+ # taken here as a parameter instead of being read out of
42
+ # c.telemetry.agentless_url_override. For the same reason, the
43
+ # +url_override_source+ parameter should be set to the string
44
+ # "c.telemetry.agentless_url_override".
45
+ def self.call(settings, host_prefix:, url_override: nil, url_override_source: nil, logger: Datadog.logger)
46
+ new(
47
+ settings,
48
+ host_prefix: host_prefix,
49
+ url_override: url_override,
50
+ url_override_source: url_override_source,
51
+ logger: logger
52
+ ).send(:call)
53
+ end
54
+
55
+ private
56
+
57
+ attr_reader \
58
+ :host_prefix,
59
+ :url_override,
60
+ :url_override_source
61
+
62
+ def initialize(settings, host_prefix:, url_override: nil, url_override_source: nil, logger: Datadog.logger)
63
+ if url_override && url_override_source.nil?
64
+ raise ArgumentError, 'url_override_source must be provided when url_override is provided'
65
+ end
66
+
67
+ super(settings, logger: logger)
68
+
69
+ @host_prefix = host_prefix
70
+ @url_override = url_override
71
+ @url_override_source = url_override_source
72
+ end
73
+
74
+ def hostname
75
+ if should_use_uds?
76
+ nil
77
+ else
78
+ configured_hostname || "#{host_prefix}.#{settings.site}"
79
+ end
80
+ end
81
+
82
+ def configured_hostname
83
+ return @configured_hostname if defined?(@configured_hostname)
84
+
85
+ if should_use_uds?
86
+ nil
87
+ else
88
+ @configured_hostname = (parsed_url.hostname if parsed_url)
89
+ end
90
+ end
91
+
92
+ def configured_port
93
+ return @configured_port if defined?(@configured_port)
94
+
95
+ @configured_port = (parsed_url.port if parsed_url)
96
+ end
97
+
98
+ # Note that this method should always return true or false
99
+ def ssl?
100
+ if configured_hostname
101
+ configured_ssl || false
102
+ else
103
+ if should_use_uds?
104
+ false
105
+ else
106
+ # If no hostname is specified, we are communicating with the
107
+ # default Datadog intake, which uses TLS.
108
+ true
109
+ end
110
+ end
111
+ end
112
+
113
+ # Note that this method can return nil
114
+ def configured_ssl
115
+ return @configured_ssl if defined?(@configured_ssl)
116
+
117
+ @configured_ssl = (parsed_url_ssl? if parsed_url)
118
+ end
119
+
120
+ def port
121
+ if configured_port
122
+ configured_port
123
+ else
124
+ if should_use_uds?
125
+ nil
126
+ else
127
+ # If no hostname is specified, we are communicating with the
128
+ # default Datadog intake, which exists on port 443.
129
+ 443
130
+ end
131
+ end
132
+ end
133
+
134
+ def mixed_http_and_uds
135
+ false
136
+ end
137
+
138
+ def configured_uds_path
139
+ return @configured_uds_path if defined?(@configured_uds_path)
140
+
141
+ parsed_url_uds_path
142
+ end
143
+
144
+ def can_use_uds?
145
+ # While in theory agentless transport could communicate via UDS,
146
+ # in practice "agentless" means we are communicating with Datadog
147
+ # infrastructure which is always remote.
148
+ # Permit UDS for proxy usage?
149
+ !configured_uds_path.nil?
150
+ end
151
+
152
+ def parsed_url
153
+ return @parsed_url if defined?(@parsed_url)
154
+
155
+ @parsed_url =
156
+ if @url_override
157
+ parsed = URI.parse(@url_override)
158
+
159
+ # Agentless URL should never refer to a UDS?
160
+ if http_scheme?(parsed) || unix_scheme?(parsed)
161
+ parsed
162
+ else
163
+ log_warning(
164
+ "Invalid URI scheme '#{parsed.scheme}' for #{url_override_source}. " \
165
+ "Ignoring the contents of #{url_override_source}."
166
+ )
167
+ nil
168
+ end
169
+ end
170
+ end
171
+ end
172
+ end
173
+ end
174
+ end
175
+
176
+ # rubocop:enable Style/*
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative 'agent_settings_resolver'
4
+ require_relative 'components_state'
4
5
  require_relative 'ext'
5
6
  require_relative '../diagnostics/environment_logger'
6
7
  require_relative '../diagnostics/health'
@@ -8,12 +9,15 @@ require_relative '../logger'
8
9
  require_relative '../runtime/metrics'
9
10
  require_relative '../telemetry/component'
10
11
  require_relative '../workers/runtime_metrics'
11
-
12
12
  require_relative '../remote/component'
13
13
  require_relative '../../tracing/component'
14
14
  require_relative '../../profiling/component'
15
15
  require_relative '../../appsec/component'
16
+ require_relative '../../di/component'
17
+ require_relative '../../error_tracking/component'
16
18
  require_relative '../crashtracking/component'
19
+ require_relative '../environment/agent_info'
20
+ require_relative '../process_discovery'
17
21
 
18
22
  module Datadog
19
23
  module Core
@@ -23,12 +27,12 @@ module Datadog
23
27
  class << self
24
28
  include Datadog::Tracing::Component
25
29
 
26
- def build_health_metrics(settings)
30
+ def build_health_metrics(settings, logger, telemetry)
27
31
  settings = settings.health_metrics
28
- options = { enabled: settings.enabled }
32
+ options = {enabled: settings.enabled}
29
33
  options[:statsd] = settings.statsd unless settings.statsd.nil?
30
34
 
31
- Core::Diagnostics::Health::Metrics.new(**options)
35
+ Core::Diagnostics::Health::Metrics.new(telemetry: telemetry, logger: logger, **options)
32
36
  end
33
37
 
34
38
  def build_logger(settings)
@@ -38,22 +42,24 @@ module Datadog
38
42
  logger
39
43
  end
40
44
 
41
- def build_runtime_metrics(settings)
42
- options = { enabled: settings.runtime_metrics.enabled }
45
+ def build_runtime_metrics(settings, logger, telemetry)
46
+ options = {enabled: settings.runtime_metrics.enabled}
43
47
  options[:statsd] = settings.runtime_metrics.statsd unless settings.runtime_metrics.statsd.nil?
44
48
  options[:services] = [settings.service] unless settings.service.nil?
49
+ options[:experimental_runtime_id_enabled] = settings.runtime_metrics.experimental_runtime_id_enabled
45
50
 
46
- Core::Runtime::Metrics.new(**options)
51
+ Core::Runtime::Metrics.new(logger: logger, telemetry: telemetry, **options)
47
52
  end
48
53
 
49
- def build_runtime_metrics_worker(settings)
54
+ def build_runtime_metrics_worker(settings, logger, telemetry)
50
55
  # NOTE: Should we just ignore building the worker if its not enabled?
51
56
  options = settings.runtime_metrics.opts.merge(
52
57
  enabled: settings.runtime_metrics.enabled,
53
- metrics: build_runtime_metrics(settings)
58
+ metrics: build_runtime_metrics(settings, logger, telemetry),
59
+ logger: logger,
54
60
  )
55
61
 
56
- Core::Workers::RuntimeMetrics.new(options)
62
+ Core::Workers::RuntimeMetrics.new(telemetry: telemetry, **options)
57
63
  end
58
64
 
59
65
  def build_telemetry(settings, agent_settings, logger)
@@ -63,7 +69,7 @@ module Datadog
63
69
  def build_crashtracker(settings, agent_settings, logger:)
64
70
  return unless settings.crashtracking.enabled
65
71
 
66
- if (libdatadog_api_failure = Datadog::Core::Crashtracking::Component::LIBDATADOG_API_FAILURE)
72
+ if (libdatadog_api_failure = Datadog::Core::LIBDATADOG_API_FAILURE)
67
73
  logger.debug("Cannot enable crashtracking: #{libdatadog_api_failure}")
68
74
  return
69
75
  end
@@ -83,7 +89,10 @@ module Datadog
83
89
  :telemetry,
84
90
  :tracer,
85
91
  :crashtracker,
86
- :appsec
92
+ :error_tracking,
93
+ :dynamic_instrumentation,
94
+ :appsec,
95
+ :agent_info
87
96
 
88
97
  def initialize(settings)
89
98
  @logger = self.class.build_logger(settings)
@@ -94,28 +103,39 @@ module Datadog
94
103
  # the Core resolver from within your product/component's namespace.
95
104
  agent_settings = AgentSettingsResolver.call(settings, logger: @logger)
96
105
 
106
+ # Exposes agent capability information for detection by any components
107
+ @agent_info = Core::Environment::AgentInfo.new(agent_settings, logger: @logger)
108
+
97
109
  @telemetry = self.class.build_telemetry(settings, agent_settings, @logger)
98
110
 
99
- @remote = Remote::Component.build(settings, agent_settings, telemetry: telemetry)
111
+ @remote = Remote::Component.build(settings, agent_settings, logger: @logger, telemetry: telemetry)
100
112
  @tracer = self.class.build_tracer(settings, agent_settings, logger: @logger)
101
113
  @crashtracker = self.class.build_crashtracker(settings, agent_settings, logger: @logger)
102
114
 
103
115
  @profiler, profiler_logger_extra = Datadog::Profiling::Component.build_profiler_component(
104
116
  settings: settings,
105
117
  agent_settings: agent_settings,
106
- optional_tracer: @tracer
118
+ optional_tracer: @tracer,
119
+ logger: @logger,
107
120
  )
108
121
  @environment_logger_extra.merge!(profiler_logger_extra) if profiler_logger_extra
109
122
 
110
- @runtime_metrics = self.class.build_runtime_metrics_worker(settings)
111
- @health_metrics = self.class.build_health_metrics(settings)
123
+ @runtime_metrics = self.class.build_runtime_metrics_worker(settings, @logger, telemetry)
124
+ @health_metrics = self.class.build_health_metrics(settings, @logger, telemetry)
112
125
  @appsec = Datadog::AppSec::Component.build_appsec_component(settings, telemetry: telemetry)
126
+ @dynamic_instrumentation = Datadog::DI::Component.build(settings, agent_settings, @logger, telemetry: telemetry)
127
+ @error_tracking = Datadog::ErrorTracking::Component.build(settings, @tracer, @logger)
128
+ @environment_logger_extra[:dynamic_instrumentation_enabled] = !!@dynamic_instrumentation
129
+ # TODO: Re-enable this once we have updated libdatadog to 17.1
130
+ # @process_discovery_fd = Core::ProcessDiscovery.get_and_store_metadata(settings, @logger)
113
131
 
114
132
  self.class.configure_tracing(settings)
115
133
  end
116
134
 
117
135
  # Starts up components
118
- def startup!(settings)
136
+ def startup!(settings, old_state: nil)
137
+ telemetry.start(old_state&.telemetry_enabled?)
138
+
119
139
  if settings.profiling.enabled
120
140
  if profiler
121
141
  profiler.start
@@ -126,6 +146,16 @@ module Datadog
126
146
  end
127
147
  end
128
148
 
149
+ if settings.remote.enabled && old_state&.remote_started?
150
+ # The library was reconfigured and previously it already started
151
+ # the remote component (i.e., it received at least one request
152
+ # through the installed Rack middleware which started the remote).
153
+ # If the new configuration also has remote enabled, start the
154
+ # new remote right away.
155
+ # remote should always be not nil here but steep doesn't know this.
156
+ remote&.start
157
+ end
158
+
129
159
  Core::Diagnostics::EnvironmentLogger.collect_and_log!(@environment_logger_extra)
130
160
  end
131
161
 
@@ -134,17 +164,20 @@ module Datadog
134
164
  # and avoid tearing down parts still in use.
135
165
  def shutdown!(replacement = nil)
136
166
  # Shutdown remote configuration
137
- remote.shutdown! if remote
167
+ remote&.shutdown!
168
+
169
+ # Shutdown DI after remote, since remote config triggers DI operations.
170
+ dynamic_instrumentation&.shutdown!
138
171
 
139
172
  # Decommission AppSec
140
- appsec.shutdown! if appsec
173
+ appsec&.shutdown!
141
174
 
142
175
  # Shutdown the old tracer, unless it's still being used.
143
176
  # (e.g. a custom tracer instance passed in.)
144
- tracer.shutdown! unless replacement && tracer == replacement.tracer
177
+ tracer.shutdown! unless replacement && tracer.equal?(replacement.tracer)
145
178
 
146
179
  # Shutdown old profiler
147
- profiler.shutdown! unless profiler.nil?
180
+ profiler&.shutdown!
148
181
 
149
182
  # Shutdown workers
150
183
  runtime_metrics.stop(true, close_metrics: false)
@@ -162,21 +195,32 @@ module Datadog
162
195
  health_metrics.statsd
163
196
  ].compact.uniq
164
197
 
165
- new_statsd = if replacement
166
- [
167
- replacement.runtime_metrics.metrics.statsd,
168
- replacement.health_metrics.statsd
169
- ].compact.uniq
170
- else
171
- []
172
- end
198
+ new_statsd = if replacement
199
+ [
200
+ replacement.runtime_metrics.metrics.statsd,
201
+ replacement.health_metrics.statsd
202
+ ].compact.uniq
203
+ else
204
+ []
205
+ end
173
206
 
174
207
  unused_statsd = (old_statsd - (old_statsd & new_statsd))
175
208
  unused_statsd.each(&:close)
176
209
 
177
- # enqueue closing event before stopping telemetry so it will be send out on shutdown
178
- telemetry.emit_closing! unless replacement
179
- telemetry.stop!
210
+ # enqueue closing event before stopping telemetry so it will be sent out on shutdown
211
+ telemetry.emit_closing! unless replacement&.telemetry&.enabled
212
+ telemetry.shutdown!
213
+
214
+ # TODO: Re-enable this once we have updated libdatadog to 17.1
215
+ # Core::ProcessDiscovery._native_close_tracer_memfd(@process_discovery_fd, @logger) if @process_discovery_fd
216
+ end
217
+
218
+ # Returns the current state of various components.
219
+ def state
220
+ ComponentsState.new(
221
+ telemetry_enabled: telemetry.enabled,
222
+ remote_started: remote&.started?,
223
+ )
180
224
  end
181
225
  end
182
226
  end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Datadog
4
+ module Core
5
+ module Configuration
6
+ # Stores the state of component tree when replacing the tree.
7
+ class ComponentsState
8
+ def initialize(telemetry_enabled:, remote_started:)
9
+ @telemetry_enabled = !!telemetry_enabled
10
+ @remote_started = !!remote_started
11
+ end
12
+
13
+ def telemetry_enabled?
14
+ @telemetry_enabled
15
+ end
16
+
17
+ def remote_started?
18
+ @remote_started
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end