ddtrace 1.1.0 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (524) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +129 -1
  3. data/LICENSE-3rdparty.csv +2 -0
  4. data/README.md +8 -3
  5. data/ext/ddtrace_profiling_loader/ddtrace_profiling_loader.c +2 -2
  6. data/ext/ddtrace_profiling_loader/extconf.rb +1 -0
  7. data/ext/ddtrace_profiling_native_extension/NativeExtensionDesign.md +15 -7
  8. data/ext/ddtrace_profiling_native_extension/clock_id.h +21 -1
  9. data/ext/ddtrace_profiling_native_extension/clock_id_from_pthread.c +31 -2
  10. data/ext/ddtrace_profiling_native_extension/clock_id_noop.c +11 -2
  11. data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time.c +390 -0
  12. data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time.h +6 -0
  13. data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +391 -0
  14. data/ext/ddtrace_profiling_native_extension/collectors_stack.c +23 -19
  15. data/ext/ddtrace_profiling_native_extension/collectors_stack.h +9 -0
  16. data/ext/ddtrace_profiling_native_extension/extconf.rb +64 -16
  17. data/ext/ddtrace_profiling_native_extension/helpers.h +12 -0
  18. data/ext/ddtrace_profiling_native_extension/http_transport.c +334 -0
  19. data/ext/ddtrace_profiling_native_extension/{libddprof_helpers.h → libdatadog_helpers.h} +2 -1
  20. data/ext/ddtrace_profiling_native_extension/native_extension_helpers.rb +116 -12
  21. data/ext/ddtrace_profiling_native_extension/private_vm_api_access.c +89 -4
  22. data/ext/ddtrace_profiling_native_extension/private_vm_api_access.h +5 -5
  23. data/ext/ddtrace_profiling_native_extension/profiling.c +8 -3
  24. data/ext/ddtrace_profiling_native_extension/ruby_helpers.c +25 -0
  25. data/ext/ddtrace_profiling_native_extension/ruby_helpers.h +65 -0
  26. data/ext/ddtrace_profiling_native_extension/stack_recorder.c +311 -28
  27. data/ext/ddtrace_profiling_native_extension/stack_recorder.h +18 -8
  28. data/lib/datadog/appsec/autoload.rb +4 -2
  29. data/lib/datadog/appsec/configuration.rb +1 -1
  30. data/lib/datadog/appsec/contrib/auto_instrument.rb +0 -2
  31. data/lib/datadog/appsec/contrib/configuration/settings.rb +1 -1
  32. data/lib/datadog/appsec/contrib/rack/configuration/settings.rb +2 -2
  33. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +6 -6
  34. data/lib/datadog/appsec/contrib/rack/integration.rb +5 -5
  35. data/lib/datadog/appsec/contrib/rack/patcher.rb +2 -2
  36. data/lib/datadog/appsec/contrib/rack/reactive/request.rb +1 -1
  37. data/lib/datadog/appsec/contrib/rack/reactive/request_body.rb +1 -1
  38. data/lib/datadog/appsec/contrib/rack/reactive/response.rb +1 -1
  39. data/lib/datadog/appsec/contrib/rack/request_body_middleware.rb +2 -2
  40. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +3 -3
  41. data/lib/datadog/appsec/contrib/rails/configuration/settings.rb +2 -2
  42. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +4 -4
  43. data/lib/datadog/appsec/contrib/rails/integration.rb +4 -4
  44. data/lib/datadog/appsec/contrib/rails/patcher.rb +16 -12
  45. data/lib/datadog/appsec/contrib/rails/reactive/action.rb +1 -1
  46. data/lib/datadog/appsec/contrib/sinatra/configuration/settings.rb +2 -2
  47. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +5 -5
  48. data/lib/datadog/appsec/contrib/sinatra/integration.rb +4 -4
  49. data/lib/datadog/appsec/contrib/sinatra/patcher.rb +16 -12
  50. data/lib/datadog/appsec/event.rb +3 -3
  51. data/lib/datadog/appsec/extensions.rb +1 -1
  52. data/lib/datadog/appsec/processor.rb +1 -1
  53. data/lib/datadog/appsec/reactive/engine.rb +2 -2
  54. data/lib/datadog/appsec/reactive/operation.rb +3 -3
  55. data/lib/datadog/appsec.rb +5 -5
  56. data/lib/datadog/ci/configuration/components.rb +1 -1
  57. data/lib/datadog/ci/configuration/settings.rb +1 -1
  58. data/lib/datadog/ci/contrib/cucumber/configuration/settings.rb +2 -2
  59. data/lib/datadog/ci/contrib/cucumber/formatter.rb +5 -5
  60. data/lib/datadog/ci/contrib/cucumber/instrumentation.rb +1 -1
  61. data/lib/datadog/ci/contrib/cucumber/integration.rb +4 -4
  62. data/lib/datadog/ci/contrib/cucumber/patcher.rb +2 -2
  63. data/lib/datadog/ci/contrib/rspec/configuration/settings.rb +2 -2
  64. data/lib/datadog/ci/contrib/rspec/example.rb +5 -5
  65. data/lib/datadog/ci/contrib/rspec/integration.rb +4 -4
  66. data/lib/datadog/ci/contrib/rspec/patcher.rb +2 -2
  67. data/lib/datadog/ci/ext/environment.rb +8 -6
  68. data/lib/datadog/ci/extensions.rb +4 -4
  69. data/lib/datadog/ci/flush.rb +2 -2
  70. data/lib/datadog/ci/test.rb +3 -3
  71. data/lib/datadog/ci.rb +6 -6
  72. data/lib/datadog/core/buffer/cruby.rb +1 -1
  73. data/lib/datadog/core/buffer/thread_safe.rb +1 -1
  74. data/lib/datadog/core/configuration/agent_settings_resolver.rb +6 -6
  75. data/lib/datadog/core/configuration/base.rb +11 -2
  76. data/lib/datadog/core/configuration/components.rb +70 -52
  77. data/lib/datadog/core/configuration/option_definition.rb +1 -1
  78. data/lib/datadog/core/configuration/option_definition_set.rb +1 -1
  79. data/lib/datadog/core/configuration/options.rb +3 -3
  80. data/lib/datadog/core/configuration/settings.rb +42 -8
  81. data/lib/datadog/core/configuration.rb +8 -5
  82. data/lib/datadog/core/diagnostics/environment_logger.rb +1 -1
  83. data/lib/datadog/core/diagnostics/health.rb +2 -2
  84. data/lib/datadog/core/environment/cgroup.rb +1 -1
  85. data/lib/datadog/core/environment/container.rb +1 -1
  86. data/lib/datadog/core/environment/ext.rb +1 -1
  87. data/lib/datadog/core/environment/identity.rb +2 -2
  88. data/lib/datadog/core/environment/platform.rb +40 -0
  89. data/lib/datadog/core/environment/socket.rb +1 -1
  90. data/lib/datadog/core/error.rb +1 -1
  91. data/lib/datadog/core/extensions.rb +1 -1
  92. data/lib/datadog/core/metrics/client.rb +8 -8
  93. data/lib/datadog/core/metrics/options.rb +3 -3
  94. data/lib/datadog/core/runtime/metrics.rb +6 -6
  95. data/lib/datadog/core/telemetry/client.rb +79 -0
  96. data/lib/datadog/core/telemetry/collector.rb +234 -0
  97. data/lib/datadog/core/telemetry/emitter.rb +48 -0
  98. data/lib/datadog/core/telemetry/event.rb +71 -0
  99. data/lib/datadog/core/telemetry/ext.rb +11 -0
  100. data/lib/datadog/core/telemetry/heartbeat.rb +37 -0
  101. data/lib/datadog/core/telemetry/http/adapters/net.rb +113 -0
  102. data/lib/datadog/core/telemetry/http/env.rb +20 -0
  103. data/lib/datadog/core/telemetry/http/ext.rb +20 -0
  104. data/lib/datadog/core/telemetry/http/response.rb +68 -0
  105. data/lib/datadog/core/telemetry/http/transport.rb +53 -0
  106. data/lib/datadog/core/telemetry/v1/app_event.rb +52 -0
  107. data/lib/datadog/core/telemetry/v1/application.rb +86 -0
  108. data/lib/datadog/core/telemetry/v1/configuration.rb +25 -0
  109. data/lib/datadog/core/telemetry/v1/dependency.rb +36 -0
  110. data/lib/datadog/core/telemetry/v1/host.rb +51 -0
  111. data/lib/datadog/core/telemetry/v1/integration.rb +58 -0
  112. data/lib/datadog/core/telemetry/v1/product.rb +28 -0
  113. data/lib/datadog/core/telemetry/v1/telemetry_request.rb +100 -0
  114. data/lib/datadog/core/utils/object_set.rb +1 -1
  115. data/lib/datadog/core/utils/sequence.rb +5 -0
  116. data/lib/datadog/core/utils/string_table.rb +1 -1
  117. data/lib/datadog/core/utils/time.rb +3 -3
  118. data/lib/datadog/core/utils.rb +3 -3
  119. data/lib/datadog/core/vendor/multipart-post/multipart/post/multipartable.rb +2 -2
  120. data/lib/datadog/core/vendor/multipart-post/net/http/post/multipart.rb +3 -3
  121. data/lib/datadog/core/workers/async.rb +1 -1
  122. data/lib/datadog/core/workers/polling.rb +2 -2
  123. data/lib/datadog/core/workers/runtime_metrics.rb +4 -4
  124. data/lib/datadog/core.rb +50 -50
  125. data/lib/datadog/kit.rb +1 -1
  126. data/lib/datadog/opentracer/distributed_headers.rb +2 -2
  127. data/lib/datadog/opentracer/rack_propagator.rb +11 -7
  128. data/lib/datadog/opentracer/span.rb +1 -1
  129. data/lib/datadog/opentracer/text_map_propagator.rb +9 -6
  130. data/lib/datadog/opentracer/thread_local_scope_manager.rb +26 -3
  131. data/lib/datadog/opentracer/tracer.rb +19 -15
  132. data/lib/datadog/opentracer.rb +16 -16
  133. data/lib/datadog/profiling/buffer.rb +3 -3
  134. data/lib/datadog/profiling/collectors/code_provenance.rb +1 -0
  135. data/lib/datadog/profiling/collectors/cpu_and_wall_time.rb +27 -0
  136. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +74 -0
  137. data/lib/datadog/profiling/collectors/old_stack.rb +7 -7
  138. data/lib/datadog/profiling/collectors/stack.rb +3 -6
  139. data/lib/datadog/profiling/encoding/profile.rb +8 -12
  140. data/lib/datadog/profiling/events/stack.rb +1 -1
  141. data/lib/datadog/profiling/exporter.rb +66 -9
  142. data/lib/datadog/profiling/ext/forking.rb +41 -42
  143. data/lib/datadog/profiling/ext.rb +3 -15
  144. data/lib/datadog/profiling/flush.rb +25 -56
  145. data/lib/datadog/profiling/http_transport.rb +132 -0
  146. data/lib/datadog/profiling/old_ext.rb +42 -0
  147. data/lib/datadog/profiling/old_recorder.rb +101 -0
  148. data/lib/datadog/profiling/pprof/builder.rb +4 -4
  149. data/lib/datadog/profiling/pprof/converter.rb +1 -1
  150. data/lib/datadog/profiling/pprof/message_set.rb +1 -1
  151. data/lib/datadog/profiling/pprof/stack_sample.rb +4 -4
  152. data/lib/datadog/profiling/pprof/string_table.rb +1 -1
  153. data/lib/datadog/profiling/pprof/template.rb +5 -5
  154. data/lib/datadog/profiling/preload.rb +1 -1
  155. data/lib/datadog/profiling/scheduler.rb +28 -46
  156. data/lib/datadog/profiling/stack_recorder.rb +14 -4
  157. data/lib/datadog/profiling/tag_builder.rb +6 -1
  158. data/lib/datadog/profiling/tasks/setup.rb +2 -2
  159. data/lib/datadog/profiling/trace_identifiers/ddtrace.rb +2 -2
  160. data/lib/datadog/profiling/trace_identifiers/helper.rb +1 -1
  161. data/lib/datadog/profiling/transport/http/api/endpoint.rb +13 -35
  162. data/lib/datadog/profiling/transport/http/api/instance.rb +2 -2
  163. data/lib/datadog/profiling/transport/http/api/spec.rb +1 -1
  164. data/lib/datadog/profiling/transport/http/api.rb +5 -5
  165. data/lib/datadog/profiling/transport/http/builder.rb +3 -3
  166. data/lib/datadog/profiling/transport/http/client.rb +6 -4
  167. data/lib/datadog/profiling/transport/http/response.rb +1 -3
  168. data/lib/datadog/profiling/transport/http.rb +22 -16
  169. data/lib/datadog/profiling.rb +21 -20
  170. data/lib/datadog/tracing/analytics.rb +1 -1
  171. data/lib/datadog/tracing/buffer.rb +5 -5
  172. data/lib/datadog/tracing/context.rb +1 -1
  173. data/lib/datadog/tracing/context_provider.rb +18 -2
  174. data/lib/datadog/tracing/contrib/action_cable/configuration/settings.rb +2 -2
  175. data/lib/datadog/tracing/contrib/action_cable/event.rb +4 -5
  176. data/lib/datadog/tracing/contrib/action_cable/events/broadcast.rb +4 -4
  177. data/lib/datadog/tracing/contrib/action_cable/events/perform_action.rb +3 -3
  178. data/lib/datadog/tracing/contrib/action_cable/events/transmit.rb +4 -4
  179. data/lib/datadog/tracing/contrib/action_cable/events.rb +4 -4
  180. data/lib/datadog/tracing/contrib/action_cable/instrumentation.rb +3 -4
  181. data/lib/datadog/tracing/contrib/action_cable/integration.rb +4 -4
  182. data/lib/datadog/tracing/contrib/action_cable/patcher.rb +4 -4
  183. data/lib/datadog/tracing/contrib/action_mailer/configuration/settings.rb +2 -2
  184. data/lib/datadog/tracing/contrib/action_mailer/event.rb +3 -3
  185. data/lib/datadog/tracing/contrib/action_mailer/events/deliver.rb +3 -3
  186. data/lib/datadog/tracing/contrib/action_mailer/events/process.rb +3 -3
  187. data/lib/datadog/tracing/contrib/action_mailer/events.rb +2 -2
  188. data/lib/datadog/tracing/contrib/action_mailer/integration.rb +4 -4
  189. data/lib/datadog/tracing/contrib/action_mailer/patcher.rb +3 -3
  190. data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +10 -6
  191. data/lib/datadog/tracing/contrib/action_pack/action_controller/patcher.rb +2 -2
  192. data/lib/datadog/tracing/contrib/action_pack/configuration/settings.rb +2 -2
  193. data/lib/datadog/tracing/contrib/action_pack/integration.rb +4 -4
  194. data/lib/datadog/tracing/contrib/action_pack/patcher.rb +2 -2
  195. data/lib/datadog/tracing/contrib/action_pack/utils.rb +1 -1
  196. data/lib/datadog/tracing/contrib/action_view/configuration/settings.rb +2 -2
  197. data/lib/datadog/tracing/contrib/action_view/event.rb +1 -1
  198. data/lib/datadog/tracing/contrib/action_view/events/render_partial.rb +5 -5
  199. data/lib/datadog/tracing/contrib/action_view/events/render_template.rb +5 -5
  200. data/lib/datadog/tracing/contrib/action_view/events.rb +2 -2
  201. data/lib/datadog/tracing/contrib/action_view/instrumentation/partial_renderer.rb +2 -2
  202. data/lib/datadog/tracing/contrib/action_view/instrumentation/template_renderer.rb +2 -2
  203. data/lib/datadog/tracing/contrib/action_view/integration.rb +4 -4
  204. data/lib/datadog/tracing/contrib/action_view/patcher.rb +7 -7
  205. data/lib/datadog/tracing/contrib/action_view/utils.rb +1 -1
  206. data/lib/datadog/tracing/contrib/active_job/configuration/settings.rb +3 -3
  207. data/lib/datadog/tracing/contrib/active_job/event.rb +3 -3
  208. data/lib/datadog/tracing/contrib/active_job/events/discard.rb +4 -4
  209. data/lib/datadog/tracing/contrib/active_job/events/enqueue.rb +4 -4
  210. data/lib/datadog/tracing/contrib/active_job/events/enqueue_at.rb +4 -4
  211. data/lib/datadog/tracing/contrib/active_job/events/enqueue_retry.rb +4 -4
  212. data/lib/datadog/tracing/contrib/active_job/events/perform.rb +4 -4
  213. data/lib/datadog/tracing/contrib/active_job/events/retry_stopped.rb +4 -4
  214. data/lib/datadog/tracing/contrib/active_job/events.rb +6 -6
  215. data/lib/datadog/tracing/contrib/active_job/integration.rb +4 -4
  216. data/lib/datadog/tracing/contrib/active_job/log_injection.rb +0 -2
  217. data/lib/datadog/tracing/contrib/active_job/patcher.rb +4 -4
  218. data/lib/datadog/tracing/contrib/active_model_serializers/configuration/settings.rb +2 -2
  219. data/lib/datadog/tracing/contrib/active_model_serializers/event.rb +4 -5
  220. data/lib/datadog/tracing/contrib/active_model_serializers/events/render.rb +3 -3
  221. data/lib/datadog/tracing/contrib/active_model_serializers/events/serialize.rb +2 -2
  222. data/lib/datadog/tracing/contrib/active_model_serializers/events.rb +2 -2
  223. data/lib/datadog/tracing/contrib/active_model_serializers/integration.rb +3 -3
  224. data/lib/datadog/tracing/contrib/active_model_serializers/patcher.rb +3 -4
  225. data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +2 -2
  226. data/lib/datadog/tracing/contrib/active_record/configuration/settings.rb +3 -3
  227. data/lib/datadog/tracing/contrib/active_record/event.rb +1 -1
  228. data/lib/datadog/tracing/contrib/active_record/events/instantiation.rb +4 -4
  229. data/lib/datadog/tracing/contrib/active_record/events/sql.rb +6 -6
  230. data/lib/datadog/tracing/contrib/active_record/events.rb +2 -2
  231. data/lib/datadog/tracing/contrib/active_record/integration.rb +6 -6
  232. data/lib/datadog/tracing/contrib/active_record/patcher.rb +2 -2
  233. data/lib/datadog/tracing/contrib/active_record/utils.rb +2 -2
  234. data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +19 -9
  235. data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +2 -2
  236. data/lib/datadog/tracing/contrib/active_support/cache/redis.rb +1 -1
  237. data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +2 -2
  238. data/lib/datadog/tracing/contrib/active_support/integration.rb +5 -5
  239. data/lib/datadog/tracing/contrib/active_support/notifications/event.rb +1 -1
  240. data/lib/datadog/tracing/contrib/active_support/notifications/subscriber.rb +1 -1
  241. data/lib/datadog/tracing/contrib/active_support/patcher.rb +2 -2
  242. data/lib/datadog/tracing/contrib/analytics.rb +1 -1
  243. data/lib/datadog/tracing/contrib/auto_instrument.rb +4 -4
  244. data/lib/datadog/tracing/contrib/aws/configuration/settings.rb +2 -2
  245. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +3 -4
  246. data/lib/datadog/tracing/contrib/aws/integration.rb +3 -3
  247. data/lib/datadog/tracing/contrib/aws/patcher.rb +5 -5
  248. data/lib/datadog/tracing/contrib/concurrent_ruby/configuration/settings.rb +2 -2
  249. data/lib/datadog/tracing/contrib/concurrent_ruby/future_patch.rb +1 -1
  250. data/lib/datadog/tracing/contrib/concurrent_ruby/integration.rb +3 -3
  251. data/lib/datadog/tracing/contrib/concurrent_ruby/patcher.rb +2 -2
  252. data/lib/datadog/tracing/contrib/configurable.rb +2 -2
  253. data/lib/datadog/tracing/contrib/configuration/resolvers/pattern_resolver.rb +1 -1
  254. data/lib/datadog/tracing/contrib/configuration/settings.rb +2 -2
  255. data/lib/datadog/tracing/contrib/dalli/configuration/settings.rb +2 -2
  256. data/lib/datadog/tracing/contrib/dalli/instrumentation.rb +4 -5
  257. data/lib/datadog/tracing/contrib/dalli/integration.rb +3 -3
  258. data/lib/datadog/tracing/contrib/dalli/patcher.rb +3 -3
  259. data/lib/datadog/tracing/contrib/dalli/quantize.rb +1 -1
  260. data/lib/datadog/tracing/contrib/delayed_job/configuration/settings.rb +3 -3
  261. data/lib/datadog/tracing/contrib/delayed_job/ext.rb +2 -0
  262. data/lib/datadog/tracing/contrib/delayed_job/integration.rb +3 -3
  263. data/lib/datadog/tracing/contrib/delayed_job/patcher.rb +8 -2
  264. data/lib/datadog/tracing/contrib/delayed_job/plugin.rb +3 -4
  265. data/lib/datadog/tracing/contrib/delayed_job/server_internal_tracer/worker.rb +32 -0
  266. data/lib/datadog/tracing/contrib/elasticsearch/configuration/settings.rb +2 -2
  267. data/lib/datadog/tracing/contrib/elasticsearch/integration.rb +3 -3
  268. data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +6 -7
  269. data/lib/datadog/tracing/contrib/elasticsearch/quantize.rb +1 -1
  270. data/lib/datadog/tracing/contrib/ethon/configuration/settings.rb +2 -2
  271. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +4 -5
  272. data/lib/datadog/tracing/contrib/ethon/integration.rb +4 -4
  273. data/lib/datadog/tracing/contrib/ethon/multi_patch.rb +3 -4
  274. data/lib/datadog/tracing/contrib/ethon/patcher.rb +3 -3
  275. data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +2 -2
  276. data/lib/datadog/tracing/contrib/excon/integration.rb +4 -4
  277. data/lib/datadog/tracing/contrib/excon/middleware.rb +6 -7
  278. data/lib/datadog/tracing/contrib/excon/patcher.rb +2 -2
  279. data/lib/datadog/tracing/contrib/extensions.rb +5 -3
  280. data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +2 -2
  281. data/lib/datadog/tracing/contrib/faraday/integration.rb +4 -4
  282. data/lib/datadog/tracing/contrib/faraday/middleware.rb +5 -6
  283. data/lib/datadog/tracing/contrib/faraday/patcher.rb +5 -5
  284. data/lib/datadog/tracing/contrib/grape/configuration/settings.rb +3 -3
  285. data/lib/datadog/tracing/contrib/grape/endpoint.rb +4 -5
  286. data/lib/datadog/tracing/contrib/grape/integration.rb +3 -3
  287. data/lib/datadog/tracing/contrib/grape/patcher.rb +4 -4
  288. data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +2 -2
  289. data/lib/datadog/tracing/contrib/graphql/integration.rb +3 -3
  290. data/lib/datadog/tracing/contrib/graphql/patcher.rb +2 -3
  291. data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +4 -3
  292. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +14 -5
  293. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +6 -6
  294. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor.rb +7 -4
  295. data/lib/datadog/tracing/contrib/grpc/ext.rb +1 -0
  296. data/lib/datadog/tracing/contrib/grpc/integration.rb +3 -3
  297. data/lib/datadog/tracing/contrib/grpc/patcher.rb +5 -5
  298. data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +1 -2
  299. data/lib/datadog/tracing/contrib/http/configuration/settings.rb +2 -2
  300. data/lib/datadog/tracing/contrib/http/instrumentation.rb +3 -4
  301. data/lib/datadog/tracing/contrib/http/integration.rb +6 -6
  302. data/lib/datadog/tracing/contrib/http/patcher.rb +3 -3
  303. data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +2 -2
  304. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +4 -5
  305. data/lib/datadog/tracing/contrib/httpclient/integration.rb +4 -4
  306. data/lib/datadog/tracing/contrib/httpclient/patcher.rb +3 -3
  307. data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +2 -2
  308. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +4 -5
  309. data/lib/datadog/tracing/contrib/httprb/integration.rb +4 -4
  310. data/lib/datadog/tracing/contrib/httprb/patcher.rb +3 -3
  311. data/lib/datadog/tracing/contrib/integration.rb +3 -3
  312. data/lib/datadog/tracing/contrib/kafka/configuration/settings.rb +2 -2
  313. data/lib/datadog/tracing/contrib/kafka/event.rb +3 -3
  314. data/lib/datadog/tracing/contrib/kafka/events/connection/request.rb +2 -2
  315. data/lib/datadog/tracing/contrib/kafka/events/consumer/process_batch.rb +3 -3
  316. data/lib/datadog/tracing/contrib/kafka/events/consumer/process_message.rb +3 -3
  317. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/heartbeat.rb +4 -4
  318. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/join_group.rb +4 -4
  319. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/leave_group.rb +4 -4
  320. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/sync_group.rb +4 -4
  321. data/lib/datadog/tracing/contrib/kafka/events/produce_operation/send_messages.rb +2 -2
  322. data/lib/datadog/tracing/contrib/kafka/events/producer/deliver_messages.rb +2 -2
  323. data/lib/datadog/tracing/contrib/kafka/events.rb +9 -9
  324. data/lib/datadog/tracing/contrib/kafka/integration.rb +3 -3
  325. data/lib/datadog/tracing/contrib/kafka/patcher.rb +3 -3
  326. data/lib/datadog/tracing/contrib/lograge/configuration/settings.rb +2 -2
  327. data/lib/datadog/tracing/contrib/lograge/instrumentation.rb +1 -2
  328. data/lib/datadog/tracing/contrib/lograge/integration.rb +3 -3
  329. data/lib/datadog/tracing/contrib/lograge/patcher.rb +2 -2
  330. data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +2 -2
  331. data/lib/datadog/tracing/contrib/mongodb/instrumentation.rb +3 -3
  332. data/lib/datadog/tracing/contrib/mongodb/integration.rb +4 -4
  333. data/lib/datadog/tracing/contrib/mongodb/parsers.rb +1 -1
  334. data/lib/datadog/tracing/contrib/mongodb/patcher.rb +3 -3
  335. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +4 -4
  336. data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +2 -2
  337. data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +3 -4
  338. data/lib/datadog/tracing/contrib/mysql2/integration.rb +3 -3
  339. data/lib/datadog/tracing/contrib/mysql2/patcher.rb +2 -2
  340. data/lib/datadog/tracing/contrib/patcher.rb +13 -2
  341. data/lib/datadog/tracing/contrib/pg/configuration/settings.rb +35 -0
  342. data/lib/datadog/tracing/contrib/pg/ext.rb +31 -0
  343. data/lib/datadog/tracing/contrib/pg/instrumentation.rb +128 -0
  344. data/lib/datadog/tracing/contrib/pg/integration.rb +43 -0
  345. data/lib/datadog/tracing/contrib/pg/patcher.rb +31 -0
  346. data/lib/datadog/tracing/contrib/presto/configuration/settings.rb +2 -2
  347. data/lib/datadog/tracing/contrib/presto/instrumentation.rb +2 -3
  348. data/lib/datadog/tracing/contrib/presto/integration.rb +3 -3
  349. data/lib/datadog/tracing/contrib/presto/patcher.rb +4 -4
  350. data/lib/datadog/tracing/contrib/qless/configuration/settings.rb +2 -2
  351. data/lib/datadog/tracing/contrib/qless/integration.rb +3 -3
  352. data/lib/datadog/tracing/contrib/qless/patcher.rb +1 -2
  353. data/lib/datadog/tracing/contrib/qless/qless_job.rb +2 -3
  354. data/lib/datadog/tracing/contrib/qless/tracer_cleaner.rb +0 -2
  355. data/lib/datadog/tracing/contrib/que/configuration/settings.rb +3 -3
  356. data/lib/datadog/tracing/contrib/que/integration.rb +4 -4
  357. data/lib/datadog/tracing/contrib/que/patcher.rb +1 -1
  358. data/lib/datadog/tracing/contrib/que/tracer.rb +1 -1
  359. data/lib/datadog/tracing/contrib/racecar/configuration/settings.rb +2 -2
  360. data/lib/datadog/tracing/contrib/racecar/event.rb +4 -5
  361. data/lib/datadog/tracing/contrib/racecar/events/batch.rb +2 -2
  362. data/lib/datadog/tracing/contrib/racecar/events/consume.rb +2 -2
  363. data/lib/datadog/tracing/contrib/racecar/events/message.rb +2 -2
  364. data/lib/datadog/tracing/contrib/racecar/events.rb +3 -3
  365. data/lib/datadog/tracing/contrib/racecar/integration.rb +3 -3
  366. data/lib/datadog/tracing/contrib/racecar/patcher.rb +3 -3
  367. data/lib/datadog/tracing/contrib/rack/configuration/settings.rb +2 -2
  368. data/lib/datadog/tracing/contrib/rack/integration.rb +4 -4
  369. data/lib/datadog/tracing/contrib/rack/middlewares.rb +24 -20
  370. data/lib/datadog/tracing/contrib/rack/patcher.rb +12 -2
  371. data/lib/datadog/tracing/contrib/rails/auto_instrument_railtie.rb +1 -1
  372. data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +4 -1
  373. data/lib/datadog/tracing/contrib/rails/framework.rb +18 -22
  374. data/lib/datadog/tracing/contrib/rails/integration.rb +4 -4
  375. data/lib/datadog/tracing/contrib/rails/log_injection.rb +0 -2
  376. data/lib/datadog/tracing/contrib/rails/middlewares.rb +1 -2
  377. data/lib/datadog/tracing/contrib/rails/patcher.rb +7 -8
  378. data/lib/datadog/tracing/contrib/rails/railtie.rb +3 -3
  379. data/lib/datadog/tracing/contrib/rails/utils.rb +1 -1
  380. data/lib/datadog/tracing/contrib/rake/configuration/settings.rb +17 -2
  381. data/lib/datadog/tracing/contrib/rake/instrumentation.rb +12 -7
  382. data/lib/datadog/tracing/contrib/rake/integration.rb +3 -3
  383. data/lib/datadog/tracing/contrib/rake/patcher.rb +3 -4
  384. data/lib/datadog/tracing/contrib/redis/configuration/resolver.rb +1 -1
  385. data/lib/datadog/tracing/contrib/redis/configuration/settings.rb +2 -2
  386. data/lib/datadog/tracing/contrib/redis/instrumentation.rb +6 -7
  387. data/lib/datadog/tracing/contrib/redis/integration.rb +3 -3
  388. data/lib/datadog/tracing/contrib/redis/patcher.rb +6 -6
  389. data/lib/datadog/tracing/contrib/redis/tags.rb +3 -4
  390. data/lib/datadog/tracing/contrib/resque/configuration/settings.rb +3 -3
  391. data/lib/datadog/tracing/contrib/resque/integration.rb +3 -3
  392. data/lib/datadog/tracing/contrib/resque/patcher.rb +2 -2
  393. data/lib/datadog/tracing/contrib/resque/resque_job.rb +3 -4
  394. data/lib/datadog/tracing/contrib/rest_client/configuration/settings.rb +3 -2
  395. data/lib/datadog/tracing/contrib/rest_client/integration.rb +3 -3
  396. data/lib/datadog/tracing/contrib/rest_client/patcher.rb +2 -2
  397. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +5 -6
  398. data/lib/datadog/tracing/contrib/semantic_logger/configuration/settings.rb +2 -2
  399. data/lib/datadog/tracing/contrib/semantic_logger/instrumentation.rb +1 -2
  400. data/lib/datadog/tracing/contrib/semantic_logger/integration.rb +3 -3
  401. data/lib/datadog/tracing/contrib/semantic_logger/patcher.rb +2 -2
  402. data/lib/datadog/tracing/contrib/sequel/configuration/settings.rb +2 -2
  403. data/lib/datadog/tracing/contrib/sequel/database.rb +4 -5
  404. data/lib/datadog/tracing/contrib/sequel/dataset.rb +4 -5
  405. data/lib/datadog/tracing/contrib/sequel/integration.rb +3 -3
  406. data/lib/datadog/tracing/contrib/sequel/patcher.rb +3 -3
  407. data/lib/datadog/tracing/contrib/sequel/utils.rb +2 -2
  408. data/lib/datadog/tracing/contrib/shoryuken/configuration/settings.rb +3 -3
  409. data/lib/datadog/tracing/contrib/shoryuken/integration.rb +4 -4
  410. data/lib/datadog/tracing/contrib/shoryuken/patcher.rb +1 -1
  411. data/lib/datadog/tracing/contrib/shoryuken/tracer.rb +1 -1
  412. data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +4 -5
  413. data/lib/datadog/tracing/contrib/sidekiq/configuration/settings.rb +3 -3
  414. data/lib/datadog/tracing/contrib/sidekiq/ext.rb +6 -0
  415. data/lib/datadog/tracing/contrib/sidekiq/integration.rb +3 -3
  416. data/lib/datadog/tracing/contrib/sidekiq/patcher.rb +14 -7
  417. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/heartbeat.rb +19 -1
  418. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/{scheduled_push.rb → redis_info.rb} +5 -6
  419. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/scheduled_poller.rb +53 -0
  420. data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +5 -6
  421. data/lib/datadog/tracing/contrib/sidekiq/tracing.rb +2 -2
  422. data/lib/datadog/tracing/contrib/sinatra/configuration/settings.rb +2 -2
  423. data/lib/datadog/tracing/contrib/sinatra/env.rb +2 -2
  424. data/lib/datadog/tracing/contrib/sinatra/framework.rb +0 -2
  425. data/lib/datadog/tracing/contrib/sinatra/headers.rb +1 -1
  426. data/lib/datadog/tracing/contrib/sinatra/integration.rb +3 -3
  427. data/lib/datadog/tracing/contrib/sinatra/patcher.rb +5 -5
  428. data/lib/datadog/tracing/contrib/sinatra/tracer.rb +7 -8
  429. data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +6 -7
  430. data/lib/datadog/tracing/contrib/sneakers/configuration/settings.rb +2 -2
  431. data/lib/datadog/tracing/contrib/sneakers/integration.rb +4 -4
  432. data/lib/datadog/tracing/contrib/sneakers/patcher.rb +2 -2
  433. data/lib/datadog/tracing/contrib/sneakers/tracer.rb +2 -3
  434. data/lib/datadog/tracing/contrib/status_code_matcher.rb +2 -2
  435. data/lib/datadog/tracing/contrib/sucker_punch/configuration/settings.rb +2 -2
  436. data/lib/datadog/tracing/contrib/sucker_punch/instrumentation.rb +3 -4
  437. data/lib/datadog/tracing/contrib/sucker_punch/integration.rb +3 -3
  438. data/lib/datadog/tracing/contrib/sucker_punch/patcher.rb +4 -5
  439. data/lib/datadog/tracing/contrib.rb +48 -47
  440. data/lib/datadog/tracing/correlation.rb +1 -1
  441. data/lib/datadog/tracing/distributed/headers/b3.rb +4 -4
  442. data/lib/datadog/tracing/distributed/headers/b3_single.rb +7 -7
  443. data/lib/datadog/tracing/distributed/headers/datadog.rb +3 -3
  444. data/lib/datadog/tracing/distributed/headers/parser.rb +37 -0
  445. data/lib/datadog/tracing/distributed/helpers.rb +36 -2
  446. data/lib/datadog/tracing/distributed/metadata/b3.rb +55 -0
  447. data/lib/datadog/tracing/distributed/metadata/b3_single.rb +66 -0
  448. data/lib/datadog/tracing/distributed/metadata/datadog.rb +73 -0
  449. data/lib/datadog/tracing/distributed/metadata/parser.rb +34 -0
  450. data/lib/datadog/tracing/event.rb +1 -1
  451. data/lib/datadog/tracing/metadata/analytics.rb +2 -2
  452. data/lib/datadog/tracing/metadata/errors.rb +2 -2
  453. data/lib/datadog/tracing/metadata/ext.rb +25 -0
  454. data/lib/datadog/tracing/metadata/tagging.rb +8 -2
  455. data/lib/datadog/tracing/metadata.rb +3 -3
  456. data/lib/datadog/tracing/pipeline/span_filter.rb +10 -6
  457. data/lib/datadog/tracing/pipeline.rb +3 -3
  458. data/lib/datadog/tracing/propagation/grpc.rb +68 -58
  459. data/lib/datadog/tracing/propagation/http.rb +8 -8
  460. data/lib/datadog/tracing/runtime/metrics.rb +1 -1
  461. data/lib/datadog/tracing/sampling/all_sampler.rb +1 -1
  462. data/lib/datadog/tracing/sampling/priority_sampler.rb +5 -5
  463. data/lib/datadog/tracing/sampling/rate_by_key_sampler.rb +2 -2
  464. data/lib/datadog/tracing/sampling/rate_by_service_sampler.rb +3 -3
  465. data/lib/datadog/tracing/sampling/rate_limiter.rb +1 -1
  466. data/lib/datadog/tracing/sampling/rate_sampler.rb +7 -7
  467. data/lib/datadog/tracing/sampling/rule.rb +3 -3
  468. data/lib/datadog/tracing/sampling/rule_sampler.rb +4 -4
  469. data/lib/datadog/tracing/sampling/span/matcher.rb +80 -0
  470. data/lib/datadog/tracing/span.rb +25 -5
  471. data/lib/datadog/tracing/span_operation.rb +10 -9
  472. data/lib/datadog/tracing/sync_writer.rb +5 -5
  473. data/lib/datadog/tracing/trace_operation.rb +16 -9
  474. data/lib/datadog/tracing/trace_segment.rb +5 -5
  475. data/lib/datadog/tracing/tracer.rb +15 -15
  476. data/lib/datadog/tracing/workers/trace_writer.rb +9 -9
  477. data/lib/datadog/tracing/workers.rb +3 -3
  478. data/lib/datadog/tracing/writer.rb +5 -5
  479. data/lib/datadog/tracing.rb +8 -8
  480. data/lib/ddtrace/auto_instrument.rb +9 -2
  481. data/lib/ddtrace/transport/ext.rb +7 -1
  482. data/lib/ddtrace/transport/http/adapters/net.rb +3 -2
  483. data/lib/ddtrace/transport/http/adapters/test.rb +1 -1
  484. data/lib/ddtrace/transport/http/adapters/unix_socket.rb +2 -2
  485. data/lib/ddtrace/transport/http/api/map.rb +1 -1
  486. data/lib/ddtrace/transport/http/api.rb +4 -4
  487. data/lib/ddtrace/transport/http/builder.rb +5 -5
  488. data/lib/ddtrace/transport/http/client.rb +2 -2
  489. data/lib/ddtrace/transport/http/response.rb +1 -1
  490. data/lib/ddtrace/transport/http/statistics.rb +1 -1
  491. data/lib/ddtrace/transport/http/traces.rb +5 -5
  492. data/lib/ddtrace/transport/http.rb +12 -9
  493. data/lib/ddtrace/transport/io/client.rb +2 -2
  494. data/lib/ddtrace/transport/io/response.rb +1 -1
  495. data/lib/ddtrace/transport/io/traces.rb +3 -3
  496. data/lib/ddtrace/transport/io.rb +3 -3
  497. data/lib/ddtrace/transport/statistics.rb +2 -2
  498. data/lib/ddtrace/transport/trace_formatter.rb +5 -5
  499. data/lib/ddtrace/transport/traces.rb +5 -5
  500. data/lib/ddtrace/version.rb +1 -1
  501. data/lib/ddtrace.rb +6 -6
  502. metadata +57 -33
  503. data/.editorconfig +0 -22
  504. data/.gitignore +0 -58
  505. data/CONTRIBUTING.md +0 -81
  506. data/ddtrace.gemspec +0 -68
  507. data/docs/0.x-trace.png +0 -0
  508. data/docs/1.0-trace.png +0 -0
  509. data/docs/AutoInstrumentation.md +0 -36
  510. data/docs/Deprecation.md +0 -8
  511. data/docs/DevelopmentGuide.md +0 -259
  512. data/docs/GettingStarted.md +0 -2688
  513. data/docs/ProfilingDevelopment.md +0 -110
  514. data/docs/PublicApi.md +0 -14
  515. data/docs/UpgradeGuide.md +0 -736
  516. data/lib/datadog/profiling/recorder.rb +0 -117
  517. data/lib/datadog/profiling/transport/client.rb +0 -16
  518. data/lib/datadog/profiling/transport/io/client.rb +0 -29
  519. data/lib/datadog/profiling/transport/io/response.rb +0 -18
  520. data/lib/datadog/profiling/transport/io.rb +0 -32
  521. data/lib/datadog/profiling/transport/parcel.rb +0 -19
  522. data/lib/datadog/profiling/transport/request.rb +0 -17
  523. data/lib/datadog/profiling/transport/response.rb +0 -10
  524. data/lib/datadog/tracing/distributed/parser.rb +0 -70
@@ -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,9 +1,12 @@
1
- # typed: true
1
+ # typed: false
2
2
 
3
- require 'datadog/tracing/distributed/headers/ext'
4
- require 'datadog/tracing/span'
5
- require 'datadog/tracing/trace_digest'
6
- require 'datadog/tracing/trace_operation'
3
+ require_relative '../distributed/metadata/datadog'
4
+ require_relative '../distributed/metadata/b3'
5
+ require_relative '../distributed/metadata/b3_single'
6
+
7
+ require_relative '../span'
8
+ require_relative '../trace_digest'
9
+ require_relative '../trace_operation'
7
10
 
8
11
  module Datadog
9
12
  module Tracing
@@ -13,74 +16,81 @@ module Datadog
13
16
  # to the Propagation::HTTP; the key difference is the way gRPC handles
14
17
  # header information (called "metadata") as it operates over HTTP2
15
18
  module GRPC
16
- include Distributed::Headers::Ext
19
+ PROPAGATION_STYLES = {
20
+ Configuration::Ext::Distributed::PROPAGATION_STYLE_B3 => Distributed::Metadata::B3,
21
+ Configuration::Ext::Distributed::PROPAGATION_STYLE_B3_SINGLE_HEADER => Distributed::Metadata::B3Single,
22
+ Configuration::Ext::Distributed::PROPAGATION_STYLE_DATADOG => Distributed::Metadata::Datadog
23
+ }.freeze
17
24
 
18
25
  def self.inject!(digest, metadata)
19
26
  return if digest.nil?
20
27
 
21
28
  digest = digest.to_digest if digest.is_a?(TraceOperation)
22
29
 
23
- metadata[GRPC_METADATA_TRACE_ID] = digest.trace_id.to_s
24
- metadata[GRPC_METADATA_PARENT_ID] = digest.span_id.to_s
25
- metadata[GRPC_METADATA_SAMPLING_PRIORITY] = digest.trace_sampling_priority.to_s if digest.trace_sampling_priority
26
- metadata[GRPC_METADATA_ORIGIN] = digest.trace_origin.to_s if digest.trace_origin
30
+ Datadog.configuration.tracing.distributed_tracing.propagation_inject_style.each do |style|
31
+ propagator = PROPAGATION_STYLES[style]
32
+ begin
33
+ propagator.inject!(digest, metadata) unless propagator.nil?
34
+ rescue => e
35
+ Datadog.logger.error(
36
+ 'Error injecting propagated trace headers into the environment. ' \
37
+ "Cause: #{e} Location: #{Array(e.backtrace).first}"
38
+ )
39
+ end
40
+ end
27
41
  end
28
42
 
29
43
  def self.extract(metadata)
30
- metadata = Carrier.new(metadata)
31
- return nil unless metadata.valid?
32
-
33
- TraceDigest.new(
34
- span_id: metadata.parent_id,
35
- trace_id: metadata.trace_id,
36
- trace_origin: metadata.origin,
37
- trace_sampling_priority: metadata.sampling_priority
38
- )
39
- end
40
-
41
- # opentracing.io compliant carrier object
42
- class Carrier
43
- include Distributed::Headers::Ext
44
-
45
- def initialize(metadata = {})
46
- @metadata = metadata || {}
47
- end
48
-
49
- def valid?
50
- trace_id && parent_id
51
- end
52
-
53
- def trace_id
54
- value = metadata_for_key(GRPC_METADATA_TRACE_ID).to_i
55
- value if (1..Span::EXTERNAL_MAX_ID).cover? value
56
- end
57
-
58
- def parent_id
59
- value = metadata_for_key(GRPC_METADATA_PARENT_ID).to_i
60
- value if (1..Span::EXTERNAL_MAX_ID).cover? value
61
- end
62
-
63
- def sampling_priority
64
- value = metadata_for_key(GRPC_METADATA_SAMPLING_PRIORITY)
65
- value && value.to_i
66
- end
44
+ trace_digest = nil
45
+ dd_trace_digest = nil
46
+
47
+ Datadog.configuration.tracing.distributed_tracing.propagation_extract_style.each do |style|
48
+ propagator = PROPAGATION_STYLES[style]
49
+
50
+ next if propagator.nil?
51
+
52
+ # Extract trace headers
53
+ begin
54
+ extracted_trace_digest = propagator.extract(metadata)
55
+ rescue => e
56
+ Datadog.logger.error(
57
+ 'Error extracting propagated trace headers from the environment. ' \
58
+ "Cause: #{e} Location: #{Array(e.backtrace).first}"
59
+ )
60
+ end
67
61
 
68
- def origin
69
- value = metadata_for_key(GRPC_METADATA_ORIGIN)
70
- value if value != ''
71
- end
62
+ # Skip this style if no valid headers were found
63
+ next if extracted_trace_digest.nil?
72
64
 
73
- private
65
+ # Keep track of the Datadog extract trace headers, we want to return
66
+ # this one if we have one
67
+ if extracted_trace_digest && style == Configuration::Ext::Distributed::PROPAGATION_STYLE_DATADOG
68
+ dd_trace_digest = extracted_trace_digest
69
+ end
74
70
 
75
- def metadata_for_key(key)
76
- # metadata values can be arrays (multiple headers with the same key)
77
- value = @metadata[key]
78
- if value.is_a?(Array)
79
- value.first
71
+ # No previously extracted trace headers, use the one we just extracted
72
+ if trace_digest.nil?
73
+ trace_digest = extracted_trace_digest
80
74
  else
81
- value
75
+ unless trace_digest.trace_id == extracted_trace_digest.trace_id \
76
+ && trace_digest.span_id == extracted_trace_digest.span_id
77
+ # Return an empty/new trace headers if we have a mismatch in values extracted
78
+ msg = "#{trace_digest.trace_id} != #{extracted_trace_digest.trace_id} && " \
79
+ "#{trace_digest.span_id} != #{extracted_trace_digest.span_id}"
80
+ Datadog.logger.debug(
81
+ "Cannot extract trace headers from HTTP: extracted trace headers differ, #{msg}"
82
+ )
83
+ # DEV: This will return from `self.extract` not this `each` block
84
+ return TraceDigest.new
85
+ end
82
86
  end
83
87
  end
88
+
89
+ # Return the extracted trace headers if we found one or else a new empty trace headers
90
+ # Always return the Datadog trace headers if one exists since it has more
91
+ # information than the B3 headers e.g. origin, expanded priority
92
+ # sampling values, etc
93
+ dd_trace_digest || trace_digest || nil
84
94
  end
85
95
  end
86
96
  end
@@ -1,15 +1,15 @@
1
1
  # typed: false
2
2
 
3
- require 'datadog/core'
3
+ require_relative '../../core'
4
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'
5
+ require_relative '../configuration/ext'
6
+ require_relative '../sampling/ext'
7
+ require_relative '../distributed/headers/b3'
8
+ require_relative '../distributed/headers/b3_single'
9
+ require_relative '../distributed/headers/datadog'
10
10
 
11
- require 'datadog/tracing/trace_digest'
12
- require 'datadog/tracing/trace_operation'
11
+ require_relative '../trace_digest'
12
+ require_relative '../trace_operation'
13
13
 
14
14
  module Datadog
15
15
  module Tracing
@@ -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,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,
@@ -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
@@ -1,12 +1,12 @@
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
@@ -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
@@ -1,19 +1,19 @@
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 '../span'
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
  #
@@ -37,11 +37,11 @@ module Datadog
37
37
 
38
38
  def sample_rate=(sample_rate)
39
39
  @sample_rate = sample_rate
40
- @sampling_id_threshold = sample_rate * Span::EXTERNAL_MAX_ID
40
+ @sampling_id_threshold = sample_rate * Tracing::Span::EXTERNAL_MAX_ID
41
41
  end
42
42
 
43
43
  def sample?(trace)
44
- ((trace.id * KNUTH_FACTOR) % Span::EXTERNAL_MAX_ID) <= @sampling_id_threshold
44
+ ((trace.id * KNUTH_FACTOR) % Tracing::Span::EXTERNAL_MAX_ID) <= @sampling_id_threshold
45
45
  end
46
46
 
47
47
  def sample!(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/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
@@ -0,0 +1,80 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Datadog
4
+ module Tracing
5
+ module Sampling
6
+ module Span
7
+ # Checks if a span conforms to a matching criteria.
8
+ class Matcher
9
+ # Pattern that matches any string
10
+ MATCH_ALL_PATTERN = '*'
11
+
12
+ # Matches span name and service to their respective patterns provided.
13
+ #
14
+ # The patterns are {String}s with two special characters available:
15
+ # 1. `?`: matches exactly one of any character.
16
+ # 2. `*`: matches a substring of any size, including zero.
17
+ # These patterns can occur any point of the string, any number of times.
18
+ #
19
+ # Both {SpanOperation#name} and {SpanOperation#service} must match the provided patterns.
20
+ #
21
+ # The whole String has to match the provided patterns: providing a pattern that
22
+ # matches a portion of the provided String is not considered a match.
23
+ #
24
+ # @example web-*
25
+ # `'web-*'` will match any string starting with `web-`.
26
+ # @example cache-?
27
+ # `'cache-?'` will match any string starting with `database-` followed by exactly one character.
28
+ #
29
+ # @param name_pattern [String] a pattern to be matched against {SpanOperation#name}
30
+ # @param service_pattern [String] a pattern to be matched against {SpanOperation#service}
31
+ def initialize(name_pattern: MATCH_ALL_PATTERN, service_pattern: MATCH_ALL_PATTERN)
32
+ @name = pattern_to_regex(name_pattern)
33
+ @service = pattern_to_regex(service_pattern)
34
+ end
35
+
36
+ # {Regexp#match?} was added in Ruby 2.4, and it's measurably
37
+ # the least costly way to get a boolean result for a Regexp match.
38
+ # @see https://www.ruby-lang.org/en/news/2016/12/25/ruby-2-4-0-released/
39
+ if Regexp.method_defined?(:match?)
40
+ # Returns `true` if the span conforms to the configured patterns,
41
+ # `false` otherwise
42
+ #
43
+ # @param [SpanOperation] span
44
+ # @return [Boolean]
45
+ def match?(span)
46
+ # Matching is performed at the end of the lifecycle of a Span,
47
+ # thus both `name` and `service` are guaranteed to be not `nil`.
48
+ @name.match?(span.name) && @service.match?(span.service)
49
+ end
50
+ else
51
+ # DEV: Remove when support for Ruby 2.3 and older is removed.
52
+ def match?(span)
53
+ @name === span.name && @service === span.service
54
+ end
55
+ end
56
+
57
+ private
58
+
59
+ # @param pattern [String]
60
+ # @return [Regexp]
61
+ def pattern_to_regex(pattern)
62
+ # Ensure no undesired characters are treated as regex.
63
+ # Our valid special characters, `?` and `*`,
64
+ # will be escaped so...
65
+ pattern = Regexp.quote(pattern)
66
+
67
+ # ...we account for that here:
68
+ pattern.gsub!('\?', '.') # Any single character
69
+ pattern.gsub!('\*', '.*') # Any substring
70
+
71
+ # Patterns have to match the whole input string
72
+ pattern = "\\A#{pattern}\\z"
73
+
74
+ Regexp.new(pattern)
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
@@ -2,11 +2,11 @@
2
2
 
3
3
  # typed: true
4
4
 
5
- require 'datadog/core/utils'
6
- require 'datadog/core/utils/safe_dup'
5
+ require_relative '../core/utils'
6
+ require_relative '../core/utils/safe_dup'
7
7
 
8
- require 'datadog/tracing/metadata/ext'
9
- require 'datadog/tracing/metadata'
8
+ require_relative 'metadata/ext'
9
+ require_relative 'metadata'
10
10
 
11
11
  module Datadog
12
12
  module Tracing
@@ -28,6 +28,9 @@ module Datadog
28
28
  # The range of IDs also has to consider portability across different languages and platforms.
29
29
  RUBY_MAX_ID = (1 << 62) - 1
30
30
 
31
+ # Excludes zero from possible values
32
+ RUBY_ID_RANGE = (1..RUBY_MAX_ID).freeze
33
+
31
34
  # While we only generate 63-bit integers due to limitations in other languages, we support
32
35
  # parsing 64-bit integers for distributed tracing since an upstream system may generate one
33
36
  EXTERNAL_MAX_ID = 1 << 64
@@ -63,6 +66,7 @@ module Datadog
63
66
  # * +type+: the type of the span (such as +http+, +db+ and so on)
64
67
  # * +parent_id+: the identifier of the parent span
65
68
  # * +trace_id+: the identifier of the root span for this trace
69
+ # * +service_entry+: whether it is a service entry span.
66
70
  # TODO: Remove span_type
67
71
  def initialize(
68
72
  name,
@@ -78,7 +82,8 @@ module Datadog
78
82
  start_time: nil,
79
83
  status: 0,
80
84
  type: span_type,
81
- trace_id: nil
85
+ trace_id: nil,
86
+ service_entry: nil
82
87
  )
83
88
  @name = Core::Utils::SafeDup.frozen_or_dup(name)
84
89
  @service = Core::Utils::SafeDup.frozen_or_dup(service)
@@ -103,6 +108,11 @@ module Datadog
103
108
  # duration_start and duration_end track monotonic clock, and may remain nil in cases where it
104
109
  # is known that we have to use wall clock to measure duration.
105
110
  @duration = duration
111
+
112
+ @service_entry = service_entry
113
+
114
+ # Mark with the service entry span metric, if applicable
115
+ set_metric(Metadata::Ext::TAG_TOP_LEVEL, 1.0) if service_entry
106
116
  end
107
117
 
108
118
  # Return whether the duration is started or not
@@ -207,6 +217,16 @@ module Datadog
207
217
  def duration_nano
208
218
  (duration * 1e9).to_i
209
219
  end
220
+
221
+ # https://docs.datadoghq.com/tracing/visualization/#service-entry-span
222
+ # A span is a service entry span when it is the entrypoint method for a request to a service.
223
+ # You can visualize this within Datadog APM when the color of the immediate parent on a flame graph is a different
224
+ # color. Services are also listed on the right when viewing a flame graph.
225
+ #
226
+ # @return [Boolean] `true` if the span is a serivce entry span
227
+ def service_entry?
228
+ @service_entry == true
229
+ end
210
230
  end
211
231
  end
212
232
  end
@@ -2,15 +2,15 @@
2
2
 
3
3
  require 'time'
4
4
 
5
- require 'datadog/core'
6
- require 'datadog/core/environment/identity'
7
- require 'datadog/core/utils'
8
- require 'datadog/core/utils/time'
5
+ require_relative '../core'
6
+ require_relative '../core/environment/identity'
7
+ require_relative '../core/utils'
8
+ require_relative '../core/utils/time'
9
9
 
10
- require 'datadog/tracing/metadata/ext'
11
- require 'datadog/tracing/event'
12
- require 'datadog/tracing/span'
13
- require 'datadog/tracing/metadata'
10
+ require_relative 'metadata/ext'
11
+ require_relative 'event'
12
+ require_relative 'span'
13
+ require_relative 'metadata'
14
14
 
15
15
  module Datadog
16
16
  module Tracing
@@ -468,7 +468,8 @@ module Datadog
468
468
  start_time: @start_time,
469
469
  status: @status,
470
470
  type: @type,
471
- trace_id: @trace_id
471
+ trace_id: @trace_id,
472
+ service_entry: parent.nil? || (service && parent.service != service)
472
473
  )
473
474
  end
474
475
 
@@ -1,12 +1,12 @@
1
1
  # typed: true
2
2
 
3
- require 'datadog/core'
3
+ require_relative '../core'
4
4
 
5
- require 'datadog/tracing/pipeline'
6
- require 'datadog/tracing/runtime/metrics'
7
- require 'datadog/tracing/writer'
5
+ require_relative 'pipeline'
6
+ require_relative 'runtime/metrics'
7
+ require_relative 'writer'
8
8
 
9
- require 'ddtrace/transport/http'
9
+ require_relative '../../ddtrace/transport/http'
10
10
 
11
11
  module Datadog
12
12
  module Tracing
@@ -1,15 +1,15 @@
1
1
  # typed: false
2
2
 
3
- require 'datadog/core'
4
- require 'datadog/core/environment/identity'
5
- require 'datadog/core/utils'
3
+ require_relative '../core'
4
+ require_relative '../core/environment/identity'
5
+ require_relative '../core/utils'
6
6
 
7
- require 'datadog/tracing/sampling/ext'
8
- require 'datadog/tracing/event'
9
- require 'datadog/tracing/span_operation'
10
- require 'datadog/tracing/trace_segment'
11
- require 'datadog/tracing/trace_digest'
12
- require 'datadog/tracing/metadata/tagging'
7
+ require_relative 'sampling/ext'
8
+ require_relative 'event'
9
+ require_relative 'span_operation'
10
+ require_relative 'trace_segment'
11
+ require_relative 'trace_digest'
12
+ require_relative 'metadata/tagging'
13
13
 
14
14
  module Datadog
15
15
  module Tracing
@@ -135,6 +135,13 @@ module Datadog
135
135
  @resource || (root_span && root_span.resource)
136
136
  end
137
137
 
138
+ # Returns true if the resource has been explicitly set
139
+ #
140
+ # @return [Boolean]
141
+ def resource_override?
142
+ !@resource.nil?
143
+ end
144
+
138
145
  def service
139
146
  @service || (root_span && root_span.service)
140
147
  end
@@ -1,11 +1,11 @@
1
1
  # typed: true
2
2
 
3
- require 'datadog/core/runtime/ext'
4
- require 'datadog/core/utils/safe_dup'
3
+ require_relative '../core/runtime/ext'
4
+ require_relative '../core/utils/safe_dup'
5
5
 
6
- require 'datadog/tracing/sampling/ext'
7
- require 'datadog/tracing/metadata/ext'
8
- require 'datadog/tracing/metadata/tagging'
6
+ require_relative 'sampling/ext'
7
+ require_relative 'metadata/ext'
8
+ require_relative 'metadata/tagging'
9
9
 
10
10
  module Datadog
11
11
  module Tracing
@@ -1,20 +1,20 @@
1
1
  # typed: true
2
2
 
3
- require 'datadog/core'
4
- require 'datadog/core/environment/ext'
5
- require 'datadog/core/environment/socket'
6
-
7
- require 'datadog/tracing/correlation'
8
- require 'datadog/tracing/event'
9
- require 'datadog/tracing/flush'
10
- require 'datadog/tracing/context_provider'
11
- require 'datadog/tracing/sampling/all_sampler'
12
- require 'datadog/tracing/sampling/rule_sampler'
13
- require 'datadog/tracing/sampling/priority_sampler'
14
- require 'datadog/tracing/span_operation'
15
- require 'datadog/tracing/trace_digest'
16
- require 'datadog/tracing/trace_operation'
17
- require 'datadog/tracing/writer'
3
+ require_relative '../core'
4
+ require_relative '../core/environment/ext'
5
+ require_relative '../core/environment/socket'
6
+
7
+ require_relative 'correlation'
8
+ require_relative 'event'
9
+ require_relative 'flush'
10
+ require_relative 'context_provider'
11
+ require_relative 'sampling/all_sampler'
12
+ require_relative 'sampling/rule_sampler'
13
+ require_relative 'sampling/priority_sampler'
14
+ require_relative 'span_operation'
15
+ require_relative 'trace_digest'
16
+ require_relative 'trace_operation'
17
+ require_relative 'writer'
18
18
 
19
19
  module Datadog
20
20
  module Tracing