ddtrace 1.1.0 → 1.9.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 (641) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +423 -1
  3. data/LICENSE-3rdparty.csv +3 -0
  4. data/README.md +9 -4
  5. data/ext/ddtrace_profiling_loader/ddtrace_profiling_loader.c +21 -5
  6. data/ext/ddtrace_profiling_loader/extconf.rb +22 -1
  7. data/ext/ddtrace_profiling_native_extension/NativeExtensionDesign.md +52 -8
  8. data/ext/ddtrace_profiling_native_extension/clock_id.h +22 -1
  9. data/ext/ddtrace_profiling_native_extension/clock_id_from_pthread.c +34 -3
  10. data/ext/ddtrace_profiling_native_extension/clock_id_noop.c +11 -2
  11. data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time.c +899 -0
  12. data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time.h +9 -0
  13. data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +776 -0
  14. data/ext/ddtrace_profiling_native_extension/collectors_dynamic_sampling_rate.c +142 -0
  15. data/ext/ddtrace_profiling_native_extension/collectors_dynamic_sampling_rate.h +14 -0
  16. data/ext/ddtrace_profiling_native_extension/collectors_idle_sampling_helper.c +241 -0
  17. data/ext/ddtrace_profiling_native_extension/collectors_idle_sampling_helper.h +3 -0
  18. data/ext/ddtrace_profiling_native_extension/collectors_stack.c +175 -63
  19. data/ext/ddtrace_profiling_native_extension/collectors_stack.h +18 -0
  20. data/ext/ddtrace_profiling_native_extension/extconf.rb +90 -18
  21. data/ext/ddtrace_profiling_native_extension/helpers.h +17 -0
  22. data/ext/ddtrace_profiling_native_extension/http_transport.c +354 -0
  23. data/ext/ddtrace_profiling_native_extension/libdatadog_helpers.h +18 -0
  24. data/ext/ddtrace_profiling_native_extension/native_extension_helpers.rb +154 -21
  25. data/ext/ddtrace_profiling_native_extension/private_vm_api_access.c +256 -17
  26. data/ext/ddtrace_profiling_native_extension/private_vm_api_access.h +17 -5
  27. data/ext/ddtrace_profiling_native_extension/profiling.c +223 -3
  28. data/ext/ddtrace_profiling_native_extension/ruby_helpers.c +110 -0
  29. data/ext/ddtrace_profiling_native_extension/ruby_helpers.h +89 -0
  30. data/ext/ddtrace_profiling_native_extension/setup_signal_handler.c +115 -0
  31. data/ext/ddtrace_profiling_native_extension/setup_signal_handler.h +11 -0
  32. data/ext/ddtrace_profiling_native_extension/stack_recorder.c +392 -44
  33. data/ext/ddtrace_profiling_native_extension/stack_recorder.h +25 -14
  34. data/ext/ddtrace_profiling_native_extension/time_helpers.c +17 -0
  35. data/ext/ddtrace_profiling_native_extension/time_helpers.h +10 -0
  36. data/lib/datadog/appsec/assets/blocked.html +98 -3
  37. data/lib/datadog/appsec/assets/blocked.json +1 -0
  38. data/lib/datadog/appsec/assets/blocked.text +5 -0
  39. data/lib/datadog/appsec/assets/waf_rules/recommended.json +1250 -300
  40. data/lib/datadog/appsec/assets/waf_rules/risky.json +78 -78
  41. data/lib/datadog/appsec/assets/waf_rules/strict.json +308 -73
  42. data/lib/datadog/appsec/assets.rb +3 -3
  43. data/lib/datadog/appsec/autoload.rb +4 -2
  44. data/lib/datadog/appsec/configuration/settings.rb +40 -23
  45. data/lib/datadog/appsec/configuration.rb +9 -3
  46. data/lib/datadog/appsec/contrib/auto_instrument.rb +1 -3
  47. data/lib/datadog/appsec/contrib/configuration/settings.rb +2 -2
  48. data/lib/datadog/appsec/contrib/integration.rb +1 -1
  49. data/lib/datadog/appsec/contrib/patcher.rb +1 -1
  50. data/lib/datadog/appsec/contrib/rack/configuration/settings.rb +3 -3
  51. data/lib/datadog/appsec/contrib/rack/ext.rb +1 -1
  52. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +32 -27
  53. data/lib/datadog/appsec/contrib/rack/integration.rb +5 -5
  54. data/lib/datadog/appsec/contrib/rack/patcher.rb +2 -2
  55. data/lib/datadog/appsec/contrib/rack/reactive/request.rb +17 -21
  56. data/lib/datadog/appsec/contrib/rack/reactive/request_body.rb +13 -13
  57. data/lib/datadog/appsec/contrib/rack/reactive/response.rb +13 -13
  58. data/lib/datadog/appsec/contrib/rack/request.rb +21 -1
  59. data/lib/datadog/appsec/contrib/rack/request_body_middleware.rb +3 -3
  60. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +50 -23
  61. data/lib/datadog/appsec/contrib/rack/response.rb +1 -1
  62. data/lib/datadog/appsec/contrib/rails/configuration/settings.rb +3 -3
  63. data/lib/datadog/appsec/contrib/rails/ext.rb +1 -1
  64. data/lib/datadog/appsec/contrib/rails/framework.rb +1 -1
  65. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +12 -11
  66. data/lib/datadog/appsec/contrib/rails/integration.rb +5 -5
  67. data/lib/datadog/appsec/contrib/rails/patcher.rb +14 -13
  68. data/lib/datadog/appsec/contrib/rails/reactive/action.rb +13 -13
  69. data/lib/datadog/appsec/contrib/rails/request.rb +4 -1
  70. data/lib/datadog/appsec/contrib/rails/request_middleware.rb +1 -1
  71. data/lib/datadog/appsec/contrib/sinatra/configuration/settings.rb +3 -3
  72. data/lib/datadog/appsec/contrib/sinatra/ext.rb +2 -1
  73. data/lib/datadog/appsec/contrib/sinatra/framework.rb +1 -1
  74. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +21 -19
  75. data/lib/datadog/appsec/contrib/sinatra/integration.rb +4 -4
  76. data/lib/datadog/appsec/contrib/sinatra/patcher.rb +22 -15
  77. data/lib/datadog/appsec/contrib/sinatra/reactive/routed.rb +12 -12
  78. data/lib/datadog/appsec/contrib/sinatra/request_middleware.rb +1 -1
  79. data/lib/datadog/appsec/event.rb +10 -14
  80. data/lib/datadog/appsec/extensions.rb +43 -23
  81. data/lib/datadog/appsec/instrumentation/gateway.rb +17 -3
  82. data/lib/datadog/appsec/processor.rb +51 -21
  83. data/lib/datadog/appsec/rate_limiter.rb +1 -1
  84. data/lib/datadog/appsec/reactive/address_hash.rb +1 -1
  85. data/lib/datadog/appsec/reactive/engine.rb +3 -3
  86. data/lib/datadog/appsec/reactive/operation.rb +5 -5
  87. data/lib/datadog/appsec/reactive/subscriber.rb +1 -1
  88. data/lib/datadog/appsec/response.rb +63 -0
  89. data/lib/datadog/appsec/utils/http/media_range.rb +201 -0
  90. data/lib/datadog/appsec/utils/http/media_type.rb +87 -0
  91. data/lib/datadog/appsec/utils/http.rb +9 -0
  92. data/lib/datadog/appsec/utils.rb +7 -0
  93. data/lib/datadog/appsec.rb +6 -6
  94. data/lib/datadog/ci/configuration/components.rb +1 -1
  95. data/lib/datadog/ci/configuration/settings.rb +1 -1
  96. data/lib/datadog/ci/contrib/cucumber/configuration/settings.rb +2 -2
  97. data/lib/datadog/ci/contrib/cucumber/formatter.rb +5 -5
  98. data/lib/datadog/ci/contrib/cucumber/instrumentation.rb +1 -1
  99. data/lib/datadog/ci/contrib/cucumber/integration.rb +4 -4
  100. data/lib/datadog/ci/contrib/cucumber/patcher.rb +2 -2
  101. data/lib/datadog/ci/contrib/rspec/configuration/settings.rb +2 -2
  102. data/lib/datadog/ci/contrib/rspec/example.rb +5 -5
  103. data/lib/datadog/ci/contrib/rspec/integration.rb +4 -4
  104. data/lib/datadog/ci/contrib/rspec/patcher.rb +2 -2
  105. data/lib/datadog/ci/ext/environment.rb +78 -20
  106. data/lib/datadog/ci/extensions.rb +4 -4
  107. data/lib/datadog/ci/flush.rb +2 -2
  108. data/lib/datadog/ci/test.rb +3 -3
  109. data/lib/datadog/ci.rb +6 -6
  110. data/lib/datadog/core/buffer/cruby.rb +1 -1
  111. data/lib/datadog/core/buffer/thread_safe.rb +1 -1
  112. data/lib/datadog/core/configuration/agent_settings_resolver.rb +8 -11
  113. data/lib/datadog/core/configuration/base.rb +14 -2
  114. data/lib/datadog/core/configuration/components.rb +103 -52
  115. data/lib/datadog/core/configuration/ext.rb +26 -0
  116. data/lib/datadog/core/configuration/option_definition.rb +12 -3
  117. data/lib/datadog/core/configuration/option_definition_set.rb +1 -1
  118. data/lib/datadog/core/configuration/options.rb +3 -3
  119. data/lib/datadog/core/configuration/settings.rb +78 -250
  120. data/lib/datadog/core/configuration.rb +9 -6
  121. data/lib/datadog/core/diagnostics/environment_logger.rb +10 -5
  122. data/lib/datadog/core/diagnostics/health.rb +5 -23
  123. data/lib/datadog/core/environment/cgroup.rb +1 -1
  124. data/lib/datadog/core/environment/container.rb +1 -1
  125. data/lib/datadog/core/environment/ext.rb +1 -1
  126. data/lib/datadog/core/environment/identity.rb +2 -2
  127. data/lib/datadog/core/environment/platform.rb +40 -0
  128. data/lib/datadog/core/environment/socket.rb +1 -1
  129. data/lib/datadog/core/environment/variable_helpers.rb +58 -10
  130. data/lib/datadog/core/error.rb +1 -1
  131. data/lib/datadog/core/extensions.rb +1 -1
  132. data/lib/datadog/core/header_collection.rb +41 -0
  133. data/lib/datadog/core/metrics/client.rb +10 -9
  134. data/lib/datadog/core/metrics/ext.rb +0 -2
  135. data/lib/datadog/core/metrics/options.rb +3 -3
  136. data/lib/datadog/core/runtime/ext.rb +1 -1
  137. data/lib/datadog/core/runtime/metrics.rb +6 -6
  138. data/lib/datadog/core/telemetry/client.rb +79 -0
  139. data/lib/datadog/core/telemetry/collector.rb +233 -0
  140. data/lib/datadog/core/telemetry/emitter.rb +48 -0
  141. data/lib/datadog/core/telemetry/event.rb +71 -0
  142. data/lib/datadog/core/telemetry/ext.rb +11 -0
  143. data/lib/datadog/core/telemetry/heartbeat.rb +37 -0
  144. data/lib/datadog/core/telemetry/http/adapters/net.rb +113 -0
  145. data/lib/datadog/core/telemetry/http/env.rb +20 -0
  146. data/lib/datadog/core/telemetry/http/ext.rb +20 -0
  147. data/lib/datadog/core/telemetry/http/response.rb +68 -0
  148. data/lib/datadog/core/telemetry/http/transport.rb +53 -0
  149. data/lib/datadog/core/telemetry/v1/app_event.rb +52 -0
  150. data/lib/datadog/core/telemetry/v1/application.rb +86 -0
  151. data/lib/datadog/core/telemetry/v1/configuration.rb +25 -0
  152. data/lib/datadog/core/telemetry/v1/dependency.rb +36 -0
  153. data/lib/datadog/core/telemetry/v1/host.rb +51 -0
  154. data/lib/datadog/core/telemetry/v1/integration.rb +58 -0
  155. data/lib/datadog/core/telemetry/v1/product.rb +28 -0
  156. data/lib/datadog/core/telemetry/v1/telemetry_request.rb +100 -0
  157. data/lib/datadog/core/utils/compression.rb +5 -1
  158. data/lib/datadog/core/utils/object_set.rb +1 -1
  159. data/lib/datadog/core/utils/sequence.rb +5 -0
  160. data/lib/datadog/core/utils/string_table.rb +1 -1
  161. data/lib/datadog/core/utils/time.rb +3 -3
  162. data/lib/datadog/core/utils.rb +1 -22
  163. data/lib/datadog/core/vendor/multipart-post/multipart/post/multipartable.rb +2 -2
  164. data/lib/datadog/core/vendor/multipart-post/net/http/post/multipart.rb +3 -3
  165. data/lib/datadog/core/workers/async.rb +1 -3
  166. data/lib/datadog/core/workers/polling.rb +2 -2
  167. data/lib/datadog/core/workers/runtime_metrics.rb +4 -4
  168. data/lib/datadog/core.rb +22 -56
  169. data/lib/datadog/kit/appsec/events.rb +75 -0
  170. data/lib/datadog/kit/enable_core_dumps.rb +1 -0
  171. data/lib/datadog/kit/identity.rb +8 -7
  172. data/lib/datadog/kit.rb +1 -1
  173. data/lib/datadog/opentelemetry/api/context.rb +187 -0
  174. data/lib/datadog/opentelemetry/api/trace/span.rb +15 -0
  175. data/lib/datadog/opentelemetry/sdk/configurator.rb +38 -0
  176. data/lib/datadog/opentelemetry/sdk/id_generator.rb +27 -0
  177. data/lib/datadog/opentelemetry/sdk/propagator.rb +91 -0
  178. data/lib/datadog/opentelemetry/sdk/span_processor.rb +92 -0
  179. data/lib/datadog/opentelemetry.rb +48 -0
  180. data/lib/datadog/opentracer/distributed_headers.rb +7 -9
  181. data/lib/datadog/opentracer/rack_propagator.rb +10 -9
  182. data/lib/datadog/opentracer/span.rb +1 -1
  183. data/lib/datadog/opentracer/text_map_propagator.rb +13 -12
  184. data/lib/datadog/opentracer/thread_local_scope_manager.rb +26 -3
  185. data/lib/datadog/opentracer/tracer.rb +23 -21
  186. data/lib/datadog/opentracer.rb +16 -16
  187. data/lib/datadog/profiling/buffer.rb +3 -3
  188. data/lib/datadog/profiling/collectors/code_provenance.rb +1 -0
  189. data/lib/datadog/profiling/collectors/cpu_and_wall_time.rb +43 -0
  190. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +91 -0
  191. data/lib/datadog/profiling/collectors/dynamic_sampling_rate.rb +14 -0
  192. data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +68 -0
  193. data/lib/datadog/profiling/collectors/old_stack.rb +15 -8
  194. data/lib/datadog/profiling/collectors/stack.rb +3 -6
  195. data/lib/datadog/profiling/encoding/profile.rb +8 -12
  196. data/lib/datadog/profiling/events/stack.rb +1 -1
  197. data/lib/datadog/profiling/exporter.rb +69 -9
  198. data/lib/datadog/profiling/ext/forking.rb +41 -42
  199. data/lib/datadog/profiling/ext.rb +3 -15
  200. data/lib/datadog/profiling/flush.rb +25 -56
  201. data/lib/datadog/profiling/http_transport.rb +132 -0
  202. data/lib/datadog/profiling/old_recorder.rb +109 -0
  203. data/lib/datadog/profiling/pprof/builder.rb +4 -4
  204. data/lib/datadog/profiling/pprof/converter.rb +1 -1
  205. data/lib/datadog/profiling/pprof/message_set.rb +1 -1
  206. data/lib/datadog/profiling/pprof/stack_sample.rb +4 -4
  207. data/lib/datadog/profiling/pprof/string_table.rb +1 -1
  208. data/lib/datadog/profiling/pprof/template.rb +5 -5
  209. data/lib/datadog/profiling/preload.rb +1 -1
  210. data/lib/datadog/profiling/profiler.rb +7 -0
  211. data/lib/datadog/profiling/scheduler.rb +28 -49
  212. data/lib/datadog/profiling/stack_recorder.rb +50 -4
  213. data/lib/datadog/profiling/tag_builder.rb +6 -1
  214. data/lib/datadog/profiling/tasks/setup.rb +2 -9
  215. data/lib/datadog/profiling/trace_identifiers/ddtrace.rb +2 -2
  216. data/lib/datadog/profiling/trace_identifiers/helper.rb +1 -1
  217. data/lib/datadog/profiling.rb +24 -21
  218. data/lib/datadog/tracing/analytics.rb +1 -1
  219. data/lib/datadog/tracing/buffer.rb +5 -5
  220. data/lib/datadog/tracing/client_ip.rb +164 -0
  221. data/lib/datadog/tracing/configuration/ext.rb +47 -4
  222. data/lib/datadog/tracing/configuration/settings.rb +433 -0
  223. data/lib/datadog/tracing/context.rb +1 -1
  224. data/lib/datadog/tracing/context_provider.rb +18 -2
  225. data/lib/datadog/tracing/contrib/action_cable/configuration/settings.rb +2 -2
  226. data/lib/datadog/tracing/contrib/action_cable/event.rb +4 -5
  227. data/lib/datadog/tracing/contrib/action_cable/events/broadcast.rb +4 -4
  228. data/lib/datadog/tracing/contrib/action_cable/events/perform_action.rb +3 -3
  229. data/lib/datadog/tracing/contrib/action_cable/events/transmit.rb +4 -4
  230. data/lib/datadog/tracing/contrib/action_cable/events.rb +4 -4
  231. data/lib/datadog/tracing/contrib/action_cable/instrumentation.rb +3 -4
  232. data/lib/datadog/tracing/contrib/action_cable/integration.rb +4 -4
  233. data/lib/datadog/tracing/contrib/action_cable/patcher.rb +4 -4
  234. data/lib/datadog/tracing/contrib/action_mailer/configuration/settings.rb +2 -2
  235. data/lib/datadog/tracing/contrib/action_mailer/event.rb +3 -3
  236. data/lib/datadog/tracing/contrib/action_mailer/events/deliver.rb +3 -3
  237. data/lib/datadog/tracing/contrib/action_mailer/events/process.rb +3 -3
  238. data/lib/datadog/tracing/contrib/action_mailer/events.rb +2 -2
  239. data/lib/datadog/tracing/contrib/action_mailer/integration.rb +4 -4
  240. data/lib/datadog/tracing/contrib/action_mailer/patcher.rb +3 -3
  241. data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +10 -6
  242. data/lib/datadog/tracing/contrib/action_pack/action_controller/patcher.rb +2 -2
  243. data/lib/datadog/tracing/contrib/action_pack/configuration/settings.rb +2 -2
  244. data/lib/datadog/tracing/contrib/action_pack/integration.rb +4 -4
  245. data/lib/datadog/tracing/contrib/action_pack/patcher.rb +2 -2
  246. data/lib/datadog/tracing/contrib/action_pack/utils.rb +1 -1
  247. data/lib/datadog/tracing/contrib/action_view/configuration/settings.rb +2 -2
  248. data/lib/datadog/tracing/contrib/action_view/event.rb +1 -1
  249. data/lib/datadog/tracing/contrib/action_view/events/render_partial.rb +5 -5
  250. data/lib/datadog/tracing/contrib/action_view/events/render_template.rb +5 -5
  251. data/lib/datadog/tracing/contrib/action_view/events.rb +2 -2
  252. data/lib/datadog/tracing/contrib/action_view/instrumentation/partial_renderer.rb +2 -2
  253. data/lib/datadog/tracing/contrib/action_view/instrumentation/template_renderer.rb +2 -2
  254. data/lib/datadog/tracing/contrib/action_view/integration.rb +4 -4
  255. data/lib/datadog/tracing/contrib/action_view/patcher.rb +7 -7
  256. data/lib/datadog/tracing/contrib/action_view/utils.rb +1 -1
  257. data/lib/datadog/tracing/contrib/active_job/configuration/settings.rb +3 -3
  258. data/lib/datadog/tracing/contrib/active_job/event.rb +3 -3
  259. data/lib/datadog/tracing/contrib/active_job/events/discard.rb +4 -4
  260. data/lib/datadog/tracing/contrib/active_job/events/enqueue.rb +4 -4
  261. data/lib/datadog/tracing/contrib/active_job/events/enqueue_at.rb +4 -4
  262. data/lib/datadog/tracing/contrib/active_job/events/enqueue_retry.rb +4 -4
  263. data/lib/datadog/tracing/contrib/active_job/events/perform.rb +4 -4
  264. data/lib/datadog/tracing/contrib/active_job/events/retry_stopped.rb +4 -4
  265. data/lib/datadog/tracing/contrib/active_job/events.rb +6 -6
  266. data/lib/datadog/tracing/contrib/active_job/integration.rb +4 -4
  267. data/lib/datadog/tracing/contrib/active_job/log_injection.rb +0 -2
  268. data/lib/datadog/tracing/contrib/active_job/patcher.rb +4 -4
  269. data/lib/datadog/tracing/contrib/active_model_serializers/configuration/settings.rb +2 -2
  270. data/lib/datadog/tracing/contrib/active_model_serializers/event.rb +4 -5
  271. data/lib/datadog/tracing/contrib/active_model_serializers/events/render.rb +3 -3
  272. data/lib/datadog/tracing/contrib/active_model_serializers/events/serialize.rb +2 -2
  273. data/lib/datadog/tracing/contrib/active_model_serializers/events.rb +2 -2
  274. data/lib/datadog/tracing/contrib/active_model_serializers/integration.rb +3 -3
  275. data/lib/datadog/tracing/contrib/active_model_serializers/patcher.rb +3 -4
  276. data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +2 -2
  277. data/lib/datadog/tracing/contrib/active_record/configuration/settings.rb +3 -3
  278. data/lib/datadog/tracing/contrib/active_record/event.rb +1 -1
  279. data/lib/datadog/tracing/contrib/active_record/events/instantiation.rb +4 -4
  280. data/lib/datadog/tracing/contrib/active_record/events/sql.rb +6 -6
  281. data/lib/datadog/tracing/contrib/active_record/events.rb +2 -2
  282. data/lib/datadog/tracing/contrib/active_record/integration.rb +6 -6
  283. data/lib/datadog/tracing/contrib/active_record/patcher.rb +2 -2
  284. data/lib/datadog/tracing/contrib/active_record/utils.rb +2 -2
  285. data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +19 -9
  286. data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +2 -2
  287. data/lib/datadog/tracing/contrib/active_support/cache/redis.rb +1 -1
  288. data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +2 -2
  289. data/lib/datadog/tracing/contrib/active_support/integration.rb +5 -5
  290. data/lib/datadog/tracing/contrib/active_support/notifications/event.rb +1 -1
  291. data/lib/datadog/tracing/contrib/active_support/notifications/subscriber.rb +1 -1
  292. data/lib/datadog/tracing/contrib/active_support/patcher.rb +2 -2
  293. data/lib/datadog/tracing/contrib/analytics.rb +1 -1
  294. data/lib/datadog/tracing/contrib/auto_instrument.rb +4 -4
  295. data/lib/datadog/tracing/contrib/aws/configuration/settings.rb +6 -3
  296. data/lib/datadog/tracing/contrib/aws/ext.rb +1 -0
  297. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +5 -4
  298. data/lib/datadog/tracing/contrib/aws/integration.rb +3 -3
  299. data/lib/datadog/tracing/contrib/aws/patcher.rb +5 -5
  300. data/lib/datadog/tracing/contrib/aws/services.rb +0 -2
  301. data/lib/datadog/tracing/contrib/concurrent_ruby/configuration/settings.rb +2 -2
  302. data/lib/datadog/tracing/contrib/concurrent_ruby/future_patch.rb +1 -1
  303. data/lib/datadog/tracing/contrib/concurrent_ruby/integration.rb +3 -3
  304. data/lib/datadog/tracing/contrib/concurrent_ruby/patcher.rb +2 -2
  305. data/lib/datadog/tracing/contrib/configurable.rb +2 -2
  306. data/lib/datadog/tracing/contrib/configuration/resolvers/pattern_resolver.rb +1 -1
  307. data/lib/datadog/tracing/contrib/configuration/settings.rb +2 -2
  308. data/lib/datadog/tracing/contrib/dalli/configuration/settings.rb +6 -3
  309. data/lib/datadog/tracing/contrib/dalli/ext.rb +2 -0
  310. data/lib/datadog/tracing/contrib/dalli/instrumentation.rb +8 -5
  311. data/lib/datadog/tracing/contrib/dalli/integration.rb +3 -3
  312. data/lib/datadog/tracing/contrib/dalli/patcher.rb +3 -3
  313. data/lib/datadog/tracing/contrib/dalli/quantize.rb +1 -1
  314. data/lib/datadog/tracing/contrib/delayed_job/configuration/settings.rb +3 -3
  315. data/lib/datadog/tracing/contrib/delayed_job/ext.rb +2 -0
  316. data/lib/datadog/tracing/contrib/delayed_job/integration.rb +3 -3
  317. data/lib/datadog/tracing/contrib/delayed_job/patcher.rb +8 -2
  318. data/lib/datadog/tracing/contrib/delayed_job/plugin.rb +7 -4
  319. data/lib/datadog/tracing/contrib/delayed_job/server_internal_tracer/worker.rb +32 -0
  320. data/lib/datadog/tracing/contrib/elasticsearch/configuration/settings.rb +7 -3
  321. data/lib/datadog/tracing/contrib/elasticsearch/ext.rb +3 -0
  322. data/lib/datadog/tracing/contrib/elasticsearch/integration.rb +3 -3
  323. data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +9 -7
  324. data/lib/datadog/tracing/contrib/elasticsearch/quantize.rb +1 -1
  325. data/lib/datadog/tracing/contrib/ethon/configuration/settings.rb +8 -3
  326. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +6 -7
  327. data/lib/datadog/tracing/contrib/ethon/ext.rb +1 -0
  328. data/lib/datadog/tracing/contrib/ethon/integration.rb +4 -4
  329. data/lib/datadog/tracing/contrib/ethon/multi_patch.rb +5 -4
  330. data/lib/datadog/tracing/contrib/ethon/patcher.rb +3 -3
  331. data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +7 -3
  332. data/lib/datadog/tracing/contrib/excon/ext.rb +1 -0
  333. data/lib/datadog/tracing/contrib/excon/integration.rb +4 -4
  334. data/lib/datadog/tracing/contrib/excon/middleware.rb +8 -7
  335. data/lib/datadog/tracing/contrib/excon/patcher.rb +2 -2
  336. data/lib/datadog/tracing/contrib/ext.rb +25 -0
  337. data/lib/datadog/tracing/contrib/extensions.rb +5 -3
  338. data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +7 -3
  339. data/lib/datadog/tracing/contrib/faraday/ext.rb +1 -0
  340. data/lib/datadog/tracing/contrib/faraday/integration.rb +4 -4
  341. data/lib/datadog/tracing/contrib/faraday/middleware.rb +8 -8
  342. data/lib/datadog/tracing/contrib/faraday/patcher.rb +5 -5
  343. data/lib/datadog/tracing/contrib/grape/configuration/settings.rb +3 -3
  344. data/lib/datadog/tracing/contrib/grape/endpoint.rb +4 -7
  345. data/lib/datadog/tracing/contrib/grape/integration.rb +3 -3
  346. data/lib/datadog/tracing/contrib/grape/patcher.rb +4 -4
  347. data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +3 -3
  348. data/lib/datadog/tracing/contrib/graphql/integration.rb +3 -3
  349. data/lib/datadog/tracing/contrib/graphql/patcher.rb +2 -3
  350. data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +10 -4
  351. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +20 -5
  352. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +17 -17
  353. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor.rb +7 -4
  354. data/lib/datadog/tracing/contrib/grpc/distributed/fetcher.rb +27 -0
  355. data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +43 -0
  356. data/lib/datadog/tracing/contrib/grpc/ext.rb +4 -0
  357. data/lib/datadog/tracing/contrib/grpc/integration.rb +3 -3
  358. data/lib/datadog/tracing/contrib/grpc/patcher.rb +3 -5
  359. data/lib/datadog/tracing/contrib/hanami/action_tracer.rb +47 -0
  360. data/lib/datadog/tracing/contrib/hanami/configuration/settings.rb +22 -0
  361. data/lib/datadog/tracing/contrib/hanami/ext.rb +24 -0
  362. data/lib/datadog/tracing/contrib/hanami/integration.rb +44 -0
  363. data/lib/datadog/tracing/contrib/hanami/patcher.rb +33 -0
  364. data/lib/datadog/tracing/contrib/hanami/plugin.rb +23 -0
  365. data/lib/datadog/tracing/contrib/hanami/renderer_policy_tracing.rb +41 -0
  366. data/lib/datadog/tracing/contrib/hanami/router_tracing.rb +44 -0
  367. data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +1 -2
  368. data/lib/datadog/tracing/contrib/http/configuration/settings.rb +13 -3
  369. data/lib/datadog/tracing/contrib/http/distributed/fetcher.rb +39 -0
  370. data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +38 -0
  371. data/lib/datadog/tracing/contrib/http/ext.rb +2 -0
  372. data/lib/datadog/tracing/contrib/http/instrumentation.rb +8 -10
  373. data/lib/datadog/tracing/contrib/http/integration.rb +6 -6
  374. data/lib/datadog/tracing/contrib/http/patcher.rb +3 -3
  375. data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +13 -3
  376. data/lib/datadog/tracing/contrib/httpclient/ext.rb +2 -0
  377. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +9 -9
  378. data/lib/datadog/tracing/contrib/httpclient/integration.rb +4 -4
  379. data/lib/datadog/tracing/contrib/httpclient/patcher.rb +3 -3
  380. data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +13 -3
  381. data/lib/datadog/tracing/contrib/httprb/ext.rb +2 -0
  382. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +9 -9
  383. data/lib/datadog/tracing/contrib/httprb/integration.rb +4 -4
  384. data/lib/datadog/tracing/contrib/httprb/patcher.rb +3 -3
  385. data/lib/datadog/tracing/contrib/integration.rb +3 -3
  386. data/lib/datadog/tracing/contrib/kafka/configuration/settings.rb +2 -2
  387. data/lib/datadog/tracing/contrib/kafka/consumer_event.rb +1 -0
  388. data/lib/datadog/tracing/contrib/kafka/event.rb +3 -3
  389. data/lib/datadog/tracing/contrib/kafka/events/connection/request.rb +2 -2
  390. data/lib/datadog/tracing/contrib/kafka/events/consumer/process_batch.rb +3 -3
  391. data/lib/datadog/tracing/contrib/kafka/events/consumer/process_message.rb +3 -3
  392. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/heartbeat.rb +4 -4
  393. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/join_group.rb +4 -4
  394. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/leave_group.rb +4 -4
  395. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/sync_group.rb +4 -4
  396. data/lib/datadog/tracing/contrib/kafka/events/produce_operation/send_messages.rb +3 -2
  397. data/lib/datadog/tracing/contrib/kafka/events/producer/deliver_messages.rb +3 -2
  398. data/lib/datadog/tracing/contrib/kafka/events.rb +9 -9
  399. data/lib/datadog/tracing/contrib/kafka/integration.rb +3 -3
  400. data/lib/datadog/tracing/contrib/kafka/patcher.rb +3 -3
  401. data/lib/datadog/tracing/contrib/lograge/configuration/settings.rb +2 -2
  402. data/lib/datadog/tracing/contrib/lograge/instrumentation.rb +1 -2
  403. data/lib/datadog/tracing/contrib/lograge/integration.rb +3 -3
  404. data/lib/datadog/tracing/contrib/lograge/patcher.rb +2 -2
  405. data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +7 -3
  406. data/lib/datadog/tracing/contrib/mongodb/ext.rb +8 -0
  407. data/lib/datadog/tracing/contrib/mongodb/instrumentation.rb +3 -3
  408. data/lib/datadog/tracing/contrib/mongodb/integration.rb +4 -4
  409. data/lib/datadog/tracing/contrib/mongodb/parsers.rb +1 -1
  410. data/lib/datadog/tracing/contrib/mongodb/patcher.rb +3 -3
  411. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +10 -4
  412. data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +18 -3
  413. data/lib/datadog/tracing/contrib/mysql2/ext.rb +2 -0
  414. data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +20 -5
  415. data/lib/datadog/tracing/contrib/mysql2/integration.rb +3 -3
  416. data/lib/datadog/tracing/contrib/mysql2/patcher.rb +2 -2
  417. data/lib/datadog/tracing/contrib/patcher.rb +16 -4
  418. data/lib/datadog/tracing/contrib/pg/configuration/settings.rb +50 -0
  419. data/lib/datadog/tracing/contrib/pg/ext.rb +33 -0
  420. data/lib/datadog/tracing/contrib/pg/instrumentation.rb +168 -0
  421. data/lib/datadog/tracing/contrib/pg/integration.rb +43 -0
  422. data/lib/datadog/tracing/contrib/pg/patcher.rb +31 -0
  423. data/lib/datadog/tracing/contrib/presto/configuration/settings.rb +6 -3
  424. data/lib/datadog/tracing/contrib/presto/ext.rb +1 -0
  425. data/lib/datadog/tracing/contrib/presto/instrumentation.rb +2 -3
  426. data/lib/datadog/tracing/contrib/presto/integration.rb +3 -3
  427. data/lib/datadog/tracing/contrib/presto/patcher.rb +4 -4
  428. data/lib/datadog/tracing/contrib/propagation/sql_comment/comment.rb +43 -0
  429. data/lib/datadog/tracing/contrib/propagation/sql_comment/ext.rb +33 -0
  430. data/lib/datadog/tracing/contrib/propagation/sql_comment/mode.rb +28 -0
  431. data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +47 -0
  432. data/lib/datadog/tracing/contrib/qless/configuration/settings.rb +2 -2
  433. data/lib/datadog/tracing/contrib/qless/integration.rb +3 -3
  434. data/lib/datadog/tracing/contrib/qless/patcher.rb +1 -2
  435. data/lib/datadog/tracing/contrib/qless/qless_job.rb +2 -3
  436. data/lib/datadog/tracing/contrib/qless/tracer_cleaner.rb +0 -2
  437. data/lib/datadog/tracing/contrib/que/configuration/settings.rb +3 -3
  438. data/lib/datadog/tracing/contrib/que/integration.rb +4 -4
  439. data/lib/datadog/tracing/contrib/que/patcher.rb +1 -1
  440. data/lib/datadog/tracing/contrib/que/tracer.rb +3 -1
  441. data/lib/datadog/tracing/contrib/racecar/configuration/settings.rb +2 -2
  442. data/lib/datadog/tracing/contrib/racecar/event.rb +4 -5
  443. data/lib/datadog/tracing/contrib/racecar/events/batch.rb +6 -3
  444. data/lib/datadog/tracing/contrib/racecar/events/consume.rb +2 -2
  445. data/lib/datadog/tracing/contrib/racecar/events/message.rb +6 -3
  446. data/lib/datadog/tracing/contrib/racecar/events.rb +3 -3
  447. data/lib/datadog/tracing/contrib/racecar/integration.rb +3 -3
  448. data/lib/datadog/tracing/contrib/racecar/patcher.rb +3 -3
  449. data/lib/datadog/tracing/contrib/rack/configuration/settings.rb +2 -2
  450. data/lib/datadog/tracing/contrib/rack/header_collection.rb +35 -0
  451. data/lib/datadog/tracing/contrib/rack/integration.rb +4 -4
  452. data/lib/datadog/tracing/contrib/rack/middlewares.rb +129 -61
  453. data/lib/datadog/tracing/contrib/rack/patcher.rb +12 -2
  454. data/lib/datadog/tracing/contrib/rails/auto_instrument_railtie.rb +1 -1
  455. data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +4 -1
  456. data/lib/datadog/tracing/contrib/rails/framework.rb +18 -22
  457. data/lib/datadog/tracing/contrib/rails/integration.rb +4 -4
  458. data/lib/datadog/tracing/contrib/rails/log_injection.rb +0 -2
  459. data/lib/datadog/tracing/contrib/rails/middlewares.rb +1 -2
  460. data/lib/datadog/tracing/contrib/rails/patcher.rb +7 -8
  461. data/lib/datadog/tracing/contrib/rails/railtie.rb +3 -3
  462. data/lib/datadog/tracing/contrib/rails/utils.rb +1 -1
  463. data/lib/datadog/tracing/contrib/rake/configuration/settings.rb +17 -2
  464. data/lib/datadog/tracing/contrib/rake/instrumentation.rb +12 -7
  465. data/lib/datadog/tracing/contrib/rake/integration.rb +3 -3
  466. data/lib/datadog/tracing/contrib/rake/patcher.rb +3 -4
  467. data/lib/datadog/tracing/contrib/redis/configuration/resolver.rb +1 -1
  468. data/lib/datadog/tracing/contrib/redis/configuration/settings.rb +6 -3
  469. data/lib/datadog/tracing/contrib/redis/ext.rb +3 -0
  470. data/lib/datadog/tracing/contrib/redis/instrumentation.rb +36 -26
  471. data/lib/datadog/tracing/contrib/redis/integration.rb +37 -4
  472. data/lib/datadog/tracing/contrib/redis/patcher.rb +57 -13
  473. data/lib/datadog/tracing/contrib/redis/quantize.rb +12 -9
  474. data/lib/datadog/tracing/contrib/redis/tags.rb +12 -10
  475. data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +72 -0
  476. data/lib/datadog/tracing/contrib/resque/configuration/settings.rb +3 -3
  477. data/lib/datadog/tracing/contrib/resque/integration.rb +3 -3
  478. data/lib/datadog/tracing/contrib/resque/patcher.rb +2 -2
  479. data/lib/datadog/tracing/contrib/resque/resque_job.rb +5 -4
  480. data/lib/datadog/tracing/contrib/rest_client/configuration/settings.rb +9 -3
  481. data/lib/datadog/tracing/contrib/rest_client/ext.rb +1 -0
  482. data/lib/datadog/tracing/contrib/rest_client/integration.rb +3 -3
  483. data/lib/datadog/tracing/contrib/rest_client/patcher.rb +2 -2
  484. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +7 -6
  485. data/lib/datadog/tracing/contrib/semantic_logger/configuration/settings.rb +2 -2
  486. data/lib/datadog/tracing/contrib/semantic_logger/instrumentation.rb +1 -2
  487. data/lib/datadog/tracing/contrib/semantic_logger/integration.rb +3 -3
  488. data/lib/datadog/tracing/contrib/semantic_logger/patcher.rb +2 -2
  489. data/lib/datadog/tracing/contrib/sequel/configuration/settings.rb +2 -2
  490. data/lib/datadog/tracing/contrib/sequel/database.rb +4 -5
  491. data/lib/datadog/tracing/contrib/sequel/dataset.rb +4 -5
  492. data/lib/datadog/tracing/contrib/sequel/integration.rb +3 -3
  493. data/lib/datadog/tracing/contrib/sequel/patcher.rb +3 -3
  494. data/lib/datadog/tracing/contrib/sequel/utils.rb +2 -2
  495. data/lib/datadog/tracing/contrib/shoryuken/configuration/settings.rb +3 -3
  496. data/lib/datadog/tracing/contrib/shoryuken/integration.rb +4 -4
  497. data/lib/datadog/tracing/contrib/shoryuken/patcher.rb +1 -1
  498. data/lib/datadog/tracing/contrib/shoryuken/tracer.rb +3 -1
  499. data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +9 -5
  500. data/lib/datadog/tracing/contrib/sidekiq/configuration/settings.rb +3 -3
  501. data/lib/datadog/tracing/contrib/sidekiq/ext.rb +6 -0
  502. data/lib/datadog/tracing/contrib/sidekiq/integration.rb +3 -3
  503. data/lib/datadog/tracing/contrib/sidekiq/patcher.rb +14 -7
  504. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/heartbeat.rb +19 -1
  505. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/{scheduled_push.rb → redis_info.rb} +5 -6
  506. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/scheduled_poller.rb +53 -0
  507. data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +10 -6
  508. data/lib/datadog/tracing/contrib/sidekiq/tracing.rb +2 -2
  509. data/lib/datadog/tracing/contrib/sinatra/configuration/settings.rb +2 -2
  510. data/lib/datadog/tracing/contrib/sinatra/env.rb +14 -25
  511. data/lib/datadog/tracing/contrib/sinatra/ext.rb +7 -3
  512. data/lib/datadog/tracing/contrib/sinatra/framework.rb +0 -2
  513. data/lib/datadog/tracing/contrib/sinatra/headers.rb +1 -1
  514. data/lib/datadog/tracing/contrib/sinatra/integration.rb +3 -3
  515. data/lib/datadog/tracing/contrib/sinatra/patcher.rb +7 -7
  516. data/lib/datadog/tracing/contrib/sinatra/tracer.rb +15 -88
  517. data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +20 -16
  518. data/lib/datadog/tracing/contrib/sneakers/configuration/settings.rb +2 -2
  519. data/lib/datadog/tracing/contrib/sneakers/integration.rb +4 -4
  520. data/lib/datadog/tracing/contrib/sneakers/patcher.rb +2 -2
  521. data/lib/datadog/tracing/contrib/sneakers/tracer.rb +4 -3
  522. data/lib/datadog/tracing/contrib/status_code_matcher.rb +2 -2
  523. data/lib/datadog/tracing/contrib/stripe/configuration/settings.rb +33 -0
  524. data/lib/datadog/tracing/contrib/stripe/ext.rb +26 -0
  525. data/lib/datadog/tracing/contrib/stripe/integration.rb +43 -0
  526. data/lib/datadog/tracing/contrib/stripe/patcher.rb +29 -0
  527. data/lib/datadog/tracing/contrib/stripe/request.rb +67 -0
  528. data/lib/datadog/tracing/contrib/sucker_punch/configuration/settings.rb +2 -2
  529. data/lib/datadog/tracing/contrib/sucker_punch/instrumentation.rb +3 -4
  530. data/lib/datadog/tracing/contrib/sucker_punch/integration.rb +3 -3
  531. data/lib/datadog/tracing/contrib/sucker_punch/patcher.rb +4 -5
  532. data/lib/datadog/tracing/contrib/utils/quantization/http.rb +92 -10
  533. data/lib/datadog/tracing/contrib.rb +50 -47
  534. data/lib/datadog/tracing/correlation.rb +1 -1
  535. data/lib/datadog/{core → tracing}/diagnostics/ext.rb +1 -6
  536. data/lib/datadog/tracing/diagnostics/health.rb +40 -0
  537. data/lib/datadog/tracing/distributed/b3_multi.rb +66 -0
  538. data/lib/datadog/tracing/distributed/b3_single.rb +66 -0
  539. data/lib/datadog/tracing/distributed/datadog.rb +153 -0
  540. data/lib/datadog/tracing/distributed/datadog_tags_codec.rb +85 -0
  541. data/lib/datadog/tracing/distributed/fetcher.rb +30 -0
  542. data/lib/datadog/tracing/distributed/headers/ext.rb +19 -15
  543. data/lib/datadog/tracing/distributed/helpers.rb +40 -4
  544. data/lib/datadog/tracing/distributed/none.rb +19 -0
  545. data/lib/datadog/tracing/distributed/propagation.rb +127 -0
  546. data/lib/datadog/tracing/distributed/trace_context.rb +378 -0
  547. data/lib/datadog/tracing/event.rb +1 -1
  548. data/lib/datadog/tracing/flush.rb +57 -35
  549. data/lib/datadog/tracing/metadata/analytics.rb +2 -2
  550. data/lib/datadog/tracing/metadata/errors.rb +2 -2
  551. data/lib/datadog/tracing/metadata/ext.rb +28 -1
  552. data/lib/datadog/tracing/metadata/tagging.rb +23 -2
  553. data/lib/datadog/tracing/metadata.rb +3 -3
  554. data/lib/datadog/tracing/pipeline/span_filter.rb +10 -6
  555. data/lib/datadog/tracing/pipeline.rb +3 -3
  556. data/lib/datadog/tracing/propagation/http.rb +3 -98
  557. data/lib/datadog/tracing/runtime/metrics.rb +1 -1
  558. data/lib/datadog/tracing/sampling/all_sampler.rb +1 -1
  559. data/lib/datadog/tracing/sampling/ext.rb +31 -0
  560. data/lib/datadog/tracing/sampling/priority_sampler.rb +62 -9
  561. data/lib/datadog/tracing/sampling/rate_by_key_sampler.rb +10 -11
  562. data/lib/datadog/tracing/sampling/rate_by_service_sampler.rb +32 -8
  563. data/lib/datadog/tracing/sampling/rate_limiter.rb +4 -1
  564. data/lib/datadog/tracing/sampling/rate_sampler.rb +27 -10
  565. data/lib/datadog/tracing/sampling/rule.rb +3 -3
  566. data/lib/datadog/tracing/sampling/rule_sampler.rb +8 -7
  567. data/lib/datadog/tracing/sampling/span/ext.rb +25 -0
  568. data/lib/datadog/tracing/sampling/span/matcher.rb +89 -0
  569. data/lib/datadog/tracing/sampling/span/rule.rb +82 -0
  570. data/lib/datadog/tracing/sampling/span/rule_parser.rb +104 -0
  571. data/lib/datadog/tracing/sampling/span/sampler.rb +75 -0
  572. data/lib/datadog/tracing/span.rb +24 -20
  573. data/lib/datadog/tracing/span_operation.rb +13 -13
  574. data/lib/datadog/tracing/sync_writer.rb +5 -5
  575. data/lib/datadog/tracing/trace_digest.rb +88 -2
  576. data/lib/datadog/tracing/trace_operation.rb +60 -15
  577. data/lib/datadog/tracing/trace_segment.rb +13 -8
  578. data/lib/datadog/tracing/tracer.rb +49 -21
  579. data/lib/datadog/tracing/utils.rb +50 -0
  580. data/lib/datadog/tracing/workers/trace_writer.rb +9 -9
  581. data/lib/datadog/tracing/workers.rb +3 -3
  582. data/lib/datadog/tracing/writer.rb +12 -5
  583. data/lib/datadog/tracing.rb +8 -8
  584. data/lib/ddtrace/auto_instrument.rb +9 -2
  585. data/lib/ddtrace/transport/ext.rb +7 -1
  586. data/lib/ddtrace/transport/http/adapters/net.rb +3 -2
  587. data/lib/ddtrace/transport/http/adapters/test.rb +1 -1
  588. data/lib/ddtrace/transport/http/adapters/unix_socket.rb +2 -2
  589. data/lib/ddtrace/transport/http/api/map.rb +1 -1
  590. data/lib/ddtrace/transport/http/api.rb +4 -4
  591. data/lib/ddtrace/transport/http/builder.rb +5 -5
  592. data/lib/ddtrace/transport/http/client.rb +2 -2
  593. data/lib/ddtrace/transport/http/response.rb +1 -1
  594. data/lib/ddtrace/transport/http/statistics.rb +1 -1
  595. data/lib/ddtrace/transport/http/traces.rb +5 -5
  596. data/lib/ddtrace/transport/http.rb +12 -9
  597. data/lib/ddtrace/transport/io/client.rb +2 -2
  598. data/lib/ddtrace/transport/io/response.rb +1 -1
  599. data/lib/ddtrace/transport/io/traces.rb +3 -3
  600. data/lib/ddtrace/transport/io.rb +3 -3
  601. data/lib/ddtrace/transport/statistics.rb +2 -2
  602. data/lib/ddtrace/transport/trace_formatter.rb +14 -10
  603. data/lib/ddtrace/transport/traces.rb +8 -6
  604. data/lib/ddtrace/version.rb +1 -1
  605. data/lib/ddtrace.rb +6 -6
  606. metadata +127 -48
  607. data/.editorconfig +0 -22
  608. data/.gitignore +0 -58
  609. data/CONTRIBUTING.md +0 -81
  610. data/ddtrace.gemspec +0 -68
  611. data/docs/0.x-trace.png +0 -0
  612. data/docs/1.0-trace.png +0 -0
  613. data/docs/AutoInstrumentation.md +0 -36
  614. data/docs/Deprecation.md +0 -8
  615. data/docs/DevelopmentGuide.md +0 -259
  616. data/docs/GettingStarted.md +0 -2688
  617. data/docs/ProfilingDevelopment.md +0 -110
  618. data/docs/PublicApi.md +0 -14
  619. data/docs/UpgradeGuide.md +0 -736
  620. data/ext/ddtrace_profiling_native_extension/libddprof_helpers.h +0 -13
  621. data/lib/datadog/profiling/recorder.rb +0 -117
  622. data/lib/datadog/profiling/transport/client.rb +0 -16
  623. data/lib/datadog/profiling/transport/http/api/endpoint.rb +0 -107
  624. data/lib/datadog/profiling/transport/http/api/instance.rb +0 -38
  625. data/lib/datadog/profiling/transport/http/api/spec.rb +0 -42
  626. data/lib/datadog/profiling/transport/http/api.rb +0 -45
  627. data/lib/datadog/profiling/transport/http/builder.rb +0 -30
  628. data/lib/datadog/profiling/transport/http/client.rb +0 -35
  629. data/lib/datadog/profiling/transport/http/response.rb +0 -23
  630. data/lib/datadog/profiling/transport/http.rb +0 -112
  631. data/lib/datadog/profiling/transport/io/client.rb +0 -29
  632. data/lib/datadog/profiling/transport/io/response.rb +0 -18
  633. data/lib/datadog/profiling/transport/io.rb +0 -32
  634. data/lib/datadog/profiling/transport/parcel.rb +0 -19
  635. data/lib/datadog/profiling/transport/request.rb +0 -17
  636. data/lib/datadog/profiling/transport/response.rb +0 -10
  637. data/lib/datadog/tracing/distributed/headers/b3.rb +0 -55
  638. data/lib/datadog/tracing/distributed/headers/b3_single.rb +0 -67
  639. data/lib/datadog/tracing/distributed/headers/datadog.rb +0 -52
  640. data/lib/datadog/tracing/distributed/parser.rb +0 -70
  641. data/lib/datadog/tracing/propagation/grpc.rb +0 -88
@@ -1,7 +1,7 @@
1
1
  # typed: true
2
2
 
3
3
  require 'set'
4
- require 'datadog/tracing/pipeline/span_processor'
4
+ require_relative 'span_processor'
5
5
 
6
6
  module Datadog
7
7
  module Tracing
@@ -15,17 +15,21 @@ module Datadog
15
15
  #
16
16
  # @public_api
17
17
  class SpanFilter < SpanProcessor
18
- # NOTE: this SpanFilter implementation only handles traces in which child spans appear
19
- # after parent spans in the trace array. If in the future child spans can be before
18
+ # NOTE: This SpanFilter implementation only handles traces in which child spans appear
19
+ # before parent spans in the trace array. If in the future child spans can be after
20
20
  # parent spans, then the code below will need to be updated.
21
21
  # @!visibility private
22
22
  def call(trace)
23
23
  deleted = Set.new
24
24
 
25
- trace.spans.delete_if do |span|
25
+ span_count = trace.spans.length
26
+ trace.spans.reverse_each.with_index do |span, i|
26
27
  should_delete = deleted.include?(span.parent_id) || drop_it?(span)
27
- deleted << span.id if should_delete
28
- should_delete
28
+
29
+ if should_delete
30
+ deleted << span.id
31
+ trace.spans.delete_at(span_count - 1 - i)
32
+ end
29
33
  end
30
34
 
31
35
  trace
@@ -1,9 +1,9 @@
1
1
  # typed: true
2
2
 
3
- require 'datadog/core'
3
+ require_relative '../core'
4
4
 
5
- require 'datadog/tracing/pipeline/span_filter'
6
- require 'datadog/tracing/pipeline/span_processor'
5
+ require_relative 'pipeline/span_filter'
6
+ require_relative 'pipeline/span_processor'
7
7
 
8
8
  module Datadog
9
9
  module Tracing
@@ -1,109 +1,14 @@
1
1
  # typed: false
2
2
 
3
- require 'datadog/core'
4
-
5
- require 'datadog/tracing/configuration/ext'
6
- require 'datadog/tracing/sampling/ext'
7
- require 'datadog/tracing/distributed/headers/b3'
8
- require 'datadog/tracing/distributed/headers/b3_single'
9
- require 'datadog/tracing/distributed/headers/datadog'
10
-
11
- require 'datadog/tracing/trace_digest'
12
- require 'datadog/tracing/trace_operation'
3
+ require_relative '../contrib/http/distributed/propagation'
13
4
 
14
5
  module Datadog
15
6
  module Tracing
16
7
  module Propagation
17
8
  # Propagation::HTTP helps extracting and injecting HTTP headers.
9
+ # DEV-2.0: This file has been moved to Contrib. Should be deleted in the next release.
18
10
  # @public_api
19
- module HTTP
20
- PROPAGATION_STYLES = {
21
- Configuration::Ext::Distributed::PROPAGATION_STYLE_B3 => Distributed::Headers::B3,
22
- Configuration::Ext::Distributed::PROPAGATION_STYLE_B3_SINGLE_HEADER => Distributed::Headers::B3Single,
23
- Configuration::Ext::Distributed::PROPAGATION_STYLE_DATADOG => Distributed::Headers::Datadog
24
- }.freeze
25
-
26
- # inject! popolates the env with span ID, trace ID and sampling priority
27
- def self.inject!(digest, env)
28
- # Prevent propagation from being attempted if trace headers provided are nil.
29
- if digest.nil?
30
- Datadog.logger.debug(
31
- 'Cannot inject trace headers into env to propagate over HTTP: trace headers are nil.'.freeze
32
- )
33
- return
34
- end
35
-
36
- digest = digest.to_digest if digest.is_a?(TraceOperation)
37
-
38
- # Inject all configured propagation styles
39
- Datadog.configuration.tracing.distributed_tracing.propagation_inject_style.each do |style|
40
- propagator = PROPAGATION_STYLES[style]
41
- begin
42
- propagator.inject!(digest, env) unless propagator.nil?
43
- rescue => e
44
- Datadog.logger.error(
45
- 'Error injecting propagated trace headers into the environment. ' \
46
- "Cause: #{e} Location: #{Array(e.backtrace).first}"
47
- )
48
- end
49
- end
50
- end
51
-
52
- # extract returns trace headers containing the span ID, trace ID and
53
- # sampling priority defined in env.
54
- def self.extract(env)
55
- trace_digest = nil
56
- dd_trace_digest = nil
57
-
58
- Datadog.configuration.tracing.distributed_tracing.propagation_extract_style.each do |style|
59
- propagator = PROPAGATION_STYLES[style]
60
- next if propagator.nil?
61
-
62
- # Extract trace headers
63
- # DEV: `propagator.extract` will return `nil`, where `Propagation::HTTP#extract` will not
64
- begin
65
- extracted_trace_digest = propagator.extract(env)
66
- rescue => e
67
- Datadog.logger.error(
68
- 'Error extracting propagated trace headers from the environment. ' \
69
- "Cause: #{e} Location: #{Array(e.backtrace).first}"
70
- )
71
- end
72
-
73
- # Skip this style if no valid headers were found
74
- next if extracted_trace_digest.nil?
75
-
76
- # Keep track of the Datadog extract trace headers, we want to return
77
- # this one if we have one
78
- if extracted_trace_digest && style == Configuration::Ext::Distributed::PROPAGATION_STYLE_DATADOG
79
- dd_trace_digest = extracted_trace_digest
80
- end
81
-
82
- # No previously extracted trace headers, use the one we just extracted
83
- if trace_digest.nil?
84
- trace_digest = extracted_trace_digest
85
- else
86
- unless trace_digest.trace_id == extracted_trace_digest.trace_id \
87
- && trace_digest.span_id == extracted_trace_digest.span_id
88
- # Return an empty/new trace headers if we have a mismatch in values extracted
89
- msg = "#{trace_digest.trace_id} != #{extracted_trace_digest.trace_id} && " \
90
- "#{trace_digest.span_id} != #{extracted_trace_digest.span_id}"
91
- Datadog.logger.debug(
92
- "Cannot extract trace headers from HTTP: extracted trace headers differ, #{msg}"
93
- )
94
- # DEV: This will return from `self.extract` not this `each` block
95
- return TraceDigest.new
96
- end
97
- end
98
- end
99
-
100
- # Return the extracted trace headers if we found one or else a new empty trace headers
101
- # Always return the Datadog trace headers if one exists since it has more
102
- # information than the B3 headers e.g. origin, expanded priority
103
- # sampling values, etc
104
- dd_trace_digest || trace_digest || nil
105
- end
106
- end
11
+ HTTP = Tracing::Contrib::HTTP::Distributed::Propagation.new
107
12
  end
108
13
  end
109
14
  end
@@ -1,6 +1,6 @@
1
1
  # typed: true
2
2
 
3
- require 'datadog/core'
3
+ require_relative '../../core'
4
4
 
5
5
  module Datadog
6
6
  module Tracing
@@ -1,6 +1,6 @@
1
1
  # typed: true
2
2
 
3
- require 'datadog/tracing/sampling/sampler'
3
+ require_relative 'sampler'
4
4
 
5
5
  module Datadog
6
6
  module Tracing
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # typed: strict
2
4
 
3
5
  module Datadog
@@ -21,6 +23,35 @@ module Datadog
21
23
  # through the {Datadog::Tracing::Sampling::RuleSampler}.
22
24
  USER_KEEP = 2
23
25
  end
26
+
27
+ # List of what mechanism was used to make the trace-level sampling decision.
28
+ module Mechanism
29
+ # Single Span Sampled.
30
+ SPAN_SAMPLING_RATE = 8
31
+ end
32
+
33
+ # List of how the decision was made for the trace-level sampling.
34
+ #
35
+ # These values used to populate the {Datadog::Tracing::Metadata::Ext::Distributed::TAG_DECISION_MAKER} tag.
36
+ #
37
+ # The decision has two parts, separated by a `-`:
38
+ # `part1-sampling_mechanism`. `part1` is currently not populated, thus
39
+ # this tag is currently formatted as `"-sampling_mechanism"`.
40
+ module Decision
41
+ # Used before the tracer receives any rates from agent and there are no rules configured.
42
+ DEFAULT = '-0'
43
+ # The sampling rate received in the agent's http response.
44
+ AGENT_RATE = '-1'
45
+ # Sampling rule or sampling rate based on tracer config.
46
+ TRACE_SAMPLING_RULE = '-3'
47
+ # User directly sets sampling priority via {Tracing.reject!} or {Tracing.keep!},
48
+ # or by a custom sampler implementation.
49
+ MANUAL = '-4'
50
+ # Formerly AppSec.
51
+ ASM = '-5'
52
+ # Single Span Sampled.
53
+ SPAN_SAMPLING_RATE = '-8'
54
+ end
24
55
  end
25
56
  end
26
57
  end
@@ -1,14 +1,14 @@
1
1
  # typed: true
2
2
 
3
- require 'datadog/tracing/sampling/ext'
4
- require 'datadog/tracing/sampling/all_sampler'
5
- require 'datadog/tracing/sampling/rate_sampler'
6
- require 'datadog/tracing/sampling/rate_by_service_sampler'
3
+ require_relative 'ext'
4
+ require_relative 'all_sampler'
5
+ require_relative 'rate_sampler'
6
+ require_relative 'rate_by_service_sampler'
7
7
 
8
8
  module Datadog
9
9
  module Tracing
10
10
  module Sampling
11
- # {Datadog:::Tracing::Sampling::PrioritySampler}
11
+ # {Datadog::Tracing::Sampling::PrioritySampler}
12
12
  # @public_api
13
13
  class PrioritySampler
14
14
  # NOTE: We do not advise using a pre-sampler. It can save resources,
@@ -21,17 +21,26 @@ module Datadog
21
21
 
22
22
  def initialize(opts = {})
23
23
  @pre_sampler = opts[:base_sampler] || AllSampler.new
24
- @priority_sampler = opts[:post_sampler] || RateByServiceSampler.new
24
+ @priority_sampler = opts[:post_sampler] || RateByServiceSampler.new(decision: Sampling::Ext::Decision::AGENT_RATE)
25
25
  end
26
26
 
27
27
  def sample?(trace)
28
28
  @pre_sampler.sample?(trace)
29
29
  end
30
30
 
31
+ # DEV-2.0:We should get rid of this complicated interaction between @pre_sampler and @priority_sampler.
32
+ # DEV-2.0:If the user wants to configure a custom sampler, we should only allow them to provide a complete
33
+ # DEV-2.0:sampling suite, not having this convoluted support for mixing arbitrary provided samplers in
34
+ # DEV-2.0:the PrioritySampler. Ideally, the PrioritySampler is only used by Datadog.
35
+ # DEV-2.0:There are too many edge cases and combinations to work around currently in this class.
31
36
  def sample!(trace)
37
+ # The priority that was set before the sampler ran.
38
+ # This comes from distributed tracing priority propagation.
39
+ distributed_sampling_priority = priority_assigned?(trace)
40
+
32
41
  # If pre-sampling is configured, do it first. (By default, this will sample at 100%.)
33
42
  # NOTE: Pre-sampling at rates < 100% may result in partial traces; not recommended.
34
- trace.sampled = pre_sample?(trace) ? @pre_sampler.sample!(trace) : true
43
+ trace.sampled = pre_sample?(trace) ? preserving_priority_sampling(trace) { @pre_sampler.sample!(trace) } : true
35
44
 
36
45
  if trace.sampled?
37
46
  # If priority sampling has already been applied upstream, use that value.
@@ -53,11 +62,38 @@ module Datadog
53
62
  end
54
63
 
55
64
  trace.sampled?
65
+ ensure
66
+ if trace.sampling_priority && trace.sampling_priority > 0
67
+ # Don't modify decision if priority was set upstream.
68
+ if !distributed_sampling_priority && !trace.has_tag?(Tracing::Metadata::Ext::Distributed::TAG_DECISION_MAKER)
69
+ # If no sampling priority being assigned at this point, a custom
70
+ # sampler implementation is configured: this means the user has
71
+ # full control over the sampling decision.
72
+ trace.set_tag(
73
+ Tracing::Metadata::Ext::Distributed::TAG_DECISION_MAKER,
74
+ Sampling::Ext::Decision::MANUAL
75
+ )
76
+ end
77
+ else
78
+ # The sampler decided to not keep this span, removing sampling decision.
79
+ trace.clear_tag(Tracing::Metadata::Ext::Distributed::TAG_DECISION_MAKER)
80
+ end
56
81
  end
57
82
 
58
83
  # (see Datadog::Tracing::Sampling::RateByServiceSampler#update)
59
- def update(rate_by_service)
60
- @priority_sampler.update(rate_by_service)
84
+ def update(rate_by_service, decision: nil)
85
+ @priority_sampler.update(rate_by_service, decision: decision)
86
+ end
87
+
88
+ # Check if the Priority Sampling decision is to keep or drop the trace.
89
+ # Other factors can influence the sampling decision; this method is only
90
+ # responsible for interpreting the Sampling Priority decision.
91
+ #
92
+ # @param priority_sampling [Integer] priority sampling number
93
+ # @return [Boolean] true if trace is "kept" by priority sampling
94
+ # @return [Boolean] false if trace is "dropped" by priority sampling
95
+ def self.sampled?(priority_sampling)
96
+ priority_sampling >= Ext::Priority::AUTO_KEEP
61
97
  end
62
98
 
63
99
  private
@@ -83,6 +119,23 @@ module Datadog
83
119
  end
84
120
  end
85
121
 
122
+ # Ensures the trace's priority sampling decision is not changed by the @pre_sampler.
123
+ # The @pre_sampler should only change `trace.sampled`.
124
+ def preserving_priority_sampling(trace)
125
+ sampling_priority = trace.sampling_priority
126
+ sampling_decision = trace.get_tag(Tracing::Metadata::Ext::Distributed::TAG_DECISION_MAKER)
127
+
128
+ yield.tap do
129
+ trace.sampling_priority = sampling_priority
130
+
131
+ if sampling_decision
132
+ trace.set_tag(Tracing::Metadata::Ext::Distributed::TAG_DECISION_MAKER, sampling_decision)
133
+ else
134
+ trace.clear_tag(Tracing::Metadata::Ext::Distributed::TAG_DECISION_MAKER)
135
+ end
136
+ end
137
+ end
138
+
86
139
  # Ensures the trace is always propagated to the writer and that
87
140
  # the sample rate metric represents the true client-side sampling.
88
141
  def preserving_sampling(trace)
@@ -1,7 +1,7 @@
1
1
  # typed: true
2
2
 
3
- require 'datadog/tracing/sampling/sampler'
4
- require 'datadog/tracing/sampling/rate_sampler'
3
+ require_relative 'sampler'
4
+ require_relative 'rate_sampler'
5
5
 
6
6
  module Datadog
7
7
  module Tracing
@@ -12,7 +12,7 @@ module Datadog
12
12
  attr_reader \
13
13
  :default_key
14
14
 
15
- def initialize(default_key, default_rate = 1.0, &block)
15
+ def initialize(default_key, default_rate = 1.0, decision: nil, &block)
16
16
  super()
17
17
 
18
18
  raise ArgumentError, 'No resolver given!' unless block
@@ -22,7 +22,7 @@ module Datadog
22
22
  @mutex = Mutex.new
23
23
  @samplers = {}
24
24
 
25
- set_rate(default_key, default_rate)
25
+ set_rate(default_key, default_rate, decision)
26
26
  end
27
27
 
28
28
  def resolve(trace)
@@ -57,15 +57,15 @@ module Datadog
57
57
  end
58
58
  end
59
59
 
60
- def update(key, rate)
60
+ def update(key, rate, decision: nil)
61
61
  @mutex.synchronize do
62
- set_rate(key, rate)
62
+ set_rate(key, rate, decision)
63
63
  end
64
64
  end
65
65
 
66
- def update_all(rate_by_key)
66
+ def update_all(rate_by_key, decision: nil)
67
67
  @mutex.synchronize do
68
- rate_by_key.each { |key, rate| set_rate(key, rate) }
68
+ rate_by_key.each { |key, rate| set_rate(key, rate, decision) }
69
69
  end
70
70
  end
71
71
 
@@ -87,9 +87,8 @@ module Datadog
87
87
 
88
88
  private
89
89
 
90
- def set_rate(key, rate)
91
- @samplers[key] ||= RateSampler.new(rate)
92
- @samplers[key].sample_rate = rate
90
+ def set_rate(key, rate, decision)
91
+ @samplers[key] = RateSampler.new(rate, decision: decision)
93
92
  end
94
93
  end
95
94
  end
@@ -1,27 +1,33 @@
1
1
  # typed: true
2
2
 
3
- require 'datadog/core'
4
- require 'datadog/tracing/sampling/rate_by_key_sampler'
3
+ require_relative '../../core'
4
+ require_relative 'rate_by_key_sampler'
5
5
 
6
6
  module Datadog
7
7
  module Tracing
8
8
  module Sampling
9
- # {Datadog:::Tracing::Sampling::RateByServiceSampler} samples different services at different rates
9
+ # {Datadog::Tracing::Sampling::RateByServiceSampler} samples different services at different rates
10
10
  # @public_api
11
11
  class RateByServiceSampler < RateByKeySampler
12
12
  DEFAULT_KEY = 'service:,env:'.freeze
13
13
 
14
- def initialize(default_rate = 1.0, options = {})
15
- super(DEFAULT_KEY, default_rate, &method(:key_for))
16
- @env = options[:env]
14
+ def initialize(default_rate = 1.0, env: nil, decision: Datadog::Tracing::Sampling::Ext::Decision::DEFAULT)
15
+ super(
16
+ DEFAULT_KEY,
17
+ default_rate,
18
+ decision: decision,
19
+ &method(:key_for)
20
+ )
21
+
22
+ @env = env
17
23
  end
18
24
 
19
- def update(rate_by_service)
25
+ def update(rate_by_service, decision: nil)
20
26
  # Remove any old services
21
27
  delete_if { |key, _| key != DEFAULT_KEY && !rate_by_service.key?(key) }
22
28
 
23
29
  # Update each service rate
24
- update_all(rate_by_service)
30
+ update_all(rate_by_service, decision: decision)
25
31
 
26
32
  # Emit metric for service cache size
27
33
  Datadog.health_metrics.sampling_service_cache_length(length)
@@ -29,6 +35,24 @@ module Datadog
29
35
 
30
36
  private
31
37
 
38
+ # DEV: Creating a string on every trace to perform a single Hash lookup is expensive.
39
+ #
40
+ # Using 2 nested hashes: 1 for env and 1 for service is the fastest option.
41
+ # This approach requires large API changes to `RateByKeySampler`.
42
+ #
43
+ # Reducing the interpolated string size, by using a 1 character separator,
44
+ # is also measurably faster than the current method. This approach does not
45
+ # require changes to `RateByKeySampler`.
46
+ #
47
+ # Keep in mind that these changes also require changes to `#update`.
48
+ #
49
+ # Comparison:
50
+ # 2 nested hashes: `service_hash.fetch(service, {}).fetch(env, default_rate)`
51
+ # 7730045 i/s
52
+ # 1 char separator: `hash.fetch("#{service}\0#{env}", default_rate)`
53
+ # 4302801 i/s - 1.80x slower
54
+ # current: `hash.fetch("service:#{service},env:#{env}", default_rate)`
55
+ # 2720459 i/s - 2.84x slower
32
56
  def key_for(trace)
33
57
  # Resolve env dynamically, if Proc is given.
34
58
  env = @env.is_a?(Proc) ? @env.call : @env
@@ -1,6 +1,6 @@
1
1
  # typed: true
2
2
 
3
- require 'datadog/core/utils/time'
3
+ require_relative '../../core/utils/time'
4
4
 
5
5
  module Datadog
6
6
  module Tracing
@@ -39,6 +39,9 @@ module Datadog
39
39
  def initialize(rate, max_tokens = rate)
40
40
  super()
41
41
 
42
+ raise ArgumentError, "rate must be a number: #{rate}" unless rate.is_a?(Numeric)
43
+ raise ArgumentError, "max_tokens must be a number: #{max_tokens}" unless max_tokens.is_a?(Numeric)
44
+
42
45
  @rate = rate
43
46
  @max_tokens = max_tokens
44
47
 
@@ -1,26 +1,36 @@
1
1
  # typed: true
2
2
 
3
- require 'datadog/core'
3
+ require_relative '../../core'
4
4
 
5
- require 'datadog/tracing/sampling/sampler'
6
- require 'datadog/tracing/span'
5
+ require_relative 'sampler'
6
+ require_relative '../utils'
7
7
 
8
8
  module Datadog
9
9
  module Tracing
10
10
  module Sampling
11
- # {Datadog:::Tracing::Sampling::RateSampler} is based on a sample rate.
11
+ # {Datadog::Tracing::Sampling::RateSampler} is based on a sample rate.
12
12
  # @public_api
13
13
  class RateSampler < Sampler
14
14
  KNUTH_FACTOR = 1111111111111111111
15
15
 
16
- # Initialize a {Datadog:::Tracing::Sampling::RateSampler}.
16
+ # Initialize a {Datadog::Tracing::Sampling::RateSampler}.
17
17
  # This sampler keeps a random subset of the traces. Its main purpose is to
18
18
  # reduce the instrumentation footprint.
19
19
  #
20
20
  # * +sample_rate+: the sample rate as a {Float} between 0.0 and 1.0. 0.0
21
21
  # means that no trace will be sampled; 1.0 means that all traces will be
22
22
  # sampled.
23
- def initialize(sample_rate = 1.0)
23
+ #
24
+ # DEV-2.0: Allow for `sample_rate` zero (drop all) to be allowed. This eases
25
+ # DEV-2.0: usage for all internal users of the {RateSampler} class: both
26
+ # DEV-2.0: RuleSampler and Single Span Sampling leverage the RateSampler, but want
27
+ # DEV-2.0: `sample_rate` zero to mean "drop all". They work around this by hard-
28
+ # DEV-2.0: setting the `sample_rate` to zero like so:
29
+ # DEV-2.0: ```
30
+ # DEV-2.0: sampler = RateSampler.new
31
+ # DEV-2.0: sampler.sample_rate = sample_rate
32
+ # DEV-2.0: ```
33
+ def initialize(sample_rate = 1.0, decision: nil)
24
34
  super()
25
35
 
26
36
  unless sample_rate > 0.0 && sample_rate <= 1.0
@@ -29,6 +39,8 @@ module Datadog
29
39
  end
30
40
 
31
41
  self.sample_rate = sample_rate
42
+
43
+ @decision = decision
32
44
  end
33
45
 
34
46
  def sample_rate(*_)
@@ -37,17 +49,22 @@ module Datadog
37
49
 
38
50
  def sample_rate=(sample_rate)
39
51
  @sample_rate = sample_rate
40
- @sampling_id_threshold = sample_rate * Span::EXTERNAL_MAX_ID
52
+ @sampling_id_threshold = sample_rate * Tracing::Utils::EXTERNAL_MAX_ID
41
53
  end
42
54
 
43
55
  def sample?(trace)
44
- ((trace.id * KNUTH_FACTOR) % Span::EXTERNAL_MAX_ID) <= @sampling_id_threshold
56
+ ((trace.id * KNUTH_FACTOR) % Tracing::Utils::EXTERNAL_MAX_ID) <= @sampling_id_threshold
45
57
  end
46
58
 
47
59
  def sample!(trace)
48
60
  sampled = trace.sampled = sample?(trace)
49
- trace.sample_rate = @sample_rate if sampled
50
- sampled
61
+
62
+ return false unless sampled
63
+
64
+ trace.sample_rate = @sample_rate
65
+ trace.set_tag(Tracing::Metadata::Ext::Distributed::TAG_DECISION_MAKER, @decision) if @decision
66
+
67
+ true
51
68
  end
52
69
  end
53
70
  end
@@ -1,9 +1,9 @@
1
1
  # typed: true
2
2
 
3
- require 'datadog/core'
3
+ require_relative '../../core'
4
4
 
5
- require 'datadog/tracing/sampling/matcher'
6
- require 'datadog/tracing/sampling/rate_sampler'
5
+ require_relative 'matcher'
6
+ require_relative 'rate_sampler'
7
7
 
8
8
  module Datadog
9
9
  module Tracing
@@ -1,10 +1,10 @@
1
1
  # typed: true
2
2
 
3
- require 'datadog/core'
3
+ require_relative '../../core'
4
4
 
5
- require 'datadog/tracing/sampling/ext'
6
- require 'datadog/tracing/sampling/rate_limiter'
7
- require 'datadog/tracing/sampling/rule'
5
+ require_relative 'ext'
6
+ require_relative 'rate_limiter'
7
+ require_relative 'rule'
8
8
 
9
9
  module Datadog
10
10
  module Tracing
@@ -48,7 +48,7 @@ module Datadog
48
48
  nil
49
49
  else
50
50
  # TODO: Simplify .tags access, as `Tracer#tags` can't be arbitrarily changed anymore
51
- RateByServiceSampler.new(1.0, env: -> { Tracing.send(:tracer).tags[:env] })
51
+ RateByServiceSampler.new(1.0, env: -> { Tracing.send(:tracer).tags['env'] })
52
52
  end
53
53
  end
54
54
 
@@ -76,10 +76,10 @@ module Datadog
76
76
  end
77
77
 
78
78
  # @!visibility private
79
- def update(*args)
79
+ def update(*args, **kwargs)
80
80
  return false unless @default_sampler.respond_to?(:update)
81
81
 
82
- @default_sampler.update(*args)
82
+ @default_sampler.update(*args, **kwargs)
83
83
  end
84
84
 
85
85
  private
@@ -100,6 +100,7 @@ module Datadog
100
100
  rate_limiter.allow?(1).tap do |allowed|
101
101
  set_priority(trace, allowed)
102
102
  set_limiter_metrics(trace, rate_limiter.effective_rate)
103
+ trace.set_tag(Tracing::Metadata::Ext::Distributed::TAG_DECISION_MAKER, Ext::Decision::TRACE_SAMPLING_RULE)
103
104
  end
104
105
  rescue StandardError => e
105
106
  Datadog.logger.error(
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Datadog
4
+ module Tracing
5
+ module Sampling
6
+ module Span
7
+ # Single Span Sampling constants.
8
+ module Ext
9
+ # Accept all spans (100% retention).
10
+ DEFAULT_SAMPLE_RATE = 1.0
11
+ # Unlimited.
12
+ # @see Datadog::Tracing::Sampling::TokenBucket
13
+ DEFAULT_MAX_PER_SECOND = -1
14
+
15
+ # Sampling decision method used to come to the sampling decision for this span
16
+ TAG_MECHANISM = '_dd.span_sampling.mechanism'
17
+ # Sampling rate applied to this span, if a rule applies
18
+ TAG_RULE_RATE = '_dd.span_sampling.rule_rate'
19
+ # Rate limit configured for this span, if a rule applies
20
+ TAG_MAX_PER_SECOND = '_dd.span_sampling.max_per_second'
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end