ddtrace 1.2.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 (508) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +70 -0
  3. data/LICENSE-3rdparty.csv +2 -0
  4. data/README.md +1 -1
  5. data/ext/ddtrace_profiling_loader/ddtrace_profiling_loader.c +1 -1
  6. data/ext/ddtrace_profiling_native_extension/NativeExtensionDesign.md +9 -2
  7. data/ext/ddtrace_profiling_native_extension/clock_id.h +20 -0
  8. data/ext/ddtrace_profiling_native_extension/clock_id_from_pthread.c +30 -1
  9. data/ext/ddtrace_profiling_native_extension/clock_id_noop.c +10 -1
  10. data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time.c +152 -31
  11. data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time.h +6 -0
  12. data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +391 -0
  13. data/ext/ddtrace_profiling_native_extension/collectors_stack.c +11 -7
  14. data/ext/ddtrace_profiling_native_extension/extconf.rb +26 -19
  15. data/ext/ddtrace_profiling_native_extension/helpers.h +12 -0
  16. data/ext/ddtrace_profiling_native_extension/http_transport.c +40 -47
  17. data/ext/ddtrace_profiling_native_extension/{libddprof_helpers.h → libdatadog_helpers.h} +2 -1
  18. data/ext/ddtrace_profiling_native_extension/native_extension_helpers.rb +36 -20
  19. data/ext/ddtrace_profiling_native_extension/private_vm_api_access.c +39 -29
  20. data/ext/ddtrace_profiling_native_extension/private_vm_api_access.h +2 -5
  21. data/ext/ddtrace_profiling_native_extension/profiling.c +4 -3
  22. data/ext/ddtrace_profiling_native_extension/ruby_helpers.c +25 -0
  23. data/ext/ddtrace_profiling_native_extension/ruby_helpers.h +33 -1
  24. data/ext/ddtrace_profiling_native_extension/stack_recorder.c +294 -19
  25. data/ext/ddtrace_profiling_native_extension/stack_recorder.h +9 -8
  26. data/lib/datadog/appsec/autoload.rb +4 -2
  27. data/lib/datadog/appsec/configuration.rb +1 -1
  28. data/lib/datadog/appsec/contrib/auto_instrument.rb +0 -2
  29. data/lib/datadog/appsec/contrib/configuration/settings.rb +1 -1
  30. data/lib/datadog/appsec/contrib/rack/configuration/settings.rb +2 -2
  31. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +6 -6
  32. data/lib/datadog/appsec/contrib/rack/integration.rb +5 -5
  33. data/lib/datadog/appsec/contrib/rack/patcher.rb +2 -2
  34. data/lib/datadog/appsec/contrib/rack/reactive/request.rb +1 -1
  35. data/lib/datadog/appsec/contrib/rack/reactive/request_body.rb +1 -1
  36. data/lib/datadog/appsec/contrib/rack/reactive/response.rb +1 -1
  37. data/lib/datadog/appsec/contrib/rack/request_body_middleware.rb +2 -2
  38. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +3 -3
  39. data/lib/datadog/appsec/contrib/rails/configuration/settings.rb +2 -2
  40. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +4 -4
  41. data/lib/datadog/appsec/contrib/rails/integration.rb +4 -4
  42. data/lib/datadog/appsec/contrib/rails/patcher.rb +16 -12
  43. data/lib/datadog/appsec/contrib/rails/reactive/action.rb +1 -1
  44. data/lib/datadog/appsec/contrib/sinatra/configuration/settings.rb +2 -2
  45. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +5 -5
  46. data/lib/datadog/appsec/contrib/sinatra/integration.rb +4 -4
  47. data/lib/datadog/appsec/contrib/sinatra/patcher.rb +16 -12
  48. data/lib/datadog/appsec/event.rb +3 -3
  49. data/lib/datadog/appsec/extensions.rb +1 -1
  50. data/lib/datadog/appsec/processor.rb +1 -1
  51. data/lib/datadog/appsec/reactive/engine.rb +2 -2
  52. data/lib/datadog/appsec/reactive/operation.rb +3 -3
  53. data/lib/datadog/appsec.rb +5 -5
  54. data/lib/datadog/ci/configuration/components.rb +1 -1
  55. data/lib/datadog/ci/configuration/settings.rb +1 -1
  56. data/lib/datadog/ci/contrib/cucumber/configuration/settings.rb +2 -2
  57. data/lib/datadog/ci/contrib/cucumber/formatter.rb +5 -5
  58. data/lib/datadog/ci/contrib/cucumber/instrumentation.rb +1 -1
  59. data/lib/datadog/ci/contrib/cucumber/integration.rb +4 -4
  60. data/lib/datadog/ci/contrib/cucumber/patcher.rb +2 -2
  61. data/lib/datadog/ci/contrib/rspec/configuration/settings.rb +2 -2
  62. data/lib/datadog/ci/contrib/rspec/example.rb +5 -5
  63. data/lib/datadog/ci/contrib/rspec/integration.rb +4 -4
  64. data/lib/datadog/ci/contrib/rspec/patcher.rb +2 -2
  65. data/lib/datadog/ci/ext/environment.rb +8 -6
  66. data/lib/datadog/ci/extensions.rb +4 -4
  67. data/lib/datadog/ci/flush.rb +2 -2
  68. data/lib/datadog/ci/test.rb +3 -3
  69. data/lib/datadog/ci.rb +6 -6
  70. data/lib/datadog/core/buffer/cruby.rb +1 -1
  71. data/lib/datadog/core/buffer/thread_safe.rb +1 -1
  72. data/lib/datadog/core/configuration/agent_settings_resolver.rb +6 -6
  73. data/lib/datadog/core/configuration/base.rb +11 -2
  74. data/lib/datadog/core/configuration/components.rb +51 -48
  75. data/lib/datadog/core/configuration/option_definition.rb +1 -1
  76. data/lib/datadog/core/configuration/option_definition_set.rb +1 -1
  77. data/lib/datadog/core/configuration/options.rb +3 -3
  78. data/lib/datadog/core/configuration/settings.rb +34 -7
  79. data/lib/datadog/core/configuration.rb +8 -5
  80. data/lib/datadog/core/diagnostics/environment_logger.rb +1 -1
  81. data/lib/datadog/core/diagnostics/health.rb +2 -2
  82. data/lib/datadog/core/environment/cgroup.rb +1 -1
  83. data/lib/datadog/core/environment/container.rb +1 -1
  84. data/lib/datadog/core/environment/ext.rb +1 -1
  85. data/lib/datadog/core/environment/identity.rb +2 -2
  86. data/lib/datadog/core/environment/platform.rb +1 -1
  87. data/lib/datadog/core/environment/socket.rb +1 -1
  88. data/lib/datadog/core/error.rb +1 -1
  89. data/lib/datadog/core/extensions.rb +1 -1
  90. data/lib/datadog/core/metrics/client.rb +8 -8
  91. data/lib/datadog/core/metrics/options.rb +3 -3
  92. data/lib/datadog/core/runtime/metrics.rb +6 -6
  93. data/lib/datadog/core/telemetry/client.rb +79 -0
  94. data/lib/datadog/core/telemetry/collector.rb +234 -0
  95. data/lib/datadog/core/telemetry/emitter.rb +48 -0
  96. data/lib/datadog/core/telemetry/event.rb +71 -0
  97. data/lib/datadog/core/telemetry/ext.rb +11 -0
  98. data/lib/datadog/core/telemetry/heartbeat.rb +37 -0
  99. data/lib/datadog/core/telemetry/http/adapters/net.rb +113 -0
  100. data/lib/datadog/core/telemetry/http/env.rb +20 -0
  101. data/lib/datadog/core/telemetry/http/ext.rb +20 -0
  102. data/lib/datadog/core/telemetry/http/response.rb +68 -0
  103. data/lib/datadog/core/telemetry/http/transport.rb +53 -0
  104. data/lib/datadog/core/telemetry/v1/app_event.rb +52 -0
  105. data/lib/datadog/core/telemetry/v1/application.rb +86 -0
  106. data/lib/datadog/core/telemetry/v1/configuration.rb +25 -0
  107. data/lib/datadog/core/telemetry/v1/dependency.rb +36 -0
  108. data/lib/datadog/core/telemetry/v1/host.rb +51 -0
  109. data/lib/datadog/core/telemetry/v1/integration.rb +58 -0
  110. data/lib/datadog/core/telemetry/v1/product.rb +28 -0
  111. data/lib/datadog/core/telemetry/v1/telemetry_request.rb +100 -0
  112. data/lib/datadog/core/utils/object_set.rb +1 -1
  113. data/lib/datadog/core/utils/sequence.rb +5 -0
  114. data/lib/datadog/core/utils/string_table.rb +1 -1
  115. data/lib/datadog/core/utils/time.rb +3 -3
  116. data/lib/datadog/core/utils.rb +2 -2
  117. data/lib/datadog/core/vendor/multipart-post/multipart/post/multipartable.rb +2 -2
  118. data/lib/datadog/core/vendor/multipart-post/net/http/post/multipart.rb +3 -3
  119. data/lib/datadog/core/workers/async.rb +1 -1
  120. data/lib/datadog/core/workers/polling.rb +2 -2
  121. data/lib/datadog/core/workers/runtime_metrics.rb +4 -4
  122. data/lib/datadog/core.rb +50 -50
  123. data/lib/datadog/kit.rb +1 -1
  124. data/lib/datadog/opentracer/distributed_headers.rb +2 -2
  125. data/lib/datadog/opentracer/rack_propagator.rb +11 -7
  126. data/lib/datadog/opentracer/span.rb +1 -1
  127. data/lib/datadog/opentracer/text_map_propagator.rb +9 -6
  128. data/lib/datadog/opentracer/thread_local_scope_manager.rb +1 -1
  129. data/lib/datadog/opentracer/tracer.rb +19 -15
  130. data/lib/datadog/opentracer.rb +16 -16
  131. data/lib/datadog/profiling/buffer.rb +3 -3
  132. data/lib/datadog/profiling/collectors/cpu_and_wall_time.rb +4 -19
  133. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +74 -0
  134. data/lib/datadog/profiling/collectors/old_stack.rb +7 -7
  135. data/lib/datadog/profiling/collectors/stack.rb +3 -8
  136. data/lib/datadog/profiling/encoding/profile.rb +1 -1
  137. data/lib/datadog/profiling/events/stack.rb +1 -1
  138. data/lib/datadog/profiling/exporter.rb +17 -9
  139. data/lib/datadog/profiling/ext/forking.rb +36 -37
  140. data/lib/datadog/profiling/ext.rb +1 -0
  141. data/lib/datadog/profiling/flush.rb +0 -3
  142. data/lib/datadog/profiling/http_transport.rb +4 -3
  143. data/lib/datadog/profiling/old_recorder.rb +2 -7
  144. data/lib/datadog/profiling/pprof/builder.rb +4 -4
  145. data/lib/datadog/profiling/pprof/converter.rb +1 -1
  146. data/lib/datadog/profiling/pprof/message_set.rb +1 -1
  147. data/lib/datadog/profiling/pprof/stack_sample.rb +4 -4
  148. data/lib/datadog/profiling/pprof/string_table.rb +1 -1
  149. data/lib/datadog/profiling/pprof/template.rb +5 -5
  150. data/lib/datadog/profiling/preload.rb +1 -1
  151. data/lib/datadog/profiling/scheduler.rb +5 -4
  152. data/lib/datadog/profiling/stack_recorder.rb +14 -4
  153. data/lib/datadog/profiling/tag_builder.rb +6 -1
  154. data/lib/datadog/profiling/tasks/setup.rb +2 -2
  155. data/lib/datadog/profiling/trace_identifiers/ddtrace.rb +2 -2
  156. data/lib/datadog/profiling/trace_identifiers/helper.rb +1 -1
  157. data/lib/datadog/profiling/transport/http/api/endpoint.rb +5 -5
  158. data/lib/datadog/profiling/transport/http/api/instance.rb +2 -2
  159. data/lib/datadog/profiling/transport/http/api/spec.rb +1 -1
  160. data/lib/datadog/profiling/transport/http/api.rb +5 -5
  161. data/lib/datadog/profiling/transport/http/builder.rb +3 -3
  162. data/lib/datadog/profiling/transport/http/client.rb +2 -2
  163. data/lib/datadog/profiling/transport/http/response.rb +1 -1
  164. data/lib/datadog/profiling/transport/http.rb +21 -15
  165. data/lib/datadog/profiling.rb +21 -20
  166. data/lib/datadog/tracing/analytics.rb +1 -1
  167. data/lib/datadog/tracing/buffer.rb +5 -5
  168. data/lib/datadog/tracing/context.rb +1 -1
  169. data/lib/datadog/tracing/context_provider.rb +2 -2
  170. data/lib/datadog/tracing/contrib/action_cable/configuration/settings.rb +2 -2
  171. data/lib/datadog/tracing/contrib/action_cable/event.rb +4 -5
  172. data/lib/datadog/tracing/contrib/action_cable/events/broadcast.rb +4 -4
  173. data/lib/datadog/tracing/contrib/action_cable/events/perform_action.rb +3 -3
  174. data/lib/datadog/tracing/contrib/action_cable/events/transmit.rb +4 -4
  175. data/lib/datadog/tracing/contrib/action_cable/events.rb +4 -4
  176. data/lib/datadog/tracing/contrib/action_cable/instrumentation.rb +3 -4
  177. data/lib/datadog/tracing/contrib/action_cable/integration.rb +4 -4
  178. data/lib/datadog/tracing/contrib/action_cable/patcher.rb +4 -4
  179. data/lib/datadog/tracing/contrib/action_mailer/configuration/settings.rb +2 -2
  180. data/lib/datadog/tracing/contrib/action_mailer/event.rb +3 -3
  181. data/lib/datadog/tracing/contrib/action_mailer/events/deliver.rb +3 -3
  182. data/lib/datadog/tracing/contrib/action_mailer/events/process.rb +3 -3
  183. data/lib/datadog/tracing/contrib/action_mailer/events.rb +2 -2
  184. data/lib/datadog/tracing/contrib/action_mailer/integration.rb +4 -4
  185. data/lib/datadog/tracing/contrib/action_mailer/patcher.rb +3 -3
  186. data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +6 -6
  187. data/lib/datadog/tracing/contrib/action_pack/action_controller/patcher.rb +2 -2
  188. data/lib/datadog/tracing/contrib/action_pack/configuration/settings.rb +2 -2
  189. data/lib/datadog/tracing/contrib/action_pack/integration.rb +4 -4
  190. data/lib/datadog/tracing/contrib/action_pack/patcher.rb +2 -2
  191. data/lib/datadog/tracing/contrib/action_pack/utils.rb +1 -1
  192. data/lib/datadog/tracing/contrib/action_view/configuration/settings.rb +2 -2
  193. data/lib/datadog/tracing/contrib/action_view/event.rb +1 -1
  194. data/lib/datadog/tracing/contrib/action_view/events/render_partial.rb +5 -5
  195. data/lib/datadog/tracing/contrib/action_view/events/render_template.rb +5 -5
  196. data/lib/datadog/tracing/contrib/action_view/events.rb +2 -2
  197. data/lib/datadog/tracing/contrib/action_view/instrumentation/partial_renderer.rb +2 -2
  198. data/lib/datadog/tracing/contrib/action_view/instrumentation/template_renderer.rb +2 -2
  199. data/lib/datadog/tracing/contrib/action_view/integration.rb +4 -4
  200. data/lib/datadog/tracing/contrib/action_view/patcher.rb +7 -7
  201. data/lib/datadog/tracing/contrib/action_view/utils.rb +1 -1
  202. data/lib/datadog/tracing/contrib/active_job/configuration/settings.rb +3 -3
  203. data/lib/datadog/tracing/contrib/active_job/event.rb +3 -3
  204. data/lib/datadog/tracing/contrib/active_job/events/discard.rb +4 -4
  205. data/lib/datadog/tracing/contrib/active_job/events/enqueue.rb +4 -4
  206. data/lib/datadog/tracing/contrib/active_job/events/enqueue_at.rb +4 -4
  207. data/lib/datadog/tracing/contrib/active_job/events/enqueue_retry.rb +4 -4
  208. data/lib/datadog/tracing/contrib/active_job/events/perform.rb +4 -4
  209. data/lib/datadog/tracing/contrib/active_job/events/retry_stopped.rb +4 -4
  210. data/lib/datadog/tracing/contrib/active_job/events.rb +6 -6
  211. data/lib/datadog/tracing/contrib/active_job/integration.rb +4 -4
  212. data/lib/datadog/tracing/contrib/active_job/log_injection.rb +0 -2
  213. data/lib/datadog/tracing/contrib/active_job/patcher.rb +4 -4
  214. data/lib/datadog/tracing/contrib/active_model_serializers/configuration/settings.rb +2 -2
  215. data/lib/datadog/tracing/contrib/active_model_serializers/event.rb +4 -5
  216. data/lib/datadog/tracing/contrib/active_model_serializers/events/render.rb +3 -3
  217. data/lib/datadog/tracing/contrib/active_model_serializers/events/serialize.rb +2 -2
  218. data/lib/datadog/tracing/contrib/active_model_serializers/events.rb +2 -2
  219. data/lib/datadog/tracing/contrib/active_model_serializers/integration.rb +3 -3
  220. data/lib/datadog/tracing/contrib/active_model_serializers/patcher.rb +3 -4
  221. data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +2 -2
  222. data/lib/datadog/tracing/contrib/active_record/configuration/settings.rb +3 -3
  223. data/lib/datadog/tracing/contrib/active_record/event.rb +1 -1
  224. data/lib/datadog/tracing/contrib/active_record/events/instantiation.rb +4 -4
  225. data/lib/datadog/tracing/contrib/active_record/events/sql.rb +6 -6
  226. data/lib/datadog/tracing/contrib/active_record/events.rb +2 -2
  227. data/lib/datadog/tracing/contrib/active_record/integration.rb +6 -6
  228. data/lib/datadog/tracing/contrib/active_record/patcher.rb +2 -2
  229. data/lib/datadog/tracing/contrib/active_record/utils.rb +2 -2
  230. data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +19 -9
  231. data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +2 -2
  232. data/lib/datadog/tracing/contrib/active_support/cache/redis.rb +1 -1
  233. data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +2 -2
  234. data/lib/datadog/tracing/contrib/active_support/integration.rb +5 -5
  235. data/lib/datadog/tracing/contrib/active_support/notifications/event.rb +1 -1
  236. data/lib/datadog/tracing/contrib/active_support/notifications/subscriber.rb +1 -1
  237. data/lib/datadog/tracing/contrib/active_support/patcher.rb +2 -2
  238. data/lib/datadog/tracing/contrib/analytics.rb +1 -1
  239. data/lib/datadog/tracing/contrib/auto_instrument.rb +4 -4
  240. data/lib/datadog/tracing/contrib/aws/configuration/settings.rb +2 -2
  241. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +3 -4
  242. data/lib/datadog/tracing/contrib/aws/integration.rb +3 -3
  243. data/lib/datadog/tracing/contrib/aws/patcher.rb +5 -5
  244. data/lib/datadog/tracing/contrib/concurrent_ruby/configuration/settings.rb +2 -2
  245. data/lib/datadog/tracing/contrib/concurrent_ruby/future_patch.rb +1 -1
  246. data/lib/datadog/tracing/contrib/concurrent_ruby/integration.rb +3 -3
  247. data/lib/datadog/tracing/contrib/concurrent_ruby/patcher.rb +2 -2
  248. data/lib/datadog/tracing/contrib/configurable.rb +2 -2
  249. data/lib/datadog/tracing/contrib/configuration/resolvers/pattern_resolver.rb +1 -1
  250. data/lib/datadog/tracing/contrib/configuration/settings.rb +2 -2
  251. data/lib/datadog/tracing/contrib/dalli/configuration/settings.rb +2 -2
  252. data/lib/datadog/tracing/contrib/dalli/instrumentation.rb +4 -5
  253. data/lib/datadog/tracing/contrib/dalli/integration.rb +3 -3
  254. data/lib/datadog/tracing/contrib/dalli/patcher.rb +3 -3
  255. data/lib/datadog/tracing/contrib/dalli/quantize.rb +1 -1
  256. data/lib/datadog/tracing/contrib/delayed_job/configuration/settings.rb +3 -3
  257. data/lib/datadog/tracing/contrib/delayed_job/ext.rb +2 -0
  258. data/lib/datadog/tracing/contrib/delayed_job/integration.rb +3 -3
  259. data/lib/datadog/tracing/contrib/delayed_job/patcher.rb +8 -2
  260. data/lib/datadog/tracing/contrib/delayed_job/plugin.rb +3 -4
  261. data/lib/datadog/tracing/contrib/delayed_job/server_internal_tracer/worker.rb +32 -0
  262. data/lib/datadog/tracing/contrib/elasticsearch/configuration/settings.rb +2 -2
  263. data/lib/datadog/tracing/contrib/elasticsearch/integration.rb +3 -3
  264. data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +6 -7
  265. data/lib/datadog/tracing/contrib/elasticsearch/quantize.rb +1 -1
  266. data/lib/datadog/tracing/contrib/ethon/configuration/settings.rb +2 -2
  267. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +4 -5
  268. data/lib/datadog/tracing/contrib/ethon/integration.rb +4 -4
  269. data/lib/datadog/tracing/contrib/ethon/multi_patch.rb +3 -4
  270. data/lib/datadog/tracing/contrib/ethon/patcher.rb +3 -3
  271. data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +2 -2
  272. data/lib/datadog/tracing/contrib/excon/integration.rb +4 -4
  273. data/lib/datadog/tracing/contrib/excon/middleware.rb +6 -7
  274. data/lib/datadog/tracing/contrib/excon/patcher.rb +2 -2
  275. data/lib/datadog/tracing/contrib/extensions.rb +5 -3
  276. data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +2 -2
  277. data/lib/datadog/tracing/contrib/faraday/integration.rb +4 -4
  278. data/lib/datadog/tracing/contrib/faraday/middleware.rb +5 -6
  279. data/lib/datadog/tracing/contrib/faraday/patcher.rb +5 -5
  280. data/lib/datadog/tracing/contrib/grape/configuration/settings.rb +3 -3
  281. data/lib/datadog/tracing/contrib/grape/endpoint.rb +4 -5
  282. data/lib/datadog/tracing/contrib/grape/integration.rb +3 -3
  283. data/lib/datadog/tracing/contrib/grape/patcher.rb +4 -4
  284. data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +2 -2
  285. data/lib/datadog/tracing/contrib/graphql/integration.rb +3 -3
  286. data/lib/datadog/tracing/contrib/graphql/patcher.rb +2 -3
  287. data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +3 -3
  288. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +13 -4
  289. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +6 -6
  290. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor.rb +3 -4
  291. data/lib/datadog/tracing/contrib/grpc/ext.rb +1 -0
  292. data/lib/datadog/tracing/contrib/grpc/integration.rb +3 -3
  293. data/lib/datadog/tracing/contrib/grpc/patcher.rb +5 -5
  294. data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +1 -2
  295. data/lib/datadog/tracing/contrib/http/configuration/settings.rb +2 -2
  296. data/lib/datadog/tracing/contrib/http/instrumentation.rb +3 -4
  297. data/lib/datadog/tracing/contrib/http/integration.rb +6 -6
  298. data/lib/datadog/tracing/contrib/http/patcher.rb +3 -3
  299. data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +2 -2
  300. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +4 -5
  301. data/lib/datadog/tracing/contrib/httpclient/integration.rb +4 -4
  302. data/lib/datadog/tracing/contrib/httpclient/patcher.rb +3 -3
  303. data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +2 -2
  304. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +4 -5
  305. data/lib/datadog/tracing/contrib/httprb/integration.rb +4 -4
  306. data/lib/datadog/tracing/contrib/httprb/patcher.rb +3 -3
  307. data/lib/datadog/tracing/contrib/integration.rb +3 -3
  308. data/lib/datadog/tracing/contrib/kafka/configuration/settings.rb +2 -2
  309. data/lib/datadog/tracing/contrib/kafka/event.rb +3 -3
  310. data/lib/datadog/tracing/contrib/kafka/events/connection/request.rb +2 -2
  311. data/lib/datadog/tracing/contrib/kafka/events/consumer/process_batch.rb +3 -3
  312. data/lib/datadog/tracing/contrib/kafka/events/consumer/process_message.rb +3 -3
  313. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/heartbeat.rb +4 -4
  314. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/join_group.rb +4 -4
  315. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/leave_group.rb +4 -4
  316. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/sync_group.rb +4 -4
  317. data/lib/datadog/tracing/contrib/kafka/events/produce_operation/send_messages.rb +2 -2
  318. data/lib/datadog/tracing/contrib/kafka/events/producer/deliver_messages.rb +2 -2
  319. data/lib/datadog/tracing/contrib/kafka/events.rb +9 -9
  320. data/lib/datadog/tracing/contrib/kafka/integration.rb +3 -3
  321. data/lib/datadog/tracing/contrib/kafka/patcher.rb +3 -3
  322. data/lib/datadog/tracing/contrib/lograge/configuration/settings.rb +2 -2
  323. data/lib/datadog/tracing/contrib/lograge/instrumentation.rb +1 -2
  324. data/lib/datadog/tracing/contrib/lograge/integration.rb +3 -3
  325. data/lib/datadog/tracing/contrib/lograge/patcher.rb +2 -2
  326. data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +2 -2
  327. data/lib/datadog/tracing/contrib/mongodb/instrumentation.rb +3 -3
  328. data/lib/datadog/tracing/contrib/mongodb/integration.rb +4 -4
  329. data/lib/datadog/tracing/contrib/mongodb/parsers.rb +1 -1
  330. data/lib/datadog/tracing/contrib/mongodb/patcher.rb +3 -3
  331. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +4 -4
  332. data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +2 -2
  333. data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +3 -4
  334. data/lib/datadog/tracing/contrib/mysql2/integration.rb +3 -3
  335. data/lib/datadog/tracing/contrib/mysql2/patcher.rb +2 -2
  336. data/lib/datadog/tracing/contrib/patcher.rb +13 -2
  337. data/lib/datadog/tracing/contrib/pg/configuration/settings.rb +2 -2
  338. data/lib/datadog/tracing/contrib/pg/instrumentation.rb +3 -4
  339. data/lib/datadog/tracing/contrib/pg/integration.rb +3 -3
  340. data/lib/datadog/tracing/contrib/pg/patcher.rb +2 -2
  341. data/lib/datadog/tracing/contrib/presto/configuration/settings.rb +2 -2
  342. data/lib/datadog/tracing/contrib/presto/instrumentation.rb +2 -3
  343. data/lib/datadog/tracing/contrib/presto/integration.rb +3 -3
  344. data/lib/datadog/tracing/contrib/presto/patcher.rb +4 -4
  345. data/lib/datadog/tracing/contrib/qless/configuration/settings.rb +2 -2
  346. data/lib/datadog/tracing/contrib/qless/integration.rb +3 -3
  347. data/lib/datadog/tracing/contrib/qless/patcher.rb +1 -2
  348. data/lib/datadog/tracing/contrib/qless/qless_job.rb +2 -3
  349. data/lib/datadog/tracing/contrib/qless/tracer_cleaner.rb +0 -2
  350. data/lib/datadog/tracing/contrib/que/configuration/settings.rb +3 -3
  351. data/lib/datadog/tracing/contrib/que/integration.rb +4 -4
  352. data/lib/datadog/tracing/contrib/que/patcher.rb +1 -1
  353. data/lib/datadog/tracing/contrib/que/tracer.rb +1 -1
  354. data/lib/datadog/tracing/contrib/racecar/configuration/settings.rb +2 -2
  355. data/lib/datadog/tracing/contrib/racecar/event.rb +4 -5
  356. data/lib/datadog/tracing/contrib/racecar/events/batch.rb +2 -2
  357. data/lib/datadog/tracing/contrib/racecar/events/consume.rb +2 -2
  358. data/lib/datadog/tracing/contrib/racecar/events/message.rb +2 -2
  359. data/lib/datadog/tracing/contrib/racecar/events.rb +3 -3
  360. data/lib/datadog/tracing/contrib/racecar/integration.rb +3 -3
  361. data/lib/datadog/tracing/contrib/racecar/patcher.rb +3 -3
  362. data/lib/datadog/tracing/contrib/rack/configuration/settings.rb +2 -2
  363. data/lib/datadog/tracing/contrib/rack/integration.rb +4 -4
  364. data/lib/datadog/tracing/contrib/rack/middlewares.rb +24 -20
  365. data/lib/datadog/tracing/contrib/rack/patcher.rb +12 -2
  366. data/lib/datadog/tracing/contrib/rails/auto_instrument_railtie.rb +1 -1
  367. data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +1 -1
  368. data/lib/datadog/tracing/contrib/rails/framework.rb +16 -21
  369. data/lib/datadog/tracing/contrib/rails/integration.rb +4 -4
  370. data/lib/datadog/tracing/contrib/rails/log_injection.rb +0 -2
  371. data/lib/datadog/tracing/contrib/rails/middlewares.rb +1 -2
  372. data/lib/datadog/tracing/contrib/rails/patcher.rb +7 -8
  373. data/lib/datadog/tracing/contrib/rails/railtie.rb +3 -3
  374. data/lib/datadog/tracing/contrib/rails/utils.rb +1 -1
  375. data/lib/datadog/tracing/contrib/rake/configuration/settings.rb +17 -2
  376. data/lib/datadog/tracing/contrib/rake/instrumentation.rb +12 -7
  377. data/lib/datadog/tracing/contrib/rake/integration.rb +3 -3
  378. data/lib/datadog/tracing/contrib/rake/patcher.rb +3 -4
  379. data/lib/datadog/tracing/contrib/redis/configuration/resolver.rb +1 -1
  380. data/lib/datadog/tracing/contrib/redis/configuration/settings.rb +2 -2
  381. data/lib/datadog/tracing/contrib/redis/instrumentation.rb +6 -7
  382. data/lib/datadog/tracing/contrib/redis/integration.rb +3 -3
  383. data/lib/datadog/tracing/contrib/redis/patcher.rb +6 -6
  384. data/lib/datadog/tracing/contrib/redis/tags.rb +3 -4
  385. data/lib/datadog/tracing/contrib/resque/configuration/settings.rb +3 -3
  386. data/lib/datadog/tracing/contrib/resque/integration.rb +3 -3
  387. data/lib/datadog/tracing/contrib/resque/patcher.rb +2 -2
  388. data/lib/datadog/tracing/contrib/resque/resque_job.rb +3 -4
  389. data/lib/datadog/tracing/contrib/rest_client/configuration/settings.rb +2 -2
  390. data/lib/datadog/tracing/contrib/rest_client/integration.rb +3 -3
  391. data/lib/datadog/tracing/contrib/rest_client/patcher.rb +2 -2
  392. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +4 -5
  393. data/lib/datadog/tracing/contrib/semantic_logger/configuration/settings.rb +2 -2
  394. data/lib/datadog/tracing/contrib/semantic_logger/instrumentation.rb +1 -2
  395. data/lib/datadog/tracing/contrib/semantic_logger/integration.rb +3 -3
  396. data/lib/datadog/tracing/contrib/semantic_logger/patcher.rb +2 -2
  397. data/lib/datadog/tracing/contrib/sequel/configuration/settings.rb +2 -2
  398. data/lib/datadog/tracing/contrib/sequel/database.rb +4 -5
  399. data/lib/datadog/tracing/contrib/sequel/dataset.rb +4 -5
  400. data/lib/datadog/tracing/contrib/sequel/integration.rb +3 -3
  401. data/lib/datadog/tracing/contrib/sequel/patcher.rb +3 -3
  402. data/lib/datadog/tracing/contrib/sequel/utils.rb +2 -2
  403. data/lib/datadog/tracing/contrib/shoryuken/configuration/settings.rb +3 -3
  404. data/lib/datadog/tracing/contrib/shoryuken/integration.rb +4 -4
  405. data/lib/datadog/tracing/contrib/shoryuken/patcher.rb +1 -1
  406. data/lib/datadog/tracing/contrib/shoryuken/tracer.rb +1 -1
  407. data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +4 -5
  408. data/lib/datadog/tracing/contrib/sidekiq/configuration/settings.rb +3 -3
  409. data/lib/datadog/tracing/contrib/sidekiq/ext.rb +6 -0
  410. data/lib/datadog/tracing/contrib/sidekiq/integration.rb +3 -3
  411. data/lib/datadog/tracing/contrib/sidekiq/patcher.rb +14 -7
  412. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/heartbeat.rb +19 -1
  413. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/{scheduled_push.rb → redis_info.rb} +5 -6
  414. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/scheduled_poller.rb +53 -0
  415. data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +5 -6
  416. data/lib/datadog/tracing/contrib/sidekiq/tracing.rb +2 -2
  417. data/lib/datadog/tracing/contrib/sinatra/configuration/settings.rb +2 -2
  418. data/lib/datadog/tracing/contrib/sinatra/env.rb +2 -2
  419. data/lib/datadog/tracing/contrib/sinatra/framework.rb +0 -2
  420. data/lib/datadog/tracing/contrib/sinatra/headers.rb +1 -1
  421. data/lib/datadog/tracing/contrib/sinatra/integration.rb +3 -3
  422. data/lib/datadog/tracing/contrib/sinatra/patcher.rb +5 -5
  423. data/lib/datadog/tracing/contrib/sinatra/tracer.rb +7 -8
  424. data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +6 -7
  425. data/lib/datadog/tracing/contrib/sneakers/configuration/settings.rb +2 -2
  426. data/lib/datadog/tracing/contrib/sneakers/integration.rb +4 -4
  427. data/lib/datadog/tracing/contrib/sneakers/patcher.rb +2 -2
  428. data/lib/datadog/tracing/contrib/sneakers/tracer.rb +2 -3
  429. data/lib/datadog/tracing/contrib/status_code_matcher.rb +2 -2
  430. data/lib/datadog/tracing/contrib/sucker_punch/configuration/settings.rb +2 -2
  431. data/lib/datadog/tracing/contrib/sucker_punch/instrumentation.rb +3 -4
  432. data/lib/datadog/tracing/contrib/sucker_punch/integration.rb +3 -3
  433. data/lib/datadog/tracing/contrib/sucker_punch/patcher.rb +4 -5
  434. data/lib/datadog/tracing/contrib.rb +48 -48
  435. data/lib/datadog/tracing/correlation.rb +1 -1
  436. data/lib/datadog/tracing/distributed/headers/b3.rb +4 -4
  437. data/lib/datadog/tracing/distributed/headers/b3_single.rb +4 -4
  438. data/lib/datadog/tracing/distributed/headers/datadog.rb +3 -3
  439. data/lib/datadog/tracing/distributed/headers/parser.rb +1 -1
  440. data/lib/datadog/tracing/distributed/helpers.rb +2 -2
  441. data/lib/datadog/tracing/distributed/metadata/b3.rb +4 -4
  442. data/lib/datadog/tracing/distributed/metadata/b3_single.rb +4 -4
  443. data/lib/datadog/tracing/distributed/metadata/datadog.rb +2 -2
  444. data/lib/datadog/tracing/distributed/metadata/parser.rb +1 -1
  445. data/lib/datadog/tracing/event.rb +1 -1
  446. data/lib/datadog/tracing/metadata/analytics.rb +2 -2
  447. data/lib/datadog/tracing/metadata/errors.rb +2 -2
  448. data/lib/datadog/tracing/metadata/tagging.rb +2 -2
  449. data/lib/datadog/tracing/metadata.rb +3 -3
  450. data/lib/datadog/tracing/pipeline/span_filter.rb +10 -6
  451. data/lib/datadog/tracing/pipeline.rb +3 -3
  452. data/lib/datadog/tracing/propagation/grpc.rb +6 -6
  453. data/lib/datadog/tracing/propagation/http.rb +8 -8
  454. data/lib/datadog/tracing/runtime/metrics.rb +1 -1
  455. data/lib/datadog/tracing/sampling/all_sampler.rb +1 -1
  456. data/lib/datadog/tracing/sampling/priority_sampler.rb +5 -5
  457. data/lib/datadog/tracing/sampling/rate_by_key_sampler.rb +2 -2
  458. data/lib/datadog/tracing/sampling/rate_by_service_sampler.rb +3 -3
  459. data/lib/datadog/tracing/sampling/rate_limiter.rb +1 -1
  460. data/lib/datadog/tracing/sampling/rate_sampler.rb +5 -5
  461. data/lib/datadog/tracing/sampling/rule.rb +3 -3
  462. data/lib/datadog/tracing/sampling/rule_sampler.rb +4 -4
  463. data/lib/datadog/tracing/span.rb +4 -4
  464. data/lib/datadog/tracing/span_operation.rb +9 -9
  465. data/lib/datadog/tracing/sync_writer.rb +5 -5
  466. data/lib/datadog/tracing/trace_operation.rb +16 -9
  467. data/lib/datadog/tracing/trace_segment.rb +5 -5
  468. data/lib/datadog/tracing/tracer.rb +15 -15
  469. data/lib/datadog/tracing/workers/trace_writer.rb +9 -9
  470. data/lib/datadog/tracing/workers.rb +3 -3
  471. data/lib/datadog/tracing/writer.rb +5 -5
  472. data/lib/datadog/tracing.rb +8 -8
  473. data/lib/ddtrace/auto_instrument.rb +9 -2
  474. data/lib/ddtrace/transport/ext.rb +7 -1
  475. data/lib/ddtrace/transport/http/adapters/net.rb +3 -2
  476. data/lib/ddtrace/transport/http/adapters/test.rb +1 -1
  477. data/lib/ddtrace/transport/http/adapters/unix_socket.rb +2 -2
  478. data/lib/ddtrace/transport/http/api/map.rb +1 -1
  479. data/lib/ddtrace/transport/http/api.rb +4 -4
  480. data/lib/ddtrace/transport/http/builder.rb +5 -5
  481. data/lib/ddtrace/transport/http/client.rb +2 -2
  482. data/lib/ddtrace/transport/http/response.rb +1 -1
  483. data/lib/ddtrace/transport/http/statistics.rb +1 -1
  484. data/lib/ddtrace/transport/http/traces.rb +5 -5
  485. data/lib/ddtrace/transport/http.rb +12 -9
  486. data/lib/ddtrace/transport/io/client.rb +2 -2
  487. data/lib/ddtrace/transport/io/response.rb +1 -1
  488. data/lib/ddtrace/transport/io/traces.rb +3 -3
  489. data/lib/ddtrace/transport/io.rb +3 -3
  490. data/lib/ddtrace/transport/statistics.rb +2 -2
  491. data/lib/ddtrace/transport/trace_formatter.rb +5 -5
  492. data/lib/ddtrace/transport/traces.rb +5 -5
  493. data/lib/ddtrace/version.rb +1 -1
  494. data/lib/ddtrace.rb +6 -6
  495. metadata +35 -22
  496. data/.editorconfig +0 -22
  497. data/.gitignore +0 -58
  498. data/CONTRIBUTING.md +0 -81
  499. data/ddtrace.gemspec +0 -71
  500. data/docs/0.x-trace.png +0 -0
  501. data/docs/1.0-trace.png +0 -0
  502. data/docs/AutoInstrumentation.md +0 -36
  503. data/docs/Deprecation.md +0 -8
  504. data/docs/DevelopmentGuide.md +0 -259
  505. data/docs/GettingStarted.md +0 -2712
  506. data/docs/ProfilingDevelopment.md +0 -109
  507. data/docs/PublicApi.md +0 -14
  508. data/docs/UpgradeGuide.md +0 -736
@@ -5,6 +5,11 @@ module Datadog
5
5
  module Ext
6
6
  # Monkey patches `Kernel#fork`, adding a `Kernel#at_fork` callback mechanism which is used to restore
7
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`
8
13
  module Forking
9
14
  def self.supported?
10
15
  Process.respond_to?(:fork)
@@ -13,33 +18,22 @@ module Datadog
13
18
  def self.apply!
14
19
  return false unless supported?
15
20
 
16
- modules = [::Process, ::Kernel]
17
- # TODO: Ruby < 2.3 doesn't support Binding#receiver.
18
- # Remove "else #eval" clause when Ruby < 2.3 support is dropped.
19
- # NOTE: Modifying the "main" object as we do here is (as far as I know) irreversible. During tests, this change
20
- # will stick around even if we otherwise stub `Process` and `Kernel`.
21
- modules << (TOPLEVEL_BINDING.respond_to?(:receiver) ? TOPLEVEL_BINDING.receiver : TOPLEVEL_BINDING.eval('self'))
22
-
23
- # Patch top-level binding, Kernel, Process.
24
- # NOTE: We could instead do Kernel.module_eval { def fork; ... end }
25
- # however, this method rewrite is more invasive and irreversible.
26
- # It could also have collisions with other libraries that patch.
27
- # Opt to modify the inheritance of each relevant target instead.
28
- modules.each do |mod|
29
- clazz = if mod.class <= Module
30
- mod.singleton_class
31
- else
32
- mod.class
33
- end
34
-
35
- clazz.prepend(Kernel)
36
- end
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)
37
30
  end
38
31
 
39
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
40
36
  module Kernel
41
- FORK_STAGES = [:prepare, :parent, :child].freeze
42
-
43
37
  def fork
44
38
  # If a block is provided, it must be wrapped to trigger callbacks.
45
39
  child_block = if block_given?
@@ -52,9 +46,6 @@ module Datadog
52
46
  end
53
47
  end
54
48
 
55
- # Trigger :prepare callback
56
- ddtrace_at_fork_blocks[:prepare].each(&:call) if ddtrace_at_fork_blocks.key?(:prepare)
57
-
58
49
  # Start fork
59
50
  # If a block is provided, use the wrapped version.
60
51
  result = child_block.nil? ? super : super(&child_block)
@@ -62,22 +53,14 @@ module Datadog
62
53
  # Trigger correct callbacks depending on whether we're in the parent or child.
63
54
  # If we're in the fork, result = nil: trigger child callbacks.
64
55
  # If we're in the parent, result = fork PID: trigger parent callbacks.
65
- # rubocop:disable Style/IfInsideElse
66
- if result.nil?
67
- # Trigger :child callback
68
- ddtrace_at_fork_blocks[:child].each(&:call) if ddtrace_at_fork_blocks.key?(:child)
69
- else
70
- # Trigger :parent callback
71
- ddtrace_at_fork_blocks[:parent].each(&:call) if ddtrace_at_fork_blocks.key?(:parent)
72
- end
73
- # rubocop:enable Style/IfInsideElse
56
+ ddtrace_at_fork_blocks[:child].each(&:call) if result.nil? && ddtrace_at_fork_blocks.key?(:child)
74
57
 
75
58
  # Return PID from #fork
76
59
  result
77
60
  end
78
61
 
79
- def at_fork(stage = :prepare, &block)
80
- raise ArgumentError, 'Bad \'stage\' for ::at_fork' unless FORK_STAGES.include?(stage)
62
+ def at_fork(stage, &block)
63
+ raise ArgumentError, 'Bad \'stage\' for ::at_fork' unless stage == :child
81
64
 
82
65
  ddtrace_at_fork_blocks[stage] = [] unless ddtrace_at_fork_blocks.key?(stage)
83
66
  ddtrace_at_fork_blocks[stage] << block
@@ -93,6 +76,22 @@ module Datadog
93
76
  # rubocop:enable Style/ClassVars
94
77
  end
95
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
+ ddtrace_at_fork_blocks = Datadog::Profiling::Ext::Forking::Kernel.ddtrace_at_fork_blocks
87
+
88
+ result = super
89
+
90
+ ddtrace_at_fork_blocks[:child].each(&:call) if ddtrace_at_fork_blocks.key?(:child)
91
+
92
+ result
93
+ end
94
+ end
96
95
  end
97
96
  end
98
97
  end
@@ -9,6 +9,7 @@ module Datadog
9
9
  ENV_AGENTLESS = 'DD_PROFILING_AGENTLESS'.freeze
10
10
  ENV_ENDPOINT_COLLECTION_ENABLED = 'DD_PROFILING_ENDPOINT_COLLECTION_ENABLED'.freeze
11
11
 
12
+ # TODO: Consider removing this once the Ruby-based pprof encoding is removed and replaced by libdatadog
12
13
  module Pprof
13
14
  LABEL_KEY_LOCAL_ROOT_SPAN_ID = 'local root span id'.freeze
14
15
  LABEL_KEY_SPAN_ID = 'span id'.freeze
@@ -1,8 +1,5 @@
1
1
  # typed: false
2
2
 
3
- require 'datadog/core/environment/identity'
4
- require 'datadog/core/environment/socket'
5
-
6
3
  module Datadog
7
4
  module Profiling
8
5
  # Represents a collection of events of a specific type being flushed.
@@ -28,7 +28,7 @@ module Datadog
28
28
  upload_timeout_milliseconds: @upload_timeout_milliseconds,
29
29
 
30
30
  # why "timespec"?
31
- # libddprof represents time using POSIX's struct timespec, see
31
+ # libdatadog represents time using POSIX's struct timespec, see
32
32
  # https://www.gnu.org/software/libc/manual/html_node/Time-Types.html
33
33
  # aka it represents the seconds part separate from the nanoseconds part
34
34
  start_timespec_seconds: flush.start.tv_sec,
@@ -80,8 +80,9 @@ module Datadog
80
80
  def validate_agent_settings(agent_settings)
81
81
  supported_adapters = [Datadog::Transport::Ext::HTTP::ADAPTER, Datadog::Transport::Ext::UnixSocket::ADAPTER]
82
82
  unless supported_adapters.include?(agent_settings.adapter)
83
- raise ArgumentError, "Unsupported transport configuration for profiling: Adapter #{agent_settings.adapter} " \
84
- ' is not supported'
83
+ raise ArgumentError,
84
+ "Unsupported transport configuration for profiling: Adapter #{agent_settings.adapter} " \
85
+ ' is not supported'
85
86
  end
86
87
 
87
88
  if agent_settings.deprecated_for_removal_transport_configuration_proc
@@ -1,7 +1,7 @@
1
1
  # typed: true
2
2
 
3
- require 'datadog/profiling/buffer'
4
- require 'datadog/profiling/encoding/profile'
3
+ require_relative 'buffer'
4
+ require_relative 'encoding/profile'
5
5
 
6
6
  module Datadog
7
7
  module Profiling
@@ -73,11 +73,6 @@ module Datadog
73
73
  [start, finish, encoded_pprof]
74
74
  end
75
75
 
76
- # NOTE: Remember that if the recorder is being accessed by multiple threads, this is an inherently racy operation.
77
- def empty?
78
- @buffers.values.all?(&:empty?)
79
- end
80
-
81
76
  # Error when event of an unknown type is used with the OldRecorder
82
77
  class UnknownEventError < StandardError
83
78
  attr_reader :event_class
@@ -2,10 +2,10 @@
2
2
 
3
3
  # typed: true
4
4
 
5
- require 'datadog/profiling/flush'
6
- require 'datadog/profiling/pprof/message_set'
7
- require 'datadog/profiling/pprof/string_table'
8
- require 'datadog/core/utils/time'
5
+ require_relative '../flush'
6
+ require_relative 'message_set'
7
+ require_relative 'string_table'
8
+ require_relative '../../core/utils/time'
9
9
 
10
10
  module Datadog
11
11
  module Profiling
@@ -1,6 +1,6 @@
1
1
  # typed: true
2
2
 
3
- require 'datadog/profiling/ext'
3
+ require_relative '../ext'
4
4
 
5
5
  module Datadog
6
6
  module Profiling
@@ -1,6 +1,6 @@
1
1
  # typed: true
2
2
 
3
- require 'datadog/core/utils/object_set'
3
+ require_relative '../../core/utils/object_set'
4
4
 
5
5
  module Datadog
6
6
  module Profiling
@@ -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,9 +1,9 @@
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
@@ -69,6 +69,7 @@ module Datadog
69
69
  def after_fork
70
70
  # Clear any existing profiling state.
71
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')
72
73
  exporter.flush
73
74
  end
74
75
 
@@ -82,7 +83,7 @@ module Datadog
82
83
  end
83
84
 
84
85
  def work_pending?
85
- !exporter.empty?
86
+ exporter.can_flush?
86
87
  end
87
88
 
88
89
  private
@@ -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/old_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
@@ -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 'ddtrace/transport/request'
3
+ require_relative '../../../../ddtrace/transport/http/client'
4
+ require_relative '../../../../ddtrace/transport/request'
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/response'
3
+ require_relative '../../../../ddtrace/transport/http/response'
4
4
 
5
5
  module Datadog
6
6
  module Profiling
@@ -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
@@ -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/cpu_and_wall_time'
151
- require 'datadog/profiling/collectors/old_stack'
152
- require 'datadog/profiling/collectors/stack'
153
- require 'datadog/profiling/stack_recorder'
154
- require 'datadog/profiling/old_recorder'
155
- require 'datadog/profiling/exporter'
156
- require 'datadog/profiling/scheduler'
157
- require 'datadog/profiling/tasks/setup'
158
- require 'datadog/profiling/profiler'
159
- require 'datadog/profiling/native_extension'
160
- require 'datadog/profiling/trace_identifiers/helper'
161
- require 'datadog/profiling/pprof/pprof_pb'
162
- require 'datadog/profiling/tag_builder'
163
- require 'datadog/profiling/http_transport'
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
@@ -1,7 +1,7 @@
1
1
  # typed: true
2
2
 
3
- require 'datadog/core/utils/sequence'
4
- require 'datadog/tracing/context'
3
+ require_relative '../core/utils/sequence'
4
+ require_relative 'context'
5
5
 
6
6
  module Datadog
7
7
  module Tracing