ddtrace 1.12.1 → 1.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (448) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +388 -10
  3. data/ext/ddtrace_profiling_native_extension/NativeExtensionDesign.md +3 -5
  4. data/ext/ddtrace_profiling_native_extension/clock_id.h +0 -3
  5. data/ext/ddtrace_profiling_native_extension/clock_id_from_pthread.c +3 -22
  6. data/ext/ddtrace_profiling_native_extension/clock_id_noop.c +0 -1
  7. data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +41 -6
  8. data/ext/ddtrace_profiling_native_extension/collectors_idle_sampling_helper.c +3 -0
  9. data/ext/ddtrace_profiling_native_extension/collectors_stack.c +76 -24
  10. data/ext/ddtrace_profiling_native_extension/collectors_stack.h +1 -1
  11. data/ext/ddtrace_profiling_native_extension/collectors_thread_context.c +292 -27
  12. data/ext/ddtrace_profiling_native_extension/collectors_thread_context.h +1 -1
  13. data/ext/ddtrace_profiling_native_extension/extconf.rb +40 -10
  14. data/ext/ddtrace_profiling_native_extension/http_transport.c +48 -16
  15. data/ext/ddtrace_profiling_native_extension/libdatadog_helpers.c +42 -0
  16. data/ext/ddtrace_profiling_native_extension/libdatadog_helpers.h +6 -0
  17. data/ext/ddtrace_profiling_native_extension/native_extension_helpers.rb +1 -1
  18. data/ext/ddtrace_profiling_native_extension/pid_controller.c +57 -0
  19. data/ext/ddtrace_profiling_native_extension/pid_controller.h +45 -0
  20. data/ext/ddtrace_profiling_native_extension/private_vm_api_access.c +136 -32
  21. data/ext/ddtrace_profiling_native_extension/private_vm_api_access.h +12 -0
  22. data/ext/ddtrace_profiling_native_extension/profiling.c +1 -2
  23. data/ext/ddtrace_profiling_native_extension/stack_recorder.c +81 -50
  24. data/ext/ddtrace_profiling_native_extension/stack_recorder.h +13 -3
  25. data/ext/ddtrace_profiling_native_extension/time_helpers.c +40 -4
  26. data/ext/ddtrace_profiling_native_extension/time_helpers.h +14 -0
  27. data/lib/datadog/appsec/assets/waf_rules/processors.json +92 -0
  28. data/lib/datadog/appsec/assets/waf_rules/recommended.json +698 -75
  29. data/lib/datadog/appsec/assets/waf_rules/scanners.json +114 -0
  30. data/lib/datadog/appsec/assets/waf_rules/strict.json +98 -8
  31. data/lib/datadog/appsec/assets.rb +8 -0
  32. data/lib/datadog/appsec/component.rb +21 -2
  33. data/lib/datadog/appsec/configuration/settings.rb +167 -189
  34. data/lib/datadog/appsec/configuration.rb +0 -79
  35. data/lib/datadog/appsec/contrib/auto_instrument.rb +2 -4
  36. data/lib/datadog/appsec/contrib/devise/event.rb +57 -0
  37. data/lib/datadog/appsec/contrib/devise/ext.rb +13 -0
  38. data/lib/datadog/appsec/contrib/devise/integration.rb +42 -0
  39. data/lib/datadog/appsec/contrib/devise/patcher/authenticatable_patch.rb +76 -0
  40. data/lib/datadog/appsec/contrib/devise/patcher/registration_controller_patch.rb +54 -0
  41. data/lib/datadog/appsec/contrib/devise/patcher.rb +45 -0
  42. data/lib/datadog/appsec/contrib/devise/resource.rb +35 -0
  43. data/lib/datadog/appsec/contrib/devise/tracking.rb +49 -0
  44. data/lib/datadog/appsec/contrib/rack/ext.rb +2 -1
  45. data/lib/datadog/appsec/contrib/rack/gateway/request.rb +6 -2
  46. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +8 -6
  47. data/lib/datadog/appsec/contrib/rack/reactive/request.rb +3 -8
  48. data/lib/datadog/appsec/contrib/rack/reactive/request_body.rb +3 -6
  49. data/lib/datadog/appsec/contrib/rack/reactive/response.rb +3 -6
  50. data/lib/datadog/appsec/contrib/rack/request_body_middleware.rb +3 -2
  51. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +36 -17
  52. data/lib/datadog/appsec/contrib/rails/ext.rb +3 -2
  53. data/lib/datadog/appsec/contrib/rails/framework.rb +1 -3
  54. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +3 -2
  55. data/lib/datadog/appsec/contrib/rails/patcher.rb +17 -11
  56. data/lib/datadog/appsec/contrib/rails/reactive/action.rb +3 -6
  57. data/lib/datadog/appsec/contrib/sinatra/ext.rb +2 -1
  58. data/lib/datadog/appsec/contrib/sinatra/framework.rb +1 -3
  59. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +6 -4
  60. data/lib/datadog/appsec/contrib/sinatra/patcher.rb +13 -7
  61. data/lib/datadog/appsec/contrib/sinatra/reactive/routed.rb +3 -6
  62. data/lib/datadog/appsec/event.rb +106 -50
  63. data/lib/datadog/appsec/extensions.rb +1 -130
  64. data/lib/datadog/appsec/monitor/gateway/watcher.rb +3 -3
  65. data/lib/datadog/appsec/monitor/reactive/set_user.rb +3 -6
  66. data/lib/datadog/appsec/processor/actions.rb +49 -0
  67. data/lib/datadog/appsec/processor/rule_loader.rb +60 -0
  68. data/lib/datadog/appsec/processor/rule_merger.rb +22 -2
  69. data/lib/datadog/appsec/processor.rb +35 -7
  70. data/lib/datadog/appsec/rate_limiter.rb +1 -1
  71. data/lib/datadog/appsec/remote.rb +17 -11
  72. data/lib/datadog/appsec/response.rb +82 -4
  73. data/lib/datadog/appsec/sample_rate.rb +21 -0
  74. data/lib/datadog/appsec.rb +3 -4
  75. data/lib/datadog/core/backport.rb +51 -0
  76. data/lib/datadog/core/configuration/agent_settings_resolver.rb +38 -29
  77. data/lib/datadog/core/configuration/base.rb +6 -16
  78. data/lib/datadog/core/configuration/components.rb +15 -3
  79. data/lib/datadog/core/configuration/ext.rb +28 -5
  80. data/lib/datadog/core/configuration/option.rb +269 -21
  81. data/lib/datadog/core/configuration/option_definition.rb +73 -32
  82. data/lib/datadog/core/configuration/options.rb +27 -15
  83. data/lib/datadog/core/configuration/settings.rb +182 -102
  84. data/lib/datadog/core/configuration.rb +4 -0
  85. data/lib/datadog/core/diagnostics/environment_logger.rb +130 -234
  86. data/lib/datadog/core/environment/execution.rb +103 -0
  87. data/lib/datadog/core/environment/ext.rb +13 -11
  88. data/lib/datadog/core/environment/variable_helpers.rb +0 -69
  89. data/lib/datadog/core/environment/yjit.rb +58 -0
  90. data/lib/datadog/core/error.rb +1 -0
  91. data/lib/datadog/core/git/ext.rb +26 -22
  92. data/lib/datadog/core/logging/ext.rb +3 -1
  93. data/lib/datadog/core/metrics/ext.rb +7 -5
  94. data/lib/datadog/core/remote/client/capabilities.rb +6 -1
  95. data/lib/datadog/core/remote/client.rb +3 -0
  96. data/lib/datadog/core/remote/component.rb +27 -36
  97. data/lib/datadog/core/remote/configuration/content.rb +28 -1
  98. data/lib/datadog/core/remote/configuration/repository.rb +3 -1
  99. data/lib/datadog/core/remote/ext.rb +1 -1
  100. data/lib/datadog/core/remote/negotiation.rb +19 -6
  101. data/lib/datadog/core/remote/transport/config.rb +60 -0
  102. data/lib/datadog/core/remote/transport/http/api/instance.rb +39 -0
  103. data/lib/datadog/core/remote/transport/http/api/spec.rb +21 -0
  104. data/lib/datadog/core/remote/transport/http/api.rb +58 -0
  105. data/lib/datadog/core/remote/transport/http/builder.rb +219 -0
  106. data/lib/datadog/core/remote/transport/http/client.rb +48 -0
  107. data/lib/datadog/core/remote/transport/http/config.rb +280 -0
  108. data/lib/datadog/core/remote/transport/http/negotiation.rb +146 -0
  109. data/lib/datadog/core/remote/transport/http.rb +179 -0
  110. data/lib/datadog/core/{transport → remote/transport}/negotiation.rb +25 -23
  111. data/lib/datadog/core/remote/worker.rb +4 -1
  112. data/lib/datadog/core/runtime/ext.rb +22 -12
  113. data/lib/datadog/core/runtime/metrics.rb +43 -0
  114. data/lib/datadog/core/telemetry/client.rb +12 -2
  115. data/lib/datadog/core/telemetry/collector.rb +13 -4
  116. data/lib/datadog/core/telemetry/emitter.rb +4 -2
  117. data/lib/datadog/core/telemetry/event.rb +19 -4
  118. data/lib/datadog/core/telemetry/ext.rb +4 -1
  119. data/lib/datadog/core/telemetry/heartbeat.rb +2 -4
  120. data/lib/datadog/core/telemetry/http/ext.rb +10 -8
  121. data/lib/datadog/core/telemetry/http/transport.rb +2 -0
  122. data/lib/datadog/core/telemetry/v2/app_client_configuration_change.rb +41 -0
  123. data/lib/datadog/core/telemetry/v2/request.rb +29 -0
  124. data/lib/datadog/core/transport/ext.rb +47 -0
  125. data/lib/datadog/core/transport/http/adapters/net.rb +168 -0
  126. data/lib/datadog/core/transport/http/adapters/registry.rb +29 -0
  127. data/lib/datadog/core/transport/http/adapters/test.rb +89 -0
  128. data/lib/datadog/core/transport/http/adapters/unix_socket.rb +83 -0
  129. data/lib/datadog/core/transport/http/api/endpoint.rb +31 -0
  130. data/lib/datadog/core/transport/http/api/fallbacks.rb +26 -0
  131. data/lib/datadog/core/transport/http/api/map.rb +18 -0
  132. data/lib/datadog/core/transport/http/env.rb +62 -0
  133. data/lib/datadog/core/transport/http/response.rb +60 -0
  134. data/lib/datadog/core/transport/parcel.rb +22 -0
  135. data/lib/datadog/core/transport/request.rb +17 -0
  136. data/lib/datadog/core/transport/response.rb +64 -0
  137. data/lib/datadog/core/utils/duration.rb +52 -0
  138. data/lib/datadog/core/utils/hash.rb +47 -0
  139. data/lib/datadog/core/utils/network.rb +1 -1
  140. data/lib/datadog/core/utils/safe_dup.rb +27 -20
  141. data/lib/datadog/core/utils.rb +1 -1
  142. data/lib/datadog/core/workers/async.rb +3 -2
  143. data/lib/datadog/core/workers/polling.rb +2 -2
  144. data/lib/datadog/kit/appsec/events.rb +139 -89
  145. data/lib/datadog/kit/enable_core_dumps.rb +5 -6
  146. data/lib/datadog/kit/identity.rb +80 -65
  147. data/lib/datadog/opentelemetry/api/context.rb +10 -3
  148. data/lib/datadog/opentelemetry/sdk/propagator.rb +2 -1
  149. data/lib/datadog/opentelemetry/sdk/span_processor.rb +48 -5
  150. data/lib/datadog/opentelemetry/sdk/trace/span.rb +167 -0
  151. data/lib/datadog/opentelemetry/trace.rb +58 -0
  152. data/lib/datadog/opentelemetry.rb +1 -0
  153. data/lib/datadog/opentracer/text_map_propagator.rb +2 -1
  154. data/lib/datadog/opentracer.rb +9 -0
  155. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +16 -17
  156. data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +3 -1
  157. data/lib/datadog/profiling/collectors/thread_context.rb +17 -2
  158. data/lib/datadog/profiling/component.rb +69 -94
  159. data/lib/datadog/profiling/diagnostics/environment_logger.rb +39 -0
  160. data/lib/datadog/profiling/exporter.rb +5 -1
  161. data/lib/datadog/profiling/ext.rb +0 -12
  162. data/lib/datadog/profiling/flush.rb +7 -5
  163. data/lib/datadog/profiling/http_transport.rb +19 -6
  164. data/lib/datadog/profiling/load_native_extension.rb +7 -1
  165. data/lib/datadog/profiling/native_extension.rb +0 -21
  166. data/lib/datadog/profiling/profiler.rb +36 -13
  167. data/lib/datadog/profiling/scheduler.rb +16 -9
  168. data/lib/datadog/profiling.rb +16 -78
  169. data/lib/datadog/tracing/component.rb +70 -11
  170. data/lib/datadog/tracing/configuration/agent_settings_resolver.rb +13 -0
  171. data/lib/datadog/tracing/configuration/dynamic/option.rb +71 -0
  172. data/lib/datadog/tracing/configuration/dynamic.rb +64 -0
  173. data/lib/datadog/tracing/configuration/ext.rb +40 -32
  174. data/lib/datadog/tracing/configuration/http.rb +74 -0
  175. data/lib/datadog/tracing/configuration/settings.rb +134 -98
  176. data/lib/datadog/tracing/contrib/action_cable/configuration/settings.rb +9 -6
  177. data/lib/datadog/tracing/contrib/action_cable/ext.rb +20 -18
  178. data/lib/datadog/tracing/contrib/action_mailer/configuration/settings.rb +9 -6
  179. data/lib/datadog/tracing/contrib/action_mailer/ext.rb +20 -18
  180. data/lib/datadog/tracing/contrib/action_pack/configuration/settings.rb +9 -7
  181. data/lib/datadog/tracing/contrib/action_pack/ext.rb +10 -8
  182. data/lib/datadog/tracing/contrib/action_view/configuration/settings.rb +9 -6
  183. data/lib/datadog/tracing/contrib/action_view/ext.rb +12 -10
  184. data/lib/datadog/tracing/contrib/active_job/configuration/settings.rb +13 -7
  185. data/lib/datadog/tracing/contrib/active_job/ext.rb +25 -23
  186. data/lib/datadog/tracing/contrib/active_job/log_injection.rb +1 -1
  187. data/lib/datadog/tracing/contrib/active_job/patcher.rb +1 -1
  188. data/lib/datadog/tracing/contrib/active_model_serializers/configuration/settings.rb +9 -6
  189. data/lib/datadog/tracing/contrib/active_model_serializers/ext.rb +12 -10
  190. data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +18 -11
  191. data/lib/datadog/tracing/contrib/active_record/configuration/settings.rb +9 -7
  192. data/lib/datadog/tracing/contrib/active_record/events/sql.rb +2 -6
  193. data/lib/datadog/tracing/contrib/active_record/ext.rb +17 -15
  194. data/lib/datadog/tracing/contrib/active_record/utils.rb +1 -1
  195. data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +106 -202
  196. data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +3 -0
  197. data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +9 -7
  198. data/lib/datadog/tracing/contrib/active_support/ext.rb +18 -16
  199. data/lib/datadog/tracing/contrib/aws/configuration/settings.rb +14 -7
  200. data/lib/datadog/tracing/contrib/aws/ext.rb +37 -24
  201. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +16 -5
  202. data/lib/datadog/tracing/contrib/concurrent_ruby/configuration/settings.rb +3 -2
  203. data/lib/datadog/tracing/contrib/concurrent_ruby/context_composite_executor_service.rb +14 -14
  204. data/lib/datadog/tracing/contrib/concurrent_ruby/ext.rb +4 -2
  205. data/lib/datadog/tracing/contrib/concurrent_ruby/future_patch.rb +3 -10
  206. data/lib/datadog/tracing/contrib/concurrent_ruby/integration.rb +2 -1
  207. data/lib/datadog/tracing/contrib/concurrent_ruby/patcher.rb +8 -1
  208. data/lib/datadog/tracing/contrib/concurrent_ruby/promises_future_patch.rb +22 -0
  209. data/lib/datadog/tracing/contrib/configuration/settings.rb +1 -1
  210. data/lib/datadog/tracing/contrib/dalli/configuration/settings.rb +20 -7
  211. data/lib/datadog/tracing/contrib/dalli/ext.rb +26 -11
  212. data/lib/datadog/tracing/contrib/dalli/instrumentation.rb +17 -8
  213. data/lib/datadog/tracing/contrib/delayed_job/configuration/settings.rb +13 -7
  214. data/lib/datadog/tracing/contrib/delayed_job/ext.rb +16 -14
  215. data/lib/datadog/tracing/contrib/elasticsearch/configuration/settings.rb +14 -7
  216. data/lib/datadog/tracing/contrib/elasticsearch/ext.rb +21 -15
  217. data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +104 -99
  218. data/lib/datadog/tracing/contrib/ethon/configuration/settings.rb +16 -9
  219. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +48 -3
  220. data/lib/datadog/tracing/contrib/ethon/ext.rb +19 -11
  221. data/lib/datadog/tracing/contrib/ethon/multi_patch.rb +6 -3
  222. data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +19 -10
  223. data/lib/datadog/tracing/contrib/excon/ext.rb +16 -8
  224. data/lib/datadog/tracing/contrib/excon/middleware.rb +25 -5
  225. data/lib/datadog/tracing/contrib/ext.rb +26 -1
  226. data/lib/datadog/tracing/contrib/extensions.rb +32 -0
  227. data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +20 -10
  228. data/lib/datadog/tracing/contrib/faraday/ext.rb +16 -8
  229. data/lib/datadog/tracing/contrib/faraday/middleware.rb +21 -5
  230. data/lib/datadog/tracing/contrib/grape/configuration/settings.rb +8 -6
  231. data/lib/datadog/tracing/contrib/grape/ext.rb +16 -14
  232. data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +8 -6
  233. data/lib/datadog/tracing/contrib/graphql/ext.rb +7 -5
  234. data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +39 -9
  235. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +39 -20
  236. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +37 -18
  237. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor.rb +0 -4
  238. data/lib/datadog/tracing/contrib/grpc/ext.rb +16 -13
  239. data/lib/datadog/tracing/contrib/grpc/formatting.rb +127 -0
  240. data/lib/datadog/tracing/contrib/hanami/configuration/settings.rb +3 -2
  241. data/lib/datadog/tracing/contrib/hanami/ext.rb +10 -8
  242. data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +5 -8
  243. data/lib/datadog/tracing/contrib/http/configuration/settings.rb +33 -11
  244. data/lib/datadog/tracing/contrib/http/ext.rb +16 -9
  245. data/lib/datadog/tracing/contrib/http/instrumentation.rb +27 -7
  246. data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +33 -11
  247. data/lib/datadog/tracing/contrib/httpclient/ext.rb +17 -9
  248. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +22 -5
  249. data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +33 -11
  250. data/lib/datadog/tracing/contrib/httprb/ext.rb +16 -9
  251. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +22 -5
  252. data/lib/datadog/tracing/contrib/kafka/configuration/settings.rb +9 -6
  253. data/lib/datadog/tracing/contrib/kafka/ext.rb +42 -39
  254. data/lib/datadog/tracing/contrib/lograge/configuration/settings.rb +3 -2
  255. data/lib/datadog/tracing/contrib/lograge/ext.rb +3 -1
  256. data/lib/datadog/tracing/contrib/lograge/instrumentation.rb +2 -17
  257. data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +14 -7
  258. data/lib/datadog/tracing/contrib/mongodb/ext.rb +20 -16
  259. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +16 -5
  260. data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +17 -14
  261. data/lib/datadog/tracing/contrib/mysql2/ext.rb +15 -10
  262. data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +20 -6
  263. data/lib/datadog/tracing/contrib/opensearch/configuration/settings.rb +52 -0
  264. data/lib/datadog/tracing/contrib/opensearch/ext.rb +37 -0
  265. data/lib/datadog/tracing/contrib/opensearch/integration.rb +44 -0
  266. data/lib/datadog/tracing/contrib/opensearch/patcher.rb +135 -0
  267. data/lib/datadog/tracing/contrib/opensearch/quantize.rb +81 -0
  268. data/lib/datadog/tracing/contrib/pg/configuration/settings.rb +22 -14
  269. data/lib/datadog/tracing/contrib/pg/ext.rb +22 -19
  270. data/lib/datadog/tracing/contrib/pg/instrumentation.rb +38 -5
  271. data/lib/datadog/tracing/contrib/presto/configuration/settings.rb +14 -7
  272. data/lib/datadog/tracing/contrib/presto/ext.rb +25 -20
  273. data/lib/datadog/tracing/contrib/presto/instrumentation.rb +14 -5
  274. data/lib/datadog/tracing/contrib/propagation/sql_comment/ext.rb +12 -10
  275. data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +1 -1
  276. data/lib/datadog/tracing/contrib/qless/configuration/settings.rb +12 -8
  277. data/lib/datadog/tracing/contrib/qless/ext.rb +14 -12
  278. data/lib/datadog/tracing/contrib/que/configuration/settings.rb +21 -12
  279. data/lib/datadog/tracing/contrib/racecar/configuration/settings.rb +9 -7
  280. data/lib/datadog/tracing/contrib/racecar/event.rb +5 -5
  281. data/lib/datadog/tracing/contrib/racecar/ext.rb +20 -18
  282. data/lib/datadog/tracing/contrib/rack/configuration/settings.rb +16 -12
  283. data/lib/datadog/tracing/contrib/rack/ext.rb +18 -16
  284. data/lib/datadog/tracing/contrib/rack/header_collection.rb +3 -0
  285. data/lib/datadog/tracing/contrib/rack/header_tagging.rb +63 -0
  286. data/lib/datadog/tracing/contrib/rack/middlewares.rb +8 -49
  287. data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +19 -15
  288. data/lib/datadog/tracing/contrib/rails/ext.rb +7 -5
  289. data/lib/datadog/tracing/contrib/rails/log_injection.rb +7 -10
  290. data/lib/datadog/tracing/contrib/rails/patcher.rb +10 -41
  291. data/lib/datadog/tracing/contrib/rails/railtie.rb +3 -3
  292. data/lib/datadog/tracing/contrib/rake/configuration/settings.rb +13 -10
  293. data/lib/datadog/tracing/contrib/rake/ext.rb +14 -12
  294. data/lib/datadog/tracing/contrib/redis/configuration/settings.rb +17 -9
  295. data/lib/datadog/tracing/contrib/redis/ext.rb +22 -15
  296. data/lib/datadog/tracing/contrib/redis/instrumentation.rb +3 -38
  297. data/lib/datadog/tracing/contrib/redis/tags.rb +16 -7
  298. data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +46 -33
  299. data/lib/datadog/tracing/contrib/resque/configuration/settings.rb +13 -7
  300. data/lib/datadog/tracing/contrib/resque/ext.rb +9 -7
  301. data/lib/datadog/tracing/contrib/rest_client/configuration/settings.rb +16 -9
  302. data/lib/datadog/tracing/contrib/rest_client/ext.rb +15 -8
  303. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +25 -5
  304. data/lib/datadog/tracing/contrib/roda/configuration/settings.rb +9 -6
  305. data/lib/datadog/tracing/contrib/semantic_logger/configuration/settings.rb +3 -2
  306. data/lib/datadog/tracing/contrib/semantic_logger/ext.rb +3 -1
  307. data/lib/datadog/tracing/contrib/semantic_logger/instrumentation.rb +4 -20
  308. data/lib/datadog/tracing/contrib/sequel/configuration/settings.rb +9 -6
  309. data/lib/datadog/tracing/contrib/sequel/ext.rb +10 -8
  310. data/lib/datadog/tracing/contrib/sequel/utils.rb +7 -7
  311. data/lib/datadog/tracing/contrib/shoryuken/configuration/settings.rb +14 -8
  312. data/lib/datadog/tracing/contrib/shoryuken/ext.rb +14 -12
  313. data/lib/datadog/tracing/contrib/sidekiq/configuration/settings.rb +18 -11
  314. data/lib/datadog/tracing/contrib/sidekiq/ext.rb +32 -30
  315. data/lib/datadog/tracing/contrib/sinatra/configuration/settings.rb +11 -9
  316. data/lib/datadog/tracing/contrib/sinatra/env.rb +0 -17
  317. data/lib/datadog/tracing/contrib/sinatra/ext.rb +21 -19
  318. data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +3 -14
  319. data/lib/datadog/tracing/contrib/sneakers/configuration/settings.rb +14 -8
  320. data/lib/datadog/tracing/contrib/sneakers/ext.rb +1 -0
  321. data/lib/datadog/tracing/contrib/sneakers/tracer.rb +1 -1
  322. data/lib/datadog/tracing/contrib/span_attribute_schema.rb +74 -10
  323. data/lib/datadog/tracing/contrib/stripe/configuration/settings.rb +9 -6
  324. data/lib/datadog/tracing/contrib/sucker_punch/configuration/settings.rb +9 -6
  325. data/lib/datadog/tracing/contrib/sucker_punch/ext.rb +15 -13
  326. data/lib/datadog/tracing/contrib/utils/database.rb +5 -3
  327. data/lib/datadog/tracing/contrib/utils/quantization/http.rb +11 -11
  328. data/lib/datadog/tracing/contrib.rb +1 -0
  329. data/lib/datadog/tracing/correlation.rb +29 -12
  330. data/lib/datadog/tracing/diagnostics/environment_logger.rb +165 -0
  331. data/lib/datadog/tracing/diagnostics/ext.rb +21 -19
  332. data/lib/datadog/tracing/distributed/b3_multi.rb +2 -2
  333. data/lib/datadog/tracing/distributed/b3_single.rb +1 -1
  334. data/lib/datadog/tracing/distributed/datadog.rb +0 -1
  335. data/lib/datadog/tracing/distributed/propagation.rb +35 -34
  336. data/lib/datadog/tracing/distributed/trace_context.rb +52 -17
  337. data/lib/datadog/tracing/metadata/ext.rb +9 -6
  338. data/lib/datadog/tracing/metadata/tagging.rb +3 -3
  339. data/lib/datadog/tracing/remote.rb +78 -0
  340. data/lib/datadog/tracing/sampling/rule_sampler.rb +29 -0
  341. data/lib/datadog/tracing/span_operation.rb +3 -15
  342. data/lib/datadog/tracing/sync_writer.rb +3 -3
  343. data/lib/datadog/tracing/trace_digest.rb +31 -0
  344. data/lib/datadog/tracing/trace_operation.rb +16 -3
  345. data/lib/datadog/tracing/trace_segment.rb +5 -2
  346. data/lib/datadog/tracing/tracer.rb +12 -1
  347. data/lib/datadog/{core → tracing}/transport/http/api/instance.rb +1 -1
  348. data/lib/datadog/{core → tracing}/transport/http/api/spec.rb +1 -1
  349. data/lib/datadog/tracing/transport/http/api.rb +43 -0
  350. data/lib/datadog/{core → tracing}/transport/http/builder.rb +13 -68
  351. data/lib/datadog/tracing/transport/http/client.rb +57 -0
  352. data/lib/datadog/tracing/transport/http/statistics.rb +47 -0
  353. data/lib/datadog/tracing/transport/http/traces.rb +152 -0
  354. data/lib/datadog/tracing/transport/http.rb +124 -0
  355. data/lib/datadog/tracing/transport/io/client.rb +89 -0
  356. data/lib/datadog/tracing/transport/io/response.rb +27 -0
  357. data/lib/datadog/tracing/transport/io/traces.rb +101 -0
  358. data/lib/datadog/tracing/transport/io.rb +30 -0
  359. data/lib/datadog/tracing/transport/serializable_trace.rb +126 -0
  360. data/lib/datadog/tracing/transport/statistics.rb +77 -0
  361. data/lib/datadog/tracing/transport/trace_formatter.rb +209 -0
  362. data/lib/datadog/tracing/transport/traces.rb +224 -0
  363. data/lib/datadog/tracing/workers/trace_writer.rb +6 -4
  364. data/lib/datadog/tracing/workers.rb +4 -2
  365. data/lib/datadog/tracing/writer.rb +5 -2
  366. data/lib/ddtrace/transport/ext.rb +22 -14
  367. data/lib/ddtrace/version.rb +9 -12
  368. data/lib/ddtrace.rb +1 -1
  369. metadata +101 -93
  370. data/lib/datadog/ci/configuration/components.rb +0 -32
  371. data/lib/datadog/ci/configuration/settings.rb +0 -53
  372. data/lib/datadog/ci/contrib/cucumber/configuration/settings.rb +0 -33
  373. data/lib/datadog/ci/contrib/cucumber/ext.rb +0 -20
  374. data/lib/datadog/ci/contrib/cucumber/formatter.rb +0 -94
  375. data/lib/datadog/ci/contrib/cucumber/instrumentation.rb +0 -28
  376. data/lib/datadog/ci/contrib/cucumber/integration.rb +0 -47
  377. data/lib/datadog/ci/contrib/cucumber/patcher.rb +0 -27
  378. data/lib/datadog/ci/contrib/rspec/configuration/settings.rb +0 -33
  379. data/lib/datadog/ci/contrib/rspec/example.rb +0 -68
  380. data/lib/datadog/ci/contrib/rspec/ext.rb +0 -19
  381. data/lib/datadog/ci/contrib/rspec/integration.rb +0 -48
  382. data/lib/datadog/ci/contrib/rspec/patcher.rb +0 -27
  383. data/lib/datadog/ci/ext/app_types.rb +0 -9
  384. data/lib/datadog/ci/ext/environment.rb +0 -575
  385. data/lib/datadog/ci/ext/settings.rb +0 -10
  386. data/lib/datadog/ci/ext/test.rb +0 -35
  387. data/lib/datadog/ci/extensions.rb +0 -19
  388. data/lib/datadog/ci/flush.rb +0 -38
  389. data/lib/datadog/ci/test.rb +0 -81
  390. data/lib/datadog/ci.rb +0 -20
  391. data/lib/datadog/core/configuration/dependency_resolver.rb +0 -28
  392. data/lib/datadog/core/configuration/option_definition_set.rb +0 -22
  393. data/lib/datadog/core/configuration/option_set.rb +0 -10
  394. data/lib/datadog/core/transport/config.rb +0 -58
  395. data/lib/datadog/core/transport/http/api.rb +0 -57
  396. data/lib/datadog/core/transport/http/client.rb +0 -45
  397. data/lib/datadog/core/transport/http/config.rb +0 -268
  398. data/lib/datadog/core/transport/http/negotiation.rb +0 -144
  399. data/lib/datadog/core/transport/http.rb +0 -169
  400. data/lib/datadog/core/utils/object_set.rb +0 -43
  401. data/lib/datadog/core/utils/string_table.rb +0 -47
  402. data/lib/datadog/profiling/backtrace_location.rb +0 -34
  403. data/lib/datadog/profiling/buffer.rb +0 -43
  404. data/lib/datadog/profiling/collectors/old_stack.rb +0 -301
  405. data/lib/datadog/profiling/encoding/profile.rb +0 -41
  406. data/lib/datadog/profiling/event.rb +0 -15
  407. data/lib/datadog/profiling/events/stack.rb +0 -82
  408. data/lib/datadog/profiling/old_recorder.rb +0 -107
  409. data/lib/datadog/profiling/pprof/builder.rb +0 -125
  410. data/lib/datadog/profiling/pprof/converter.rb +0 -102
  411. data/lib/datadog/profiling/pprof/message_set.rb +0 -16
  412. data/lib/datadog/profiling/pprof/payload.rb +0 -20
  413. data/lib/datadog/profiling/pprof/pprof.proto +0 -212
  414. data/lib/datadog/profiling/pprof/pprof_pb.rb +0 -81
  415. data/lib/datadog/profiling/pprof/stack_sample.rb +0 -139
  416. data/lib/datadog/profiling/pprof/string_table.rb +0 -12
  417. data/lib/datadog/profiling/pprof/template.rb +0 -118
  418. data/lib/datadog/profiling/trace_identifiers/ddtrace.rb +0 -43
  419. data/lib/datadog/profiling/trace_identifiers/helper.rb +0 -45
  420. data/lib/datadog/tracing/contrib/sinatra/headers.rb +0 -35
  421. data/lib/ddtrace/transport/http/adapters/net.rb +0 -168
  422. data/lib/ddtrace/transport/http/adapters/registry.rb +0 -27
  423. data/lib/ddtrace/transport/http/adapters/test.rb +0 -85
  424. data/lib/ddtrace/transport/http/adapters/unix_socket.rb +0 -77
  425. data/lib/ddtrace/transport/http/api/endpoint.rb +0 -29
  426. data/lib/ddtrace/transport/http/api/fallbacks.rb +0 -24
  427. data/lib/ddtrace/transport/http/api/instance.rb +0 -35
  428. data/lib/ddtrace/transport/http/api/map.rb +0 -16
  429. data/lib/ddtrace/transport/http/api/spec.rb +0 -17
  430. data/lib/ddtrace/transport/http/api.rb +0 -39
  431. data/lib/ddtrace/transport/http/builder.rb +0 -176
  432. data/lib/ddtrace/transport/http/client.rb +0 -52
  433. data/lib/ddtrace/transport/http/env.rb +0 -58
  434. data/lib/ddtrace/transport/http/response.rb +0 -58
  435. data/lib/ddtrace/transport/http/statistics.rb +0 -43
  436. data/lib/ddtrace/transport/http/traces.rb +0 -144
  437. data/lib/ddtrace/transport/http.rb +0 -117
  438. data/lib/ddtrace/transport/io/client.rb +0 -85
  439. data/lib/ddtrace/transport/io/response.rb +0 -25
  440. data/lib/ddtrace/transport/io/traces.rb +0 -99
  441. data/lib/ddtrace/transport/io.rb +0 -28
  442. data/lib/ddtrace/transport/parcel.rb +0 -20
  443. data/lib/ddtrace/transport/request.rb +0 -15
  444. data/lib/ddtrace/transport/response.rb +0 -60
  445. data/lib/ddtrace/transport/serializable_trace.rb +0 -122
  446. data/lib/ddtrace/transport/statistics.rb +0 -75
  447. data/lib/ddtrace/transport/trace_formatter.rb +0 -198
  448. data/lib/ddtrace/transport/traces.rb +0 -216
@@ -1,6 +1,6 @@
1
- require_relative 'option_set'
1
+ # frozen_string_literal: true
2
+
2
3
  require_relative 'option_definition'
3
- require_relative 'option_definition_set'
4
4
 
5
5
  module Datadog
6
6
  module Core
@@ -18,13 +18,15 @@ 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 : OptionDefinitionSet.new
21
+ @options ||= superclass <= Options ? superclass.options.dup : {}
22
22
  end
23
23
 
24
24
  protected
25
25
 
26
26
  def option(name, meta = {}, &block)
27
- builder = OptionDefinition::Builder.new(name, meta, &block)
27
+ settings_name = defined?(@settings_name) && @settings_name
28
+ option_name = settings_name ? "#{settings_name}.#{name}" : name
29
+ builder = OptionDefinition::Builder.new(option_name, meta, &block)
28
30
  options[name] = builder.to_definition.tap do
29
31
  # Resolve and define helper functions
30
32
  helpers = default_helpers(name)
@@ -62,17 +64,19 @@ module Datadog
62
64
  # @public_api
63
65
  module InstanceMethods
64
66
  def options
65
- @options ||= OptionSet.new
67
+ @options ||= {}
68
+ end
69
+
70
+ def set_option(name, value, precedence: Configuration::Option::Precedence::PROGRAMMATIC)
71
+ resolve_option(name).set(value, precedence: precedence)
66
72
  end
67
73
 
68
- def set_option(name, value)
69
- add_option(name) unless options.key?(name)
70
- options[name].set(value)
74
+ def unset_option(name, precedence: Configuration::Option::Precedence::PROGRAMMATIC)
75
+ resolve_option(name).unset(precedence)
71
76
  end
72
77
 
73
78
  def get_option(name)
74
- add_option(name) unless options.key?(name)
75
- options[name].get
79
+ resolve_option(name).get
76
80
  end
77
81
 
78
82
  def reset_option(name)
@@ -84,6 +88,12 @@ module Datadog
84
88
  self.class.options.key?(name)
85
89
  end
86
90
 
91
+ # Is this option's value the default fallback value?
92
+ def using_default?(name)
93
+ get_option(name) # Resolve value check if environment variable overwrote the default
94
+ options[name].default_precedence?
95
+ end
96
+
87
97
  def options_hash
88
98
  self.class.options.merge(options).each_with_object({}) do |(key, _), hash|
89
99
  hash[key] = get_option(key)
@@ -91,17 +101,19 @@ module Datadog
91
101
  end
92
102
 
93
103
  def reset_options!
94
- options.values.each(&:reset)
104
+ options.each_value(&:reset)
95
105
  end
96
106
 
97
107
  private
98
108
 
99
- def add_option(name)
109
+ # Ensure option DSL is loaded
110
+ def resolve_option(name)
111
+ option = options[name]
112
+ return option if option
113
+
100
114
  assert_valid_option!(name)
101
115
  definition = self.class.options[name]
102
- definition.build(self).tap do |option|
103
- options[name] = option
104
- end
116
+ options[name] = definition.build(self)
105
117
  end
106
118
 
107
119
  def assert_valid_option!(name)
@@ -2,6 +2,7 @@ require 'logger'
2
2
 
3
3
  require_relative 'base'
4
4
  require_relative 'ext'
5
+ require_relative '../environment/execution'
5
6
  require_relative '../environment/ext'
6
7
  require_relative '../runtime/ext'
7
8
  require_relative '../telemetry/ext'
@@ -79,8 +80,8 @@ module Datadog
79
80
  # @default `DD_API_KEY` environment variable, otherwise `nil`
80
81
  # @return [String,nil]
81
82
  option :api_key do |o|
82
- o.default { ENV.fetch(Core::Environment::Ext::ENV_API_KEY, nil) }
83
- o.lazy
83
+ o.type :string, nilable: true
84
+ o.env Core::Environment::Ext::ENV_API_KEY
84
85
  end
85
86
 
86
87
  # Datadog diagnostic settings.
@@ -99,15 +100,15 @@ module Datadog
99
100
  # @default `DD_TRACE_DEBUG` environment variable, otherwise `false`
100
101
  # @return [Boolean]
101
102
  option :debug do |o|
102
- o.default { env_to_bool(Datadog::Core::Configuration::Ext::Diagnostics::ENV_DEBUG_ENABLED, false) }
103
- o.lazy
104
- o.on_set do |enabled|
103
+ o.env Datadog::Core::Configuration::Ext::Diagnostics::ENV_DEBUG_ENABLED
104
+ o.default false
105
+ o.type :bool
106
+ o.after_set do |enabled|
105
107
  # Enable rich debug print statements.
106
108
  # We do not need to unnecessarily load 'pp' unless in debugging mode.
107
109
  require 'pp' if enabled
108
110
  end
109
111
  end
110
-
111
112
  # Internal {Datadog::Statsd} metrics collection.
112
113
  #
113
114
  # @public_api
@@ -117,8 +118,9 @@ module Datadog
117
118
  # @default `DD_HEALTH_METRICS_ENABLED` environment variable, otherwise `false`
118
119
  # @return [Boolean]
119
120
  option :enabled do |o|
120
- o.default { env_to_bool(Datadog::Core::Configuration::Ext::Diagnostics::ENV_HEALTH_METRICS_ENABLED, false) }
121
- o.lazy
121
+ o.env Datadog::Core::Configuration::Ext::Diagnostics::ENV_HEALTH_METRICS_ENABLED
122
+ o.default false
123
+ o.type :bool
122
124
  end
123
125
 
124
126
  # {Datadog::Statsd} instance to collect health metrics.
@@ -140,11 +142,11 @@ module Datadog
140
142
  # is *not* running in a development environment.
141
143
  #
142
144
  # @default `DD_TRACE_STARTUP_LOGS` environment variable, otherwise `nil`
143
- # @return [Boolean,nil]
145
+ # @return [Boolean, nil]
144
146
  option :enabled do |o|
147
+ o.env Datadog::Core::Configuration::Ext::Diagnostics::ENV_STARTUP_LOGS_ENABLED
145
148
  # Defaults to nil as we want to know when the default value is being used
146
- o.default { env_to_bool(Datadog::Core::Configuration::Ext::Diagnostics::ENV_STARTUP_LOGS_ENABLED, nil) }
147
- o.lazy
149
+ o.type :bool, nilable: true
148
150
  end
149
151
  end
150
152
  end
@@ -158,8 +160,7 @@ module Datadog
158
160
  o.setter { |v| v.to_s if v }
159
161
 
160
162
  # NOTE: env also gets set as a side effect of tags. See the WORKAROUND note in #initialize for details.
161
- o.default { ENV.fetch(Core::Environment::Ext::ENV_ENVIRONMENT, nil) }
162
- o.lazy
163
+ o.env Core::Environment::Ext::ENV_ENVIRONMENT
163
164
  end
164
165
 
165
166
  # Internal `Datadog.logger` configuration.
@@ -175,7 +176,7 @@ module Datadog
175
176
  #
176
177
  # @return Logger::Severity
177
178
  option :instance do |o|
178
- o.on_set { |value| set_option(:level, value.level) unless value.nil? }
179
+ o.after_set { |value| set_option(:level, value.level) unless value.nil? }
179
180
  end
180
181
 
181
182
  # Log level for `Datadog.logger`.
@@ -194,8 +195,9 @@ module Datadog
194
195
  # @default `DD_PROFILING_ENABLED` environment variable, otherwise `false`
195
196
  # @return [Boolean]
196
197
  option :enabled do |o|
197
- o.default { env_to_bool(Profiling::Ext::ENV_ENABLED, false) }
198
- o.lazy
198
+ o.env Profiling::Ext::ENV_ENABLED
199
+ o.default false
200
+ o.type :bool
199
201
  end
200
202
 
201
203
  # @public_api
@@ -205,21 +207,16 @@ module Datadog
205
207
 
206
208
  # @public_api
207
209
  settings :advanced do
208
- # @deprecated This setting is ignored when CPU Profiling 2.0 is in use, and will be removed on dd-trace-rb 2.0.
210
+ # @deprecated No longer does anything, and will be removed on dd-trace-rb 2.0.
209
211
  #
210
- # This should never be reduced, as it can cause the resulting profiles to become biased.
211
- # The default should be enough for most services, allowing 16 threads to be sampled around 30 times
212
- # per second for a 60 second period.
212
+ # This was used prior to the GA of the new CPU Profiling 2.0 profiler. The CPU Profiling 2.0 profiler does not
213
+ # use or need this setting and thus it doesn't do anything.
213
214
  option :max_events do |o|
214
- o.default 32768
215
- o.on_set do |value|
216
- if value != 32768
217
- Datadog.logger.warn(
218
- 'The profiling.advanced.max_events setting has been deprecated for removal. It no longer does ' \
219
- 'anything unless you the `force_enable_legacy_profiler` option is in use. ' \
220
- 'Please remove it from your Datadog.configure block.'
221
- )
222
- end
215
+ o.after_set do
216
+ Datadog.logger.warn(
217
+ 'The profiling.advanced.max_events setting has been deprecated for removal and no ' \
218
+ 'longer does anything. Please remove it from your Datadog.configure block.'
219
+ )
223
220
  end
224
221
  end
225
222
 
@@ -228,8 +225,9 @@ module Datadog
228
225
  #
229
226
  # @default `DD_PROFILING_MAX_FRAMES` environment variable, otherwise 400
230
227
  option :max_frames do |o|
231
- o.default { env_to_int(Profiling::Ext::ENV_MAX_FRAMES, 400) }
232
- o.lazy
228
+ o.type :int
229
+ o.env Profiling::Ext::ENV_MAX_FRAMES
230
+ o.default 400
233
231
  end
234
232
 
235
233
  # @public_api
@@ -241,8 +239,9 @@ module Datadog
241
239
  # @default `DD_PROFILING_ENDPOINT_COLLECTION_ENABLED` environment variable, otherwise `true`
242
240
  # @return [Boolean]
243
241
  option :enabled do |o|
244
- o.default { env_to_bool(Profiling::Ext::ENV_ENDPOINT_COLLECTION_ENABLED, true) }
245
- o.lazy
242
+ o.env Profiling::Ext::ENV_ENDPOINT_COLLECTION_ENABLED
243
+ o.default true
244
+ o.type :bool
246
245
  end
247
246
  end
248
247
  end
@@ -256,7 +255,7 @@ module Datadog
256
255
  # This was added as a temporary support option in case of issues with the new `Profiling::HttpTransport` class
257
256
  # but we're now confident it's working nicely so we've removed the old code path.
258
257
  option :legacy_transport_enabled do |o|
259
- o.on_set do
258
+ o.after_set do
260
259
  Datadog.logger.warn(
261
260
  'The profiling.advanced.legacy_transport_enabled setting has been deprecated for removal and no ' \
262
261
  'longer does anything. Please remove it from your Datadog.configure block.'
@@ -269,7 +268,7 @@ module Datadog
269
268
  # This was used prior to the GA of the new CPU Profiling 2.0 profiler. Using CPU Profiling 2.0 is now the
270
269
  # default and this doesn't do anything.
271
270
  option :force_enable_new_profiler do |o|
272
- o.on_set do
271
+ o.after_set do
273
272
  Datadog.logger.warn(
274
273
  'The profiling.advanced.force_enable_new_profiler setting has been deprecated for removal and no ' \
275
274
  'longer does anything. Please remove it from your Datadog.configure block.'
@@ -277,25 +276,16 @@ module Datadog
277
276
  end
278
277
  end
279
278
 
280
- # @deprecated Will be removed for dd-trace-rb 2.0.
281
- #
282
- # Forces enabling the *legacy* non-CPU Profiling 2.0 profiler.
283
- # Do not use unless instructed to by support.
279
+ # @deprecated No longer does anything, and will be removed on dd-trace-rb 2.0.
284
280
  #
285
- # @default `DD_PROFILING_FORCE_ENABLE_LEGACY` environment variable, otherwise `false`
281
+ # This was used prior to the GA of the new CPU Profiling 2.0 profiler. Using CPU Profiling 2.0 is now the
282
+ # default and this doesn't do anything.
286
283
  option :force_enable_legacy_profiler do |o|
287
- o.default { env_to_bool('DD_PROFILING_FORCE_ENABLE_LEGACY', false) }
288
- o.lazy
289
- o.on_set do |value|
290
- if value
291
- Datadog.logger.warn(
292
- 'The profiling.advanced.force_enable_legacy_profiler setting has been deprecated for removal. ' \
293
- 'Do not use unless instructed to by support. ' \
294
- 'If you needed to use it due to incompatibilities with the CPU Profiling 2.0 profiler, consider ' \
295
- 'using the profiling.advanced.no_signals_workaround_enabled setting instead. ' \
296
- 'See <https://dtdg.co/ruby-profiler-troubleshooting> for details.'
297
- )
298
- end
284
+ o.after_set do
285
+ Datadog.logger.warn(
286
+ 'The profiling.advanced.force_enable_legacy_profiler setting has been deprecated for removal and no ' \
287
+ 'longer does anything. Please remove it from your Datadog.configure block.'
288
+ )
299
289
  end
300
290
  end
301
291
 
@@ -317,21 +307,40 @@ module Datadog
317
307
  #
318
308
  # @default `DD_PROFILING_FORCE_ENABLE_GC` environment variable, otherwise `false`
319
309
  option :force_enable_gc_profiling do |o|
320
- o.default { env_to_bool('DD_PROFILING_FORCE_ENABLE_GC', false) }
321
- o.lazy
310
+ o.env 'DD_PROFILING_FORCE_ENABLE_GC'
311
+ o.type :bool
312
+ o.default false
322
313
  end
323
314
 
324
315
  # Can be used to enable/disable the Datadog::Profiling.allocation_count feature.
325
316
  #
326
- # This feature is safe and enabled by default on Ruby 2.x, but
327
- # on Ruby 3.x it can break in applications that make use of Ractors due to two Ruby VM bugs:
328
- # https://bugs.ruby-lang.org/issues/19112 AND https://bugs.ruby-lang.org/issues/18464.
317
+ # This feature is safe and enabled by default on Ruby 2.x, but has a few caveats on Ruby 3.x.
318
+ #
319
+ # Caveat 1 (severe):
320
+ # On Ruby versions 3.0 (all), 3.1.0 to 3.1.3, and 3.2.0 to 3.2.2 this is disabled by default because it
321
+ # can trigger a VM bug that causes a segmentation fault during garbage collection of Ractors
322
+ # (https://bugs.ruby-lang.org/issues/18464). We don't recommend using this feature on such Rubies.
323
+ # This bug is fixed on Ruby versions 3.1.4, 3.2.3 and 3.3.0.
324
+ #
325
+ # Caveat 2 (annoyance):
326
+ # On all known versions of Ruby 3.x, due to https://bugs.ruby-lang.org/issues/19112, when a ractor gets
327
+ # garbage collected, Ruby will disable all active tracepoints, which this feature internally relies on.
328
+ # Thus this feature is only usable if you're not using Ractors.
329
329
  #
330
- # If you use Ruby 3.x and your application does not use Ractors (or if your Ruby has been patched), the
331
- # feature is fully safe to enable and this toggle can be used to do so.
330
+ # Caveat 3 (severe):
331
+ # Ruby 3.2.0 to 3.2.2 have a bug in the newobj tracepoint (https://bugs.ruby-lang.org/issues/19482,
332
+ # https://github.com/ruby/ruby/pull/7464) so that's an extra reason why it's not safe on those Rubies.
333
+ # This bug is fixed on Ruby versions 3.2.3 and 3.3.0.
332
334
  #
333
- # @default `true` on Ruby 2.x, `false` on Ruby 3.x
334
- option :allocation_counting_enabled, default: RUBY_VERSION.start_with?('2.')
335
+ # @default `true` on Ruby 2.x and 3.1.4+, 3.2.3+ and 3.3.0+; `false` for Ruby 3.0 and unpatched Rubies.
336
+ option :allocation_counting_enabled do |o|
337
+ o.default do
338
+ RUBY_VERSION.start_with?('2.') ||
339
+ (RUBY_VERSION.start_with?('3.1.') && RUBY_VERSION >= '3.1.4') ||
340
+ (RUBY_VERSION.start_with?('3.2.') && RUBY_VERSION >= '3.2.3') ||
341
+ RUBY_VERSION >= '3.3.'
342
+ end
343
+ end
335
344
 
336
345
  # Can be used to disable checking which version of `libmysqlclient` is being used by the `mysql2` gem.
337
346
  #
@@ -339,8 +348,18 @@ module Datadog
339
348
  #
340
349
  # @default `DD_PROFILING_SKIP_MYSQL2_CHECK` environment variable, otherwise `false`
341
350
  option :skip_mysql2_check do |o|
342
- o.default { env_to_bool('DD_PROFILING_SKIP_MYSQL2_CHECK', false) }
343
- o.lazy
351
+ o.type :bool
352
+ o.env 'DD_PROFILING_SKIP_MYSQL2_CHECK'
353
+ o.default false
354
+ end
355
+
356
+ # Enables data collection for the timeline feature. This is still experimental and not recommended yet.
357
+ #
358
+ # @default `DD_PROFILING_EXPERIMENTAL_TIMELINE_ENABLED` environment variable as a boolean, otherwise `false`
359
+ option :experimental_timeline_enabled do |o|
360
+ o.type :bool
361
+ o.env 'DD_PROFILING_EXPERIMENTAL_TIMELINE_ENABLED'
362
+ o.default false
344
363
  end
345
364
 
346
365
  # The profiler gathers data by sending `SIGPROF` unix signals to Ruby application threads.
@@ -363,8 +382,14 @@ module Datadog
363
382
  #
364
383
  # @default `DD_PROFILING_NO_SIGNALS_WORKAROUND_ENABLED` environment variable as a boolean, otherwise `:auto`
365
384
  option :no_signals_workaround_enabled do |o|
366
- o.default { env_to_bool('DD_PROFILING_NO_SIGNALS_WORKAROUND_ENABLED', :auto) }
367
- o.lazy
385
+ o.env 'DD_PROFILING_NO_SIGNALS_WORKAROUND_ENABLED'
386
+ o.default :auto
387
+ o.env_parser do |value|
388
+ if value
389
+ value = value.strip.downcase
390
+ ['true', '1'].include?(value)
391
+ end
392
+ end
368
393
  end
369
394
  end
370
395
 
@@ -374,9 +399,9 @@ module Datadog
374
399
  #
375
400
  # @default `DD_PROFILING_UPLOAD_TIMEOUT` environment variable, otherwise `30.0`
376
401
  option :timeout_seconds do |o|
377
- o.setter { |value| value.nil? ? 30.0 : value.to_f }
378
- o.default { env_to_float(Profiling::Ext::ENV_UPLOAD_TIMEOUT, 30.0) }
379
- o.lazy
402
+ o.type :float
403
+ o.env Profiling::Ext::ENV_UPLOAD_TIMEOUT
404
+ o.default 30.0
380
405
  end
381
406
  end
382
407
  end
@@ -389,11 +414,12 @@ module Datadog
389
414
  # @default `DD_RUNTIME_METRICS_ENABLED` environment variable, otherwise `false`
390
415
  # @return [Boolean]
391
416
  option :enabled do |o|
392
- o.default { env_to_bool(Core::Runtime::Ext::Metrics::ENV_ENABLED, false) }
393
- o.lazy
417
+ o.env Core::Runtime::Ext::Metrics::ENV_ENABLED
418
+ o.default false
419
+ o.type :bool
394
420
  end
395
421
 
396
- option :opts, default: ->(_i) { {} }, lazy: true
422
+ option :opts, default: {}, type: :hash
397
423
  option :statsd
398
424
  end
399
425
 
@@ -406,8 +432,8 @@ module Datadog
406
432
  o.setter { |v| v.to_s if v }
407
433
 
408
434
  # NOTE: service also gets set as a side effect of tags. See the WORKAROUND note in #initialize for details.
409
- o.default { ENV.fetch(Core::Environment::Ext::ENV_SERVICE, Core::Environment::Ext::FALLBACK_SERVICE_NAME) }
410
- o.lazy
435
+ o.env Core::Environment::Ext::ENV_SERVICE
436
+ o.default Core::Environment::Ext::FALLBACK_SERVICE_NAME
411
437
 
412
438
  # There's a few cases where we don't want to use the fallback service name, so this helper allows us to get a
413
439
  # nil instead so that one can do
@@ -429,8 +455,8 @@ module Datadog
429
455
  # @default `DD_SITE` environment variable, otherwise `nil` which sends data to `app.datadoghq.com`
430
456
  # @return [String,nil]
431
457
  option :site do |o|
432
- o.default { ENV.fetch(Core::Environment::Ext::ENV_SITE, nil) }
433
- o.lazy
458
+ o.type :string, nilable: true
459
+ o.env Core::Environment::Ext::ENV_SITE
434
460
  end
435
461
 
436
462
  # Default tags
@@ -440,44 +466,57 @@ module Datadog
440
466
  # @default `DD_TAGS` environment variable (in the format `'tag1:value1,tag2:value2'`), otherwise `{}`
441
467
  # @return [Hash<String,String>]
442
468
  option :tags do |o|
443
- o.default do
444
- tags = {}
469
+ o.type :hash, nilable: true
470
+ o.env Core::Environment::Ext::ENV_TAGS
471
+ o.env_parser do |env_value|
472
+ values = if env_value.include?(',')
473
+ env_value.split(',')
474
+ else
475
+ env_value.split(' ') # rubocop:disable Style/RedundantArgument
476
+ end
477
+
478
+ values.map! do |v|
479
+ v.gsub!(/\A[\s,]*|[\s,]*\Z/, '')
480
+
481
+ v.empty? ? nil : v
482
+ end
445
483
 
446
- # Parse tags from environment
447
- env_to_list(Core::Environment::Ext::ENV_TAGS, comma_separated_only: false).each do |tag|
484
+ values.compact!
485
+ values.each_with_object({}) do |tag, tags|
448
486
  key, value = tag.split(':', 2)
449
487
  tags[key] = value if value && !value.empty?
450
488
  end
489
+ end
490
+ o.setter do |new_value, old_value|
491
+ raw_tags = new_value || {}
451
492
 
452
- # Override tags if defined
453
- tags[Core::Environment::Ext::TAG_ENV] = env unless env.nil?
454
- tags[Core::Environment::Ext::TAG_VERSION] = version unless version.nil?
493
+ env_value = env
494
+ version_value = version
495
+ service_name = service_without_fallback
455
496
 
456
- tags
457
- end
497
+ # Override tags if defined
498
+ raw_tags[Core::Environment::Ext::TAG_ENV] = env_value unless env_value.nil?
499
+ raw_tags[Core::Environment::Ext::TAG_VERSION] = version_value unless version_value.nil?
458
500
 
459
- o.setter do |new_value, old_value|
460
501
  # Coerce keys to strings
461
- string_tags = new_value.collect { |k, v| [k.to_s, v] }.to_h
502
+ string_tags = raw_tags.collect { |k, v| [k.to_s, v] }.to_h
462
503
 
463
504
  # Cross-populate tag values with other settings
464
- if env.nil? && string_tags.key?(Core::Environment::Ext::TAG_ENV)
505
+ if env_value.nil? && string_tags.key?(Core::Environment::Ext::TAG_ENV)
465
506
  self.env = string_tags[Core::Environment::Ext::TAG_ENV]
466
507
  end
467
508
 
468
- if version.nil? && string_tags.key?(Core::Environment::Ext::TAG_VERSION)
509
+ if version_value.nil? && string_tags.key?(Core::Environment::Ext::TAG_VERSION)
469
510
  self.version = string_tags[Core::Environment::Ext::TAG_VERSION]
470
511
  end
471
512
 
472
- if service_without_fallback.nil? && string_tags.key?(Core::Environment::Ext::TAG_SERVICE)
513
+ if service_name.nil? && string_tags.key?(Core::Environment::Ext::TAG_SERVICE)
473
514
  self.service = string_tags[Core::Environment::Ext::TAG_SERVICE]
474
515
  end
475
516
 
476
517
  # Merge with previous tags
477
518
  (old_value || {}).merge(string_tags)
478
519
  end
479
-
480
- o.lazy
481
520
  end
482
521
 
483
522
  # The time provider used by Datadog. It must respect the interface of [Time](https://ruby-doc.org/core-3.0.1/Time.html).
@@ -490,9 +529,10 @@ module Datadog
490
529
  # @default `->{ Time.now }`
491
530
  # @return [Proc<Time>]
492
531
  option :time_now_provider do |o|
493
- o.default { ::Time.now }
532
+ o.default_proc { ::Time.now }
533
+ o.type :proc
494
534
 
495
- o.on_set do |time_provider|
535
+ o.after_set do |time_provider|
496
536
  Core::Utils::Time.now_provider = time_provider
497
537
  end
498
538
 
@@ -511,8 +551,8 @@ module Datadog
511
551
  # @return [String,nil]
512
552
  option :version do |o|
513
553
  # NOTE: version also gets set as a side effect of tags. See the WORKAROUND note in #initialize for details.
514
- o.default { ENV.fetch(Core::Environment::Ext::ENV_VERSION, nil) }
515
- o.lazy
554
+ o.type :string, nilable: true
555
+ o.env Core::Environment::Ext::ENV_VERSION
516
556
  end
517
557
 
518
558
  # Client-side telemetry configuration
@@ -522,10 +562,35 @@ module Datadog
522
562
  #
523
563
  # @default `DD_INSTRUMENTATION_TELEMETRY_ENABLED` environment variable, otherwise `true`.
524
564
  # Can be disabled as documented [here](https://docs.datadoghq.com/tracing/configure_data_security/#telemetry-collection).
565
+ # By default, telemetry is disabled in development environments.
525
566
  # @return [Boolean]
526
567
  option :enabled do |o|
527
- o.default { env_to_bool(Core::Telemetry::Ext::ENV_ENABLED, true) }
528
- o.lazy
568
+ o.env Core::Telemetry::Ext::ENV_ENABLED
569
+ o.default do
570
+ if Datadog::Core::Environment::Execution.development?
571
+ Datadog.logger.debug do
572
+ 'Development environment detected, disabling Telemetry. ' \
573
+ 'You can enable it with DD_INSTRUMENTATION_TELEMETRY_ENABLED=true.'
574
+ end
575
+ false
576
+ else
577
+ true
578
+ end
579
+ end
580
+ o.type :bool
581
+ end
582
+
583
+ # The interval in seconds when telemetry must be sent.
584
+ #
585
+ # This method is used internally, for testing purposes only.
586
+ #
587
+ # @default `DD_TELEMETRY_HEARTBEAT_INTERVAL` environment variable, otherwise `60`.
588
+ # @return [Float]
589
+ # @!visibility private
590
+ option :heartbeat_interval_seconds do |o|
591
+ o.type :float
592
+ o.env Core::Telemetry::Ext::ENV_HEARTBEAT_INTERVAL
593
+ o.default 60.0
529
594
  end
530
595
  end
531
596
 
@@ -535,19 +600,34 @@ module Datadog
535
600
  # Enable remote configuration. This allows fetching of remote configuration for live updates.
536
601
  #
537
602
  # @default `DD_REMOTE_CONFIGURATION_ENABLED` environment variable, otherwise `true`.
603
+ # By default, remote configuration is disabled in development environments.
538
604
  # @return [Boolean]
539
605
  option :enabled do |o|
540
- o.default { env_to_bool(Core::Remote::Ext::ENV_ENABLED, true) }
541
- o.lazy
606
+ o.env Core::Remote::Ext::ENV_ENABLED
607
+ o.default do
608
+ if Datadog::Core::Environment::Execution.development?
609
+ Datadog.logger.debug do
610
+ 'Development environment detected, disabling Remote Configuration. ' \
611
+ 'You can enable it with DD_REMOTE_CONFIGURATION_ENABLED=true.'
612
+ end
613
+ false
614
+ else
615
+ true
616
+ end
617
+ end
618
+ o.type :bool
542
619
  end
543
620
 
544
621
  # Tune remote configuration polling interval.
622
+ # This is a private setting. Do not use outside of Datadog. It might change at any point in time.
545
623
  #
546
- # @default `DD_REMOTE_CONFIGURATION_POLL_INTERVAL_SECONDS` environment variable, otherwise `5.0` seconds.
624
+ # @default `DD_REMOTE_CONFIG_POLL_INTERVAL_SECONDS` environment variable, otherwise `5.0` seconds.
547
625
  # @return [Float]
626
+ # @!visibility private
548
627
  option :poll_interval_seconds do |o|
549
- o.default { env_to_float(Core::Remote::Ext::ENV_POLL_INTERVAL_SECONDS, 5.0) }
550
- o.lazy
628
+ o.env Core::Remote::Ext::ENV_POLL_INTERVAL_SECONDS
629
+ o.type :float
630
+ o.default 5.0
551
631
  end
552
632
 
553
633
  # Declare service name to bind to remote configuration. Use when
@@ -273,6 +273,10 @@ module Datadog
273
273
  def handle_interrupt_shutdown!
274
274
  logger = Datadog.logger
275
275
  shutdown_thread = Thread.new { shutdown! }
276
+ unless Gem::Version.new(RUBY_VERSION) < Gem::Version.new('2.3')
277
+ shutdown_thread.name = Datadog::Core::Configuration.name
278
+ end
279
+
276
280
  print_message_treshold_seconds = 0.2
277
281
 
278
282
  slow_shutdown = shutdown_thread.join(print_message_treshold_seconds).nil?