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
@@ -0,0 +1,12 @@
1
+ #pragma once
2
+
3
+ // Used to mark symbols to be exported to the outside of the extension.
4
+ // Consider very carefully before tagging a function with this.
5
+ #define DDTRACE_EXPORT __attribute__ ((visibility ("default")))
6
+
7
+ // Used to mark function arguments that are deliberately left unused
8
+ #ifdef __GNUC__
9
+ #define DDTRACE_UNUSED __attribute__((unused))
10
+ #else
11
+ #define DDTRACE_UNUSED
12
+ #endif
@@ -0,0 +1,334 @@
1
+ #include <ruby.h>
2
+ #include <ruby/thread.h>
3
+ #include <ddprof/ffi.h>
4
+ #include "helpers.h"
5
+ #include "libdatadog_helpers.h"
6
+ #include "ruby_helpers.h"
7
+
8
+ // Used to report profiling data to Datadog.
9
+ // This file implements the native bits of the Datadog::Profiling::HttpTransport class
10
+
11
+ static VALUE ok_symbol = Qnil; // :ok in Ruby
12
+ static VALUE error_symbol = Qnil; // :error in Ruby
13
+
14
+ static ID agentless_id; // id of :agentless in Ruby
15
+ static ID agent_id; // id of :agent in Ruby
16
+
17
+ static ID log_failure_to_process_tag_id; // id of :log_failure_to_process_tag in Ruby
18
+
19
+ static VALUE http_transport_class = Qnil;
20
+
21
+ struct call_exporter_without_gvl_arguments {
22
+ ddprof_ffi_ProfileExporterV3 *exporter;
23
+ ddprof_ffi_Request *request;
24
+ ddprof_ffi_CancellationToken *cancel_token;
25
+ ddprof_ffi_SendResult result;
26
+ bool send_ran;
27
+ };
28
+
29
+ inline static ddprof_ffi_ByteSlice byte_slice_from_ruby_string(VALUE string);
30
+ static VALUE _native_validate_exporter(VALUE self, VALUE exporter_configuration);
31
+ static ddprof_ffi_NewProfileExporterV3Result create_exporter(VALUE exporter_configuration, VALUE tags_as_array);
32
+ static VALUE handle_exporter_failure(ddprof_ffi_NewProfileExporterV3Result exporter_result);
33
+ static ddprof_ffi_EndpointV3 endpoint_from(VALUE exporter_configuration);
34
+ static ddprof_ffi_Vec_tag convert_tags(VALUE tags_as_array);
35
+ static void safely_log_failure_to_process_tag(ddprof_ffi_Vec_tag tags, VALUE err_details);
36
+ static VALUE _native_do_export(
37
+ VALUE self,
38
+ VALUE exporter_configuration,
39
+ VALUE upload_timeout_milliseconds,
40
+ VALUE start_timespec_seconds,
41
+ VALUE start_timespec_nanoseconds,
42
+ VALUE finish_timespec_seconds,
43
+ VALUE finish_timespec_nanoseconds,
44
+ VALUE pprof_file_name,
45
+ VALUE pprof_data,
46
+ VALUE code_provenance_file_name,
47
+ VALUE code_provenance_data,
48
+ VALUE tags_as_array
49
+ );
50
+ static void *call_exporter_without_gvl(void *call_args);
51
+ static void interrupt_exporter_call(void *cancel_token);
52
+
53
+ void http_transport_init(VALUE profiling_module) {
54
+ http_transport_class = rb_define_class_under(profiling_module, "HttpTransport", rb_cObject);
55
+
56
+ rb_define_singleton_method(http_transport_class, "_native_validate_exporter", _native_validate_exporter, 1);
57
+ rb_define_singleton_method(http_transport_class, "_native_do_export", _native_do_export, 11);
58
+
59
+ ok_symbol = ID2SYM(rb_intern_const("ok"));
60
+ error_symbol = ID2SYM(rb_intern_const("error"));
61
+ agentless_id = rb_intern_const("agentless");
62
+ agent_id = rb_intern_const("agent");
63
+ log_failure_to_process_tag_id = rb_intern_const("log_failure_to_process_tag");
64
+ }
65
+
66
+ inline static ddprof_ffi_ByteSlice byte_slice_from_ruby_string(VALUE string) {
67
+ ENFORCE_TYPE(string, T_STRING);
68
+ ddprof_ffi_ByteSlice byte_slice = {.ptr = (uint8_t *) StringValuePtr(string), .len = RSTRING_LEN(string)};
69
+ return byte_slice;
70
+ }
71
+
72
+ static VALUE _native_validate_exporter(DDTRACE_UNUSED VALUE _self, VALUE exporter_configuration) {
73
+ ENFORCE_TYPE(exporter_configuration, T_ARRAY);
74
+ ddprof_ffi_NewProfileExporterV3Result exporter_result = create_exporter(exporter_configuration, rb_ary_new());
75
+
76
+ VALUE failure_tuple = handle_exporter_failure(exporter_result);
77
+ if (!NIL_P(failure_tuple)) return failure_tuple;
78
+
79
+ // We don't actually need the exporter for now -- we just wanted to validate that we could create it with the
80
+ // settings we were given
81
+ ddprof_ffi_NewProfileExporterV3Result_drop(exporter_result);
82
+
83
+ return rb_ary_new_from_args(2, ok_symbol, Qnil);
84
+ }
85
+
86
+ static ddprof_ffi_NewProfileExporterV3Result create_exporter(VALUE exporter_configuration, VALUE tags_as_array) {
87
+ ENFORCE_TYPE(exporter_configuration, T_ARRAY);
88
+ ENFORCE_TYPE(tags_as_array, T_ARRAY);
89
+
90
+ // This needs to be called BEFORE convert_tags since it can raise an exception and thus cause the ddprof_ffi_Vec_tag
91
+ // to be leaked.
92
+ ddprof_ffi_EndpointV3 endpoint = endpoint_from(exporter_configuration);
93
+
94
+ ddprof_ffi_Vec_tag tags = convert_tags(tags_as_array);
95
+
96
+ ddprof_ffi_NewProfileExporterV3Result exporter_result =
97
+ ddprof_ffi_ProfileExporterV3_new(DDPROF_FFI_CHARSLICE_C("ruby"), &tags, endpoint);
98
+
99
+ ddprof_ffi_Vec_tag_drop(tags);
100
+
101
+ return exporter_result;
102
+ }
103
+
104
+ static VALUE handle_exporter_failure(ddprof_ffi_NewProfileExporterV3Result exporter_result) {
105
+ if (exporter_result.tag == DDPROF_FFI_NEW_PROFILE_EXPORTER_V3_RESULT_OK) return Qnil;
106
+
107
+ VALUE err_details = ruby_string_from_vec_u8(exporter_result.err);
108
+
109
+ ddprof_ffi_NewProfileExporterV3Result_drop(exporter_result);
110
+
111
+ return rb_ary_new_from_args(2, error_symbol, err_details);
112
+ }
113
+
114
+ static ddprof_ffi_EndpointV3 endpoint_from(VALUE exporter_configuration) {
115
+ ENFORCE_TYPE(exporter_configuration, T_ARRAY);
116
+
117
+ ID working_mode = SYM2ID(rb_ary_entry(exporter_configuration, 0)); // SYM2ID verifies its input so we can do this safely
118
+
119
+ if (working_mode != agentless_id && working_mode != agent_id) {
120
+ rb_raise(rb_eArgError, "Failed to initialize transport: Unexpected working mode, expected :agentless or :agent");
121
+ }
122
+
123
+ if (working_mode == agentless_id) {
124
+ VALUE site = rb_ary_entry(exporter_configuration, 1);
125
+ VALUE api_key = rb_ary_entry(exporter_configuration, 2);
126
+ ENFORCE_TYPE(site, T_STRING);
127
+ ENFORCE_TYPE(api_key, T_STRING);
128
+
129
+ return ddprof_ffi_EndpointV3_agentless(char_slice_from_ruby_string(site), char_slice_from_ruby_string(api_key));
130
+ } else { // agent_id
131
+ VALUE base_url = rb_ary_entry(exporter_configuration, 1);
132
+ ENFORCE_TYPE(base_url, T_STRING);
133
+
134
+ return ddprof_ffi_EndpointV3_agent(char_slice_from_ruby_string(base_url));
135
+ }
136
+ }
137
+
138
+ __attribute__((warn_unused_result))
139
+ static ddprof_ffi_Vec_tag convert_tags(VALUE tags_as_array) {
140
+ ENFORCE_TYPE(tags_as_array, T_ARRAY);
141
+
142
+ long tags_count = RARRAY_LEN(tags_as_array);
143
+ ddprof_ffi_Vec_tag tags = ddprof_ffi_Vec_tag_new();
144
+
145
+ for (long i = 0; i < tags_count; i++) {
146
+ VALUE name_value_pair = rb_ary_entry(tags_as_array, i);
147
+
148
+ if (!RB_TYPE_P(name_value_pair, T_ARRAY)) {
149
+ ddprof_ffi_Vec_tag_drop(tags);
150
+ ENFORCE_TYPE(name_value_pair, T_ARRAY);
151
+ }
152
+
153
+ // Note: We can index the array without checking its size first because rb_ary_entry returns Qnil if out of bounds
154
+ VALUE tag_name = rb_ary_entry(name_value_pair, 0);
155
+ VALUE tag_value = rb_ary_entry(name_value_pair, 1);
156
+
157
+ if (!(RB_TYPE_P(tag_name, T_STRING) && RB_TYPE_P(tag_value, T_STRING))) {
158
+ ddprof_ffi_Vec_tag_drop(tags);
159
+ ENFORCE_TYPE(tag_name, T_STRING);
160
+ ENFORCE_TYPE(tag_value, T_STRING);
161
+ }
162
+
163
+ ddprof_ffi_PushTagResult push_result =
164
+ ddprof_ffi_Vec_tag_push(&tags, char_slice_from_ruby_string(tag_name), char_slice_from_ruby_string(tag_value));
165
+
166
+ if (push_result.tag == DDPROF_FFI_PUSH_TAG_RESULT_ERR) {
167
+ VALUE err_details = ruby_string_from_vec_u8(push_result.err);
168
+ ddprof_ffi_PushTagResult_drop(push_result);
169
+
170
+ // libdatadog validates tags and may catch invalid tags that ddtrace didn't actually catch.
171
+ // We warn users about such tags, and then just ignore them.
172
+ safely_log_failure_to_process_tag(tags, err_details);
173
+ } else {
174
+ ddprof_ffi_PushTagResult_drop(push_result);
175
+ }
176
+ }
177
+
178
+ return tags;
179
+ }
180
+
181
+ static VALUE log_failure_to_process_tag(VALUE err_details) {
182
+ return rb_funcall(http_transport_class, log_failure_to_process_tag_id, 1, err_details);
183
+ }
184
+
185
+ // Since we are calling into Ruby code, it may raise an exception. This method ensure that dynamically-allocated tags
186
+ // get cleaned before propagating the exception.
187
+ static void safely_log_failure_to_process_tag(ddprof_ffi_Vec_tag tags, VALUE err_details) {
188
+ int exception_state;
189
+ rb_protect(log_failure_to_process_tag, err_details, &exception_state);
190
+
191
+ if (exception_state) { // An exception was raised
192
+ ddprof_ffi_Vec_tag_drop(tags); // clean up
193
+ rb_jump_tag(exception_state); // "Re-raise" exception
194
+ }
195
+ }
196
+
197
+ // Note: This function handles a bunch of libdatadog dynamically-allocated objects, so it MUST not use any Ruby APIs
198
+ // which can raise exceptions, otherwise the objects will be leaked.
199
+ static VALUE perform_export(
200
+ ddprof_ffi_NewProfileExporterV3Result valid_exporter_result, // Must be called with a valid exporter result
201
+ ddprof_ffi_Timespec start,
202
+ ddprof_ffi_Timespec finish,
203
+ ddprof_ffi_Slice_file slice_files,
204
+ ddprof_ffi_Vec_tag *additional_tags,
205
+ uint64_t timeout_milliseconds
206
+ ) {
207
+ ddprof_ffi_ProfileExporterV3 *exporter = valid_exporter_result.ok;
208
+ ddprof_ffi_CancellationToken *cancel_token = ddprof_ffi_CancellationToken_new();
209
+ ddprof_ffi_Request *request =
210
+ ddprof_ffi_ProfileExporterV3_build(exporter, start, finish, slice_files, additional_tags, timeout_milliseconds);
211
+
212
+ // We'll release the Global VM Lock while we're calling send, so that the Ruby VM can continue to work while this
213
+ // is pending
214
+ struct call_exporter_without_gvl_arguments args =
215
+ {.exporter = exporter, .request = request, .cancel_token = cancel_token, .send_ran = false};
216
+
217
+ // We use rb_thread_call_without_gvl2 instead of rb_thread_call_without_gvl as the gvl2 variant never raises any
218
+ // exceptions.
219
+ //
220
+ // (With rb_thread_call_without_gvl, if someone calls Thread#kill or something like it on the current thread,
221
+ // the exception will be raised without us being able to clean up dynamically-allocated stuff, which would leak.)
222
+ //
223
+ // Instead, we take care of our own exception checking, and delay the exception raising (`rb_jump_tag` call) until
224
+ // after we cleaned up any dynamically-allocated resources.
225
+ //
226
+ // We run rb_thread_call_without_gvl2 in a loop since an "interrupt" may cause it to return before even running
227
+ // our code. In such a case, we retry the call -- unless the interrupt was caused by an exception being pending,
228
+ // and in that case we also give up and break out of the loop.
229
+ int pending_exception = 0;
230
+
231
+ while (!args.send_ran && !pending_exception) {
232
+ rb_thread_call_without_gvl2(call_exporter_without_gvl, &args, interrupt_exporter_call, cancel_token);
233
+
234
+ // To make sure we don't leak memory, we never check for pending exceptions if send ran
235
+ if (!args.send_ran) pending_exception = check_if_pending_exception();
236
+ }
237
+
238
+ // Cleanup exporter and token, no longer needed
239
+ ddprof_ffi_CancellationToken_drop(cancel_token);
240
+ ddprof_ffi_NewProfileExporterV3Result_drop(valid_exporter_result);
241
+
242
+ if (pending_exception) {
243
+ // If we got here send did not run, so we need to explicitly dispose of the request
244
+ ddprof_ffi_Request_drop(request);
245
+
246
+ // Let Ruby propagate the exception. This will not return.
247
+ rb_jump_tag(pending_exception);
248
+ }
249
+
250
+ ddprof_ffi_SendResult result = args.result;
251
+ bool success = result.tag == DDPROF_FFI_SEND_RESULT_HTTP_RESPONSE;
252
+
253
+ VALUE ruby_status = success ? ok_symbol : error_symbol;
254
+ VALUE ruby_result = success ? UINT2NUM(result.http_response.code) : ruby_string_from_vec_u8(result.err);
255
+
256
+ ddprof_ffi_SendResult_drop(args.result);
257
+ // The request itself does not need to be freed as libdatadog takes care of it as part of sending.
258
+
259
+ return rb_ary_new_from_args(2, ruby_status, ruby_result);
260
+ }
261
+
262
+ static VALUE _native_do_export(
263
+ DDTRACE_UNUSED VALUE _self,
264
+ VALUE exporter_configuration,
265
+ VALUE upload_timeout_milliseconds,
266
+ VALUE start_timespec_seconds,
267
+ VALUE start_timespec_nanoseconds,
268
+ VALUE finish_timespec_seconds,
269
+ VALUE finish_timespec_nanoseconds,
270
+ VALUE pprof_file_name,
271
+ VALUE pprof_data,
272
+ VALUE code_provenance_file_name,
273
+ VALUE code_provenance_data,
274
+ VALUE tags_as_array
275
+ ) {
276
+ ENFORCE_TYPE(upload_timeout_milliseconds, T_FIXNUM);
277
+ ENFORCE_TYPE(start_timespec_seconds, T_FIXNUM);
278
+ ENFORCE_TYPE(start_timespec_nanoseconds, T_FIXNUM);
279
+ ENFORCE_TYPE(finish_timespec_seconds, T_FIXNUM);
280
+ ENFORCE_TYPE(finish_timespec_nanoseconds, T_FIXNUM);
281
+ ENFORCE_TYPE(pprof_file_name, T_STRING);
282
+ ENFORCE_TYPE(pprof_data, T_STRING);
283
+ ENFORCE_TYPE(code_provenance_file_name, T_STRING);
284
+
285
+ // Code provenance can be disabled and in that case will be set to nil
286
+ bool have_code_provenance = !NIL_P(code_provenance_data);
287
+ if (have_code_provenance) ENFORCE_TYPE(code_provenance_data, T_STRING);
288
+
289
+ uint64_t timeout_milliseconds = NUM2ULONG(upload_timeout_milliseconds);
290
+
291
+ ddprof_ffi_Timespec start =
292
+ {.seconds = NUM2LONG(start_timespec_seconds), .nanoseconds = NUM2UINT(start_timespec_nanoseconds)};
293
+ ddprof_ffi_Timespec finish =
294
+ {.seconds = NUM2LONG(finish_timespec_seconds), .nanoseconds = NUM2UINT(finish_timespec_nanoseconds)};
295
+
296
+ int files_to_report = 1 + (have_code_provenance ? 1 : 0);
297
+ ddprof_ffi_File files[files_to_report];
298
+ ddprof_ffi_Slice_file slice_files = {.ptr = files, .len = files_to_report};
299
+
300
+ files[0] = (ddprof_ffi_File) {
301
+ .name = char_slice_from_ruby_string(pprof_file_name),
302
+ .file = byte_slice_from_ruby_string(pprof_data)
303
+ };
304
+ if (have_code_provenance) {
305
+ files[1] = (ddprof_ffi_File) {
306
+ .name = char_slice_from_ruby_string(code_provenance_file_name),
307
+ .file = byte_slice_from_ruby_string(code_provenance_data)
308
+ };
309
+ }
310
+
311
+ ddprof_ffi_Vec_tag *null_additional_tags = NULL;
312
+
313
+ ddprof_ffi_NewProfileExporterV3Result exporter_result = create_exporter(exporter_configuration, tags_as_array);
314
+ // Note: Do not add anything that can raise exceptions after this line, as otherwise the exporter memory will leak
315
+
316
+ VALUE failure_tuple = handle_exporter_failure(exporter_result);
317
+ if (!NIL_P(failure_tuple)) return failure_tuple;
318
+
319
+ return perform_export(exporter_result, start, finish, slice_files, null_additional_tags, timeout_milliseconds);
320
+ }
321
+
322
+ static void *call_exporter_without_gvl(void *call_args) {
323
+ struct call_exporter_without_gvl_arguments *args = (struct call_exporter_without_gvl_arguments*) call_args;
324
+
325
+ args->result = ddprof_ffi_ProfileExporterV3_send(args->exporter, args->request, args->cancel_token);
326
+ args->send_ran = true;
327
+
328
+ return NULL; // Unused
329
+ }
330
+
331
+ // Called by Ruby when it wants to interrupt call_exporter_without_gvl above, e.g. when the app wants to exit cleanly
332
+ static void interrupt_exporter_call(void *cancel_token) {
333
+ ddprof_ffi_CancellationToken_cancel((ddprof_ffi_CancellationToken *) cancel_token);
334
+ }
@@ -1,9 +1,10 @@
1
1
  #pragma once
2
2
 
3
3
  #include <ddprof/ffi.h>
4
+ #include "ruby_helpers.h"
4
5
 
5
6
  inline static ddprof_ffi_CharSlice char_slice_from_ruby_string(VALUE string) {
6
- Check_Type(string, T_STRING);
7
+ ENFORCE_TYPE(string, T_STRING);
7
8
  ddprof_ffi_CharSlice char_slice = {.ptr = StringValuePtr(string), .len = RSTRING_LEN(string)};
8
9
  return char_slice;
9
10
  }
@@ -2,16 +2,70 @@
2
2
 
3
3
  # typed: ignore
4
4
 
5
- require 'libddprof'
5
+ require 'libdatadog'
6
+ require 'pathname'
6
7
 
7
8
  module Datadog
8
9
  module Profiling
10
+ # Helpers for extconf.rb
9
11
  module NativeExtensionHelpers
12
+ # Can be set when customers want to skip compiling the native extension entirely
10
13
  ENV_NO_EXTENSION = 'DD_PROFILING_NO_EXTENSION'
14
+ # Can be set to force rubygems to fail gem installation when profiling extension could not be built
15
+ ENV_FAIL_INSTALL_IF_MISSING_EXTENSION = 'DD_PROFILING_FAIL_INSTALL_IF_MISSING_EXTENSION'
11
16
 
12
17
  # Older Rubies don't have the MJIT header, used by the JIT compiler, so we need to use a different approach
13
18
  CAN_USE_MJIT_HEADER = RUBY_VERSION >= '2.6'
14
19
 
20
+ def self.fail_install_if_missing_extension?
21
+ ENV[ENV_FAIL_INSTALL_IF_MISSING_EXTENSION].to_s.strip.downcase == 'true'
22
+ end
23
+
24
+ # Used as an workaround for a limitation with how dynamic linking works in environments where ddtrace and
25
+ # libdatadog are moved after the extension gets compiled.
26
+ #
27
+ # Because the libddpprof native library is installed on a non-standard system path, in order for it to be
28
+ # found by the system dynamic linker (e.g. what takes care of dlopen(), which is used to load the profiling
29
+ # native extension), we need to add a "runpath" -- a list of folders to search for libdatadog.
30
+ #
31
+ # This runpath gets hardcoded at native library linking time. You can look at it using the `readelf` tool in
32
+ # Linux: e.g. `readelf -d ddtrace_profiling_native_extension.2.7.3_x86_64-linux.so`.
33
+ #
34
+ # In ddtrace 1.1.0, we only set as runpath an absolute path to libdatadog. (This gets set automatically by the call
35
+ # to `pkg_config('ddprof_ffi_with_rpath')` in `extconf.rb`). This worked fine as long as libdatadog was **NOT**
36
+ # moved from the folder it was present at ddtrace installation/linking time.
37
+ #
38
+ # Unfortunately, environments such as Heroku and AWS Elastic Beanstalk move gems around in the filesystem after
39
+ # installation. Thus, the profiling native extension could not be loaded in these environments
40
+ # (see https://github.com/DataDog/dd-trace-rb/issues/2067) because libdatadog could not be found.
41
+ #
42
+ # To workaround this issue, this method computes the **relative** path between the folder where the profiling
43
+ # native extension is going to be installed and the folder where libdatadog is installed, and returns it
44
+ # to be set as an additional runpath. (Yes, you can set multiple runpath folders to be searched).
45
+ #
46
+ # This way, if both gems are moved together (and it turns out that they are in these environments),
47
+ # the relative path can still be traversed to find libdatadog.
48
+ #
49
+ # This is incredibly awful, and it's kinda bizarre how it's not possible to just find these paths at runtime
50
+ # and set them correctly; rather than needing to set stuff at linking-time and then praying to $deity that
51
+ # weird moves don't happen.
52
+ #
53
+ # As a curiosity, `LD_LIBRARY_PATH` can be used to influence the folders that get searched but **CANNOT BE
54
+ # SET DYNAMICALLY**, e.g. it needs to be set at the start of the process (Ruby VM) and thus it's not something
55
+ # we could setup when doing a `require`.
56
+ #
57
+ def self.libdatadog_folder_relative_to_native_lib_folder(
58
+ current_folder: __dir__,
59
+ libdatadog_pkgconfig_folder: Libdatadog.pkgconfig_folder
60
+ )
61
+ return unless libdatadog_pkgconfig_folder
62
+
63
+ profiling_native_lib_folder = "#{current_folder}/../../lib/"
64
+ libdatadog_lib_folder = "#{libdatadog_pkgconfig_folder}/../"
65
+
66
+ Pathname.new(libdatadog_lib_folder).relative_path_from(Pathname.new(profiling_native_lib_folder)).to_s
67
+ end
68
+
15
69
  # Used to check if profiler is supported, including user-visible clear messages explaining why their
16
70
  # system may not be supported.
17
71
  # rubocop:disable Metrics/ModuleLength
@@ -32,20 +86,36 @@ module Datadog
32
86
  on_macos? ||
33
87
  on_unknown_os? ||
34
88
  not_on_amd64_or_arm64? ||
89
+ on_ruby_2_1? ||
35
90
  expected_to_use_mjit_but_mjit_is_disabled? ||
36
- libddprof_not_usable?
91
+ libdatadog_not_usable?
37
92
  end
38
93
 
39
94
  # This banner will show up in the logs/terminal while compiling the native extension
40
- def self.failure_banner_for(reason:, suggested:)
41
- prettify_lines = proc { |lines| lines.map { |line| "| #{line.ljust(76)} |" }.join("\n") }
95
+ def self.failure_banner_for(reason:, suggested:, fail_install:)
96
+ prettify_lines = proc { |lines| Array(lines).map { |line| "| #{line.ljust(76)} |" }.join("\n") }
97
+ outcome =
98
+ if fail_install
99
+ [
100
+ 'Failing installation immediately because the ',
101
+ "`#{ENV_FAIL_INSTALL_IF_MISSING_EXTENSION}` environment variable is set",
102
+ 'to `true`.',
103
+ 'When contacting support, please include the <mkmf.log> file that is shown ',
104
+ 'below.',
105
+ ]
106
+ else
107
+ [
108
+ 'The Datadog Continuous Profiler will not be available,',
109
+ 'but all other ddtrace features will work fine!',
110
+ ]
111
+ end
112
+
42
113
  %(
43
114
  +------------------------------------------------------------------------------+
44
115
  | Could not compile the Datadog Continuous Profiler because |
45
116
  #{prettify_lines.call(reason)}
46
117
  | |
47
- | The Datadog Continuous Profiler will not be available, |
48
- | but all other ddtrace features will work fine! |
118
+ #{prettify_lines.call(outcome)}
49
119
  | |
50
120
  #{prettify_lines.call(suggested)}
51
121
  +------------------------------------------------------------------------------+
@@ -57,9 +127,19 @@ module Datadog
57
127
  [*reason, *suggested].join(' ')
58
128
  end
59
129
 
130
+ # mkmf sets $PKGCONFIG after the `pkg_config` gets used in extconf.rb. When `pkg_config` is unsuccessful, we use
131
+ # this helper to decide if we can show more specific error message vs a generic "something went wrong".
132
+ def self.pkg_config_missing?(command: $PKGCONFIG) # rubocop:disable Style/GlobalVars
133
+ pkg_config_available = command && xsystem("#{command} --version")
134
+
135
+ pkg_config_available != true
136
+ end
137
+
60
138
  CONTACT_SUPPORT = [
61
139
  'For help solving this issue, please contact Datadog support at',
62
140
  '<https://docs.datadoghq.com/help/>.',
141
+ 'You can also check out the Continuous Profiler troubleshooting page at',
142
+ '<https://dtdg.co/ruby-profiler-troubleshooting>.'
63
143
  ].freeze
64
144
 
65
145
  REPORT_ISSUE = [
@@ -71,9 +151,13 @@ module Datadog
71
151
  "Get in touch with us if you're interested in profiling your app!"
72
152
  ].freeze
73
153
 
154
+ UPGRADE_RUBY = [
155
+ 'Upgrade to a modern Ruby to enable profiling for your app.'
156
+ ].freeze
157
+
74
158
  # Validation for this check is done in extconf.rb because it relies on mkmf
75
- FAILED_TO_CONFIGURE_LIBDDPROF = explain_issue(
76
- 'there was a problem in setting up the `libddprof` dependency.',
159
+ FAILED_TO_CONFIGURE_LIBDATADOG = explain_issue(
160
+ 'there was a problem in setting up the `libdatadog` dependency.',
77
161
  suggested: CONTACT_SUPPORT,
78
162
  )
79
163
 
@@ -84,6 +168,17 @@ module Datadog
84
168
  suggested: CONTACT_SUPPORT,
85
169
  )
86
170
 
171
+ # Validation for this check is done in extconf.rb because it relies on mkmf
172
+ PKG_CONFIG_IS_MISSING = explain_issue(
173
+ #+-----------------------------------------------------------------------------+
174
+ 'the `pkg-config` system tool is missing.',
175
+ 'This issue can usually be fixed by installing:',
176
+ '1. the `pkg-config` package on Homebrew and Debian/Ubuntu-based Linux;',
177
+ '2. the `pkgconf` package on Arch and Alpine-based Linux;',
178
+ '3. the `pkgconf-pkg-config` package on Fedora/Red Hat-based Linux.',
179
+ suggested: CONTACT_SUPPORT,
180
+ )
181
+
87
182
  private_class_method def self.disabled_via_env?
88
183
  disabled_via_env = explain_issue(
89
184
  'the `DD_PROFILING_NO_EXTENSION` environment variable is/was set to',
@@ -154,6 +249,15 @@ module Datadog
154
249
  architecture_not_supported unless RUBY_PLATFORM.start_with?('x86_64', 'aarch64')
155
250
  end
156
251
 
252
+ private_class_method def self.on_ruby_2_1?
253
+ ruby_version_not_supported = explain_issue(
254
+ 'the profiler only supports Ruby 2.2 or newer.',
255
+ suggested: UPGRADE_RUBY,
256
+ )
257
+
258
+ ruby_version_not_supported if RUBY_VERSION.start_with?('2.1.')
259
+ end
260
+
157
261
  # On some Rubies, we require the mjit header to be present. If Ruby was installed without MJIT support, we also skip
158
262
  # building the extension.
159
263
  private_class_method def self.expected_to_use_mjit_but_mjit_is_disabled?
@@ -167,17 +271,17 @@ module Datadog
167
271
  ruby_without_mjit if CAN_USE_MJIT_HEADER && RbConfig::CONFIG['MJIT_SUPPORT'] != 'yes'
168
272
  end
169
273
 
170
- private_class_method def self.libddprof_not_usable?
274
+ private_class_method def self.libdatadog_not_usable?
171
275
  no_binaries_for_current_platform = explain_issue(
172
- 'the `libddprof` gem installed on your system is missing binaries for your',
276
+ 'the `libdatadog` gem installed on your system is missing binaries for your',
173
277
  'platform variant.',
174
278
  "(Your platform: `#{Gem::Platform.local}`)",
175
279
  '(Available binaries: ',
176
- "`#{Libddprof.available_binaries.join('`, `')}`)",
280
+ "`#{Libdatadog.available_binaries.join('`, `')}`)",
177
281
  suggested: CONTACT_SUPPORT,
178
282
  )
179
283
 
180
- no_binaries_for_current_platform unless Libddprof.pkgconfig_folder
284
+ no_binaries_for_current_platform unless Libdatadog.pkgconfig_folder
181
285
  end
182
286
  end
183
287
  # rubocop:enable Metrics/ModuleLength