ddtrace 1.1.0 → 1.4.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 (524) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +129 -1
  3. data/LICENSE-3rdparty.csv +2 -0
  4. data/README.md +8 -3
  5. data/ext/ddtrace_profiling_loader/ddtrace_profiling_loader.c +2 -2
  6. data/ext/ddtrace_profiling_loader/extconf.rb +1 -0
  7. data/ext/ddtrace_profiling_native_extension/NativeExtensionDesign.md +15 -7
  8. data/ext/ddtrace_profiling_native_extension/clock_id.h +21 -1
  9. data/ext/ddtrace_profiling_native_extension/clock_id_from_pthread.c +31 -2
  10. data/ext/ddtrace_profiling_native_extension/clock_id_noop.c +11 -2
  11. data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time.c +390 -0
  12. data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time.h +6 -0
  13. data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +391 -0
  14. data/ext/ddtrace_profiling_native_extension/collectors_stack.c +23 -19
  15. data/ext/ddtrace_profiling_native_extension/collectors_stack.h +9 -0
  16. data/ext/ddtrace_profiling_native_extension/extconf.rb +64 -16
  17. data/ext/ddtrace_profiling_native_extension/helpers.h +12 -0
  18. data/ext/ddtrace_profiling_native_extension/http_transport.c +334 -0
  19. data/ext/ddtrace_profiling_native_extension/{libddprof_helpers.h → libdatadog_helpers.h} +2 -1
  20. data/ext/ddtrace_profiling_native_extension/native_extension_helpers.rb +116 -12
  21. data/ext/ddtrace_profiling_native_extension/private_vm_api_access.c +89 -4
  22. data/ext/ddtrace_profiling_native_extension/private_vm_api_access.h +5 -5
  23. data/ext/ddtrace_profiling_native_extension/profiling.c +8 -3
  24. data/ext/ddtrace_profiling_native_extension/ruby_helpers.c +25 -0
  25. data/ext/ddtrace_profiling_native_extension/ruby_helpers.h +65 -0
  26. data/ext/ddtrace_profiling_native_extension/stack_recorder.c +311 -28
  27. data/ext/ddtrace_profiling_native_extension/stack_recorder.h +18 -8
  28. data/lib/datadog/appsec/autoload.rb +4 -2
  29. data/lib/datadog/appsec/configuration.rb +1 -1
  30. data/lib/datadog/appsec/contrib/auto_instrument.rb +0 -2
  31. data/lib/datadog/appsec/contrib/configuration/settings.rb +1 -1
  32. data/lib/datadog/appsec/contrib/rack/configuration/settings.rb +2 -2
  33. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +6 -6
  34. data/lib/datadog/appsec/contrib/rack/integration.rb +5 -5
  35. data/lib/datadog/appsec/contrib/rack/patcher.rb +2 -2
  36. data/lib/datadog/appsec/contrib/rack/reactive/request.rb +1 -1
  37. data/lib/datadog/appsec/contrib/rack/reactive/request_body.rb +1 -1
  38. data/lib/datadog/appsec/contrib/rack/reactive/response.rb +1 -1
  39. data/lib/datadog/appsec/contrib/rack/request_body_middleware.rb +2 -2
  40. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +3 -3
  41. data/lib/datadog/appsec/contrib/rails/configuration/settings.rb +2 -2
  42. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +4 -4
  43. data/lib/datadog/appsec/contrib/rails/integration.rb +4 -4
  44. data/lib/datadog/appsec/contrib/rails/patcher.rb +16 -12
  45. data/lib/datadog/appsec/contrib/rails/reactive/action.rb +1 -1
  46. data/lib/datadog/appsec/contrib/sinatra/configuration/settings.rb +2 -2
  47. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +5 -5
  48. data/lib/datadog/appsec/contrib/sinatra/integration.rb +4 -4
  49. data/lib/datadog/appsec/contrib/sinatra/patcher.rb +16 -12
  50. data/lib/datadog/appsec/event.rb +3 -3
  51. data/lib/datadog/appsec/extensions.rb +1 -1
  52. data/lib/datadog/appsec/processor.rb +1 -1
  53. data/lib/datadog/appsec/reactive/engine.rb +2 -2
  54. data/lib/datadog/appsec/reactive/operation.rb +3 -3
  55. data/lib/datadog/appsec.rb +5 -5
  56. data/lib/datadog/ci/configuration/components.rb +1 -1
  57. data/lib/datadog/ci/configuration/settings.rb +1 -1
  58. data/lib/datadog/ci/contrib/cucumber/configuration/settings.rb +2 -2
  59. data/lib/datadog/ci/contrib/cucumber/formatter.rb +5 -5
  60. data/lib/datadog/ci/contrib/cucumber/instrumentation.rb +1 -1
  61. data/lib/datadog/ci/contrib/cucumber/integration.rb +4 -4
  62. data/lib/datadog/ci/contrib/cucumber/patcher.rb +2 -2
  63. data/lib/datadog/ci/contrib/rspec/configuration/settings.rb +2 -2
  64. data/lib/datadog/ci/contrib/rspec/example.rb +5 -5
  65. data/lib/datadog/ci/contrib/rspec/integration.rb +4 -4
  66. data/lib/datadog/ci/contrib/rspec/patcher.rb +2 -2
  67. data/lib/datadog/ci/ext/environment.rb +8 -6
  68. data/lib/datadog/ci/extensions.rb +4 -4
  69. data/lib/datadog/ci/flush.rb +2 -2
  70. data/lib/datadog/ci/test.rb +3 -3
  71. data/lib/datadog/ci.rb +6 -6
  72. data/lib/datadog/core/buffer/cruby.rb +1 -1
  73. data/lib/datadog/core/buffer/thread_safe.rb +1 -1
  74. data/lib/datadog/core/configuration/agent_settings_resolver.rb +6 -6
  75. data/lib/datadog/core/configuration/base.rb +11 -2
  76. data/lib/datadog/core/configuration/components.rb +70 -52
  77. data/lib/datadog/core/configuration/option_definition.rb +1 -1
  78. data/lib/datadog/core/configuration/option_definition_set.rb +1 -1
  79. data/lib/datadog/core/configuration/options.rb +3 -3
  80. data/lib/datadog/core/configuration/settings.rb +42 -8
  81. data/lib/datadog/core/configuration.rb +8 -5
  82. data/lib/datadog/core/diagnostics/environment_logger.rb +1 -1
  83. data/lib/datadog/core/diagnostics/health.rb +2 -2
  84. data/lib/datadog/core/environment/cgroup.rb +1 -1
  85. data/lib/datadog/core/environment/container.rb +1 -1
  86. data/lib/datadog/core/environment/ext.rb +1 -1
  87. data/lib/datadog/core/environment/identity.rb +2 -2
  88. data/lib/datadog/core/environment/platform.rb +40 -0
  89. data/lib/datadog/core/environment/socket.rb +1 -1
  90. data/lib/datadog/core/error.rb +1 -1
  91. data/lib/datadog/core/extensions.rb +1 -1
  92. data/lib/datadog/core/metrics/client.rb +8 -8
  93. data/lib/datadog/core/metrics/options.rb +3 -3
  94. data/lib/datadog/core/runtime/metrics.rb +6 -6
  95. data/lib/datadog/core/telemetry/client.rb +79 -0
  96. data/lib/datadog/core/telemetry/collector.rb +234 -0
  97. data/lib/datadog/core/telemetry/emitter.rb +48 -0
  98. data/lib/datadog/core/telemetry/event.rb +71 -0
  99. data/lib/datadog/core/telemetry/ext.rb +11 -0
  100. data/lib/datadog/core/telemetry/heartbeat.rb +37 -0
  101. data/lib/datadog/core/telemetry/http/adapters/net.rb +113 -0
  102. data/lib/datadog/core/telemetry/http/env.rb +20 -0
  103. data/lib/datadog/core/telemetry/http/ext.rb +20 -0
  104. data/lib/datadog/core/telemetry/http/response.rb +68 -0
  105. data/lib/datadog/core/telemetry/http/transport.rb +53 -0
  106. data/lib/datadog/core/telemetry/v1/app_event.rb +52 -0
  107. data/lib/datadog/core/telemetry/v1/application.rb +86 -0
  108. data/lib/datadog/core/telemetry/v1/configuration.rb +25 -0
  109. data/lib/datadog/core/telemetry/v1/dependency.rb +36 -0
  110. data/lib/datadog/core/telemetry/v1/host.rb +51 -0
  111. data/lib/datadog/core/telemetry/v1/integration.rb +58 -0
  112. data/lib/datadog/core/telemetry/v1/product.rb +28 -0
  113. data/lib/datadog/core/telemetry/v1/telemetry_request.rb +100 -0
  114. data/lib/datadog/core/utils/object_set.rb +1 -1
  115. data/lib/datadog/core/utils/sequence.rb +5 -0
  116. data/lib/datadog/core/utils/string_table.rb +1 -1
  117. data/lib/datadog/core/utils/time.rb +3 -3
  118. data/lib/datadog/core/utils.rb +3 -3
  119. data/lib/datadog/core/vendor/multipart-post/multipart/post/multipartable.rb +2 -2
  120. data/lib/datadog/core/vendor/multipart-post/net/http/post/multipart.rb +3 -3
  121. data/lib/datadog/core/workers/async.rb +1 -1
  122. data/lib/datadog/core/workers/polling.rb +2 -2
  123. data/lib/datadog/core/workers/runtime_metrics.rb +4 -4
  124. data/lib/datadog/core.rb +50 -50
  125. data/lib/datadog/kit.rb +1 -1
  126. data/lib/datadog/opentracer/distributed_headers.rb +2 -2
  127. data/lib/datadog/opentracer/rack_propagator.rb +11 -7
  128. data/lib/datadog/opentracer/span.rb +1 -1
  129. data/lib/datadog/opentracer/text_map_propagator.rb +9 -6
  130. data/lib/datadog/opentracer/thread_local_scope_manager.rb +26 -3
  131. data/lib/datadog/opentracer/tracer.rb +19 -15
  132. data/lib/datadog/opentracer.rb +16 -16
  133. data/lib/datadog/profiling/buffer.rb +3 -3
  134. data/lib/datadog/profiling/collectors/code_provenance.rb +1 -0
  135. data/lib/datadog/profiling/collectors/cpu_and_wall_time.rb +27 -0
  136. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +74 -0
  137. data/lib/datadog/profiling/collectors/old_stack.rb +7 -7
  138. data/lib/datadog/profiling/collectors/stack.rb +3 -6
  139. data/lib/datadog/profiling/encoding/profile.rb +8 -12
  140. data/lib/datadog/profiling/events/stack.rb +1 -1
  141. data/lib/datadog/profiling/exporter.rb +66 -9
  142. data/lib/datadog/profiling/ext/forking.rb +41 -42
  143. data/lib/datadog/profiling/ext.rb +3 -15
  144. data/lib/datadog/profiling/flush.rb +25 -56
  145. data/lib/datadog/profiling/http_transport.rb +132 -0
  146. data/lib/datadog/profiling/old_ext.rb +42 -0
  147. data/lib/datadog/profiling/old_recorder.rb +101 -0
  148. data/lib/datadog/profiling/pprof/builder.rb +4 -4
  149. data/lib/datadog/profiling/pprof/converter.rb +1 -1
  150. data/lib/datadog/profiling/pprof/message_set.rb +1 -1
  151. data/lib/datadog/profiling/pprof/stack_sample.rb +4 -4
  152. data/lib/datadog/profiling/pprof/string_table.rb +1 -1
  153. data/lib/datadog/profiling/pprof/template.rb +5 -5
  154. data/lib/datadog/profiling/preload.rb +1 -1
  155. data/lib/datadog/profiling/scheduler.rb +28 -46
  156. data/lib/datadog/profiling/stack_recorder.rb +14 -4
  157. data/lib/datadog/profiling/tag_builder.rb +6 -1
  158. data/lib/datadog/profiling/tasks/setup.rb +2 -2
  159. data/lib/datadog/profiling/trace_identifiers/ddtrace.rb +2 -2
  160. data/lib/datadog/profiling/trace_identifiers/helper.rb +1 -1
  161. data/lib/datadog/profiling/transport/http/api/endpoint.rb +13 -35
  162. data/lib/datadog/profiling/transport/http/api/instance.rb +2 -2
  163. data/lib/datadog/profiling/transport/http/api/spec.rb +1 -1
  164. data/lib/datadog/profiling/transport/http/api.rb +5 -5
  165. data/lib/datadog/profiling/transport/http/builder.rb +3 -3
  166. data/lib/datadog/profiling/transport/http/client.rb +6 -4
  167. data/lib/datadog/profiling/transport/http/response.rb +1 -3
  168. data/lib/datadog/profiling/transport/http.rb +22 -16
  169. data/lib/datadog/profiling.rb +21 -20
  170. data/lib/datadog/tracing/analytics.rb +1 -1
  171. data/lib/datadog/tracing/buffer.rb +5 -5
  172. data/lib/datadog/tracing/context.rb +1 -1
  173. data/lib/datadog/tracing/context_provider.rb +18 -2
  174. data/lib/datadog/tracing/contrib/action_cable/configuration/settings.rb +2 -2
  175. data/lib/datadog/tracing/contrib/action_cable/event.rb +4 -5
  176. data/lib/datadog/tracing/contrib/action_cable/events/broadcast.rb +4 -4
  177. data/lib/datadog/tracing/contrib/action_cable/events/perform_action.rb +3 -3
  178. data/lib/datadog/tracing/contrib/action_cable/events/transmit.rb +4 -4
  179. data/lib/datadog/tracing/contrib/action_cable/events.rb +4 -4
  180. data/lib/datadog/tracing/contrib/action_cable/instrumentation.rb +3 -4
  181. data/lib/datadog/tracing/contrib/action_cable/integration.rb +4 -4
  182. data/lib/datadog/tracing/contrib/action_cable/patcher.rb +4 -4
  183. data/lib/datadog/tracing/contrib/action_mailer/configuration/settings.rb +2 -2
  184. data/lib/datadog/tracing/contrib/action_mailer/event.rb +3 -3
  185. data/lib/datadog/tracing/contrib/action_mailer/events/deliver.rb +3 -3
  186. data/lib/datadog/tracing/contrib/action_mailer/events/process.rb +3 -3
  187. data/lib/datadog/tracing/contrib/action_mailer/events.rb +2 -2
  188. data/lib/datadog/tracing/contrib/action_mailer/integration.rb +4 -4
  189. data/lib/datadog/tracing/contrib/action_mailer/patcher.rb +3 -3
  190. data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +10 -6
  191. data/lib/datadog/tracing/contrib/action_pack/action_controller/patcher.rb +2 -2
  192. data/lib/datadog/tracing/contrib/action_pack/configuration/settings.rb +2 -2
  193. data/lib/datadog/tracing/contrib/action_pack/integration.rb +4 -4
  194. data/lib/datadog/tracing/contrib/action_pack/patcher.rb +2 -2
  195. data/lib/datadog/tracing/contrib/action_pack/utils.rb +1 -1
  196. data/lib/datadog/tracing/contrib/action_view/configuration/settings.rb +2 -2
  197. data/lib/datadog/tracing/contrib/action_view/event.rb +1 -1
  198. data/lib/datadog/tracing/contrib/action_view/events/render_partial.rb +5 -5
  199. data/lib/datadog/tracing/contrib/action_view/events/render_template.rb +5 -5
  200. data/lib/datadog/tracing/contrib/action_view/events.rb +2 -2
  201. data/lib/datadog/tracing/contrib/action_view/instrumentation/partial_renderer.rb +2 -2
  202. data/lib/datadog/tracing/contrib/action_view/instrumentation/template_renderer.rb +2 -2
  203. data/lib/datadog/tracing/contrib/action_view/integration.rb +4 -4
  204. data/lib/datadog/tracing/contrib/action_view/patcher.rb +7 -7
  205. data/lib/datadog/tracing/contrib/action_view/utils.rb +1 -1
  206. data/lib/datadog/tracing/contrib/active_job/configuration/settings.rb +3 -3
  207. data/lib/datadog/tracing/contrib/active_job/event.rb +3 -3
  208. data/lib/datadog/tracing/contrib/active_job/events/discard.rb +4 -4
  209. data/lib/datadog/tracing/contrib/active_job/events/enqueue.rb +4 -4
  210. data/lib/datadog/tracing/contrib/active_job/events/enqueue_at.rb +4 -4
  211. data/lib/datadog/tracing/contrib/active_job/events/enqueue_retry.rb +4 -4
  212. data/lib/datadog/tracing/contrib/active_job/events/perform.rb +4 -4
  213. data/lib/datadog/tracing/contrib/active_job/events/retry_stopped.rb +4 -4
  214. data/lib/datadog/tracing/contrib/active_job/events.rb +6 -6
  215. data/lib/datadog/tracing/contrib/active_job/integration.rb +4 -4
  216. data/lib/datadog/tracing/contrib/active_job/log_injection.rb +0 -2
  217. data/lib/datadog/tracing/contrib/active_job/patcher.rb +4 -4
  218. data/lib/datadog/tracing/contrib/active_model_serializers/configuration/settings.rb +2 -2
  219. data/lib/datadog/tracing/contrib/active_model_serializers/event.rb +4 -5
  220. data/lib/datadog/tracing/contrib/active_model_serializers/events/render.rb +3 -3
  221. data/lib/datadog/tracing/contrib/active_model_serializers/events/serialize.rb +2 -2
  222. data/lib/datadog/tracing/contrib/active_model_serializers/events.rb +2 -2
  223. data/lib/datadog/tracing/contrib/active_model_serializers/integration.rb +3 -3
  224. data/lib/datadog/tracing/contrib/active_model_serializers/patcher.rb +3 -4
  225. data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +2 -2
  226. data/lib/datadog/tracing/contrib/active_record/configuration/settings.rb +3 -3
  227. data/lib/datadog/tracing/contrib/active_record/event.rb +1 -1
  228. data/lib/datadog/tracing/contrib/active_record/events/instantiation.rb +4 -4
  229. data/lib/datadog/tracing/contrib/active_record/events/sql.rb +6 -6
  230. data/lib/datadog/tracing/contrib/active_record/events.rb +2 -2
  231. data/lib/datadog/tracing/contrib/active_record/integration.rb +6 -6
  232. data/lib/datadog/tracing/contrib/active_record/patcher.rb +2 -2
  233. data/lib/datadog/tracing/contrib/active_record/utils.rb +2 -2
  234. data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +19 -9
  235. data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +2 -2
  236. data/lib/datadog/tracing/contrib/active_support/cache/redis.rb +1 -1
  237. data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +2 -2
  238. data/lib/datadog/tracing/contrib/active_support/integration.rb +5 -5
  239. data/lib/datadog/tracing/contrib/active_support/notifications/event.rb +1 -1
  240. data/lib/datadog/tracing/contrib/active_support/notifications/subscriber.rb +1 -1
  241. data/lib/datadog/tracing/contrib/active_support/patcher.rb +2 -2
  242. data/lib/datadog/tracing/contrib/analytics.rb +1 -1
  243. data/lib/datadog/tracing/contrib/auto_instrument.rb +4 -4
  244. data/lib/datadog/tracing/contrib/aws/configuration/settings.rb +2 -2
  245. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +3 -4
  246. data/lib/datadog/tracing/contrib/aws/integration.rb +3 -3
  247. data/lib/datadog/tracing/contrib/aws/patcher.rb +5 -5
  248. data/lib/datadog/tracing/contrib/concurrent_ruby/configuration/settings.rb +2 -2
  249. data/lib/datadog/tracing/contrib/concurrent_ruby/future_patch.rb +1 -1
  250. data/lib/datadog/tracing/contrib/concurrent_ruby/integration.rb +3 -3
  251. data/lib/datadog/tracing/contrib/concurrent_ruby/patcher.rb +2 -2
  252. data/lib/datadog/tracing/contrib/configurable.rb +2 -2
  253. data/lib/datadog/tracing/contrib/configuration/resolvers/pattern_resolver.rb +1 -1
  254. data/lib/datadog/tracing/contrib/configuration/settings.rb +2 -2
  255. data/lib/datadog/tracing/contrib/dalli/configuration/settings.rb +2 -2
  256. data/lib/datadog/tracing/contrib/dalli/instrumentation.rb +4 -5
  257. data/lib/datadog/tracing/contrib/dalli/integration.rb +3 -3
  258. data/lib/datadog/tracing/contrib/dalli/patcher.rb +3 -3
  259. data/lib/datadog/tracing/contrib/dalli/quantize.rb +1 -1
  260. data/lib/datadog/tracing/contrib/delayed_job/configuration/settings.rb +3 -3
  261. data/lib/datadog/tracing/contrib/delayed_job/ext.rb +2 -0
  262. data/lib/datadog/tracing/contrib/delayed_job/integration.rb +3 -3
  263. data/lib/datadog/tracing/contrib/delayed_job/patcher.rb +8 -2
  264. data/lib/datadog/tracing/contrib/delayed_job/plugin.rb +3 -4
  265. data/lib/datadog/tracing/contrib/delayed_job/server_internal_tracer/worker.rb +32 -0
  266. data/lib/datadog/tracing/contrib/elasticsearch/configuration/settings.rb +2 -2
  267. data/lib/datadog/tracing/contrib/elasticsearch/integration.rb +3 -3
  268. data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +6 -7
  269. data/lib/datadog/tracing/contrib/elasticsearch/quantize.rb +1 -1
  270. data/lib/datadog/tracing/contrib/ethon/configuration/settings.rb +2 -2
  271. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +4 -5
  272. data/lib/datadog/tracing/contrib/ethon/integration.rb +4 -4
  273. data/lib/datadog/tracing/contrib/ethon/multi_patch.rb +3 -4
  274. data/lib/datadog/tracing/contrib/ethon/patcher.rb +3 -3
  275. data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +2 -2
  276. data/lib/datadog/tracing/contrib/excon/integration.rb +4 -4
  277. data/lib/datadog/tracing/contrib/excon/middleware.rb +6 -7
  278. data/lib/datadog/tracing/contrib/excon/patcher.rb +2 -2
  279. data/lib/datadog/tracing/contrib/extensions.rb +5 -3
  280. data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +2 -2
  281. data/lib/datadog/tracing/contrib/faraday/integration.rb +4 -4
  282. data/lib/datadog/tracing/contrib/faraday/middleware.rb +5 -6
  283. data/lib/datadog/tracing/contrib/faraday/patcher.rb +5 -5
  284. data/lib/datadog/tracing/contrib/grape/configuration/settings.rb +3 -3
  285. data/lib/datadog/tracing/contrib/grape/endpoint.rb +4 -5
  286. data/lib/datadog/tracing/contrib/grape/integration.rb +3 -3
  287. data/lib/datadog/tracing/contrib/grape/patcher.rb +4 -4
  288. data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +2 -2
  289. data/lib/datadog/tracing/contrib/graphql/integration.rb +3 -3
  290. data/lib/datadog/tracing/contrib/graphql/patcher.rb +2 -3
  291. data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +4 -3
  292. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +14 -5
  293. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +6 -6
  294. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor.rb +7 -4
  295. data/lib/datadog/tracing/contrib/grpc/ext.rb +1 -0
  296. data/lib/datadog/tracing/contrib/grpc/integration.rb +3 -3
  297. data/lib/datadog/tracing/contrib/grpc/patcher.rb +5 -5
  298. data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +1 -2
  299. data/lib/datadog/tracing/contrib/http/configuration/settings.rb +2 -2
  300. data/lib/datadog/tracing/contrib/http/instrumentation.rb +3 -4
  301. data/lib/datadog/tracing/contrib/http/integration.rb +6 -6
  302. data/lib/datadog/tracing/contrib/http/patcher.rb +3 -3
  303. data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +2 -2
  304. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +4 -5
  305. data/lib/datadog/tracing/contrib/httpclient/integration.rb +4 -4
  306. data/lib/datadog/tracing/contrib/httpclient/patcher.rb +3 -3
  307. data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +2 -2
  308. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +4 -5
  309. data/lib/datadog/tracing/contrib/httprb/integration.rb +4 -4
  310. data/lib/datadog/tracing/contrib/httprb/patcher.rb +3 -3
  311. data/lib/datadog/tracing/contrib/integration.rb +3 -3
  312. data/lib/datadog/tracing/contrib/kafka/configuration/settings.rb +2 -2
  313. data/lib/datadog/tracing/contrib/kafka/event.rb +3 -3
  314. data/lib/datadog/tracing/contrib/kafka/events/connection/request.rb +2 -2
  315. data/lib/datadog/tracing/contrib/kafka/events/consumer/process_batch.rb +3 -3
  316. data/lib/datadog/tracing/contrib/kafka/events/consumer/process_message.rb +3 -3
  317. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/heartbeat.rb +4 -4
  318. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/join_group.rb +4 -4
  319. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/leave_group.rb +4 -4
  320. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/sync_group.rb +4 -4
  321. data/lib/datadog/tracing/contrib/kafka/events/produce_operation/send_messages.rb +2 -2
  322. data/lib/datadog/tracing/contrib/kafka/events/producer/deliver_messages.rb +2 -2
  323. data/lib/datadog/tracing/contrib/kafka/events.rb +9 -9
  324. data/lib/datadog/tracing/contrib/kafka/integration.rb +3 -3
  325. data/lib/datadog/tracing/contrib/kafka/patcher.rb +3 -3
  326. data/lib/datadog/tracing/contrib/lograge/configuration/settings.rb +2 -2
  327. data/lib/datadog/tracing/contrib/lograge/instrumentation.rb +1 -2
  328. data/lib/datadog/tracing/contrib/lograge/integration.rb +3 -3
  329. data/lib/datadog/tracing/contrib/lograge/patcher.rb +2 -2
  330. data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +2 -2
  331. data/lib/datadog/tracing/contrib/mongodb/instrumentation.rb +3 -3
  332. data/lib/datadog/tracing/contrib/mongodb/integration.rb +4 -4
  333. data/lib/datadog/tracing/contrib/mongodb/parsers.rb +1 -1
  334. data/lib/datadog/tracing/contrib/mongodb/patcher.rb +3 -3
  335. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +4 -4
  336. data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +2 -2
  337. data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +3 -4
  338. data/lib/datadog/tracing/contrib/mysql2/integration.rb +3 -3
  339. data/lib/datadog/tracing/contrib/mysql2/patcher.rb +2 -2
  340. data/lib/datadog/tracing/contrib/patcher.rb +13 -2
  341. data/lib/datadog/tracing/contrib/pg/configuration/settings.rb +35 -0
  342. data/lib/datadog/tracing/contrib/pg/ext.rb +31 -0
  343. data/lib/datadog/tracing/contrib/pg/instrumentation.rb +128 -0
  344. data/lib/datadog/tracing/contrib/pg/integration.rb +43 -0
  345. data/lib/datadog/tracing/contrib/pg/patcher.rb +31 -0
  346. data/lib/datadog/tracing/contrib/presto/configuration/settings.rb +2 -2
  347. data/lib/datadog/tracing/contrib/presto/instrumentation.rb +2 -3
  348. data/lib/datadog/tracing/contrib/presto/integration.rb +3 -3
  349. data/lib/datadog/tracing/contrib/presto/patcher.rb +4 -4
  350. data/lib/datadog/tracing/contrib/qless/configuration/settings.rb +2 -2
  351. data/lib/datadog/tracing/contrib/qless/integration.rb +3 -3
  352. data/lib/datadog/tracing/contrib/qless/patcher.rb +1 -2
  353. data/lib/datadog/tracing/contrib/qless/qless_job.rb +2 -3
  354. data/lib/datadog/tracing/contrib/qless/tracer_cleaner.rb +0 -2
  355. data/lib/datadog/tracing/contrib/que/configuration/settings.rb +3 -3
  356. data/lib/datadog/tracing/contrib/que/integration.rb +4 -4
  357. data/lib/datadog/tracing/contrib/que/patcher.rb +1 -1
  358. data/lib/datadog/tracing/contrib/que/tracer.rb +1 -1
  359. data/lib/datadog/tracing/contrib/racecar/configuration/settings.rb +2 -2
  360. data/lib/datadog/tracing/contrib/racecar/event.rb +4 -5
  361. data/lib/datadog/tracing/contrib/racecar/events/batch.rb +2 -2
  362. data/lib/datadog/tracing/contrib/racecar/events/consume.rb +2 -2
  363. data/lib/datadog/tracing/contrib/racecar/events/message.rb +2 -2
  364. data/lib/datadog/tracing/contrib/racecar/events.rb +3 -3
  365. data/lib/datadog/tracing/contrib/racecar/integration.rb +3 -3
  366. data/lib/datadog/tracing/contrib/racecar/patcher.rb +3 -3
  367. data/lib/datadog/tracing/contrib/rack/configuration/settings.rb +2 -2
  368. data/lib/datadog/tracing/contrib/rack/integration.rb +4 -4
  369. data/lib/datadog/tracing/contrib/rack/middlewares.rb +24 -20
  370. data/lib/datadog/tracing/contrib/rack/patcher.rb +12 -2
  371. data/lib/datadog/tracing/contrib/rails/auto_instrument_railtie.rb +1 -1
  372. data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +4 -1
  373. data/lib/datadog/tracing/contrib/rails/framework.rb +18 -22
  374. data/lib/datadog/tracing/contrib/rails/integration.rb +4 -4
  375. data/lib/datadog/tracing/contrib/rails/log_injection.rb +0 -2
  376. data/lib/datadog/tracing/contrib/rails/middlewares.rb +1 -2
  377. data/lib/datadog/tracing/contrib/rails/patcher.rb +7 -8
  378. data/lib/datadog/tracing/contrib/rails/railtie.rb +3 -3
  379. data/lib/datadog/tracing/contrib/rails/utils.rb +1 -1
  380. data/lib/datadog/tracing/contrib/rake/configuration/settings.rb +17 -2
  381. data/lib/datadog/tracing/contrib/rake/instrumentation.rb +12 -7
  382. data/lib/datadog/tracing/contrib/rake/integration.rb +3 -3
  383. data/lib/datadog/tracing/contrib/rake/patcher.rb +3 -4
  384. data/lib/datadog/tracing/contrib/redis/configuration/resolver.rb +1 -1
  385. data/lib/datadog/tracing/contrib/redis/configuration/settings.rb +2 -2
  386. data/lib/datadog/tracing/contrib/redis/instrumentation.rb +6 -7
  387. data/lib/datadog/tracing/contrib/redis/integration.rb +3 -3
  388. data/lib/datadog/tracing/contrib/redis/patcher.rb +6 -6
  389. data/lib/datadog/tracing/contrib/redis/tags.rb +3 -4
  390. data/lib/datadog/tracing/contrib/resque/configuration/settings.rb +3 -3
  391. data/lib/datadog/tracing/contrib/resque/integration.rb +3 -3
  392. data/lib/datadog/tracing/contrib/resque/patcher.rb +2 -2
  393. data/lib/datadog/tracing/contrib/resque/resque_job.rb +3 -4
  394. data/lib/datadog/tracing/contrib/rest_client/configuration/settings.rb +3 -2
  395. data/lib/datadog/tracing/contrib/rest_client/integration.rb +3 -3
  396. data/lib/datadog/tracing/contrib/rest_client/patcher.rb +2 -2
  397. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +5 -6
  398. data/lib/datadog/tracing/contrib/semantic_logger/configuration/settings.rb +2 -2
  399. data/lib/datadog/tracing/contrib/semantic_logger/instrumentation.rb +1 -2
  400. data/lib/datadog/tracing/contrib/semantic_logger/integration.rb +3 -3
  401. data/lib/datadog/tracing/contrib/semantic_logger/patcher.rb +2 -2
  402. data/lib/datadog/tracing/contrib/sequel/configuration/settings.rb +2 -2
  403. data/lib/datadog/tracing/contrib/sequel/database.rb +4 -5
  404. data/lib/datadog/tracing/contrib/sequel/dataset.rb +4 -5
  405. data/lib/datadog/tracing/contrib/sequel/integration.rb +3 -3
  406. data/lib/datadog/tracing/contrib/sequel/patcher.rb +3 -3
  407. data/lib/datadog/tracing/contrib/sequel/utils.rb +2 -2
  408. data/lib/datadog/tracing/contrib/shoryuken/configuration/settings.rb +3 -3
  409. data/lib/datadog/tracing/contrib/shoryuken/integration.rb +4 -4
  410. data/lib/datadog/tracing/contrib/shoryuken/patcher.rb +1 -1
  411. data/lib/datadog/tracing/contrib/shoryuken/tracer.rb +1 -1
  412. data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +4 -5
  413. data/lib/datadog/tracing/contrib/sidekiq/configuration/settings.rb +3 -3
  414. data/lib/datadog/tracing/contrib/sidekiq/ext.rb +6 -0
  415. data/lib/datadog/tracing/contrib/sidekiq/integration.rb +3 -3
  416. data/lib/datadog/tracing/contrib/sidekiq/patcher.rb +14 -7
  417. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/heartbeat.rb +19 -1
  418. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/{scheduled_push.rb → redis_info.rb} +5 -6
  419. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/scheduled_poller.rb +53 -0
  420. data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +5 -6
  421. data/lib/datadog/tracing/contrib/sidekiq/tracing.rb +2 -2
  422. data/lib/datadog/tracing/contrib/sinatra/configuration/settings.rb +2 -2
  423. data/lib/datadog/tracing/contrib/sinatra/env.rb +2 -2
  424. data/lib/datadog/tracing/contrib/sinatra/framework.rb +0 -2
  425. data/lib/datadog/tracing/contrib/sinatra/headers.rb +1 -1
  426. data/lib/datadog/tracing/contrib/sinatra/integration.rb +3 -3
  427. data/lib/datadog/tracing/contrib/sinatra/patcher.rb +5 -5
  428. data/lib/datadog/tracing/contrib/sinatra/tracer.rb +7 -8
  429. data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +6 -7
  430. data/lib/datadog/tracing/contrib/sneakers/configuration/settings.rb +2 -2
  431. data/lib/datadog/tracing/contrib/sneakers/integration.rb +4 -4
  432. data/lib/datadog/tracing/contrib/sneakers/patcher.rb +2 -2
  433. data/lib/datadog/tracing/contrib/sneakers/tracer.rb +2 -3
  434. data/lib/datadog/tracing/contrib/status_code_matcher.rb +2 -2
  435. data/lib/datadog/tracing/contrib/sucker_punch/configuration/settings.rb +2 -2
  436. data/lib/datadog/tracing/contrib/sucker_punch/instrumentation.rb +3 -4
  437. data/lib/datadog/tracing/contrib/sucker_punch/integration.rb +3 -3
  438. data/lib/datadog/tracing/contrib/sucker_punch/patcher.rb +4 -5
  439. data/lib/datadog/tracing/contrib.rb +48 -47
  440. data/lib/datadog/tracing/correlation.rb +1 -1
  441. data/lib/datadog/tracing/distributed/headers/b3.rb +4 -4
  442. data/lib/datadog/tracing/distributed/headers/b3_single.rb +7 -7
  443. data/lib/datadog/tracing/distributed/headers/datadog.rb +3 -3
  444. data/lib/datadog/tracing/distributed/headers/parser.rb +37 -0
  445. data/lib/datadog/tracing/distributed/helpers.rb +36 -2
  446. data/lib/datadog/tracing/distributed/metadata/b3.rb +55 -0
  447. data/lib/datadog/tracing/distributed/metadata/b3_single.rb +66 -0
  448. data/lib/datadog/tracing/distributed/metadata/datadog.rb +73 -0
  449. data/lib/datadog/tracing/distributed/metadata/parser.rb +34 -0
  450. data/lib/datadog/tracing/event.rb +1 -1
  451. data/lib/datadog/tracing/metadata/analytics.rb +2 -2
  452. data/lib/datadog/tracing/metadata/errors.rb +2 -2
  453. data/lib/datadog/tracing/metadata/ext.rb +25 -0
  454. data/lib/datadog/tracing/metadata/tagging.rb +8 -2
  455. data/lib/datadog/tracing/metadata.rb +3 -3
  456. data/lib/datadog/tracing/pipeline/span_filter.rb +10 -6
  457. data/lib/datadog/tracing/pipeline.rb +3 -3
  458. data/lib/datadog/tracing/propagation/grpc.rb +68 -58
  459. data/lib/datadog/tracing/propagation/http.rb +8 -8
  460. data/lib/datadog/tracing/runtime/metrics.rb +1 -1
  461. data/lib/datadog/tracing/sampling/all_sampler.rb +1 -1
  462. data/lib/datadog/tracing/sampling/priority_sampler.rb +5 -5
  463. data/lib/datadog/tracing/sampling/rate_by_key_sampler.rb +2 -2
  464. data/lib/datadog/tracing/sampling/rate_by_service_sampler.rb +3 -3
  465. data/lib/datadog/tracing/sampling/rate_limiter.rb +1 -1
  466. data/lib/datadog/tracing/sampling/rate_sampler.rb +7 -7
  467. data/lib/datadog/tracing/sampling/rule.rb +3 -3
  468. data/lib/datadog/tracing/sampling/rule_sampler.rb +4 -4
  469. data/lib/datadog/tracing/sampling/span/matcher.rb +80 -0
  470. data/lib/datadog/tracing/span.rb +25 -5
  471. data/lib/datadog/tracing/span_operation.rb +10 -9
  472. data/lib/datadog/tracing/sync_writer.rb +5 -5
  473. data/lib/datadog/tracing/trace_operation.rb +16 -9
  474. data/lib/datadog/tracing/trace_segment.rb +5 -5
  475. data/lib/datadog/tracing/tracer.rb +15 -15
  476. data/lib/datadog/tracing/workers/trace_writer.rb +9 -9
  477. data/lib/datadog/tracing/workers.rb +3 -3
  478. data/lib/datadog/tracing/writer.rb +5 -5
  479. data/lib/datadog/tracing.rb +8 -8
  480. data/lib/ddtrace/auto_instrument.rb +9 -2
  481. data/lib/ddtrace/transport/ext.rb +7 -1
  482. data/lib/ddtrace/transport/http/adapters/net.rb +3 -2
  483. data/lib/ddtrace/transport/http/adapters/test.rb +1 -1
  484. data/lib/ddtrace/transport/http/adapters/unix_socket.rb +2 -2
  485. data/lib/ddtrace/transport/http/api/map.rb +1 -1
  486. data/lib/ddtrace/transport/http/api.rb +4 -4
  487. data/lib/ddtrace/transport/http/builder.rb +5 -5
  488. data/lib/ddtrace/transport/http/client.rb +2 -2
  489. data/lib/ddtrace/transport/http/response.rb +1 -1
  490. data/lib/ddtrace/transport/http/statistics.rb +1 -1
  491. data/lib/ddtrace/transport/http/traces.rb +5 -5
  492. data/lib/ddtrace/transport/http.rb +12 -9
  493. data/lib/ddtrace/transport/io/client.rb +2 -2
  494. data/lib/ddtrace/transport/io/response.rb +1 -1
  495. data/lib/ddtrace/transport/io/traces.rb +3 -3
  496. data/lib/ddtrace/transport/io.rb +3 -3
  497. data/lib/ddtrace/transport/statistics.rb +2 -2
  498. data/lib/ddtrace/transport/trace_formatter.rb +5 -5
  499. data/lib/ddtrace/transport/traces.rb +5 -5
  500. data/lib/ddtrace/version.rb +1 -1
  501. data/lib/ddtrace.rb +6 -6
  502. metadata +57 -33
  503. data/.editorconfig +0 -22
  504. data/.gitignore +0 -58
  505. data/CONTRIBUTING.md +0 -81
  506. data/ddtrace.gemspec +0 -68
  507. data/docs/0.x-trace.png +0 -0
  508. data/docs/1.0-trace.png +0 -0
  509. data/docs/AutoInstrumentation.md +0 -36
  510. data/docs/Deprecation.md +0 -8
  511. data/docs/DevelopmentGuide.md +0 -259
  512. data/docs/GettingStarted.md +0 -2688
  513. data/docs/ProfilingDevelopment.md +0 -110
  514. data/docs/PublicApi.md +0 -14
  515. data/docs/UpgradeGuide.md +0 -736
  516. data/lib/datadog/profiling/recorder.rb +0 -117
  517. data/lib/datadog/profiling/transport/client.rb +0 -16
  518. data/lib/datadog/profiling/transport/io/client.rb +0 -29
  519. data/lib/datadog/profiling/transport/io/response.rb +0 -18
  520. data/lib/datadog/profiling/transport/io.rb +0 -32
  521. data/lib/datadog/profiling/transport/parcel.rb +0 -19
  522. data/lib/datadog/profiling/transport/request.rb +0 -17
  523. data/lib/datadog/profiling/transport/response.rb +0 -10
  524. data/lib/datadog/tracing/distributed/parser.rb +0 -70
@@ -1,9 +1,9 @@
1
1
  # typed: true
2
2
 
3
- require 'datadog/profiling/ext'
4
- require 'datadog/profiling/events/stack'
5
- require 'datadog/profiling/pprof/builder'
6
- require 'datadog/profiling/pprof/converter'
3
+ require_relative '../ext'
4
+ require_relative '../events/stack'
5
+ require_relative 'builder'
6
+ require_relative 'converter'
7
7
 
8
8
  module Datadog
9
9
  module Profiling
@@ -1,6 +1,6 @@
1
1
  # typed: strict
2
2
 
3
- require 'datadog/core/utils/string_table'
3
+ require_relative '../../core/utils/string_table'
4
4
 
5
5
  module Datadog
6
6
  module Profiling
@@ -1,11 +1,11 @@
1
1
  # typed: false
2
2
 
3
- require 'datadog/profiling/pprof/payload'
4
- require 'datadog/profiling/pprof/message_set'
5
- require 'datadog/profiling/pprof/builder'
3
+ require_relative 'payload'
4
+ require_relative 'message_set'
5
+ require_relative 'builder'
6
6
 
7
- require 'datadog/profiling/events/stack'
8
- require 'datadog/profiling/pprof/stack_sample'
7
+ require_relative '../events/stack'
8
+ require_relative 'stack_sample'
9
9
 
10
10
  module Datadog
11
11
  module Profiling
@@ -1,5 +1,5 @@
1
1
  # typed: strict
2
2
 
3
- require 'ddtrace'
3
+ require_relative '../../ddtrace'
4
4
 
5
5
  Datadog::Profiling.start_if_enabled
@@ -1,42 +1,41 @@
1
1
  # typed: true
2
2
 
3
- require 'datadog/core/utils/time'
3
+ require_relative '../core/utils/time'
4
4
 
5
- require 'datadog/core/worker'
6
- require 'datadog/core/workers/polling'
5
+ require_relative '../core/worker'
6
+ require_relative '../core/workers/polling'
7
7
 
8
8
  module Datadog
9
9
  module Profiling
10
- # Periodically (every DEFAULT_INTERVAL_SECONDS) takes data from the `Recorder` and pushes them to all configured
11
- # `Exporter`s. Runs on its own background thread.
10
+ # Periodically (every DEFAULT_INTERVAL_SECONDS) takes a profile from the `Exporter` and reports it using the
11
+ # configured transport. Runs on its own background thread.
12
12
  class Scheduler < Core::Worker
13
13
  include Core::Workers::Polling
14
14
 
15
15
  DEFAULT_INTERVAL_SECONDS = 60
16
16
  MINIMUM_INTERVAL_SECONDS = 0
17
17
 
18
- # Profiles with duration less than this will not be reported
19
- PROFILE_DURATION_THRESHOLD_SECONDS = 1
20
-
21
18
  # We sleep for at most this duration seconds before reporting data to avoid multi-process applications all
22
19
  # reporting profiles at the exact same time
23
20
  DEFAULT_FLUSH_JITTER_MAXIMUM_SECONDS = 3
24
21
 
25
- private_constant :DEFAULT_INTERVAL_SECONDS, :MINIMUM_INTERVAL_SECONDS, :PROFILE_DURATION_THRESHOLD_SECONDS
22
+ private
26
23
 
27
24
  attr_reader \
28
- :exporters,
29
- :recorder
25
+ :exporter,
26
+ :transport
27
+
28
+ public
30
29
 
31
30
  def initialize(
32
- recorder,
33
- exporters,
31
+ exporter:,
32
+ transport:,
34
33
  fork_policy: Core::Workers::Async::Thread::FORK_POLICY_RESTART, # Restart in forks by default
35
34
  interval: DEFAULT_INTERVAL_SECONDS,
36
35
  enabled: true
37
36
  )
38
- @recorder = recorder
39
- @exporters = [exporters].flatten
37
+ @exporter = exporter
38
+ @transport = transport
40
39
 
41
40
  # Workers::Async::Thread settings
42
41
  self.fork_policy = fork_policy
@@ -68,23 +67,23 @@ module Datadog
68
67
  end
69
68
 
70
69
  def after_fork
71
- # Clear recorder's buffers by flushing events.
72
- # Objects from parent process will copy-on-write,
73
- # and we don't want to send events for the wrong process.
74
- recorder.flush
70
+ # Clear any existing profiling state.
71
+ # We don't want the child process to report profiling data from its parent.
72
+ Datadog.logger.debug('Flushing exporter in child process #after_fork and discarding data')
73
+ exporter.flush
75
74
  end
76
75
 
77
76
  # Configure Workers::IntervalLoop to not report immediately when scheduler starts
78
77
  #
79
78
  # When a scheduler gets created (or reset), we don't want it to immediately try to flush; we want it to wait for
80
79
  # the loop wait time first. This avoids an issue where the scheduler reported a mostly-empty profile if the
81
- # application just started but this thread took a bit longer so there's already samples in the recorder.
80
+ # application just started but this thread took a bit longer so there's already profiling data in the exporter.
82
81
  def loop_wait_before_first_iteration?
83
82
  true
84
83
  end
85
84
 
86
85
  def work_pending?
87
- !recorder.empty?
86
+ exporter.can_flush?
88
87
  end
89
88
 
90
89
  private
@@ -100,16 +99,10 @@ module Datadog
100
99
  end
101
100
 
102
101
  def flush_events
103
- # Get events from recorder
104
- flush = recorder.flush
102
+ # Collect data to be exported
103
+ flush = exporter.flush
105
104
 
106
- if duration_below_threshold?(flush)
107
- Datadog.logger.debug do
108
- "Skipped exporting profiling events as profile duration is below minimum (#{flush.event_count} events skipped)"
109
- end
110
-
111
- return flush
112
- end
105
+ return false unless flush
113
106
 
114
107
  # Sleep for a bit to cause misalignment between profilers in multi-process applications
115
108
  #
@@ -127,24 +120,13 @@ module Datadog
127
120
  sleep(jitter_seconds)
128
121
  end
129
122
 
130
- # Send events to each exporter
131
- if flush.event_count > 0
132
- exporters.each do |exporter|
133
- begin
134
- exporter.export(flush)
135
- rescue StandardError => e
136
- Datadog.logger.error(
137
- "Unable to export #{flush.event_count} profiling events. Cause: #{e} Location: #{Array(e.backtrace).first}"
138
- )
139
- end
140
- end
123
+ begin
124
+ transport.export(flush)
125
+ rescue StandardError => e
126
+ Datadog.logger.error("Unable to report profile. Cause: #{e} Location: #{Array(e.backtrace).first}")
141
127
  end
142
128
 
143
- flush
144
- end
145
-
146
- def duration_below_threshold?(flush)
147
- (flush.finish - flush.start) < PROFILE_DURATION_THRESHOLD_SECONDS
129
+ true
148
130
  end
149
131
  end
150
132
  end
@@ -2,11 +2,22 @@
2
2
 
3
3
  module Datadog
4
4
  module Profiling
5
- # Used to wrap a ddprof_ffi_Profile in a Ruby object and expose Ruby-level serialization APIs
5
+ # Stores stack samples in a native libdatadog data structure and expose Ruby-level serialization APIs
6
+ # Note that `record_sample` is only accessible from native code.
6
7
  # Methods prefixed with _native_ are implemented in `stack_recorder.c`
7
8
  class StackRecorder
9
+ def initialize
10
+ # This mutex works in addition to the fancy C-level mutexes we have in the native side (see the docs there).
11
+ # It prevents multiple Ruby threads calling serialize at the same time -- something like
12
+ # `10.times { Thread.new { stack_recorder.serialize } }`.
13
+ # This isn't something we expect to happen normally, but because it would break the assumptions of the
14
+ # C-level mutexes (that there is a single serializer thread), we add it here as an extra safeguard against it
15
+ # accidentally happening.
16
+ @no_concurrent_synchronize_mutex = Mutex.new
17
+ end
18
+
8
19
  def serialize
9
- status, result = self.class._native_serialize(self)
20
+ status, result = @no_concurrent_synchronize_mutex.synchronize { self.class._native_serialize(self) }
10
21
 
11
22
  if status == :ok
12
23
  start, finish, encoded_pprof = result
@@ -23,8 +34,7 @@ module Datadog
23
34
  end
24
35
  end
25
36
 
26
- # Used only for Ruby 2.2 and below which don't have the native `rb_time_timespec_new` API
27
- # Called from native code
37
+ # Used only for Ruby 2.2 which doesn't have the native `rb_time_timespec_new` API; called from native code
28
38
  def self.ruby_time_from(timespec_seconds, timespec_nanoseconds)
29
39
  Time.at(0).utc + timespec_seconds + (timespec_nanoseconds.to_r / 1_000_000_000)
30
40
  end
@@ -1,5 +1,7 @@
1
1
  # typed: true
2
2
 
3
+ require_relative '../core/utils'
4
+
3
5
  module Datadog
4
6
  module Profiling
5
7
  # Builds a hash of default plus user tags to be included in a profile
@@ -41,7 +43,10 @@ module Datadog
41
43
  tags[FORM_FIELD_TAG_SERVICE] = service if service
42
44
  tags[FORM_FIELD_TAG_VERSION] = version if version
43
45
 
44
- user_tags.merge(tags)
46
+ # Make sure everything is an utf-8 string, to avoid encoding issues in native code/libddprof/further downstream
47
+ user_tags.merge(tags).map do |key, value|
48
+ [Datadog::Core::Utils.utf8_encode(key), Datadog::Core::Utils.utf8_encode(value)]
49
+ end.to_h
45
50
  end
46
51
  end
47
52
  end
@@ -1,7 +1,7 @@
1
1
  # typed: false
2
2
 
3
- require 'datadog/core/utils/only_once'
4
- require 'datadog/profiling/ext/forking'
3
+ require_relative '../../core/utils/only_once'
4
+ require_relative '../ext/forking'
5
5
 
6
6
  module Datadog
7
7
  module Profiling
@@ -2,8 +2,8 @@
2
2
 
3
3
  # typed: true
4
4
 
5
- require 'datadog/tracing'
6
- require 'datadog/tracing/metadata/ext'
5
+ require_relative '../../tracing'
6
+ require_relative '../../tracing/metadata/ext'
7
7
 
8
8
  module Datadog
9
9
  module Profiling
@@ -2,7 +2,7 @@
2
2
 
3
3
  # typed: true
4
4
 
5
- require 'datadog/profiling/trace_identifiers/ddtrace'
5
+ require_relative 'ddtrace'
6
6
 
7
7
  module Datadog
8
8
  module Profiling
@@ -1,10 +1,10 @@
1
1
  # typed: true
2
2
 
3
- require 'datadog/core/utils/compression'
4
- require 'datadog/core/vendor/multipart-post/multipart/post/composite_read_io'
5
- require 'datadog/profiling/ext'
6
- require 'datadog/profiling/transport/http/response'
7
- require 'ddtrace/transport/http/api/endpoint'
3
+ require_relative '../../../../core/utils/compression'
4
+ require_relative '../../../../core/vendor/multipart-post/multipart/post/composite_read_io'
5
+ require_relative '../../../old_ext'
6
+ require_relative '../response'
7
+ require_relative '../../../../../ddtrace/transport/http/api/endpoint'
8
8
 
9
9
  module Datadog
10
10
  module Profiling
@@ -13,7 +13,7 @@ module Datadog
13
13
  module API
14
14
  # Datadog API endpoint for profiling
15
15
  class Endpoint < Datadog::Transport::HTTP::API::Endpoint
16
- include Profiling::Ext::Transport::HTTP
16
+ include Profiling::OldExt::Transport::HTTP
17
17
 
18
18
  # These tags are read from the flush object (see below) directly and so we ignore any extra copies that
19
19
  # may come in the tags hash to avoid duplicates.
@@ -23,7 +23,7 @@ module Datadog
23
23
  attr_reader \
24
24
  :encoder
25
25
 
26
- def initialize(path, encoder)
26
+ def initialize(path, encoder = nil)
27
27
  super(:post, path)
28
28
  @encoder = encoder
29
29
  end
@@ -40,48 +40,26 @@ module Datadog
40
40
  end
41
41
 
42
42
  def build_form(env)
43
- flush = env.request.parcel.data
43
+ flush = env.request
44
44
  pprof_file = build_pprof(flush)
45
45
 
46
46
  form = {
47
47
  FORM_FIELD_INTAKE_VERSION => '3', # Aka 1.3 intake format
48
48
  FORM_FIELD_RECORDING_START => flush.start.utc.iso8601,
49
49
  FORM_FIELD_RECORDING_END => flush.finish.utc.iso8601,
50
- FORM_FIELD_TAGS => [
51
- "#{FORM_FIELD_TAG_RUNTIME}:#{flush.language}",
52
- "#{FORM_FIELD_TAG_RUNTIME_ID}:#{flush.runtime_id}",
53
- "#{FORM_FIELD_TAG_RUNTIME_ENGINE}:#{flush.runtime_engine}",
54
- "#{FORM_FIELD_TAG_RUNTIME_PLATFORM}:#{flush.runtime_platform}",
55
- "#{FORM_FIELD_TAG_RUNTIME_VERSION}:#{flush.runtime_version}",
56
- "#{FORM_FIELD_TAG_PID}:#{Process.pid}",
57
- "#{FORM_FIELD_TAG_PROFILER_VERSION}:#{flush.profiler_version}",
58
- # NOTE: Redundant w/ 'runtime'; may want to remove this later.
59
- "#{FORM_FIELD_TAG_LANGUAGE}:#{flush.language}",
60
- "#{FORM_FIELD_TAG_HOST}:#{flush.host}",
61
- *flush
62
- .tags
63
- .reject { |tag_key| TAGS_TO_IGNORE_IN_TAGS_HASH.include?(tag_key) }
64
- .map { |tag_key, tag_value| "#{tag_key}:#{tag_value}" }
65
- ],
50
+ FORM_FIELD_TAGS => flush.tags_as_array.map { |key, value| "#{key}:#{value}" },
66
51
  FORM_FIELD_PPROF_DATA => pprof_file,
67
- FORM_FIELD_FAMILY => flush.language,
52
+ FORM_FIELD_FAMILY => 'ruby',
68
53
  }
69
54
 
70
- # Optional fields
71
- form[FORM_FIELD_TAGS] << "#{FORM_FIELD_TAG_SERVICE}:#{flush.service}" unless flush.service.nil?
72
- form[FORM_FIELD_TAGS] << "#{FORM_FIELD_TAG_ENV}:#{flush.env}" unless flush.env.nil?
73
- form[FORM_FIELD_TAGS] << "#{FORM_FIELD_TAG_VERSION}:#{flush.version}" unless flush.version.nil?
74
-
75
55
  # May not be available/enabled
76
- form[FORM_FIELD_CODE_PROVENANCE_DATA] = build_code_provenance(flush) if flush.code_provenance
56
+ form[FORM_FIELD_CODE_PROVENANCE_DATA] = build_code_provenance(flush) if flush.code_provenance_data
77
57
 
78
58
  form
79
59
  end
80
60
 
81
61
  def build_pprof(flush)
82
- pprof = encoder.encode(flush)
83
-
84
- gzipped_pprof_data = Core::Utils::Compression.gzip(pprof.data)
62
+ gzipped_pprof_data = flush.pprof_data
85
63
 
86
64
  Core::Vendor::Multipart::Post::UploadIO.new(
87
65
  StringIO.new(gzipped_pprof_data),
@@ -91,7 +69,7 @@ module Datadog
91
69
  end
92
70
 
93
71
  def build_code_provenance(flush)
94
- gzipped_code_provenance = Core::Utils::Compression.gzip(flush.code_provenance)
72
+ gzipped_code_provenance = flush.code_provenance_data
95
73
 
96
74
  Core::Vendor::Multipart::Post::UploadIO.new(
97
75
  StringIO.new(gzipped_code_provenance),
@@ -1,7 +1,7 @@
1
1
  # typed: true
2
2
 
3
- require 'ddtrace/transport/http/api/instance'
4
- require 'datadog/profiling/transport/http/api/spec'
3
+ require_relative '../../../../../ddtrace/transport/http/api/instance'
4
+ require_relative 'spec'
5
5
 
6
6
  module Datadog
7
7
  module Profiling
@@ -1,6 +1,6 @@
1
1
  # typed: true
2
2
 
3
- require 'ddtrace/transport/http/api/spec'
3
+ require_relative '../../../../../ddtrace/transport/http/api/spec'
4
4
 
5
5
  module Datadog
6
6
  module Profiling
@@ -1,10 +1,10 @@
1
1
  # typed: true
2
2
 
3
- require 'ddtrace/transport/http/api/map'
4
- require 'datadog/profiling/encoding/profile'
5
- require 'datadog/profiling/transport/http/api/spec'
6
- require 'datadog/profiling/transport/http/api/instance'
7
- require 'datadog/profiling/transport/http/api/endpoint'
3
+ require_relative '../../../../ddtrace/transport/http/api/map'
4
+ require_relative '../../encoding/profile'
5
+ require_relative 'api/spec'
6
+ require_relative 'api/instance'
7
+ require_relative 'api/endpoint'
8
8
 
9
9
  module Datadog
10
10
  module Profiling
@@ -1,9 +1,9 @@
1
1
  # typed: true
2
2
 
3
- require 'ddtrace/transport/http/builder'
3
+ require_relative '../../../../ddtrace/transport/http/builder'
4
4
 
5
- require 'datadog/profiling/transport/http/api'
6
- require 'datadog/profiling/transport/http/client'
5
+ require_relative 'api'
6
+ require_relative 'client'
7
7
 
8
8
  module Datadog
9
9
  module Profiling
@@ -1,7 +1,7 @@
1
1
  # typed: true
2
2
 
3
- require 'ddtrace/transport/http/client'
4
- require 'datadog/profiling/transport/client'
3
+ require_relative '../../../../ddtrace/transport/http/client'
4
+ require_relative '../../../../ddtrace/transport/request'
5
5
 
6
6
  module Datadog
7
7
  module Profiling
@@ -9,11 +9,13 @@ module Datadog
9
9
  module HTTP
10
10
  # Routes, encodes, and sends tracer data to the trace agent via HTTP.
11
11
  class Client < Datadog::Transport::HTTP::Client
12
- include Transport::Client
12
+ def export(flush)
13
+ send_profiling_flush(flush)
14
+ end
13
15
 
14
16
  def send_profiling_flush(flush)
15
17
  # Build a request
16
- request = Profiling::Transport::Request.new(flush)
18
+ request = flush
17
19
  send_payload(request).tap do |response|
18
20
  if response.ok?
19
21
  Datadog.logger.debug('Successfully reported profiling data')
@@ -1,7 +1,6 @@
1
1
  # typed: true
2
2
 
3
- require 'ddtrace/transport/http/response'
4
- require 'datadog/profiling/transport/response'
3
+ require_relative '../../../../ddtrace/transport/http/response'
5
4
 
6
5
  module Datadog
7
6
  module Profiling
@@ -11,7 +10,6 @@ module Datadog
11
10
  # Response from HTTP transport for profiling
12
11
  class Response
13
12
  include Datadog::Transport::HTTP::Response
14
- include Profiling::Transport::Response
15
13
 
16
14
  def initialize(http_response, options = {})
17
15
  super(http_response)
@@ -1,17 +1,17 @@
1
1
  # typed: true
2
2
 
3
- require 'datadog/core/environment/ext'
4
- require 'ddtrace/transport/ext'
3
+ require_relative '../../core/environment/ext'
4
+ require_relative '../../../ddtrace/transport/ext'
5
5
 
6
- require 'datadog/core/environment/container'
7
- require 'datadog/core/environment/variable_helpers'
6
+ require_relative '../../core/environment/container'
7
+ require_relative '../../core/environment/variable_helpers'
8
8
 
9
- require 'datadog/profiling/transport/http/builder'
10
- require 'datadog/profiling/transport/http/api'
9
+ require_relative 'http/builder'
10
+ require_relative 'http/api'
11
11
 
12
- require 'ddtrace/transport/http/adapters/net'
13
- require 'ddtrace/transport/http/adapters/test'
14
- require 'ddtrace/transport/http/adapters/unix_socket'
12
+ require_relative '../../../ddtrace/transport/http/adapters/net'
13
+ require_relative '../../../ddtrace/transport/http/adapters/test'
14
+ require_relative '../../../ddtrace/transport/http/adapters/unix_socket'
15
15
 
16
16
  module Datadog
17
17
  module Profiling
@@ -80,7 +80,7 @@ module Datadog
80
80
  private_class_method def self.configure_for_agentless(transport, profiling_upload_timeout_seconds:, site:, api_key:)
81
81
  apis = API.api_defaults
82
82
 
83
- site_uri = URI(format(Profiling::Ext::Transport::HTTP::URI_TEMPLATE_DD_API, site))
83
+ site_uri = URI(format(Profiling::OldExt::Transport::HTTP::URI_TEMPLATE_DD_API, site))
84
84
  hostname = site_uri.host
85
85
  port = site_uri.port
86
86
 
@@ -100,12 +100,18 @@ module Datadog
100
100
  end
101
101
 
102
102
  # Add adapters to registry
103
- Datadog::Transport::HTTP::Builder::REGISTRY.set(Datadog::Transport::HTTP::Adapters::Net,
104
- Datadog::Transport::Ext::HTTP::ADAPTER)
105
- Datadog::Transport::HTTP::Builder::REGISTRY.set(Datadog::Transport::HTTP::Adapters::Test,
106
- Datadog::Transport::Ext::Test::ADAPTER)
107
- Datadog::Transport::HTTP::Builder::REGISTRY.set(Datadog::Transport::HTTP::Adapters::UnixSocket,
108
- Datadog::Transport::Ext::UnixSocket::ADAPTER)
103
+ Datadog::Transport::HTTP::Builder::REGISTRY.set(
104
+ Datadog::Transport::HTTP::Adapters::Net,
105
+ Datadog::Transport::Ext::HTTP::ADAPTER
106
+ )
107
+ Datadog::Transport::HTTP::Builder::REGISTRY.set(
108
+ Datadog::Transport::HTTP::Adapters::Test,
109
+ Datadog::Transport::Ext::Test::ADAPTER
110
+ )
111
+ Datadog::Transport::HTTP::Builder::REGISTRY.set(
112
+ Datadog::Transport::HTTP::Adapters::UnixSocket,
113
+ Datadog::Transport::Ext::UnixSocket::ADAPTER
114
+ )
109
115
  end
110
116
  end
111
117
  end
@@ -1,8 +1,8 @@
1
1
  # typed: true
2
2
 
3
- require 'datadog/core'
4
- require 'datadog/core/environment/variable_helpers'
5
- require 'datadog/core/utils/only_once'
3
+ require_relative 'core'
4
+ require_relative 'core/environment/variable_helpers'
5
+ require_relative 'core/utils/only_once'
6
6
 
7
7
  module Datadog
8
8
  # Contains profiler for generating stack profiles, etc.
@@ -132,7 +132,7 @@ module Datadog
132
132
 
133
133
  private_class_method def self.try_loading_native_library
134
134
  begin
135
- require 'datadog/profiling/load_native_extension'
135
+ require_relative 'profiling/load_native_extension'
136
136
 
137
137
  success =
138
138
  defined?(Profiling::NativeExtension) && Profiling::NativeExtension.send(:native_working?)
@@ -145,22 +145,23 @@ module Datadog
145
145
  private_class_method def self.load_profiling
146
146
  return false unless supported?
147
147
 
148
- require 'datadog/profiling/ext/forking'
149
- require 'datadog/profiling/collectors/code_provenance'
150
- require 'datadog/profiling/collectors/old_stack'
151
- require 'datadog/profiling/collectors/stack'
152
- require 'datadog/profiling/stack_recorder'
153
- require 'datadog/profiling/exporter'
154
- require 'datadog/profiling/recorder'
155
- require 'datadog/profiling/scheduler'
156
- require 'datadog/profiling/tasks/setup'
157
- require 'datadog/profiling/transport/io'
158
- require 'datadog/profiling/transport/http'
159
- require 'datadog/profiling/profiler'
160
- require 'datadog/profiling/native_extension'
161
- require 'datadog/profiling/trace_identifiers/helper'
162
- require 'datadog/profiling/pprof/pprof_pb'
163
- require 'datadog/profiling/tag_builder'
148
+ require_relative 'profiling/ext/forking'
149
+ require_relative 'profiling/collectors/code_provenance'
150
+ require_relative 'profiling/collectors/cpu_and_wall_time'
151
+ require_relative 'profiling/collectors/cpu_and_wall_time_worker'
152
+ require_relative 'profiling/collectors/old_stack'
153
+ require_relative 'profiling/collectors/stack'
154
+ require_relative 'profiling/stack_recorder'
155
+ require_relative 'profiling/old_recorder'
156
+ require_relative 'profiling/exporter'
157
+ require_relative 'profiling/scheduler'
158
+ require_relative 'profiling/tasks/setup'
159
+ require_relative 'profiling/profiler'
160
+ require_relative 'profiling/native_extension'
161
+ require_relative 'profiling/trace_identifiers/helper'
162
+ require_relative 'profiling/pprof/pprof_pb'
163
+ require_relative 'profiling/tag_builder'
164
+ require_relative 'profiling/http_transport'
164
165
 
165
166
  true
166
167
  end
@@ -1,6 +1,6 @@
1
1
  # typed: true
2
2
 
3
- require 'datadog/tracing/metadata/ext'
3
+ require_relative 'metadata/ext'
4
4
 
5
5
  module Datadog
6
6
  module Tracing
@@ -1,10 +1,10 @@
1
1
  # typed: true
2
2
 
3
- require 'datadog/core'
4
- require 'datadog/core/environment/ext'
5
- require 'datadog/core/buffer/thread_safe'
6
- require 'datadog/core/buffer/cruby'
7
- require 'datadog/core/diagnostics/health'
3
+ require_relative '../core'
4
+ require_relative '../core/environment/ext'
5
+ require_relative '../core/buffer/thread_safe'
6
+ require_relative '../core/buffer/cruby'
7
+ require_relative '../core/diagnostics/health'
8
8
 
9
9
  module Datadog
10
10
  module Tracing
@@ -1,6 +1,6 @@
1
1
  # typed: true
2
2
 
3
- require 'datadog/core/utils/forking'
3
+ require_relative '../core/utils/forking'
4
4
 
5
5
  module Datadog
6
6
  module Tracing