ddtrace 1.2.0 → 1.3.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 (484) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +47 -1
  3. data/LICENSE-3rdparty.csv +2 -0
  4. data/ext/ddtrace_profiling_loader/ddtrace_profiling_loader.c +1 -1
  5. data/ext/ddtrace_profiling_native_extension/NativeExtensionDesign.md +9 -2
  6. data/ext/ddtrace_profiling_native_extension/clock_id.h +20 -0
  7. data/ext/ddtrace_profiling_native_extension/clock_id_from_pthread.c +30 -1
  8. data/ext/ddtrace_profiling_native_extension/clock_id_noop.c +10 -1
  9. data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time.c +148 -28
  10. data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time.h +6 -0
  11. data/ext/ddtrace_profiling_native_extension/collectors_stack.c +11 -7
  12. data/ext/ddtrace_profiling_native_extension/extconf.rb +24 -19
  13. data/ext/ddtrace_profiling_native_extension/helpers.h +12 -0
  14. data/ext/ddtrace_profiling_native_extension/http_transport.c +40 -47
  15. data/ext/ddtrace_profiling_native_extension/{libddprof_helpers.h → libdatadog_helpers.h} +2 -1
  16. data/ext/ddtrace_profiling_native_extension/native_extension_helpers.rb +36 -20
  17. data/ext/ddtrace_profiling_native_extension/private_vm_api_access.c +30 -29
  18. data/ext/ddtrace_profiling_native_extension/private_vm_api_access.h +2 -5
  19. data/ext/ddtrace_profiling_native_extension/profiling.c +2 -3
  20. data/ext/ddtrace_profiling_native_extension/ruby_helpers.c +25 -0
  21. data/ext/ddtrace_profiling_native_extension/ruby_helpers.h +33 -1
  22. data/ext/ddtrace_profiling_native_extension/stack_recorder.c +292 -18
  23. data/ext/ddtrace_profiling_native_extension/stack_recorder.h +1 -1
  24. data/lib/datadog/appsec/autoload.rb +4 -2
  25. data/lib/datadog/appsec/configuration.rb +1 -1
  26. data/lib/datadog/appsec/contrib/auto_instrument.rb +0 -2
  27. data/lib/datadog/appsec/contrib/configuration/settings.rb +1 -1
  28. data/lib/datadog/appsec/contrib/rack/configuration/settings.rb +2 -2
  29. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +6 -6
  30. data/lib/datadog/appsec/contrib/rack/integration.rb +5 -5
  31. data/lib/datadog/appsec/contrib/rack/patcher.rb +2 -2
  32. data/lib/datadog/appsec/contrib/rack/reactive/request.rb +1 -1
  33. data/lib/datadog/appsec/contrib/rack/reactive/request_body.rb +1 -1
  34. data/lib/datadog/appsec/contrib/rack/reactive/response.rb +1 -1
  35. data/lib/datadog/appsec/contrib/rack/request_body_middleware.rb +2 -2
  36. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +3 -3
  37. data/lib/datadog/appsec/contrib/rails/configuration/settings.rb +2 -2
  38. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +4 -4
  39. data/lib/datadog/appsec/contrib/rails/integration.rb +4 -4
  40. data/lib/datadog/appsec/contrib/rails/patcher.rb +16 -12
  41. data/lib/datadog/appsec/contrib/rails/reactive/action.rb +1 -1
  42. data/lib/datadog/appsec/contrib/sinatra/configuration/settings.rb +2 -2
  43. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +5 -5
  44. data/lib/datadog/appsec/contrib/sinatra/integration.rb +4 -4
  45. data/lib/datadog/appsec/contrib/sinatra/patcher.rb +16 -12
  46. data/lib/datadog/appsec/event.rb +3 -3
  47. data/lib/datadog/appsec/extensions.rb +1 -1
  48. data/lib/datadog/appsec/processor.rb +1 -1
  49. data/lib/datadog/appsec/reactive/engine.rb +2 -2
  50. data/lib/datadog/appsec/reactive/operation.rb +3 -3
  51. data/lib/datadog/appsec.rb +5 -5
  52. data/lib/datadog/ci/configuration/components.rb +1 -1
  53. data/lib/datadog/ci/configuration/settings.rb +1 -1
  54. data/lib/datadog/ci/contrib/cucumber/configuration/settings.rb +2 -2
  55. data/lib/datadog/ci/contrib/cucumber/formatter.rb +5 -5
  56. data/lib/datadog/ci/contrib/cucumber/instrumentation.rb +1 -1
  57. data/lib/datadog/ci/contrib/cucumber/integration.rb +3 -3
  58. data/lib/datadog/ci/contrib/cucumber/patcher.rb +2 -2
  59. data/lib/datadog/ci/contrib/rspec/configuration/settings.rb +2 -2
  60. data/lib/datadog/ci/contrib/rspec/example.rb +5 -5
  61. data/lib/datadog/ci/contrib/rspec/integration.rb +3 -3
  62. data/lib/datadog/ci/contrib/rspec/patcher.rb +2 -2
  63. data/lib/datadog/ci/ext/environment.rb +8 -6
  64. data/lib/datadog/ci/extensions.rb +4 -4
  65. data/lib/datadog/ci/flush.rb +2 -2
  66. data/lib/datadog/ci/test.rb +3 -3
  67. data/lib/datadog/ci.rb +6 -6
  68. data/lib/datadog/core/buffer/cruby.rb +1 -1
  69. data/lib/datadog/core/buffer/thread_safe.rb +1 -1
  70. data/lib/datadog/core/configuration/agent_settings_resolver.rb +6 -6
  71. data/lib/datadog/core/configuration/base.rb +2 -2
  72. data/lib/datadog/core/configuration/components.rb +26 -43
  73. data/lib/datadog/core/configuration/option_definition.rb +1 -1
  74. data/lib/datadog/core/configuration/option_definition_set.rb +1 -1
  75. data/lib/datadog/core/configuration/options.rb +3 -3
  76. data/lib/datadog/core/configuration/settings.rb +9 -7
  77. data/lib/datadog/core/configuration.rb +4 -4
  78. data/lib/datadog/core/diagnostics/environment_logger.rb +1 -1
  79. data/lib/datadog/core/diagnostics/health.rb +2 -2
  80. data/lib/datadog/core/environment/cgroup.rb +1 -1
  81. data/lib/datadog/core/environment/container.rb +1 -1
  82. data/lib/datadog/core/environment/ext.rb +1 -1
  83. data/lib/datadog/core/environment/identity.rb +2 -2
  84. data/lib/datadog/core/environment/platform.rb +1 -1
  85. data/lib/datadog/core/environment/socket.rb +1 -1
  86. data/lib/datadog/core/error.rb +1 -1
  87. data/lib/datadog/core/extensions.rb +1 -1
  88. data/lib/datadog/core/metrics/client.rb +8 -8
  89. data/lib/datadog/core/metrics/options.rb +3 -3
  90. data/lib/datadog/core/runtime/metrics.rb +6 -6
  91. data/lib/datadog/core/utils/object_set.rb +1 -1
  92. data/lib/datadog/core/utils/string_table.rb +1 -1
  93. data/lib/datadog/core/utils/time.rb +3 -3
  94. data/lib/datadog/core/utils.rb +2 -2
  95. data/lib/datadog/core/vendor/multipart-post/multipart/post/multipartable.rb +2 -2
  96. data/lib/datadog/core/vendor/multipart-post/net/http/post/multipart.rb +3 -3
  97. data/lib/datadog/core/workers/async.rb +1 -1
  98. data/lib/datadog/core/workers/polling.rb +2 -2
  99. data/lib/datadog/core/workers/runtime_metrics.rb +4 -4
  100. data/lib/datadog/core.rb +50 -50
  101. data/lib/datadog/kit.rb +1 -1
  102. data/lib/datadog/opentracer/distributed_headers.rb +2 -2
  103. data/lib/datadog/opentracer/rack_propagator.rb +11 -7
  104. data/lib/datadog/opentracer/span.rb +1 -1
  105. data/lib/datadog/opentracer/text_map_propagator.rb +9 -6
  106. data/lib/datadog/opentracer/thread_local_scope_manager.rb +1 -1
  107. data/lib/datadog/opentracer/tracer.rb +19 -15
  108. data/lib/datadog/opentracer.rb +16 -16
  109. data/lib/datadog/profiling/buffer.rb +3 -3
  110. data/lib/datadog/profiling/collectors/cpu_and_wall_time.rb +4 -19
  111. data/lib/datadog/profiling/collectors/old_stack.rb +7 -7
  112. data/lib/datadog/profiling/collectors/stack.rb +3 -8
  113. data/lib/datadog/profiling/encoding/profile.rb +1 -1
  114. data/lib/datadog/profiling/events/stack.rb +1 -1
  115. data/lib/datadog/profiling/exporter.rb +17 -9
  116. data/lib/datadog/profiling/ext/forking.rb +36 -37
  117. data/lib/datadog/profiling/ext.rb +1 -0
  118. data/lib/datadog/profiling/flush.rb +0 -3
  119. data/lib/datadog/profiling/http_transport.rb +4 -3
  120. data/lib/datadog/profiling/old_recorder.rb +2 -7
  121. data/lib/datadog/profiling/pprof/builder.rb +4 -4
  122. data/lib/datadog/profiling/pprof/converter.rb +1 -1
  123. data/lib/datadog/profiling/pprof/message_set.rb +1 -1
  124. data/lib/datadog/profiling/pprof/stack_sample.rb +4 -4
  125. data/lib/datadog/profiling/pprof/string_table.rb +1 -1
  126. data/lib/datadog/profiling/pprof/template.rb +5 -5
  127. data/lib/datadog/profiling/preload.rb +1 -1
  128. data/lib/datadog/profiling/scheduler.rb +5 -4
  129. data/lib/datadog/profiling/stack_recorder.rb +14 -4
  130. data/lib/datadog/profiling/tag_builder.rb +6 -1
  131. data/lib/datadog/profiling/tasks/setup.rb +2 -2
  132. data/lib/datadog/profiling/trace_identifiers/ddtrace.rb +2 -2
  133. data/lib/datadog/profiling/trace_identifiers/helper.rb +1 -1
  134. data/lib/datadog/profiling/transport/http/api/endpoint.rb +5 -5
  135. data/lib/datadog/profiling/transport/http/api/instance.rb +2 -2
  136. data/lib/datadog/profiling/transport/http/api/spec.rb +1 -1
  137. data/lib/datadog/profiling/transport/http/api.rb +5 -5
  138. data/lib/datadog/profiling/transport/http/builder.rb +3 -3
  139. data/lib/datadog/profiling/transport/http/client.rb +2 -2
  140. data/lib/datadog/profiling/transport/http/response.rb +1 -1
  141. data/lib/datadog/profiling/transport/http.rb +21 -15
  142. data/lib/datadog/profiling.rb +20 -20
  143. data/lib/datadog/tracing/analytics.rb +1 -1
  144. data/lib/datadog/tracing/buffer.rb +5 -5
  145. data/lib/datadog/tracing/context.rb +1 -1
  146. data/lib/datadog/tracing/context_provider.rb +2 -2
  147. data/lib/datadog/tracing/contrib/action_cable/configuration/settings.rb +2 -2
  148. data/lib/datadog/tracing/contrib/action_cable/event.rb +4 -5
  149. data/lib/datadog/tracing/contrib/action_cable/events/broadcast.rb +4 -4
  150. data/lib/datadog/tracing/contrib/action_cable/events/perform_action.rb +3 -3
  151. data/lib/datadog/tracing/contrib/action_cable/events/transmit.rb +4 -4
  152. data/lib/datadog/tracing/contrib/action_cable/events.rb +4 -4
  153. data/lib/datadog/tracing/contrib/action_cable/instrumentation.rb +3 -4
  154. data/lib/datadog/tracing/contrib/action_cable/integration.rb +4 -4
  155. data/lib/datadog/tracing/contrib/action_cable/patcher.rb +4 -4
  156. data/lib/datadog/tracing/contrib/action_mailer/configuration/settings.rb +2 -2
  157. data/lib/datadog/tracing/contrib/action_mailer/event.rb +3 -3
  158. data/lib/datadog/tracing/contrib/action_mailer/events/deliver.rb +3 -3
  159. data/lib/datadog/tracing/contrib/action_mailer/events/process.rb +3 -3
  160. data/lib/datadog/tracing/contrib/action_mailer/events.rb +2 -2
  161. data/lib/datadog/tracing/contrib/action_mailer/integration.rb +4 -4
  162. data/lib/datadog/tracing/contrib/action_mailer/patcher.rb +3 -3
  163. data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +6 -6
  164. data/lib/datadog/tracing/contrib/action_pack/action_controller/patcher.rb +2 -2
  165. data/lib/datadog/tracing/contrib/action_pack/configuration/settings.rb +2 -2
  166. data/lib/datadog/tracing/contrib/action_pack/integration.rb +4 -4
  167. data/lib/datadog/tracing/contrib/action_pack/patcher.rb +2 -2
  168. data/lib/datadog/tracing/contrib/action_pack/utils.rb +1 -1
  169. data/lib/datadog/tracing/contrib/action_view/configuration/settings.rb +2 -2
  170. data/lib/datadog/tracing/contrib/action_view/event.rb +1 -1
  171. data/lib/datadog/tracing/contrib/action_view/events/render_partial.rb +5 -5
  172. data/lib/datadog/tracing/contrib/action_view/events/render_template.rb +5 -5
  173. data/lib/datadog/tracing/contrib/action_view/events.rb +2 -2
  174. data/lib/datadog/tracing/contrib/action_view/instrumentation/partial_renderer.rb +2 -2
  175. data/lib/datadog/tracing/contrib/action_view/instrumentation/template_renderer.rb +2 -2
  176. data/lib/datadog/tracing/contrib/action_view/integration.rb +4 -4
  177. data/lib/datadog/tracing/contrib/action_view/patcher.rb +7 -7
  178. data/lib/datadog/tracing/contrib/action_view/utils.rb +1 -1
  179. data/lib/datadog/tracing/contrib/active_job/configuration/settings.rb +3 -3
  180. data/lib/datadog/tracing/contrib/active_job/event.rb +3 -3
  181. data/lib/datadog/tracing/contrib/active_job/events/discard.rb +4 -4
  182. data/lib/datadog/tracing/contrib/active_job/events/enqueue.rb +4 -4
  183. data/lib/datadog/tracing/contrib/active_job/events/enqueue_at.rb +4 -4
  184. data/lib/datadog/tracing/contrib/active_job/events/enqueue_retry.rb +4 -4
  185. data/lib/datadog/tracing/contrib/active_job/events/perform.rb +4 -4
  186. data/lib/datadog/tracing/contrib/active_job/events/retry_stopped.rb +4 -4
  187. data/lib/datadog/tracing/contrib/active_job/events.rb +6 -6
  188. data/lib/datadog/tracing/contrib/active_job/integration.rb +4 -4
  189. data/lib/datadog/tracing/contrib/active_job/log_injection.rb +0 -2
  190. data/lib/datadog/tracing/contrib/active_job/patcher.rb +4 -4
  191. data/lib/datadog/tracing/contrib/active_model_serializers/configuration/settings.rb +2 -2
  192. data/lib/datadog/tracing/contrib/active_model_serializers/event.rb +4 -5
  193. data/lib/datadog/tracing/contrib/active_model_serializers/events/render.rb +3 -3
  194. data/lib/datadog/tracing/contrib/active_model_serializers/events/serialize.rb +2 -2
  195. data/lib/datadog/tracing/contrib/active_model_serializers/events.rb +2 -2
  196. data/lib/datadog/tracing/contrib/active_model_serializers/integration.rb +3 -3
  197. data/lib/datadog/tracing/contrib/active_model_serializers/patcher.rb +3 -4
  198. data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +2 -2
  199. data/lib/datadog/tracing/contrib/active_record/configuration/settings.rb +3 -3
  200. data/lib/datadog/tracing/contrib/active_record/event.rb +1 -1
  201. data/lib/datadog/tracing/contrib/active_record/events/instantiation.rb +4 -4
  202. data/lib/datadog/tracing/contrib/active_record/events/sql.rb +6 -6
  203. data/lib/datadog/tracing/contrib/active_record/events.rb +2 -2
  204. data/lib/datadog/tracing/contrib/active_record/integration.rb +6 -6
  205. data/lib/datadog/tracing/contrib/active_record/patcher.rb +2 -2
  206. data/lib/datadog/tracing/contrib/active_record/utils.rb +2 -2
  207. data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +19 -9
  208. data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +2 -2
  209. data/lib/datadog/tracing/contrib/active_support/cache/redis.rb +1 -1
  210. data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +2 -2
  211. data/lib/datadog/tracing/contrib/active_support/integration.rb +5 -5
  212. data/lib/datadog/tracing/contrib/active_support/notifications/event.rb +1 -1
  213. data/lib/datadog/tracing/contrib/active_support/notifications/subscriber.rb +1 -1
  214. data/lib/datadog/tracing/contrib/active_support/patcher.rb +2 -2
  215. data/lib/datadog/tracing/contrib/analytics.rb +1 -1
  216. data/lib/datadog/tracing/contrib/auto_instrument.rb +4 -4
  217. data/lib/datadog/tracing/contrib/aws/configuration/settings.rb +2 -2
  218. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +3 -4
  219. data/lib/datadog/tracing/contrib/aws/integration.rb +3 -3
  220. data/lib/datadog/tracing/contrib/aws/patcher.rb +5 -5
  221. data/lib/datadog/tracing/contrib/concurrent_ruby/configuration/settings.rb +2 -2
  222. data/lib/datadog/tracing/contrib/concurrent_ruby/future_patch.rb +1 -1
  223. data/lib/datadog/tracing/contrib/concurrent_ruby/integration.rb +3 -3
  224. data/lib/datadog/tracing/contrib/concurrent_ruby/patcher.rb +2 -2
  225. data/lib/datadog/tracing/contrib/configurable.rb +2 -2
  226. data/lib/datadog/tracing/contrib/configuration/resolvers/pattern_resolver.rb +1 -1
  227. data/lib/datadog/tracing/contrib/configuration/settings.rb +2 -2
  228. data/lib/datadog/tracing/contrib/dalli/configuration/settings.rb +2 -2
  229. data/lib/datadog/tracing/contrib/dalli/instrumentation.rb +4 -5
  230. data/lib/datadog/tracing/contrib/dalli/integration.rb +3 -3
  231. data/lib/datadog/tracing/contrib/dalli/patcher.rb +3 -3
  232. data/lib/datadog/tracing/contrib/dalli/quantize.rb +1 -1
  233. data/lib/datadog/tracing/contrib/delayed_job/configuration/settings.rb +3 -3
  234. data/lib/datadog/tracing/contrib/delayed_job/ext.rb +2 -0
  235. data/lib/datadog/tracing/contrib/delayed_job/integration.rb +3 -3
  236. data/lib/datadog/tracing/contrib/delayed_job/patcher.rb +8 -2
  237. data/lib/datadog/tracing/contrib/delayed_job/plugin.rb +3 -4
  238. data/lib/datadog/tracing/contrib/delayed_job/server_internal_tracer/worker.rb +32 -0
  239. data/lib/datadog/tracing/contrib/elasticsearch/configuration/settings.rb +2 -2
  240. data/lib/datadog/tracing/contrib/elasticsearch/integration.rb +3 -3
  241. data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +6 -7
  242. data/lib/datadog/tracing/contrib/elasticsearch/quantize.rb +1 -1
  243. data/lib/datadog/tracing/contrib/ethon/configuration/settings.rb +2 -2
  244. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +4 -5
  245. data/lib/datadog/tracing/contrib/ethon/integration.rb +4 -4
  246. data/lib/datadog/tracing/contrib/ethon/multi_patch.rb +3 -4
  247. data/lib/datadog/tracing/contrib/ethon/patcher.rb +3 -3
  248. data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +2 -2
  249. data/lib/datadog/tracing/contrib/excon/integration.rb +4 -4
  250. data/lib/datadog/tracing/contrib/excon/middleware.rb +6 -7
  251. data/lib/datadog/tracing/contrib/excon/patcher.rb +2 -2
  252. data/lib/datadog/tracing/contrib/extensions.rb +3 -3
  253. data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +2 -2
  254. data/lib/datadog/tracing/contrib/faraday/integration.rb +4 -4
  255. data/lib/datadog/tracing/contrib/faraday/middleware.rb +5 -6
  256. data/lib/datadog/tracing/contrib/faraday/patcher.rb +5 -5
  257. data/lib/datadog/tracing/contrib/grape/configuration/settings.rb +3 -3
  258. data/lib/datadog/tracing/contrib/grape/endpoint.rb +4 -5
  259. data/lib/datadog/tracing/contrib/grape/integration.rb +3 -3
  260. data/lib/datadog/tracing/contrib/grape/patcher.rb +4 -4
  261. data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +2 -2
  262. data/lib/datadog/tracing/contrib/graphql/integration.rb +3 -3
  263. data/lib/datadog/tracing/contrib/graphql/patcher.rb +2 -3
  264. data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +3 -3
  265. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +4 -4
  266. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +6 -6
  267. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor.rb +3 -4
  268. data/lib/datadog/tracing/contrib/grpc/integration.rb +3 -3
  269. data/lib/datadog/tracing/contrib/grpc/patcher.rb +5 -5
  270. data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +1 -2
  271. data/lib/datadog/tracing/contrib/http/configuration/settings.rb +2 -2
  272. data/lib/datadog/tracing/contrib/http/instrumentation.rb +3 -4
  273. data/lib/datadog/tracing/contrib/http/integration.rb +6 -6
  274. data/lib/datadog/tracing/contrib/http/patcher.rb +3 -3
  275. data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +2 -2
  276. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +4 -5
  277. data/lib/datadog/tracing/contrib/httpclient/integration.rb +4 -4
  278. data/lib/datadog/tracing/contrib/httpclient/patcher.rb +3 -3
  279. data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +2 -2
  280. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +4 -5
  281. data/lib/datadog/tracing/contrib/httprb/integration.rb +4 -4
  282. data/lib/datadog/tracing/contrib/httprb/patcher.rb +3 -3
  283. data/lib/datadog/tracing/contrib/integration.rb +3 -3
  284. data/lib/datadog/tracing/contrib/kafka/configuration/settings.rb +2 -2
  285. data/lib/datadog/tracing/contrib/kafka/event.rb +3 -3
  286. data/lib/datadog/tracing/contrib/kafka/events/connection/request.rb +2 -2
  287. data/lib/datadog/tracing/contrib/kafka/events/consumer/process_batch.rb +3 -3
  288. data/lib/datadog/tracing/contrib/kafka/events/consumer/process_message.rb +3 -3
  289. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/heartbeat.rb +4 -4
  290. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/join_group.rb +4 -4
  291. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/leave_group.rb +4 -4
  292. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/sync_group.rb +4 -4
  293. data/lib/datadog/tracing/contrib/kafka/events/produce_operation/send_messages.rb +2 -2
  294. data/lib/datadog/tracing/contrib/kafka/events/producer/deliver_messages.rb +2 -2
  295. data/lib/datadog/tracing/contrib/kafka/events.rb +9 -9
  296. data/lib/datadog/tracing/contrib/kafka/integration.rb +3 -3
  297. data/lib/datadog/tracing/contrib/kafka/patcher.rb +3 -3
  298. data/lib/datadog/tracing/contrib/lograge/configuration/settings.rb +2 -2
  299. data/lib/datadog/tracing/contrib/lograge/instrumentation.rb +1 -2
  300. data/lib/datadog/tracing/contrib/lograge/integration.rb +3 -3
  301. data/lib/datadog/tracing/contrib/lograge/patcher.rb +2 -2
  302. data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +2 -2
  303. data/lib/datadog/tracing/contrib/mongodb/instrumentation.rb +3 -3
  304. data/lib/datadog/tracing/contrib/mongodb/integration.rb +4 -4
  305. data/lib/datadog/tracing/contrib/mongodb/parsers.rb +1 -1
  306. data/lib/datadog/tracing/contrib/mongodb/patcher.rb +3 -3
  307. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +4 -4
  308. data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +2 -2
  309. data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +3 -4
  310. data/lib/datadog/tracing/contrib/mysql2/integration.rb +3 -3
  311. data/lib/datadog/tracing/contrib/mysql2/patcher.rb +2 -2
  312. data/lib/datadog/tracing/contrib/patcher.rb +2 -2
  313. data/lib/datadog/tracing/contrib/pg/configuration/settings.rb +2 -2
  314. data/lib/datadog/tracing/contrib/pg/instrumentation.rb +3 -4
  315. data/lib/datadog/tracing/contrib/pg/integration.rb +3 -3
  316. data/lib/datadog/tracing/contrib/pg/patcher.rb +2 -2
  317. data/lib/datadog/tracing/contrib/presto/configuration/settings.rb +2 -2
  318. data/lib/datadog/tracing/contrib/presto/instrumentation.rb +2 -3
  319. data/lib/datadog/tracing/contrib/presto/integration.rb +3 -3
  320. data/lib/datadog/tracing/contrib/presto/patcher.rb +4 -4
  321. data/lib/datadog/tracing/contrib/qless/configuration/settings.rb +2 -2
  322. data/lib/datadog/tracing/contrib/qless/integration.rb +3 -3
  323. data/lib/datadog/tracing/contrib/qless/patcher.rb +1 -2
  324. data/lib/datadog/tracing/contrib/qless/qless_job.rb +2 -3
  325. data/lib/datadog/tracing/contrib/qless/tracer_cleaner.rb +0 -2
  326. data/lib/datadog/tracing/contrib/que/configuration/settings.rb +3 -3
  327. data/lib/datadog/tracing/contrib/que/integration.rb +4 -4
  328. data/lib/datadog/tracing/contrib/que/patcher.rb +1 -1
  329. data/lib/datadog/tracing/contrib/que/tracer.rb +1 -1
  330. data/lib/datadog/tracing/contrib/racecar/configuration/settings.rb +2 -2
  331. data/lib/datadog/tracing/contrib/racecar/event.rb +4 -5
  332. data/lib/datadog/tracing/contrib/racecar/events/batch.rb +2 -2
  333. data/lib/datadog/tracing/contrib/racecar/events/consume.rb +2 -2
  334. data/lib/datadog/tracing/contrib/racecar/events/message.rb +2 -2
  335. data/lib/datadog/tracing/contrib/racecar/events.rb +3 -3
  336. data/lib/datadog/tracing/contrib/racecar/integration.rb +3 -3
  337. data/lib/datadog/tracing/contrib/racecar/patcher.rb +3 -3
  338. data/lib/datadog/tracing/contrib/rack/configuration/settings.rb +2 -2
  339. data/lib/datadog/tracing/contrib/rack/integration.rb +4 -4
  340. data/lib/datadog/tracing/contrib/rack/middlewares.rb +24 -20
  341. data/lib/datadog/tracing/contrib/rack/patcher.rb +4 -2
  342. data/lib/datadog/tracing/contrib/rails/auto_instrument_railtie.rb +1 -1
  343. data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +1 -1
  344. data/lib/datadog/tracing/contrib/rails/framework.rb +16 -21
  345. data/lib/datadog/tracing/contrib/rails/integration.rb +4 -4
  346. data/lib/datadog/tracing/contrib/rails/log_injection.rb +0 -2
  347. data/lib/datadog/tracing/contrib/rails/middlewares.rb +1 -2
  348. data/lib/datadog/tracing/contrib/rails/patcher.rb +7 -8
  349. data/lib/datadog/tracing/contrib/rails/railtie.rb +3 -3
  350. data/lib/datadog/tracing/contrib/rails/utils.rb +1 -1
  351. data/lib/datadog/tracing/contrib/rake/configuration/settings.rb +17 -2
  352. data/lib/datadog/tracing/contrib/rake/instrumentation.rb +12 -7
  353. data/lib/datadog/tracing/contrib/rake/integration.rb +3 -3
  354. data/lib/datadog/tracing/contrib/rake/patcher.rb +3 -4
  355. data/lib/datadog/tracing/contrib/redis/configuration/resolver.rb +1 -1
  356. data/lib/datadog/tracing/contrib/redis/configuration/settings.rb +2 -2
  357. data/lib/datadog/tracing/contrib/redis/instrumentation.rb +6 -7
  358. data/lib/datadog/tracing/contrib/redis/integration.rb +3 -3
  359. data/lib/datadog/tracing/contrib/redis/patcher.rb +6 -6
  360. data/lib/datadog/tracing/contrib/redis/tags.rb +3 -4
  361. data/lib/datadog/tracing/contrib/resque/configuration/settings.rb +3 -3
  362. data/lib/datadog/tracing/contrib/resque/integration.rb +3 -3
  363. data/lib/datadog/tracing/contrib/resque/patcher.rb +2 -2
  364. data/lib/datadog/tracing/contrib/resque/resque_job.rb +3 -4
  365. data/lib/datadog/tracing/contrib/rest_client/configuration/settings.rb +2 -2
  366. data/lib/datadog/tracing/contrib/rest_client/integration.rb +3 -3
  367. data/lib/datadog/tracing/contrib/rest_client/patcher.rb +2 -2
  368. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +4 -5
  369. data/lib/datadog/tracing/contrib/semantic_logger/configuration/settings.rb +2 -2
  370. data/lib/datadog/tracing/contrib/semantic_logger/instrumentation.rb +1 -2
  371. data/lib/datadog/tracing/contrib/semantic_logger/integration.rb +3 -3
  372. data/lib/datadog/tracing/contrib/semantic_logger/patcher.rb +2 -2
  373. data/lib/datadog/tracing/contrib/sequel/configuration/settings.rb +2 -2
  374. data/lib/datadog/tracing/contrib/sequel/database.rb +4 -5
  375. data/lib/datadog/tracing/contrib/sequel/dataset.rb +4 -5
  376. data/lib/datadog/tracing/contrib/sequel/integration.rb +3 -3
  377. data/lib/datadog/tracing/contrib/sequel/patcher.rb +3 -3
  378. data/lib/datadog/tracing/contrib/sequel/utils.rb +2 -2
  379. data/lib/datadog/tracing/contrib/shoryuken/configuration/settings.rb +3 -3
  380. data/lib/datadog/tracing/contrib/shoryuken/integration.rb +4 -4
  381. data/lib/datadog/tracing/contrib/shoryuken/patcher.rb +1 -1
  382. data/lib/datadog/tracing/contrib/shoryuken/tracer.rb +1 -1
  383. data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +4 -5
  384. data/lib/datadog/tracing/contrib/sidekiq/configuration/settings.rb +3 -3
  385. data/lib/datadog/tracing/contrib/sidekiq/ext.rb +6 -0
  386. data/lib/datadog/tracing/contrib/sidekiq/integration.rb +3 -3
  387. data/lib/datadog/tracing/contrib/sidekiq/patcher.rb +14 -7
  388. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/heartbeat.rb +19 -1
  389. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/{scheduled_push.rb → redis_info.rb} +5 -6
  390. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/scheduled_poller.rb +53 -0
  391. data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +5 -6
  392. data/lib/datadog/tracing/contrib/sidekiq/tracing.rb +2 -2
  393. data/lib/datadog/tracing/contrib/sinatra/configuration/settings.rb +2 -2
  394. data/lib/datadog/tracing/contrib/sinatra/env.rb +2 -2
  395. data/lib/datadog/tracing/contrib/sinatra/framework.rb +0 -2
  396. data/lib/datadog/tracing/contrib/sinatra/headers.rb +1 -1
  397. data/lib/datadog/tracing/contrib/sinatra/integration.rb +3 -3
  398. data/lib/datadog/tracing/contrib/sinatra/patcher.rb +5 -5
  399. data/lib/datadog/tracing/contrib/sinatra/tracer.rb +7 -8
  400. data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +6 -7
  401. data/lib/datadog/tracing/contrib/sneakers/configuration/settings.rb +2 -2
  402. data/lib/datadog/tracing/contrib/sneakers/integration.rb +4 -4
  403. data/lib/datadog/tracing/contrib/sneakers/patcher.rb +2 -2
  404. data/lib/datadog/tracing/contrib/sneakers/tracer.rb +2 -3
  405. data/lib/datadog/tracing/contrib/status_code_matcher.rb +2 -2
  406. data/lib/datadog/tracing/contrib/sucker_punch/configuration/settings.rb +2 -2
  407. data/lib/datadog/tracing/contrib/sucker_punch/instrumentation.rb +3 -4
  408. data/lib/datadog/tracing/contrib/sucker_punch/integration.rb +3 -3
  409. data/lib/datadog/tracing/contrib/sucker_punch/patcher.rb +4 -5
  410. data/lib/datadog/tracing/contrib.rb +48 -48
  411. data/lib/datadog/tracing/correlation.rb +1 -1
  412. data/lib/datadog/tracing/distributed/headers/b3.rb +4 -4
  413. data/lib/datadog/tracing/distributed/headers/b3_single.rb +4 -4
  414. data/lib/datadog/tracing/distributed/headers/datadog.rb +3 -3
  415. data/lib/datadog/tracing/distributed/headers/parser.rb +1 -1
  416. data/lib/datadog/tracing/distributed/helpers.rb +2 -2
  417. data/lib/datadog/tracing/distributed/metadata/b3.rb +4 -4
  418. data/lib/datadog/tracing/distributed/metadata/b3_single.rb +4 -4
  419. data/lib/datadog/tracing/distributed/metadata/datadog.rb +2 -2
  420. data/lib/datadog/tracing/distributed/metadata/parser.rb +1 -1
  421. data/lib/datadog/tracing/event.rb +1 -1
  422. data/lib/datadog/tracing/metadata/analytics.rb +2 -2
  423. data/lib/datadog/tracing/metadata/errors.rb +2 -2
  424. data/lib/datadog/tracing/metadata/tagging.rb +2 -2
  425. data/lib/datadog/tracing/metadata.rb +3 -3
  426. data/lib/datadog/tracing/pipeline/span_filter.rb +10 -6
  427. data/lib/datadog/tracing/pipeline.rb +3 -3
  428. data/lib/datadog/tracing/propagation/grpc.rb +6 -6
  429. data/lib/datadog/tracing/propagation/http.rb +8 -8
  430. data/lib/datadog/tracing/runtime/metrics.rb +1 -1
  431. data/lib/datadog/tracing/sampling/all_sampler.rb +1 -1
  432. data/lib/datadog/tracing/sampling/priority_sampler.rb +5 -5
  433. data/lib/datadog/tracing/sampling/rate_by_key_sampler.rb +2 -2
  434. data/lib/datadog/tracing/sampling/rate_by_service_sampler.rb +3 -3
  435. data/lib/datadog/tracing/sampling/rate_limiter.rb +1 -1
  436. data/lib/datadog/tracing/sampling/rate_sampler.rb +5 -5
  437. data/lib/datadog/tracing/sampling/rule.rb +3 -3
  438. data/lib/datadog/tracing/sampling/rule_sampler.rb +4 -4
  439. data/lib/datadog/tracing/span.rb +4 -4
  440. data/lib/datadog/tracing/span_operation.rb +9 -9
  441. data/lib/datadog/tracing/sync_writer.rb +5 -5
  442. data/lib/datadog/tracing/trace_operation.rb +16 -9
  443. data/lib/datadog/tracing/trace_segment.rb +5 -5
  444. data/lib/datadog/tracing/tracer.rb +15 -15
  445. data/lib/datadog/tracing/workers/trace_writer.rb +9 -9
  446. data/lib/datadog/tracing/workers.rb +3 -3
  447. data/lib/datadog/tracing/writer.rb +5 -5
  448. data/lib/datadog/tracing.rb +8 -8
  449. data/lib/ddtrace/auto_instrument.rb +2 -2
  450. data/lib/ddtrace/transport/ext.rb +7 -0
  451. data/lib/ddtrace/transport/http/adapters/net.rb +2 -2
  452. data/lib/ddtrace/transport/http/adapters/test.rb +1 -1
  453. data/lib/ddtrace/transport/http/adapters/unix_socket.rb +2 -2
  454. data/lib/ddtrace/transport/http/api/map.rb +1 -1
  455. data/lib/ddtrace/transport/http/api.rb +4 -4
  456. data/lib/ddtrace/transport/http/builder.rb +5 -5
  457. data/lib/ddtrace/transport/http/client.rb +2 -2
  458. data/lib/ddtrace/transport/http/response.rb +1 -1
  459. data/lib/ddtrace/transport/http/statistics.rb +1 -1
  460. data/lib/ddtrace/transport/http/traces.rb +5 -5
  461. data/lib/ddtrace/transport/http.rb +12 -9
  462. data/lib/ddtrace/transport/io/client.rb +2 -2
  463. data/lib/ddtrace/transport/io/response.rb +1 -1
  464. data/lib/ddtrace/transport/io/traces.rb +3 -3
  465. data/lib/ddtrace/transport/io.rb +3 -3
  466. data/lib/ddtrace/transport/statistics.rb +2 -2
  467. data/lib/ddtrace/transport/trace_formatter.rb +5 -5
  468. data/lib/ddtrace/transport/traces.rb +5 -5
  469. data/lib/ddtrace/version.rb +1 -1
  470. data/lib/ddtrace.rb +6 -6
  471. metadata +14 -22
  472. data/.editorconfig +0 -22
  473. data/.gitignore +0 -58
  474. data/CONTRIBUTING.md +0 -81
  475. data/ddtrace.gemspec +0 -71
  476. data/docs/0.x-trace.png +0 -0
  477. data/docs/1.0-trace.png +0 -0
  478. data/docs/AutoInstrumentation.md +0 -36
  479. data/docs/Deprecation.md +0 -8
  480. data/docs/DevelopmentGuide.md +0 -259
  481. data/docs/GettingStarted.md +0 -2712
  482. data/docs/ProfilingDevelopment.md +0 -109
  483. data/docs/PublicApi.md +0 -14
  484. data/docs/UpgradeGuide.md +0 -736
@@ -42,7 +42,8 @@ unless Datadog::Profiling::NativeExtensionHelpers::Supported.supported?
42
42
  skip_building_extension!(Datadog::Profiling::NativeExtensionHelpers::Supported.unsupported_reason)
43
43
  end
44
44
 
45
- $stderr.puts(%(
45
+ $stderr.puts(
46
+ %(
46
47
  +------------------------------------------------------------------------------+
47
48
  | ** Preparing to build the ddtrace profiling native extension... ** |
48
49
  | |
@@ -59,7 +60,8 @@ $stderr.puts(%(
59
60
  | Thanks for using ddtrace! You rock! |
60
61
  +------------------------------------------------------------------------------+
61
62
 
62
- ))
63
+ )
64
+ )
63
65
 
64
66
  # NOTE: we MUST NOT require 'mkmf' before we check the #skip_building_extension? because the require triggers checks
65
67
  # that may fail on an environment not properly setup for building Ruby extensions.
@@ -91,6 +93,9 @@ add_compiler_flag '-Wno-declaration-after-statement'
91
93
  # cause a segfault later. Let's ensure that never happens.
92
94
  add_compiler_flag '-Werror-implicit-function-declaration'
93
95
 
96
+ # Warn on unused parameters to functions. Use `DDTRACE_UNUSED` to mark things as known-to-not-be-used.
97
+ add_compiler_flag '-Wunused-parameter'
98
+
94
99
  # The native extension is not intended to expose any symbols/functions for other native libraries to use;
95
100
  # the sole exception being `Init_ddtrace_profiling_native_extension` which needs to be visible for Ruby to call it when
96
101
  # it `dlopen`s the library.
@@ -99,13 +104,17 @@ add_compiler_flag '-Werror-implicit-function-declaration'
99
104
  # For more details see https://gcc.gnu.org/wiki/Visibility
100
105
  add_compiler_flag '-fvisibility=hidden'
101
106
 
107
+ # Enable all other compiler warnings
108
+ add_compiler_flag '-Wall'
109
+ add_compiler_flag '-Wextra'
110
+
102
111
  if RUBY_PLATFORM.include?('linux')
103
112
  # Supposedly, the correct way to do this is
104
113
  # ```
105
114
  # have_library 'pthread'
106
115
  # have_func 'pthread_getcpuclockid'
107
116
  # ```
108
- # but it broke the build on Windows and on older Ruby versions (2.1 and 2.2)
117
+ # but it broke the build on Windows and on older Ruby versions (2.2)
109
118
  # so instead we just assume that we have the function we need on Linux, and nowhere else
110
119
  $defs << '-DHAVE_PTHREAD_GETCPUCLOCKID'
111
120
  end
@@ -133,13 +142,12 @@ if RUBY_VERSION < '2.3'
133
142
  $defs << '-DNO_RB_TIME_TIMESPEC_NEW'
134
143
  # ...the VM changed enough that we need an alternative legacy rb_profile_frames
135
144
  $defs << '-DUSE_LEGACY_RB_PROFILE_FRAMES'
145
+ # ... you couldn't name threads
146
+ $defs << '-DNO_THREAD_NAMES'
136
147
  end
137
148
 
138
- # In Ruby 2.1, living_threads were stored in a hashmap (st)
139
- $defs << '-DUSE_LEGACY_LIVING_THREADS_ST' if RUBY_VERSION < '2.2'
140
-
141
- # If we got here, libddprof is available and loaded
142
- ENV['PKG_CONFIG_PATH'] = "#{ENV['PKG_CONFIG_PATH']}:#{Libddprof.pkgconfig_folder}"
149
+ # If we got here, libdatadog is available and loaded
150
+ ENV['PKG_CONFIG_PATH'] = "#{ENV['PKG_CONFIG_PATH']}:#{Libdatadog.pkgconfig_folder}"
143
151
  Logging.message(" [ddtrace] PKG_CONFIG_PATH set to #{ENV['PKG_CONFIG_PATH'].inspect}\n")
144
152
 
145
153
  unless pkg_config('ddprof_ffi_with_rpath')
@@ -148,19 +156,23 @@ unless pkg_config('ddprof_ffi_with_rpath')
148
156
  Datadog::Profiling::NativeExtensionHelpers::Supported::PKG_CONFIG_IS_MISSING
149
157
  else
150
158
  # Less specific error message
151
- Datadog::Profiling::NativeExtensionHelpers::Supported::FAILED_TO_CONFIGURE_LIBDDPROF
159
+ Datadog::Profiling::NativeExtensionHelpers::Supported::FAILED_TO_CONFIGURE_LIBDATADOG
152
160
  end
153
161
  )
154
162
  end
155
163
 
156
- # See comments on the helper method being used for why we need to additionally set this
164
+ # See comments on the helper method being used for why we need to additionally set this.
157
165
  # The extremely excessive escaping around ORIGIN below seems to be correct and was determined after a lot of
158
166
  # experimentation. We need to get these special characters across a lot of tools untouched...
159
167
  $LDFLAGS += \
160
168
  ' -Wl,-rpath,$$$\\\\{ORIGIN\\}/' \
161
- "#{Datadog::Profiling::NativeExtensionHelpers.libddprof_folder_relative_to_native_lib_folder}"
169
+ "#{Datadog::Profiling::NativeExtensionHelpers.libdatadog_folder_relative_to_native_lib_folder}"
162
170
  Logging.message(" [ddtrace] After pkg-config $LDFLAGS were set to: #{$LDFLAGS.inspect}\n")
163
171
 
172
+ Logging.message(" [ddtrace] Using compiler:\n")
173
+ xsystem("#{CONFIG['CC']} --version")
174
+ Logging.message(" [ddtrace] End of compiler information\n")
175
+
164
176
  # Tag the native extension library with the Ruby version and Ruby platform.
165
177
  # This makes it easier for development (avoids "oops I forgot to rebuild when I switched my Ruby") and ensures that
166
178
  # the wrong library is never loaded.
@@ -194,13 +206,6 @@ else
194
206
  # This gem ships source code copies of these VM headers for the different Ruby VM versions;
195
207
  # see https://github.com/ruby-debug/debase-ruby_core_source for details
196
208
 
197
- thread_native_for_ruby_2_1 = proc { true }
198
- if RUBY_VERSION < '2.2'
199
- # This header became public in Ruby 2.2, but we need to pull it from the private headers folder for 2.1
200
- thread_native_for_ruby_2_1 = proc { have_header('thread_native.h') }
201
- $defs << '-DRUBY_2_1_WORKAROUND'
202
- end
203
-
204
209
  create_header
205
210
 
206
211
  require 'debase/ruby_core_source'
@@ -208,7 +213,7 @@ else
208
213
 
209
214
  Debase::RubyCoreSource
210
215
  .create_makefile_with_core(
211
- proc { have_header('vm_core.h') && have_header('iseq.h') && thread_native_for_ruby_2_1.call },
216
+ proc { have_header('vm_core.h') && have_header('iseq.h') },
212
217
  EXTENSION_NAME,
213
218
  )
214
219
  end
@@ -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
@@ -1,7 +1,8 @@
1
1
  #include <ruby.h>
2
2
  #include <ruby/thread.h>
3
3
  #include <ddprof/ffi.h>
4
- #include "libddprof_helpers.h"
4
+ #include "helpers.h"
5
+ #include "libdatadog_helpers.h"
5
6
  #include "ruby_helpers.h"
6
7
 
7
8
  // Used to report profiling data to Datadog.
@@ -63,13 +64,13 @@ void http_transport_init(VALUE profiling_module) {
63
64
  }
64
65
 
65
66
  inline static ddprof_ffi_ByteSlice byte_slice_from_ruby_string(VALUE string) {
66
- Check_Type(string, T_STRING);
67
+ ENFORCE_TYPE(string, T_STRING);
67
68
  ddprof_ffi_ByteSlice byte_slice = {.ptr = (uint8_t *) StringValuePtr(string), .len = RSTRING_LEN(string)};
68
69
  return byte_slice;
69
70
  }
70
71
 
71
- static VALUE _native_validate_exporter(VALUE self, VALUE exporter_configuration) {
72
- Check_Type(exporter_configuration, T_ARRAY);
72
+ static VALUE _native_validate_exporter(DDTRACE_UNUSED VALUE _self, VALUE exporter_configuration) {
73
+ ENFORCE_TYPE(exporter_configuration, T_ARRAY);
73
74
  ddprof_ffi_NewProfileExporterV3Result exporter_result = create_exporter(exporter_configuration, rb_ary_new());
74
75
 
75
76
  VALUE failure_tuple = handle_exporter_failure(exporter_result);
@@ -83,8 +84,8 @@ static VALUE _native_validate_exporter(VALUE self, VALUE exporter_configuration)
83
84
  }
84
85
 
85
86
  static ddprof_ffi_NewProfileExporterV3Result create_exporter(VALUE exporter_configuration, VALUE tags_as_array) {
86
- Check_Type(exporter_configuration, T_ARRAY);
87
- Check_Type(tags_as_array, T_ARRAY);
87
+ ENFORCE_TYPE(exporter_configuration, T_ARRAY);
88
+ ENFORCE_TYPE(tags_as_array, T_ARRAY);
88
89
 
89
90
  // This needs to be called BEFORE convert_tags since it can raise an exception and thus cause the ddprof_ffi_Vec_tag
90
91
  // to be leaked.
@@ -111,7 +112,7 @@ static VALUE handle_exporter_failure(ddprof_ffi_NewProfileExporterV3Result expor
111
112
  }
112
113
 
113
114
  static ddprof_ffi_EndpointV3 endpoint_from(VALUE exporter_configuration) {
114
- Check_Type(exporter_configuration, T_ARRAY);
115
+ ENFORCE_TYPE(exporter_configuration, T_ARRAY);
115
116
 
116
117
  ID working_mode = SYM2ID(rb_ary_entry(exporter_configuration, 0)); // SYM2ID verifies its input so we can do this safely
117
118
 
@@ -122,13 +123,13 @@ static ddprof_ffi_EndpointV3 endpoint_from(VALUE exporter_configuration) {
122
123
  if (working_mode == agentless_id) {
123
124
  VALUE site = rb_ary_entry(exporter_configuration, 1);
124
125
  VALUE api_key = rb_ary_entry(exporter_configuration, 2);
125
- Check_Type(site, T_STRING);
126
- Check_Type(api_key, T_STRING);
126
+ ENFORCE_TYPE(site, T_STRING);
127
+ ENFORCE_TYPE(api_key, T_STRING);
127
128
 
128
129
  return ddprof_ffi_EndpointV3_agentless(char_slice_from_ruby_string(site), char_slice_from_ruby_string(api_key));
129
130
  } else { // agent_id
130
131
  VALUE base_url = rb_ary_entry(exporter_configuration, 1);
131
- Check_Type(base_url, T_STRING);
132
+ ENFORCE_TYPE(base_url, T_STRING);
132
133
 
133
134
  return ddprof_ffi_EndpointV3_agent(char_slice_from_ruby_string(base_url));
134
135
  }
@@ -136,7 +137,7 @@ static ddprof_ffi_EndpointV3 endpoint_from(VALUE exporter_configuration) {
136
137
 
137
138
  __attribute__((warn_unused_result))
138
139
  static ddprof_ffi_Vec_tag convert_tags(VALUE tags_as_array) {
139
- Check_Type(tags_as_array, T_ARRAY);
140
+ ENFORCE_TYPE(tags_as_array, T_ARRAY);
140
141
 
141
142
  long tags_count = RARRAY_LEN(tags_as_array);
142
143
  ddprof_ffi_Vec_tag tags = ddprof_ffi_Vec_tag_new();
@@ -146,7 +147,7 @@ static ddprof_ffi_Vec_tag convert_tags(VALUE tags_as_array) {
146
147
 
147
148
  if (!RB_TYPE_P(name_value_pair, T_ARRAY)) {
148
149
  ddprof_ffi_Vec_tag_drop(tags);
149
- Check_Type(name_value_pair, T_ARRAY);
150
+ ENFORCE_TYPE(name_value_pair, T_ARRAY);
150
151
  }
151
152
 
152
153
  // Note: We can index the array without checking its size first because rb_ary_entry returns Qnil if out of bounds
@@ -155,8 +156,8 @@ static ddprof_ffi_Vec_tag convert_tags(VALUE tags_as_array) {
155
156
 
156
157
  if (!(RB_TYPE_P(tag_name, T_STRING) && RB_TYPE_P(tag_value, T_STRING))) {
157
158
  ddprof_ffi_Vec_tag_drop(tags);
158
- Check_Type(tag_name, T_STRING);
159
- Check_Type(tag_value, T_STRING);
159
+ ENFORCE_TYPE(tag_name, T_STRING);
160
+ ENFORCE_TYPE(tag_value, T_STRING);
160
161
  }
161
162
 
162
163
  ddprof_ffi_PushTagResult push_result =
@@ -166,7 +167,7 @@ static ddprof_ffi_Vec_tag convert_tags(VALUE tags_as_array) {
166
167
  VALUE err_details = ruby_string_from_vec_u8(push_result.err);
167
168
  ddprof_ffi_PushTagResult_drop(push_result);
168
169
 
169
- // libddprof validates tags and may catch invalid tags that ddtrace didn't actually catch.
170
+ // libdatadog validates tags and may catch invalid tags that ddtrace didn't actually catch.
170
171
  // We warn users about such tags, and then just ignore them.
171
172
  safely_log_failure_to_process_tag(tags, err_details);
172
173
  } else {
@@ -193,7 +194,7 @@ static void safely_log_failure_to_process_tag(ddprof_ffi_Vec_tag tags, VALUE err
193
194
  }
194
195
  }
195
196
 
196
- // Note: This function handles a bunch of libddprof dynamically-allocated objects, so it MUST not use any Ruby APIs
197
+ // Note: This function handles a bunch of libdatadog dynamically-allocated objects, so it MUST not use any Ruby APIs
197
198
  // which can raise exceptions, otherwise the objects will be leaked.
198
199
  static VALUE perform_export(
199
200
  ddprof_ffi_NewProfileExporterV3Result valid_exporter_result, // Must be called with a valid exporter result
@@ -229,45 +230,37 @@ static VALUE perform_export(
229
230
 
230
231
  while (!args.send_ran && !pending_exception) {
231
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
232
235
  if (!args.send_ran) pending_exception = check_if_pending_exception();
233
236
  }
234
237
 
235
- VALUE ruby_status;
236
- VALUE ruby_result;
238
+ // Cleanup exporter and token, no longer needed
239
+ ddprof_ffi_CancellationToken_drop(cancel_token);
240
+ ddprof_ffi_NewProfileExporterV3Result_drop(valid_exporter_result);
237
241
 
238
242
  if (pending_exception) {
239
- // We're in a weird situation that libddprof doesn't quite support. The ddprof_ffi_Request payload is dynamically
240
- // allocated and needs to be freed, but libddprof doesn't have an API for dropping a request.
241
- //
242
- // There's plans to add a `ddprof_ffi_Request_drop`
243
- // (https://github.com/DataDog/dd-trace-rb/pull/1923#discussion_r882096221); once that happens, we can use it here.
244
- //
245
- // As a workaround, we get libddprof to clean up the request by asking for the send to be cancelled, and then calling
246
- // it anyway. This will make libddprof free the request and return immediately which gets us the expected effect.
247
- interrupt_exporter_call((void *) cancel_token);
248
- call_exporter_without_gvl((void *) &args);
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);
249
248
  }
250
249
 
251
250
  ddprof_ffi_SendResult result = args.result;
252
251
  bool success = result.tag == DDPROF_FFI_SEND_RESULT_HTTP_RESPONSE;
253
252
 
254
- ruby_status = success ? ok_symbol : error_symbol;
255
- ruby_result = success ? UINT2NUM(result.http_response.code) : ruby_string_from_vec_u8(result.failure);
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);
256
255
 
257
- // Clean up all dynamically-allocated things
258
256
  ddprof_ffi_SendResult_drop(args.result);
259
- ddprof_ffi_CancellationToken_drop(cancel_token);
260
- ddprof_ffi_NewProfileExporterV3Result_drop(valid_exporter_result);
261
- // The request itself does not need to be freed as libddprof takes care of it.
262
-
263
- // We've cleaned up everything, so if there's an exception to be raised, let's have it
264
- if (pending_exception) rb_jump_tag(pending_exception);
257
+ // The request itself does not need to be freed as libdatadog takes care of it as part of sending.
265
258
 
266
259
  return rb_ary_new_from_args(2, ruby_status, ruby_result);
267
260
  }
268
261
 
269
262
  static VALUE _native_do_export(
270
- VALUE self,
263
+ DDTRACE_UNUSED VALUE _self,
271
264
  VALUE exporter_configuration,
272
265
  VALUE upload_timeout_milliseconds,
273
266
  VALUE start_timespec_seconds,
@@ -280,18 +273,18 @@ static VALUE _native_do_export(
280
273
  VALUE code_provenance_data,
281
274
  VALUE tags_as_array
282
275
  ) {
283
- Check_Type(upload_timeout_milliseconds, T_FIXNUM);
284
- Check_Type(start_timespec_seconds, T_FIXNUM);
285
- Check_Type(start_timespec_nanoseconds, T_FIXNUM);
286
- Check_Type(finish_timespec_seconds, T_FIXNUM);
287
- Check_Type(finish_timespec_nanoseconds, T_FIXNUM);
288
- Check_Type(pprof_file_name, T_STRING);
289
- Check_Type(pprof_data, T_STRING);
290
- Check_Type(code_provenance_file_name, T_STRING);
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);
291
284
 
292
285
  // Code provenance can be disabled and in that case will be set to nil
293
286
  bool have_code_provenance = !NIL_P(code_provenance_data);
294
- if (have_code_provenance) Check_Type(code_provenance_data, T_STRING);
287
+ if (have_code_provenance) ENFORCE_TYPE(code_provenance_data, T_STRING);
295
288
 
296
289
  uint64_t timeout_milliseconds = NUM2ULONG(upload_timeout_milliseconds);
297
290
 
@@ -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,7 +2,7 @@
2
2
 
3
3
  # typed: ignore
4
4
 
5
- require 'libddprof'
5
+ require 'libdatadog'
6
6
  require 'pathname'
7
7
 
8
8
  module Datadog
@@ -22,29 +22,29 @@ module Datadog
22
22
  end
23
23
 
24
24
  # Used as an workaround for a limitation with how dynamic linking works in environments where ddtrace and
25
- # libddprof are moved after the extension gets compiled.
25
+ # libdatadog are moved after the extension gets compiled.
26
26
  #
27
27
  # Because the libddpprof native library is installed on a non-standard system path, in order for it to be
28
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 libddprof.
29
+ # native extension), we need to add a "runpath" -- a list of folders to search for libdatadog.
30
30
  #
31
31
  # This runpath gets hardcoded at native library linking time. You can look at it using the `readelf` tool in
32
32
  # Linux: e.g. `readelf -d ddtrace_profiling_native_extension.2.7.3_x86_64-linux.so`.
33
33
  #
34
- # In ddtrace 1.1.0, we only set as runpath an absolute path to libddprof. (This gets set automatically by the call
35
- # to `pkg_config('ddprof_ffi_with_rpath')` in `extconf.rb`). This worked fine as long as libddprof was **NOT**
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
36
  # moved from the folder it was present at ddtrace installation/linking time.
37
37
  #
38
38
  # Unfortunately, environments such as Heroku and AWS Elastic Beanstalk move gems around in the filesystem after
39
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 libddprof could not be found.
40
+ # (see https://github.com/DataDog/dd-trace-rb/issues/2067) because libdatadog could not be found.
41
41
  #
42
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 libddprof is installed, and returns it
43
+ # native extension is going to be installed and the folder where libdatadog is installed, and returns it
44
44
  # to be set as an additional runpath. (Yes, you can set multiple runpath folders to be searched).
45
45
  #
46
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 libddprof.
47
+ # the relative path can still be traversed to find libdatadog.
48
48
  #
49
49
  # This is incredibly awful, and it's kinda bizarre how it's not possible to just find these paths at runtime
50
50
  # and set them correctly; rather than needing to set stuff at linking-time and then praying to $deity that
@@ -54,16 +54,16 @@ module Datadog
54
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
55
  # we could setup when doing a `require`.
56
56
  #
57
- def self.libddprof_folder_relative_to_native_lib_folder(
57
+ def self.libdatadog_folder_relative_to_native_lib_folder(
58
58
  current_folder: __dir__,
59
- libddprof_pkgconfig_folder: Libddprof.pkgconfig_folder
59
+ libdatadog_pkgconfig_folder: Libdatadog.pkgconfig_folder
60
60
  )
61
- return unless libddprof_pkgconfig_folder
61
+ return unless libdatadog_pkgconfig_folder
62
62
 
63
63
  profiling_native_lib_folder = "#{current_folder}/../../lib/"
64
- libddprof_lib_folder = "#{libddprof_pkgconfig_folder}/../"
64
+ libdatadog_lib_folder = "#{libdatadog_pkgconfig_folder}/../"
65
65
 
66
- Pathname.new(libddprof_lib_folder).relative_path_from(Pathname.new(profiling_native_lib_folder)).to_s
66
+ Pathname.new(libdatadog_lib_folder).relative_path_from(Pathname.new(profiling_native_lib_folder)).to_s
67
67
  end
68
68
 
69
69
  # Used to check if profiler is supported, including user-visible clear messages explaining why their
@@ -86,8 +86,9 @@ module Datadog
86
86
  on_macos? ||
87
87
  on_unknown_os? ||
88
88
  not_on_amd64_or_arm64? ||
89
+ on_ruby_2_1? ||
89
90
  expected_to_use_mjit_but_mjit_is_disabled? ||
90
- libddprof_not_usable?
91
+ libdatadog_not_usable?
91
92
  end
92
93
 
93
94
  # This banner will show up in the logs/terminal while compiling the native extension
@@ -137,6 +138,8 @@ module Datadog
137
138
  CONTACT_SUPPORT = [
138
139
  'For help solving this issue, please contact Datadog support at',
139
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>.'
140
143
  ].freeze
141
144
 
142
145
  REPORT_ISSUE = [
@@ -148,9 +151,13 @@ module Datadog
148
151
  "Get in touch with us if you're interested in profiling your app!"
149
152
  ].freeze
150
153
 
154
+ UPGRADE_RUBY = [
155
+ 'Upgrade to a modern Ruby to enable profiling for your app.'
156
+ ].freeze
157
+
151
158
  # Validation for this check is done in extconf.rb because it relies on mkmf
152
- FAILED_TO_CONFIGURE_LIBDDPROF = explain_issue(
153
- '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.',
154
161
  suggested: CONTACT_SUPPORT,
155
162
  )
156
163
 
@@ -242,6 +249,15 @@ module Datadog
242
249
  architecture_not_supported unless RUBY_PLATFORM.start_with?('x86_64', 'aarch64')
243
250
  end
244
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
+
245
261
  # On some Rubies, we require the mjit header to be present. If Ruby was installed without MJIT support, we also skip
246
262
  # building the extension.
247
263
  private_class_method def self.expected_to_use_mjit_but_mjit_is_disabled?
@@ -255,17 +271,17 @@ module Datadog
255
271
  ruby_without_mjit if CAN_USE_MJIT_HEADER && RbConfig::CONFIG['MJIT_SUPPORT'] != 'yes'
256
272
  end
257
273
 
258
- private_class_method def self.libddprof_not_usable?
274
+ private_class_method def self.libdatadog_not_usable?
259
275
  no_binaries_for_current_platform = explain_issue(
260
- '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',
261
277
  'platform variant.',
262
278
  "(Your platform: `#{Gem::Platform.local}`)",
263
279
  '(Available binaries: ',
264
- "`#{Libddprof.available_binaries.join('`, `')}`)",
280
+ "`#{Libdatadog.available_binaries.join('`, `')}`)",
265
281
  suggested: CONTACT_SUPPORT,
266
282
  )
267
283
 
268
- no_binaries_for_current_platform unless Libddprof.pkgconfig_folder
284
+ no_binaries_for_current_platform unless Libdatadog.pkgconfig_folder
269
285
  end
270
286
  end
271
287
  # rubocop:enable Metrics/ModuleLength
@@ -13,7 +13,13 @@
13
13
  #include RUBY_MJIT_HEADER
14
14
  #else
15
15
  // On older Rubies, use a copy of the VM internal headers shipped in the debase-ruby_core_source gem
16
- #include <vm_core.h>
16
+
17
+ // We can't do anything about warnings in VM headers, so we just use this technique to surpress them.
18
+ // See https://nelkinda.com/blog/suppress-warnings-in-gcc-and-clang/#d11e364 for details.
19
+ #pragma GCC diagnostic push
20
+ #pragma GCC diagnostic ignored "-Wunused-parameter"
21
+ #include <vm_core.h>
22
+ #pragma GCC diagnostic pop
17
23
  #include <iseq.h>
18
24
  #endif
19
25
 
@@ -68,7 +74,6 @@ ptrdiff_t stack_depth_for(VALUE thread) {
68
74
  #define ccan_list_for_each list_for_each
69
75
  #endif
70
76
 
71
- #ifndef USE_LEGACY_LIVING_THREADS_ST // Ruby > 2.1
72
77
  // Tries to match rb_thread_list() but that method isn't accessible to extensions
73
78
  VALUE ddtrace_thread_list(void) {
74
79
  VALUE result = rb_ary_new();
@@ -103,36 +108,25 @@ VALUE ddtrace_thread_list(void) {
103
108
 
104
109
  return result;
105
110
  }
106
- #else // USE_LEGACY_LIVING_THREADS_ST
107
- static int ddtrace_thread_list_each(st_data_t thread_object, st_data_t _value, void *result_object);
108
-
109
- // Alternative ddtrace_thread_list implementation for Ruby 2.1. In this Ruby version, living threads were stored in a
110
- // hashmap (st) instead of a list.
111
- VALUE ddtrace_thread_list() {
112
- VALUE result = rb_ary_new();
113
- st_foreach(thread_struct_from_object(rb_thread_current())->vm->living_threads, ddtrace_thread_list_each, result);
114
- return result;
115
- }
116
-
117
- static int ddtrace_thread_list_each(st_data_t thread_object, st_data_t _value, void *result_object) {
118
- VALUE result = (VALUE) result_object;
119
- rb_thread_t *thread = thread_struct_from_object((VALUE) thread_object);
120
- switch (thread->status) {
121
- case THREAD_RUNNABLE:
122
- case THREAD_STOPPED:
123
- case THREAD_STOPPED_FOREVER:
124
- rb_ary_push(result, thread->self);
125
- default:
126
- break;
127
- }
128
- return ST_CONTINUE;
129
- }
130
- #endif // USE_LEGACY_LIVING_THREADS_ST
131
111
 
132
112
  bool is_thread_alive(VALUE thread) {
133
113
  return thread_struct_from_object(thread)->status != THREAD_KILLED;
134
114
  }
135
115
 
116
+ // `thread` gets used on all Rubies except 2.2
117
+ // To avoid getting false "unused argument" warnings in setups where it's not used, we need to do this weird dance
118
+ // with diagnostic stuff. See https://nelkinda.com/blog/suppress-warnings-in-gcc-and-clang/#d11e364 for details.
119
+ #pragma GCC diagnostic push
120
+ #pragma GCC diagnostic ignored "-Wunused-parameter"
121
+ VALUE thread_name_for(VALUE thread) {
122
+ #ifdef NO_THREAD_NAMES
123
+ return Qnil;
124
+ #else
125
+ return thread_struct_from_object(thread)->name;
126
+ #endif
127
+ }
128
+ #pragma GCC diagnostic pop
129
+
136
130
  // -----------------------------------------------------------------------------
137
131
  // The sources below are modified versions of code extracted from the Ruby project.
138
132
  // Each function is annotated with its origin, why we imported it, and the changes made.
@@ -174,6 +168,12 @@ bool is_thread_alive(VALUE thread) {
174
168
  // Copyright (C) 1993-2012 Yukihiro Matsumoto
175
169
  // to support our custom rb_profile_frames (see below)
176
170
  // Modifications: None
171
+ //
172
+ // `node_id` gets used depending on Ruby VM compilation settings (USE_ISEQ_NODE_ID being defined).
173
+ // To avoid getting false "unused argument" warnings in setups where it's not used, we need to do this weird dance
174
+ // with diagnostic stuff. See https://nelkinda.com/blog/suppress-warnings-in-gcc-and-clang/#d11e364 for details.
175
+ #pragma GCC diagnostic push
176
+ #pragma GCC diagnostic ignored "-Wunused-parameter"
177
177
  inline static int
178
178
  calc_pos(const rb_iseq_t *iseq, const VALUE *pc, int *lineno, int *node_id)
179
179
  {
@@ -217,6 +217,7 @@ calc_pos(const rb_iseq_t *iseq, const VALUE *pc, int *lineno, int *node_id)
217
217
  return 1;
218
218
  }
219
219
  }
220
+ #pragma GCC diagnostic pop
220
221
 
221
222
  // Taken from upstream vm_backtrace.c at commit 5f10bd634fb6ae8f74a4ea730176233b0ca96954 (March 2022, Ruby 3.2 trunk)
222
223
  // Copyright (C) 1993-2012 Yukihiro Matsumoto
@@ -620,11 +621,11 @@ calc_lineno(const rb_iseq_t *iseq, const VALUE *pc)
620
621
  // * Check thread status and do not sample if thread has been killed.
621
622
  //
622
623
  // The `rb_profile_frames` function changed quite a bit between Ruby 2.2 and 2.3. Since the change was quite complex
623
- // I opted not to try to extend support to Ruby 2.2 and below using the same custom function, and instead I started
624
+ // I opted not to try to extend support to Ruby 2.2 using the same custom function, and instead I started
624
625
  // anew from the Ruby 2.2 version of the function, applying some of the same fixes that we have for the modern version.
625
626
  int ddtrace_rb_profile_frames(VALUE thread, int start, int limit, VALUE *buff, int *lines, bool* is_ruby_frame)
626
627
  {
627
- // **IMPORTANT: THIS IS A CUSTOM RB_PROFILE_FRAMES JUST FOR RUBY 2.2 AND BELOW;
628
+ // **IMPORTANT: THIS IS A CUSTOM RB_PROFILE_FRAMES JUST FOR RUBY 2.2;
628
629
  // SEE ABOVE FOR THE FUNCTION THAT GETS USED FOR MODERN RUBIES**
629
630
 
630
631
  int i;
@@ -6,11 +6,7 @@
6
6
  // so we use PRIVATE_VM_API_ACCESS_SKIP_RUBY_INCLUDES to be able to include private_vm_api_access.h on that file
7
7
  // without also dragging the incompatible includes
8
8
  #ifndef PRIVATE_VM_API_ACCESS_SKIP_RUBY_INCLUDES
9
- #ifdef RUBY_2_1_WORKAROUND
10
- #include <thread_native.h>
11
- #else
12
- #include <ruby/thread_native.h>
13
- #endif
9
+ #include <ruby/thread_native.h>
14
10
  #endif
15
11
 
16
12
  #include "extconf.h"
@@ -19,6 +15,7 @@ rb_nativethread_id_t pthread_id_for(VALUE thread);
19
15
  ptrdiff_t stack_depth_for(VALUE thread);
20
16
  VALUE ddtrace_thread_list(void);
21
17
  bool is_thread_alive(VALUE thread);
18
+ VALUE thread_name_for(VALUE thread);
22
19
 
23
20
  int ddtrace_rb_profile_frames(VALUE thread, int start, int limit, VALUE *buff, int *lines, bool* is_ruby_frame);
24
21
 
@@ -1,6 +1,7 @@
1
1
  #include <ruby.h>
2
2
 
3
3
  #include "clock_id.h"
4
+ #include "helpers.h"
4
5
 
5
6
  // Each class/module here is implemented in their separate file
6
7
  void collectors_cpu_and_wall_time_init(VALUE profiling_module);
@@ -10,8 +11,6 @@ void stack_recorder_init(VALUE profiling_module);
10
11
 
11
12
  static VALUE native_working_p(VALUE self);
12
13
 
13
- #define DDTRACE_EXPORT __attribute__ ((visibility ("default")))
14
-
15
14
  void DDTRACE_EXPORT Init_ddtrace_profiling_native_extension(void) {
16
15
  VALUE datadog_module = rb_define_module("Datadog");
17
16
  VALUE profiling_module = rb_define_module_under(datadog_module, "Profiling");
@@ -28,7 +27,7 @@ void DDTRACE_EXPORT Init_ddtrace_profiling_native_extension(void) {
28
27
  stack_recorder_init(profiling_module);
29
28
  }
30
29
 
31
- static VALUE native_working_p(VALUE self) {
30
+ static VALUE native_working_p(DDTRACE_UNUSED VALUE _self) {
32
31
  self_test_clock_id();
33
32
 
34
33
  return Qtrue;
@@ -0,0 +1,25 @@
1
+ #include "ruby_helpers.h"
2
+
3
+ void raise_unexpected_type(
4
+ VALUE value,
5
+ DDTRACE_UNUSED enum ruby_value_type _type,
6
+ const char *value_name,
7
+ const char *type_name,
8
+ const char *file,
9
+ int line,
10
+ const char* function_name
11
+ ) {
12
+ rb_exc_raise(
13
+ rb_exc_new_str(
14
+ rb_eTypeError,
15
+ rb_sprintf("wrong argument %"PRIsVALUE" for '%s' (expected a %s) at %s:%d:in `%s'",
16
+ rb_inspect(value),
17
+ value_name,
18
+ type_name,
19
+ file,
20
+ line,
21
+ function_name
22
+ )
23
+ )
24
+ );
25
+ }