ddtrace 0.38.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 (433) hide show
  1. checksums.yaml +7 -0
  2. data/.circleci/config.yml +492 -0
  3. data/.circleci/images/primary/Dockerfile-2.0.0 +73 -0
  4. data/.circleci/images/primary/Dockerfile-2.1.10 +73 -0
  5. data/.circleci/images/primary/Dockerfile-2.2.10 +73 -0
  6. data/.circleci/images/primary/Dockerfile-2.3.8 +75 -0
  7. data/.circleci/images/primary/Dockerfile-2.4.6 +73 -0
  8. data/.circleci/images/primary/Dockerfile-2.5.6 +73 -0
  9. data/.circleci/images/primary/Dockerfile-2.6.4 +73 -0
  10. data/.circleci/images/primary/Dockerfile-2.7.0 +73 -0
  11. data/.circleci/images/primary/Dockerfile-jruby-9.2 +77 -0
  12. data/.dockerignore +1 -0
  13. data/.env +26 -0
  14. data/.github/CODEOWNERS +1 -0
  15. data/.gitignore +61 -0
  16. data/.gitlab-ci.yml +26 -0
  17. data/.rspec +1 -0
  18. data/.rubocop.yml +85 -0
  19. data/.yardopts +5 -0
  20. data/Appraisals +961 -0
  21. data/CHANGELOG.md +1402 -0
  22. data/CONTRIBUTING.md +85 -0
  23. data/Gemfile +7 -0
  24. data/LICENSE +6 -0
  25. data/LICENSE.Apache +200 -0
  26. data/LICENSE.BSD3 +24 -0
  27. data/NOTICE +4 -0
  28. data/README.md +23 -0
  29. data/Rakefile +753 -0
  30. data/benchmarks/postgres_database.yml +9 -0
  31. data/benchmarks/sidekiq_test.rb +154 -0
  32. data/ddtrace.gemspec +71 -0
  33. data/docker-compose.yml +370 -0
  34. data/docs/DevelopmentGuide.md +195 -0
  35. data/docs/GettingStarted.md +2224 -0
  36. data/lib/ddtrace.rb +76 -0
  37. data/lib/ddtrace/analytics.rb +36 -0
  38. data/lib/ddtrace/augmentation.rb +13 -0
  39. data/lib/ddtrace/augmentation/method_wrapper.rb +20 -0
  40. data/lib/ddtrace/augmentation/method_wrapping.rb +38 -0
  41. data/lib/ddtrace/augmentation/shim.rb +102 -0
  42. data/lib/ddtrace/buffer.rb +119 -0
  43. data/lib/ddtrace/chunker.rb +34 -0
  44. data/lib/ddtrace/configuration.rb +53 -0
  45. data/lib/ddtrace/configuration/base.rb +84 -0
  46. data/lib/ddtrace/configuration/components.rb +154 -0
  47. data/lib/ddtrace/configuration/dependency_resolver.rb +24 -0
  48. data/lib/ddtrace/configuration/option.rb +64 -0
  49. data/lib/ddtrace/configuration/option_definition.rb +123 -0
  50. data/lib/ddtrace/configuration/option_definition_set.rb +18 -0
  51. data/lib/ddtrace/configuration/option_set.rb +6 -0
  52. data/lib/ddtrace/configuration/options.rb +112 -0
  53. data/lib/ddtrace/configuration/pin_setup.rb +31 -0
  54. data/lib/ddtrace/configuration/settings.rb +273 -0
  55. data/lib/ddtrace/context.rb +305 -0
  56. data/lib/ddtrace/context_flush.rb +69 -0
  57. data/lib/ddtrace/context_provider.rb +50 -0
  58. data/lib/ddtrace/contrib/action_cable/configuration/settings.rb +25 -0
  59. data/lib/ddtrace/contrib/action_cable/event.rb +65 -0
  60. data/lib/ddtrace/contrib/action_cable/events.rb +33 -0
  61. data/lib/ddtrace/contrib/action_cable/events/broadcast.rb +49 -0
  62. data/lib/ddtrace/contrib/action_cable/events/perform_action.rb +55 -0
  63. data/lib/ddtrace/contrib/action_cable/events/transmit.rb +50 -0
  64. data/lib/ddtrace/contrib/action_cable/ext.rb +23 -0
  65. data/lib/ddtrace/contrib/action_cable/instrumentation.rb +31 -0
  66. data/lib/ddtrace/contrib/action_cable/integration.rb +38 -0
  67. data/lib/ddtrace/contrib/action_cable/patcher.rb +27 -0
  68. data/lib/ddtrace/contrib/action_pack/action_controller/instrumentation.rb +148 -0
  69. data/lib/ddtrace/contrib/action_pack/action_controller/patcher.rb +25 -0
  70. data/lib/ddtrace/contrib/action_pack/configuration/settings.rb +27 -0
  71. data/lib/ddtrace/contrib/action_pack/ext.rb +16 -0
  72. data/lib/ddtrace/contrib/action_pack/integration.rb +38 -0
  73. data/lib/ddtrace/contrib/action_pack/patcher.rb +23 -0
  74. data/lib/ddtrace/contrib/action_pack/utils.rb +36 -0
  75. data/lib/ddtrace/contrib/action_view/configuration/settings.rb +26 -0
  76. data/lib/ddtrace/contrib/action_view/event.rb +39 -0
  77. data/lib/ddtrace/contrib/action_view/events.rb +30 -0
  78. data/lib/ddtrace/contrib/action_view/events/render_partial.rb +45 -0
  79. data/lib/ddtrace/contrib/action_view/events/render_template.rb +48 -0
  80. data/lib/ddtrace/contrib/action_view/ext.rb +17 -0
  81. data/lib/ddtrace/contrib/action_view/instrumentation/partial_renderer.rb +74 -0
  82. data/lib/ddtrace/contrib/action_view/instrumentation/template_renderer.rb +167 -0
  83. data/lib/ddtrace/contrib/action_view/integration.rb +45 -0
  84. data/lib/ddtrace/contrib/action_view/patcher.rb +47 -0
  85. data/lib/ddtrace/contrib/action_view/utils.rb +32 -0
  86. data/lib/ddtrace/contrib/active_model_serializers/configuration/settings.rb +25 -0
  87. data/lib/ddtrace/contrib/active_model_serializers/event.rb +68 -0
  88. data/lib/ddtrace/contrib/active_model_serializers/events.rb +30 -0
  89. data/lib/ddtrace/contrib/active_model_serializers/events/render.rb +32 -0
  90. data/lib/ddtrace/contrib/active_model_serializers/events/serialize.rb +35 -0
  91. data/lib/ddtrace/contrib/active_model_serializers/ext.rb +17 -0
  92. data/lib/ddtrace/contrib/active_model_serializers/integration.rb +40 -0
  93. data/lib/ddtrace/contrib/active_model_serializers/patcher.rb +29 -0
  94. data/lib/ddtrace/contrib/active_record/configuration/resolver.rb +45 -0
  95. data/lib/ddtrace/contrib/active_record/configuration/settings.rb +30 -0
  96. data/lib/ddtrace/contrib/active_record/event.rb +30 -0
  97. data/lib/ddtrace/contrib/active_record/events.rb +30 -0
  98. data/lib/ddtrace/contrib/active_record/events/instantiation.rb +60 -0
  99. data/lib/ddtrace/contrib/active_record/events/sql.rb +64 -0
  100. data/lib/ddtrace/contrib/active_record/ext.rb +21 -0
  101. data/lib/ddtrace/contrib/active_record/integration.rb +46 -0
  102. data/lib/ddtrace/contrib/active_record/patcher.rb +23 -0
  103. data/lib/ddtrace/contrib/active_record/utils.rb +76 -0
  104. data/lib/ddtrace/contrib/active_support/cache/instrumentation.rb +157 -0
  105. data/lib/ddtrace/contrib/active_support/cache/patcher.rb +48 -0
  106. data/lib/ddtrace/contrib/active_support/cache/redis.rb +47 -0
  107. data/lib/ddtrace/contrib/active_support/configuration/settings.rb +25 -0
  108. data/lib/ddtrace/contrib/active_support/ext.rb +21 -0
  109. data/lib/ddtrace/contrib/active_support/integration.rb +40 -0
  110. data/lib/ddtrace/contrib/active_support/notifications/event.rb +64 -0
  111. data/lib/ddtrace/contrib/active_support/notifications/subscriber.rb +66 -0
  112. data/lib/ddtrace/contrib/active_support/notifications/subscription.rb +159 -0
  113. data/lib/ddtrace/contrib/active_support/patcher.rb +23 -0
  114. data/lib/ddtrace/contrib/analytics.rb +24 -0
  115. data/lib/ddtrace/contrib/aws/configuration/settings.rb +25 -0
  116. data/lib/ddtrace/contrib/aws/ext.rb +20 -0
  117. data/lib/ddtrace/contrib/aws/instrumentation.rb +56 -0
  118. data/lib/ddtrace/contrib/aws/integration.rb +42 -0
  119. data/lib/ddtrace/contrib/aws/parsed_context.rb +56 -0
  120. data/lib/ddtrace/contrib/aws/patcher.rb +49 -0
  121. data/lib/ddtrace/contrib/aws/services.rb +115 -0
  122. data/lib/ddtrace/contrib/concurrent_ruby/configuration/settings.rb +15 -0
  123. data/lib/ddtrace/contrib/concurrent_ruby/context_composite_executor_service.rb +41 -0
  124. data/lib/ddtrace/contrib/concurrent_ruby/ext.rb +11 -0
  125. data/lib/ddtrace/contrib/concurrent_ruby/future_patch.rb +23 -0
  126. data/lib/ddtrace/contrib/concurrent_ruby/integration.rb +38 -0
  127. data/lib/ddtrace/contrib/concurrent_ruby/patcher.rb +28 -0
  128. data/lib/ddtrace/contrib/configurable.rb +76 -0
  129. data/lib/ddtrace/contrib/configuration/resolver.rb +16 -0
  130. data/lib/ddtrace/contrib/configuration/resolvers/pattern_resolver.rb +39 -0
  131. data/lib/ddtrace/contrib/configuration/settings.rb +53 -0
  132. data/lib/ddtrace/contrib/dalli/configuration/settings.rb +25 -0
  133. data/lib/ddtrace/contrib/dalli/ext.rb +17 -0
  134. data/lib/ddtrace/contrib/dalli/instrumentation.rb +50 -0
  135. data/lib/ddtrace/contrib/dalli/integration.rb +38 -0
  136. data/lib/ddtrace/contrib/dalli/patcher.rb +63 -0
  137. data/lib/ddtrace/contrib/dalli/quantize.rb +22 -0
  138. data/lib/ddtrace/contrib/delayed_job/configuration/settings.rb +25 -0
  139. data/lib/ddtrace/contrib/delayed_job/ext.rb +18 -0
  140. data/lib/ddtrace/contrib/delayed_job/integration.rb +38 -0
  141. data/lib/ddtrace/contrib/delayed_job/patcher.rb +28 -0
  142. data/lib/ddtrace/contrib/delayed_job/plugin.rb +61 -0
  143. data/lib/ddtrace/contrib/elasticsearch/configuration/settings.rb +26 -0
  144. data/lib/ddtrace/contrib/elasticsearch/ext.rb +19 -0
  145. data/lib/ddtrace/contrib/elasticsearch/integration.rb +39 -0
  146. data/lib/ddtrace/contrib/elasticsearch/patcher.rb +117 -0
  147. data/lib/ddtrace/contrib/elasticsearch/quantize.rb +80 -0
  148. data/lib/ddtrace/contrib/ethon/configuration/settings.rb +27 -0
  149. data/lib/ddtrace/contrib/ethon/easy_patch.rb +148 -0
  150. data/lib/ddtrace/contrib/ethon/ext.rb +15 -0
  151. data/lib/ddtrace/contrib/ethon/integration.rb +43 -0
  152. data/lib/ddtrace/contrib/ethon/multi_patch.rb +80 -0
  153. data/lib/ddtrace/contrib/ethon/patcher.rb +25 -0
  154. data/lib/ddtrace/contrib/excon/configuration/settings.rb +28 -0
  155. data/lib/ddtrace/contrib/excon/ext.rb +14 -0
  156. data/lib/ddtrace/contrib/excon/integration.rb +43 -0
  157. data/lib/ddtrace/contrib/excon/middleware.rb +157 -0
  158. data/lib/ddtrace/contrib/excon/patcher.rb +27 -0
  159. data/lib/ddtrace/contrib/extensions.rb +93 -0
  160. data/lib/ddtrace/contrib/faraday/configuration/settings.rb +33 -0
  161. data/lib/ddtrace/contrib/faraday/connection.rb +18 -0
  162. data/lib/ddtrace/contrib/faraday/ext.rb +14 -0
  163. data/lib/ddtrace/contrib/faraday/integration.rb +43 -0
  164. data/lib/ddtrace/contrib/faraday/middleware.rb +83 -0
  165. data/lib/ddtrace/contrib/faraday/patcher.rb +80 -0
  166. data/lib/ddtrace/contrib/faraday/rack_builder.rb +18 -0
  167. data/lib/ddtrace/contrib/grape/configuration/settings.rb +27 -0
  168. data/lib/ddtrace/contrib/grape/endpoint.rb +208 -0
  169. data/lib/ddtrace/contrib/grape/ext.rb +19 -0
  170. data/lib/ddtrace/contrib/grape/instrumentation.rb +33 -0
  171. data/lib/ddtrace/contrib/grape/integration.rb +39 -0
  172. data/lib/ddtrace/contrib/grape/patcher.rb +73 -0
  173. data/lib/ddtrace/contrib/graphql/configuration/settings.rb +27 -0
  174. data/lib/ddtrace/contrib/graphql/ext.rb +13 -0
  175. data/lib/ddtrace/contrib/graphql/integration.rb +39 -0
  176. data/lib/ddtrace/contrib/graphql/patcher.rb +60 -0
  177. data/lib/ddtrace/contrib/grpc/configuration/settings.rb +25 -0
  178. data/lib/ddtrace/contrib/grpc/datadog_interceptor.rb +74 -0
  179. data/lib/ddtrace/contrib/grpc/datadog_interceptor/client.rb +54 -0
  180. data/lib/ddtrace/contrib/grpc/datadog_interceptor/server.rb +76 -0
  181. data/lib/ddtrace/contrib/grpc/ext.rb +15 -0
  182. data/lib/ddtrace/contrib/grpc/integration.rb +38 -0
  183. data/lib/ddtrace/contrib/grpc/intercept_with_datadog.rb +49 -0
  184. data/lib/ddtrace/contrib/grpc/patcher.rb +68 -0
  185. data/lib/ddtrace/contrib/http/circuit_breaker.rb +39 -0
  186. data/lib/ddtrace/contrib/http/configuration/settings.rb +27 -0
  187. data/lib/ddtrace/contrib/http/ext.rb +14 -0
  188. data/lib/ddtrace/contrib/http/instrumentation.rb +175 -0
  189. data/lib/ddtrace/contrib/http/integration.rb +45 -0
  190. data/lib/ddtrace/contrib/http/patcher.rb +26 -0
  191. data/lib/ddtrace/contrib/http_annotation_helper.rb +10 -0
  192. data/lib/ddtrace/contrib/httprb/configuration/settings.rb +27 -0
  193. data/lib/ddtrace/contrib/httprb/ext.rb +14 -0
  194. data/lib/ddtrace/contrib/httprb/instrumentation.rb +163 -0
  195. data/lib/ddtrace/contrib/httprb/integration.rb +43 -0
  196. data/lib/ddtrace/contrib/httprb/patcher.rb +35 -0
  197. data/lib/ddtrace/contrib/integration.rb +16 -0
  198. data/lib/ddtrace/contrib/kafka/configuration/settings.rb +25 -0
  199. data/lib/ddtrace/contrib/kafka/consumer_event.rb +14 -0
  200. data/lib/ddtrace/contrib/kafka/consumer_group_event.rb +14 -0
  201. data/lib/ddtrace/contrib/kafka/event.rb +51 -0
  202. data/lib/ddtrace/contrib/kafka/events.rb +44 -0
  203. data/lib/ddtrace/contrib/kafka/events/connection/request.rb +34 -0
  204. data/lib/ddtrace/contrib/kafka/events/consumer/process_batch.rb +41 -0
  205. data/lib/ddtrace/contrib/kafka/events/consumer/process_message.rb +39 -0
  206. data/lib/ddtrace/contrib/kafka/events/consumer_group/heartbeat.rb +39 -0
  207. data/lib/ddtrace/contrib/kafka/events/consumer_group/join_group.rb +29 -0
  208. data/lib/ddtrace/contrib/kafka/events/consumer_group/leave_group.rb +29 -0
  209. data/lib/ddtrace/contrib/kafka/events/consumer_group/sync_group.rb +29 -0
  210. data/lib/ddtrace/contrib/kafka/events/produce_operation/send_messages.rb +32 -0
  211. data/lib/ddtrace/contrib/kafka/events/producer/deliver_messages.rb +35 -0
  212. data/lib/ddtrace/contrib/kafka/ext.rb +38 -0
  213. data/lib/ddtrace/contrib/kafka/integration.rb +39 -0
  214. data/lib/ddtrace/contrib/kafka/patcher.rb +26 -0
  215. data/lib/ddtrace/contrib/mongodb/configuration/settings.rb +28 -0
  216. data/lib/ddtrace/contrib/mongodb/ext.rb +20 -0
  217. data/lib/ddtrace/contrib/mongodb/instrumentation.rb +67 -0
  218. data/lib/ddtrace/contrib/mongodb/integration.rb +38 -0
  219. data/lib/ddtrace/contrib/mongodb/parsers.rb +68 -0
  220. data/lib/ddtrace/contrib/mongodb/patcher.rb +31 -0
  221. data/lib/ddtrace/contrib/mongodb/subscribers.rb +108 -0
  222. data/lib/ddtrace/contrib/mysql2/configuration/settings.rb +25 -0
  223. data/lib/ddtrace/contrib/mysql2/ext.rb +15 -0
  224. data/lib/ddtrace/contrib/mysql2/instrumentation.rb +60 -0
  225. data/lib/ddtrace/contrib/mysql2/integration.rb +38 -0
  226. data/lib/ddtrace/contrib/mysql2/patcher.rb +27 -0
  227. data/lib/ddtrace/contrib/patchable.rb +59 -0
  228. data/lib/ddtrace/contrib/patcher.rb +62 -0
  229. data/lib/ddtrace/contrib/presto/configuration/settings.rb +25 -0
  230. data/lib/ddtrace/contrib/presto/ext.rb +25 -0
  231. data/lib/ddtrace/contrib/presto/instrumentation.rb +107 -0
  232. data/lib/ddtrace/contrib/presto/integration.rb +38 -0
  233. data/lib/ddtrace/contrib/presto/patcher.rb +30 -0
  234. data/lib/ddtrace/contrib/racecar/configuration/settings.rb +25 -0
  235. data/lib/ddtrace/contrib/racecar/event.rb +71 -0
  236. data/lib/ddtrace/contrib/racecar/events.rb +30 -0
  237. data/lib/ddtrace/contrib/racecar/events/batch.rb +27 -0
  238. data/lib/ddtrace/contrib/racecar/events/message.rb +27 -0
  239. data/lib/ddtrace/contrib/racecar/ext.rb +21 -0
  240. data/lib/ddtrace/contrib/racecar/integration.rb +39 -0
  241. data/lib/ddtrace/contrib/racecar/patcher.rb +26 -0
  242. data/lib/ddtrace/contrib/rack/configuration/settings.rb +41 -0
  243. data/lib/ddtrace/contrib/rack/ext.rb +18 -0
  244. data/lib/ddtrace/contrib/rack/integration.rb +38 -0
  245. data/lib/ddtrace/contrib/rack/middlewares.rb +290 -0
  246. data/lib/ddtrace/contrib/rack/patcher.rb +107 -0
  247. data/lib/ddtrace/contrib/rack/request_queue.rb +39 -0
  248. data/lib/ddtrace/contrib/rails/configuration/settings.rb +83 -0
  249. data/lib/ddtrace/contrib/rails/ext.rb +13 -0
  250. data/lib/ddtrace/contrib/rails/framework.rb +124 -0
  251. data/lib/ddtrace/contrib/rails/integration.rb +44 -0
  252. data/lib/ddtrace/contrib/rails/middlewares.rb +38 -0
  253. data/lib/ddtrace/contrib/rails/patcher.rb +74 -0
  254. data/lib/ddtrace/contrib/rails/railtie.rb +17 -0
  255. data/lib/ddtrace/contrib/rails/utils.rb +20 -0
  256. data/lib/ddtrace/contrib/rake/configuration/settings.rb +27 -0
  257. data/lib/ddtrace/contrib/rake/ext.rb +18 -0
  258. data/lib/ddtrace/contrib/rake/instrumentation.rb +88 -0
  259. data/lib/ddtrace/contrib/rake/integration.rb +38 -0
  260. data/lib/ddtrace/contrib/rake/patcher.rb +30 -0
  261. data/lib/ddtrace/contrib/redis/configuration/resolver.rb +36 -0
  262. data/lib/ddtrace/contrib/redis/configuration/settings.rb +25 -0
  263. data/lib/ddtrace/contrib/redis/ext.rb +18 -0
  264. data/lib/ddtrace/contrib/redis/integration.rb +42 -0
  265. data/lib/ddtrace/contrib/redis/patcher.rb +97 -0
  266. data/lib/ddtrace/contrib/redis/quantize.rb +47 -0
  267. data/lib/ddtrace/contrib/redis/tags.rb +38 -0
  268. data/lib/ddtrace/contrib/redis/vendor/resolver.rb +159 -0
  269. data/lib/ddtrace/contrib/registerable.rb +33 -0
  270. data/lib/ddtrace/contrib/registry.rb +42 -0
  271. data/lib/ddtrace/contrib/resque/configuration/settings.rb +26 -0
  272. data/lib/ddtrace/contrib/resque/ext.rb +14 -0
  273. data/lib/ddtrace/contrib/resque/integration.rb +47 -0
  274. data/lib/ddtrace/contrib/resque/patcher.rb +29 -0
  275. data/lib/ddtrace/contrib/resque/resque_job.rb +80 -0
  276. data/lib/ddtrace/contrib/rest_client/configuration/settings.rb +26 -0
  277. data/lib/ddtrace/contrib/rest_client/ext.rb +14 -0
  278. data/lib/ddtrace/contrib/rest_client/integration.rb +38 -0
  279. data/lib/ddtrace/contrib/rest_client/patcher.rb +23 -0
  280. data/lib/ddtrace/contrib/rest_client/request_patch.rb +89 -0
  281. data/lib/ddtrace/contrib/sequel/configuration/settings.rb +23 -0
  282. data/lib/ddtrace/contrib/sequel/database.rb +61 -0
  283. data/lib/ddtrace/contrib/sequel/dataset.rb +62 -0
  284. data/lib/ddtrace/contrib/sequel/ext.rb +15 -0
  285. data/lib/ddtrace/contrib/sequel/integration.rb +38 -0
  286. data/lib/ddtrace/contrib/sequel/patcher.rb +33 -0
  287. data/lib/ddtrace/contrib/sequel/utils.rb +46 -0
  288. data/lib/ddtrace/contrib/shoryuken/configuration/settings.rb +24 -0
  289. data/lib/ddtrace/contrib/shoryuken/ext.rb +18 -0
  290. data/lib/ddtrace/contrib/shoryuken/integration.rb +39 -0
  291. data/lib/ddtrace/contrib/shoryuken/patcher.rb +24 -0
  292. data/lib/ddtrace/contrib/shoryuken/tracer.rb +49 -0
  293. data/lib/ddtrace/contrib/sidekiq/client_tracer.rb +43 -0
  294. data/lib/ddtrace/contrib/sidekiq/configuration/settings.rb +31 -0
  295. data/lib/ddtrace/contrib/sidekiq/ext.rb +24 -0
  296. data/lib/ddtrace/contrib/sidekiq/integration.rb +38 -0
  297. data/lib/ddtrace/contrib/sidekiq/patcher.rb +41 -0
  298. data/lib/ddtrace/contrib/sidekiq/server_tracer.rb +67 -0
  299. data/lib/ddtrace/contrib/sidekiq/tracing.rb +45 -0
  300. data/lib/ddtrace/contrib/sinatra/configuration/settings.rb +34 -0
  301. data/lib/ddtrace/contrib/sinatra/env.rb +58 -0
  302. data/lib/ddtrace/contrib/sinatra/ext.rb +24 -0
  303. data/lib/ddtrace/contrib/sinatra/headers.rb +31 -0
  304. data/lib/ddtrace/contrib/sinatra/integration.rb +38 -0
  305. data/lib/ddtrace/contrib/sinatra/patcher.rb +28 -0
  306. data/lib/ddtrace/contrib/sinatra/tracer.rb +150 -0
  307. data/lib/ddtrace/contrib/sinatra/tracer_middleware.rb +78 -0
  308. data/lib/ddtrace/contrib/sucker_punch/configuration/settings.rb +25 -0
  309. data/lib/ddtrace/contrib/sucker_punch/exception_handler.rb +26 -0
  310. data/lib/ddtrace/contrib/sucker_punch/ext.rb +18 -0
  311. data/lib/ddtrace/contrib/sucker_punch/instrumentation.rb +84 -0
  312. data/lib/ddtrace/contrib/sucker_punch/integration.rb +38 -0
  313. data/lib/ddtrace/contrib/sucker_punch/patcher.rb +42 -0
  314. data/lib/ddtrace/correlation.rb +38 -0
  315. data/lib/ddtrace/diagnostics/environment_logger.rb +278 -0
  316. data/lib/ddtrace/diagnostics/health.rb +33 -0
  317. data/lib/ddtrace/distributed_tracing/headers/b3.rb +44 -0
  318. data/lib/ddtrace/distributed_tracing/headers/b3_single.rb +56 -0
  319. data/lib/ddtrace/distributed_tracing/headers/datadog.rb +42 -0
  320. data/lib/ddtrace/distributed_tracing/headers/headers.rb +70 -0
  321. data/lib/ddtrace/distributed_tracing/headers/helpers.rb +45 -0
  322. data/lib/ddtrace/encoding.rb +69 -0
  323. data/lib/ddtrace/environment.rb +31 -0
  324. data/lib/ddtrace/error.rb +27 -0
  325. data/lib/ddtrace/event.rb +52 -0
  326. data/lib/ddtrace/ext/analytics.rb +12 -0
  327. data/lib/ddtrace/ext/app_types.rb +11 -0
  328. data/lib/ddtrace/ext/correlation.rb +11 -0
  329. data/lib/ddtrace/ext/diagnostics.rb +35 -0
  330. data/lib/ddtrace/ext/distributed.rb +33 -0
  331. data/lib/ddtrace/ext/environment.rb +16 -0
  332. data/lib/ddtrace/ext/errors.rb +10 -0
  333. data/lib/ddtrace/ext/forced_tracing.rb +25 -0
  334. data/lib/ddtrace/ext/http.rb +46 -0
  335. data/lib/ddtrace/ext/manual_tracing.rb +9 -0
  336. data/lib/ddtrace/ext/metrics.rb +15 -0
  337. data/lib/ddtrace/ext/net.rb +10 -0
  338. data/lib/ddtrace/ext/priority.rb +16 -0
  339. data/lib/ddtrace/ext/runtime.rb +26 -0
  340. data/lib/ddtrace/ext/sampling.rb +16 -0
  341. data/lib/ddtrace/ext/sql.rb +8 -0
  342. data/lib/ddtrace/ext/transport.rb +17 -0
  343. data/lib/ddtrace/forced_tracing.rb +36 -0
  344. data/lib/ddtrace/logger.rb +40 -0
  345. data/lib/ddtrace/metrics.rb +222 -0
  346. data/lib/ddtrace/monkey.rb +58 -0
  347. data/lib/ddtrace/opentelemetry/extensions.rb +13 -0
  348. data/lib/ddtrace/opentelemetry/span.rb +33 -0
  349. data/lib/ddtrace/opentracer.rb +40 -0
  350. data/lib/ddtrace/opentracer/binary_propagator.rb +24 -0
  351. data/lib/ddtrace/opentracer/carrier.rb +6 -0
  352. data/lib/ddtrace/opentracer/distributed_headers.rb +52 -0
  353. data/lib/ddtrace/opentracer/global_tracer.rb +15 -0
  354. data/lib/ddtrace/opentracer/propagator.rb +22 -0
  355. data/lib/ddtrace/opentracer/rack_propagator.rb +60 -0
  356. data/lib/ddtrace/opentracer/scope.rb +15 -0
  357. data/lib/ddtrace/opentracer/scope_manager.rb +6 -0
  358. data/lib/ddtrace/opentracer/span.rb +98 -0
  359. data/lib/ddtrace/opentracer/span_context.rb +14 -0
  360. data/lib/ddtrace/opentracer/span_context_factory.rb +23 -0
  361. data/lib/ddtrace/opentracer/text_map_propagator.rb +75 -0
  362. data/lib/ddtrace/opentracer/thread_local_scope.rb +30 -0
  363. data/lib/ddtrace/opentracer/thread_local_scope_manager.rb +40 -0
  364. data/lib/ddtrace/opentracer/tracer.rb +208 -0
  365. data/lib/ddtrace/patcher.rb +47 -0
  366. data/lib/ddtrace/pin.rb +138 -0
  367. data/lib/ddtrace/pipeline.rb +46 -0
  368. data/lib/ddtrace/pipeline/span_filter.rb +38 -0
  369. data/lib/ddtrace/pipeline/span_processor.rb +20 -0
  370. data/lib/ddtrace/propagation/grpc_propagator.rb +61 -0
  371. data/lib/ddtrace/propagation/http_propagator.rb +75 -0
  372. data/lib/ddtrace/quantization/hash.rb +103 -0
  373. data/lib/ddtrace/quantization/http.rb +86 -0
  374. data/lib/ddtrace/runtime/cgroup.rb +44 -0
  375. data/lib/ddtrace/runtime/class_count.rb +17 -0
  376. data/lib/ddtrace/runtime/container.rb +73 -0
  377. data/lib/ddtrace/runtime/gc.rb +16 -0
  378. data/lib/ddtrace/runtime/identity.rb +41 -0
  379. data/lib/ddtrace/runtime/metrics.rb +96 -0
  380. data/lib/ddtrace/runtime/object_space.rb +19 -0
  381. data/lib/ddtrace/runtime/socket.rb +14 -0
  382. data/lib/ddtrace/runtime/thread_count.rb +16 -0
  383. data/lib/ddtrace/sampler.rb +292 -0
  384. data/lib/ddtrace/sampling.rb +2 -0
  385. data/lib/ddtrace/sampling/matcher.rb +57 -0
  386. data/lib/ddtrace/sampling/rate_limiter.rb +127 -0
  387. data/lib/ddtrace/sampling/rule.rb +61 -0
  388. data/lib/ddtrace/sampling/rule_sampler.rb +125 -0
  389. data/lib/ddtrace/span.rb +307 -0
  390. data/lib/ddtrace/sync_writer.rb +67 -0
  391. data/lib/ddtrace/tracer.rb +439 -0
  392. data/lib/ddtrace/transport/http.rb +91 -0
  393. data/lib/ddtrace/transport/http/adapters/net.rb +120 -0
  394. data/lib/ddtrace/transport/http/adapters/registry.rb +24 -0
  395. data/lib/ddtrace/transport/http/adapters/test.rb +81 -0
  396. data/lib/ddtrace/transport/http/adapters/unix_socket.rb +68 -0
  397. data/lib/ddtrace/transport/http/api.rb +46 -0
  398. data/lib/ddtrace/transport/http/api/endpoint.rb +27 -0
  399. data/lib/ddtrace/transport/http/api/fallbacks.rb +22 -0
  400. data/lib/ddtrace/transport/http/api/instance.rb +33 -0
  401. data/lib/ddtrace/transport/http/api/map.rb +14 -0
  402. data/lib/ddtrace/transport/http/api/spec.rb +15 -0
  403. data/lib/ddtrace/transport/http/builder.rb +163 -0
  404. data/lib/ddtrace/transport/http/client.rb +50 -0
  405. data/lib/ddtrace/transport/http/env.rb +48 -0
  406. data/lib/ddtrace/transport/http/response.rb +26 -0
  407. data/lib/ddtrace/transport/http/statistics.rb +30 -0
  408. data/lib/ddtrace/transport/http/traces.rb +143 -0
  409. data/lib/ddtrace/transport/io.rb +26 -0
  410. data/lib/ddtrace/transport/io/client.rb +76 -0
  411. data/lib/ddtrace/transport/io/response.rb +25 -0
  412. data/lib/ddtrace/transport/io/traces.rb +91 -0
  413. data/lib/ddtrace/transport/parcel.rb +13 -0
  414. data/lib/ddtrace/transport/request.rb +13 -0
  415. data/lib/ddtrace/transport/response.rb +60 -0
  416. data/lib/ddtrace/transport/statistics.rb +72 -0
  417. data/lib/ddtrace/transport/traces.rb +183 -0
  418. data/lib/ddtrace/utils.rb +65 -0
  419. data/lib/ddtrace/utils/database.rb +25 -0
  420. data/lib/ddtrace/utils/time.rb +14 -0
  421. data/lib/ddtrace/vendor/active_record/connection_specification.rb +301 -0
  422. data/lib/ddtrace/version.rb +12 -0
  423. data/lib/ddtrace/worker.rb +20 -0
  424. data/lib/ddtrace/workers.rb +117 -0
  425. data/lib/ddtrace/workers/async.rb +165 -0
  426. data/lib/ddtrace/workers/loop.rb +105 -0
  427. data/lib/ddtrace/workers/polling.rb +48 -0
  428. data/lib/ddtrace/workers/queue.rb +39 -0
  429. data/lib/ddtrace/workers/runtime_metrics.rb +47 -0
  430. data/lib/ddtrace/workers/trace_writer.rb +202 -0
  431. data/lib/ddtrace/writer.rb +175 -0
  432. data/tasks/release_gem.rake +28 -0
  433. metadata +815 -0
@@ -0,0 +1,12 @@
1
+ module Datadog
2
+ module Ext
3
+ # Defines constants for trace analytics
4
+ module Analytics
5
+ DEFAULT_SAMPLE_RATE = 1.0
6
+ ENV_TRACE_ANALYTICS_ENABLED = 'DD_TRACE_ANALYTICS_ENABLED'.freeze
7
+ TAG_ENABLED = 'analytics.enabled'.freeze
8
+ TAG_MEASURED = '_dd.measured'.freeze
9
+ TAG_SAMPLE_RATE = '_dd1.sr.eausr'.freeze
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,11 @@
1
+ module Datadog
2
+ module Ext
3
+ module AppTypes
4
+ WEB = 'web'.freeze
5
+ DB = 'db'.freeze
6
+ CACHE = 'cache'.freeze
7
+ WORKER = 'worker'.freeze
8
+ CUSTOM = 'custom'.freeze
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ module Datadog
2
+ module Ext
3
+ module Correlation
4
+ ATTR_ENV = 'dd.env'.freeze
5
+ ATTR_SERVICE = 'dd.service'.freeze
6
+ ATTR_SPAN_ID = 'dd.span_id'.freeze
7
+ ATTR_TRACE_ID = 'dd.trace_id'.freeze
8
+ ATTR_VERSION = 'dd.version'.freeze
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,35 @@
1
+ module Datadog
2
+ module Ext
3
+ module Diagnostics
4
+ DD_TRACE_STARTUP_LOGS = 'DD_TRACE_STARTUP_LOGS'.freeze
5
+
6
+ # Health
7
+ module Health
8
+ # Metrics
9
+ module Metrics
10
+ ENV_ENABLED = 'DD_HEALTH_METRICS_ENABLED'.freeze
11
+
12
+ METRIC_API_ERRORS = 'datadog.tracer.api.errors'.freeze
13
+ METRIC_API_REQUESTS = 'datadog.tracer.api.requests'.freeze
14
+ METRIC_API_RESPONSES = 'datadog.tracer.api.responses'.freeze
15
+ METRIC_ERROR_CONTEXT_OVERFLOW = 'datadog.tracer.error.context_overflow'.freeze
16
+ METRIC_ERROR_INSTRUMENTATION_PATCH = 'datadog.tracer.error.instrumentation_patch'.freeze
17
+ METRIC_ERROR_SPAN_FINISH = 'datadog.tracer.error.span_finish'.freeze
18
+ METRIC_ERROR_UNFINISHED_SPANS = 'datadog.tracer.error.unfinished_spans'.freeze
19
+ METRIC_INSTRUMENTATION_PATCHED = 'datadog.tracer.instrumentation_patched'.freeze
20
+ METRIC_QUEUE_ACCEPTED = 'datadog.tracer.queue.accepted'.freeze
21
+ METRIC_QUEUE_ACCEPTED_LENGTHS = 'datadog.tracer.queue.accepted_lengths'.freeze
22
+ METRIC_QUEUE_DROPPED = 'datadog.tracer.queue.dropped'.freeze
23
+ METRIC_QUEUE_LENGTH = 'datadog.tracer.queue.length'.freeze
24
+ METRIC_QUEUE_MAX_LENGTH = 'datadog.tracer.queue.max_length'.freeze
25
+ METRIC_QUEUE_SPANS = 'datadog.tracer.queue.spans'.freeze
26
+ METRIC_SAMPLING_SERVICE_CACHE_LENGTH = 'datadog.tracer.sampling.service_cache_length'.freeze
27
+ METRIC_TRACES_FILTERED = 'datadog.tracer.traces.filtered'.freeze
28
+ METRIC_TRANSPORT_CHUNKED = 'datadog.tracer.transport.chunked'.freeze
29
+ METRIC_TRANSPORT_TRACE_TOO_LARGE = 'datadog.tracer.transport.trace_too_large'.freeze
30
+ METRIC_WRITER_CPU_TIME = 'datadog.tracer.writer.cpu_time'.freeze
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,33 @@
1
+ module Datadog
2
+ module Ext
3
+ module DistributedTracing
4
+ # HTTP headers one should set for distributed tracing.
5
+ # These are cross-language (eg: Python, Go and other implementations should honor these)
6
+ HTTP_HEADER_TRACE_ID = 'x-datadog-trace-id'.freeze
7
+ HTTP_HEADER_PARENT_ID = 'x-datadog-parent-id'.freeze
8
+ HTTP_HEADER_SAMPLING_PRIORITY = 'x-datadog-sampling-priority'.freeze
9
+ SAMPLING_PRIORITY_KEY = '_sampling_priority_v1'.freeze
10
+ HTTP_HEADER_ORIGIN = 'x-datadog-origin'.freeze
11
+ ORIGIN_KEY = '_dd.origin'.freeze
12
+
13
+ # B3 headers used for distributed tracing
14
+ B3_HEADER_TRACE_ID = 'x-b3-traceid'.freeze
15
+ B3_HEADER_SPAN_ID = 'x-b3-spanid'.freeze
16
+ B3_HEADER_SAMPLED = 'x-b3-sampled'.freeze
17
+ B3_HEADER_SINGLE = 'b3'.freeze
18
+
19
+ # Distributed tracing propagation options
20
+ PROPAGATION_STYLE_DATADOG = 'Datadog'.freeze
21
+ PROPAGATION_STYLE_B3 = 'B3'.freeze
22
+ PROPAGATION_STYLE_B3_SINGLE_HEADER = 'B3 single header'.freeze
23
+ PROPAGATION_INJECT_STYLE_ENV = 'DD_PROPAGATION_INJECT_STYLE'.freeze
24
+ PROPAGATION_EXTRACT_STYLE_ENV = 'DD_PROPAGATION_EXTRACT_STYLE'.freeze
25
+
26
+ # gRPC metadata keys for distributed tracing. https://github.com/grpc/grpc-go/blob/v1.10.x/Documentation/grpc-metadata.md
27
+ GRPC_METADATA_TRACE_ID = 'x-datadog-trace-id'.freeze
28
+ GRPC_METADATA_PARENT_ID = 'x-datadog-parent-id'.freeze
29
+ GRPC_METADATA_SAMPLING_PRIORITY = 'x-datadog-sampling-priority'.freeze
30
+ GRPC_METADATA_ORIGIN = 'x-datadog-origin'.freeze
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,16 @@
1
+ module Datadog
2
+ module Ext
3
+ module Environment
4
+ ENV_API_KEY = 'DD_API_KEY'.freeze
5
+ ENV_ENVIRONMENT = 'DD_ENV'.freeze
6
+ ENV_SERVICE = 'DD_SERVICE'.freeze
7
+ ENV_SITE = 'DD_SITE'.freeze
8
+ ENV_TAGS = 'DD_TAGS'.freeze
9
+ ENV_VERSION = 'DD_VERSION'.freeze
10
+
11
+ TAG_ENV = 'env'.freeze
12
+ TAG_SERVICE = 'service'.freeze
13
+ TAG_VERSION = 'version'.freeze
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,10 @@
1
+ module Datadog
2
+ module Ext
3
+ module Errors
4
+ STATUS = 1
5
+ MSG = 'error.msg'.freeze
6
+ TYPE = 'error.type'.freeze
7
+ STACK = 'error.stack'.freeze
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,25 @@
1
+ require 'ddtrace/ext/manual_tracing'
2
+ require 'ddtrace/tracer'
3
+
4
+ module Datadog
5
+ module Ext
6
+ # Defines constants for forced tracing
7
+ module ForcedTracing
8
+ @deprecation_warning_shown = false
9
+
10
+ def self.const_missing(name)
11
+ super unless Ext::ManualTracing.const_defined?(name)
12
+
13
+ # Only log each deprecation warning once (safeguard against log spam)
14
+ unless @deprecation_warning_shown
15
+ Datadog.logger.warn(
16
+ 'forced tracing: Datadog::Ext::ForcedTracing has been renamed to Datadog::Ext::ManualTracing'
17
+ )
18
+ @deprecation_warning_shown = true
19
+ end
20
+
21
+ Ext::ManualTracing.const_get(name)
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,46 @@
1
+ module Datadog
2
+ module Ext
3
+ module HTTP
4
+ BASE_URL = 'http.base_url'.freeze
5
+ ERROR_RANGE = 500...600
6
+ METHOD = 'http.method'.freeze
7
+ STATUS_CODE = 'http.status_code'.freeze
8
+ TEMPLATE = 'template'.freeze
9
+ TYPE_INBOUND = 'web'.freeze
10
+ TYPE_OUTBOUND = 'http'.freeze
11
+ TYPE_PROXY = 'proxy'.freeze
12
+ URL = 'http.url'.freeze
13
+
14
+ # General header functionality
15
+ module Headers
16
+ module_function
17
+
18
+ def to_tag(name)
19
+ name.to_s.downcase.gsub(/[-\s]/, '_')
20
+ end
21
+ end
22
+
23
+ # Request headers
24
+ module RequestHeaders
25
+ PREFIX = 'http.request.headers'.freeze
26
+
27
+ module_function
28
+
29
+ def to_tag(name)
30
+ "#{PREFIX}.#{Headers.to_tag(name)}"
31
+ end
32
+ end
33
+
34
+ # Response headers
35
+ module ResponseHeaders
36
+ PREFIX = 'http.response.headers'.freeze
37
+
38
+ module_function
39
+
40
+ def to_tag(name)
41
+ "#{PREFIX}.#{Headers.to_tag(name)}"
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,9 @@
1
+ module Datadog
2
+ module Ext
3
+ # Defines constants for manual tracing
4
+ module ManualTracing
5
+ TAG_KEEP = 'manual.keep'.freeze
6
+ TAG_DROP = 'manual.drop'.freeze
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,15 @@
1
+ module Datadog
2
+ module Ext
3
+ module Metrics
4
+ DEFAULT_HOST = '127.0.0.1'.freeze
5
+ DEFAULT_PORT = 8125
6
+ ENV_DEFAULT_HOST = 'DD_AGENT_HOST'.freeze
7
+ ENV_DEFAULT_PORT = 'DD_METRIC_AGENT_PORT'.freeze
8
+
9
+ TAG_LANG = 'language'.freeze
10
+ TAG_LANG_INTERPRETER = 'language-interpreter'.freeze
11
+ TAG_LANG_VERSION = 'language-version'.freeze
12
+ TAG_TRACER_VERSION = 'tracer-version'.freeze
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,10 @@
1
+ module Datadog
2
+ module Ext
3
+ module NET
4
+ ENV_REPORT_HOSTNAME = 'DD_TRACE_REPORT_HOSTNAME'.freeze
5
+ TAG_HOSTNAME = '_dd.hostname'.freeze
6
+ TARGET_HOST = 'out.host'.freeze
7
+ TARGET_PORT = 'out.port'.freeze
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,16 @@
1
+ module Datadog
2
+ module Ext
3
+ # Priority is a hint given to the backend so that it knows which traces to reject or kept.
4
+ # In a distributed context, it should be set before any context propagation (fork, RPC calls) to be effective.
5
+ module Priority
6
+ # Use this to explicitely inform the backend that a trace should be rejected and not stored.
7
+ USER_REJECT = -1
8
+ # Used by the builtin sampler to inform the backend that a trace should be rejected and not stored.
9
+ AUTO_REJECT = 0
10
+ # Used by the builtin sampler to inform the backend that a trace should be kept and stored.
11
+ AUTO_KEEP = 1
12
+ # Use this to explicitely inform the backend that a trace should be kept and stored.
13
+ USER_KEEP = 2
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,26 @@
1
+ require 'ddtrace/version'
2
+
3
+ module Datadog
4
+ module Ext
5
+ module Runtime
6
+ # Identity
7
+ LANG = 'ruby'.freeze
8
+ LANG_INTERPRETER = (RUBY_ENGINE + '-' + RUBY_PLATFORM).freeze
9
+ LANG_VERSION = RUBY_VERSION
10
+ TRACER_VERSION = Datadog::VERSION::STRING
11
+
12
+ TAG_LANG = 'language'.freeze
13
+
14
+ # Metrics
15
+ module Metrics
16
+ ENV_ENABLED = 'DD_RUNTIME_METRICS_ENABLED'.freeze
17
+
18
+ METRIC_CLASS_COUNT = 'runtime.ruby.class_count'.freeze
19
+ METRIC_GC_PREFIX = 'runtime.ruby.gc'.freeze
20
+ METRIC_THREAD_COUNT = 'runtime.ruby.thread_count'.freeze
21
+
22
+ TAG_SERVICE = 'service'.freeze
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,16 @@
1
+ module Datadog
2
+ module Ext
3
+ module Sampling
4
+ ENV_SAMPLE_RATE = 'DD_TRACE_SAMPLE_RATE'.freeze
5
+ ENV_RATE_LIMIT = 'DD_TRACE_RATE_LIMIT'.freeze
6
+
7
+ # If rule sampling is applied to a span, set this metric the sample rate configured for that rule.
8
+ # This should be done regardless of sampling outcome.
9
+ RULE_SAMPLE_RATE = '_dd.rule_psr'.freeze
10
+
11
+ # If rate limiting is checked on a span, set this metric the effective rate limiting rate applied.
12
+ # This should be done regardless of rate limiting outcome.
13
+ RATE_LIMITER_RATE = '_dd.limit_psr'.freeze
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,8 @@
1
+ module Datadog
2
+ module Ext
3
+ module SQL
4
+ TYPE = 'sql'.freeze
5
+ QUERY = 'sql.query'.freeze
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,17 @@
1
+ module Datadog
2
+ module Ext
3
+ module Transport
4
+ module HTTP
5
+ DEFAULT_HOST = '127.0.0.1'.freeze
6
+ DEFAULT_PORT = 8126
7
+ ENV_DEFAULT_HOST = 'DD_AGENT_HOST'.freeze
8
+ ENV_DEFAULT_PORT = 'DD_TRACE_AGENT_PORT'.freeze
9
+ HEADER_CONTAINER_ID = 'Datadog-Container-ID'.freeze
10
+ HEADER_META_LANG = 'Datadog-Meta-Lang'.freeze
11
+ HEADER_META_LANG_VERSION = 'Datadog-Meta-Lang-Version'.freeze
12
+ HEADER_META_LANG_INTERPRETER = 'Datadog-Meta-Lang-Interpreter'.freeze
13
+ HEADER_META_TRACER_VERSION = 'Datadog-Meta-Tracer-Version'.freeze
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,36 @@
1
+ require 'ddtrace/ext/manual_tracing'
2
+ require 'ddtrace/ext/priority'
3
+
4
+ module Datadog
5
+ # Defines analytics behavior
6
+ module ForcedTracing
7
+ class << self
8
+ def keep(span)
9
+ return if span.nil? || span.context.nil?
10
+ span.context.sampling_priority = Datadog::Ext::Priority::USER_KEEP
11
+ end
12
+
13
+ def drop(span)
14
+ return if span.nil? || span.context.nil?
15
+ span.context.sampling_priority = Datadog::Ext::Priority::USER_REJECT
16
+ end
17
+ end
18
+
19
+ # Extension for Datadog::Span
20
+ module Span
21
+ def set_tag(key, value)
22
+ # Configure sampling priority if they give us a forced tracing tag
23
+ # DEV: Do not set if the value they give us is explicitly "false"
24
+ case key
25
+ when Ext::ManualTracing::TAG_KEEP
26
+ ForcedTracing.keep(self) unless value == false
27
+ when Ext::ManualTracing::TAG_DROP
28
+ ForcedTracing.drop(self) unless value == false
29
+ else
30
+ # Otherwise, set the tag normally.
31
+ super if defined?(super)
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,40 @@
1
+ require 'logger'
2
+
3
+ module Datadog
4
+ # A custom logger with minor enhancements:
5
+ # - progname defaults to ddtrace to clearly identify Datadog dd-trace-rb related messages
6
+ # - adds last caller stack-trace info to know where the message comes from
7
+ class Logger < ::Logger
8
+ PREFIX = 'ddtrace'.freeze
9
+
10
+ def initialize(*args, &block)
11
+ super
12
+ self.progname = PREFIX
13
+ self.level = ::Logger::WARN
14
+ end
15
+
16
+ def add(severity, message = nil, progname = nil, &block)
17
+ where = ''
18
+
19
+ # We are in debug mode, or this is an error, add stack trace to help debugging
20
+ if debug? || severity >= ::Logger::ERROR
21
+ c = caller
22
+ where = "(#{c[1]}) " if c.length > 1
23
+ end
24
+
25
+ if message.nil?
26
+ if block_given?
27
+ super(severity, message, progname) do
28
+ "[#{self.progname}] #{where}#{yield}"
29
+ end
30
+ else
31
+ super(severity, message, "[#{self.progname}] #{where}#{progname}")
32
+ end
33
+ else
34
+ super(severity, "[#{self.progname}] #{where}#{message}")
35
+ end
36
+ end
37
+
38
+ alias log add
39
+ end
40
+ end
@@ -0,0 +1,222 @@
1
+ require 'ddtrace/ext/metrics'
2
+
3
+ require 'set'
4
+ require 'logger'
5
+ require 'ddtrace/environment'
6
+ require 'ddtrace/utils/time'
7
+ require 'ddtrace/runtime/identity'
8
+
9
+ module Datadog
10
+ # Acts as client for sending metrics (via Statsd)
11
+ # Wraps a Statsd client with default tags and additional configuration.
12
+ class Metrics
13
+ attr_reader :statsd
14
+
15
+ def initialize(options = {})
16
+ @statsd = options.fetch(:statsd) { default_statsd_client if supported? }
17
+ @enabled = options.fetch(:enabled, true)
18
+ end
19
+
20
+ def supported?
21
+ version = Gem.loaded_specs['dogstatsd-ruby'] \
22
+ && Gem.loaded_specs['dogstatsd-ruby'].version
23
+
24
+ !version.nil? && (version >= Gem::Version.new('3.3.0'))
25
+ end
26
+
27
+ def enabled?
28
+ @enabled
29
+ end
30
+
31
+ def enabled=(enabled)
32
+ @enabled = (enabled == true)
33
+ end
34
+
35
+ def default_hostname
36
+ ENV.fetch(Datadog::Ext::Metrics::ENV_DEFAULT_HOST, Datadog::Ext::Metrics::DEFAULT_HOST)
37
+ end
38
+
39
+ def default_port
40
+ ENV.fetch(Datadog::Ext::Metrics::ENV_DEFAULT_PORT, Datadog::Ext::Metrics::DEFAULT_PORT).to_i
41
+ end
42
+
43
+ def default_statsd_client
44
+ require 'datadog/statsd' unless defined?(::Datadog::Statsd)
45
+
46
+ # Create a StatsD client that points to the agent.
47
+ Datadog::Statsd.new(default_hostname, default_port)
48
+ end
49
+
50
+ def configure(options = {})
51
+ @statsd = options[:statsd] if options.key?(:statsd)
52
+ self.enabled = options[:enabled] if options.key?(:enabled)
53
+ end
54
+
55
+ def send_stats?
56
+ enabled? && !statsd.nil?
57
+ end
58
+
59
+ def count(stat, value = nil, options = nil, &block)
60
+ return unless send_stats? && statsd.respond_to?(:count)
61
+ value, options = yield if block_given?
62
+ raise ArgumentError if value.nil?
63
+
64
+ statsd.count(stat, value, metric_options(options))
65
+ rescue StandardError => e
66
+ Datadog.logger.error("Failed to send count stat. Cause: #{e.message} Source: #{e.backtrace.first}")
67
+ end
68
+
69
+ def distribution(stat, value = nil, options = nil, &block)
70
+ return unless send_stats? && statsd.respond_to?(:distribution)
71
+ value, options = yield if block_given?
72
+ raise ArgumentError if value.nil?
73
+
74
+ statsd.distribution(stat, value, metric_options(options))
75
+ rescue StandardError => e
76
+ Datadog.logger.error("Failed to send distribution stat. Cause: #{e.message} Source: #{e.backtrace.first}")
77
+ end
78
+
79
+ def increment(stat, options = nil)
80
+ return unless send_stats? && statsd.respond_to?(:increment)
81
+ options = yield if block_given?
82
+
83
+ statsd.increment(stat, metric_options(options))
84
+ rescue StandardError => e
85
+ Datadog.logger.error("Failed to send increment stat. Cause: #{e.message} Source: #{e.backtrace.first}")
86
+ end
87
+
88
+ def gauge(stat, value = nil, options = nil, &block)
89
+ return unless send_stats? && statsd.respond_to?(:gauge)
90
+ value, options = yield if block_given?
91
+ raise ArgumentError if value.nil?
92
+
93
+ statsd.gauge(stat, value, metric_options(options))
94
+ rescue StandardError => e
95
+ Datadog.logger.error("Failed to send gauge stat. Cause: #{e.message} Source: #{e.backtrace.first}")
96
+ end
97
+
98
+ def time(stat, options = nil)
99
+ return yield unless send_stats?
100
+
101
+ # Calculate time, send it as a distribution.
102
+ start = Utils::Time.get_time
103
+ return yield
104
+ ensure
105
+ begin
106
+ if send_stats? && !start.nil?
107
+ finished = Utils::Time.get_time
108
+ distribution(stat, ((finished - start) * 1000), options)
109
+ end
110
+ rescue StandardError => e
111
+ Datadog.logger.error("Failed to send time stat. Cause: #{e.message} Source: #{e.backtrace.first}")
112
+ end
113
+ end
114
+
115
+ def send_metrics(metrics)
116
+ metrics.each { |m| send(m.type, *[m.name, m.value, m.options].compact) }
117
+ end
118
+
119
+ Metric = Struct.new(:type, :name, :value, :options) do
120
+ def initialize(*args)
121
+ super
122
+ self.options = options || {}
123
+ end
124
+ end
125
+
126
+ # For defining and adding default options to metrics
127
+ module Options
128
+ DEFAULT = {
129
+ tags: DEFAULT_TAGS = [
130
+ "#{Ext::Metrics::TAG_LANG}:#{Runtime::Identity.lang}".freeze,
131
+ "#{Ext::Metrics::TAG_LANG_INTERPRETER}:#{Runtime::Identity.lang_interpreter}".freeze,
132
+ "#{Ext::Metrics::TAG_LANG_VERSION}:#{Runtime::Identity.lang_version}".freeze,
133
+ "#{Ext::Metrics::TAG_TRACER_VERSION}:#{Runtime::Identity.tracer_version}".freeze
134
+ ].freeze
135
+ }.freeze
136
+
137
+ def metric_options(options = nil)
138
+ return default_metric_options if options.nil?
139
+
140
+ default_metric_options.merge(options) do |key, old_value, new_value|
141
+ case key
142
+ when :tags
143
+ old_value.dup.concat(new_value).uniq
144
+ else
145
+ new_value
146
+ end
147
+ end
148
+ end
149
+
150
+ def default_metric_options
151
+ # Return dupes, so that the constant isn't modified,
152
+ # and defaults are unfrozen for mutation in Statsd.
153
+ DEFAULT.dup.tap do |options|
154
+ options[:tags] = options[:tags].dup
155
+
156
+ env = Datadog.configuration.env
157
+ options[:tags] << "#{Datadog::Ext::Environment::TAG_ENV}:#{env}" unless env.nil?
158
+
159
+ version = Datadog.configuration.version
160
+ options[:tags] << "#{Datadog::Ext::Environment::TAG_VERSION}:#{version}" unless version.nil?
161
+ end
162
+ end
163
+ end
164
+
165
+ # For defining and adding helpers to metrics
166
+ module Helpers
167
+ [
168
+ :count,
169
+ :distribution,
170
+ :increment,
171
+ :gauge,
172
+ :time
173
+ ].each do |metric_type|
174
+ define_method(metric_type) do |name, stat|
175
+ name = name.to_sym
176
+ define_method(name) do |*args, &block|
177
+ send(metric_type, stat, *args, &block)
178
+ end
179
+ end
180
+ end
181
+ end
182
+
183
+ module Logging
184
+ # Surrogate for Datadog::Statsd to log elsewhere
185
+ class Adapter
186
+ attr_accessor :logger
187
+
188
+ def initialize(logger = nil)
189
+ @logger = logger || Logger.new(STDOUT).tap do |l|
190
+ l.level = Logger::INFO
191
+ l.progname = nil
192
+ l.formatter = proc do |_severity, datetime, _progname, msg|
193
+ stat = JSON.parse(msg[3..-1]) # Trim off leading progname...
194
+ "#{JSON.dump(timestamp: datetime.to_i, message: 'Metric sent.', metric: stat)}\n"
195
+ end
196
+ end
197
+ end
198
+
199
+ def count(stat, value, options = nil)
200
+ logger.info({ stat: stat, type: :count, value: value, options: options }.to_json)
201
+ end
202
+
203
+ def distribution(stat, value, options = nil)
204
+ logger.info({ stat: stat, type: :distribution, value: value, options: options }.to_json)
205
+ end
206
+
207
+ def increment(stat, options = nil)
208
+ logger.info({ stat: stat, type: :increment, options: options }.to_json)
209
+ end
210
+
211
+ def gauge(stat, value, options = nil)
212
+ logger.info({ stat: stat, type: :gauge, value: value, options: options }.to_json)
213
+ end
214
+ end
215
+ end
216
+
217
+ # Make available on for both class and instance.
218
+ include Options
219
+ extend Options
220
+ extend Helpers
221
+ end
222
+ end