ddtrace 1.12.1 → 1.23.2

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 (509) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +613 -9
  3. data/LICENSE-3rdparty.csv +1 -1
  4. data/bin/ddprofrb +15 -0
  5. data/bin/ddtracerb +3 -1
  6. data/ext/{ddtrace_profiling_loader/ddtrace_profiling_loader.c → datadog_profiling_loader/datadog_profiling_loader.c} +2 -2
  7. data/ext/{ddtrace_profiling_loader → datadog_profiling_loader}/extconf.rb +3 -3
  8. data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/NativeExtensionDesign.md +3 -5
  9. data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/clock_id.h +0 -3
  10. data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/clock_id_from_pthread.c +3 -22
  11. data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/clock_id_noop.c +0 -1
  12. data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/collectors_cpu_and_wall_time_worker.c +338 -108
  13. data/ext/datadog_profiling_native_extension/collectors_discrete_dynamic_sampler.c +422 -0
  14. data/ext/datadog_profiling_native_extension/collectors_discrete_dynamic_sampler.h +101 -0
  15. data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/collectors_dynamic_sampling_rate.c +22 -14
  16. data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/collectors_dynamic_sampling_rate.h +4 -0
  17. data/ext/datadog_profiling_native_extension/collectors_gc_profiling_helper.c +156 -0
  18. data/ext/datadog_profiling_native_extension/collectors_gc_profiling_helper.h +5 -0
  19. data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/collectors_idle_sampling_helper.c +3 -0
  20. data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/collectors_stack.c +111 -118
  21. data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/collectors_stack.h +11 -4
  22. data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/collectors_thread_context.c +545 -144
  23. data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/collectors_thread_context.h +3 -2
  24. data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/extconf.rb +68 -17
  25. data/ext/datadog_profiling_native_extension/heap_recorder.c +1047 -0
  26. data/ext/datadog_profiling_native_extension/heap_recorder.h +166 -0
  27. data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/helpers.h +6 -0
  28. data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/http_transport.c +60 -32
  29. data/ext/datadog_profiling_native_extension/libdatadog_helpers.c +62 -0
  30. data/ext/datadog_profiling_native_extension/libdatadog_helpers.h +42 -0
  31. data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/native_extension_helpers.rb +50 -4
  32. data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/private_vm_api_access.c +155 -32
  33. data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/private_vm_api_access.h +16 -0
  34. data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/profiling.c +19 -3
  35. data/ext/datadog_profiling_native_extension/ruby_helpers.c +267 -0
  36. data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/ruby_helpers.h +33 -0
  37. data/ext/datadog_profiling_native_extension/stack_recorder.c +1040 -0
  38. data/ext/datadog_profiling_native_extension/stack_recorder.h +27 -0
  39. data/ext/datadog_profiling_native_extension/time_helpers.c +53 -0
  40. data/ext/datadog_profiling_native_extension/time_helpers.h +26 -0
  41. data/lib/datadog/appsec/assets/waf_rules/processors.json +92 -0
  42. data/lib/datadog/appsec/assets/waf_rules/recommended.json +698 -75
  43. data/lib/datadog/appsec/assets/waf_rules/scanners.json +114 -0
  44. data/lib/datadog/appsec/assets/waf_rules/strict.json +98 -8
  45. data/lib/datadog/appsec/assets.rb +8 -0
  46. data/lib/datadog/appsec/component.rb +21 -2
  47. data/lib/datadog/appsec/configuration/settings.rb +167 -189
  48. data/lib/datadog/appsec/configuration.rb +0 -79
  49. data/lib/datadog/appsec/contrib/auto_instrument.rb +2 -4
  50. data/lib/datadog/appsec/contrib/devise/event.rb +57 -0
  51. data/lib/datadog/appsec/contrib/devise/ext.rb +13 -0
  52. data/lib/datadog/appsec/contrib/devise/integration.rb +42 -0
  53. data/lib/datadog/appsec/contrib/devise/patcher/authenticatable_patch.rb +76 -0
  54. data/lib/datadog/appsec/contrib/devise/patcher/registration_controller_patch.rb +54 -0
  55. data/lib/datadog/appsec/contrib/devise/patcher.rb +45 -0
  56. data/lib/datadog/appsec/contrib/devise/resource.rb +35 -0
  57. data/lib/datadog/appsec/contrib/devise/tracking.rb +57 -0
  58. data/lib/datadog/appsec/contrib/rack/ext.rb +2 -1
  59. data/lib/datadog/appsec/contrib/rack/gateway/request.rb +6 -2
  60. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +8 -6
  61. data/lib/datadog/appsec/contrib/rack/reactive/request.rb +3 -8
  62. data/lib/datadog/appsec/contrib/rack/reactive/request_body.rb +3 -6
  63. data/lib/datadog/appsec/contrib/rack/reactive/response.rb +3 -6
  64. data/lib/datadog/appsec/contrib/rack/request_body_middleware.rb +3 -2
  65. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +77 -27
  66. data/lib/datadog/appsec/contrib/rails/ext.rb +3 -2
  67. data/lib/datadog/appsec/contrib/rails/framework.rb +1 -3
  68. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +3 -2
  69. data/lib/datadog/appsec/contrib/rails/patcher.rb +17 -11
  70. data/lib/datadog/appsec/contrib/rails/reactive/action.rb +3 -6
  71. data/lib/datadog/appsec/contrib/sinatra/ext.rb +2 -1
  72. data/lib/datadog/appsec/contrib/sinatra/framework.rb +1 -3
  73. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +6 -4
  74. data/lib/datadog/appsec/contrib/sinatra/patcher.rb +13 -7
  75. data/lib/datadog/appsec/contrib/sinatra/reactive/routed.rb +3 -6
  76. data/lib/datadog/appsec/event.rb +106 -50
  77. data/lib/datadog/appsec/extensions.rb +1 -130
  78. data/lib/datadog/appsec/monitor/gateway/watcher.rb +3 -3
  79. data/lib/datadog/appsec/monitor/reactive/set_user.rb +3 -6
  80. data/lib/datadog/appsec/processor/actions.rb +49 -0
  81. data/lib/datadog/appsec/processor/rule_loader.rb +60 -0
  82. data/lib/datadog/appsec/processor/rule_merger.rb +22 -2
  83. data/lib/datadog/appsec/processor.rb +35 -7
  84. data/lib/datadog/appsec/rate_limiter.rb +1 -1
  85. data/lib/datadog/appsec/remote.rb +17 -11
  86. data/lib/datadog/appsec/response.rb +82 -4
  87. data/lib/datadog/appsec/sample_rate.rb +21 -0
  88. data/lib/datadog/appsec.rb +3 -4
  89. data/lib/datadog/auto_instrument.rb +3 -0
  90. data/lib/datadog/core/backport.rb +51 -0
  91. data/lib/datadog/core/configuration/agent_settings_resolver.rb +38 -29
  92. data/lib/datadog/core/configuration/base.rb +6 -16
  93. data/lib/datadog/core/configuration/components.rb +20 -7
  94. data/lib/datadog/core/configuration/ext.rb +28 -5
  95. data/lib/datadog/core/configuration/option.rb +271 -21
  96. data/lib/datadog/core/configuration/option_definition.rb +73 -32
  97. data/lib/datadog/core/configuration/options.rb +27 -15
  98. data/lib/datadog/core/configuration/settings.rb +398 -119
  99. data/lib/datadog/core/configuration.rb +24 -4
  100. data/lib/datadog/core/diagnostics/environment_logger.rb +132 -235
  101. data/lib/datadog/core/environment/class_count.rb +6 -6
  102. data/lib/datadog/core/environment/execution.rb +103 -0
  103. data/lib/datadog/core/environment/ext.rb +13 -11
  104. data/lib/datadog/core/environment/git.rb +25 -0
  105. data/lib/datadog/core/environment/identity.rb +18 -48
  106. data/lib/datadog/core/environment/platform.rb +7 -1
  107. data/lib/datadog/core/environment/variable_helpers.rb +0 -69
  108. data/lib/datadog/core/environment/yjit.rb +58 -0
  109. data/lib/datadog/core/error.rb +1 -0
  110. data/lib/datadog/core/git/ext.rb +6 -23
  111. data/lib/datadog/core/logging/ext.rb +3 -1
  112. data/lib/datadog/core/metrics/ext.rb +7 -5
  113. data/lib/datadog/core/remote/client/capabilities.rb +7 -2
  114. data/lib/datadog/core/remote/client.rb +3 -0
  115. data/lib/datadog/core/remote/component.rb +52 -48
  116. data/lib/datadog/core/remote/configuration/content.rb +28 -1
  117. data/lib/datadog/core/remote/configuration/repository.rb +3 -1
  118. data/lib/datadog/core/remote/ext.rb +2 -1
  119. data/lib/datadog/core/remote/negotiation.rb +20 -7
  120. data/lib/datadog/core/remote/tie/tracing.rb +39 -0
  121. data/lib/datadog/core/remote/tie.rb +27 -0
  122. data/lib/datadog/core/remote/transport/config.rb +60 -0
  123. data/lib/datadog/core/remote/transport/http/api/instance.rb +39 -0
  124. data/lib/datadog/core/remote/transport/http/api/spec.rb +21 -0
  125. data/lib/datadog/core/remote/transport/http/api.rb +58 -0
  126. data/lib/datadog/core/remote/transport/http/builder.rb +219 -0
  127. data/lib/datadog/core/remote/transport/http/client.rb +48 -0
  128. data/lib/datadog/core/remote/transport/http/config.rb +280 -0
  129. data/lib/datadog/core/remote/transport/http/negotiation.rb +146 -0
  130. data/lib/datadog/core/remote/transport/http.rb +179 -0
  131. data/lib/datadog/core/{transport → remote/transport}/negotiation.rb +25 -23
  132. data/lib/datadog/core/remote/worker.rb +11 -5
  133. data/lib/datadog/core/runtime/ext.rb +22 -12
  134. data/lib/datadog/core/runtime/metrics.rb +43 -0
  135. data/lib/datadog/core/telemetry/client.rb +28 -10
  136. data/lib/datadog/core/telemetry/emitter.rb +9 -11
  137. data/lib/datadog/core/telemetry/event.rb +250 -44
  138. data/lib/datadog/core/telemetry/ext.rb +8 -1
  139. data/lib/datadog/core/telemetry/heartbeat.rb +3 -7
  140. data/lib/datadog/core/telemetry/http/ext.rb +13 -8
  141. data/lib/datadog/core/telemetry/http/response.rb +4 -0
  142. data/lib/datadog/core/telemetry/http/transport.rb +10 -3
  143. data/lib/datadog/core/telemetry/request.rb +59 -0
  144. data/lib/datadog/core/transport/ext.rb +49 -0
  145. data/lib/datadog/core/transport/http/adapters/net.rb +168 -0
  146. data/lib/datadog/core/transport/http/adapters/registry.rb +29 -0
  147. data/lib/datadog/core/transport/http/adapters/test.rb +89 -0
  148. data/lib/datadog/core/transport/http/adapters/unix_socket.rb +83 -0
  149. data/lib/datadog/core/transport/http/api/endpoint.rb +31 -0
  150. data/lib/datadog/core/transport/http/api/fallbacks.rb +26 -0
  151. data/lib/datadog/core/transport/http/api/map.rb +18 -0
  152. data/lib/datadog/core/transport/http/env.rb +62 -0
  153. data/lib/datadog/core/transport/http/response.rb +60 -0
  154. data/lib/datadog/core/transport/parcel.rb +22 -0
  155. data/lib/datadog/core/transport/request.rb +17 -0
  156. data/lib/datadog/core/transport/response.rb +64 -0
  157. data/lib/datadog/core/utils/duration.rb +52 -0
  158. data/lib/datadog/core/utils/hash.rb +47 -0
  159. data/lib/datadog/core/utils/network.rb +1 -1
  160. data/lib/datadog/core/utils/safe_dup.rb +27 -20
  161. data/lib/datadog/core/utils/url.rb +25 -0
  162. data/lib/datadog/core/utils.rb +1 -1
  163. data/lib/datadog/core/workers/async.rb +3 -2
  164. data/lib/datadog/core/workers/polling.rb +2 -2
  165. data/lib/datadog/kit/appsec/events.rb +139 -89
  166. data/lib/datadog/kit/enable_core_dumps.rb +5 -6
  167. data/lib/datadog/kit/identity.rb +80 -65
  168. data/lib/datadog/opentelemetry/api/context.rb +10 -3
  169. data/lib/datadog/opentelemetry/sdk/propagator.rb +5 -3
  170. data/lib/datadog/opentelemetry/sdk/span_processor.rb +48 -5
  171. data/lib/datadog/opentelemetry/sdk/trace/span.rb +167 -0
  172. data/lib/datadog/opentelemetry/trace.rb +58 -0
  173. data/lib/datadog/opentelemetry.rb +4 -0
  174. data/lib/datadog/opentracer/text_map_propagator.rb +2 -1
  175. data/lib/datadog/opentracer.rb +9 -0
  176. data/lib/datadog/profiling/collectors/code_provenance.rb +10 -4
  177. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +43 -20
  178. data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +3 -1
  179. data/lib/datadog/profiling/collectors/info.rb +101 -0
  180. data/lib/datadog/profiling/collectors/thread_context.rb +17 -2
  181. data/lib/datadog/profiling/component.rb +248 -97
  182. data/lib/datadog/profiling/exporter.rb +26 -5
  183. data/lib/datadog/profiling/ext.rb +2 -12
  184. data/lib/datadog/profiling/flush.rb +10 -5
  185. data/lib/datadog/profiling/http_transport.rb +23 -6
  186. data/lib/datadog/profiling/load_native_extension.rb +25 -6
  187. data/lib/datadog/profiling/native_extension.rb +1 -22
  188. data/lib/datadog/profiling/profiler.rb +36 -13
  189. data/lib/datadog/profiling/scheduler.rb +20 -15
  190. data/lib/datadog/profiling/stack_recorder.rb +19 -4
  191. data/lib/datadog/profiling/tag_builder.rb +5 -0
  192. data/lib/datadog/profiling/tasks/exec.rb +3 -3
  193. data/lib/datadog/profiling/tasks/help.rb +3 -3
  194. data/lib/datadog/profiling.rb +28 -79
  195. data/lib/datadog/tracing/component.rb +70 -11
  196. data/lib/datadog/tracing/configuration/agent_settings_resolver.rb +13 -0
  197. data/lib/datadog/tracing/configuration/dynamic/option.rb +71 -0
  198. data/lib/datadog/tracing/configuration/dynamic.rb +64 -0
  199. data/lib/datadog/tracing/configuration/ext.rb +40 -33
  200. data/lib/datadog/tracing/configuration/http.rb +74 -0
  201. data/lib/datadog/tracing/configuration/settings.rb +136 -99
  202. data/lib/datadog/tracing/contrib/action_cable/configuration/settings.rb +10 -6
  203. data/lib/datadog/tracing/contrib/action_cable/ext.rb +21 -18
  204. data/lib/datadog/tracing/contrib/action_mailer/configuration/settings.rb +10 -6
  205. data/lib/datadog/tracing/contrib/action_mailer/events/deliver.rb +1 -1
  206. data/lib/datadog/tracing/contrib/action_mailer/ext.rb +21 -18
  207. data/lib/datadog/tracing/contrib/action_pack/configuration/settings.rb +10 -7
  208. data/lib/datadog/tracing/contrib/action_pack/ext.rb +11 -8
  209. data/lib/datadog/tracing/contrib/action_view/configuration/settings.rb +10 -6
  210. data/lib/datadog/tracing/contrib/action_view/ext.rb +13 -10
  211. data/lib/datadog/tracing/contrib/active_job/configuration/settings.rb +14 -7
  212. data/lib/datadog/tracing/contrib/active_job/ext.rb +26 -23
  213. data/lib/datadog/tracing/contrib/active_job/log_injection.rb +1 -1
  214. data/lib/datadog/tracing/contrib/active_job/patcher.rb +1 -1
  215. data/lib/datadog/tracing/contrib/active_model_serializers/configuration/settings.rb +10 -6
  216. data/lib/datadog/tracing/contrib/active_model_serializers/ext.rb +13 -10
  217. data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +29 -15
  218. data/lib/datadog/tracing/contrib/active_record/configuration/settings.rb +10 -7
  219. data/lib/datadog/tracing/contrib/active_record/events/sql.rb +2 -6
  220. data/lib/datadog/tracing/contrib/active_record/ext.rb +18 -15
  221. data/lib/datadog/tracing/contrib/active_record/utils.rb +1 -1
  222. data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +106 -202
  223. data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +3 -0
  224. data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +10 -7
  225. data/lib/datadog/tracing/contrib/active_support/ext.rb +19 -16
  226. data/lib/datadog/tracing/contrib/analytics.rb +0 -1
  227. data/lib/datadog/tracing/contrib/aws/configuration/settings.rb +15 -7
  228. data/lib/datadog/tracing/contrib/aws/ext.rb +38 -24
  229. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +16 -5
  230. data/lib/datadog/tracing/contrib/concurrent_ruby/async_patch.rb +20 -0
  231. data/lib/datadog/tracing/contrib/concurrent_ruby/configuration/settings.rb +3 -2
  232. data/lib/datadog/tracing/contrib/concurrent_ruby/context_composite_executor_service.rb +14 -14
  233. data/lib/datadog/tracing/contrib/concurrent_ruby/ext.rb +4 -2
  234. data/lib/datadog/tracing/contrib/concurrent_ruby/future_patch.rb +3 -10
  235. data/lib/datadog/tracing/contrib/concurrent_ruby/integration.rb +2 -1
  236. data/lib/datadog/tracing/contrib/concurrent_ruby/patcher.rb +19 -2
  237. data/lib/datadog/tracing/contrib/concurrent_ruby/promises_future_patch.rb +22 -0
  238. data/lib/datadog/tracing/contrib/configurable.rb +1 -1
  239. data/lib/datadog/tracing/contrib/configuration/settings.rb +1 -1
  240. data/lib/datadog/tracing/contrib/dalli/configuration/settings.rb +21 -7
  241. data/lib/datadog/tracing/contrib/dalli/ext.rb +27 -11
  242. data/lib/datadog/tracing/contrib/dalli/instrumentation.rb +17 -8
  243. data/lib/datadog/tracing/contrib/delayed_job/configuration/settings.rb +14 -7
  244. data/lib/datadog/tracing/contrib/delayed_job/ext.rb +17 -14
  245. data/lib/datadog/tracing/contrib/elasticsearch/configuration/settings.rb +15 -7
  246. data/lib/datadog/tracing/contrib/elasticsearch/ext.rb +22 -15
  247. data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +104 -99
  248. data/lib/datadog/tracing/contrib/ethon/configuration/settings.rb +17 -9
  249. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +48 -3
  250. data/lib/datadog/tracing/contrib/ethon/ext.rb +20 -11
  251. data/lib/datadog/tracing/contrib/ethon/multi_patch.rb +6 -3
  252. data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +20 -10
  253. data/lib/datadog/tracing/contrib/excon/ext.rb +17 -8
  254. data/lib/datadog/tracing/contrib/excon/middleware.rb +25 -5
  255. data/lib/datadog/tracing/contrib/ext.rb +26 -1
  256. data/lib/datadog/tracing/contrib/extensions.rb +38 -2
  257. data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +27 -10
  258. data/lib/datadog/tracing/contrib/faraday/ext.rb +17 -8
  259. data/lib/datadog/tracing/contrib/faraday/middleware.rb +22 -6
  260. data/lib/datadog/tracing/contrib/grape/configuration/settings.rb +9 -6
  261. data/lib/datadog/tracing/contrib/grape/ext.rb +17 -14
  262. data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +9 -6
  263. data/lib/datadog/tracing/contrib/graphql/ext.rb +8 -5
  264. data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +40 -9
  265. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +39 -20
  266. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +37 -18
  267. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor.rb +0 -4
  268. data/lib/datadog/tracing/contrib/grpc/ext.rb +17 -13
  269. data/lib/datadog/tracing/contrib/grpc/formatting.rb +127 -0
  270. data/lib/datadog/tracing/contrib/hanami/configuration/settings.rb +3 -2
  271. data/lib/datadog/tracing/contrib/hanami/ext.rb +10 -8
  272. data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +5 -8
  273. data/lib/datadog/tracing/contrib/http/configuration/settings.rb +34 -11
  274. data/lib/datadog/tracing/contrib/http/distributed/fetcher.rb +2 -2
  275. data/lib/datadog/tracing/contrib/http/ext.rb +17 -9
  276. data/lib/datadog/tracing/contrib/http/instrumentation.rb +27 -7
  277. data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +34 -11
  278. data/lib/datadog/tracing/contrib/httpclient/ext.rb +18 -9
  279. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +22 -5
  280. data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +34 -11
  281. data/lib/datadog/tracing/contrib/httprb/ext.rb +17 -9
  282. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +22 -5
  283. data/lib/datadog/tracing/contrib/kafka/configuration/settings.rb +10 -6
  284. data/lib/datadog/tracing/contrib/kafka/ext.rb +43 -39
  285. data/lib/datadog/tracing/contrib/lograge/configuration/settings.rb +3 -2
  286. data/lib/datadog/tracing/contrib/lograge/ext.rb +3 -1
  287. data/lib/datadog/tracing/contrib/lograge/instrumentation.rb +2 -17
  288. data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +15 -7
  289. data/lib/datadog/tracing/contrib/mongodb/ext.rb +21 -16
  290. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +16 -5
  291. data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +22 -14
  292. data/lib/datadog/tracing/contrib/mysql2/ext.rb +16 -10
  293. data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +22 -7
  294. data/lib/datadog/tracing/contrib/opensearch/configuration/settings.rb +53 -0
  295. data/lib/datadog/tracing/contrib/opensearch/ext.rb +38 -0
  296. data/lib/datadog/tracing/contrib/opensearch/integration.rb +44 -0
  297. data/lib/datadog/tracing/contrib/opensearch/patcher.rb +135 -0
  298. data/lib/datadog/tracing/contrib/opensearch/quantize.rb +81 -0
  299. data/lib/datadog/tracing/contrib/pg/configuration/settings.rb +23 -14
  300. data/lib/datadog/tracing/contrib/pg/ext.rb +23 -19
  301. data/lib/datadog/tracing/contrib/pg/instrumentation.rb +49 -9
  302. data/lib/datadog/tracing/contrib/presto/configuration/settings.rb +15 -7
  303. data/lib/datadog/tracing/contrib/presto/ext.rb +26 -20
  304. data/lib/datadog/tracing/contrib/presto/instrumentation.rb +14 -5
  305. data/lib/datadog/tracing/contrib/propagation/sql_comment/ext.rb +12 -10
  306. data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +1 -1
  307. data/lib/datadog/tracing/contrib/qless/configuration/settings.rb +13 -8
  308. data/lib/datadog/tracing/contrib/qless/ext.rb +15 -12
  309. data/lib/datadog/tracing/contrib/que/configuration/settings.rb +22 -12
  310. data/lib/datadog/tracing/contrib/que/ext.rb +1 -0
  311. data/lib/datadog/tracing/contrib/racecar/configuration/settings.rb +10 -7
  312. data/lib/datadog/tracing/contrib/racecar/event.rb +5 -5
  313. data/lib/datadog/tracing/contrib/racecar/ext.rb +21 -18
  314. data/lib/datadog/tracing/contrib/rack/configuration/settings.rb +17 -12
  315. data/lib/datadog/tracing/contrib/rack/ext.rb +19 -16
  316. data/lib/datadog/tracing/contrib/rack/header_collection.rb +3 -0
  317. data/lib/datadog/tracing/contrib/rack/header_tagging.rb +63 -0
  318. data/lib/datadog/tracing/contrib/rack/middlewares.rb +16 -50
  319. data/lib/datadog/tracing/contrib/rails/auto_instrument_railtie.rb +0 -2
  320. data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +20 -15
  321. data/lib/datadog/tracing/contrib/rails/ext.rb +8 -5
  322. data/lib/datadog/tracing/contrib/rails/log_injection.rb +7 -10
  323. data/lib/datadog/tracing/contrib/rails/patcher.rb +10 -41
  324. data/lib/datadog/tracing/contrib/rails/railtie.rb +3 -3
  325. data/lib/datadog/tracing/contrib/rake/configuration/settings.rb +14 -10
  326. data/lib/datadog/tracing/contrib/rake/ext.rb +15 -12
  327. data/lib/datadog/tracing/contrib/redis/configuration/settings.rb +18 -9
  328. data/lib/datadog/tracing/contrib/redis/ext.rb +23 -15
  329. data/lib/datadog/tracing/contrib/redis/instrumentation.rb +5 -40
  330. data/lib/datadog/tracing/contrib/redis/patcher.rb +34 -21
  331. data/lib/datadog/tracing/contrib/redis/tags.rb +16 -7
  332. data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +46 -33
  333. data/lib/datadog/tracing/contrib/resque/configuration/settings.rb +14 -7
  334. data/lib/datadog/tracing/contrib/resque/ext.rb +10 -7
  335. data/lib/datadog/tracing/contrib/rest_client/configuration/settings.rb +17 -9
  336. data/lib/datadog/tracing/contrib/rest_client/ext.rb +16 -8
  337. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +25 -5
  338. data/lib/datadog/tracing/contrib/roda/configuration/settings.rb +10 -6
  339. data/lib/datadog/tracing/contrib/roda/ext.rb +1 -0
  340. data/lib/datadog/tracing/contrib/semantic_logger/configuration/settings.rb +3 -2
  341. data/lib/datadog/tracing/contrib/semantic_logger/ext.rb +3 -1
  342. data/lib/datadog/tracing/contrib/semantic_logger/instrumentation.rb +4 -20
  343. data/lib/datadog/tracing/contrib/sequel/configuration/settings.rb +10 -6
  344. data/lib/datadog/tracing/contrib/sequel/ext.rb +11 -8
  345. data/lib/datadog/tracing/contrib/sequel/utils.rb +7 -7
  346. data/lib/datadog/tracing/contrib/shoryuken/configuration/settings.rb +15 -8
  347. data/lib/datadog/tracing/contrib/shoryuken/ext.rb +15 -12
  348. data/lib/datadog/tracing/contrib/sidekiq/configuration/settings.rb +19 -11
  349. data/lib/datadog/tracing/contrib/sidekiq/ext.rb +33 -30
  350. data/lib/datadog/tracing/contrib/sinatra/configuration/settings.rb +12 -9
  351. data/lib/datadog/tracing/contrib/sinatra/env.rb +0 -17
  352. data/lib/datadog/tracing/contrib/sinatra/ext.rb +22 -19
  353. data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +3 -14
  354. data/lib/datadog/tracing/contrib/sneakers/configuration/settings.rb +15 -8
  355. data/lib/datadog/tracing/contrib/sneakers/ext.rb +2 -0
  356. data/lib/datadog/tracing/contrib/sneakers/tracer.rb +1 -1
  357. data/lib/datadog/tracing/contrib/span_attribute_schema.rb +74 -10
  358. data/lib/datadog/tracing/contrib/stripe/configuration/settings.rb +10 -6
  359. data/lib/datadog/tracing/contrib/stripe/ext.rb +1 -0
  360. data/lib/datadog/tracing/contrib/sucker_punch/configuration/settings.rb +10 -6
  361. data/lib/datadog/tracing/contrib/sucker_punch/ext.rb +16 -13
  362. data/lib/datadog/tracing/contrib/trilogy/configuration/settings.rb +58 -0
  363. data/lib/datadog/tracing/contrib/trilogy/ext.rb +27 -0
  364. data/lib/datadog/tracing/contrib/trilogy/instrumentation.rb +94 -0
  365. data/lib/datadog/tracing/contrib/trilogy/integration.rb +43 -0
  366. data/lib/datadog/{ci/contrib/cucumber → tracing/contrib/trilogy}/patcher.rb +10 -6
  367. data/lib/datadog/tracing/contrib/utils/database.rb +5 -3
  368. data/lib/datadog/tracing/contrib/utils/quantization/http.rb +11 -11
  369. data/lib/datadog/tracing/contrib.rb +2 -0
  370. data/lib/datadog/tracing/correlation.rb +29 -12
  371. data/lib/datadog/tracing/diagnostics/environment_logger.rb +165 -0
  372. data/lib/datadog/tracing/diagnostics/ext.rb +21 -19
  373. data/lib/datadog/tracing/distributed/b3_multi.rb +2 -2
  374. data/lib/datadog/tracing/distributed/b3_single.rb +1 -1
  375. data/lib/datadog/tracing/distributed/datadog.rb +0 -1
  376. data/lib/datadog/tracing/distributed/propagation.rb +35 -34
  377. data/lib/datadog/tracing/distributed/trace_context.rb +52 -17
  378. data/lib/datadog/tracing/metadata/ext.rb +9 -6
  379. data/lib/datadog/tracing/metadata/tagging.rb +3 -3
  380. data/lib/datadog/tracing/remote.rb +78 -0
  381. data/lib/datadog/tracing/sampling/matcher.rb +23 -3
  382. data/lib/datadog/tracing/sampling/rule.rb +7 -2
  383. data/lib/datadog/tracing/sampling/rule_sampler.rb +31 -0
  384. data/lib/datadog/tracing/span_operation.rb +3 -15
  385. data/lib/datadog/tracing/sync_writer.rb +3 -3
  386. data/lib/datadog/tracing/trace_digest.rb +31 -0
  387. data/lib/datadog/tracing/trace_operation.rb +17 -5
  388. data/lib/datadog/tracing/trace_segment.rb +5 -2
  389. data/lib/datadog/tracing/tracer.rb +12 -1
  390. data/lib/datadog/{core → tracing}/transport/http/api/instance.rb +1 -1
  391. data/lib/datadog/{core → tracing}/transport/http/api/spec.rb +1 -1
  392. data/lib/datadog/tracing/transport/http/api.rb +43 -0
  393. data/lib/datadog/{core → tracing}/transport/http/builder.rb +13 -68
  394. data/lib/datadog/tracing/transport/http/client.rb +57 -0
  395. data/lib/datadog/tracing/transport/http/statistics.rb +47 -0
  396. data/lib/datadog/tracing/transport/http/traces.rb +152 -0
  397. data/lib/datadog/tracing/transport/http.rb +125 -0
  398. data/lib/datadog/tracing/transport/io/client.rb +89 -0
  399. data/lib/datadog/tracing/transport/io/response.rb +27 -0
  400. data/lib/datadog/tracing/transport/io/traces.rb +101 -0
  401. data/lib/datadog/tracing/transport/io.rb +30 -0
  402. data/lib/datadog/tracing/transport/serializable_trace.rb +126 -0
  403. data/lib/datadog/tracing/transport/statistics.rb +77 -0
  404. data/lib/datadog/tracing/transport/trace_formatter.rb +240 -0
  405. data/lib/datadog/tracing/transport/traces.rb +224 -0
  406. data/lib/datadog/tracing/workers/trace_writer.rb +6 -4
  407. data/lib/datadog/tracing/workers.rb +4 -2
  408. data/lib/datadog/tracing/writer.rb +5 -2
  409. data/lib/datadog/tracing.rb +8 -2
  410. data/lib/ddtrace/transport/ext.rb +22 -14
  411. data/lib/ddtrace/version.rb +9 -12
  412. data/lib/ddtrace.rb +1 -1
  413. metadata +157 -139
  414. data/ext/ddtrace_profiling_native_extension/libdatadog_helpers.h +0 -25
  415. data/ext/ddtrace_profiling_native_extension/ruby_helpers.c +0 -110
  416. data/ext/ddtrace_profiling_native_extension/stack_recorder.c +0 -591
  417. data/ext/ddtrace_profiling_native_extension/stack_recorder.h +0 -14
  418. data/ext/ddtrace_profiling_native_extension/time_helpers.c +0 -17
  419. data/ext/ddtrace_profiling_native_extension/time_helpers.h +0 -10
  420. data/lib/datadog/ci/configuration/components.rb +0 -32
  421. data/lib/datadog/ci/configuration/settings.rb +0 -53
  422. data/lib/datadog/ci/contrib/cucumber/configuration/settings.rb +0 -33
  423. data/lib/datadog/ci/contrib/cucumber/ext.rb +0 -20
  424. data/lib/datadog/ci/contrib/cucumber/formatter.rb +0 -94
  425. data/lib/datadog/ci/contrib/cucumber/instrumentation.rb +0 -28
  426. data/lib/datadog/ci/contrib/cucumber/integration.rb +0 -47
  427. data/lib/datadog/ci/contrib/rspec/configuration/settings.rb +0 -33
  428. data/lib/datadog/ci/contrib/rspec/example.rb +0 -68
  429. data/lib/datadog/ci/contrib/rspec/ext.rb +0 -19
  430. data/lib/datadog/ci/contrib/rspec/integration.rb +0 -48
  431. data/lib/datadog/ci/contrib/rspec/patcher.rb +0 -27
  432. data/lib/datadog/ci/ext/app_types.rb +0 -9
  433. data/lib/datadog/ci/ext/environment.rb +0 -575
  434. data/lib/datadog/ci/ext/settings.rb +0 -10
  435. data/lib/datadog/ci/ext/test.rb +0 -35
  436. data/lib/datadog/ci/extensions.rb +0 -19
  437. data/lib/datadog/ci/flush.rb +0 -38
  438. data/lib/datadog/ci/test.rb +0 -81
  439. data/lib/datadog/ci.rb +0 -20
  440. data/lib/datadog/core/configuration/dependency_resolver.rb +0 -28
  441. data/lib/datadog/core/configuration/option_definition_set.rb +0 -22
  442. data/lib/datadog/core/configuration/option_set.rb +0 -10
  443. data/lib/datadog/core/telemetry/collector.rb +0 -231
  444. data/lib/datadog/core/telemetry/v1/app_event.rb +0 -52
  445. data/lib/datadog/core/telemetry/v1/application.rb +0 -92
  446. data/lib/datadog/core/telemetry/v1/configuration.rb +0 -25
  447. data/lib/datadog/core/telemetry/v1/dependency.rb +0 -43
  448. data/lib/datadog/core/telemetry/v1/host.rb +0 -59
  449. data/lib/datadog/core/telemetry/v1/integration.rb +0 -64
  450. data/lib/datadog/core/telemetry/v1/product.rb +0 -36
  451. data/lib/datadog/core/telemetry/v1/telemetry_request.rb +0 -106
  452. data/lib/datadog/core/transport/config.rb +0 -58
  453. data/lib/datadog/core/transport/http/api.rb +0 -57
  454. data/lib/datadog/core/transport/http/client.rb +0 -45
  455. data/lib/datadog/core/transport/http/config.rb +0 -268
  456. data/lib/datadog/core/transport/http/negotiation.rb +0 -144
  457. data/lib/datadog/core/transport/http.rb +0 -169
  458. data/lib/datadog/core/utils/object_set.rb +0 -43
  459. data/lib/datadog/core/utils/string_table.rb +0 -47
  460. data/lib/datadog/profiling/backtrace_location.rb +0 -34
  461. data/lib/datadog/profiling/buffer.rb +0 -43
  462. data/lib/datadog/profiling/collectors/old_stack.rb +0 -301
  463. data/lib/datadog/profiling/encoding/profile.rb +0 -41
  464. data/lib/datadog/profiling/event.rb +0 -15
  465. data/lib/datadog/profiling/events/stack.rb +0 -82
  466. data/lib/datadog/profiling/old_recorder.rb +0 -107
  467. data/lib/datadog/profiling/pprof/builder.rb +0 -125
  468. data/lib/datadog/profiling/pprof/converter.rb +0 -102
  469. data/lib/datadog/profiling/pprof/message_set.rb +0 -16
  470. data/lib/datadog/profiling/pprof/payload.rb +0 -20
  471. data/lib/datadog/profiling/pprof/pprof.proto +0 -212
  472. data/lib/datadog/profiling/pprof/pprof_pb.rb +0 -81
  473. data/lib/datadog/profiling/pprof/stack_sample.rb +0 -139
  474. data/lib/datadog/profiling/pprof/string_table.rb +0 -12
  475. data/lib/datadog/profiling/pprof/template.rb +0 -118
  476. data/lib/datadog/profiling/trace_identifiers/ddtrace.rb +0 -43
  477. data/lib/datadog/profiling/trace_identifiers/helper.rb +0 -45
  478. data/lib/datadog/tracing/contrib/sinatra/headers.rb +0 -35
  479. data/lib/ddtrace/transport/http/adapters/net.rb +0 -168
  480. data/lib/ddtrace/transport/http/adapters/registry.rb +0 -27
  481. data/lib/ddtrace/transport/http/adapters/test.rb +0 -85
  482. data/lib/ddtrace/transport/http/adapters/unix_socket.rb +0 -77
  483. data/lib/ddtrace/transport/http/api/endpoint.rb +0 -29
  484. data/lib/ddtrace/transport/http/api/fallbacks.rb +0 -24
  485. data/lib/ddtrace/transport/http/api/instance.rb +0 -35
  486. data/lib/ddtrace/transport/http/api/map.rb +0 -16
  487. data/lib/ddtrace/transport/http/api/spec.rb +0 -17
  488. data/lib/ddtrace/transport/http/api.rb +0 -39
  489. data/lib/ddtrace/transport/http/builder.rb +0 -176
  490. data/lib/ddtrace/transport/http/client.rb +0 -52
  491. data/lib/ddtrace/transport/http/env.rb +0 -58
  492. data/lib/ddtrace/transport/http/response.rb +0 -58
  493. data/lib/ddtrace/transport/http/statistics.rb +0 -43
  494. data/lib/ddtrace/transport/http/traces.rb +0 -144
  495. data/lib/ddtrace/transport/http.rb +0 -117
  496. data/lib/ddtrace/transport/io/client.rb +0 -85
  497. data/lib/ddtrace/transport/io/response.rb +0 -25
  498. data/lib/ddtrace/transport/io/traces.rb +0 -99
  499. data/lib/ddtrace/transport/io.rb +0 -28
  500. data/lib/ddtrace/transport/parcel.rb +0 -20
  501. data/lib/ddtrace/transport/request.rb +0 -15
  502. data/lib/ddtrace/transport/response.rb +0 -60
  503. data/lib/ddtrace/transport/serializable_trace.rb +0 -122
  504. data/lib/ddtrace/transport/statistics.rb +0 -75
  505. data/lib/ddtrace/transport/trace_formatter.rb +0 -198
  506. data/lib/ddtrace/transport/traces.rb +0 -216
  507. /data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/collectors_idle_sampling_helper.h +0 -0
  508. /data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/setup_signal_handler.c +0 -0
  509. /data/ext/{ddtrace_profiling_native_extension → datadog_profiling_native_extension}/setup_signal_handler.h +0 -0
@@ -1,61 +1,279 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative '../utils/safe_dup'
4
+
3
5
  module Datadog
4
6
  module Core
5
7
  module Configuration
6
8
  # Represents an instance of an integration configuration option
7
9
  # @public_api
8
10
  class Option
9
- attr_reader \
10
- :definition
11
+ # @!attribute [r] definition
12
+ # The definition object that matches this option.
13
+ # @return [Configuration::OptionDefinition]
14
+ # @!attribute [r] precedence_set
15
+ # When this option was last set, what was the value precedence used?
16
+ # @return [Precedence::Value]
17
+ attr_reader :definition, :precedence_set
18
+
19
+ # Option setting precedence.
20
+ module Precedence
21
+ # Represents an Option precedence level.
22
+ # Each precedence has a `numeric` value; higher values means higher precedence.
23
+ # `name` is for inspection purposes only.
24
+ Value = Struct.new(:numeric, :name) do
25
+ include Comparable
26
+
27
+ def <=>(other)
28
+ return nil unless other.is_a?(Value)
29
+
30
+ numeric <=> other.numeric
31
+ end
32
+ end
33
+
34
+ # Remote configuration provided through the Datadog app.
35
+ REMOTE_CONFIGURATION = Value.new(2, :remote_configuration).freeze
36
+
37
+ # Configuration provided in Ruby code, in this same process
38
+ # or via Environment variable
39
+ PROGRAMMATIC = Value.new(1, :programmatic).freeze
40
+
41
+ # Configuration that comes from default values
42
+ DEFAULT = Value.new(0, :default).freeze
43
+
44
+ # All precedences, sorted from highest to lowest
45
+ LIST = [REMOTE_CONFIGURATION, PROGRAMMATIC, DEFAULT].sort.reverse.freeze
46
+ end
11
47
 
12
48
  def initialize(definition, context)
13
49
  @definition = definition
14
50
  @context = context
15
51
  @value = nil
16
52
  @is_set = false
53
+
54
+ # One value is stored per precedence, to allow unsetting a higher
55
+ # precedence value and falling back to a lower precedence one.
56
+ @value_per_precedence = Hash.new(UNSET)
57
+
58
+ # Lowest precedence, to allow for `#set` to always succeed for a brand new `Option` instance.
59
+ @precedence_set = Precedence::DEFAULT
17
60
  end
18
61
 
19
- def set(value)
20
- old_value = @value
21
- (@value = context_exec(value, old_value, &definition.setter)).tap do |v|
22
- @is_set = true
23
- context_exec(v, old_value, &definition.on_set) if definition.on_set
62
+ # Overrides the current value for this option if the `precedence` is equal or higher than
63
+ # the previously set value.
64
+ # The first call to `#set` will always store the value regardless of precedence.
65
+ #
66
+ # @param value [Object] the new value to be associated with this option
67
+ # @param precedence [Precedence] from what precedence order this new value comes from
68
+ def set(value, precedence: Precedence::PROGRAMMATIC)
69
+ # Is there a higher precedence value set?
70
+ if @precedence_set > precedence
71
+ # This should be uncommon, as higher precedence values tend to
72
+ # happen later in the application lifecycle.
73
+ Datadog.logger.info do
74
+ "Option '#{definition.name}' not changed to '#{value}' (precedence: #{precedence.name}) because the higher " \
75
+ "precedence value '#{@value}' (precedence: #{@precedence_set.name}) was already set."
76
+ end
77
+
78
+ # But if it happens, we have to store the lower precedence value `value`
79
+ # because it's possible to revert to it by `#unset`ting
80
+ # the existing, higher-precedence value.
81
+ # Effectively, we always store one value pre precedence.
82
+ @value_per_precedence[precedence] = value
83
+
84
+ return @value
24
85
  end
86
+
87
+ internal_set(value, precedence)
88
+ end
89
+
90
+ def unset(precedence)
91
+ @value_per_precedence[precedence] = UNSET
92
+
93
+ # If we are unsetting the currently active value, we have to restore
94
+ # a lower precedence one...
95
+ if precedence == @precedence_set
96
+ # Find a lower precedence value that is already set.
97
+ Precedence::LIST.each do |p|
98
+ # DEV: This search can be optimized, but the list is small, and unset is
99
+ # DEV: only called from direct user interaction in the Datadog UI.
100
+ next unless p < precedence
101
+
102
+ # Look for value that is set.
103
+ # The hash `@value_per_precedence` has a custom default value of `UNSET`.
104
+ if (value = @value_per_precedence[p]) != UNSET
105
+ internal_set(value, p)
106
+ return nil
107
+ end
108
+ end
109
+
110
+ # If no value is left to fall back on, reset this option
111
+ reset
112
+ end
113
+
114
+ # ... otherwise, we are either unsetting a higher precedence value that is not
115
+ # yet set, thus there's nothing to do; or we are unsetting a lower precedence
116
+ # value, which also does not change the current value.
25
117
  end
26
118
 
27
119
  def get
28
120
  if @is_set
29
121
  @value
30
- elsif definition.delegate_to
31
- context_eval(&definition.delegate_to)
32
122
  else
33
- set(default_value)
123
+ set_value_from_env_or_default
34
124
  end
35
125
  end
36
126
 
37
127
  def reset
38
- @value = if definition.resetter
39
- # Don't change @is_set to false; custom resetters are
40
- # responsible for changing @value back to a good state.
41
- # Setting @is_set = false would cause a default to be applied.
42
- context_exec(@value, &definition.resetter)
43
- else
44
- @is_set = false
45
- nil
46
- end
128
+ @value = if definition.resetter
129
+ # Don't change @is_set to false; custom resetters are
130
+ # responsible for changing @value back to a good state.
131
+ # Setting @is_set = false would cause a default to be applied.
132
+ context_exec(@value, &definition.resetter)
133
+ else
134
+ @is_set = false
135
+ nil
136
+ end
137
+
138
+ # Reset back to the lowest precedence, to allow all `set`s to succeed right after a reset.
139
+ @precedence_set = Precedence::DEFAULT
140
+ # Reset all stored values
141
+ @value_per_precedence = Hash.new(UNSET)
47
142
  end
48
143
 
49
144
  def default_value
50
- if definition.lazy
145
+ if definition.default.instance_of?(Proc)
51
146
  context_eval(&definition.default)
52
147
  else
53
- definition.default
148
+ definition.default_proc || Core::Utils::SafeDup.frozen_or_dup(definition.default)
54
149
  end
55
150
  end
56
151
 
152
+ def default_precedence?
153
+ precedence_set == Precedence::DEFAULT
154
+ end
155
+
57
156
  private
58
157
 
158
+ def coerce_env_variable(value)
159
+ return context_exec(value, &@definition.env_parser) if @definition.env_parser
160
+
161
+ case @definition.type
162
+ when :hash
163
+ values = value.split(',') # By default we only want to support comma separated strings
164
+
165
+ values.map! do |v|
166
+ v.gsub!(/\A[\s,]*|[\s,]*\Z/, '')
167
+
168
+ v.empty? ? nil : v
169
+ end
170
+
171
+ values.compact!
172
+ values.each.with_object({}) do |v, hash|
173
+ pair = v.split(':', 2)
174
+ hash[pair[0]] = pair[1]
175
+ end
176
+ when :int
177
+ # DEV-2.0: Change to a more strict coercion method. Integer(value).
178
+ value.to_i
179
+ when :float
180
+ # DEV-2.0: Change to a more strict coercion method. Float(value).
181
+ value.to_f
182
+ when :array
183
+ values = value.split(',')
184
+
185
+ values.map! do |v|
186
+ v.gsub!(/\A[\s,]*|[\s,]*\Z/, '')
187
+
188
+ v.empty? ? nil : v
189
+ end
190
+
191
+ values.compact!
192
+ values
193
+ when :bool
194
+ string_value = value.strip
195
+ string_value = string_value.downcase
196
+ string_value == 'true' || string_value == '1' # rubocop:disable Style/MultipleComparison
197
+ when :string, NilClass
198
+ value
199
+ else
200
+ raise ArgumentError,
201
+ "The option #{@definition.name} is using an unsupported type option for env coercion `#{@definition.type}`"
202
+ end
203
+ end
204
+
205
+ def validate_type(value)
206
+ return value if skip_validation?
207
+
208
+ raise_error = false
209
+
210
+ valid_type = validate(@definition.type, value)
211
+
212
+ unless valid_type
213
+ raise_error = if @definition.type_options[:nilable]
214
+ !value.is_a?(NilClass)
215
+ else
216
+ true
217
+ end
218
+ end
219
+
220
+ if raise_error
221
+ error_msg = if @definition.type_options[:nilable]
222
+ "The setting `#{@definition.name}` inside your app's `Datadog.configure` block expects a "\
223
+ "#{@definition.type} or `nil`, but a `#{value.class}` was provided (#{value.inspect})."\
224
+ else
225
+ "The setting `#{@definition.name}` inside your app's `Datadog.configure` block expects a "\
226
+ "#{@definition.type}, but a `#{value.class}` was provided (#{value.inspect})."\
227
+ end
228
+
229
+ error_msg = "#{error_msg} Please update your `configure` block. "\
230
+ 'Alternatively, you can disable this validation using the '\
231
+ '`DD_EXPERIMENTAL_SKIP_CONFIGURATION_VALIDATION=true`environment variable. '\
232
+ 'For help, please open an issue on <https://github.com/datadog/dd-trace-rb/issues/new/choose>.'
233
+
234
+ raise ArgumentError, error_msg
235
+ end
236
+
237
+ value
238
+ end
239
+
240
+ def validate(type, value)
241
+ case type
242
+ when :string
243
+ value.is_a?(String)
244
+ when :int, :float
245
+ value.is_a?(Numeric)
246
+ when :array
247
+ value.is_a?(Array)
248
+ when :hash
249
+ value.is_a?(Hash)
250
+ when :bool
251
+ value.is_a?(TrueClass) || value.is_a?(FalseClass)
252
+ when :proc
253
+ value.is_a?(Proc)
254
+ when :symbol
255
+ value.is_a?(Symbol)
256
+ when NilClass
257
+ true # No validation is performed when option is typeless
258
+ else
259
+ raise ArgumentError, "The option #{@definition.name} is using an unsupported type option `#{@definition.type}`"
260
+ end
261
+ end
262
+
263
+ # Directly manipulates the current value and currently set precedence.
264
+ def internal_set(value, precedence)
265
+ old_value = @value
266
+ (@value = context_exec(validate_type(value), old_value, &definition.setter)).tap do |v|
267
+ @is_set = true
268
+ @precedence_set = precedence
269
+ # Store original value to ensure we can always safely call `#internal_set`
270
+ # when restoring a value from `@value_per_precedence`, and we are only running `definition.setter`
271
+ # on the original value, not on a valud that has already been processed by `definition.setter`.
272
+ @value_per_precedence[precedence] = value
273
+ context_exec(v, old_value, precedence, &definition.after_set) if definition.after_set
274
+ end
275
+ end
276
+
59
277
  def context_exec(*args, &block)
60
278
  @context.instance_exec(*args, &block)
61
279
  end
@@ -63,6 +281,38 @@ module Datadog
63
281
  def context_eval(&block)
64
282
  @context.instance_eval(&block)
65
283
  end
284
+
285
+ def set_value_from_env_or_default
286
+ value = nil
287
+ precedence = nil
288
+
289
+ if definition.env && ENV[definition.env]
290
+ value = coerce_env_variable(ENV[definition.env])
291
+ precedence = Precedence::PROGRAMMATIC
292
+ end
293
+
294
+ if value.nil? && definition.deprecated_env && ENV[definition.deprecated_env]
295
+ value = coerce_env_variable(ENV[definition.deprecated_env])
296
+ precedence = Precedence::PROGRAMMATIC
297
+
298
+ Datadog::Core.log_deprecation do
299
+ "#{definition.deprecated_env} environment variable is deprecated, use #{definition.env} instead."
300
+ end
301
+ end
302
+
303
+ option_value = value.nil? ? default_value : value
304
+
305
+ set(option_value, precedence: precedence || Precedence::DEFAULT)
306
+ end
307
+
308
+ def skip_validation?
309
+ ['true', '1'].include?(ENV.fetch('DD_EXPERIMENTAL_SKIP_CONFIGURATION_VALIDATION', '').strip)
310
+ end
311
+
312
+ # Anchor object that represents a value that is not set.
313
+ # This is necessary because `nil` is a valid value to be set.
314
+ UNSET = Object.new
315
+ private_constant :UNSET
66
316
  end
67
317
  end
68
318
  end
@@ -11,25 +11,29 @@ module Datadog
11
11
 
12
12
  attr_reader \
13
13
  :default,
14
- :delegate_to,
15
- :depends_on,
16
- :lazy,
14
+ :default_proc,
15
+ :env,
16
+ :deprecated_env,
17
+ :env_parser,
17
18
  :name,
18
- :on_set,
19
+ :after_set,
19
20
  :resetter,
20
21
  :setter,
21
- :type
22
+ :type,
23
+ :type_options
22
24
 
23
25
  def initialize(name, meta = {}, &block)
24
26
  @default = meta[:default]
25
- @delegate_to = meta[:delegate_to]
26
- @depends_on = meta[:depends_on] || []
27
- @lazy = meta[:lazy] || false
27
+ @default_proc = meta[:default_proc]
28
+ @env = meta[:env]
29
+ @deprecated_env = meta[:deprecated_env]
30
+ @env_parser = meta[:env_parser]
28
31
  @name = name.to_sym
29
- @on_set = meta[:on_set]
32
+ @after_set = meta[:after_set]
30
33
  @resetter = meta[:resetter]
31
34
  @setter = meta[:setter] || block || IDENTITY
32
35
  @type = meta[:type]
36
+ @type_options = meta[:type_options]
33
37
  end
34
38
 
35
39
  # Creates a new Option, bound to the context provided.
@@ -40,50 +44,69 @@ module Datadog
40
44
  # Acts as DSL for building OptionDefinitions
41
45
  # @public_api
42
46
  class Builder
47
+ class InvalidOptionError < StandardError; end
48
+
43
49
  attr_reader \
44
50
  :helpers
45
51
 
46
52
  def initialize(name, options = {})
53
+ @env = nil
54
+ @deprecated_env = nil
55
+ @env_parser = nil
47
56
  @default = nil
48
- @delegate_to = nil
49
- @depends_on = []
57
+ @default_proc = nil
50
58
  @helpers = {}
51
- @lazy = false
52
59
  @name = name.to_sym
53
- @on_set = nil
60
+ @after_set = nil
54
61
  @resetter = nil
55
62
  @setter = OptionDefinition::IDENTITY
56
63
  @type = nil
57
-
64
+ @type_options = {}
58
65
  # If options were supplied, apply them.
59
66
  apply_options!(options)
60
67
 
61
68
  # Apply block if given.
62
69
  yield(self) if block_given?
70
+
71
+ validate_options!
63
72
  end
64
73
 
65
- def depends_on(*values)
66
- @depends_on = values.flatten
74
+ def env(value)
75
+ @env = value
76
+ end
77
+
78
+ def deprecated_env(value)
79
+ @deprecated_env = value
80
+ end
81
+
82
+ def env_parser(&block)
83
+ @env_parser = block
67
84
  end
68
85
 
69
86
  def default(value = nil, &block)
70
87
  @default = block || value
71
88
  end
72
89
 
73
- def delegate_to(&block)
74
- @delegate_to = block
90
+ def default_proc(&block)
91
+ @default_proc = block
75
92
  end
76
93
 
77
94
  def helper(name, *_args, &block)
78
95
  @helpers[name] = block
79
96
  end
80
97
 
81
- def lazy(value = true)
82
- @lazy = value
98
+ def lazy(_value = true)
99
+ Datadog::Core.log_deprecation do
100
+ 'Defining an option as lazy is deprecated for removal. Options now always behave as lazy. '\
101
+ "Please remove all references to the lazy setting.\n"\
102
+ 'Non-lazy options that were previously stored as blocks are no longer supported. '\
103
+ 'If you used this feature, please let us know by opening an issue on: '\
104
+ 'https://github.com/datadog/dd-trace-rb/issues/new so we can better understand and support your use case.'
105
+ end
83
106
  end
84
107
 
85
- def on_set(&block)
86
- @on_set = block
108
+ def after_set(&block)
109
+ @after_set = block
87
110
  end
88
111
 
89
112
  def resetter(&block)
@@ -94,8 +117,11 @@ module Datadog
94
117
  @setter = block
95
118
  end
96
119
 
97
- def type(value = nil)
120
+ def type(value, nilable: false)
98
121
  @type = value
122
+ @type_options = { nilable: nilable }
123
+
124
+ value
99
125
  end
100
126
 
101
127
  # For applying options for OptionDefinition
@@ -103,13 +129,15 @@ module Datadog
103
129
  return if options.nil? || options.empty?
104
130
 
105
131
  default(options[:default]) if options.key?(:default)
106
- delegate_to(&options[:delegate_to]) if options.key?(:delegate_to)
107
- depends_on(*options[:depends_on]) if options.key?(:depends_on)
132
+ default_proc(&options[:default_proc]) if options.key?(:default_proc)
133
+ env(options[:env]) if options.key?(:env)
134
+ deprecated_env(options[:deprecated_env]) if options.key?(:deprecated_env)
135
+ env_parser(&options[:env_parser]) if options.key?(:env_parser)
108
136
  lazy(options[:lazy]) if options.key?(:lazy)
109
- on_set(&options[:on_set]) if options.key?(:on_set)
137
+ after_set(&options[:after_set]) if options.key?(:after_set)
110
138
  resetter(&options[:resetter]) if options.key?(:resetter)
111
139
  setter(&options[:setter]) if options.key?(:setter)
112
- type(&options[:type]) if options.key?(:type)
140
+ type(options[:type], **(options[:type_options] || {})) if options.key?(:type)
113
141
  end
114
142
 
115
143
  def to_definition
@@ -119,15 +147,28 @@ module Datadog
119
147
  def meta
120
148
  {
121
149
  default: @default,
122
- delegate_to: @delegate_to,
123
- depends_on: @depends_on,
124
- lazy: @lazy,
125
- on_set: @on_set,
150
+ default_proc: @default_proc,
151
+ env: @env,
152
+ deprecated_env: @deprecated_env,
153
+ env_parser: @env_parser,
154
+ after_set: @after_set,
126
155
  resetter: @resetter,
127
156
  setter: @setter,
128
- type: @type
157
+ type: @type,
158
+ type_options: @type_options
129
159
  }
130
160
  end
161
+
162
+ private
163
+
164
+ def validate_options!
165
+ if !@default.nil? && @default_proc
166
+ raise InvalidOptionError,
167
+ 'Using `default` and `default_proc` is not allowed. Please use one or the other.' \
168
+ 'If you want to store a block as the default value use `default_proc`'\
169
+ ' otherwise use `default`'
170
+ end
171
+ end
131
172
  end
132
173
  end
133
174
  end
@@ -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)