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,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'date'
2
4
  require 'json'
3
5
  require 'rbconfig'
@@ -5,280 +7,174 @@ require 'rbconfig'
5
7
  module Datadog
6
8
  module Core
7
9
  module Diagnostics
8
- # A holistic collection of the environment in which ddtrace is running.
9
- # This logger should allow for easy reporting by users to Datadog support.
10
- #
11
- module EnvironmentLogger
12
- class << self
13
- # Outputs environment information to {Datadog.logger}.
14
- # Executes only once for the lifetime of the program.
15
- def log!(transport_responses)
16
- return if (defined?(@executed) && @executed) || !log?
17
-
18
- @executed = true
19
-
20
- data = EnvironmentCollector.new.collect!(transport_responses)
21
- data.reject! { |_, v| v.nil? } # Remove empty values from hash output
22
-
23
- log_environment!(data.to_json)
24
- log_error!('Agent Error'.freeze, data[:agent_error]) if data[:agent_error]
25
- rescue => e
26
- Datadog.logger.warn("Failed to collect environment information: #{e} Location: #{Array(e.backtrace).first}")
27
- end
28
-
29
- private
30
-
31
- def log_environment!(line)
32
- Datadog.logger.info("DATADOG CONFIGURATION - #{line}")
33
- end
34
-
35
- def log_error!(type, error)
36
- Datadog.logger.warn("DATADOG DIAGNOSTIC - #{type}: #{error}")
37
- end
38
-
39
- # Are we logging the environment data?
40
- def log?
41
- startup_logs_enabled = Datadog.configuration.diagnostics.startup_logs.enabled
42
- if startup_logs_enabled.nil?
43
- !repl? # Suppress logs if we running in a REPL
44
- else
45
- startup_logs_enabled
46
- end
47
- end
48
-
49
- REPL_PROGRAM_NAMES = %w[irb pry].freeze
50
-
51
- def repl?
52
- REPL_PROGRAM_NAMES.include?($PROGRAM_NAME)
53
- end
54
- end
55
- end
56
-
57
- # Collects environment information for diagnostic logging
58
- class EnvironmentCollector
59
- # @return [String] current time in ISO8601 format
60
- def date
61
- DateTime.now.iso8601
62
- end
63
-
64
- # Best portable guess of OS information.
65
- # @return [String] platform string
66
- def os_name
67
- RbConfig::CONFIG['host'.freeze]
10
+ # Base class for EnvironmentLoggers - should allow for easy reporting by users to Datadog support.
11
+ module EnvironmentLogging
12
+ def log_configuration!(prefix, data)
13
+ logger.info("DATADOG CONFIGURATION - #{prefix} - #{data}")
68
14
  end
69
15
 
70
- # @return [String] ddtrace version
71
- def version
72
- DDTrace::VERSION::STRING
16
+ def log_error!(prefix, type, error)
17
+ logger.warn("DATADOG ERROR - #{prefix} - #{type}: #{error}")
73
18
  end
74
19
 
75
- # @return [String] "ruby"
76
- def lang
77
- Core::Environment::Ext::LANG
78
- end
20
+ protected
79
21
 
80
- # Supported Ruby language version.
81
- # Will be distinct from VM version for non-MRI environments.
82
- # @return [String]
83
- def lang_version
84
- Core::Environment::Ext::LANG_VERSION
22
+ def logger
23
+ Datadog.logger
85
24
  end
86
25
 
87
- # @return [String] configured application environment
88
- def env
89
- Datadog.configuration.env
90
- end
26
+ # If logger should log and hasn't logged already, then output environment configuration and possible errors.
27
+ def log_once!
28
+ # Check if already been executed
29
+ return false if (defined?(@executed) && @executed) || !log?
91
30
 
92
- # @return [Boolean, nil]
93
- def enabled
94
- Datadog.configuration.tracing.enabled
95
- end
31
+ yield if block_given?
96
32
 
97
- # @return [String] configured application service name
98
- def service
99
- Datadog.configuration.service
33
+ @executed = true
100
34
  end
101
35
 
102
- # @return [String] configured application version
103
- def dd_version
104
- Datadog.configuration.version
105
- end
106
-
107
- # @return [String, nil] target agent URL for trace flushing
108
- def agent_url
109
- # Retrieve the effect agent URL, regardless of how it was configured
110
- transport = Tracing.send(:tracer).writer.transport
111
-
112
- # return `nil` with IO transport
113
- return unless transport.respond_to?(:client)
114
-
115
- adapter = transport.client.api.adapter
116
- adapter.url
36
+ # Are we logging the environment data?
37
+ def log?
38
+ startup_logs_enabled = Datadog.configuration.diagnostics.startup_logs.enabled
39
+ if startup_logs_enabled.nil?
40
+ !repl? && !rspec? # Suppress logs if we are running in a REPL or rspec
41
+ else
42
+ startup_logs_enabled
43
+ end
117
44
  end
118
45
 
119
- # Error returned by Datadog agent during a tracer flush attempt
120
- # @return [String] concatenated list of transport errors
121
- def agent_error(transport_responses)
122
- error_responses = transport_responses.reject(&:ok?)
46
+ REPL_PROGRAM_NAMES = %w[irb pry].freeze
123
47
 
124
- return nil if error_responses.empty?
125
-
126
- error_responses.map(&:inspect).join(','.freeze)
127
- end
128
-
129
- # @return [Boolean, nil] debug mode enabled in configuration
130
- def debug
131
- !!Datadog.configuration.diagnostics.debug
48
+ def repl?
49
+ REPL_PROGRAM_NAMES.include?($PROGRAM_NAME)
132
50
  end
133
51
 
134
- # @return [Boolean, nil] analytics enabled in configuration
135
- def analytics_enabled
136
- !!Datadog.configuration.tracing.analytics.enabled
52
+ def rspec?
53
+ $PROGRAM_NAME.end_with?('rspec')
137
54
  end
55
+ end
138
56
 
139
- # @return [Numeric, nil] tracer sample rate configured
140
- def sample_rate
141
- sampler = Datadog.configuration.tracing.sampler
142
- return nil unless sampler
57
+ # Collects and logs Core diagnostic information
58
+ module EnvironmentLogger
59
+ extend EnvironmentLogging
143
60
 
144
- sampler.sample_rate(nil) rescue nil
61
+ def self.collect_and_log!
62
+ log_once! do
63
+ data = EnvironmentCollector.collect_config!
64
+ log_configuration!('CORE', data.to_json)
65
+ end
66
+ rescue => e
67
+ logger.warn("Failed to collect core environment information: #{e} Location: #{Array(e.backtrace).first}")
145
68
  end
69
+ end
146
70
 
147
- # DEV: We currently only support SimpleRule instances.
148
- # DEV: These are the most commonly used rules.
149
- # DEV: We should expand support for other rules in the future,
150
- # DEV: although it is tricky to serialize arbitrary rules.
151
- #
152
- # @return [Hash, nil] sample rules configured
153
- def sampling_rules
154
- sampler = Datadog.configuration.tracing.sampler
155
- return nil unless sampler.is_a?(Tracing::Sampling::PrioritySampler) &&
156
- sampler.priority_sampler.is_a?(Tracing::Sampling::RuleSampler)
157
-
158
- sampler.priority_sampler.rules.map do |rule|
159
- next unless rule.is_a?(Tracing::Sampling::SimpleRule)
160
-
71
+ # Collects environment information for Core diagnostic logging
72
+ module EnvironmentCollector
73
+ class << self
74
+ def collect_config!
161
75
  {
162
- name: rule.matcher.name,
163
- service: rule.matcher.service,
164
- sample_rate: rule.sampler.sample_rate(nil)
76
+ date: date,
77
+ os_name: os_name,
78
+ version: version,
79
+ lang: lang,
80
+ lang_version: lang_version,
81
+ env: env,
82
+ service: service,
83
+ dd_version: dd_version,
84
+ debug: debug,
85
+ tags: tags,
86
+ runtime_metrics_enabled: runtime_metrics_enabled,
87
+ vm: vm,
88
+ health_metrics_enabled: health_metrics_enabled
165
89
  }
166
- end.compact
167
- end
168
-
169
- # @return [Hash, nil] concatenated list of global tracer tags configured
170
- def tags
171
- tags = Datadog.configuration.tags
172
- return nil if tags.empty?
90
+ end
173
91
 
174
- hash_serializer(tags)
175
- end
92
+ # @return [String] current time in ISO8601 format
93
+ def date
94
+ DateTime.now.iso8601
95
+ end
176
96
 
177
- # @return [Boolean, nil] runtime metrics enabled in configuration
178
- def runtime_metrics_enabled
179
- Datadog.configuration.runtime_metrics.enabled
180
- end
97
+ # Best portable guess of OS information.
98
+ # @return [String] platform string
99
+ def os_name
100
+ RbConfig::CONFIG['host']
101
+ end
181
102
 
182
- # Concatenated list of integrations activated, with their gem version.
183
- # Example: "rails@6.0.3,rack@2.2.3"
184
- #
185
- # @return [String, nil]
186
- def integrations_loaded
187
- integrations = instrumented_integrations
188
- return if integrations.empty?
103
+ # @return [String] ddtrace version
104
+ def version
105
+ DDTrace::VERSION::STRING
106
+ end
189
107
 
190
- integrations.map { |name, integration| "#{name}@#{integration.class.version}" }.join(','.freeze)
191
- end
108
+ # @return [String] "ruby"
109
+ def lang
110
+ Core::Environment::Ext::LANG
111
+ end
192
112
 
193
- # Ruby VM name and version.
194
- # Examples: "ruby-2.7.1", "jruby-9.2.11.1", "truffleruby-20.1.0"
195
- # @return [String, nil]
196
- def vm
197
- # RUBY_ENGINE_VERSION returns the VM version, which
198
- # will differ from RUBY_VERSION for non-mri VMs.
199
- if defined?(RUBY_ENGINE_VERSION)
200
- "#{RUBY_ENGINE}-#{RUBY_ENGINE_VERSION}"
201
- else
202
- # Ruby < 2.3 doesn't support RUBY_ENGINE_VERSION
203
- "#{RUBY_ENGINE}-#{RUBY_VERSION}"
113
+ # Supported Ruby language version.
114
+ # Will be distinct from VM version for non-MRI environments.
115
+ # @return [String]
116
+ def lang_version
117
+ Core::Environment::Ext::LANG_VERSION
204
118
  end
205
- end
206
119
 
207
- # @return [Boolean, nil] partial flushing enabled in configuration
208
- def partial_flushing_enabled
209
- !!Datadog.configuration.tracing.partial_flush.enabled
210
- end
120
+ # @return [String] configured application environment
121
+ def env
122
+ Datadog.configuration.env
123
+ end
211
124
 
212
- # @return [Boolean, nil] priority sampling enabled in configuration
213
- def priority_sampling_enabled
214
- !!Datadog.configuration.tracing.priority_sampling
215
- end
125
+ # @return [String] configured application service name
126
+ def service
127
+ Datadog.configuration.service
128
+ end
216
129
 
217
- # @return [Boolean, nil] health metrics enabled in configuration
218
- def health_metrics_enabled
219
- !!Datadog.configuration.diagnostics.health_metrics.enabled
220
- end
130
+ # @return [String] configured application version
131
+ def dd_version
132
+ Datadog.configuration.version
133
+ end
221
134
 
222
- def profiling_enabled
223
- !!Datadog.configuration.profiling.enabled
224
- end
135
+ # @return [Boolean, nil] debug mode enabled in configuration
136
+ def debug
137
+ !!Datadog.configuration.diagnostics.debug
138
+ end
225
139
 
226
- # TODO: Populate when automatic log correlation is implemented
227
- # def logs_correlation_enabled
228
- # end
140
+ # @return [Hash, nil] concatenated list of global tracer tags configured
141
+ def tags
142
+ tags = Datadog.configuration.tags
143
+ return nil if tags.empty?
229
144
 
230
- # @return [Hash] environment information available at call time
231
- def collect!(transport_responses)
232
- {
233
- date: date,
234
- os_name: os_name,
235
- version: version,
236
- lang: lang,
237
- lang_version: lang_version,
238
- env: env,
239
- enabled: enabled,
240
- service: service,
241
- dd_version: dd_version,
242
- agent_url: agent_url,
243
- agent_error: agent_error(transport_responses),
244
- debug: debug,
245
- analytics_enabled: analytics_enabled,
246
- sample_rate: sample_rate,
247
- sampling_rules: sampling_rules,
248
- tags: tags,
249
- runtime_metrics_enabled: runtime_metrics_enabled,
250
- integrations_loaded: integrations_loaded,
251
- vm: vm,
252
- partial_flushing_enabled: partial_flushing_enabled,
253
- priority_sampling_enabled: priority_sampling_enabled,
254
- health_metrics_enabled: health_metrics_enabled,
255
- profiling_enabled: profiling_enabled,
256
- **instrumented_integrations_settings
257
- }
258
- end
145
+ hash_serializer(tags)
146
+ end
259
147
 
260
- private
148
+ # @return [Boolean, nil] runtime metrics enabled in configuration
149
+ def runtime_metrics_enabled
150
+ Datadog.configuration.runtime_metrics.enabled
151
+ end
261
152
 
262
- def instrumented_integrations
263
- Datadog.configuration.tracing.instrumented_integrations
264
- end
153
+ # Ruby VM name and version.
154
+ # Examples: "ruby-2.7.1", "jruby-9.2.11.1", "truffleruby-20.1.0"
155
+ # @return [String, nil]
156
+ def vm
157
+ # RUBY_ENGINE_VERSION returns the VM version, which
158
+ # will differ from RUBY_VERSION for non-mri VMs.
159
+ if defined?(RUBY_ENGINE_VERSION)
160
+ "#{RUBY_ENGINE}-#{RUBY_ENGINE_VERSION}"
161
+ else
162
+ # Ruby < 2.3 doesn't support RUBY_ENGINE_VERSION
163
+ "#{RUBY_ENGINE}-#{RUBY_VERSION}"
164
+ end
165
+ end
265
166
 
266
- # Capture all active integration settings into "integrationName_settingName: value" entries.
267
- def instrumented_integrations_settings
268
- instrumented_integrations.flat_map do |name, integration|
269
- integration.configuration.to_h.flat_map do |setting, value|
270
- next [] if setting == :tracer # Skip internal Ruby objects
167
+ # @return [Boolean, nil] health metrics enabled in configuration
168
+ def health_metrics_enabled
169
+ !!Datadog.configuration.diagnostics.health_metrics.enabled
170
+ end
271
171
 
272
- # Convert value to a string to avoid custom #to_json
273
- # handlers possibly causing errors.
274
- [[:"integration_#{name}_#{setting}", value.to_s]]
275
- end
276
- end.to_h
277
- end
172
+ private
278
173
 
279
- # Outputs "k1:v1,k2:v2,..."
280
- def hash_serializer(h)
281
- h.map { |k, v| "#{k}:#{v}" }.join(','.freeze)
174
+ # Outputs "k1:v1,k2:v2,..."
175
+ def hash_serializer(h)
176
+ h.map { |k, v| "#{k}:#{v}" }.join(',')
177
+ end
282
178
  end
283
179
  end
284
180
  end
@@ -0,0 +1,103 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'set'
4
+
5
+ module Datadog
6
+ module Core
7
+ module Environment
8
+ # Provides information about the execution environment on the current process.
9
+ module Execution
10
+ class << self
11
+ # Is this process running in a development environment?
12
+ # This can be used to make decisions about when to enable
13
+ # background systems like worker threads or telemetry.
14
+ def development?
15
+ !!(webmock_enabled? || repl? || test? || rails_development?)
16
+ end
17
+
18
+ # WebMock stores the reference to `Net::HTTP` with constant `OriginalNetHTTP`, and when WebMock enables,
19
+ # the adapter swaps `Net::HTTP` reference to its mock object, @webMockNetHTTP.
20
+ #
21
+ # Hence, we can detect by
22
+ # 1. Checking if `Net::HTTP` is referring to mock object
23
+ # => ::Net::HTTP.equal?(::WebMock::HttpLibAdapters::NetHttpAdapter.instance_variable_get(:@webMockNetHTTP))
24
+ #
25
+ # 2. Checking if `Net::HTTP` is referring to the original one
26
+ # => ::Net::HTTP.equal?(::WebMock::HttpLibAdapters::NetHttpAdapter::OriginalNetHTTP)
27
+ def webmock_enabled?
28
+ defined?(::WebMock::HttpLibAdapters::NetHttpAdapter) &&
29
+ defined?(::Net::HTTP) &&
30
+ ::Net::HTTP.equal?(::WebMock::HttpLibAdapters::NetHttpAdapter.instance_variable_get(:@webMockNetHTTP))
31
+ end
32
+
33
+ private
34
+
35
+ # Is this process running a test?
36
+ def test?
37
+ rspec? || minitest? || cucumber?
38
+ end
39
+
40
+ # Is this process running inside on a Read–eval–print loop?
41
+ # DEV: REPLs always set the program name to the exact REPL name.
42
+ def repl?
43
+ REPL_PROGRAM_NAMES.include?($PROGRAM_NAME)
44
+ end
45
+
46
+ REPL_PROGRAM_NAMES = %w[irb pry].freeze
47
+ private_constant :REPL_PROGRAM_NAMES
48
+
49
+ # RSpec always runs using the `rspec` file https://github.com/rspec/rspec-core/blob/main/exe/rspec
50
+ def rspec?
51
+ $PROGRAM_NAME.end_with?(RSPEC_PROGRAM_NAME)
52
+ end
53
+
54
+ RSPEC_PROGRAM_NAME = '/rspec'
55
+ private_constant :RSPEC_PROGRAM_NAME
56
+
57
+ # Check if Minitest is present and installed to run.
58
+ def minitest?
59
+ # Minitest >= 5
60
+ (defined?(::Minitest) &&
61
+ ::Minitest.class_variable_defined?(:@@installed_at_exit) &&
62
+ ::Minitest.class_variable_get(:@@installed_at_exit)) ||
63
+ # Minitest < 5
64
+ (defined?(::Minitest::Unit) &&
65
+ ::Minitest::Unit.class_variable_defined?(:@@installed_at_exit) &&
66
+ ::Minitest::Unit.class_variable_get(:@@installed_at_exit))
67
+ end
68
+
69
+ # Check if we are running from `bin/cucumber` or `cucumber/rake/task`.
70
+ def cucumber?
71
+ defined?(::Cucumber::Cli)
72
+ end
73
+
74
+ # If this is a Rails application, use different heuristics to detect
75
+ # whether this is a development environment or not.
76
+ def rails_development?
77
+ # A Rails Spring Ruby process is a bit peculiar: the process is agnostic
78
+ # whether the application is running as a console or server.
79
+ # Luckily, the Spring gem *must not* be installed in a production environment so
80
+ # detecting its presence is enough to deduct if this is a development environment.
81
+ #
82
+ # @see https://github.com/rails/spring/blob/48b299348ace2188444489a0c216a6f3e9687281/README.md?plain=1#L204-L207
83
+ defined?(::Spring) || rails_env_development?
84
+ end
85
+
86
+ RAILS_ENV_DEVELOPMENT = Set['development', 'test'].freeze
87
+ private_constant :RAILS_ENV_DEVELOPMENT
88
+
89
+ # By default, every Rails application has three environments: `development`, `test`, and `production`.
90
+ # This has been the case since Rails 3.0.0:
91
+ # https://github.com/rails/rails/blob/3e48484ff16ea07ffe5db232bf43c14992e273c1/railties/doc/guides/getting_started_with_rails/getting_started_with_rails.txt#L144
92
+ #
93
+ # Instead of checking for "not production", we instead check for "development" and "test" because
94
+ # it's common to have a custom "staging" environment, and such environment normally want to run as close
95
+ # to production as possible.
96
+ def rails_env_development?
97
+ defined?(::Rails.env) && RAILS_ENV_DEVELOPMENT.include?(::Rails.env)
98
+ end
99
+ end
100
+ end
101
+ end
102
+ end
103
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative '../../../ddtrace/version'
2
4
 
3
5
  module Datadog
@@ -13,12 +15,12 @@ module Datadog
13
15
  RUBY_VERSION
14
16
  end
15
17
 
16
- ENV_API_KEY = 'DD_API_KEY'.freeze
17
- ENV_ENVIRONMENT = 'DD_ENV'.freeze
18
- ENV_SERVICE = 'DD_SERVICE'.freeze
19
- ENV_SITE = 'DD_SITE'.freeze
20
- ENV_TAGS = 'DD_TAGS'.freeze
21
- ENV_VERSION = 'DD_VERSION'.freeze
18
+ ENV_API_KEY = 'DD_API_KEY'
19
+ ENV_ENVIRONMENT = 'DD_ENV'
20
+ ENV_SERVICE = 'DD_SERVICE'
21
+ ENV_SITE = 'DD_SITE'
22
+ ENV_TAGS = 'DD_TAGS'
23
+ ENV_VERSION = 'DD_VERSION'
22
24
  FALLBACK_SERVICE_NAME =
23
25
  begin
24
26
  File.basename($PROGRAM_NAME, '.*')
@@ -26,15 +28,15 @@ module Datadog
26
28
  'ruby'
27
29
  end.freeze
28
30
 
29
- LANG = 'ruby'.freeze
31
+ LANG = 'ruby'
30
32
  LANG_ENGINE = RUBY_ENGINE
31
- LANG_INTERPRETER = "#{RUBY_ENGINE}-#{RUBY_PLATFORM}".freeze
33
+ LANG_INTERPRETER = "#{RUBY_ENGINE}-#{RUBY_PLATFORM}"
32
34
  LANG_PLATFORM = RUBY_PLATFORM
33
35
  LANG_VERSION = RUBY_VERSION
34
36
  RUBY_ENGINE = ::RUBY_ENGINE # e.g. 'ruby', 'jruby', 'truffleruby'
35
- TAG_ENV = 'env'.freeze
36
- TAG_SERVICE = 'service'.freeze
37
- TAG_VERSION = 'version'.freeze
37
+ TAG_ENV = 'env'
38
+ TAG_SERVICE = 'service'
39
+ TAG_VERSION = 'version'
38
40
 
39
41
  # TODO: Migrate to Datadog::Tracing
40
42
  TRACER_VERSION = DDTrace::VERSION::STRING
@@ -29,75 +29,6 @@ module Datadog
29
29
  end
30
30
  end
31
31
 
32
- # Reads an environment variable as an Integer.
33
- #
34
- # @param [String] var environment variable
35
- # @param [Array<String>] var list of environment variables
36
- # @param [Integer] default the default value if the keys in `var` are not present in the environment
37
- # @param [Boolean] deprecation_warning when `var` is a list, record a deprecation log when
38
- # the first key in `var` is not used.
39
- # @return [Integer] if the environment value is a valid Integer
40
- # @return [default] if the environment value is not found
41
- def env_to_int(var, default = nil, deprecation_warning: true)
42
- var = decode_array(var, deprecation_warning)
43
- var && ENV.key?(var) ? ENV[var].to_i : default
44
- end
45
-
46
- # Reads an environment variable as a Float.
47
- #
48
- # @param [String] var environment variable
49
- # @param [Array<String>] var list of environment variables
50
- # @param [Float] default the default value if the keys in `var` are not present in the environment
51
- # @param [Boolean] deprecation_warning when `var` is a list, record a deprecation log when
52
- # the first key in `var` is not used.
53
- # @return [Float] if the environment value is a valid Float
54
- # @return [default] if the environment value is not found
55
- def env_to_float(var, default = nil, deprecation_warning: true)
56
- var = decode_array(var, deprecation_warning)
57
- var && ENV.key?(var) ? ENV[var].to_f : default
58
- end
59
-
60
- # Parses comma- or space-separated lists.
61
- #
62
- # If a comma is present, then the list is considered comma-separated.
63
- # Otherwise, it is considered space-separated.
64
- #
65
- # After the entries are separated, commas and whitespaces that are
66
- # either trailing or leading are trimmed.
67
- #
68
- # Empty entries, after trimmed, are also removed from the result.
69
- #
70
- # @param [String] var environment variable
71
- # @param [Array<String>] var list of environment variables
72
- # @param [Array<Object>] default the default value if the keys in `var` are not present in the environment
73
- # @param [Boolean] deprecation_warning when `var` is a list, record a deprecation log when
74
- # the first key in `var` is not used.
75
- # @return [Array<Object>] if the environment value is a valid list
76
- # @return [default] if the environment value is not found
77
- def env_to_list(var, default = [], comma_separated_only:, deprecation_warning: true)
78
- var = decode_array(var, deprecation_warning)
79
- if var && ENV.key?(var)
80
- value = ENV[var]
81
-
82
- values = if value.include?(',') || comma_separated_only
83
- value.split(',')
84
- else
85
- value.split(' ') # rubocop:disable Style/RedundantArgument
86
- end
87
-
88
- values.map! do |v|
89
- v.gsub!(/\A[\s,]*|[\s,]*\Z/, '')
90
-
91
- v.empty? ? nil : v
92
- end
93
-
94
- values.compact!
95
- values
96
- else
97
- default
98
- end
99
- end
100
-
101
32
  private
102
33
 
103
34
  def decode_array(var, deprecation_warning)