datadog 2.0.0.beta1

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 (764) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +4236 -0
  3. data/LICENSE +6 -0
  4. data/LICENSE-3rdparty.csv +7 -0
  5. data/LICENSE.Apache +200 -0
  6. data/LICENSE.BSD3 +24 -0
  7. data/NOTICE +4 -0
  8. data/README.md +25 -0
  9. data/bin/ddprofrb +15 -0
  10. data/ext/datadog_profiling_loader/datadog_profiling_loader.c +134 -0
  11. data/ext/datadog_profiling_loader/extconf.rb +72 -0
  12. data/ext/datadog_profiling_native_extension/NativeExtensionDesign.md +156 -0
  13. data/ext/datadog_profiling_native_extension/clock_id.h +22 -0
  14. data/ext/datadog_profiling_native_extension/clock_id_from_pthread.c +56 -0
  15. data/ext/datadog_profiling_native_extension/clock_id_noop.c +22 -0
  16. data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +1153 -0
  17. data/ext/datadog_profiling_native_extension/collectors_discrete_dynamic_sampler.c +422 -0
  18. data/ext/datadog_profiling_native_extension/collectors_discrete_dynamic_sampler.h +101 -0
  19. data/ext/datadog_profiling_native_extension/collectors_dynamic_sampling_rate.c +150 -0
  20. data/ext/datadog_profiling_native_extension/collectors_dynamic_sampling_rate.h +18 -0
  21. data/ext/datadog_profiling_native_extension/collectors_gc_profiling_helper.c +156 -0
  22. data/ext/datadog_profiling_native_extension/collectors_gc_profiling_helper.h +5 -0
  23. data/ext/datadog_profiling_native_extension/collectors_idle_sampling_helper.c +244 -0
  24. data/ext/datadog_profiling_native_extension/collectors_idle_sampling_helper.h +3 -0
  25. data/ext/datadog_profiling_native_extension/collectors_stack.c +372 -0
  26. data/ext/datadog_profiling_native_extension/collectors_stack.h +27 -0
  27. data/ext/datadog_profiling_native_extension/collectors_thread_context.c +1391 -0
  28. data/ext/datadog_profiling_native_extension/collectors_thread_context.h +15 -0
  29. data/ext/datadog_profiling_native_extension/extconf.rb +302 -0
  30. data/ext/datadog_profiling_native_extension/heap_recorder.c +970 -0
  31. data/ext/datadog_profiling_native_extension/heap_recorder.h +155 -0
  32. data/ext/datadog_profiling_native_extension/helpers.h +23 -0
  33. data/ext/datadog_profiling_native_extension/http_transport.c +375 -0
  34. data/ext/datadog_profiling_native_extension/libdatadog_helpers.c +62 -0
  35. data/ext/datadog_profiling_native_extension/libdatadog_helpers.h +42 -0
  36. data/ext/datadog_profiling_native_extension/native_extension_helpers.rb +319 -0
  37. data/ext/datadog_profiling_native_extension/private_vm_api_access.c +892 -0
  38. data/ext/datadog_profiling_native_extension/private_vm_api_access.h +61 -0
  39. data/ext/datadog_profiling_native_extension/profiling.c +267 -0
  40. data/ext/datadog_profiling_native_extension/ruby_helpers.c +267 -0
  41. data/ext/datadog_profiling_native_extension/ruby_helpers.h +119 -0
  42. data/ext/datadog_profiling_native_extension/setup_signal_handler.c +115 -0
  43. data/ext/datadog_profiling_native_extension/setup_signal_handler.h +11 -0
  44. data/ext/datadog_profiling_native_extension/stack_recorder.c +941 -0
  45. data/ext/datadog_profiling_native_extension/stack_recorder.h +27 -0
  46. data/ext/datadog_profiling_native_extension/time_helpers.c +53 -0
  47. data/ext/datadog_profiling_native_extension/time_helpers.h +26 -0
  48. data/lib/datadog/appsec/assets/blocked.html +99 -0
  49. data/lib/datadog/appsec/assets/blocked.json +1 -0
  50. data/lib/datadog/appsec/assets/blocked.text +5 -0
  51. data/lib/datadog/appsec/assets/waf_rules/README.md +7 -0
  52. data/lib/datadog/appsec/assets/waf_rules/processors.json +92 -0
  53. data/lib/datadog/appsec/assets/waf_rules/recommended.json +7703 -0
  54. data/lib/datadog/appsec/assets/waf_rules/scanners.json +114 -0
  55. data/lib/datadog/appsec/assets/waf_rules/strict.json +1635 -0
  56. data/lib/datadog/appsec/assets.rb +46 -0
  57. data/lib/datadog/appsec/autoload.rb +13 -0
  58. data/lib/datadog/appsec/component.rb +94 -0
  59. data/lib/datadog/appsec/configuration/settings.rb +202 -0
  60. data/lib/datadog/appsec/configuration.rb +11 -0
  61. data/lib/datadog/appsec/contrib/auto_instrument.rb +25 -0
  62. data/lib/datadog/appsec/contrib/devise/event.rb +57 -0
  63. data/lib/datadog/appsec/contrib/devise/ext.rb +13 -0
  64. data/lib/datadog/appsec/contrib/devise/integration.rb +42 -0
  65. data/lib/datadog/appsec/contrib/devise/patcher/authenticatable_patch.rb +76 -0
  66. data/lib/datadog/appsec/contrib/devise/patcher/registration_controller_patch.rb +54 -0
  67. data/lib/datadog/appsec/contrib/devise/patcher.rb +45 -0
  68. data/lib/datadog/appsec/contrib/devise/resource.rb +35 -0
  69. data/lib/datadog/appsec/contrib/devise/tracking.rb +49 -0
  70. data/lib/datadog/appsec/contrib/integration.rb +37 -0
  71. data/lib/datadog/appsec/contrib/patcher.rb +12 -0
  72. data/lib/datadog/appsec/contrib/rack/ext.rb +13 -0
  73. data/lib/datadog/appsec/contrib/rack/gateway/request.rb +104 -0
  74. data/lib/datadog/appsec/contrib/rack/gateway/response.rb +30 -0
  75. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +162 -0
  76. data/lib/datadog/appsec/contrib/rack/integration.rb +44 -0
  77. data/lib/datadog/appsec/contrib/rack/patcher.rb +34 -0
  78. data/lib/datadog/appsec/contrib/rack/reactive/request.rb +81 -0
  79. data/lib/datadog/appsec/contrib/rack/reactive/request_body.rb +60 -0
  80. data/lib/datadog/appsec/contrib/rack/reactive/response.rb +66 -0
  81. data/lib/datadog/appsec/contrib/rack/request_body_middleware.rb +44 -0
  82. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +196 -0
  83. data/lib/datadog/appsec/contrib/rails/ext.rb +13 -0
  84. data/lib/datadog/appsec/contrib/rails/framework.rb +16 -0
  85. data/lib/datadog/appsec/contrib/rails/gateway/request.rb +67 -0
  86. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +71 -0
  87. data/lib/datadog/appsec/contrib/rails/integration.rb +43 -0
  88. data/lib/datadog/appsec/contrib/rails/patcher.rb +166 -0
  89. data/lib/datadog/appsec/contrib/rails/reactive/action.rb +66 -0
  90. data/lib/datadog/appsec/contrib/rails/request.rb +36 -0
  91. data/lib/datadog/appsec/contrib/rails/request_middleware.rb +20 -0
  92. data/lib/datadog/appsec/contrib/sinatra/ext.rb +14 -0
  93. data/lib/datadog/appsec/contrib/sinatra/framework.rb +20 -0
  94. data/lib/datadog/appsec/contrib/sinatra/gateway/request.rb +17 -0
  95. data/lib/datadog/appsec/contrib/sinatra/gateway/route_params.rb +23 -0
  96. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +117 -0
  97. data/lib/datadog/appsec/contrib/sinatra/integration.rb +43 -0
  98. data/lib/datadog/appsec/contrib/sinatra/patcher.rb +168 -0
  99. data/lib/datadog/appsec/contrib/sinatra/reactive/routed.rb +61 -0
  100. data/lib/datadog/appsec/contrib/sinatra/request_middleware.rb +20 -0
  101. data/lib/datadog/appsec/event.rb +171 -0
  102. data/lib/datadog/appsec/ext.rb +10 -0
  103. data/lib/datadog/appsec/extensions.rb +15 -0
  104. data/lib/datadog/appsec/instrumentation/gateway/argument.rb +22 -0
  105. data/lib/datadog/appsec/instrumentation/gateway.rb +64 -0
  106. data/lib/datadog/appsec/instrumentation.rb +9 -0
  107. data/lib/datadog/appsec/monitor/gateway/watcher.rb +67 -0
  108. data/lib/datadog/appsec/monitor/reactive/set_user.rb +58 -0
  109. data/lib/datadog/appsec/monitor.rb +11 -0
  110. data/lib/datadog/appsec/processor/actions.rb +49 -0
  111. data/lib/datadog/appsec/processor/rule_loader.rb +123 -0
  112. data/lib/datadog/appsec/processor/rule_merger.rb +152 -0
  113. data/lib/datadog/appsec/processor.rb +171 -0
  114. data/lib/datadog/appsec/rate_limiter.rb +60 -0
  115. data/lib/datadog/appsec/reactive/address_hash.rb +22 -0
  116. data/lib/datadog/appsec/reactive/engine.rb +47 -0
  117. data/lib/datadog/appsec/reactive/operation.rb +68 -0
  118. data/lib/datadog/appsec/reactive/subscriber.rb +19 -0
  119. data/lib/datadog/appsec/remote.rb +129 -0
  120. data/lib/datadog/appsec/response.rb +151 -0
  121. data/lib/datadog/appsec/sample_rate.rb +21 -0
  122. data/lib/datadog/appsec/scope.rb +61 -0
  123. data/lib/datadog/appsec/utils/http/media_range.rb +201 -0
  124. data/lib/datadog/appsec/utils/http/media_type.rb +87 -0
  125. data/lib/datadog/appsec/utils/http.rb +11 -0
  126. data/lib/datadog/appsec/utils.rb +9 -0
  127. data/lib/datadog/appsec.rb +60 -0
  128. data/lib/datadog/auto_instrument.rb +16 -0
  129. data/lib/datadog/auto_instrument_base.rb +8 -0
  130. data/lib/datadog/core/buffer/cruby.rb +55 -0
  131. data/lib/datadog/core/buffer/random.rb +134 -0
  132. data/lib/datadog/core/buffer/thread_safe.rb +58 -0
  133. data/lib/datadog/core/chunker.rb +35 -0
  134. data/lib/datadog/core/configuration/agent_settings_resolver.rb +352 -0
  135. data/lib/datadog/core/configuration/base.rb +91 -0
  136. data/lib/datadog/core/configuration/components.rb +177 -0
  137. data/lib/datadog/core/configuration/ext.rb +45 -0
  138. data/lib/datadog/core/configuration/option.rb +319 -0
  139. data/lib/datadog/core/configuration/option_definition.rb +165 -0
  140. data/lib/datadog/core/configuration/options.rb +128 -0
  141. data/lib/datadog/core/configuration/settings.rb +786 -0
  142. data/lib/datadog/core/configuration.rb +296 -0
  143. data/lib/datadog/core/diagnostics/environment_logger.rb +173 -0
  144. data/lib/datadog/core/diagnostics/health.rb +19 -0
  145. data/lib/datadog/core/encoding.rb +74 -0
  146. data/lib/datadog/core/environment/cgroup.rb +53 -0
  147. data/lib/datadog/core/environment/class_count.rb +21 -0
  148. data/lib/datadog/core/environment/container.rb +91 -0
  149. data/lib/datadog/core/environment/execution.rb +103 -0
  150. data/lib/datadog/core/environment/ext.rb +45 -0
  151. data/lib/datadog/core/environment/gc.rb +20 -0
  152. data/lib/datadog/core/environment/git.rb +25 -0
  153. data/lib/datadog/core/environment/identity.rb +84 -0
  154. data/lib/datadog/core/environment/platform.rb +40 -0
  155. data/lib/datadog/core/environment/socket.rb +24 -0
  156. data/lib/datadog/core/environment/thread_count.rb +20 -0
  157. data/lib/datadog/core/environment/variable_helpers.rb +53 -0
  158. data/lib/datadog/core/environment/vm_cache.rb +64 -0
  159. data/lib/datadog/core/environment/yjit.rb +58 -0
  160. data/lib/datadog/core/error.rb +100 -0
  161. data/lib/datadog/core/extensions.rb +16 -0
  162. data/lib/datadog/core/git/ext.rb +16 -0
  163. data/lib/datadog/core/header_collection.rb +43 -0
  164. data/lib/datadog/core/logger.rb +45 -0
  165. data/lib/datadog/core/logging/ext.rb +13 -0
  166. data/lib/datadog/core/metrics/client.rb +199 -0
  167. data/lib/datadog/core/metrics/ext.rb +18 -0
  168. data/lib/datadog/core/metrics/helpers.rb +25 -0
  169. data/lib/datadog/core/metrics/logging.rb +44 -0
  170. data/lib/datadog/core/metrics/metric.rb +14 -0
  171. data/lib/datadog/core/metrics/options.rb +52 -0
  172. data/lib/datadog/core/pin.rb +75 -0
  173. data/lib/datadog/core/remote/client/capabilities.rb +62 -0
  174. data/lib/datadog/core/remote/client.rb +234 -0
  175. data/lib/datadog/core/remote/component.rb +162 -0
  176. data/lib/datadog/core/remote/configuration/content.rb +111 -0
  177. data/lib/datadog/core/remote/configuration/digest.rb +62 -0
  178. data/lib/datadog/core/remote/configuration/path.rb +90 -0
  179. data/lib/datadog/core/remote/configuration/repository.rb +294 -0
  180. data/lib/datadog/core/remote/configuration/target.rb +74 -0
  181. data/lib/datadog/core/remote/configuration.rb +18 -0
  182. data/lib/datadog/core/remote/dispatcher.rb +59 -0
  183. data/lib/datadog/core/remote/ext.rb +13 -0
  184. data/lib/datadog/core/remote/negotiation.rb +70 -0
  185. data/lib/datadog/core/remote/tie/tracing.rb +39 -0
  186. data/lib/datadog/core/remote/tie.rb +27 -0
  187. data/lib/datadog/core/remote/transport/config.rb +60 -0
  188. data/lib/datadog/core/remote/transport/http/api/instance.rb +39 -0
  189. data/lib/datadog/core/remote/transport/http/api/spec.rb +21 -0
  190. data/lib/datadog/core/remote/transport/http/api.rb +58 -0
  191. data/lib/datadog/core/remote/transport/http/builder.rb +219 -0
  192. data/lib/datadog/core/remote/transport/http/client.rb +48 -0
  193. data/lib/datadog/core/remote/transport/http/config.rb +280 -0
  194. data/lib/datadog/core/remote/transport/http/negotiation.rb +146 -0
  195. data/lib/datadog/core/remote/transport/http.rb +147 -0
  196. data/lib/datadog/core/remote/transport/negotiation.rb +62 -0
  197. data/lib/datadog/core/remote/worker.rb +102 -0
  198. data/lib/datadog/core/remote.rb +24 -0
  199. data/lib/datadog/core/runtime/ext.rb +38 -0
  200. data/lib/datadog/core/runtime/metrics.rb +185 -0
  201. data/lib/datadog/core/telemetry/client.rb +87 -0
  202. data/lib/datadog/core/telemetry/collector.rb +248 -0
  203. data/lib/datadog/core/telemetry/emitter.rb +50 -0
  204. data/lib/datadog/core/telemetry/event.rb +83 -0
  205. data/lib/datadog/core/telemetry/ext.rb +15 -0
  206. data/lib/datadog/core/telemetry/heartbeat.rb +35 -0
  207. data/lib/datadog/core/telemetry/http/adapters/net.rb +113 -0
  208. data/lib/datadog/core/telemetry/http/env.rb +20 -0
  209. data/lib/datadog/core/telemetry/http/ext.rb +22 -0
  210. data/lib/datadog/core/telemetry/http/response.rb +66 -0
  211. data/lib/datadog/core/telemetry/http/transport.rb +56 -0
  212. data/lib/datadog/core/telemetry/v1/app_event.rb +59 -0
  213. data/lib/datadog/core/telemetry/v1/application.rb +94 -0
  214. data/lib/datadog/core/telemetry/v1/configuration.rb +27 -0
  215. data/lib/datadog/core/telemetry/v1/dependency.rb +45 -0
  216. data/lib/datadog/core/telemetry/v1/host.rb +59 -0
  217. data/lib/datadog/core/telemetry/v1/install_signature.rb +38 -0
  218. data/lib/datadog/core/telemetry/v1/integration.rb +66 -0
  219. data/lib/datadog/core/telemetry/v1/product.rb +36 -0
  220. data/lib/datadog/core/telemetry/v1/telemetry_request.rb +108 -0
  221. data/lib/datadog/core/telemetry/v2/app_client_configuration_change.rb +41 -0
  222. data/lib/datadog/core/telemetry/v2/request.rb +29 -0
  223. data/lib/datadog/core/transport/ext.rb +43 -0
  224. data/lib/datadog/core/transport/http/adapters/net.rb +159 -0
  225. data/lib/datadog/core/transport/http/adapters/registry.rb +29 -0
  226. data/lib/datadog/core/transport/http/adapters/test.rb +89 -0
  227. data/lib/datadog/core/transport/http/adapters/unix_socket.rb +83 -0
  228. data/lib/datadog/core/transport/http/api/endpoint.rb +31 -0
  229. data/lib/datadog/core/transport/http/api/fallbacks.rb +26 -0
  230. data/lib/datadog/core/transport/http/api/map.rb +18 -0
  231. data/lib/datadog/core/transport/http/env.rb +62 -0
  232. data/lib/datadog/core/transport/http/response.rb +60 -0
  233. data/lib/datadog/core/transport/parcel.rb +22 -0
  234. data/lib/datadog/core/transport/request.rb +17 -0
  235. data/lib/datadog/core/transport/response.rb +64 -0
  236. data/lib/datadog/core/utils/duration.rb +52 -0
  237. data/lib/datadog/core/utils/forking.rb +63 -0
  238. data/lib/datadog/core/utils/hash.rb +79 -0
  239. data/lib/datadog/core/utils/network.rb +121 -0
  240. data/lib/datadog/core/utils/only_once.rb +42 -0
  241. data/lib/datadog/core/utils/safe_dup.rb +40 -0
  242. data/lib/datadog/core/utils/sequence.rb +26 -0
  243. data/lib/datadog/core/utils/time.rb +52 -0
  244. data/lib/datadog/core/utils/url.rb +25 -0
  245. data/lib/datadog/core/utils.rb +94 -0
  246. data/lib/datadog/core/vendor/multipart-post/LICENSE +11 -0
  247. data/lib/datadog/core/vendor/multipart-post/multipart/post/composite_read_io.rb +118 -0
  248. data/lib/datadog/core/vendor/multipart-post/multipart/post/multipartable.rb +59 -0
  249. data/lib/datadog/core/vendor/multipart-post/multipart/post/parts.rb +137 -0
  250. data/lib/datadog/core/vendor/multipart-post/multipart/post/version.rb +11 -0
  251. data/lib/datadog/core/vendor/multipart-post/multipart/post.rb +10 -0
  252. data/lib/datadog/core/vendor/multipart-post/multipart.rb +14 -0
  253. data/lib/datadog/core/vendor/multipart-post/net/http/post/multipart.rb +34 -0
  254. data/lib/datadog/core/worker.rb +24 -0
  255. data/lib/datadog/core/workers/async.rb +185 -0
  256. data/lib/datadog/core/workers/interval_loop.rb +123 -0
  257. data/lib/datadog/core/workers/polling.rb +59 -0
  258. data/lib/datadog/core/workers/queue.rb +44 -0
  259. data/lib/datadog/core/workers/runtime_metrics.rb +62 -0
  260. data/lib/datadog/core.rb +45 -0
  261. data/lib/datadog/kit/appsec/events.rb +169 -0
  262. data/lib/datadog/kit/enable_core_dumps.rb +49 -0
  263. data/lib/datadog/kit/identity.rb +104 -0
  264. data/lib/datadog/kit.rb +11 -0
  265. data/lib/datadog/opentelemetry/api/context.rb +193 -0
  266. data/lib/datadog/opentelemetry/api/trace/span.rb +14 -0
  267. data/lib/datadog/opentelemetry/sdk/configurator.rb +37 -0
  268. data/lib/datadog/opentelemetry/sdk/id_generator.rb +26 -0
  269. data/lib/datadog/opentelemetry/sdk/propagator.rb +92 -0
  270. data/lib/datadog/opentelemetry/sdk/span_processor.rb +134 -0
  271. data/lib/datadog/opentelemetry/sdk/trace/span.rb +167 -0
  272. data/lib/datadog/opentelemetry/trace.rb +59 -0
  273. data/lib/datadog/opentelemetry.rb +51 -0
  274. data/lib/datadog/profiling/collectors/code_provenance.rb +113 -0
  275. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +114 -0
  276. data/lib/datadog/profiling/collectors/dynamic_sampling_rate.rb +14 -0
  277. data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +70 -0
  278. data/lib/datadog/profiling/collectors/info.rb +103 -0
  279. data/lib/datadog/profiling/collectors/stack.rb +13 -0
  280. data/lib/datadog/profiling/collectors/thread_context.rb +61 -0
  281. data/lib/datadog/profiling/component.rb +418 -0
  282. data/lib/datadog/profiling/exporter.rb +103 -0
  283. data/lib/datadog/profiling/ext/forking.rb +98 -0
  284. data/lib/datadog/profiling/ext.rb +35 -0
  285. data/lib/datadog/profiling/flush.rb +43 -0
  286. data/lib/datadog/profiling/http_transport.rb +143 -0
  287. data/lib/datadog/profiling/load_native_extension.rb +28 -0
  288. data/lib/datadog/profiling/native_extension.rb +20 -0
  289. data/lib/datadog/profiling/preload.rb +5 -0
  290. data/lib/datadog/profiling/profiler.rb +64 -0
  291. data/lib/datadog/profiling/scheduler.rb +137 -0
  292. data/lib/datadog/profiling/stack_recorder.rb +69 -0
  293. data/lib/datadog/profiling/tag_builder.rb +60 -0
  294. data/lib/datadog/profiling/tasks/exec.rb +50 -0
  295. data/lib/datadog/profiling/tasks/help.rb +18 -0
  296. data/lib/datadog/profiling/tasks/setup.rb +60 -0
  297. data/lib/datadog/profiling.rb +152 -0
  298. data/lib/datadog/tracing/analytics.rb +25 -0
  299. data/lib/datadog/tracing/buffer.rb +129 -0
  300. data/lib/datadog/tracing/client_ip.rb +61 -0
  301. data/lib/datadog/tracing/component.rb +206 -0
  302. data/lib/datadog/tracing/configuration/dynamic/option.rb +71 -0
  303. data/lib/datadog/tracing/configuration/dynamic.rb +64 -0
  304. data/lib/datadog/tracing/configuration/ext.rb +98 -0
  305. data/lib/datadog/tracing/configuration/http.rb +74 -0
  306. data/lib/datadog/tracing/configuration/settings.rb +421 -0
  307. data/lib/datadog/tracing/context.rb +68 -0
  308. data/lib/datadog/tracing/context_provider.rb +82 -0
  309. data/lib/datadog/tracing/contrib/action_cable/configuration/settings.rb +39 -0
  310. data/lib/datadog/tracing/contrib/action_cable/event.rb +71 -0
  311. data/lib/datadog/tracing/contrib/action_cable/events/broadcast.rb +58 -0
  312. data/lib/datadog/tracing/contrib/action_cable/events/perform_action.rb +63 -0
  313. data/lib/datadog/tracing/contrib/action_cable/events/transmit.rb +59 -0
  314. data/lib/datadog/tracing/contrib/action_cable/events.rb +37 -0
  315. data/lib/datadog/tracing/contrib/action_cable/ext.rb +33 -0
  316. data/lib/datadog/tracing/contrib/action_cable/instrumentation.rb +90 -0
  317. data/lib/datadog/tracing/contrib/action_cable/integration.rb +50 -0
  318. data/lib/datadog/tracing/contrib/action_cable/patcher.rb +31 -0
  319. data/lib/datadog/tracing/contrib/action_mailer/configuration/settings.rb +43 -0
  320. data/lib/datadog/tracing/contrib/action_mailer/event.rb +52 -0
  321. data/lib/datadog/tracing/contrib/action_mailer/events/deliver.rb +60 -0
  322. data/lib/datadog/tracing/contrib/action_mailer/events/process.rb +47 -0
  323. data/lib/datadog/tracing/contrib/action_mailer/events.rb +34 -0
  324. data/lib/datadog/tracing/contrib/action_mailer/ext.rb +34 -0
  325. data/lib/datadog/tracing/contrib/action_mailer/integration.rb +50 -0
  326. data/lib/datadog/tracing/contrib/action_mailer/patcher.rb +29 -0
  327. data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +138 -0
  328. data/lib/datadog/tracing/contrib/action_pack/action_controller/patcher.rb +29 -0
  329. data/lib/datadog/tracing/contrib/action_pack/configuration/settings.rb +40 -0
  330. data/lib/datadog/tracing/contrib/action_pack/ext.rb +23 -0
  331. data/lib/datadog/tracing/contrib/action_pack/integration.rb +51 -0
  332. data/lib/datadog/tracing/contrib/action_pack/patcher.rb +27 -0
  333. data/lib/datadog/tracing/contrib/action_pack/utils.rb +40 -0
  334. data/lib/datadog/tracing/contrib/action_view/configuration/settings.rb +43 -0
  335. data/lib/datadog/tracing/contrib/action_view/event.rb +35 -0
  336. data/lib/datadog/tracing/contrib/action_view/events/render_partial.rb +54 -0
  337. data/lib/datadog/tracing/contrib/action_view/events/render_template.rb +57 -0
  338. data/lib/datadog/tracing/contrib/action_view/events.rb +34 -0
  339. data/lib/datadog/tracing/contrib/action_view/ext.rb +25 -0
  340. data/lib/datadog/tracing/contrib/action_view/integration.rb +58 -0
  341. data/lib/datadog/tracing/contrib/action_view/patcher.rb +34 -0
  342. data/lib/datadog/tracing/contrib/action_view/utils.rb +36 -0
  343. data/lib/datadog/tracing/contrib/active_job/configuration/settings.rb +39 -0
  344. data/lib/datadog/tracing/contrib/active_job/event.rb +58 -0
  345. data/lib/datadog/tracing/contrib/active_job/events/discard.rb +50 -0
  346. data/lib/datadog/tracing/contrib/active_job/events/enqueue.rb +49 -0
  347. data/lib/datadog/tracing/contrib/active_job/events/enqueue_at.rb +49 -0
  348. data/lib/datadog/tracing/contrib/active_job/events/enqueue_retry.rb +51 -0
  349. data/lib/datadog/tracing/contrib/active_job/events/perform.rb +49 -0
  350. data/lib/datadog/tracing/contrib/active_job/events/retry_stopped.rb +50 -0
  351. data/lib/datadog/tracing/contrib/active_job/events.rb +42 -0
  352. data/lib/datadog/tracing/contrib/active_job/ext.rb +40 -0
  353. data/lib/datadog/tracing/contrib/active_job/integration.rb +50 -0
  354. data/lib/datadog/tracing/contrib/active_job/log_injection.rb +24 -0
  355. data/lib/datadog/tracing/contrib/active_job/patcher.rb +36 -0
  356. data/lib/datadog/tracing/contrib/active_model_serializers/configuration/settings.rb +37 -0
  357. data/lib/datadog/tracing/contrib/active_model_serializers/event.rb +68 -0
  358. data/lib/datadog/tracing/contrib/active_model_serializers/events/render.rb +45 -0
  359. data/lib/datadog/tracing/contrib/active_model_serializers/events/serialize.rb +47 -0
  360. data/lib/datadog/tracing/contrib/active_model_serializers/events.rb +34 -0
  361. data/lib/datadog/tracing/contrib/active_model_serializers/ext.rb +25 -0
  362. data/lib/datadog/tracing/contrib/active_model_serializers/integration.rb +45 -0
  363. data/lib/datadog/tracing/contrib/active_model_serializers/patcher.rb +32 -0
  364. data/lib/datadog/tracing/contrib/active_record/configuration/makara_resolver.rb +36 -0
  365. data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +147 -0
  366. data/lib/datadog/tracing/contrib/active_record/configuration/settings.rb +48 -0
  367. data/lib/datadog/tracing/contrib/active_record/event.rb +30 -0
  368. data/lib/datadog/tracing/contrib/active_record/events/instantiation.rb +58 -0
  369. data/lib/datadog/tracing/contrib/active_record/events/sql.rb +77 -0
  370. data/lib/datadog/tracing/contrib/active_record/events.rb +34 -0
  371. data/lib/datadog/tracing/contrib/active_record/ext.rb +30 -0
  372. data/lib/datadog/tracing/contrib/active_record/integration.rb +57 -0
  373. data/lib/datadog/tracing/contrib/active_record/patcher.rb +27 -0
  374. data/lib/datadog/tracing/contrib/active_record/utils.rb +128 -0
  375. data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +186 -0
  376. data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +76 -0
  377. data/lib/datadog/tracing/contrib/active_support/cache/redis.rb +47 -0
  378. data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +47 -0
  379. data/lib/datadog/tracing/contrib/active_support/ext.rb +32 -0
  380. data/lib/datadog/tracing/contrib/active_support/integration.rb +52 -0
  381. data/lib/datadog/tracing/contrib/active_support/notifications/event.rb +71 -0
  382. data/lib/datadog/tracing/contrib/active_support/notifications/subscriber.rb +71 -0
  383. data/lib/datadog/tracing/contrib/active_support/notifications/subscription.rb +164 -0
  384. data/lib/datadog/tracing/contrib/active_support/patcher.rb +27 -0
  385. data/lib/datadog/tracing/contrib/analytics.rb +28 -0
  386. data/lib/datadog/tracing/contrib/auto_instrument.rb +53 -0
  387. data/lib/datadog/tracing/contrib/aws/configuration/settings.rb +53 -0
  388. data/lib/datadog/tracing/contrib/aws/ext.rb +50 -0
  389. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +119 -0
  390. data/lib/datadog/tracing/contrib/aws/integration.rb +47 -0
  391. data/lib/datadog/tracing/contrib/aws/parsed_context.rb +64 -0
  392. data/lib/datadog/tracing/contrib/aws/patcher.rb +57 -0
  393. data/lib/datadog/tracing/contrib/aws/service/base.rb +16 -0
  394. data/lib/datadog/tracing/contrib/aws/service/dynamodb.rb +22 -0
  395. data/lib/datadog/tracing/contrib/aws/service/eventbridge.rb +22 -0
  396. data/lib/datadog/tracing/contrib/aws/service/kinesis.rb +32 -0
  397. data/lib/datadog/tracing/contrib/aws/service/s3.rb +22 -0
  398. data/lib/datadog/tracing/contrib/aws/service/sns.rb +30 -0
  399. data/lib/datadog/tracing/contrib/aws/service/sqs.rb +27 -0
  400. data/lib/datadog/tracing/contrib/aws/service/states.rb +40 -0
  401. data/lib/datadog/tracing/contrib/aws/services.rb +139 -0
  402. data/lib/datadog/tracing/contrib/component.rb +41 -0
  403. data/lib/datadog/tracing/contrib/concurrent_ruby/async_patch.rb +20 -0
  404. data/lib/datadog/tracing/contrib/concurrent_ruby/configuration/settings.rb +24 -0
  405. data/lib/datadog/tracing/contrib/concurrent_ruby/context_composite_executor_service.rb +53 -0
  406. data/lib/datadog/tracing/contrib/concurrent_ruby/ext.rb +16 -0
  407. data/lib/datadog/tracing/contrib/concurrent_ruby/future_patch.rb +20 -0
  408. data/lib/datadog/tracing/contrib/concurrent_ruby/integration.rb +44 -0
  409. data/lib/datadog/tracing/contrib/concurrent_ruby/patcher.rb +49 -0
  410. data/lib/datadog/tracing/contrib/concurrent_ruby/promises_future_patch.rb +22 -0
  411. data/lib/datadog/tracing/contrib/configurable.rb +102 -0
  412. data/lib/datadog/tracing/contrib/configuration/resolver.rb +85 -0
  413. data/lib/datadog/tracing/contrib/configuration/resolvers/pattern_resolver.rb +43 -0
  414. data/lib/datadog/tracing/contrib/configuration/settings.rb +43 -0
  415. data/lib/datadog/tracing/contrib/dalli/configuration/settings.rb +58 -0
  416. data/lib/datadog/tracing/contrib/dalli/ext.rb +40 -0
  417. data/lib/datadog/tracing/contrib/dalli/instrumentation.rb +75 -0
  418. data/lib/datadog/tracing/contrib/dalli/integration.rb +52 -0
  419. data/lib/datadog/tracing/contrib/dalli/patcher.rb +28 -0
  420. data/lib/datadog/tracing/contrib/dalli/quantize.rb +26 -0
  421. data/lib/datadog/tracing/contrib/delayed_job/configuration/settings.rb +49 -0
  422. data/lib/datadog/tracing/contrib/delayed_job/ext.rb +29 -0
  423. data/lib/datadog/tracing/contrib/delayed_job/integration.rb +43 -0
  424. data/lib/datadog/tracing/contrib/delayed_job/patcher.rb +37 -0
  425. data/lib/datadog/tracing/contrib/delayed_job/plugin.rb +108 -0
  426. data/lib/datadog/tracing/contrib/delayed_job/server_internal_tracer/worker.rb +34 -0
  427. data/lib/datadog/tracing/contrib/elasticsearch/configuration/settings.rb +57 -0
  428. data/lib/datadog/tracing/contrib/elasticsearch/ext.rb +34 -0
  429. data/lib/datadog/tracing/contrib/elasticsearch/integration.rb +50 -0
  430. data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +164 -0
  431. data/lib/datadog/tracing/contrib/elasticsearch/quantize.rb +87 -0
  432. data/lib/datadog/tracing/contrib/ethon/configuration/settings.rb +56 -0
  433. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +223 -0
  434. data/lib/datadog/tracing/contrib/ethon/ext.rb +32 -0
  435. data/lib/datadog/tracing/contrib/ethon/integration.rb +48 -0
  436. data/lib/datadog/tracing/contrib/ethon/multi_patch.rb +102 -0
  437. data/lib/datadog/tracing/contrib/ethon/patcher.rb +30 -0
  438. data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +74 -0
  439. data/lib/datadog/tracing/contrib/excon/ext.rb +30 -0
  440. data/lib/datadog/tracing/contrib/excon/integration.rb +48 -0
  441. data/lib/datadog/tracing/contrib/excon/middleware.rb +196 -0
  442. data/lib/datadog/tracing/contrib/excon/patcher.rb +31 -0
  443. data/lib/datadog/tracing/contrib/ext.rb +55 -0
  444. data/lib/datadog/tracing/contrib/extensions.rb +228 -0
  445. data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +77 -0
  446. data/lib/datadog/tracing/contrib/faraday/connection.rb +22 -0
  447. data/lib/datadog/tracing/contrib/faraday/ext.rb +30 -0
  448. data/lib/datadog/tracing/contrib/faraday/integration.rb +48 -0
  449. data/lib/datadog/tracing/contrib/faraday/middleware.rb +112 -0
  450. data/lib/datadog/tracing/contrib/faraday/patcher.rb +56 -0
  451. data/lib/datadog/tracing/contrib/faraday/rack_builder.rb +22 -0
  452. data/lib/datadog/tracing/contrib/grape/configuration/settings.rb +55 -0
  453. data/lib/datadog/tracing/contrib/grape/endpoint.rb +256 -0
  454. data/lib/datadog/tracing/contrib/grape/ext.rb +30 -0
  455. data/lib/datadog/tracing/contrib/grape/instrumentation.rb +37 -0
  456. data/lib/datadog/tracing/contrib/grape/integration.rb +44 -0
  457. data/lib/datadog/tracing/contrib/grape/patcher.rb +33 -0
  458. data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +50 -0
  459. data/lib/datadog/tracing/contrib/graphql/ext.rb +20 -0
  460. data/lib/datadog/tracing/contrib/graphql/integration.rb +56 -0
  461. data/lib/datadog/tracing/contrib/graphql/patcher.rb +55 -0
  462. data/lib/datadog/tracing/contrib/graphql/trace_patcher.rb +24 -0
  463. data/lib/datadog/tracing/contrib/graphql/tracing_patcher.rb +28 -0
  464. data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +58 -0
  465. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +117 -0
  466. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +96 -0
  467. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor.rb +107 -0
  468. data/lib/datadog/tracing/contrib/grpc/distributed/fetcher.rb +26 -0
  469. data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +46 -0
  470. data/lib/datadog/tracing/contrib/grpc/ext.rb +29 -0
  471. data/lib/datadog/tracing/contrib/grpc/formatting.rb +127 -0
  472. data/lib/datadog/tracing/contrib/grpc/integration.rb +50 -0
  473. data/lib/datadog/tracing/contrib/grpc/intercept_with_datadog.rb +53 -0
  474. data/lib/datadog/tracing/contrib/grpc/patcher.rb +34 -0
  475. data/lib/datadog/tracing/contrib/grpc.rb +45 -0
  476. data/lib/datadog/tracing/contrib/hanami/action_tracer.rb +47 -0
  477. data/lib/datadog/tracing/contrib/hanami/configuration/settings.rb +23 -0
  478. data/lib/datadog/tracing/contrib/hanami/ext.rb +24 -0
  479. data/lib/datadog/tracing/contrib/hanami/integration.rb +44 -0
  480. data/lib/datadog/tracing/contrib/hanami/patcher.rb +33 -0
  481. data/lib/datadog/tracing/contrib/hanami/plugin.rb +23 -0
  482. data/lib/datadog/tracing/contrib/hanami/renderer_policy_tracing.rb +41 -0
  483. data/lib/datadog/tracing/contrib/hanami/router_tracing.rb +44 -0
  484. data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +40 -0
  485. data/lib/datadog/tracing/contrib/http/configuration/settings.rb +69 -0
  486. data/lib/datadog/tracing/contrib/http/distributed/fetcher.rb +38 -0
  487. data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +45 -0
  488. data/lib/datadog/tracing/contrib/http/ext.rb +29 -0
  489. data/lib/datadog/tracing/contrib/http/instrumentation.rb +144 -0
  490. data/lib/datadog/tracing/contrib/http/integration.rb +49 -0
  491. data/lib/datadog/tracing/contrib/http/patcher.rb +30 -0
  492. data/lib/datadog/tracing/contrib/http.rb +45 -0
  493. data/lib/datadog/tracing/contrib/http_annotation_helper.rb +17 -0
  494. data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +68 -0
  495. data/lib/datadog/tracing/contrib/httpclient/ext.rb +30 -0
  496. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +137 -0
  497. data/lib/datadog/tracing/contrib/httpclient/integration.rb +48 -0
  498. data/lib/datadog/tracing/contrib/httpclient/patcher.rb +42 -0
  499. data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +68 -0
  500. data/lib/datadog/tracing/contrib/httprb/ext.rb +29 -0
  501. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +145 -0
  502. data/lib/datadog/tracing/contrib/httprb/integration.rb +48 -0
  503. data/lib/datadog/tracing/contrib/httprb/patcher.rb +42 -0
  504. data/lib/datadog/tracing/contrib/integration.rb +78 -0
  505. data/lib/datadog/tracing/contrib/kafka/configuration/settings.rb +39 -0
  506. data/lib/datadog/tracing/contrib/kafka/consumer_event.rb +19 -0
  507. data/lib/datadog/tracing/contrib/kafka/consumer_group_event.rb +18 -0
  508. data/lib/datadog/tracing/contrib/kafka/event.rb +53 -0
  509. data/lib/datadog/tracing/contrib/kafka/events/connection/request.rb +42 -0
  510. data/lib/datadog/tracing/contrib/kafka/events/consumer/process_batch.rb +49 -0
  511. data/lib/datadog/tracing/contrib/kafka/events/consumer/process_message.rb +47 -0
  512. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/heartbeat.rb +47 -0
  513. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/join_group.rb +37 -0
  514. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/leave_group.rb +37 -0
  515. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/sync_group.rb +37 -0
  516. data/lib/datadog/tracing/contrib/kafka/events/produce_operation/send_messages.rb +41 -0
  517. data/lib/datadog/tracing/contrib/kafka/events/producer/deliver_messages.rb +44 -0
  518. data/lib/datadog/tracing/contrib/kafka/events.rb +48 -0
  519. data/lib/datadog/tracing/contrib/kafka/ext.rb +55 -0
  520. data/lib/datadog/tracing/contrib/kafka/integration.rb +44 -0
  521. data/lib/datadog/tracing/contrib/kafka/patcher.rb +29 -0
  522. data/lib/datadog/tracing/contrib/lograge/configuration/settings.rb +24 -0
  523. data/lib/datadog/tracing/contrib/lograge/ext.rb +15 -0
  524. data/lib/datadog/tracing/contrib/lograge/instrumentation.rb +31 -0
  525. data/lib/datadog/tracing/contrib/lograge/integration.rb +50 -0
  526. data/lib/datadog/tracing/contrib/lograge/patcher.rb +29 -0
  527. data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +56 -0
  528. data/lib/datadog/tracing/contrib/mongodb/ext.rb +38 -0
  529. data/lib/datadog/tracing/contrib/mongodb/instrumentation.rb +47 -0
  530. data/lib/datadog/tracing/contrib/mongodb/integration.rb +48 -0
  531. data/lib/datadog/tracing/contrib/mongodb/parsers.rb +49 -0
  532. data/lib/datadog/tracing/contrib/mongodb/patcher.rb +34 -0
  533. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +141 -0
  534. data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +64 -0
  535. data/lib/datadog/tracing/contrib/mysql2/ext.rb +28 -0
  536. data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +95 -0
  537. data/lib/datadog/tracing/contrib/mysql2/integration.rb +43 -0
  538. data/lib/datadog/tracing/contrib/mysql2/patcher.rb +31 -0
  539. data/lib/datadog/tracing/contrib/opensearch/configuration/settings.rb +54 -0
  540. data/lib/datadog/tracing/contrib/opensearch/ext.rb +38 -0
  541. data/lib/datadog/tracing/contrib/opensearch/integration.rb +44 -0
  542. data/lib/datadog/tracing/contrib/opensearch/patcher.rb +135 -0
  543. data/lib/datadog/tracing/contrib/opensearch/quantize.rb +81 -0
  544. data/lib/datadog/tracing/contrib/patchable.rb +109 -0
  545. data/lib/datadog/tracing/contrib/patcher.rb +85 -0
  546. data/lib/datadog/tracing/contrib/pg/configuration/settings.rb +64 -0
  547. data/lib/datadog/tracing/contrib/pg/ext.rb +35 -0
  548. data/lib/datadog/tracing/contrib/pg/instrumentation.rb +211 -0
  549. data/lib/datadog/tracing/contrib/pg/integration.rb +43 -0
  550. data/lib/datadog/tracing/contrib/pg/patcher.rb +31 -0
  551. data/lib/datadog/tracing/contrib/presto/configuration/settings.rb +52 -0
  552. data/lib/datadog/tracing/contrib/presto/ext.rb +38 -0
  553. data/lib/datadog/tracing/contrib/presto/instrumentation.rb +138 -0
  554. data/lib/datadog/tracing/contrib/presto/integration.rb +43 -0
  555. data/lib/datadog/tracing/contrib/presto/patcher.rb +37 -0
  556. data/lib/datadog/tracing/contrib/propagation/sql_comment/comment.rb +41 -0
  557. data/lib/datadog/tracing/contrib/propagation/sql_comment/ext.rb +33 -0
  558. data/lib/datadog/tracing/contrib/propagation/sql_comment/mode.rb +28 -0
  559. data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +55 -0
  560. data/lib/datadog/tracing/contrib/que/configuration/settings.rb +55 -0
  561. data/lib/datadog/tracing/contrib/que/ext.rb +33 -0
  562. data/lib/datadog/tracing/contrib/que/integration.rb +44 -0
  563. data/lib/datadog/tracing/contrib/que/patcher.rb +26 -0
  564. data/lib/datadog/tracing/contrib/que/tracer.rb +63 -0
  565. data/lib/datadog/tracing/contrib/racecar/configuration/settings.rb +47 -0
  566. data/lib/datadog/tracing/contrib/racecar/event.rb +81 -0
  567. data/lib/datadog/tracing/contrib/racecar/events/batch.rb +38 -0
  568. data/lib/datadog/tracing/contrib/racecar/events/consume.rb +35 -0
  569. data/lib/datadog/tracing/contrib/racecar/events/message.rb +38 -0
  570. data/lib/datadog/tracing/contrib/racecar/events.rb +36 -0
  571. data/lib/datadog/tracing/contrib/racecar/ext.rb +33 -0
  572. data/lib/datadog/tracing/contrib/racecar/integration.rb +44 -0
  573. data/lib/datadog/tracing/contrib/racecar/patcher.rb +29 -0
  574. data/lib/datadog/tracing/contrib/rack/configuration/settings.rb +59 -0
  575. data/lib/datadog/tracing/contrib/rack/ext.rb +30 -0
  576. data/lib/datadog/tracing/contrib/rack/header_collection.rb +40 -0
  577. data/lib/datadog/tracing/contrib/rack/header_tagging.rb +63 -0
  578. data/lib/datadog/tracing/contrib/rack/integration.rb +50 -0
  579. data/lib/datadog/tracing/contrib/rack/middlewares.rb +265 -0
  580. data/lib/datadog/tracing/contrib/rack/patcher.rb +119 -0
  581. data/lib/datadog/tracing/contrib/rack/request_queue.rb +48 -0
  582. data/lib/datadog/tracing/contrib/rack/trace_proxy_middleware.rb +52 -0
  583. data/lib/datadog/tracing/contrib/rails/auto_instrument_railtie.rb +10 -0
  584. data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +76 -0
  585. data/lib/datadog/tracing/contrib/rails/ext.rb +23 -0
  586. data/lib/datadog/tracing/contrib/rails/framework.rb +148 -0
  587. data/lib/datadog/tracing/contrib/rails/integration.rb +52 -0
  588. data/lib/datadog/tracing/contrib/rails/log_injection.rb +29 -0
  589. data/lib/datadog/tracing/contrib/rails/middlewares.rb +46 -0
  590. data/lib/datadog/tracing/contrib/rails/patcher.rb +88 -0
  591. data/lib/datadog/tracing/contrib/rails/railtie.rb +19 -0
  592. data/lib/datadog/tracing/contrib/rails/utils.rb +26 -0
  593. data/lib/datadog/tracing/contrib/rake/configuration/settings.rb +55 -0
  594. data/lib/datadog/tracing/contrib/rake/ext.rb +27 -0
  595. data/lib/datadog/tracing/contrib/rake/instrumentation.rb +103 -0
  596. data/lib/datadog/tracing/contrib/rake/integration.rb +43 -0
  597. data/lib/datadog/tracing/contrib/rake/patcher.rb +33 -0
  598. data/lib/datadog/tracing/contrib/redis/configuration/resolver.rb +49 -0
  599. data/lib/datadog/tracing/contrib/redis/configuration/settings.rb +57 -0
  600. data/lib/datadog/tracing/contrib/redis/ext.rb +35 -0
  601. data/lib/datadog/tracing/contrib/redis/instrumentation.rb +53 -0
  602. data/lib/datadog/tracing/contrib/redis/integration.rb +80 -0
  603. data/lib/datadog/tracing/contrib/redis/patcher.rb +92 -0
  604. data/lib/datadog/tracing/contrib/redis/quantize.rb +80 -0
  605. data/lib/datadog/tracing/contrib/redis/tags.rb +68 -0
  606. data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +85 -0
  607. data/lib/datadog/tracing/contrib/redis/vendor/LICENSE +20 -0
  608. data/lib/datadog/tracing/contrib/redis/vendor/resolver.rb +160 -0
  609. data/lib/datadog/tracing/contrib/registerable.rb +50 -0
  610. data/lib/datadog/tracing/contrib/registry.rb +52 -0
  611. data/lib/datadog/tracing/contrib/resque/configuration/settings.rb +42 -0
  612. data/lib/datadog/tracing/contrib/resque/ext.rb +22 -0
  613. data/lib/datadog/tracing/contrib/resque/integration.rb +48 -0
  614. data/lib/datadog/tracing/contrib/resque/patcher.rb +29 -0
  615. data/lib/datadog/tracing/contrib/resque/resque_job.rb +106 -0
  616. data/lib/datadog/tracing/contrib/rest_client/configuration/settings.rb +55 -0
  617. data/lib/datadog/tracing/contrib/rest_client/ext.rb +28 -0
  618. data/lib/datadog/tracing/contrib/rest_client/integration.rb +43 -0
  619. data/lib/datadog/tracing/contrib/rest_client/patcher.rb +28 -0
  620. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +129 -0
  621. data/lib/datadog/tracing/contrib/roda/configuration/settings.rb +38 -0
  622. data/lib/datadog/tracing/contrib/roda/ext.rb +19 -0
  623. data/lib/datadog/tracing/contrib/roda/instrumentation.rb +76 -0
  624. data/lib/datadog/tracing/contrib/roda/integration.rb +45 -0
  625. data/lib/datadog/tracing/contrib/roda/patcher.rb +30 -0
  626. data/lib/datadog/tracing/contrib/semantic_logger/configuration/settings.rb +24 -0
  627. data/lib/datadog/tracing/contrib/semantic_logger/ext.rb +15 -0
  628. data/lib/datadog/tracing/contrib/semantic_logger/instrumentation.rb +35 -0
  629. data/lib/datadog/tracing/contrib/semantic_logger/integration.rb +52 -0
  630. data/lib/datadog/tracing/contrib/semantic_logger/patcher.rb +29 -0
  631. data/lib/datadog/tracing/contrib/sequel/configuration/settings.rb +37 -0
  632. data/lib/datadog/tracing/contrib/sequel/database.rb +62 -0
  633. data/lib/datadog/tracing/contrib/sequel/dataset.rb +67 -0
  634. data/lib/datadog/tracing/contrib/sequel/ext.rb +23 -0
  635. data/lib/datadog/tracing/contrib/sequel/integration.rb +43 -0
  636. data/lib/datadog/tracing/contrib/sequel/patcher.rb +37 -0
  637. data/lib/datadog/tracing/contrib/sequel/utils.rb +90 -0
  638. data/lib/datadog/tracing/contrib/shoryuken/configuration/settings.rb +43 -0
  639. data/lib/datadog/tracing/contrib/shoryuken/ext.rb +27 -0
  640. data/lib/datadog/tracing/contrib/shoryuken/integration.rb +44 -0
  641. data/lib/datadog/tracing/contrib/shoryuken/patcher.rb +28 -0
  642. data/lib/datadog/tracing/contrib/shoryuken/tracer.rb +65 -0
  643. data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +62 -0
  644. data/lib/datadog/tracing/contrib/sidekiq/configuration/settings.rb +47 -0
  645. data/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb +46 -0
  646. data/lib/datadog/tracing/contrib/sidekiq/ext.rb +44 -0
  647. data/lib/datadog/tracing/contrib/sidekiq/integration.rb +61 -0
  648. data/lib/datadog/tracing/contrib/sidekiq/patcher.rb +90 -0
  649. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/heartbeat.rb +61 -0
  650. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/job_fetch.rb +36 -0
  651. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/redis_info.rb +34 -0
  652. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/scheduled_poller.rb +57 -0
  653. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/stop.rb +34 -0
  654. data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +88 -0
  655. data/lib/datadog/tracing/contrib/sidekiq/utils.rb +44 -0
  656. data/lib/datadog/tracing/contrib/sidekiq.rb +37 -0
  657. data/lib/datadog/tracing/contrib/sinatra/configuration/settings.rb +46 -0
  658. data/lib/datadog/tracing/contrib/sinatra/env.rb +38 -0
  659. data/lib/datadog/tracing/contrib/sinatra/ext.rb +31 -0
  660. data/lib/datadog/tracing/contrib/sinatra/framework.rb +116 -0
  661. data/lib/datadog/tracing/contrib/sinatra/integration.rb +43 -0
  662. data/lib/datadog/tracing/contrib/sinatra/patcher.rb +75 -0
  663. data/lib/datadog/tracing/contrib/sinatra/tracer.rb +86 -0
  664. data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +109 -0
  665. data/lib/datadog/tracing/contrib/sneakers/configuration/settings.rb +43 -0
  666. data/lib/datadog/tracing/contrib/sneakers/ext.rb +27 -0
  667. data/lib/datadog/tracing/contrib/sneakers/integration.rb +44 -0
  668. data/lib/datadog/tracing/contrib/sneakers/patcher.rb +27 -0
  669. data/lib/datadog/tracing/contrib/sneakers/tracer.rb +60 -0
  670. data/lib/datadog/tracing/contrib/span_attribute_schema.rb +92 -0
  671. data/lib/datadog/tracing/contrib/status_range_env_parser.rb +33 -0
  672. data/lib/datadog/tracing/contrib/status_range_matcher.rb +25 -0
  673. data/lib/datadog/tracing/contrib/stripe/configuration/settings.rb +37 -0
  674. data/lib/datadog/tracing/contrib/stripe/ext.rb +27 -0
  675. data/lib/datadog/tracing/contrib/stripe/integration.rb +43 -0
  676. data/lib/datadog/tracing/contrib/stripe/patcher.rb +28 -0
  677. data/lib/datadog/tracing/contrib/stripe/request.rb +67 -0
  678. data/lib/datadog/tracing/contrib/sucker_punch/configuration/settings.rb +39 -0
  679. data/lib/datadog/tracing/contrib/sucker_punch/exception_handler.rb +28 -0
  680. data/lib/datadog/tracing/contrib/sucker_punch/ext.rb +28 -0
  681. data/lib/datadog/tracing/contrib/sucker_punch/instrumentation.rb +104 -0
  682. data/lib/datadog/tracing/contrib/sucker_punch/integration.rb +43 -0
  683. data/lib/datadog/tracing/contrib/sucker_punch/patcher.rb +35 -0
  684. data/lib/datadog/tracing/contrib/trilogy/configuration/settings.rb +58 -0
  685. data/lib/datadog/tracing/contrib/trilogy/ext.rb +27 -0
  686. data/lib/datadog/tracing/contrib/trilogy/instrumentation.rb +94 -0
  687. data/lib/datadog/tracing/contrib/trilogy/integration.rb +43 -0
  688. data/lib/datadog/tracing/contrib/trilogy/patcher.rb +31 -0
  689. data/lib/datadog/tracing/contrib/utils/database.rb +31 -0
  690. data/lib/datadog/tracing/contrib/utils/quantization/hash.rb +111 -0
  691. data/lib/datadog/tracing/contrib/utils/quantization/http.rb +179 -0
  692. data/lib/datadog/tracing/contrib.rb +81 -0
  693. data/lib/datadog/tracing/correlation.rb +103 -0
  694. data/lib/datadog/tracing/diagnostics/environment_logger.rb +159 -0
  695. data/lib/datadog/tracing/diagnostics/ext.rb +36 -0
  696. data/lib/datadog/tracing/diagnostics/health.rb +40 -0
  697. data/lib/datadog/tracing/distributed/b3_multi.rb +73 -0
  698. data/lib/datadog/tracing/distributed/b3_single.rb +69 -0
  699. data/lib/datadog/tracing/distributed/datadog.rb +200 -0
  700. data/lib/datadog/tracing/distributed/datadog_tags_codec.rb +84 -0
  701. data/lib/datadog/tracing/distributed/fetcher.rb +21 -0
  702. data/lib/datadog/tracing/distributed/helpers.rb +65 -0
  703. data/lib/datadog/tracing/distributed/none.rb +18 -0
  704. data/lib/datadog/tracing/distributed/propagation.rb +121 -0
  705. data/lib/datadog/tracing/distributed/trace_context.rb +436 -0
  706. data/lib/datadog/tracing/event.rb +76 -0
  707. data/lib/datadog/tracing/flush.rb +96 -0
  708. data/lib/datadog/tracing/metadata/analytics.rb +26 -0
  709. data/lib/datadog/tracing/metadata/errors.rb +24 -0
  710. data/lib/datadog/tracing/metadata/ext.rb +193 -0
  711. data/lib/datadog/tracing/metadata/tagging.rb +131 -0
  712. data/lib/datadog/tracing/metadata.rb +20 -0
  713. data/lib/datadog/tracing/pipeline/span_filter.rb +46 -0
  714. data/lib/datadog/tracing/pipeline/span_processor.rb +39 -0
  715. data/lib/datadog/tracing/pipeline.rb +63 -0
  716. data/lib/datadog/tracing/remote.rb +78 -0
  717. data/lib/datadog/tracing/runtime/metrics.rb +17 -0
  718. data/lib/datadog/tracing/sampling/all_sampler.rb +24 -0
  719. data/lib/datadog/tracing/sampling/ext.rb +56 -0
  720. data/lib/datadog/tracing/sampling/matcher.rb +65 -0
  721. data/lib/datadog/tracing/sampling/priority_sampler.rb +160 -0
  722. data/lib/datadog/tracing/sampling/rate_by_key_sampler.rb +87 -0
  723. data/lib/datadog/tracing/sampling/rate_by_service_sampler.rb +63 -0
  724. data/lib/datadog/tracing/sampling/rate_limiter.rb +185 -0
  725. data/lib/datadog/tracing/sampling/rate_sampler.rb +58 -0
  726. data/lib/datadog/tracing/sampling/rule.rb +61 -0
  727. data/lib/datadog/tracing/sampling/rule_sampler.rb +148 -0
  728. data/lib/datadog/tracing/sampling/sampler.rb +32 -0
  729. data/lib/datadog/tracing/sampling/span/ext.rb +25 -0
  730. data/lib/datadog/tracing/sampling/span/matcher.rb +89 -0
  731. data/lib/datadog/tracing/sampling/span/rule.rb +78 -0
  732. data/lib/datadog/tracing/sampling/span/rule_parser.rb +104 -0
  733. data/lib/datadog/tracing/sampling/span/sampler.rb +77 -0
  734. data/lib/datadog/tracing/span.rb +207 -0
  735. data/lib/datadog/tracing/span_operation.rb +498 -0
  736. data/lib/datadog/tracing/sync_writer.rb +67 -0
  737. data/lib/datadog/tracing/trace_digest.rb +185 -0
  738. data/lib/datadog/tracing/trace_operation.rb +492 -0
  739. data/lib/datadog/tracing/trace_segment.rb +222 -0
  740. data/lib/datadog/tracing/tracer.rb +531 -0
  741. data/lib/datadog/tracing/transport/http/api/instance.rb +37 -0
  742. data/lib/datadog/tracing/transport/http/api/spec.rb +19 -0
  743. data/lib/datadog/tracing/transport/http/api.rb +43 -0
  744. data/lib/datadog/tracing/transport/http/builder.rb +162 -0
  745. data/lib/datadog/tracing/transport/http/client.rb +57 -0
  746. data/lib/datadog/tracing/transport/http/statistics.rb +47 -0
  747. data/lib/datadog/tracing/transport/http/traces.rb +152 -0
  748. data/lib/datadog/tracing/transport/http.rb +97 -0
  749. data/lib/datadog/tracing/transport/io/client.rb +89 -0
  750. data/lib/datadog/tracing/transport/io/response.rb +27 -0
  751. data/lib/datadog/tracing/transport/io/traces.rb +101 -0
  752. data/lib/datadog/tracing/transport/io.rb +30 -0
  753. data/lib/datadog/tracing/transport/serializable_trace.rb +126 -0
  754. data/lib/datadog/tracing/transport/statistics.rb +77 -0
  755. data/lib/datadog/tracing/transport/trace_formatter.rb +240 -0
  756. data/lib/datadog/tracing/transport/traces.rb +224 -0
  757. data/lib/datadog/tracing/utils.rb +83 -0
  758. data/lib/datadog/tracing/workers/trace_writer.rb +196 -0
  759. data/lib/datadog/tracing/workers.rb +125 -0
  760. data/lib/datadog/tracing/writer.rb +188 -0
  761. data/lib/datadog/tracing.rb +169 -0
  762. data/lib/datadog/version.rb +26 -0
  763. data/lib/datadog.rb +10 -0
  764. metadata +886 -0
@@ -0,0 +1,418 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Datadog
4
+ module Profiling
5
+ # Responsible for wiring up the Profiler for execution
6
+ module Component
7
+ # Passing in a `nil` tracer is supported and will disable the following profiling features:
8
+ # * Code Hotspots panel in the trace viewer, as well as scoping a profile down to a span
9
+ # * Endpoint aggregation in the profiler UX, including normalization (resource per endpoint call)
10
+ def self.build_profiler_component(settings:, agent_settings:, optional_tracer:) # rubocop:disable Metrics/MethodLength
11
+ return [nil, { profiling_enabled: false }] unless settings.profiling.enabled
12
+
13
+ # Workaround for weird dependency direction: the Core::Configuration::Components class currently has a
14
+ # dependency on individual products, in this case the Profiler.
15
+ # (Note "currently": in the future we want to change this so core classes don't depend on specific products)
16
+ #
17
+ # If the current file included a `require 'datadog/profiler'` at its beginning, we would generate circular
18
+ # requires when used from profiling:
19
+ #
20
+ # datadog/profiling
21
+ # └─requires─> datadog/core
22
+ # └─requires─> datadog/core/configuration/components
23
+ # └─requires─> datadog/profiling # Loop!
24
+ #
25
+ # ...thus in #1998 we removed such a require.
26
+ #
27
+ # On the other hand, if datadog/core is loaded by a different product and no general `require 'datadog'` is
28
+ # done, then profiling may not be loaded, and thus to avoid this issue we do a require here (which is a
29
+ # no-op if profiling is already loaded).
30
+ require_relative '../profiling'
31
+
32
+ return [nil, { profiling_enabled: false }] unless Profiling.supported?
33
+
34
+ # Activate forking extensions
35
+ Profiling::Tasks::Setup.new.run
36
+
37
+ # NOTE: Please update the Initialization section of ProfilingDevelopment.md with any changes to this method
38
+
39
+ no_signals_workaround_enabled = no_signals_workaround_enabled?(settings)
40
+ timeline_enabled = settings.profiling.advanced.timeline_enabled
41
+ allocation_profiling_enabled = enable_allocation_profiling?(settings)
42
+ heap_sample_every = get_heap_sample_every(settings)
43
+ heap_profiling_enabled = enable_heap_profiling?(settings, allocation_profiling_enabled, heap_sample_every)
44
+ heap_size_profiling_enabled = enable_heap_size_profiling?(settings, heap_profiling_enabled)
45
+
46
+ overhead_target_percentage = valid_overhead_target(settings.profiling.advanced.overhead_target_percentage)
47
+ upload_period_seconds = [60, settings.profiling.advanced.upload_period_seconds].max
48
+
49
+ recorder = Datadog::Profiling::StackRecorder.new(
50
+ cpu_time_enabled: RUBY_PLATFORM.include?('linux'), # Only supported on Linux currently
51
+ alloc_samples_enabled: allocation_profiling_enabled,
52
+ heap_samples_enabled: heap_profiling_enabled,
53
+ heap_size_enabled: heap_size_profiling_enabled,
54
+ heap_sample_every: heap_sample_every,
55
+ timeline_enabled: timeline_enabled,
56
+ )
57
+ thread_context_collector = build_thread_context_collector(settings, recorder, optional_tracer, timeline_enabled)
58
+ worker = Datadog::Profiling::Collectors::CpuAndWallTimeWorker.new(
59
+ gc_profiling_enabled: enable_gc_profiling?(settings),
60
+ no_signals_workaround_enabled: no_signals_workaround_enabled,
61
+ thread_context_collector: thread_context_collector,
62
+ dynamic_sampling_rate_overhead_target_percentage: overhead_target_percentage,
63
+ allocation_profiling_enabled: allocation_profiling_enabled,
64
+ )
65
+
66
+ internal_metadata = {
67
+ no_signals_workaround_enabled: no_signals_workaround_enabled,
68
+ timeline_enabled: timeline_enabled,
69
+ heap_sample_every: heap_sample_every,
70
+ }.freeze
71
+
72
+ exporter = build_profiler_exporter(settings, recorder, worker, internal_metadata: internal_metadata)
73
+ transport = build_profiler_transport(settings, agent_settings)
74
+ scheduler = Profiling::Scheduler.new(exporter: exporter, transport: transport, interval: upload_period_seconds)
75
+
76
+ [Profiling::Profiler.new(worker: worker, scheduler: scheduler), { profiling_enabled: true }]
77
+ end
78
+
79
+ private_class_method def self.build_thread_context_collector(settings, recorder, optional_tracer, timeline_enabled)
80
+ Datadog::Profiling::Collectors::ThreadContext.new(
81
+ recorder: recorder,
82
+ max_frames: settings.profiling.advanced.max_frames,
83
+ tracer: optional_tracer,
84
+ endpoint_collection_enabled: settings.profiling.advanced.endpoint.collection.enabled,
85
+ timeline_enabled: timeline_enabled,
86
+ )
87
+ end
88
+
89
+ private_class_method def self.build_profiler_exporter(settings, recorder, worker, internal_metadata:)
90
+ info_collector = Profiling::Collectors::Info.new(settings)
91
+ code_provenance_collector =
92
+ (Profiling::Collectors::CodeProvenance.new if settings.profiling.advanced.code_provenance_enabled)
93
+
94
+ Profiling::Exporter.new(
95
+ pprof_recorder: recorder,
96
+ worker: worker,
97
+ info_collector: info_collector,
98
+ code_provenance_collector: code_provenance_collector,
99
+ internal_metadata: internal_metadata,
100
+ )
101
+ end
102
+
103
+ private_class_method def self.build_profiler_transport(settings, agent_settings)
104
+ settings.profiling.exporter.transport ||
105
+ Profiling::HttpTransport.new(
106
+ agent_settings: agent_settings,
107
+ site: settings.site,
108
+ api_key: settings.api_key,
109
+ upload_timeout_seconds: settings.profiling.upload.timeout_seconds,
110
+ )
111
+ end
112
+
113
+ private_class_method def self.enable_gc_profiling?(settings)
114
+ # See comments on the setting definition for more context on why it exists.
115
+ if settings.profiling.advanced.force_enable_gc_profiling
116
+ if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('3')
117
+ Datadog.logger.debug(
118
+ 'Profiling time/resources spent in Garbage Collection force enabled. Do not use Ractors in combination ' \
119
+ 'with this option as profiles will be incomplete.'
120
+ )
121
+ end
122
+
123
+ true
124
+ else
125
+ false
126
+ end
127
+ end
128
+
129
+ private_class_method def self.get_heap_sample_every(settings)
130
+ heap_sample_rate = settings.profiling.advanced.experimental_heap_sample_rate
131
+
132
+ raise ArgumentError, "Heap sample rate must be a positive integer. Was #{heap_sample_rate}" if heap_sample_rate <= 0
133
+
134
+ heap_sample_rate
135
+ end
136
+
137
+ private_class_method def self.enable_allocation_profiling?(settings)
138
+ unless settings.profiling.allocation_enabled
139
+ # Allocation profiling disabled, short-circuit out
140
+ return false
141
+ end
142
+
143
+ # Allocation sampling is safe and supported on Ruby 2.x, but has a few caveats on Ruby 3.x.
144
+
145
+ # SEVERE - All configurations
146
+ # Ruby 3.2.0 to 3.2.2 have a bug in the newobj tracepoint (https://bugs.ruby-lang.org/issues/19482,
147
+ # https://github.com/ruby/ruby/pull/7464) that makes this crash in any configuration. This bug is
148
+ # fixed on Ruby versions 3.2.3 and 3.3.0.
149
+ if RUBY_VERSION.start_with?('3.2.') && RUBY_VERSION < '3.2.3'
150
+ Datadog.logger.warn(
151
+ 'Allocation profiling is not supported in Ruby versions 3.2.0, 3.2.1 and 3.2.2 and will be forcibly '\
152
+ 'disabled. This is due to a VM bug that can lead to crashes (https://bugs.ruby-lang.org/issues/19482). '\
153
+ 'Other Ruby versions do not suffer from this issue.'
154
+ )
155
+ return false
156
+ end
157
+
158
+ # SEVERE - Only with Ractors
159
+ # On Ruby versions 3.0 (all), 3.1.0 to 3.1.3, and 3.2.0 to 3.2.2 allocation profiling can trigger a VM bug
160
+ # that causes a segmentation fault during garbage collection of Ractors
161
+ # (https://bugs.ruby-lang.org/issues/18464). We don't recommend using this feature on such Rubies.
162
+ # This bug is fixed on Ruby versions 3.1.4, 3.2.3 and 3.3.0.
163
+ if RUBY_VERSION.start_with?('3.0.') ||
164
+ (RUBY_VERSION.start_with?('3.1.') && RUBY_VERSION < '3.1.4') ||
165
+ (RUBY_VERSION.start_with?('3.2.') && RUBY_VERSION < '3.2.3')
166
+ Datadog.logger.warn(
167
+ "Current Ruby version (#{RUBY_VERSION}) has a VM bug where enabling allocation profiling while using "\
168
+ 'Ractors may cause unexpected issues, including crashes (https://bugs.ruby-lang.org/issues/18464). '\
169
+ 'This does not happen if Ractors are not used.'
170
+ )
171
+ # ANNOYANCE - Only with Ractors
172
+ # On all known versions of Ruby 3.x, due to https://bugs.ruby-lang.org/issues/19112, when a ractor gets
173
+ # garbage collected, Ruby will disable all active tracepoints, which this feature internally relies on.
174
+ elsif RUBY_VERSION.start_with?('3.')
175
+ Datadog.logger.warn(
176
+ 'In all known versions of Ruby 3.x, using Ractors may result in allocation profiling unexpectedly ' \
177
+ 'stopping (https://bugs.ruby-lang.org/issues/19112). Note that this stop has no impact in your ' \
178
+ 'application stability or performance. This does not happen if Ractors are not used.'
179
+ )
180
+ end
181
+
182
+ Datadog.logger.debug('Enabled allocation profiling')
183
+
184
+ true
185
+ end
186
+
187
+ private_class_method def self.enable_heap_profiling?(settings, allocation_profiling_enabled, heap_sample_rate)
188
+ heap_profiling_enabled = settings.profiling.advanced.experimental_heap_enabled
189
+
190
+ return false unless heap_profiling_enabled
191
+
192
+ if RUBY_VERSION.start_with?('2.') && RUBY_VERSION < '2.7'
193
+ Datadog.logger.warn(
194
+ 'Heap profiling currently relies on features introduced in Ruby 2.7 and will be forcibly disabled. '\
195
+ 'Please upgrade to Ruby >= 2.7 in order to use this feature.'
196
+ )
197
+ return false
198
+ end
199
+
200
+ if RUBY_VERSION < '3.1'
201
+ Datadog.logger.debug(
202
+ "Current Ruby version (#{RUBY_VERSION}) supports forced object recycling which has a bug that the " \
203
+ 'heap profiler is forced to work around to remain accurate. This workaround requires force-setting '\
204
+ "the SEEN_OBJ_ID flag on objects that should have it but don't. Full details can be found in " \
205
+ 'https://github.com/DataDog/dd-trace-rb/pull/3360. This workaround should be safe but can be ' \
206
+ 'bypassed by disabling the heap profiler or upgrading to Ruby >= 3.1 where forced object recycling ' \
207
+ 'was completely removed (https://bugs.ruby-lang.org/issues/18290).'
208
+ )
209
+ end
210
+
211
+ unless allocation_profiling_enabled
212
+ raise ArgumentError,
213
+ 'Heap profiling requires allocation profiling to be enabled'
214
+ end
215
+
216
+ Datadog.logger.warn(
217
+ "Enabled experimental heap profiling: heap_sample_rate=#{heap_sample_rate}. This is experimental, not " \
218
+ 'recommended, and will increase overhead!'
219
+ )
220
+
221
+ true
222
+ end
223
+
224
+ private_class_method def self.enable_heap_size_profiling?(settings, heap_profiling_enabled)
225
+ heap_size_profiling_enabled = settings.profiling.advanced.experimental_heap_size_enabled
226
+
227
+ return false unless heap_profiling_enabled && heap_size_profiling_enabled
228
+
229
+ Datadog.logger.warn(
230
+ 'Enabled experimental heap size profiling. This is experimental, not recommended, and will increase overhead!'
231
+ )
232
+
233
+ true
234
+ end
235
+
236
+ private_class_method def self.no_signals_workaround_enabled?(settings) # rubocop:disable Metrics/MethodLength
237
+ setting_value = settings.profiling.advanced.no_signals_workaround_enabled
238
+ legacy_ruby_that_should_use_workaround = RUBY_VERSION.start_with?('2.3.', '2.4.', '2.5.')
239
+
240
+ unless [true, false, :auto].include?(setting_value)
241
+ Datadog.logger.error(
242
+ "Ignoring invalid value for profiling no_signals_workaround_enabled setting: #{setting_value.inspect}. " \
243
+ 'Valid options are `true`, `false` or (default) `:auto`.'
244
+ )
245
+
246
+ setting_value = :auto
247
+ end
248
+
249
+ if setting_value == false
250
+ if legacy_ruby_that_should_use_workaround
251
+ Datadog.logger.warn(
252
+ 'The profiling "no signals" workaround has been disabled via configuration on a legacy Ruby version ' \
253
+ '(< 2.6). This is not recommended ' \
254
+ 'in production environments, as due to limitations in Ruby APIs, we suspect it may lead to crashes ' \
255
+ 'in very rare situations. Please report any issues you run into to Datadog support or ' \
256
+ 'via <https://github.com/datadog/dd-trace-rb/issues/new>!'
257
+ )
258
+ else
259
+ Datadog.logger.warn('Profiling "no signals" workaround disabled via configuration')
260
+ end
261
+
262
+ return false
263
+ end
264
+
265
+ if setting_value == true
266
+ Datadog.logger.warn(
267
+ 'Profiling "no signals" workaround enabled via configuration. Profiling data will have lower quality.'
268
+ )
269
+
270
+ return true
271
+ end
272
+
273
+ # Setting is in auto mode. Let's probe to see if we should enable it:
274
+
275
+ # We don't warn users in this situation because "upgrade your Ruby" is not a great warning
276
+ return true if legacy_ruby_that_should_use_workaround
277
+
278
+ if Gem.loaded_specs['mysql2'] && incompatible_libmysqlclient_version?(settings)
279
+ Datadog.logger.warn(
280
+ 'Enabling the profiling "no signals" workaround because an incompatible version of the mysql2 gem is ' \
281
+ 'installed. Profiling data will have lower quality. ' \
282
+ 'To fix this, upgrade the libmysqlclient in your OS image to version 8.0.0 or above.'
283
+ )
284
+ return true
285
+ end
286
+
287
+ if Gem.loaded_specs['rugged']
288
+ Datadog.logger.warn(
289
+ 'Enabling the profiling "no signals" workaround because the rugged gem is installed. ' \
290
+ 'This is needed because some operations on this gem are currently incompatible with the normal working mode ' \
291
+ 'of the profiler, as detailed in <https://github.com/datadog/dd-trace-rb/issues/2721>. ' \
292
+ 'Profiling data will have lower quality.'
293
+ )
294
+ return true
295
+ end
296
+
297
+ if (defined?(::PhusionPassenger) || Gem.loaded_specs['passenger']) && incompatible_passenger_version?
298
+ Datadog.logger.warn(
299
+ 'Enabling the profiling "no signals" workaround because an incompatible version of the passenger gem is ' \
300
+ 'installed. Profiling data will have lower quality.' \
301
+ 'To fix this, upgrade the passenger gem to version 6.0.19 or above.'
302
+ )
303
+ return true
304
+ end
305
+
306
+ false
307
+ end
308
+
309
+ # Versions of libmysqlclient prior to 8.0.0 are known to have buggy handling of system call interruptions.
310
+ # The profiler can sometimes cause system call interruptions, and so this combination can cause queries to fail.
311
+ #
312
+ # See https://bugs.mysql.com/bug.php?id=83109 and
313
+ # https://docs.datadoghq.com/profiler/profiler_troubleshooting/ruby/#unexpected-run-time-failures-and-errors-from-ruby-gems-that-use-native-extensions-in-dd-trace-rb-1110
314
+ # for details.
315
+ #
316
+ # The `mysql2` gem's `info` method can be used to determine which `libmysqlclient` version is in use, and thus to
317
+ # detect if it's safe for the profiler to use signals or if we need to employ a fallback.
318
+ private_class_method def self.incompatible_libmysqlclient_version?(settings)
319
+ return true if settings.profiling.advanced.skip_mysql2_check
320
+
321
+ Datadog.logger.debug(
322
+ 'Requiring `mysql2` to check if the `libmysqlclient` version it uses is compatible with profiling'
323
+ )
324
+
325
+ begin
326
+ require 'mysql2'
327
+
328
+ # The mysql2-aurora gem likes to monkey patch itself in replacement of Mysql2::Client, and uses
329
+ # `method_missing` to delegate to the original BUT unfortunately does not implement `respond_to_missing?` and
330
+ # thus our `respond_to?(:info)` below was failing.
331
+ #
332
+ # But on the bright side, the gem does stash a reference to the original Mysql2::Client class in a constant,
333
+ # so if that constant exists, we use that for our probing.
334
+ mysql2_client_class =
335
+ if defined?(Mysql2::Aurora::ORIGINAL_CLIENT_CLASS)
336
+ Mysql2::Aurora::ORIGINAL_CLIENT_CLASS
337
+ elsif defined?(Mysql2::Client)
338
+ Mysql2::Client
339
+ end
340
+
341
+ return true unless mysql2_client_class && mysql2_client_class.respond_to?(:info)
342
+
343
+ info = mysql2_client_class.info
344
+ libmysqlclient_version = Gem::Version.new(info[:version])
345
+
346
+ compatible =
347
+ libmysqlclient_version >= Gem::Version.new('8.0.0') ||
348
+ looks_like_mariadb?(info, libmysqlclient_version)
349
+
350
+ Datadog.logger.debug(
351
+ "The `mysql2` gem is using #{compatible ? 'a compatible' : 'an incompatible'} version of " \
352
+ "the `libmysqlclient` library (#{libmysqlclient_version})"
353
+ )
354
+
355
+ !compatible
356
+ rescue StandardError, LoadError => e
357
+ Datadog.logger.warn(
358
+ 'Failed to probe `mysql2` gem information. ' \
359
+ "Cause: #{e.class.name} #{e.message} Location: #{Array(e.backtrace).first}"
360
+ )
361
+
362
+ true
363
+ end
364
+ end
365
+
366
+ # See https://github.com/datadog/dd-trace-rb/issues/2976 for details.
367
+ private_class_method def self.incompatible_passenger_version?
368
+ if Gem.loaded_specs['passenger']
369
+ Gem.loaded_specs['passenger'].version < Gem::Version.new('6.0.19')
370
+ else
371
+ true
372
+ end
373
+ end
374
+
375
+ private_class_method def self.valid_overhead_target(overhead_target_percentage)
376
+ if overhead_target_percentage > 0 && overhead_target_percentage <= 20
377
+ overhead_target_percentage
378
+ else
379
+ Datadog.logger.error(
380
+ 'Ignoring invalid value for profiling overhead_target_percentage setting: ' \
381
+ "#{overhead_target_percentage.inspect}. Falling back to default value."
382
+ )
383
+
384
+ 2.0
385
+ end
386
+ end
387
+
388
+ # To add just a bit more complexity to our detection code, in https://github.com/DataDog/dd-trace-rb/issues/3334
389
+ # a user reported that our code was incorrectly flagging the mariadb variant of libmysqlclient as being
390
+ # incompatible. In fact we have no reports of the mariadb variant needing the "no signals" workaround,
391
+ # so we flag it as compatible when it's in use.
392
+ #
393
+ # A problem is that there doesn't seem to be an obvious way to query the mysql2 gem on which kind of
394
+ # libmysqlclient it's using, so we detect it by looking at the version.
395
+ #
396
+ # The info method for mysql2 with mariadb looks something like this:
397
+ # `{:id=>30308, :version=>"3.3.8", :header_version=>"11.2.2"}`
398
+ #
399
+ # * The version seems to come from https://github.com/mariadb-corporation/mariadb-connector-c and the latest
400
+ # one is 3.x.
401
+ # * The header_version is what people usually see as the "mariadb version"
402
+ #
403
+ # As a comparison, for libmysql the info looks like:
404
+ # * `{:id=>80035, :version=>"8.0.35", :header_version=>"8.0.35"}`
405
+ #
406
+ # Thus our detection is version 4 or older, because libmysqlclient 4 is almost 20 years old so it's most probably
407
+ # not that one + header_version being 10 or newer, since according to https://endoflife.date/mariadb that's a
408
+ # sane range for modern mariadb releases.
409
+ private_class_method def self.looks_like_mariadb?(info, libmysqlclient_version)
410
+ header_version = Gem::Version.new(info[:header_version]) if info[:header_version]
411
+
412
+ !!(header_version &&
413
+ libmysqlclient_version < Gem::Version.new('5.0.0') &&
414
+ header_version >= Gem::Version.new('10.0.0'))
415
+ end
416
+ end
417
+ end
418
+ end
@@ -0,0 +1,103 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'ext'
4
+ require_relative 'tag_builder'
5
+
6
+ module Datadog
7
+ module Profiling
8
+ # Exports profiling data gathered by the multiple recorders in a `Flush`.
9
+ #
10
+ # @ivoanjo: Note that the recorder that gathers pprof data is special, since we use its start/finish/empty? to
11
+ # decide if there's data to flush, as well as the timestamp for that data.
12
+ # I could've made the whole design more generic, but I'm unsure if we'll ever have more than a handful of
13
+ # recorders, so I've decided to make it specific until we actually need to support more recorders.
14
+ #
15
+ class Exporter
16
+ # Profiles with duration less than this will not be reported
17
+ PROFILE_DURATION_THRESHOLD_SECONDS = 1
18
+
19
+ private
20
+
21
+ attr_reader \
22
+ :pprof_recorder,
23
+ :code_provenance_collector, # The code provenance collector acts both as collector and as a recorder
24
+ :minimum_duration_seconds,
25
+ :time_provider,
26
+ :last_flush_finish_at,
27
+ :created_at,
28
+ :internal_metadata,
29
+ :info_json
30
+
31
+ public
32
+
33
+ def initialize(
34
+ pprof_recorder:,
35
+ worker:,
36
+ info_collector:,
37
+ code_provenance_collector:,
38
+ internal_metadata:,
39
+ minimum_duration_seconds: PROFILE_DURATION_THRESHOLD_SECONDS,
40
+ time_provider: Time
41
+ )
42
+ @pprof_recorder = pprof_recorder
43
+ @worker = worker
44
+ @code_provenance_collector = code_provenance_collector
45
+ @minimum_duration_seconds = minimum_duration_seconds
46
+ @time_provider = time_provider
47
+ @last_flush_finish_at = nil
48
+ @created_at = time_provider.now.utc
49
+ @internal_metadata = internal_metadata
50
+ # NOTE: At the time of this comment collected info does not change over time so we'll hardcode
51
+ # it on startup to prevent serializing the same info on every flush.
52
+ @info_json = JSON.fast_generate(info_collector.info).freeze
53
+ end
54
+
55
+ def flush
56
+ worker_stats = @worker.stats_and_reset_not_thread_safe
57
+ start, finish, compressed_pprof = pprof_recorder.serialize
58
+ @last_flush_finish_at = finish
59
+
60
+ return if compressed_pprof.nil? # We don't want to report empty profiles
61
+
62
+ if duration_below_threshold?(start, finish)
63
+ Datadog.logger.debug('Skipped exporting profiling events as profile duration is below minimum')
64
+ return
65
+ end
66
+
67
+ uncompressed_code_provenance = code_provenance_collector.refresh.generate_json if code_provenance_collector
68
+
69
+ Flush.new(
70
+ start: start,
71
+ finish: finish,
72
+ pprof_file_name: Datadog::Profiling::Ext::Transport::HTTP::PPROF_DEFAULT_FILENAME,
73
+ pprof_data: compressed_pprof.to_s,
74
+ code_provenance_file_name: Datadog::Profiling::Ext::Transport::HTTP::CODE_PROVENANCE_FILENAME,
75
+ code_provenance_data: uncompressed_code_provenance,
76
+ tags_as_array: Datadog::Profiling::TagBuilder.call(settings: Datadog.configuration).to_a,
77
+ internal_metadata: internal_metadata.merge(
78
+ {
79
+ worker_stats: worker_stats,
80
+ gc: GC.stat,
81
+ }
82
+ ),
83
+ info_json: info_json,
84
+ )
85
+ end
86
+
87
+ def can_flush?
88
+ !duration_below_threshold?(last_flush_finish_at || created_at, time_provider.now.utc)
89
+ end
90
+
91
+ def reset_after_fork
92
+ @last_flush_finish_at = time_provider.now.utc
93
+ nil
94
+ end
95
+
96
+ private
97
+
98
+ def duration_below_threshold?(start, finish)
99
+ (finish - start) < minimum_duration_seconds
100
+ end
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,98 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Datadog
4
+ module Profiling
5
+ module Ext
6
+ # Monkey patches `Kernel#fork`, adding a `Kernel#at_fork` callback mechanism which is used to restore
7
+ # profiling abilities after the VM forks.
8
+ #
9
+ # Known limitations: Does not handle `BasicObject`s that include `Kernel` directly; e.g.
10
+ # `Class.new(BasicObject) { include(::Kernel); def call; fork { }; end }.new.call`.
11
+ #
12
+ # This will be fixed once we moved to hooking into `Process._fork`
13
+ module Forking
14
+ def self.supported?
15
+ Process.respond_to?(:fork)
16
+ end
17
+
18
+ def self.apply!
19
+ return false unless supported?
20
+
21
+ [
22
+ ::Process.singleton_class, # Process.fork
23
+ ::Kernel.singleton_class, # Kernel.fork
24
+ ::Object, # fork without explicit receiver (it's defined as a method in ::Kernel)
25
+ # Note: Modifying Object as we do here is irreversible. During tests, this
26
+ # change will stick around even if we otherwise stub `Process` and `Kernel`
27
+ ].each { |target| target.prepend(Kernel) }
28
+
29
+ ::Process.singleton_class.prepend(ProcessDaemonPatch)
30
+ end
31
+
32
+ # Extensions for kernel
33
+ #
34
+ # TODO: Consider hooking into `Process._fork` on Ruby 3.1+ instead, see
35
+ # https://github.com/ruby/ruby/pull/5017 and https://bugs.ruby-lang.org/issues/17795
36
+ module Kernel
37
+ def fork
38
+ # If a block is provided, it must be wrapped to trigger callbacks.
39
+ child_block = if block_given?
40
+ proc do
41
+ # Trigger :child callback
42
+ datadog_at_fork_blocks[:child].each(&:call) if datadog_at_fork_blocks.key?(:child)
43
+
44
+ # Invoke original block
45
+ yield
46
+ end
47
+ end
48
+
49
+ # Start fork
50
+ # If a block is provided, use the wrapped version.
51
+ result = child_block.nil? ? super : super(&child_block)
52
+
53
+ # Trigger correct callbacks depending on whether we're in the parent or child.
54
+ # If we're in the fork, result = nil: trigger child callbacks.
55
+ # If we're in the parent, result = fork PID: trigger parent callbacks.
56
+ datadog_at_fork_blocks[:child].each(&:call) if result.nil? && datadog_at_fork_blocks.key?(:child)
57
+
58
+ # Return PID from #fork
59
+ result
60
+ end
61
+
62
+ def at_fork(stage, &block)
63
+ raise ArgumentError, 'Bad \'stage\' for ::at_fork' unless stage == :child
64
+
65
+ datadog_at_fork_blocks[stage] = [] unless datadog_at_fork_blocks.key?(stage)
66
+ datadog_at_fork_blocks[stage] << block
67
+ end
68
+
69
+ module_function
70
+
71
+ def datadog_at_fork_blocks
72
+ # Blocks should be shared across all users of this module,
73
+ # e.g. Process#fork, Kernel#fork, etc. should all invoke the same callbacks.
74
+ # rubocop:disable Style/ClassVars
75
+ @@datadog_at_fork_blocks ||= {}
76
+ # rubocop:enable Style/ClassVars
77
+ end
78
+ end
79
+
80
+ # A call to Process.daemon ( https://rubyapi.org/3.1/o/process#method-c-daemon ) forks the current process and
81
+ # keeps executing code in the child process, killing off the parent, thus effectively replacing it.
82
+ #
83
+ # This monkey patch makes the `Kernel#at_fork` mechanism defined above also work in this situation.
84
+ module ProcessDaemonPatch
85
+ def daemon(*args)
86
+ datadog_at_fork_blocks = Datadog::Profiling::Ext::Forking::Kernel.datadog_at_fork_blocks
87
+
88
+ result = super
89
+
90
+ datadog_at_fork_blocks[:child].each(&:call) if datadog_at_fork_blocks.key?(:child)
91
+
92
+ result
93
+ end
94
+ end
95
+ end
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Datadog
4
+ module Profiling
5
+ module Ext
6
+ ENV_ENABLED = 'DD_PROFILING_ENABLED'
7
+ ENV_UPLOAD_TIMEOUT = 'DD_PROFILING_UPLOAD_TIMEOUT'
8
+ ENV_MAX_FRAMES = 'DD_PROFILING_MAX_FRAMES'
9
+ ENV_AGENTLESS = 'DD_PROFILING_AGENTLESS'
10
+ ENV_ENDPOINT_COLLECTION_ENABLED = 'DD_PROFILING_ENDPOINT_COLLECTION_ENABLED'
11
+
12
+ module Transport
13
+ module HTTP
14
+ FORM_FIELD_TAG_ENV = 'env'
15
+ FORM_FIELD_TAG_HOST = 'host'
16
+ FORM_FIELD_TAG_LANGUAGE = 'language'
17
+ FORM_FIELD_TAG_PID = 'process_id'
18
+ FORM_FIELD_TAG_PROFILER_VERSION = 'profiler_version'
19
+ FORM_FIELD_TAG_RUNTIME = 'runtime'
20
+ FORM_FIELD_TAG_RUNTIME_ENGINE = 'runtime_engine'
21
+ FORM_FIELD_TAG_RUNTIME_ID = 'runtime-id'
22
+ FORM_FIELD_TAG_RUNTIME_PLATFORM = 'runtime_platform'
23
+ FORM_FIELD_TAG_RUNTIME_VERSION = 'runtime_version'
24
+ FORM_FIELD_TAG_SERVICE = 'service'
25
+ FORM_FIELD_TAG_VERSION = 'version'
26
+ TAG_GIT_REPOSITORY_URL = 'git.repository_url'
27
+ TAG_GIT_COMMIT_SHA = 'git.commit.sha'
28
+
29
+ PPROF_DEFAULT_FILENAME = 'rubyprofile.pprof'
30
+ CODE_PROVENANCE_FILENAME = 'code-provenance.json'
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end