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
@@ -18,6 +18,10 @@ module Datadog
18
18
  ENV_DEFAULT_PORT = 'DD_METRIC_AGENT_PORT'
19
19
  end
20
20
 
21
+ module APM
22
+ ENV_TRACING_ENABLED = 'DD_APM_TRACING_ENABLED'
23
+ end
24
+
21
25
  module Agent
22
26
  ENV_DEFAULT_HOST = 'DD_AGENT_HOST'
23
27
  # Some env vars have "trace" in them, but they apply to all products
@@ -37,7 +41,7 @@ module Datadog
37
41
  module UnixSocket
38
42
  ADAPTER = :unix
39
43
  DEFAULT_PATH = '/var/run/datadog/apm.socket'
40
- DEFAULT_TIMEOUT_SECONDS = 1
44
+ DEFAULT_TIMEOUT_SECONDS = 30
41
45
  end
42
46
  end
43
47
  end
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative 'stable_config'
3
4
  require_relative '../utils/safe_dup'
4
5
 
5
6
  module Datadog
@@ -32,17 +33,25 @@ module Datadog
32
33
  end
33
34
 
34
35
  # Remote configuration provided through the Datadog app.
35
- REMOTE_CONFIGURATION = Value.new(2, :remote_configuration).freeze
36
+ REMOTE_CONFIGURATION = Value.new(5, :remote_configuration).freeze
36
37
 
37
38
  # Configuration provided in Ruby code, in this same process
38
- # or via Environment variable
39
- PROGRAMMATIC = Value.new(1, :programmatic).freeze
39
+ PROGRAMMATIC = Value.new(4, :programmatic).freeze
40
+
41
+ # Configuration provided by fleet managed stable config
42
+ FLEET_STABLE = Value.new(3, :fleet_stable).freeze
43
+
44
+ # Configuration provided via environment variable
45
+ ENVIRONMENT = Value.new(2, :environment).freeze
46
+
47
+ # Configuration provided by local stable config file
48
+ LOCAL_STABLE = Value.new(1, :local_stable).freeze
40
49
 
41
50
  # Configuration that comes from default values
42
51
  DEFAULT = Value.new(0, :default).freeze
43
52
 
44
53
  # All precedences, sorted from highest to lowest
45
- LIST = [REMOTE_CONFIGURATION, PROGRAMMATIC, DEFAULT].sort.reverse.freeze
54
+ LIST = [REMOTE_CONFIGURATION, PROGRAMMATIC, FLEET_STABLE, ENVIRONMENT, LOCAL_STABLE, DEFAULT].sort.reverse.freeze
46
55
  end
47
56
 
48
57
  def initialize(definition, context)
@@ -118,23 +127,29 @@ module Datadog
118
127
  end
119
128
 
120
129
  def get
121
- if @is_set
122
- @value
123
- else
124
- set_value_from_env_or_default
130
+ unless @is_set
131
+ # Ensures that both the default value and the environment value are set.
132
+ # This approach handles scenarios where an environment value is unset
133
+ # by falling back to the default value consistently.
134
+ set_default_value
135
+ set_customer_stable_config_value
136
+ set_env_value
137
+ set_fleet_stable_config_value
125
138
  end
139
+
140
+ @value
126
141
  end
127
142
 
128
143
  def reset
129
144
  @value = if definition.resetter
130
- # Don't change @is_set to false; custom resetters are
131
- # responsible for changing @value back to a good state.
132
- # Setting @is_set = false would cause a default to be applied.
133
- context_exec(@value, &definition.resetter)
134
- else
135
- @is_set = false
136
- nil
137
- end
145
+ # Don't change @is_set to false; custom resetters are
146
+ # responsible for changing @value back to a good state.
147
+ # Setting @is_set = false would cause a default to be applied.
148
+ context_exec(@value, &definition.resetter)
149
+ else
150
+ @is_set = false
151
+ nil
152
+ end
138
153
 
139
154
  # Reset back to the lowest precedence, to allow all `set`s to succeed right after a reset.
140
155
  @precedence_set = Precedence::DEFAULT
@@ -192,7 +207,7 @@ module Datadog
192
207
  when :bool
193
208
  string_value = value.strip
194
209
  string_value = string_value.downcase
195
- string_value == 'true' || string_value == '1' # rubocop:disable Style/MultipleComparison
210
+ string_value == 'true' || string_value == '1'
196
211
  when :string, NilClass
197
212
  value
198
213
  else
@@ -212,20 +227,20 @@ module Datadog
212
227
 
213
228
  unless valid_type
214
229
  raise_error = if @definition.type_options[:nilable]
215
- !value.is_a?(NilClass)
216
- else
217
- true
218
- end
230
+ !value.is_a?(NilClass)
231
+ else
232
+ true
233
+ end
219
234
  end
220
235
 
221
236
  if raise_error
222
237
  error_msg = if @definition.type_options[:nilable]
223
- "The setting `#{@definition.name}` inside your app's `Datadog.configure` block expects a "\
224
- "#{@definition.type} or `nil`, but a `#{value.class}` was provided (#{value.inspect})."\
225
- else
226
- "The setting `#{@definition.name}` inside your app's `Datadog.configure` block expects a "\
227
- "#{@definition.type}, but a `#{value.class}` was provided (#{value.inspect})."\
228
- end
238
+ "The setting `#{@definition.name}` inside your app's `Datadog.configure` block expects a " \
239
+ "#{@definition.type} or `nil`, but a `#{value.class}` was provided (#{value.inspect})." \
240
+ else
241
+ "The setting `#{@definition.name}` inside your app's `Datadog.configure` block expects a " \
242
+ "#{@definition.type}, but a `#{value.class}` was provided (#{value.inspect})." \
243
+ end
229
244
 
230
245
  error_msg = "#{error_msg} Please update your `configure` block. "
231
246
 
@@ -256,7 +271,8 @@ module Datadog
256
271
  when NilClass
257
272
  true # No validation is performed when option is typeless
258
273
  else
259
- raise ArgumentError, "The option #{@definition.name} is using an unsupported type option `#{@definition.type}`"
274
+ raise InvalidDefinitionError,
275
+ "The option #{@definition.name} is using an unsupported type option `#{@definition.type}`"
260
276
  end
261
277
  end
262
278
 
@@ -269,7 +285,7 @@ module Datadog
269
285
  @resolved_env = resolved_env
270
286
  # Store original value to ensure we can always safely call `#internal_set`
271
287
  # when restoring a value from `@value_per_precedence`, and we are only running `definition.setter`
272
- # on the original value, not on a valud that has already been processed by `definition.setter`.
288
+ # on the original value, not on a value that has already been processed by `definition.setter`.
273
289
  @value_per_precedence[precedence] = value
274
290
  context_exec(v, old_value, precedence, &definition.after_set) if definition.after_set
275
291
  end
@@ -283,39 +299,59 @@ module Datadog
283
299
  @context.instance_eval(&block)
284
300
  end
285
301
 
286
- def set_value_from_env_or_default
302
+ def set_default_value
303
+ set(default_value, precedence: Precedence::DEFAULT)
304
+ end
305
+
306
+ def set_env_value
307
+ value, resolved_env = get_value_and_resolved_env_from(ENV)
308
+ set(value, precedence: Precedence::ENVIRONMENT, resolved_env: resolved_env) unless value.nil?
309
+ end
310
+
311
+ def set_customer_stable_config_value
312
+ customer_config = StableConfig.configuration[:local]
313
+ return if customer_config.nil?
314
+
315
+ value, resolved_env = get_value_and_resolved_env_from(customer_config, source: 'local stable config')
316
+ set(value, precedence: Precedence::LOCAL_STABLE, resolved_env: resolved_env) unless value.nil?
317
+ end
318
+
319
+ def set_fleet_stable_config_value
320
+ fleet_config = StableConfig.configuration[:fleet]
321
+ return if fleet_config.nil?
322
+
323
+ value, resolved_env = get_value_and_resolved_env_from(fleet_config, source: 'fleet stable config')
324
+ set(value, precedence: Precedence::FLEET_STABLE, resolved_env: resolved_env) unless value.nil?
325
+ end
326
+
327
+ def get_value_and_resolved_env_from(env_vars, source: 'environment variable')
287
328
  value = nil
288
- precedence = nil
289
329
  resolved_env = nil
290
330
 
291
331
  if definition.env
292
332
  Array(definition.env).each do |env|
293
- next if ENV[env].nil?
333
+ next if env_vars[env].nil?
294
334
 
295
335
  resolved_env = env
296
- value = coerce_env_variable(ENV[env])
297
- precedence = Precedence::PROGRAMMATIC
336
+ value = coerce_env_variable(env_vars[env])
298
337
  break
299
338
  end
300
339
  end
301
340
 
302
- if value.nil? && definition.deprecated_env && ENV[definition.deprecated_env]
341
+ if value.nil? && definition.deprecated_env && env_vars[definition.deprecated_env]
303
342
  resolved_env = definition.deprecated_env
304
- value = coerce_env_variable(ENV[definition.deprecated_env])
305
- precedence = Precedence::PROGRAMMATIC
343
+ value = coerce_env_variable(env_vars[definition.deprecated_env])
306
344
 
307
345
  Datadog::Core.log_deprecation do
308
- "#{definition.deprecated_env} environment variable is deprecated, use #{definition.env} instead."
346
+ "#{definition.deprecated_env} #{source} is deprecated, use #{definition.env} instead."
309
347
  end
310
348
  end
311
349
 
312
- option_value = value.nil? ? default_value : value
313
-
314
- set(option_value, precedence: precedence || Precedence::DEFAULT, resolved_env: resolved_env)
350
+ [value, resolved_env]
315
351
  rescue ArgumentError
316
352
  raise ArgumentError,
317
- "Expected environment variable #{resolved_env} to be a #{@definition.type}, " \
318
- "but '#{ENV[resolved_env]}' was provided"
353
+ "Expected #{source} #{resolved_env} to be a #{@definition.type}, " \
354
+ "but '#{env_vars[resolved_env]}' was provided"
319
355
  end
320
356
 
321
357
  # Anchor object that represents a value that is not set.
@@ -71,14 +71,16 @@ module Datadog
71
71
  validate_options!
72
72
  end
73
73
 
74
- def env(value)
74
+ def env(value) # standard:disable Style/TrivialAccessors
75
75
  @env = value
76
76
  end
77
77
 
78
- def deprecated_env(value)
78
+ def deprecated_env(value) # standard:disable Style/TrivialAccessors
79
79
  @deprecated_env = value
80
80
  end
81
81
 
82
+ # Invoked when the option is first read, and {#env} is defined.
83
+ # The block provided is only invoked if the environment variable is present (not-nil).
82
84
  def env_parser(&block)
83
85
  @env_parser = block
84
86
  end
@@ -109,7 +111,7 @@ module Datadog
109
111
 
110
112
  def type(value, nilable: false)
111
113
  @type = value
112
- @type_options = { nilable: nilable }
114
+ @type_options = {nilable: nilable}
113
115
 
114
116
  value
115
117
  end
@@ -154,7 +156,7 @@ module Datadog
154
156
  if !@default.nil? && @default_proc
155
157
  raise InvalidOptionError,
156
158
  'Using `default` and `default_proc` is not allowed. Please use one or the other.' \
157
- 'If you want to store a block as the default value use `default_proc`'\
159
+ 'If you want to store a block as the default value use `default_proc`' \
158
160
  ' otherwise use `default`'
159
161
  end
160
162
  end
@@ -18,7 +18,7 @@ module Datadog
18
18
  module ClassMethods
19
19
  def options
20
20
  # Allows for class inheritance of option definitions
21
- @options ||= superclass <= Options ? superclass.options.dup : {}
21
+ @options ||= (superclass <= Options) ? superclass.options.dup : {}
22
22
  end
23
23
 
24
24
  protected
@@ -45,7 +45,7 @@ module Datadog
45
45
  option_name.to_sym => proc do
46
46
  get_option(option_name)
47
47
  end,
48
- "#{option_name}=".to_sym => proc do |value|
48
+ :"#{option_name}=" => proc do |value|
49
49
  set_option(option_name, value)
50
50
  end
51
51
  }
@@ -117,7 +117,7 @@ module Datadog
117
117
  end
118
118
 
119
119
  def resolved_env(name)
120
- return options[name].resolved_env if options.key?(name)
120
+ options[name].resolved_env if options.key?(name)
121
121
  end
122
122
 
123
123
  def assert_valid_option!(name)
@@ -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
 
@@ -454,22 +454,38 @@ module Datadog
454
454
  o.after_set do |_, _, precedence|
455
455
  unless precedence == Datadog::Core::Configuration::Option::Precedence::DEFAULT
456
456
  Core.log_deprecation(key: :experimental_crash_tracking_enabled) do
457
- 'The profiling.advanced.experimental_crash_tracking_enabled setting has been deprecated for removal '\
457
+ 'The profiling.advanced.experimental_crash_tracking_enabled setting has been deprecated for removal ' \
458
458
  'and no longer does anything. Please remove it from your Datadog.configure block.'
459
459
  end
460
460
  end
461
461
  end
462
462
  end
463
463
 
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`
464
+ # @deprecated Use {:gvl_enabled} instead.
469
465
  option :preview_gvl_enabled do |o|
470
466
  o.type :bool
471
- o.env 'DD_PROFILING_PREVIEW_GVL_ENABLED'
472
467
  o.default false
468
+ o.after_set do |_, _, precedence|
469
+ unless precedence == Datadog::Core::Configuration::Option::Precedence::DEFAULT
470
+ Datadog.logger.warn(
471
+ 'The profiling.advanced.preview_gvl_enabled setting has been deprecated for removal and ' \
472
+ 'no longer does anything. Please remove it from your Datadog.configure block. ' \
473
+ 'GVL profiling is now controlled by the profiling.advanced.gvl_enabled setting instead.'
474
+ )
475
+ end
476
+ end
477
+ end
478
+
479
+ # Controls GVL profiling. This will show when threads are waiting for GVL in the timeline view.
480
+ #
481
+ # This feature requires Ruby 3.2+.
482
+ #
483
+ # @default `DD_PROFILING_GVL_ENABLED` environment variable as a boolean, otherwise `true`
484
+ option :gvl_enabled do |o|
485
+ o.type :bool
486
+ o.deprecated_env 'DD_PROFILING_PREVIEW_GVL_ENABLED'
487
+ o.env 'DD_PROFILING_GVL_ENABLED'
488
+ o.default true
473
489
  end
474
490
 
475
491
  # Controls the smallest time period the profiler will report a thread waiting for the GVL.
@@ -554,6 +570,12 @@ module Datadog
554
570
  o.type :bool
555
571
  end
556
572
 
573
+ option :experimental_runtime_id_enabled do |o|
574
+ o.type :bool
575
+ o.env 'DD_TRACE_EXPERIMENTAL_RUNTIME_ID_ENABLED'
576
+ o.default false
577
+ end
578
+
557
579
  option :opts, default: {}, type: :hash
558
580
  option :statsd
559
581
  end
@@ -603,38 +625,31 @@ module Datadog
603
625
  o.type :hash, nilable: true
604
626
  o.env [Core::Environment::Ext::ENV_TAGS, Core::Environment::Ext::ENV_OTEL_RESOURCE_ATTRIBUTES]
605
627
  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
628
+ # Parses a string containing key-value pairs and returns a hash.
629
+ # Key-value pairs are delimited by ':' OR `=`, and pairs are separated by whitespace, comma, OR BOTH.
630
+ result = {}
631
+ unless env_value.nil? || env_value.empty?
632
+ # falling back to comma as separator
633
+ sep = env_value.include?(',') ? ',' : ' '
634
+ # split by separator
635
+ env_value.split(sep).each do |tag|
636
+ tag.strip!
637
+ next if tag.empty?
638
+
639
+ # tag by : or = (for OpenTelemetry)
640
+ key, val = tag.split(/[:=]/, 2).map(&:strip)
641
+ val ||= ''
642
+ # maps OpenTelemetry semantic attributes to Datadog tags
643
+ key = case key.downcase
644
+ when 'deployment.environment' then 'env'
645
+ when 'service.version' then 'version'
646
+ when 'service.name' then 'service'
647
+ else key
648
+ end
649
+ result[key] = val unless key.empty?
636
650
  end
637
651
  end
652
+ result
638
653
  end
639
654
  o.setter do |new_value, old_value|
640
655
  raw_tags = new_value || {}
@@ -863,6 +878,26 @@ module Datadog
863
878
  o.type :float
864
879
  o.default 1.0
865
880
  end
881
+
882
+ # Enable log collection for telemetry. Log collection only works when telemetry is enabled and
883
+ # logs are enabled.
884
+ # @default `DD_TELEMETRY_LOG_COLLECTION_ENABLED` environment variable, otherwise `true`.
885
+ # @return [Boolean]
886
+ option :log_collection_enabled do |o|
887
+ o.type :bool
888
+ o.env Core::Telemetry::Ext::ENV_LOG_COLLECTION
889
+ o.default true
890
+ end
891
+
892
+ # For internal use only.
893
+ # Enables telemetry debugging through the Datadog platform.
894
+ #
895
+ # @default `false`.
896
+ # @return [Boolean]
897
+ option :debug do |o|
898
+ o.type :bool
899
+ o.default false
900
+ end
866
901
  end
867
902
 
868
903
  # Remote configuration
@@ -932,11 +967,35 @@ module Datadog
932
967
  end
933
968
  end
934
969
 
970
+ # Tracer specific configuration starting with APM (e.g. DD_APM_TRACING_ENABLED).
971
+ # @public_api
972
+ settings :apm do
973
+ # Tracing as a transport
974
+ # @public_api
975
+ settings :tracing do
976
+ # Enables tracing as transport.
977
+ # Disabling it will set sampling priority to -1 (FORCE_DROP) on most traces,
978
+ # (which tells to the agent to drop these traces)
979
+ # except heartbeat ones (1 per minute) and manually kept ones (sampling priority to 2) (e.g. appsec events)
980
+ #
981
+ # This is different than `DD_TRACE_ENABLED`, which completely disables tracing (sends no trace at all),
982
+ # while this will send heartbeat traces (1 per minute) so that the service is considered alive in the backend.
983
+ #
984
+ # @default `DD_APM_TRACING_ENABLED` environment variable, otherwise `true`
985
+ # @return [Boolean]
986
+ option :enabled do |o|
987
+ o.env Configuration::Ext::APM::ENV_TRACING_ENABLED
988
+ o.default true
989
+ o.type :bool
990
+ end
991
+ end
992
+ end
993
+
935
994
  # TODO: Tracing should manage its own settings.
936
995
  # Keep this extension here for now to keep things working.
937
996
  extend Datadog::Tracing::Configuration::Settings
938
997
  end
939
- # rubocop:enable Metrics/BlockLength
998
+ # standard:enable Metrics/BlockLength
940
999
  end
941
1000
  end
942
1001
  end
@@ -0,0 +1,23 @@
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 # TODO: After libdatadog 17.1 release, uncomment this line
18
+ @configuration ||= {} # TODO: After libdatadog 17.1 release, delete this line
19
+ end
20
+ end
21
+ end
22
+ end
23
+ 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