ddtrace 0.41.0 → 0.52.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 (572) hide show
  1. checksums.yaml +4 -4
  2. data/.editorconfig +22 -0
  3. data/.gitignore +7 -1
  4. data/CHANGELOG.md +1496 -354
  5. data/CONTRIBUTING.md +3 -7
  6. data/LICENSE-3rdparty.csv +2 -0
  7. data/README.md +1 -0
  8. data/bin/ddtracerb +15 -0
  9. data/ddtrace.gemspec +18 -38
  10. data/docs/DevelopmentGuide.md +55 -2
  11. data/docs/GettingStarted.md +338 -79
  12. data/docs/ProfilingDevelopment.md +107 -0
  13. data/ext/ddtrace_profiling_native_extension/extconf.rb +28 -0
  14. data/ext/ddtrace_profiling_native_extension/profiling.c +17 -0
  15. data/lib/datadog/ci.rb +17 -0
  16. data/lib/datadog/ci/configuration/components.rb +31 -0
  17. data/lib/datadog/ci/configuration/settings.rb +37 -0
  18. data/lib/datadog/ci/context_flush.rb +29 -0
  19. data/lib/datadog/ci/contrib/cucumber/configuration/settings.rb +31 -0
  20. data/lib/datadog/ci/contrib/cucumber/ext.rb +20 -0
  21. data/lib/datadog/ci/contrib/cucumber/formatter.rb +98 -0
  22. data/lib/datadog/ci/contrib/cucumber/instrumentation.rb +27 -0
  23. data/lib/datadog/ci/contrib/cucumber/integration.rb +48 -0
  24. data/lib/datadog/ci/contrib/cucumber/patcher.rb +26 -0
  25. data/lib/datadog/ci/contrib/rspec/configuration/settings.rb +31 -0
  26. data/lib/datadog/ci/contrib/rspec/example.rb +74 -0
  27. data/lib/datadog/ci/contrib/rspec/ext.rb +19 -0
  28. data/lib/datadog/ci/contrib/rspec/integration.rb +49 -0
  29. data/lib/datadog/ci/contrib/rspec/patcher.rb +26 -0
  30. data/lib/datadog/ci/ext/app_types.rb +10 -0
  31. data/lib/datadog/ci/ext/environment.rb +443 -0
  32. data/lib/datadog/ci/ext/settings.rb +11 -0
  33. data/lib/datadog/ci/ext/test.rb +35 -0
  34. data/lib/datadog/ci/extensions.rb +18 -0
  35. data/lib/datadog/ci/test.rb +77 -0
  36. data/lib/datadog/contrib.rb +69 -0
  37. data/lib/datadog/core/environment/cgroup.rb +52 -0
  38. data/lib/datadog/core/environment/class_count.rb +20 -0
  39. data/lib/datadog/core/environment/container.rb +91 -0
  40. data/lib/datadog/core/environment/ext.rb +27 -0
  41. data/lib/datadog/core/environment/gc.rb +19 -0
  42. data/lib/datadog/core/environment/identity.rb +51 -0
  43. data/lib/datadog/core/environment/socket.rb +17 -0
  44. data/lib/datadog/core/environment/thread_count.rb +19 -0
  45. data/lib/datadog/core/environment/variable_helpers.rb +42 -0
  46. data/lib/ddtrace.rb +22 -48
  47. data/lib/ddtrace/analytics.rb +3 -0
  48. data/lib/ddtrace/auto_instrument.rb +5 -0
  49. data/lib/ddtrace/auto_instrument_base.rb +7 -0
  50. data/lib/ddtrace/buffer.rb +233 -135
  51. data/lib/ddtrace/chunker.rb +1 -0
  52. data/lib/ddtrace/configuration.rb +132 -24
  53. data/lib/ddtrace/configuration/agent_settings_resolver.rb +231 -0
  54. data/lib/ddtrace/configuration/base.rb +9 -11
  55. data/lib/ddtrace/configuration/components.rb +167 -26
  56. data/lib/ddtrace/configuration/dependency_resolver.rb +1 -0
  57. data/lib/ddtrace/configuration/option.rb +1 -0
  58. data/lib/ddtrace/configuration/option_definition.rb +2 -3
  59. data/lib/ddtrace/configuration/option_definition_set.rb +1 -0
  60. data/lib/ddtrace/configuration/option_set.rb +1 -0
  61. data/lib/ddtrace/configuration/options.rb +7 -9
  62. data/lib/ddtrace/configuration/pin_setup.rb +1 -0
  63. data/lib/ddtrace/configuration/settings.rb +132 -12
  64. data/lib/ddtrace/context.rb +41 -20
  65. data/lib/ddtrace/context_flush.rb +15 -2
  66. data/lib/ddtrace/context_provider.rb +17 -5
  67. data/lib/ddtrace/contrib/action_cable/configuration/settings.rb +1 -0
  68. data/lib/ddtrace/contrib/action_cable/event.rb +6 -4
  69. data/lib/ddtrace/contrib/action_cable/events.rb +1 -0
  70. data/lib/ddtrace/contrib/action_cable/events/broadcast.rb +1 -0
  71. data/lib/ddtrace/contrib/action_cable/events/perform_action.rb +1 -0
  72. data/lib/ddtrace/contrib/action_cable/events/transmit.rb +1 -0
  73. data/lib/ddtrace/contrib/action_cable/ext.rb +1 -0
  74. data/lib/ddtrace/contrib/action_cable/instrumentation.rb +1 -0
  75. data/lib/ddtrace/contrib/action_cable/integration.rb +8 -0
  76. data/lib/ddtrace/contrib/action_cable/patcher.rb +1 -0
  77. data/lib/ddtrace/contrib/action_pack/action_controller/instrumentation.rb +22 -13
  78. data/lib/ddtrace/contrib/action_pack/action_controller/patcher.rb +2 -1
  79. data/lib/ddtrace/contrib/action_pack/configuration/settings.rb +1 -0
  80. data/lib/ddtrace/contrib/action_pack/ext.rb +1 -0
  81. data/lib/ddtrace/contrib/action_pack/integration.rb +8 -0
  82. data/lib/ddtrace/contrib/action_pack/patcher.rb +1 -0
  83. data/lib/ddtrace/contrib/action_pack/utils.rb +2 -1
  84. data/lib/ddtrace/contrib/action_view/configuration/settings.rb +1 -0
  85. data/lib/ddtrace/contrib/action_view/event.rb +4 -7
  86. data/lib/ddtrace/contrib/action_view/events.rb +1 -0
  87. data/lib/ddtrace/contrib/action_view/events/render_partial.rb +2 -0
  88. data/lib/ddtrace/contrib/action_view/events/render_template.rb +2 -0
  89. data/lib/ddtrace/contrib/action_view/ext.rb +1 -0
  90. data/lib/ddtrace/contrib/action_view/instrumentation/partial_renderer.rb +1 -0
  91. data/lib/ddtrace/contrib/action_view/instrumentation/template_renderer.rb +1 -0
  92. data/lib/ddtrace/contrib/action_view/integration.rb +8 -0
  93. data/lib/ddtrace/contrib/action_view/patcher.rb +5 -4
  94. data/lib/ddtrace/contrib/action_view/utils.rb +2 -1
  95. data/lib/ddtrace/contrib/active_model_serializers/configuration/settings.rb +1 -0
  96. data/lib/ddtrace/contrib/active_model_serializers/event.rb +3 -2
  97. data/lib/ddtrace/contrib/active_model_serializers/events.rb +1 -0
  98. data/lib/ddtrace/contrib/active_model_serializers/events/render.rb +1 -0
  99. data/lib/ddtrace/contrib/active_model_serializers/events/serialize.rb +1 -0
  100. data/lib/ddtrace/contrib/active_model_serializers/ext.rb +1 -0
  101. data/lib/ddtrace/contrib/active_model_serializers/integration.rb +1 -0
  102. data/lib/ddtrace/contrib/active_model_serializers/patcher.rb +1 -0
  103. data/lib/ddtrace/contrib/active_record/configuration/makara_resolver.rb +31 -0
  104. data/lib/ddtrace/contrib/active_record/configuration/resolver.rb +108 -18
  105. data/lib/ddtrace/contrib/active_record/configuration/settings.rb +1 -0
  106. data/lib/ddtrace/contrib/active_record/event.rb +3 -2
  107. data/lib/ddtrace/contrib/active_record/events.rb +1 -0
  108. data/lib/ddtrace/contrib/active_record/events/instantiation.rb +1 -0
  109. data/lib/ddtrace/contrib/active_record/events/sql.rb +1 -0
  110. data/lib/ddtrace/contrib/active_record/ext.rb +1 -0
  111. data/lib/ddtrace/contrib/active_record/integration.rb +8 -0
  112. data/lib/ddtrace/contrib/active_record/patcher.rb +1 -0
  113. data/lib/ddtrace/contrib/active_record/utils.rb +69 -21
  114. data/lib/ddtrace/contrib/active_support/cache/instrumentation.rb +105 -3
  115. data/lib/ddtrace/contrib/active_support/cache/patcher.rb +26 -4
  116. data/lib/ddtrace/contrib/active_support/cache/redis.rb +2 -5
  117. data/lib/ddtrace/contrib/active_support/configuration/settings.rb +1 -0
  118. data/lib/ddtrace/contrib/active_support/ext.rb +4 -0
  119. data/lib/ddtrace/contrib/active_support/integration.rb +8 -1
  120. data/lib/ddtrace/contrib/active_support/notifications/event.rb +15 -3
  121. data/lib/ddtrace/contrib/active_support/notifications/subscriber.rb +3 -1
  122. data/lib/ddtrace/contrib/active_support/notifications/subscription.rb +10 -5
  123. data/lib/ddtrace/contrib/active_support/patcher.rb +1 -0
  124. data/lib/ddtrace/contrib/analytics.rb +1 -0
  125. data/lib/ddtrace/contrib/auto_instrument.rb +49 -0
  126. data/lib/ddtrace/contrib/aws/configuration/settings.rb +1 -0
  127. data/lib/ddtrace/contrib/aws/ext.rb +1 -0
  128. data/lib/ddtrace/contrib/aws/instrumentation.rb +32 -1
  129. data/lib/ddtrace/contrib/aws/integration.rb +1 -0
  130. data/lib/ddtrace/contrib/aws/parsed_context.rb +1 -0
  131. data/lib/ddtrace/contrib/aws/patcher.rb +6 -1
  132. data/lib/ddtrace/contrib/aws/services.rb +4 -0
  133. data/lib/ddtrace/contrib/concurrent_ruby/configuration/settings.rb +1 -0
  134. data/lib/ddtrace/contrib/concurrent_ruby/context_composite_executor_service.rb +1 -0
  135. data/lib/ddtrace/contrib/concurrent_ruby/ext.rb +1 -0
  136. data/lib/ddtrace/contrib/concurrent_ruby/future_patch.rb +1 -0
  137. data/lib/ddtrace/contrib/concurrent_ruby/integration.rb +1 -0
  138. data/lib/ddtrace/contrib/concurrent_ruby/patcher.rb +3 -1
  139. data/lib/ddtrace/contrib/configurable.rb +65 -38
  140. data/lib/ddtrace/contrib/configuration/resolver.rb +71 -5
  141. data/lib/ddtrace/contrib/configuration/resolvers/pattern_resolver.rb +21 -20
  142. data/lib/ddtrace/contrib/configuration/settings.rb +8 -6
  143. data/lib/ddtrace/contrib/dalli/configuration/settings.rb +1 -0
  144. data/lib/ddtrace/contrib/dalli/ext.rb +1 -0
  145. data/lib/ddtrace/contrib/dalli/instrumentation.rb +2 -1
  146. data/lib/ddtrace/contrib/dalli/integration.rb +1 -0
  147. data/lib/ddtrace/contrib/dalli/patcher.rb +2 -39
  148. data/lib/ddtrace/contrib/dalli/quantize.rb +1 -0
  149. data/lib/ddtrace/contrib/delayed_job/configuration/settings.rb +3 -0
  150. data/lib/ddtrace/contrib/delayed_job/ext.rb +3 -0
  151. data/lib/ddtrace/contrib/delayed_job/integration.rb +1 -0
  152. data/lib/ddtrace/contrib/delayed_job/patcher.rb +1 -0
  153. data/lib/ddtrace/contrib/delayed_job/plugin.rb +39 -15
  154. data/lib/ddtrace/contrib/elasticsearch/configuration/settings.rb +1 -0
  155. data/lib/ddtrace/contrib/elasticsearch/ext.rb +1 -0
  156. data/lib/ddtrace/contrib/elasticsearch/integration.rb +1 -0
  157. data/lib/ddtrace/contrib/elasticsearch/patcher.rb +2 -0
  158. data/lib/ddtrace/contrib/elasticsearch/quantize.rb +6 -2
  159. data/lib/ddtrace/contrib/ethon/configuration/settings.rb +1 -0
  160. data/lib/ddtrace/contrib/ethon/easy_patch.rb +13 -11
  161. data/lib/ddtrace/contrib/ethon/ext.rb +2 -0
  162. data/lib/ddtrace/contrib/ethon/integration.rb +1 -0
  163. data/lib/ddtrace/contrib/ethon/multi_patch.rb +2 -1
  164. data/lib/ddtrace/contrib/ethon/patcher.rb +4 -2
  165. data/lib/ddtrace/contrib/excon/configuration/settings.rb +1 -0
  166. data/lib/ddtrace/contrib/excon/ext.rb +1 -0
  167. data/lib/ddtrace/contrib/excon/integration.rb +1 -0
  168. data/lib/ddtrace/contrib/excon/middleware.rb +10 -7
  169. data/lib/ddtrace/contrib/excon/patcher.rb +1 -0
  170. data/lib/ddtrace/contrib/extensions.rb +90 -14
  171. data/lib/ddtrace/contrib/faraday/configuration/settings.rb +1 -0
  172. data/lib/ddtrace/contrib/faraday/connection.rb +1 -0
  173. data/lib/ddtrace/contrib/faraday/ext.rb +1 -0
  174. data/lib/ddtrace/contrib/faraday/integration.rb +1 -0
  175. data/lib/ddtrace/contrib/faraday/middleware.rb +2 -3
  176. data/lib/ddtrace/contrib/faraday/patcher.rb +3 -38
  177. data/lib/ddtrace/contrib/faraday/rack_builder.rb +1 -0
  178. data/lib/ddtrace/contrib/grape/configuration/settings.rb +8 -0
  179. data/lib/ddtrace/contrib/grape/endpoint.rb +68 -32
  180. data/lib/ddtrace/contrib/grape/ext.rb +2 -0
  181. data/lib/ddtrace/contrib/grape/instrumentation.rb +4 -3
  182. data/lib/ddtrace/contrib/grape/integration.rb +1 -0
  183. data/lib/ddtrace/contrib/grape/patcher.rb +2 -43
  184. data/lib/ddtrace/contrib/graphql/configuration/settings.rb +1 -0
  185. data/lib/ddtrace/contrib/graphql/ext.rb +1 -0
  186. data/lib/ddtrace/contrib/graphql/integration.rb +1 -0
  187. data/lib/ddtrace/contrib/graphql/patcher.rb +1 -0
  188. data/lib/ddtrace/contrib/grpc/configuration/settings.rb +2 -0
  189. data/lib/ddtrace/contrib/grpc/datadog_interceptor.rb +13 -8
  190. data/lib/ddtrace/contrib/grpc/datadog_interceptor/client.rb +2 -1
  191. data/lib/ddtrace/contrib/grpc/datadog_interceptor/server.rb +4 -4
  192. data/lib/ddtrace/contrib/grpc/ext.rb +1 -0
  193. data/lib/ddtrace/contrib/grpc/integration.rb +1 -0
  194. data/lib/ddtrace/contrib/grpc/intercept_with_datadog.rb +1 -0
  195. data/lib/ddtrace/contrib/grpc/patcher.rb +3 -37
  196. data/lib/ddtrace/contrib/http/circuit_breaker.rb +2 -3
  197. data/lib/ddtrace/contrib/http/configuration/settings.rb +1 -0
  198. data/lib/ddtrace/contrib/http/ext.rb +1 -0
  199. data/lib/ddtrace/contrib/http/instrumentation.rb +9 -8
  200. data/lib/ddtrace/contrib/http/integration.rb +1 -0
  201. data/lib/ddtrace/contrib/http/patcher.rb +2 -1
  202. data/lib/ddtrace/contrib/http_annotation_helper.rb +1 -0
  203. data/lib/ddtrace/contrib/httpclient/configuration/settings.rb +33 -0
  204. data/lib/ddtrace/contrib/httpclient/ext.rb +18 -0
  205. data/lib/ddtrace/contrib/httpclient/instrumentation.rb +148 -0
  206. data/lib/ddtrace/contrib/httpclient/integration.rb +44 -0
  207. data/lib/ddtrace/contrib/httpclient/patcher.rb +39 -0
  208. data/lib/ddtrace/contrib/httprb/configuration/settings.rb +1 -0
  209. data/lib/ddtrace/contrib/httprb/ext.rb +1 -0
  210. data/lib/ddtrace/contrib/httprb/instrumentation.rb +17 -22
  211. data/lib/ddtrace/contrib/httprb/integration.rb +1 -0
  212. data/lib/ddtrace/contrib/httprb/patcher.rb +8 -4
  213. data/lib/ddtrace/contrib/integration.rb +4 -3
  214. data/lib/ddtrace/contrib/kafka/configuration/settings.rb +1 -0
  215. data/lib/ddtrace/contrib/kafka/consumer_event.rb +1 -0
  216. data/lib/ddtrace/contrib/kafka/consumer_group_event.rb +1 -0
  217. data/lib/ddtrace/contrib/kafka/event.rb +4 -3
  218. data/lib/ddtrace/contrib/kafka/events.rb +1 -0
  219. data/lib/ddtrace/contrib/kafka/events/connection/request.rb +1 -0
  220. data/lib/ddtrace/contrib/kafka/events/consumer/process_batch.rb +1 -0
  221. data/lib/ddtrace/contrib/kafka/events/consumer/process_message.rb +1 -0
  222. data/lib/ddtrace/contrib/kafka/events/consumer_group/heartbeat.rb +1 -0
  223. data/lib/ddtrace/contrib/kafka/events/consumer_group/join_group.rb +1 -0
  224. data/lib/ddtrace/contrib/kafka/events/consumer_group/leave_group.rb +1 -0
  225. data/lib/ddtrace/contrib/kafka/events/consumer_group/sync_group.rb +1 -0
  226. data/lib/ddtrace/contrib/kafka/events/produce_operation/send_messages.rb +1 -0
  227. data/lib/ddtrace/contrib/kafka/events/producer/deliver_messages.rb +1 -0
  228. data/lib/ddtrace/contrib/kafka/ext.rb +1 -0
  229. data/lib/ddtrace/contrib/kafka/integration.rb +1 -0
  230. data/lib/ddtrace/contrib/kafka/patcher.rb +1 -0
  231. data/lib/ddtrace/contrib/lograge/configuration/settings.rb +19 -0
  232. data/lib/ddtrace/contrib/lograge/ext.rb +11 -0
  233. data/lib/ddtrace/contrib/lograge/instrumentation.rb +39 -0
  234. data/lib/ddtrace/contrib/lograge/integration.rb +46 -0
  235. data/lib/ddtrace/contrib/lograge/patcher.rb +26 -0
  236. data/lib/ddtrace/contrib/mongodb/configuration/settings.rb +1 -0
  237. data/lib/ddtrace/contrib/mongodb/ext.rb +1 -0
  238. data/lib/ddtrace/contrib/mongodb/instrumentation.rb +5 -2
  239. data/lib/ddtrace/contrib/mongodb/integration.rb +1 -0
  240. data/lib/ddtrace/contrib/mongodb/parsers.rb +1 -0
  241. data/lib/ddtrace/contrib/mongodb/patcher.rb +3 -2
  242. data/lib/ddtrace/contrib/mongodb/subscribers.rb +3 -3
  243. data/lib/ddtrace/contrib/mysql2/configuration/settings.rb +1 -0
  244. data/lib/ddtrace/contrib/mysql2/ext.rb +1 -0
  245. data/lib/ddtrace/contrib/mysql2/instrumentation.rb +2 -1
  246. data/lib/ddtrace/contrib/mysql2/integration.rb +1 -0
  247. data/lib/ddtrace/contrib/mysql2/patcher.rb +2 -1
  248. data/lib/ddtrace/contrib/patchable.rb +21 -9
  249. data/lib/ddtrace/contrib/patcher.rb +12 -8
  250. data/lib/ddtrace/contrib/presto/configuration/settings.rb +1 -0
  251. data/lib/ddtrace/contrib/presto/ext.rb +1 -0
  252. data/lib/ddtrace/contrib/presto/instrumentation.rb +2 -1
  253. data/lib/ddtrace/contrib/presto/integration.rb +1 -0
  254. data/lib/ddtrace/contrib/presto/patcher.rb +7 -3
  255. data/lib/ddtrace/contrib/qless/configuration/settings.rb +36 -0
  256. data/lib/ddtrace/contrib/qless/ext.rb +21 -0
  257. data/lib/ddtrace/contrib/qless/integration.rb +39 -0
  258. data/lib/ddtrace/contrib/qless/patcher.rb +35 -0
  259. data/lib/ddtrace/contrib/qless/qless_job.rb +74 -0
  260. data/lib/ddtrace/contrib/qless/tracer_cleaner.rb +34 -0
  261. data/lib/ddtrace/contrib/que/configuration/settings.rb +2 -0
  262. data/lib/ddtrace/contrib/que/ext.rb +20 -19
  263. data/lib/ddtrace/contrib/que/integration.rb +1 -0
  264. data/lib/ddtrace/contrib/que/patcher.rb +1 -0
  265. data/lib/ddtrace/contrib/que/tracer.rb +4 -2
  266. data/lib/ddtrace/contrib/racecar/configuration/settings.rb +1 -0
  267. data/lib/ddtrace/contrib/racecar/event.rb +4 -2
  268. data/lib/ddtrace/contrib/racecar/events.rb +1 -0
  269. data/lib/ddtrace/contrib/racecar/events/batch.rb +1 -0
  270. data/lib/ddtrace/contrib/racecar/events/consume.rb +1 -0
  271. data/lib/ddtrace/contrib/racecar/events/message.rb +1 -0
  272. data/lib/ddtrace/contrib/racecar/ext.rb +1 -0
  273. data/lib/ddtrace/contrib/racecar/integration.rb +1 -0
  274. data/lib/ddtrace/contrib/racecar/patcher.rb +1 -0
  275. data/lib/ddtrace/contrib/rack/configuration/settings.rb +4 -3
  276. data/lib/ddtrace/contrib/rack/ext.rb +1 -0
  277. data/lib/ddtrace/contrib/rack/integration.rb +8 -0
  278. data/lib/ddtrace/contrib/rack/middlewares.rb +8 -12
  279. data/lib/ddtrace/contrib/rack/patcher.rb +2 -3
  280. data/lib/ddtrace/contrib/rack/request_queue.rb +7 -1
  281. data/lib/ddtrace/contrib/rails/auto_instrument_railtie.rb +11 -0
  282. data/lib/ddtrace/contrib/rails/configuration/settings.rb +1 -0
  283. data/lib/ddtrace/contrib/rails/ext.rb +1 -0
  284. data/lib/ddtrace/contrib/rails/framework.rb +26 -1
  285. data/lib/ddtrace/contrib/rails/integration.rb +1 -0
  286. data/lib/ddtrace/contrib/rails/log_injection.rb +1 -40
  287. data/lib/ddtrace/contrib/rails/middlewares.rb +1 -0
  288. data/lib/ddtrace/contrib/rails/patcher.rb +29 -8
  289. data/lib/ddtrace/contrib/rails/railtie.rb +1 -0
  290. data/lib/ddtrace/contrib/rails/utils.rb +5 -0
  291. data/lib/ddtrace/contrib/rake/configuration/settings.rb +1 -0
  292. data/lib/ddtrace/contrib/rake/ext.rb +1 -0
  293. data/lib/ddtrace/contrib/rake/instrumentation.rb +6 -3
  294. data/lib/ddtrace/contrib/rake/integration.rb +2 -1
  295. data/lib/ddtrace/contrib/rake/patcher.rb +2 -1
  296. data/lib/ddtrace/contrib/redis/configuration/resolver.rb +15 -5
  297. data/lib/ddtrace/contrib/redis/configuration/settings.rb +6 -0
  298. data/lib/ddtrace/contrib/redis/ext.rb +2 -0
  299. data/lib/ddtrace/contrib/redis/integration.rb +1 -0
  300. data/lib/ddtrace/contrib/redis/patcher.rb +21 -3
  301. data/lib/ddtrace/contrib/redis/quantize.rb +29 -0
  302. data/lib/ddtrace/contrib/redis/tags.rb +6 -1
  303. data/lib/ddtrace/contrib/redis/vendor/LICENSE +20 -0
  304. data/lib/ddtrace/contrib/redis/vendor/resolver.rb +7 -7
  305. data/lib/ddtrace/contrib/registerable.rb +5 -4
  306. data/lib/ddtrace/contrib/registry.rb +3 -2
  307. data/lib/ddtrace/contrib/resque/configuration/settings.rb +19 -1
  308. data/lib/ddtrace/contrib/resque/ext.rb +1 -0
  309. data/lib/ddtrace/contrib/resque/integration.rb +3 -2
  310. data/lib/ddtrace/contrib/resque/patcher.rb +5 -4
  311. data/lib/ddtrace/contrib/resque/resque_job.rb +26 -2
  312. data/lib/ddtrace/contrib/rest_client/configuration/settings.rb +1 -0
  313. data/lib/ddtrace/contrib/rest_client/ext.rb +1 -0
  314. data/lib/ddtrace/contrib/rest_client/integration.rb +1 -0
  315. data/lib/ddtrace/contrib/rest_client/patcher.rb +3 -1
  316. data/lib/ddtrace/contrib/rest_client/request_patch.rb +3 -4
  317. data/lib/ddtrace/contrib/semantic_logger/configuration/settings.rb +19 -0
  318. data/lib/ddtrace/contrib/semantic_logger/ext.rb +11 -0
  319. data/lib/ddtrace/contrib/semantic_logger/instrumentation.rb +43 -0
  320. data/lib/ddtrace/contrib/semantic_logger/integration.rb +48 -0
  321. data/lib/ddtrace/contrib/semantic_logger/patcher.rb +26 -0
  322. data/lib/ddtrace/contrib/sequel/configuration/settings.rb +1 -0
  323. data/lib/ddtrace/contrib/sequel/database.rb +2 -1
  324. data/lib/ddtrace/contrib/sequel/dataset.rb +2 -1
  325. data/lib/ddtrace/contrib/sequel/ext.rb +1 -0
  326. data/lib/ddtrace/contrib/sequel/integration.rb +1 -0
  327. data/lib/ddtrace/contrib/sequel/patcher.rb +3 -2
  328. data/lib/ddtrace/contrib/sequel/utils.rb +6 -6
  329. data/lib/ddtrace/contrib/shoryuken/configuration/settings.rb +3 -0
  330. data/lib/ddtrace/contrib/shoryuken/ext.rb +1 -0
  331. data/lib/ddtrace/contrib/shoryuken/integration.rb +1 -0
  332. data/lib/ddtrace/contrib/shoryuken/patcher.rb +1 -0
  333. data/lib/ddtrace/contrib/shoryuken/tracer.rb +9 -2
  334. data/lib/ddtrace/contrib/sidekiq/client_tracer.rb +1 -0
  335. data/lib/ddtrace/contrib/sidekiq/configuration/settings.rb +2 -0
  336. data/lib/ddtrace/contrib/sidekiq/ext.rb +1 -0
  337. data/lib/ddtrace/contrib/sidekiq/integration.rb +1 -0
  338. data/lib/ddtrace/contrib/sidekiq/patcher.rb +1 -0
  339. data/lib/ddtrace/contrib/sidekiq/server_tracer.rb +6 -7
  340. data/lib/ddtrace/contrib/sidekiq/tracing.rb +1 -1
  341. data/lib/ddtrace/contrib/sinatra/configuration/settings.rb +1 -0
  342. data/lib/ddtrace/contrib/sinatra/env.rb +2 -3
  343. data/lib/ddtrace/contrib/sinatra/ext.rb +1 -0
  344. data/lib/ddtrace/contrib/sinatra/headers.rb +2 -3
  345. data/lib/ddtrace/contrib/sinatra/integration.rb +1 -0
  346. data/lib/ddtrace/contrib/sinatra/patcher.rb +3 -1
  347. data/lib/ddtrace/contrib/sinatra/tracer.rb +14 -6
  348. data/lib/ddtrace/contrib/sinatra/tracer_middleware.rb +13 -6
  349. data/lib/ddtrace/contrib/sneakers/configuration/settings.rb +2 -0
  350. data/lib/ddtrace/contrib/sneakers/ext.rb +12 -11
  351. data/lib/ddtrace/contrib/sneakers/integration.rb +1 -0
  352. data/lib/ddtrace/contrib/sneakers/patcher.rb +1 -0
  353. data/lib/ddtrace/contrib/sneakers/tracer.rb +17 -21
  354. data/lib/ddtrace/contrib/status_code_matcher.rb +70 -0
  355. data/lib/ddtrace/contrib/sucker_punch/configuration/settings.rb +1 -0
  356. data/lib/ddtrace/contrib/sucker_punch/exception_handler.rb +5 -6
  357. data/lib/ddtrace/contrib/sucker_punch/ext.rb +1 -0
  358. data/lib/ddtrace/contrib/sucker_punch/instrumentation.rb +5 -0
  359. data/lib/ddtrace/contrib/sucker_punch/integration.rb +1 -0
  360. data/lib/ddtrace/contrib/sucker_punch/patcher.rb +2 -0
  361. data/lib/ddtrace/correlation.rb +3 -1
  362. data/lib/ddtrace/diagnostics/environment_logger.rb +9 -7
  363. data/lib/ddtrace/diagnostics/health.rb +1 -0
  364. data/lib/ddtrace/distributed_tracing/headers/b3.rb +1 -0
  365. data/lib/ddtrace/distributed_tracing/headers/b3_single.rb +1 -0
  366. data/lib/ddtrace/distributed_tracing/headers/datadog.rb +1 -0
  367. data/lib/ddtrace/distributed_tracing/headers/headers.rb +2 -0
  368. data/lib/ddtrace/distributed_tracing/headers/helpers.rb +2 -3
  369. data/lib/ddtrace/encoding.rb +3 -0
  370. data/lib/ddtrace/error.rb +78 -8
  371. data/lib/ddtrace/event.rb +1 -0
  372. data/lib/ddtrace/ext/analytics.rb +1 -0
  373. data/lib/ddtrace/ext/app_types.rb +1 -0
  374. data/lib/ddtrace/ext/correlation.rb +1 -0
  375. data/lib/ddtrace/ext/diagnostics.rb +1 -0
  376. data/lib/ddtrace/ext/distributed.rb +9 -2
  377. data/lib/ddtrace/ext/environment.rb +8 -0
  378. data/lib/ddtrace/ext/errors.rb +1 -0
  379. data/lib/ddtrace/ext/forced_tracing.rb +1 -0
  380. data/lib/ddtrace/ext/git.rb +20 -0
  381. data/lib/ddtrace/ext/http.rb +2 -1
  382. data/lib/ddtrace/ext/integration.rb +1 -0
  383. data/lib/ddtrace/ext/manual_tracing.rb +1 -0
  384. data/lib/ddtrace/ext/metrics.rb +1 -0
  385. data/lib/ddtrace/ext/net.rb +1 -0
  386. data/lib/ddtrace/ext/priority.rb +1 -0
  387. data/lib/ddtrace/ext/profiling.rb +56 -0
  388. data/lib/ddtrace/ext/runtime.rb +2 -7
  389. data/lib/ddtrace/ext/sampling.rb +1 -0
  390. data/lib/ddtrace/ext/sql.rb +1 -0
  391. data/lib/ddtrace/ext/test.rb +9 -0
  392. data/lib/ddtrace/ext/transport.rb +3 -0
  393. data/lib/ddtrace/forced_tracing.rb +3 -0
  394. data/lib/ddtrace/logger.rb +2 -1
  395. data/lib/ddtrace/metrics.rb +84 -24
  396. data/lib/ddtrace/opentelemetry/extensions.rb +2 -1
  397. data/lib/ddtrace/opentelemetry/span.rb +1 -0
  398. data/lib/ddtrace/opentracer.rb +21 -39
  399. data/lib/ddtrace/opentracer/binary_propagator.rb +1 -0
  400. data/lib/ddtrace/opentracer/carrier.rb +1 -0
  401. data/lib/ddtrace/opentracer/distributed_headers.rb +4 -0
  402. data/lib/ddtrace/opentracer/global_tracer.rb +1 -0
  403. data/lib/ddtrace/opentracer/propagator.rb +1 -0
  404. data/lib/ddtrace/opentracer/rack_propagator.rb +1 -0
  405. data/lib/ddtrace/opentracer/scope.rb +1 -0
  406. data/lib/ddtrace/opentracer/scope_manager.rb +1 -0
  407. data/lib/ddtrace/opentracer/span.rb +3 -6
  408. data/lib/ddtrace/opentracer/span_context.rb +1 -0
  409. data/lib/ddtrace/opentracer/span_context_factory.rb +1 -0
  410. data/lib/ddtrace/opentracer/text_map_propagator.rb +1 -0
  411. data/lib/ddtrace/opentracer/thread_local_scope.rb +2 -0
  412. data/lib/ddtrace/opentracer/thread_local_scope_manager.rb +1 -0
  413. data/lib/ddtrace/opentracer/tracer.rb +1 -0
  414. data/lib/ddtrace/patcher.rb +28 -6
  415. data/lib/ddtrace/pin.rb +9 -61
  416. data/lib/ddtrace/pipeline.rb +1 -0
  417. data/lib/ddtrace/pipeline/span_filter.rb +2 -1
  418. data/lib/ddtrace/pipeline/span_processor.rb +1 -0
  419. data/lib/ddtrace/profiling.rb +151 -0
  420. data/lib/ddtrace/profiling/backtrace_location.rb +33 -0
  421. data/lib/ddtrace/profiling/buffer.rb +42 -0
  422. data/lib/ddtrace/profiling/collectors/stack.rb +257 -0
  423. data/lib/ddtrace/profiling/encoding/profile.rb +38 -0
  424. data/lib/ddtrace/profiling/event.rb +14 -0
  425. data/lib/ddtrace/profiling/events/stack.rb +81 -0
  426. data/lib/ddtrace/profiling/exporter.rb +24 -0
  427. data/lib/ddtrace/profiling/ext/cpu.rb +67 -0
  428. data/lib/ddtrace/profiling/ext/cthread.rb +156 -0
  429. data/lib/ddtrace/profiling/ext/forking.rb +98 -0
  430. data/lib/ddtrace/profiling/flush.rb +44 -0
  431. data/lib/ddtrace/profiling/native_extension.rb +18 -0
  432. data/lib/ddtrace/profiling/pprof/builder.rb +120 -0
  433. data/lib/ddtrace/profiling/pprof/converter.rb +90 -0
  434. data/lib/ddtrace/profiling/pprof/message_set.rb +15 -0
  435. data/lib/ddtrace/profiling/pprof/payload.rb +19 -0
  436. data/lib/ddtrace/profiling/pprof/pprof.proto +212 -0
  437. data/lib/ddtrace/profiling/pprof/pprof_pb.rb +82 -0
  438. data/lib/ddtrace/profiling/pprof/stack_sample.rb +117 -0
  439. data/lib/ddtrace/profiling/pprof/string_table.rb +11 -0
  440. data/lib/ddtrace/profiling/pprof/template.rb +119 -0
  441. data/lib/ddtrace/profiling/preload.rb +4 -0
  442. data/lib/ddtrace/profiling/profiler.rb +31 -0
  443. data/lib/ddtrace/profiling/recorder.rb +96 -0
  444. data/lib/ddtrace/profiling/scheduler.rb +134 -0
  445. data/lib/ddtrace/profiling/tasks/setup.rb +82 -0
  446. data/lib/ddtrace/profiling/trace_identifiers/ddtrace.rb +41 -0
  447. data/lib/ddtrace/profiling/trace_identifiers/helper.rb +46 -0
  448. data/lib/ddtrace/profiling/transport/client.rb +15 -0
  449. data/lib/ddtrace/profiling/transport/http.rb +120 -0
  450. data/lib/ddtrace/profiling/transport/http/api.rb +44 -0
  451. data/lib/ddtrace/profiling/transport/http/api/endpoint.rb +101 -0
  452. data/lib/ddtrace/profiling/transport/http/api/instance.rb +37 -0
  453. data/lib/ddtrace/profiling/transport/http/api/spec.rb +41 -0
  454. data/lib/ddtrace/profiling/transport/http/builder.rb +29 -0
  455. data/lib/ddtrace/profiling/transport/http/client.rb +34 -0
  456. data/lib/ddtrace/profiling/transport/http/response.rb +22 -0
  457. data/lib/ddtrace/profiling/transport/io.rb +31 -0
  458. data/lib/ddtrace/profiling/transport/io/client.rb +28 -0
  459. data/lib/ddtrace/profiling/transport/io/response.rb +17 -0
  460. data/lib/ddtrace/profiling/transport/parcel.rb +18 -0
  461. data/lib/ddtrace/profiling/transport/request.rb +16 -0
  462. data/lib/ddtrace/profiling/transport/response.rb +9 -0
  463. data/lib/ddtrace/propagation/grpc_propagator.rb +18 -4
  464. data/lib/ddtrace/propagation/http_propagator.rb +18 -2
  465. data/lib/ddtrace/quantization/hash.rb +1 -0
  466. data/lib/ddtrace/quantization/http.rb +4 -0
  467. data/lib/ddtrace/runtime/metrics.rb +21 -14
  468. data/lib/ddtrace/sampler.rb +2 -1
  469. data/lib/ddtrace/sampling.rb +1 -0
  470. data/lib/ddtrace/sampling/matcher.rb +1 -0
  471. data/lib/ddtrace/sampling/rate_limiter.rb +66 -16
  472. data/lib/ddtrace/sampling/rule.rb +2 -1
  473. data/lib/ddtrace/sampling/rule_sampler.rb +6 -10
  474. data/lib/ddtrace/span.rb +44 -19
  475. data/lib/ddtrace/sync_writer.rb +17 -15
  476. data/lib/ddtrace/tasks/exec.rb +47 -0
  477. data/lib/ddtrace/tasks/help.rb +15 -0
  478. data/lib/ddtrace/tracer.rb +68 -57
  479. data/lib/ddtrace/transport/http.rb +51 -38
  480. data/lib/ddtrace/transport/http/adapters/net.rb +28 -8
  481. data/lib/ddtrace/transport/http/adapters/registry.rb +2 -0
  482. data/lib/ddtrace/transport/http/adapters/test.rb +1 -0
  483. data/lib/ddtrace/transport/http/adapters/unix_socket.rb +3 -4
  484. data/lib/ddtrace/transport/http/api.rb +1 -0
  485. data/lib/ddtrace/transport/http/api/endpoint.rb +1 -0
  486. data/lib/ddtrace/transport/http/api/fallbacks.rb +1 -0
  487. data/lib/ddtrace/transport/http/api/instance.rb +1 -0
  488. data/lib/ddtrace/transport/http/api/map.rb +1 -0
  489. data/lib/ddtrace/transport/http/api/spec.rb +1 -0
  490. data/lib/ddtrace/transport/http/builder.rb +8 -1
  491. data/lib/ddtrace/transport/http/client.rb +3 -1
  492. data/lib/ddtrace/transport/http/env.rb +9 -0
  493. data/lib/ddtrace/transport/http/response.rb +1 -0
  494. data/lib/ddtrace/transport/http/statistics.rb +3 -2
  495. data/lib/ddtrace/transport/http/traces.rb +6 -6
  496. data/lib/ddtrace/transport/io.rb +2 -1
  497. data/lib/ddtrace/transport/io/client.rb +17 -9
  498. data/lib/ddtrace/transport/io/response.rb +2 -3
  499. data/lib/ddtrace/transport/io/traces.rb +10 -1
  500. data/lib/ddtrace/transport/parcel.rb +7 -0
  501. data/lib/ddtrace/transport/request.rb +1 -0
  502. data/lib/ddtrace/transport/response.rb +1 -0
  503. data/lib/ddtrace/transport/statistics.rb +1 -0
  504. data/lib/ddtrace/transport/traces.rb +21 -3
  505. data/lib/ddtrace/utils.rb +23 -12
  506. data/lib/ddtrace/utils/compression.rb +28 -0
  507. data/lib/ddtrace/utils/database.rb +1 -0
  508. data/lib/ddtrace/utils/forking.rb +53 -0
  509. data/lib/ddtrace/utils/object_set.rb +40 -0
  510. data/lib/ddtrace/utils/only_once.rb +41 -0
  511. data/lib/ddtrace/utils/sequence.rb +18 -0
  512. data/lib/ddtrace/utils/string_table.rb +46 -0
  513. data/lib/ddtrace/utils/time.rb +34 -2
  514. data/lib/ddtrace/vendor/active_record/MIT-LICENSE +20 -0
  515. data/lib/ddtrace/vendor/active_record/connection_specification.rb +1 -0
  516. data/lib/ddtrace/vendor/multipart-post/LICENSE +11 -0
  517. data/lib/ddtrace/vendor/multipart-post/multipart.rb +13 -0
  518. data/lib/ddtrace/vendor/multipart-post/multipart/post.rb +9 -0
  519. data/lib/ddtrace/vendor/multipart-post/multipart/post/composite_read_io.rb +117 -0
  520. data/lib/ddtrace/vendor/multipart-post/multipart/post/multipartable.rb +58 -0
  521. data/lib/ddtrace/vendor/multipart-post/multipart/post/parts.rb +136 -0
  522. data/lib/ddtrace/vendor/multipart-post/multipart/post/version.rb +10 -0
  523. data/lib/ddtrace/vendor/multipart-post/net/http/post/multipart.rb +33 -0
  524. data/lib/ddtrace/version.rb +15 -2
  525. data/lib/ddtrace/worker.rb +1 -0
  526. data/lib/ddtrace/workers.rb +8 -2
  527. data/lib/ddtrace/workers/async.rb +15 -5
  528. data/lib/ddtrace/workers/loop.rb +32 -5
  529. data/lib/ddtrace/workers/polling.rb +13 -5
  530. data/lib/ddtrace/workers/queue.rb +3 -1
  531. data/lib/ddtrace/workers/runtime_metrics.rb +22 -4
  532. data/lib/ddtrace/workers/trace_writer.rb +14 -16
  533. data/lib/ddtrace/writer.rb +33 -8
  534. metadata +149 -388
  535. data/.circleci/config.yml +0 -548
  536. data/.circleci/images/primary/Dockerfile-2.0.0 +0 -73
  537. data/.circleci/images/primary/Dockerfile-2.1.10 +0 -73
  538. data/.circleci/images/primary/Dockerfile-2.2.10 +0 -73
  539. data/.circleci/images/primary/Dockerfile-2.3.8 +0 -75
  540. data/.circleci/images/primary/Dockerfile-2.4.6 +0 -73
  541. data/.circleci/images/primary/Dockerfile-2.5.6 +0 -73
  542. data/.circleci/images/primary/Dockerfile-2.6.4 +0 -73
  543. data/.circleci/images/primary/Dockerfile-2.7.0 +0 -73
  544. data/.circleci/images/primary/Dockerfile-jruby-9.2 +0 -77
  545. data/.dockerignore +0 -1
  546. data/.env +0 -26
  547. data/.github/CODEOWNERS +0 -1
  548. data/.gitlab-ci.yml +0 -27
  549. data/.rspec +0 -1
  550. data/.rubocop.yml +0 -85
  551. data/.simplecov +0 -38
  552. data/Appraisals +0 -1071
  553. data/Gemfile +0 -7
  554. data/Rakefile +0 -768
  555. data/benchmarks/postgres_database.yml +0 -9
  556. data/benchmarks/sidekiq_test.rb +0 -154
  557. data/docker-compose.yml +0 -370
  558. data/lib/ddtrace/augmentation.rb +0 -13
  559. data/lib/ddtrace/augmentation/method_wrapper.rb +0 -20
  560. data/lib/ddtrace/augmentation/method_wrapping.rb +0 -38
  561. data/lib/ddtrace/augmentation/shim.rb +0 -102
  562. data/lib/ddtrace/environment.rb +0 -41
  563. data/lib/ddtrace/monkey.rb +0 -58
  564. data/lib/ddtrace/runtime/cgroup.rb +0 -44
  565. data/lib/ddtrace/runtime/class_count.rb +0 -17
  566. data/lib/ddtrace/runtime/container.rb +0 -73
  567. data/lib/ddtrace/runtime/gc.rb +0 -16
  568. data/lib/ddtrace/runtime/identity.rb +0 -41
  569. data/lib/ddtrace/runtime/object_space.rb +0 -19
  570. data/lib/ddtrace/runtime/socket.rb +0 -14
  571. data/lib/ddtrace/runtime/thread_count.rb +0 -16
  572. data/tasks/release_gem.rake +0 -28
@@ -1,3 +1,4 @@
1
+ # typed: true
1
2
  require 'forwardable'
2
3
 
3
4
  require 'ddtrace/sampling/matcher'
@@ -28,7 +29,7 @@ module Datadog
28
29
  def match?(span)
29
30
  @matcher.match?(span)
30
31
  rescue => e
31
- Datadog.logger.error("Matcher failed. Cause: #{e.message} Source: #{e.backtrace.first}")
32
+ Datadog.logger.error("Matcher failed. Cause: #{e.message} Source: #{Array(e.backtrace).first}")
32
33
  nil
33
34
  end
34
35
 
@@ -1,3 +1,4 @@
1
+ # typed: true
1
2
  require 'forwardable'
2
3
 
3
4
  require 'ddtrace/ext/priority'
@@ -5,6 +6,7 @@ require 'ddtrace/ext/priority'
5
6
  require 'ddtrace/ext/sampling'
6
7
  require 'ddtrace/sampler'
7
8
  require 'ddtrace/sampling/rate_limiter'
9
+ require 'ddtrace/sampling/rule'
8
10
 
9
11
  module Datadog
10
12
  module Sampling
@@ -45,15 +47,8 @@ module Datadog
45
47
  @default_sampler = if default_sampler
46
48
  default_sampler
47
49
  elsif default_sample_rate
48
- # We want to allow 0.0 to drop all traces, but \RateSampler
49
- # considers 0.0 an invalid rate and falls back to 100% sampling.
50
- #
51
- # We address that here by not setting the rate in the constructor,
52
- # but using the setter method.
53
- #
54
- # We don't want to make this change directly to \RateSampler
55
- # because it breaks its current contract to existing users.
56
- Datadog::RateSampler.new.tap { |s| s.sample_rate = default_sample_rate }
50
+ # Add to the end of the rule list a rule always matches any span
51
+ @rules << SimpleRule.new(sample_rate: default_sample_rate)
57
52
  else
58
53
  RateByServiceSampler.new(1.0, env: -> { Datadog.tracer.tags[:env] })
59
54
  end
@@ -88,6 +83,7 @@ module Datadog
88
83
 
89
84
  def update(*args)
90
85
  return false unless @default_sampler.respond_to?(:update)
86
+
91
87
  @default_sampler.update(*args)
92
88
  end
93
89
 
@@ -109,7 +105,7 @@ module Datadog
109
105
  set_limiter_metrics(span, rate_limiter.effective_rate)
110
106
  end
111
107
  rescue StandardError => e
112
- Datadog.logger.error("Rule sampling failed. Cause: #{e.message} Source: #{e.backtrace.first}")
108
+ Datadog.logger.error("Rule sampling failed. Cause: #{e.message} Source: #{Array(e.backtrace).first}")
113
109
  yield(span)
114
110
  end
115
111
 
data/lib/ddtrace/span.rb CHANGED
@@ -1,12 +1,14 @@
1
+ # typed: true
1
2
  # frozen_string_literal: true
2
3
 
3
4
  require 'time'
4
- require 'thread'
5
-
6
5
  require 'ddtrace/utils'
6
+ require 'ddtrace/ext/distributed'
7
+ require 'ddtrace/ext/environment'
7
8
  require 'ddtrace/ext/errors'
9
+ require 'ddtrace/ext/http'
10
+ require 'ddtrace/ext/net'
8
11
  require 'ddtrace/ext/priority'
9
- require 'ddtrace/environment'
10
12
  require 'ddtrace/analytics'
11
13
  require 'ddtrace/forced_tracing'
12
14
  require 'ddtrace/diagnostics/health'
@@ -38,14 +40,32 @@ module Datadog
38
40
  EXTERNAL_MAX_ID = 1 << 64
39
41
 
40
42
  # This limit is for numeric tags because uint64 could end up rounded.
41
- NUMERIC_TAG_SIZE_RANGE = (-1 << 53..1 << 53)
42
-
43
- attr_accessor :name, :service, :resource, :span_type,
43
+ NUMERIC_TAG_SIZE_RANGE = (-1 << 53..1 << 53).freeze
44
+
45
+ # Some associated values should always be sent as Tags, never as Metrics, regardless
46
+ # if their value is numeric or not.
47
+ # The Datadog agent will look for these values only as Tags, not Metrics.
48
+ # @see https://github.com/DataDog/datadog-agent/blob/2ae2cdd315bcda53166dd8fa0dedcfc448087b9d/pkg/trace/stats/aggregation.go#L13-L17
49
+ ENSURE_AGENT_TAGS = {
50
+ Ext::DistributedTracing::ORIGIN_KEY => true,
51
+ Ext::Environment::TAG_VERSION => true,
52
+ Ext::HTTP::STATUS_CODE => true,
53
+ Ext::NET::TAG_HOSTNAME => true
54
+ }.freeze
55
+
56
+ # Simple indirection used to contain the latest resource name for a span.
57
+ # The profiler keeps a reference to these objects while sampling so it can extract the latest resource after the
58
+ # fact, as some integrations only set the correct name at the end of the span.
59
+ ResourceContainer = Struct.new(:latest)
60
+
61
+ attr_accessor :name, :service, :span_type,
44
62
  :span_id, :trace_id, :parent_id,
45
63
  :status, :sampled,
46
- :tracer, :context, :duration, :start_time, :end_time
64
+ :tracer, :context
47
65
 
48
- attr_reader :parent
66
+ attr_reader :parent, :start_time, :end_time, :resource_container
67
+
68
+ attr_writer :duration
49
69
 
50
70
  # Create a new span linked to the given tracer. Call the \Tracer method <tt>start_span()</tt>
51
71
  # and then <tt>finish()</tt> once the tracer operation is over.
@@ -61,7 +81,7 @@ module Datadog
61
81
 
62
82
  @name = name
63
83
  @service = options.fetch(:service, nil)
64
- @resource = options.fetch(:resource, name)
84
+ @resource_container = ResourceContainer.new(options.fetch(:resource, name))
65
85
  @span_type = options.fetch(:span_type, nil)
66
86
 
67
87
  @span_id = Datadog::Utils.next_id
@@ -101,11 +121,8 @@ module Datadog
101
121
  # Keys must be unique between tags and metrics
102
122
  @metrics.delete(key)
103
123
 
104
- # Ensure `http.status_code` is always a string so it is added to
105
- # @meta instead of @metrics
106
- # DEV: This is necessary because the agent looks to `meta['http.status_code']` for
107
- # tagging necessary metrics
108
- value = value.to_s if key == Ext::HTTP::STATUS_CODE
124
+ # DEV: This is necessary because the agent looks at `meta[key]`, not `metrics[key]`.
125
+ value = value.to_s if ENSURE_AGENT_TAGS[key]
109
126
 
110
127
  # NOTE: Adding numeric tags as metrics is stop-gap support
111
128
  # for numeric typed tags. Eventually they will become
@@ -180,7 +197,7 @@ module Datadog
180
197
  # behavior and so we maintain it for backward compatibility for those
181
198
  # who are using async manual instrumentation that may rely on this
182
199
 
183
- @start_time = start_time || Time.now.utc
200
+ @start_time = start_time || Utils::Time.now.utc
184
201
  @duration_start = start_time.nil? ? duration_marker : nil
185
202
 
186
203
  self
@@ -206,7 +223,7 @@ module Datadog
206
223
 
207
224
  @allocation_count_finish = now_allocations
208
225
 
209
- now = Time.now.utc
226
+ now = Utils::Time.now.utc
210
227
 
211
228
  # Provide a default start_time if unset.
212
229
  # Using `now` here causes duration to be 0; this is expected
@@ -272,7 +289,7 @@ module Datadog
272
289
  trace_id: @trace_id,
273
290
  name: @name,
274
291
  service: @service,
275
- resource: @resource,
292
+ resource: resource,
276
293
  type: @span_type,
277
294
  meta: @meta,
278
295
  metrics: @metrics,
@@ -326,7 +343,7 @@ module Datadog
326
343
  packer.write('service')
327
344
  packer.write(@service)
328
345
  packer.write('resource')
329
- packer.write(@resource)
346
+ packer.write(resource)
330
347
  packer.write('type')
331
348
  packer.write(@span_type)
332
349
  packer.write('meta')
@@ -358,7 +375,7 @@ module Datadog
358
375
  q.text "Trace ID: #{@trace_id}\n"
359
376
  q.text "Type: #{@span_type}\n"
360
377
  q.text "Service: #{@service}\n"
361
- q.text "Resource: #{@resource}\n"
378
+ q.text "Resource: #{resource}\n"
362
379
  q.text "Error: #{@status}\n"
363
380
  q.text "Start: #{start_time}\n"
364
381
  q.text "End: #{end_time}\n"
@@ -397,6 +414,14 @@ module Datadog
397
414
  end
398
415
  end
399
416
 
417
+ def resource
418
+ @resource_container.latest
419
+ end
420
+
421
+ def resource=(resource)
422
+ @resource_container.latest = resource
423
+ end
424
+
400
425
  private
401
426
 
402
427
  def duration_marker
@@ -1,11 +1,19 @@
1
+ # typed: true
1
2
  require 'ddtrace/ext/net'
2
- require 'ddtrace/runtime/socket'
3
+ require 'datadog/core/environment/socket'
3
4
  require 'ddtrace/runtime/metrics'
5
+ require 'ddtrace/utils/only_once'
4
6
 
5
7
  module Datadog
6
8
  # SyncWriter flushes both services and traces synchronously
7
9
  # DEV: To be replaced by Datadog::Workers::TraceWriter.
10
+ #
11
+ # Note: If you're wondering if this class is used at all, since there are no other references to it on the codebase,
12
+ # the separate `datadog-lambda` uses it as of February 2021:
13
+ # <https://github.com/DataDog/datadog-lambda-rb/blob/c15f0f0916c90123416dc44e7d6800ef4a7cfdbf/lib/datadog/lambda.rb#L38>
8
14
  class SyncWriter
15
+ DEPRECATION_WARN_ONLY_ONCE = Datadog::Utils::OnlyOnce.new
16
+
9
17
  attr_reader \
10
18
  :priority_sampler,
11
19
  :transport
@@ -13,7 +21,8 @@ module Datadog
13
21
  def initialize(options = {})
14
22
  @transport = options.fetch(:transport) do
15
23
  transport_options = options.fetch(:transport_options, {})
16
- Transport::HTTP.default(transport_options)
24
+ transport_options[:agent_settings] = options[:agent_settings] if options.key?(:agent_settings)
25
+ Transport::HTTP.default(**transport_options)
17
26
  end
18
27
 
19
28
  @priority_sampler = options.fetch(:priority_sampler, nil)
@@ -21,17 +30,15 @@ module Datadog
21
30
 
22
31
  def write(trace, services = nil)
23
32
  unless services.nil?
24
- Datadog::Patcher.do_once('SyncWriter#write') do
33
+ DEPRECATION_WARN_ONLY_ONCE.run do
25
34
  Datadog.logger.warn(%(
26
35
  write: Writing services has been deprecated and no longer need to be provided.
27
- write(traces, services) can be updted to write(traces)
36
+ write(traces, services) can be updated to write(traces)
28
37
  ))
29
38
  end
30
39
  end
31
40
 
32
- perform_concurrently(
33
- proc { flush_trace(trace) }
34
- )
41
+ flush_trace(trace)
35
42
  rescue => e
36
43
  Datadog.logger.debug(e)
37
44
  end
@@ -44,23 +51,18 @@ module Datadog
44
51
 
45
52
  private
46
53
 
47
- def perform_concurrently(*tasks)
48
- tasks.map { |task| Thread.new(&task) }.each(&:join)
49
- end
50
-
51
54
  def flush_trace(trace)
52
55
  processed_traces = Pipeline.process!([trace])
53
56
  return if processed_traces.empty?
57
+
54
58
  inject_hostname!(processed_traces.first) if Datadog.configuration.report_hostname
55
59
  transport.send_traces(processed_traces)
56
60
  end
57
61
 
58
62
  def inject_hostname!(trace)
59
63
  unless trace.first.nil?
60
- hostname = Datadog::Runtime::Socket.hostname
61
- unless hostname.nil? || hostname.empty?
62
- trace.first.set_tag(Ext::NET::TAG_HOSTNAME, hostname)
63
- end
64
+ hostname = Datadog::Core::Environment::Socket.hostname
65
+ trace.first.set_tag(Ext::NET::TAG_HOSTNAME, hostname) unless hostname.nil? || hostname.empty?
64
66
  end
65
67
  end
66
68
  end
@@ -0,0 +1,47 @@
1
+ # typed: true
2
+ module Datadog
3
+ module Tasks
4
+ # Wraps command with Datadog tracing
5
+ class Exec
6
+ attr_reader :args
7
+
8
+ def initialize(args)
9
+ @args = args
10
+ end
11
+
12
+ def run
13
+ set_rubyopt!
14
+ exec_with_error_handling(args)
15
+ end
16
+
17
+ def rubyopts
18
+ [
19
+ '-rddtrace/profiling/preload'
20
+ ]
21
+ end
22
+
23
+ private
24
+
25
+ def set_rubyopt!
26
+ existing_rubyopt = ENV['RUBYOPT']
27
+
28
+ ENV['RUBYOPT'] = existing_rubyopt ? "#{existing_rubyopt} #{rubyopts.join(' ')}" : rubyopts.join(' ')
29
+ end
30
+
31
+ # If there's an error here, rather than throwing a cryptic stack trace, let's instead have clearer messages, and
32
+ # follow the same status codes as the shell uses
33
+ # See also:
34
+ # * https://www.gnu.org/software/bash/manual/html_node/Exit-Status.html
35
+ # * https://github.com/rubygems/rubygems/blob/dd93966cac224532035deda533cba2685dfa30cc/bundler/lib/bundler/cli/exec.rb#L45
36
+ def exec_with_error_handling(args)
37
+ Kernel.exec(*args)
38
+ rescue Errno::ENOENT => e
39
+ Kernel.warn "ddtracerb exec failed: #{e.message} (command was '#{args.join(' ')}')"
40
+ Kernel.exit 127
41
+ rescue Errno::EACCES, Errno::ENOEXEC => e
42
+ Kernel.warn "ddtracerb exec failed: #{e.message} (command was '#{args.join(' ')}')"
43
+ Kernel.exit 126
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,15 @@
1
+ # typed: true
2
+ module Datadog
3
+ module Tasks
4
+ # Prints help message for usage of `ddtrace`
5
+ class Help
6
+ def run
7
+ puts %(
8
+ Usage: ddtrace [command] [arguments]
9
+ exec [command]: Executes command with tracing & profiling preloaded.
10
+ help: Prints this help message.
11
+ )
12
+ end
13
+ end
14
+ end
15
+ end
@@ -1,15 +1,18 @@
1
- require 'thread'
1
+ # typed: true
2
2
  require 'logger'
3
3
  require 'pathname'
4
4
 
5
- require 'ddtrace/environment'
5
+ require 'ddtrace/ext/environment'
6
6
  require 'ddtrace/span'
7
7
  require 'ddtrace/context'
8
8
  require 'ddtrace/logger'
9
9
  require 'ddtrace/writer'
10
+ require 'datadog/core/environment/identity'
10
11
  require 'ddtrace/sampler'
11
12
  require 'ddtrace/sampling'
12
13
  require 'ddtrace/correlation'
14
+ require 'ddtrace/event'
15
+ require 'ddtrace/utils/only_once'
13
16
 
14
17
  # \Datadog global namespace that includes all tracing functionality for Tracer and Span classes.
15
18
  module Datadog
@@ -19,6 +22,9 @@ module Datadog
19
22
  # of these function calls and sub-requests would be encapsulated within a single trace.
20
23
  # rubocop:disable Metrics/ClassLength
21
24
  class Tracer
25
+ SERVICES_DEPRECATION_WARN_ONLY_ONCE = Datadog::Utils::OnlyOnce.new
26
+ SET_SERVICE_INFO_DEPRECATION_WARN_ONLY_ONCE = Datadog::Utils::OnlyOnce.new
27
+
22
28
  attr_reader :sampler, :tags, :provider, :context_flush
23
29
  attr_accessor :enabled, :writer
24
30
  attr_writer :default_service
@@ -27,8 +33,7 @@ module Datadog
27
33
  DEFAULT_ON_ERROR = proc { |span, error| span.set_error(error) unless span.nil? }
28
34
 
29
35
  def services
30
- # Only log each deprecation warning once (safeguard against log spam)
31
- Datadog::Patcher.do_once('Tracer#set_service_info') do
36
+ SERVICES_DEPRECATION_WARN_ONLY_ONCE.run do
32
37
  Datadog.logger.warn('services: Usage of Tracer.services has been deprecated')
33
38
  end
34
39
 
@@ -59,8 +64,8 @@ module Datadog
59
64
  #
60
65
  # This method makes use of a \ContextProvider that is automatically set during the tracer
61
66
  # initialization, or while using a library instrumentation.
62
- def call_context
63
- @provider.context
67
+ def call_context(key = nil)
68
+ @provider.context(key)
64
69
  end
65
70
 
66
71
  # Initialize a new \Tracer used to create, sample and submit spans that measure the
@@ -70,7 +75,9 @@ module Datadog
70
75
  # by default.
71
76
  def initialize(options = {})
72
77
  # Configurable options
73
- @context_flush = if options[:partial_flush]
78
+ @context_flush = if options[:context_flush]
79
+ options[:context_flush]
80
+ elsif options[:partial_flush]
74
81
  Datadog::ContextFlush::Partial.new(options)
75
82
  else
76
83
  Datadog::ContextFlush::Finished.new
@@ -78,14 +85,13 @@ module Datadog
78
85
 
79
86
  @default_service = options[:default_service]
80
87
  @enabled = options.fetch(:enabled, true)
81
- @provider = options.fetch(:context_provider, Datadog::DefaultContextProvider.new)
88
+ @provider = options[:context_provider] || Datadog::DefaultContextProvider.new
82
89
  @sampler = options.fetch(:sampler, Datadog::AllSampler.new)
83
90
  @tags = options.fetch(:tags, {})
84
- @writer = options.fetch(:writer, Datadog::Writer.new)
91
+ @writer = options.fetch(:writer) { Datadog::Writer.new }
85
92
 
86
93
  # Instance variables
87
94
  @mutex = Mutex.new
88
- @provider ||= Datadog::DefaultContextProvider.new # @provider should never be nil
89
95
 
90
96
  # Enable priority sampling by default
91
97
  activate_priority_sampling!(@sampler)
@@ -114,8 +120,10 @@ module Datadog
114
120
 
115
121
  configure_writer(options)
116
122
 
117
- if options.key?(:partial_flush)
118
- @context_flush = if options[:partial_flush]
123
+ if options.key?(:context_flush) || options.key?(:partial_flush)
124
+ @context_flush = if options[:context_flush]
125
+ options[:context_flush]
126
+ elsif options[:partial_flush]
119
127
  Datadog::ContextFlush::Partial.new(options)
120
128
  else
121
129
  Datadog::ContextFlush::Finished.new
@@ -129,8 +137,7 @@ module Datadog
129
137
  #
130
138
  # set_service_info is deprecated, no service information needs to be tracked
131
139
  def set_service_info(service, app, app_type)
132
- # Only log each deprecation warning once (safeguard against log spam)
133
- Datadog::Patcher.do_once('Tracer#set_service_info') do
140
+ SET_SERVICE_INFO_DEPRECATION_WARN_ONLY_ONCE.run do
134
141
  Datadog.logger.warn(%(
135
142
  set_service_info: Usage of set_service_info has been deprecated,
136
143
  service information no longer needs to be reported to the trace agent.
@@ -142,14 +149,7 @@ module Datadog
142
149
  # for non-root spans which have a parent. However, root spans without
143
150
  # a service would be invalid and rejected.
144
151
  def default_service
145
- return @default_service if instance_variable_defined?(:@default_service) && @default_service
146
- begin
147
- @default_service = File.basename($PROGRAM_NAME, '.*')
148
- rescue StandardError => e
149
- Datadog.logger.error("unable to guess default service: #{e}")
150
- @default_service = 'ruby'.freeze
151
- end
152
- @default_service
152
+ @default_service ||= Datadog::Ext::Environment::FALLBACK_SERVICE_NAME
153
153
  end
154
154
 
155
155
  # Set the given key / value tag pair at the tracer level. These tags will be
@@ -158,7 +158,7 @@ module Datadog
158
158
  #
159
159
  # tracer.set_tags('env' => 'prod', 'component' => 'core')
160
160
  def set_tags(tags)
161
- string_tags = Hash[tags.collect { |k, v| [k.to_s, v] }]
161
+ string_tags = tags.collect { |k, v| [k.to_s, v] }.to_h
162
162
  @tags = @tags.merge(string_tags)
163
163
  end
164
164
 
@@ -201,6 +201,7 @@ module Datadog
201
201
  # root span
202
202
  @sampler.sample!(span)
203
203
  span.set_tag('system.pid', Process.pid)
204
+ span.set_tag(Datadog::Ext::Runtime::TAG_ID, Datadog::Core::Environment::Identity.id)
204
205
 
205
206
  if ctx && ctx.trace_id
206
207
  span.trace_id = ctx.trace_id
@@ -287,8 +288,19 @@ module Datadog
287
288
  # and it is user code which should be executed no matter what.
288
289
  # It's not a problem since we re-raise it afterwards so for example a
289
290
  # SignalException::Interrupt would still bubble up.
291
+ # rubocop:disable Metrics/BlockNesting
290
292
  rescue Exception => e
291
- (options[:on_error] || DEFAULT_ON_ERROR).call(span, e)
293
+ if (on_error_handler = options[:on_error]) && on_error_handler.respond_to?(:call)
294
+ begin
295
+ on_error_handler.call(span, e)
296
+ rescue
297
+ Datadog.logger.debug('Custom on_error handler failed, falling back to default')
298
+ DEFAULT_ON_ERROR.call(span, e)
299
+ end
300
+ else
301
+ Datadog.logger.debug('Custom on_error handler must be a callable, falling back to default') if on_error_handler
302
+ DEFAULT_ON_ERROR.call(span, e)
303
+ end
292
304
  raise e
293
305
  ensure
294
306
  span.finish unless span.nil?
@@ -300,6 +312,10 @@ module Datadog
300
312
  end
301
313
  end
302
314
 
315
+ def trace_completed
316
+ @trace_completed ||= TraceCompleted.new
317
+ end
318
+
303
319
  # Record the given +context+. For compatibility with previous versions,
304
320
  # +context+ can also be a span. It is similar to the +child_of+ argument,
305
321
  # method will figure out what to do, submitting a +span+ for recording
@@ -324,18 +340,18 @@ module Datadog
324
340
  end
325
341
 
326
342
  # Return the current active span or +nil+.
327
- def active_span
328
- call_context.current_span
343
+ def active_span(key = nil)
344
+ call_context(key).current_span
329
345
  end
330
346
 
331
347
  # Return the current active root span or +nil+.
332
- def active_root_span
333
- call_context.current_root_span
348
+ def active_root_span(key = nil)
349
+ call_context(key).current_root_span
334
350
  end
335
351
 
336
352
  # Return a CorrelationIdentifier for active span
337
- def active_correlation
338
- Datadog::Correlation.identifier_from_context(call_context)
353
+ def active_correlation(key = nil)
354
+ Datadog::Correlation.identifier_from_context(call_context(key))
339
355
  end
340
356
 
341
357
  # Send the trace to the writer to enqueue the spans list in the agent
@@ -351,24 +367,34 @@ module Datadog
351
367
  end
352
368
 
353
369
  @writer.write(trace)
370
+ trace_completed.publish(trace)
371
+ end
372
+
373
+ # Triggered whenever a trace is completed
374
+ class TraceCompleted < Datadog::Event
375
+ def initialize
376
+ super(:trace_completed)
377
+ end
378
+
379
+ # NOTE: Ignore Rubocop rule. This definition allows for
380
+ # description of and constraints on arguments.
381
+ # rubocop:disable Lint/UselessMethodDefinition
382
+ def publish(trace)
383
+ super(trace)
384
+ end
385
+ # rubocop:enable Lint/UselessMethodDefinition
354
386
  end
355
387
 
356
388
  # TODO: Move this kind of configuration building out of the tracer.
357
389
  # Tracer should not have this kind of knowledge of writer.
358
- # rubocop:disable Metrics/PerceivedComplexity
359
- # rubocop:disable Metrics/CyclomaticComplexity
360
- # rubocop:disable Metrics/MethodLength
361
390
  def configure_writer(options = {})
362
- hostname = options.fetch(:hostname, nil)
363
- port = options.fetch(:port, nil)
364
391
  sampler = options.fetch(:sampler, nil)
365
392
  priority_sampling = options.fetch(:priority_sampling, nil)
366
393
  writer = options.fetch(:writer, nil)
367
- transport_options = options.fetch(:transport_options, {}).dup
394
+ agent_settings = options.fetch(:agent_settings, nil)
368
395
 
369
396
  # Compile writer options
370
397
  writer_options = options.fetch(:writer_options, {}).dup
371
- rebuild_writer = !writer_options.empty?
372
398
 
373
399
  # Re-build the sampler and writer if priority sampling is enabled,
374
400
  # but neither are configured. Verify the sampler isn't already a
@@ -381,35 +407,20 @@ module Datadog
381
407
  end
382
408
  elsif priority_sampling != false && !@sampler.is_a?(PrioritySampler)
383
409
  writer_options[:priority_sampler] = activate_priority_sampling!(@sampler)
384
- rebuild_writer = true
385
410
  elsif priority_sampling == false
386
411
  deactivate_priority_sampling!(sampler)
387
- rebuild_writer = true
388
412
  elsif @sampler.is_a?(PrioritySampler)
389
413
  # Make sure to add sampler to options if transport is rebuilt.
390
414
  writer_options[:priority_sampler] = @sampler
391
415
  end
392
416
 
393
- # Apply options to transport
394
- if transport_options.is_a?(Proc)
395
- transport_options = { on_build: transport_options }
396
- rebuild_writer = true
397
- end
417
+ writer_options[:agent_settings] = agent_settings if agent_settings
398
418
 
399
- if hostname || port
400
- transport_options[:hostname] = hostname unless hostname.nil?
401
- transport_options[:port] = port unless port.nil?
402
- rebuild_writer = true
403
- end
404
-
405
- writer_options[:transport_options] = transport_options
419
+ # Make sure old writer is shut down before throwing away.
420
+ # Don't want additional threads running...
421
+ @writer.stop unless writer.nil?
406
422
 
407
- if rebuild_writer || writer
408
- # Make sure old writer is shut down before throwing away.
409
- # Don't want additional threads running...
410
- @writer.stop unless writer.nil?
411
- @writer = writer || Writer.new(writer_options)
412
- end
423
+ @writer = writer || Writer.new(writer_options)
413
424
  end
414
425
 
415
426
  def activate_priority_sampling!(base_sampler = nil)