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
@@ -0,0 +1,179 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'uri'
4
+
5
+ require_relative '../../environment/container'
6
+ require_relative '../../environment/ext'
7
+ require_relative '../../transport/ext'
8
+ require_relative '../../transport/http/adapters/net'
9
+ require_relative '../../transport/http/adapters/unix_socket'
10
+ require_relative '../../transport/http/adapters/test'
11
+
12
+ # TODO: Improve negotiation to allow per endpoint selection
13
+ #
14
+ # Since endpoint negotiation happens at the `API::Spec` level there can not be
15
+ # a mix of endpoints at various versions or versionless without describing all
16
+ # the possible combinations as specs. See http/api.
17
+ #
18
+ # Below should be:
19
+ # require_relative '../../transport/http/api'
20
+ require_relative 'http/api'
21
+
22
+ # TODO: Decouple transport/http/builder
23
+ #
24
+ # See http/builder
25
+ #
26
+ # Below should be:
27
+ # require_relative '../../transport/http/builder'
28
+ require_relative 'http/builder'
29
+
30
+ # TODO: Decouple transport/http
31
+ #
32
+ # Because a new transport is required for every (API, Client, Transport)
33
+ # triplet and endpoints cannot be negotiated independently, there can not be a
34
+ # single `default` transport, but only endpoint-specific ones.
35
+
36
+ module Datadog
37
+ module Core
38
+ module Remote
39
+ module Transport
40
+ # Namespace for HTTP transport components
41
+ module HTTP
42
+ # NOTE: Due to... legacy reasons... This class likes having a default `AgentSettings` instance to fall back to.
43
+ # Because we generate this instance with an empty instance of `Settings`, the resulting `AgentSettings` below
44
+ # represents only settings specified via environment variables + the usual defaults.
45
+ #
46
+ # DO NOT USE THIS IN NEW CODE, as it ignores any settings specified by users via `Datadog.configure`.
47
+ DO_NOT_USE_ENVIRONMENT_AGENT_SETTINGS = Datadog::Core::Configuration::AgentSettingsResolver.call(
48
+ Datadog::Core::Configuration::Settings.new,
49
+ logger: nil,
50
+ )
51
+
52
+ module_function
53
+
54
+ # Builds a new Transport::HTTP::Client
55
+ def new(klass, &block)
56
+ Builder.new(&block).to_transport(klass)
57
+ end
58
+
59
+ # Builds a new Transport::HTTP::Client with default settings
60
+ # Pass a block to override any settings.
61
+ def root(
62
+ agent_settings: DO_NOT_USE_ENVIRONMENT_AGENT_SETTINGS,
63
+ **options
64
+ )
65
+ new(Core::Remote::Transport::Negotiation::Transport) do |transport|
66
+ transport.adapter(agent_settings)
67
+ transport.headers(default_headers)
68
+
69
+ apis = API.defaults
70
+
71
+ transport.api API::ROOT, apis[API::ROOT]
72
+
73
+ # Apply any settings given by options
74
+ unless options.empty?
75
+ transport.default_api = options[:api_version] if options.key?(:api_version)
76
+ transport.headers options[:headers] if options.key?(:headers)
77
+ end
78
+
79
+ if agent_settings.deprecated_for_removal_transport_configuration_proc
80
+ agent_settings.deprecated_for_removal_transport_configuration_proc.call(transport)
81
+ end
82
+
83
+ # Call block to apply any customization, if provided
84
+ yield(transport) if block_given?
85
+ end
86
+ end
87
+
88
+ # Builds a new Transport::HTTP::Client with default settings
89
+ # Pass a block to override any settings.
90
+ def v7(
91
+ agent_settings: DO_NOT_USE_ENVIRONMENT_AGENT_SETTINGS,
92
+ **options
93
+ )
94
+ new(Core::Remote::Transport::Config::Transport) do |transport|
95
+ transport.adapter(agent_settings)
96
+ transport.headers default_headers
97
+
98
+ apis = API.defaults
99
+
100
+ transport.api API::V7, apis[API::V7]
101
+
102
+ # Apply any settings given by options
103
+ unless options.empty?
104
+ transport.default_api = options[:api_version] if options.key?(:api_version)
105
+ transport.headers options[:headers] if options.key?(:headers)
106
+ end
107
+
108
+ if agent_settings.deprecated_for_removal_transport_configuration_proc
109
+ agent_settings.deprecated_for_removal_transport_configuration_proc.call(transport)
110
+ end
111
+
112
+ # Call block to apply any customization, if provided
113
+ yield(transport) if block_given?
114
+ end
115
+ end
116
+
117
+ def default_headers
118
+ {
119
+ Datadog::Core::Transport::Ext::HTTP::HEADER_CLIENT_COMPUTED_TOP_LEVEL => '1',
120
+ Datadog::Core::Transport::Ext::HTTP::HEADER_META_LANG => Datadog::Core::Environment::Ext::LANG,
121
+ Datadog::Core::Transport::Ext::HTTP::HEADER_META_LANG_VERSION =>
122
+ Datadog::Core::Environment::Ext::LANG_VERSION,
123
+ Datadog::Core::Transport::Ext::HTTP::HEADER_META_LANG_INTERPRETER =>
124
+ Datadog::Core::Environment::Ext::LANG_INTERPRETER,
125
+ Datadog::Core::Transport::Ext::HTTP::HEADER_META_TRACER_VERSION =>
126
+ Datadog::Core::Environment::Ext::TRACER_VERSION
127
+ }.tap do |headers|
128
+ # Add container ID, if present.
129
+ container_id = Datadog::Core::Environment::Container.container_id
130
+ headers[Datadog::Core::Transport::Ext::HTTP::HEADER_CONTAINER_ID] = container_id unless container_id.nil?
131
+ end
132
+ end
133
+
134
+ def default_adapter
135
+ Datadog::Core::Transport::Ext::HTTP::ADAPTER
136
+ end
137
+
138
+ def default_hostname(logger: Datadog.logger)
139
+ logger.warn(
140
+ 'Deprecated for removal: Using #default_hostname for configuration is deprecated and will ' \
141
+ 'be removed on a future ddtrace release.'
142
+ )
143
+
144
+ DO_NOT_USE_ENVIRONMENT_AGENT_SETTINGS.hostname
145
+ end
146
+
147
+ def default_port(logger: Datadog.logger)
148
+ logger.warn(
149
+ 'Deprecated for removal: Using #default_hostname for configuration is deprecated and will ' \
150
+ 'be removed on a future ddtrace release.'
151
+ )
152
+
153
+ DO_NOT_USE_ENVIRONMENT_AGENT_SETTINGS.port
154
+ end
155
+
156
+ def default_url(logger: Datadog.logger)
157
+ logger.warn(
158
+ 'Deprecated for removal: Using #default_url for configuration is deprecated and will ' \
159
+ 'be removed on a future ddtrace release.'
160
+ )
161
+
162
+ nil
163
+ end
164
+
165
+ # Add adapters to registry
166
+ Builder::REGISTRY.set(Datadog::Core::Transport::HTTP::Adapters::Net, Datadog::Core::Transport::Ext::HTTP::ADAPTER)
167
+ Builder::REGISTRY.set(
168
+ Datadog::Core::Transport::HTTP::Adapters::Test,
169
+ Datadog::Core::Transport::Ext::Test::ADAPTER
170
+ )
171
+ Builder::REGISTRY.set(
172
+ Datadog::Core::Transport::HTTP::Adapters::UnixSocket,
173
+ Datadog::Core::Transport::Ext::UnixSocket::ADAPTER
174
+ )
175
+ end
176
+ end
177
+ end
178
+ end
179
+ end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative '../../../ddtrace/transport/request'
3
+ require_relative '../../../core/transport/request'
4
4
 
5
5
  # TODO: Resolve conceptual conundrum
6
6
  #
@@ -23,35 +23,37 @@ require_relative '../../../ddtrace/transport/request'
23
23
 
24
24
  module Datadog
25
25
  module Core
26
- module Transport
27
- module Negotiation
28
- # Negotiation request
29
- class Request < Datadog::Transport::Request
30
- end
26
+ module Remote
27
+ module Transport
28
+ module Negotiation
29
+ # Negotiation request
30
+ class Request < Datadog::Core::Transport::Request
31
+ end
31
32
 
32
- # Negotiation response
33
- module Response
34
- attr_reader :version, :endpoints, :config
35
- end
33
+ # Negotiation response
34
+ module Response
35
+ attr_reader :version, :endpoints, :config
36
+ end
36
37
 
37
- # Negotiation transport
38
- class Transport
39
- attr_reader :client, :apis, :default_api, :current_api_id
38
+ # Negotiation transport
39
+ class Transport
40
+ attr_reader :client, :apis, :default_api, :current_api_id
40
41
 
41
- def initialize(apis, default_api)
42
- @apis = apis
42
+ def initialize(apis, default_api)
43
+ @apis = apis
43
44
 
44
- @client = HTTP::Client.new(current_api)
45
- end
45
+ @client = HTTP::Client.new(current_api)
46
+ end
46
47
 
47
- def send_info
48
- request = Request.new
48
+ def send_info
49
+ request = Request.new
49
50
 
50
- @client.send_info_payload(request)
51
- end
51
+ @client.send_info_payload(request)
52
+ end
52
53
 
53
- def current_api
54
- @apis[HTTP::API::ROOT]
54
+ def current_api
55
+ @apis[HTTP::API::ROOT]
56
+ end
55
57
  end
56
58
  end
57
59
  end
@@ -28,7 +28,10 @@ module Datadog
28
28
 
29
29
  @starting = true
30
30
 
31
- @thr = Thread.new { poll(@interval) }
31
+ thread = Thread.new { poll(@interval) }
32
+ thread.name = self.class.name unless Gem::Version.new(RUBY_VERSION) < Gem::Version.new('2.3')
33
+ thread.thread_variable_set(:fork_safe, true)
34
+ @thr = thread
32
35
 
33
36
  @started = true
34
37
  @starting = false
@@ -1,26 +1,36 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Datadog
2
4
  module Core
3
5
  module Runtime
4
6
  # @public_api
5
7
  module Ext
6
- TAG_ID = 'runtime-id'.freeze
7
- TAG_LANG = 'language'.freeze
8
- TAG_PROCESS_ID = 'process_id'.freeze
8
+ TAG_ID = 'runtime-id'
9
+ TAG_LANG = 'language'
10
+ TAG_PROCESS_ID = 'process_id'
9
11
 
10
12
  # Metrics
11
13
  # @public_api
12
14
  module Metrics
13
- ENV_ENABLED = 'DD_RUNTIME_METRICS_ENABLED'.freeze
15
+ ENV_ENABLED = 'DD_RUNTIME_METRICS_ENABLED'
14
16
 
15
- METRIC_CLASS_COUNT = 'runtime.ruby.class_count'.freeze
16
- METRIC_GC_PREFIX = 'runtime.ruby.gc'.freeze
17
- METRIC_THREAD_COUNT = 'runtime.ruby.thread_count'.freeze
18
- METRIC_GLOBAL_CONSTANT_STATE = 'runtime.ruby.global_constant_state'.freeze
19
- METRIC_GLOBAL_METHOD_STATE = 'runtime.ruby.global_method_state'.freeze
20
- METRIC_CONSTANT_CACHE_INVALIDATIONS = 'runtime.ruby.constant_cache_invalidations'.freeze
21
- METRIC_CONSTANT_CACHE_MISSES = 'runtime.ruby.constant_cache_misses'.freeze
17
+ METRIC_CLASS_COUNT = 'runtime.ruby.class_count'
18
+ METRIC_GC_PREFIX = 'runtime.ruby.gc'
19
+ METRIC_THREAD_COUNT = 'runtime.ruby.thread_count'
20
+ METRIC_GLOBAL_CONSTANT_STATE = 'runtime.ruby.global_constant_state'
21
+ METRIC_GLOBAL_METHOD_STATE = 'runtime.ruby.global_method_state'
22
+ METRIC_CONSTANT_CACHE_INVALIDATIONS = 'runtime.ruby.constant_cache_invalidations'
23
+ METRIC_CONSTANT_CACHE_MISSES = 'runtime.ruby.constant_cache_misses'
24
+ METRIC_YJIT_CODE_GC_COUNT = 'runtime.ruby.yjit.code_gc_count'
25
+ METRIC_YJIT_CODE_REGION_SIZE = 'runtime.ruby.yjit.code_region_size'
26
+ METRIC_YJIT_FREED_CODE_SIZE = 'runtime.ruby.yjit.freed_code_size'
27
+ METRIC_YJIT_FREED_PAGE_COUNT = 'runtime.ruby.yjit.freed_page_count'
28
+ METRIC_YJIT_INLINE_CODE_SIZE = 'runtime.ruby.yjit.inline_code_size'
29
+ METRIC_YJIT_LIVE_PAGE_COUNT = 'runtime.ruby.yjit.live_page_count'
30
+ METRIC_YJIT_OBJECT_SHAPE_COUNT = 'runtime.ruby.yjit.object_shape_count'
31
+ METRIC_YJIT_OUTLINED_CODE_SIZE = 'runtime.ruby.yjit.outlined_code_size'
22
32
 
23
- TAG_SERVICE = 'service'.freeze
33
+ TAG_SERVICE = 'service'
24
34
  end
25
35
  end
26
36
  end
@@ -5,6 +5,7 @@ require_relative '../environment/class_count'
5
5
  require_relative '../environment/gc'
6
6
  require_relative '../environment/thread_count'
7
7
  require_relative '../environment/vm_cache'
8
+ require_relative '../environment/yjit'
8
9
 
9
10
  module Datadog
10
11
  module Core
@@ -78,6 +79,8 @@ module Datadog
78
79
  )
79
80
  end
80
81
  end
82
+
83
+ flush_yjit_stats
81
84
  end
82
85
 
83
86
  def gc_metrics
@@ -134,6 +137,46 @@ module Datadog
134
137
  def gauge_if_not_nil(metric_name, metric_value)
135
138
  gauge(metric_name, metric_value) if metric_value
136
139
  end
140
+
141
+ def flush_yjit_stats
142
+ # Only on Ruby >= 3.2
143
+ try_flush do
144
+ if Core::Environment::YJIT.available?
145
+ gauge_if_not_nil(
146
+ Core::Runtime::Ext::Metrics::METRIC_YJIT_CODE_GC_COUNT,
147
+ Core::Environment::YJIT.code_gc_count
148
+ )
149
+ gauge_if_not_nil(
150
+ Core::Runtime::Ext::Metrics::METRIC_YJIT_CODE_REGION_SIZE,
151
+ Core::Environment::YJIT.code_region_size
152
+ )
153
+ gauge_if_not_nil(
154
+ Core::Runtime::Ext::Metrics::METRIC_YJIT_FREED_CODE_SIZE,
155
+ Core::Environment::YJIT.freed_code_size
156
+ )
157
+ gauge_if_not_nil(
158
+ Core::Runtime::Ext::Metrics::METRIC_YJIT_FREED_PAGE_COUNT,
159
+ Core::Environment::YJIT.freed_page_count
160
+ )
161
+ gauge_if_not_nil(
162
+ Core::Runtime::Ext::Metrics::METRIC_YJIT_INLINE_CODE_SIZE,
163
+ Core::Environment::YJIT.inline_code_size
164
+ )
165
+ gauge_if_not_nil(
166
+ Core::Runtime::Ext::Metrics::METRIC_YJIT_LIVE_PAGE_COUNT,
167
+ Core::Environment::YJIT.live_page_count
168
+ )
169
+ gauge_if_not_nil(
170
+ Core::Runtime::Ext::Metrics::METRIC_YJIT_OBJECT_SHAPE_COUNT,
171
+ Core::Environment::YJIT.object_shape_count
172
+ )
173
+ gauge_if_not_nil(
174
+ Core::Runtime::Ext::Metrics::METRIC_YJIT_OUTLINED_CODE_SIZE,
175
+ Core::Environment::YJIT.outlined_code_size
176
+ )
177
+ end
178
+ end
179
+ end
137
180
  end
138
181
  end
139
182
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative 'emitter'
2
4
  require_relative 'heartbeat'
3
5
  require_relative '../utils/forking'
@@ -16,12 +18,13 @@ module Datadog
16
18
  include Core::Utils::Forking
17
19
 
18
20
  # @param enabled [Boolean] Determines whether telemetry events should be sent to the API
19
- def initialize(enabled: true)
21
+ # @param heartbeat_interval_seconds [Float] How frequently heartbeats will be reported, in seconds.
22
+ def initialize(heartbeat_interval_seconds:, enabled: true)
20
23
  @enabled = enabled
21
24
  @emitter = Emitter.new
22
25
  @stopped = false
23
26
  @unsupported = false
24
- @worker = Telemetry::Heartbeat.new(enabled: @enabled) do
27
+ @worker = Telemetry::Heartbeat.new(enabled: @enabled, heartbeat_interval_seconds: heartbeat_interval_seconds) do
25
28
  heartbeat!
26
29
  end
27
30
  end
@@ -64,6 +67,13 @@ module Datadog
64
67
  @emitter.request(:'app-integrations-change')
65
68
  end
66
69
 
70
+ # Report configuration changes caused by Remote Configuration.
71
+ def client_configuration_change!(changes)
72
+ return if !@enabled || forked?
73
+
74
+ @emitter.request('app-client-configuration-change', data: { changes: changes, origin: 'remote_config' })
75
+ end
76
+
67
77
  private
68
78
 
69
79
  def heartbeat!
@@ -11,7 +11,7 @@ require_relative 'v1/dependency'
11
11
  require_relative 'v1/host'
12
12
  require_relative 'v1/integration'
13
13
  require_relative 'v1/product'
14
- require_relative '../../../ddtrace/transport/ext'
14
+ require_relative '../transport/ext'
15
15
 
16
16
  module Datadog
17
17
  module Core
@@ -43,11 +43,19 @@ module Datadog
43
43
 
44
44
  # Forms a hash of standard key value pairs to be sent in the app-started event configuration
45
45
  def configurations
46
+ config = Datadog.configuration
46
47
  hash = {
47
- DD_AGENT_HOST: Datadog.configuration.agent.host,
48
+ DD_AGENT_HOST: config.agent.host,
48
49
  DD_AGENT_TRANSPORT: agent_transport,
49
- DD_TRACE_SAMPLE_RATE: format_configuration_value(Datadog.configuration.tracing.sampling.default_rate),
50
+ DD_TRACE_SAMPLE_RATE: format_configuration_value(config.tracing.sampling.default_rate),
51
+ DD_TRACE_REMOVE_INTEGRATION_SERVICE_NAMES_ENABLED: config.tracing.contrib.global_default_service_name.enabled
50
52
  }
53
+ peer_service_mapping_str = ''
54
+ unless config.tracing.contrib.peer_service_mapping.empty?
55
+ peer_service_mapping = config.tracing.contrib.peer_service_mapping
56
+ peer_service_mapping_str = peer_service_mapping.map { |key, value| "#{key}:#{value}" }.join(',')
57
+ end
58
+ hash[:DD_TRACE_PEER_SERVICE_MAPPING] = peer_service_mapping_str
51
59
  hash.compact!
52
60
  hash
53
61
  end
@@ -138,6 +146,7 @@ module Datadog
138
146
  options['logger.instance'] = configuration.logger.instance.class.to_s
139
147
  options['appsec.enabled'] = configuration.dig('appsec', 'enabled') if configuration.respond_to?('appsec')
140
148
  options['tracing.opentelemetry.enabled'] = !defined?(Datadog::OpenTelemetry::LOADED).nil?
149
+ options['tracing.opentracing.enabled'] = !defined?(Datadog::OpenTracer::LOADED).nil?
141
150
  options.compact!
142
151
  options
143
152
  end
@@ -182,7 +191,7 @@ module Datadog
182
191
 
183
192
  def agent_transport
184
193
  adapter = Core::Configuration::AgentSettingsResolver.call(Datadog.configuration).adapter
185
- if adapter == Datadog::Transport::Ext::UnixSocket::ADAPTER
194
+ if adapter == Datadog::Core::Transport::Ext::UnixSocket::ADAPTER
186
195
  'UDS'
187
196
  else
188
197
  'TCP'
@@ -21,11 +21,13 @@ module Datadog
21
21
 
22
22
  # Retrieves and emits a TelemetryRequest object based on the request type specified
23
23
  # @param request_type [String] the type of telemetry request to collect data for
24
- def request(request_type)
24
+ # @param data [Object] arbitrary object to be passed to the respective `request_type` handler
25
+ def request(request_type, data: nil)
25
26
  begin
26
27
  request = Datadog::Core::Telemetry::Event.new.telemetry_request(
27
28
  request_type: request_type,
28
- seq_id: self.class.sequence.next
29
+ seq_id: self.class.sequence.next,
30
+ data: data,
29
31
  ).to_h
30
32
  @http_transport.request(request_type: request_type.to_s, payload: request.to_json)
31
33
  rescue StandardError => e
@@ -1,6 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative 'collector'
2
4
  require_relative 'v1/app_event'
3
5
  require_relative 'v1/telemetry_request'
6
+ require_relative 'v2/app_client_configuration_change'
4
7
 
5
8
  module Datadog
6
9
  module Core
@@ -9,7 +12,7 @@ module Datadog
9
12
  class Event
10
13
  include Telemetry::Collector
11
14
 
12
- API_VERSION = 'v1'.freeze
15
+ API_VERSION = 'v1'
13
16
 
14
17
  attr_reader \
15
18
  :api_version
@@ -21,12 +24,13 @@ module Datadog
21
24
  # Forms a TelemetryRequest object based on the event request_type
22
25
  # @param request_type [String] the type of telemetry request to collect data for
23
26
  # @param seq_id [Integer] the ID of the request; incremented each time a telemetry request is sent to the API
24
- def telemetry_request(request_type:, seq_id:)
27
+ # @param data [Object] arbitrary object to be passed to the respective `request_type` handler
28
+ def telemetry_request(request_type:, seq_id:, data: nil)
25
29
  Telemetry::V1::TelemetryRequest.new(
26
30
  api_version: @api_version,
27
31
  application: application,
28
32
  host: host,
29
- payload: payload(request_type),
33
+ payload: payload(request_type, data),
30
34
  request_type: request_type,
31
35
  runtime_id: runtime_id,
32
36
  seq_id: seq_id,
@@ -36,7 +40,7 @@ module Datadog
36
40
 
37
41
  private
38
42
 
39
- def payload(request_type)
43
+ def payload(request_type, data)
40
44
  case request_type
41
45
  when :'app-started'
42
46
  app_started
@@ -44,6 +48,8 @@ module Datadog
44
48
  {}
45
49
  when :'app-integrations-change'
46
50
  app_integrations_change
51
+ when 'app-client-configuration-change'
52
+ app_client_configuration_change(data)
47
53
  else
48
54
  raise ArgumentError, "Request type invalid, received request_type: #{@request_type}"
49
55
  end
@@ -61,6 +67,15 @@ module Datadog
61
67
  def app_integrations_change
62
68
  Telemetry::V1::AppEvent.new(integrations: integrations)
63
69
  end
70
+
71
+ # DEV: During the transition from V1 to V2, the backend accepts many V2
72
+ # DEV: payloads through the V1 transport protocol.
73
+ # DEV: The `app-client-configuration-change` payload is one of them.
74
+ # DEV: Once V2 is fully implemented, `Telemetry::V2::AppClientConfigurationChange`
75
+ # DEV: should be reusable without major modifications.
76
+ def app_client_configuration_change(data)
77
+ Telemetry::V2::AppClientConfigurationChange.new(data[:changes], origin: data[:origin])
78
+ end
64
79
  end
65
80
  end
66
81
  end
@@ -1,8 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Datadog
2
4
  module Core
3
5
  module Telemetry
4
6
  module Ext
5
- ENV_ENABLED = 'DD_INSTRUMENTATION_TELEMETRY_ENABLED'.freeze
7
+ ENV_ENABLED = 'DD_INSTRUMENTATION_TELEMETRY_ENABLED'
8
+ ENV_HEARTBEAT_INTERVAL = 'DD_TELEMETRY_HEARTBEAT_INTERVAL'
6
9
  end
7
10
  end
8
11
  end
@@ -10,13 +10,11 @@ module Datadog
10
10
  class Heartbeat < Core::Worker
11
11
  include Core::Workers::Polling
12
12
 
13
- DEFAULT_INTERVAL_SECONDS = 60
14
-
15
- def initialize(enabled: true, interval: DEFAULT_INTERVAL_SECONDS, &block)
13
+ def initialize(heartbeat_interval_seconds:, enabled: true, &block)
16
14
  # Workers::Polling settings
17
15
  self.enabled = enabled
18
16
  # Workers::IntervalLoop settings
19
- self.loop_base_interval = interval
17
+ self.loop_base_interval = heartbeat_interval_seconds
20
18
  self.fork_policy = Core::Workers::Async::Thread::FORK_POLICY_STOP
21
19
  super(&block)
22
20
  start
@@ -1,18 +1,20 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Datadog
2
4
  module Core
3
5
  module Telemetry
4
6
  module Http
5
7
  module Ext
6
- HEADER_DD_API_KEY = 'DD-API-KEY'.freeze
7
- HEADER_CONTENT_TYPE = 'Content-Type'.freeze
8
- HEADER_CONTENT_LENGTH = 'Content-Length'.freeze
9
- HEADER_DD_TELEMETRY_API_VERSION = 'DD-Telemetry-API-Version'.freeze
10
- HEADER_DD_TELEMETRY_REQUEST_TYPE = 'DD-Telemetry-Request-Type'.freeze
8
+ HEADER_DD_API_KEY = 'DD-API-KEY'
9
+ HEADER_CONTENT_TYPE = 'Content-Type'
10
+ HEADER_CONTENT_LENGTH = 'Content-Length'
11
+ HEADER_DD_TELEMETRY_API_VERSION = 'DD-Telemetry-API-Version'
12
+ HEADER_DD_TELEMETRY_REQUEST_TYPE = 'DD-Telemetry-Request-Type'
11
13
 
12
- CONTENT_TYPE_APPLICATION_JSON = 'application/json'.freeze
13
- API_VERSION = 'v1'.freeze
14
+ CONTENT_TYPE_APPLICATION_JSON = 'application/json'
15
+ API_VERSION = 'v1'
14
16
 
15
- AGENT_ENDPOINT = '/telemetry/proxy/api/v2/apmtelemetry'.freeze
17
+ AGENT_ENDPOINT = '/telemetry/proxy/api/v2/apmtelemetry'
16
18
  end
17
19
  end
18
20
  end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative '../../configuration/settings'
4
+ require_relative '../../transport/ext'
4
5
  require_relative 'env'
5
6
  require_relative 'ext'
6
7
  require_relative 'adapters/net'
@@ -38,6 +39,7 @@ module Datadog
38
39
 
39
40
  def headers(request_type:, api_version: Http::Ext::API_VERSION)
40
41
  {
42
+ Datadog::Core::Transport::Ext::HTTP::HEADER_DD_INTERNAL_UNTRACED_REQUEST => '1',
41
43
  Http::Ext::HEADER_CONTENT_TYPE => Http::Ext::CONTENT_TYPE_APPLICATION_JSON,
42
44
  Http::Ext::HEADER_DD_TELEMETRY_API_VERSION => api_version,
43
45
  Http::Ext::HEADER_DD_TELEMETRY_REQUEST_TYPE => request_type,
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'request'
4
+
5
+ module Datadog
6
+ module Core
7
+ module Telemetry
8
+ module V2
9
+ # Telemetry 'app-client-configuration-change' event.
10
+ # This request should contain client library configuration that have changes since the app-started event.
11
+ class AppClientConfigurationChange < Request
12
+ def initialize(configuration_changes, origin: 'unknown')
13
+ super('app-client-configuration-change')
14
+
15
+ @configuration_changes = configuration_changes
16
+ @origin = origin
17
+ end
18
+
19
+ # @see [Request#to_h]
20
+ def to_h
21
+ super.merge(payload: payload)
22
+ end
23
+
24
+ private
25
+
26
+ def payload
27
+ {
28
+ configuration: @configuration_changes.map do |name, value|
29
+ {
30
+ name: name,
31
+ value: value,
32
+ origin: @origin,
33
+ }
34
+ end
35
+ }
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end