ddtrace 1.14.0 → 1.16.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 (283) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +146 -2
  3. data/ext/ddtrace_profiling_native_extension/NativeExtensionDesign.md +3 -5
  4. data/ext/ddtrace_profiling_native_extension/clock_id.h +0 -3
  5. data/ext/ddtrace_profiling_native_extension/clock_id_from_pthread.c +0 -22
  6. data/ext/ddtrace_profiling_native_extension/clock_id_noop.c +0 -1
  7. data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +41 -6
  8. data/ext/ddtrace_profiling_native_extension/collectors_idle_sampling_helper.c +3 -0
  9. data/ext/ddtrace_profiling_native_extension/collectors_stack.c +76 -24
  10. data/ext/ddtrace_profiling_native_extension/collectors_stack.h +1 -1
  11. data/ext/ddtrace_profiling_native_extension/collectors_thread_context.c +207 -32
  12. data/ext/ddtrace_profiling_native_extension/collectors_thread_context.h +1 -1
  13. data/ext/ddtrace_profiling_native_extension/extconf.rb +8 -2
  14. data/ext/ddtrace_profiling_native_extension/http_transport.c +26 -10
  15. data/ext/ddtrace_profiling_native_extension/libdatadog_helpers.c +42 -0
  16. data/ext/ddtrace_profiling_native_extension/libdatadog_helpers.h +6 -0
  17. data/ext/ddtrace_profiling_native_extension/native_extension_helpers.rb +1 -16
  18. data/ext/ddtrace_profiling_native_extension/pid_controller.c +57 -0
  19. data/ext/ddtrace_profiling_native_extension/pid_controller.h +45 -0
  20. data/ext/ddtrace_profiling_native_extension/private_vm_api_access.c +17 -12
  21. data/ext/ddtrace_profiling_native_extension/profiling.c +0 -2
  22. data/ext/ddtrace_profiling_native_extension/stack_recorder.c +74 -37
  23. data/ext/ddtrace_profiling_native_extension/stack_recorder.h +13 -3
  24. data/lib/datadog/appsec/assets/waf_rules/processors.json +92 -0
  25. data/lib/datadog/appsec/assets/waf_rules/recommended.json +698 -75
  26. data/lib/datadog/appsec/assets/waf_rules/scanners.json +114 -0
  27. data/lib/datadog/appsec/assets/waf_rules/strict.json +98 -8
  28. data/lib/datadog/appsec/assets.rb +8 -0
  29. data/lib/datadog/appsec/component.rb +9 -2
  30. data/lib/datadog/appsec/configuration/settings.rb +67 -2
  31. data/lib/datadog/appsec/contrib/rack/gateway/request.rb +6 -2
  32. data/lib/datadog/appsec/contrib/rack/gateway/response.rb +46 -0
  33. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +8 -6
  34. data/lib/datadog/appsec/contrib/rack/reactive/request.rb +2 -7
  35. data/lib/datadog/appsec/contrib/rack/reactive/request_body.rb +2 -5
  36. data/lib/datadog/appsec/contrib/rack/reactive/response.rb +7 -5
  37. data/lib/datadog/appsec/contrib/rack/request_body_middleware.rb +3 -2
  38. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +34 -10
  39. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +3 -2
  40. data/lib/datadog/appsec/contrib/rails/patcher.rb +9 -3
  41. data/lib/datadog/appsec/contrib/rails/reactive/action.rb +2 -5
  42. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +6 -4
  43. data/lib/datadog/appsec/contrib/sinatra/patcher.rb +13 -7
  44. data/lib/datadog/appsec/contrib/sinatra/reactive/routed.rb +2 -5
  45. data/lib/datadog/appsec/event.rb +106 -50
  46. data/lib/datadog/appsec/monitor/gateway/watcher.rb +3 -3
  47. data/lib/datadog/appsec/monitor/reactive/set_user.rb +2 -5
  48. data/lib/datadog/appsec/processor/actions.rb +49 -0
  49. data/lib/datadog/appsec/processor/rule_merger.rb +22 -2
  50. data/lib/datadog/appsec/processor.rb +34 -6
  51. data/lib/datadog/appsec/remote.rb +4 -1
  52. data/lib/datadog/appsec/response.rb +82 -4
  53. data/lib/datadog/appsec/sample_rate.rb +21 -0
  54. data/lib/datadog/appsec.rb +2 -2
  55. data/lib/datadog/core/configuration/agent_settings_resolver.rb +29 -24
  56. data/lib/datadog/core/configuration/base.rb +1 -11
  57. data/lib/datadog/core/configuration/components.rb +7 -2
  58. data/lib/datadog/core/configuration/ext.rb +21 -0
  59. data/lib/datadog/core/configuration/option.rb +2 -4
  60. data/lib/datadog/core/configuration/option_definition.rb +17 -41
  61. data/lib/datadog/core/configuration/options.rb +5 -5
  62. data/lib/datadog/core/configuration/settings.rb +47 -45
  63. data/lib/datadog/core/environment/execution.rb +47 -9
  64. data/lib/datadog/core/environment/variable_helpers.rb +0 -69
  65. data/lib/datadog/core/error.rb +1 -0
  66. data/lib/datadog/core/git/ext.rb +2 -0
  67. data/lib/datadog/core/remote/client/capabilities.rb +1 -1
  68. data/lib/datadog/core/remote/component.rb +2 -2
  69. data/lib/datadog/core/remote/negotiation.rb +2 -2
  70. data/lib/datadog/core/remote/transport/config.rb +60 -0
  71. data/lib/datadog/core/remote/transport/http/api/instance.rb +39 -0
  72. data/lib/datadog/core/remote/transport/http/api/spec.rb +21 -0
  73. data/lib/datadog/core/remote/transport/http/api.rb +58 -0
  74. data/lib/datadog/core/remote/transport/http/builder.rb +219 -0
  75. data/lib/datadog/core/remote/transport/http/client.rb +48 -0
  76. data/lib/datadog/core/remote/transport/http/config.rb +280 -0
  77. data/lib/datadog/core/remote/transport/http/negotiation.rb +146 -0
  78. data/lib/datadog/core/remote/transport/http.rb +179 -0
  79. data/lib/datadog/core/{transport → remote/transport}/negotiation.rb +25 -23
  80. data/lib/datadog/core/remote/worker.rb +3 -1
  81. data/lib/datadog/core/telemetry/collector.rb +3 -2
  82. data/lib/datadog/core/telemetry/http/transport.rb +2 -1
  83. data/lib/datadog/core/transport/ext.rb +47 -0
  84. data/lib/datadog/core/transport/http/adapters/net.rb +168 -0
  85. data/lib/datadog/core/transport/http/adapters/registry.rb +29 -0
  86. data/lib/datadog/core/transport/http/adapters/test.rb +89 -0
  87. data/lib/datadog/core/transport/http/adapters/unix_socket.rb +83 -0
  88. data/lib/datadog/core/transport/http/api/endpoint.rb +31 -0
  89. data/lib/datadog/core/transport/http/api/fallbacks.rb +26 -0
  90. data/lib/datadog/core/transport/http/api/map.rb +18 -0
  91. data/lib/datadog/core/transport/http/env.rb +62 -0
  92. data/lib/datadog/core/transport/http/response.rb +60 -0
  93. data/lib/datadog/core/transport/parcel.rb +22 -0
  94. data/lib/datadog/core/transport/request.rb +17 -0
  95. data/lib/datadog/core/transport/response.rb +64 -0
  96. data/lib/datadog/core/workers/polling.rb +2 -2
  97. data/lib/datadog/opentelemetry/api/context.rb +10 -3
  98. data/lib/datadog/opentelemetry/sdk/propagator.rb +2 -1
  99. data/lib/datadog/opentelemetry/sdk/span_processor.rb +14 -2
  100. data/lib/datadog/opentelemetry/sdk/trace/span.rb +68 -0
  101. data/lib/datadog/opentelemetry/trace.rb +58 -0
  102. data/lib/datadog/opentelemetry.rb +1 -0
  103. data/lib/datadog/opentracer.rb +9 -0
  104. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +14 -19
  105. data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +1 -1
  106. data/lib/datadog/profiling/collectors/thread_context.rb +9 -1
  107. data/lib/datadog/profiling/component.rb +24 -99
  108. data/lib/datadog/profiling/ext.rb +0 -12
  109. data/lib/datadog/profiling/flush.rb +0 -3
  110. data/lib/datadog/profiling/http_transport.rb +6 -3
  111. data/lib/datadog/profiling/native_extension.rb +0 -21
  112. data/lib/datadog/profiling/profiler.rb +36 -13
  113. data/lib/datadog/profiling/scheduler.rb +16 -9
  114. data/lib/datadog/profiling.rb +8 -81
  115. data/lib/datadog/tracing/component.rb +10 -4
  116. data/lib/datadog/tracing/configuration/agent_settings_resolver.rb +13 -0
  117. data/lib/datadog/tracing/configuration/ext.rb +4 -2
  118. data/lib/datadog/tracing/configuration/settings.rb +14 -7
  119. data/lib/datadog/tracing/contrib/action_pack/configuration/settings.rb +1 -1
  120. data/lib/datadog/tracing/contrib/active_job/configuration/settings.rb +1 -1
  121. data/lib/datadog/tracing/contrib/active_record/events/sql.rb +4 -0
  122. data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +106 -197
  123. data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +3 -0
  124. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +7 -0
  125. data/lib/datadog/tracing/contrib/concurrent_ruby/context_composite_executor_service.rb +14 -14
  126. data/lib/datadog/tracing/contrib/concurrent_ruby/future_patch.rb +3 -10
  127. data/lib/datadog/tracing/contrib/concurrent_ruby/integration.rb +2 -1
  128. data/lib/datadog/tracing/contrib/concurrent_ruby/patcher.rb +8 -1
  129. data/lib/datadog/tracing/contrib/concurrent_ruby/promises_future_patch.rb +22 -0
  130. data/lib/datadog/tracing/contrib/configuration/settings.rb +1 -1
  131. data/lib/datadog/tracing/contrib/dalli/configuration/settings.rb +6 -0
  132. data/lib/datadog/tracing/contrib/dalli/ext.rb +7 -0
  133. data/lib/datadog/tracing/contrib/dalli/instrumentation.rb +9 -2
  134. data/lib/datadog/tracing/contrib/delayed_job/configuration/settings.rb +1 -1
  135. data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +5 -0
  136. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +5 -0
  137. data/lib/datadog/tracing/contrib/ethon/multi_patch.rb +8 -0
  138. data/lib/datadog/tracing/contrib/excon/middleware.rb +5 -0
  139. data/lib/datadog/tracing/contrib/ext.rb +3 -0
  140. data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +1 -1
  141. data/lib/datadog/tracing/contrib/faraday/middleware.rb +5 -0
  142. data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +21 -1
  143. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +11 -1
  144. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +18 -0
  145. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor.rb +0 -4
  146. data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +3 -3
  147. data/lib/datadog/tracing/contrib/http/instrumentation.rb +5 -0
  148. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +5 -0
  149. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +5 -0
  150. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +7 -0
  151. data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +13 -3
  152. data/lib/datadog/tracing/contrib/opensearch/integration.rb +2 -2
  153. data/lib/datadog/tracing/contrib/opensearch/patcher.rb +7 -0
  154. data/lib/datadog/tracing/contrib/pg/instrumentation.rb +5 -0
  155. data/lib/datadog/tracing/contrib/presto/instrumentation.rb +5 -0
  156. data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +1 -1
  157. data/lib/datadog/tracing/contrib/que/configuration/settings.rb +1 -1
  158. data/lib/datadog/tracing/contrib/racecar/event.rb +5 -0
  159. data/lib/datadog/tracing/contrib/rack/header_tagging.rb +14 -4
  160. data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +4 -4
  161. data/lib/datadog/tracing/contrib/rake/configuration/settings.rb +1 -1
  162. data/lib/datadog/tracing/contrib/redis/configuration/settings.rb +1 -1
  163. data/lib/datadog/tracing/contrib/redis/instrumentation.rb +3 -38
  164. data/lib/datadog/tracing/contrib/redis/tags.rb +7 -2
  165. data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +46 -33
  166. data/lib/datadog/tracing/contrib/resque/configuration/settings.rb +1 -1
  167. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +5 -0
  168. data/lib/datadog/tracing/contrib/sequel/utils.rb +5 -0
  169. data/lib/datadog/tracing/contrib/shoryuken/configuration/settings.rb +1 -1
  170. data/lib/datadog/tracing/contrib/sidekiq/configuration/settings.rb +1 -1
  171. data/lib/datadog/tracing/contrib/sneakers/configuration/settings.rb +1 -1
  172. data/lib/datadog/tracing/contrib/utils/quantization/http.rb +2 -2
  173. data/lib/datadog/tracing/diagnostics/environment_logger.rb +6 -0
  174. data/lib/datadog/tracing/distributed/propagation.rb +13 -33
  175. data/lib/datadog/tracing/metadata/tagging.rb +3 -3
  176. data/lib/datadog/tracing/sync_writer.rb +3 -3
  177. data/lib/datadog/tracing/tracer.rb +2 -0
  178. data/lib/datadog/{core → tracing}/transport/http/api/instance.rb +1 -1
  179. data/lib/datadog/{core → tracing}/transport/http/api/spec.rb +1 -1
  180. data/lib/datadog/tracing/transport/http/api.rb +43 -0
  181. data/lib/datadog/{core → tracing}/transport/http/builder.rb +13 -68
  182. data/lib/datadog/tracing/transport/http/client.rb +57 -0
  183. data/lib/datadog/tracing/transport/http/statistics.rb +47 -0
  184. data/lib/datadog/tracing/transport/http/traces.rb +152 -0
  185. data/lib/datadog/tracing/transport/http.rb +124 -0
  186. data/lib/datadog/tracing/transport/io/client.rb +89 -0
  187. data/lib/datadog/tracing/transport/io/response.rb +27 -0
  188. data/lib/datadog/tracing/transport/io/traces.rb +101 -0
  189. data/lib/datadog/tracing/transport/io.rb +30 -0
  190. data/lib/datadog/tracing/transport/serializable_trace.rb +126 -0
  191. data/lib/datadog/tracing/transport/statistics.rb +77 -0
  192. data/lib/datadog/tracing/transport/trace_formatter.rb +209 -0
  193. data/lib/datadog/tracing/transport/traces.rb +224 -0
  194. data/lib/datadog/tracing/workers/trace_writer.rb +5 -3
  195. data/lib/datadog/tracing/workers.rb +3 -2
  196. data/lib/datadog/tracing/writer.rb +5 -2
  197. data/lib/ddtrace/transport/ext.rb +17 -15
  198. data/lib/ddtrace/version.rb +1 -1
  199. data/lib/ddtrace.rb +1 -1
  200. metadata +73 -96
  201. data/lib/datadog/ci/configuration/components.rb +0 -32
  202. data/lib/datadog/ci/configuration/settings.rb +0 -51
  203. data/lib/datadog/ci/contrib/cucumber/configuration/settings.rb +0 -35
  204. data/lib/datadog/ci/contrib/cucumber/ext.rb +0 -22
  205. data/lib/datadog/ci/contrib/cucumber/formatter.rb +0 -94
  206. data/lib/datadog/ci/contrib/cucumber/instrumentation.rb +0 -28
  207. data/lib/datadog/ci/contrib/cucumber/integration.rb +0 -47
  208. data/lib/datadog/ci/contrib/cucumber/patcher.rb +0 -27
  209. data/lib/datadog/ci/contrib/minitest/configuration/settings.rb +0 -35
  210. data/lib/datadog/ci/contrib/minitest/ext.rb +0 -21
  211. data/lib/datadog/ci/contrib/minitest/integration.rb +0 -49
  212. data/lib/datadog/ci/contrib/minitest/patcher.rb +0 -27
  213. data/lib/datadog/ci/contrib/minitest/test_helper.rb +0 -68
  214. data/lib/datadog/ci/contrib/rspec/configuration/settings.rb +0 -35
  215. data/lib/datadog/ci/contrib/rspec/example.rb +0 -68
  216. data/lib/datadog/ci/contrib/rspec/ext.rb +0 -21
  217. data/lib/datadog/ci/contrib/rspec/integration.rb +0 -48
  218. data/lib/datadog/ci/contrib/rspec/patcher.rb +0 -27
  219. data/lib/datadog/ci/ext/app_types.rb +0 -9
  220. data/lib/datadog/ci/ext/environment.rb +0 -575
  221. data/lib/datadog/ci/ext/settings.rb +0 -10
  222. data/lib/datadog/ci/ext/test.rb +0 -35
  223. data/lib/datadog/ci/extensions.rb +0 -19
  224. data/lib/datadog/ci/flush.rb +0 -38
  225. data/lib/datadog/ci/test.rb +0 -81
  226. data/lib/datadog/ci.rb +0 -21
  227. data/lib/datadog/core/configuration/dependency_resolver.rb +0 -28
  228. data/lib/datadog/core/configuration/option_definition_set.rb +0 -22
  229. data/lib/datadog/core/configuration/option_set.rb +0 -10
  230. data/lib/datadog/core/transport/config.rb +0 -58
  231. data/lib/datadog/core/transport/http/api.rb +0 -57
  232. data/lib/datadog/core/transport/http/client.rb +0 -45
  233. data/lib/datadog/core/transport/http/config.rb +0 -278
  234. data/lib/datadog/core/transport/http/negotiation.rb +0 -144
  235. data/lib/datadog/core/transport/http.rb +0 -169
  236. data/lib/datadog/core/utils/object_set.rb +0 -43
  237. data/lib/datadog/core/utils/string_table.rb +0 -47
  238. data/lib/datadog/profiling/backtrace_location.rb +0 -34
  239. data/lib/datadog/profiling/buffer.rb +0 -43
  240. data/lib/datadog/profiling/collectors/old_stack.rb +0 -301
  241. data/lib/datadog/profiling/encoding/profile.rb +0 -41
  242. data/lib/datadog/profiling/event.rb +0 -15
  243. data/lib/datadog/profiling/events/stack.rb +0 -82
  244. data/lib/datadog/profiling/old_recorder.rb +0 -107
  245. data/lib/datadog/profiling/pprof/builder.rb +0 -125
  246. data/lib/datadog/profiling/pprof/converter.rb +0 -102
  247. data/lib/datadog/profiling/pprof/message_set.rb +0 -16
  248. data/lib/datadog/profiling/pprof/payload.rb +0 -20
  249. data/lib/datadog/profiling/pprof/pprof.proto +0 -212
  250. data/lib/datadog/profiling/pprof/pprof_pb.rb +0 -81
  251. data/lib/datadog/profiling/pprof/stack_sample.rb +0 -139
  252. data/lib/datadog/profiling/pprof/string_table.rb +0 -12
  253. data/lib/datadog/profiling/pprof/template.rb +0 -118
  254. data/lib/datadog/profiling/trace_identifiers/ddtrace.rb +0 -43
  255. data/lib/datadog/profiling/trace_identifiers/helper.rb +0 -45
  256. data/lib/ddtrace/transport/http/adapters/net.rb +0 -168
  257. data/lib/ddtrace/transport/http/adapters/registry.rb +0 -27
  258. data/lib/ddtrace/transport/http/adapters/test.rb +0 -85
  259. data/lib/ddtrace/transport/http/adapters/unix_socket.rb +0 -77
  260. data/lib/ddtrace/transport/http/api/endpoint.rb +0 -29
  261. data/lib/ddtrace/transport/http/api/fallbacks.rb +0 -24
  262. data/lib/ddtrace/transport/http/api/instance.rb +0 -35
  263. data/lib/ddtrace/transport/http/api/map.rb +0 -16
  264. data/lib/ddtrace/transport/http/api/spec.rb +0 -17
  265. data/lib/ddtrace/transport/http/api.rb +0 -39
  266. data/lib/ddtrace/transport/http/builder.rb +0 -176
  267. data/lib/ddtrace/transport/http/client.rb +0 -52
  268. data/lib/ddtrace/transport/http/env.rb +0 -58
  269. data/lib/ddtrace/transport/http/response.rb +0 -58
  270. data/lib/ddtrace/transport/http/statistics.rb +0 -43
  271. data/lib/ddtrace/transport/http/traces.rb +0 -144
  272. data/lib/ddtrace/transport/http.rb +0 -117
  273. data/lib/ddtrace/transport/io/client.rb +0 -85
  274. data/lib/ddtrace/transport/io/response.rb +0 -25
  275. data/lib/ddtrace/transport/io/traces.rb +0 -99
  276. data/lib/ddtrace/transport/io.rb +0 -28
  277. data/lib/ddtrace/transport/parcel.rb +0 -20
  278. data/lib/ddtrace/transport/request.rb +0 -15
  279. data/lib/ddtrace/transport/response.rb +0 -60
  280. data/lib/ddtrace/transport/serializable_trace.rb +0 -122
  281. data/lib/ddtrace/transport/statistics.rb +0 -75
  282. data/lib/ddtrace/transport/trace_formatter.rb +0 -207
  283. data/lib/ddtrace/transport/traces.rb +0 -216
@@ -0,0 +1,209 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../core/environment/identity'
4
+ require_relative '../../core/environment/socket'
5
+ require_relative '../../core/runtime/ext'
6
+ require_relative '../metadata/ext'
7
+ require_relative '../trace_segment'
8
+
9
+ module Datadog
10
+ module Tracing
11
+ module Transport
12
+ # Prepares traces for transport
13
+ class TraceFormatter
14
+ attr_reader \
15
+ :root_span,
16
+ :trace
17
+
18
+ def self.format!(trace)
19
+ new(trace).format!
20
+ end
21
+
22
+ def initialize(trace)
23
+ @trace = trace
24
+ @root_span = find_root_span(trace)
25
+ end
26
+
27
+ # Modifies a trace so suitable for transport
28
+ def format!
29
+ return unless trace
30
+ return trace unless root_span
31
+
32
+ # Because the trace API does not support
33
+ # trace metadata, we must put our trace
34
+ # metadata on the root span. This "root span"
35
+ # is needed by the agent/API to ingest the trace.
36
+
37
+ # Apply generic trace tags. Any more specific value will be overridden
38
+ # by the subsequent calls below.
39
+ set_trace_tags!
40
+
41
+ set_resource!
42
+
43
+ tag_agent_sample_rate!
44
+ tag_hostname!
45
+ tag_lang!
46
+ tag_origin!
47
+ tag_process_id!
48
+ tag_rule_sample_rate!
49
+ tag_runtime_id!
50
+ tag_rate_limiter_rate!
51
+ tag_sample_rate!
52
+ tag_sampling_decision_maker!
53
+ tag_high_order_trace_id!
54
+ tag_sampling_priority!
55
+ tag_profiling_enabled!
56
+
57
+ trace
58
+ end
59
+
60
+ protected
61
+
62
+ def set_resource!
63
+ # If the trace resource is undefined, or the root span wasn't
64
+ # specified, don't set this. We don't want to overwrite the
65
+ # resource of a span that is in the middle of the trace.
66
+ return if trace.resource.nil? || partial?
67
+
68
+ root_span.resource = trace.resource
69
+ end
70
+
71
+ def set_trace_tags!
72
+ # If the root span wasn't specified, don't set this. We don't want to
73
+ # misset or overwrite the tags of a span that is in the middle of the
74
+ # trace.
75
+ return if partial?
76
+
77
+ root_span.set_tags(trace.send(:meta))
78
+ root_span.set_tags(trace.send(:metrics))
79
+ end
80
+
81
+ def tag_agent_sample_rate!
82
+ return unless trace.agent_sample_rate
83
+
84
+ root_span.set_tag(
85
+ Tracing::Metadata::Ext::Sampling::TAG_AGENT_RATE,
86
+ trace.agent_sample_rate
87
+ )
88
+ end
89
+
90
+ def tag_hostname!
91
+ return unless trace.hostname
92
+
93
+ root_span.set_tag(
94
+ Tracing::Metadata::Ext::NET::TAG_HOSTNAME,
95
+ trace.hostname
96
+ )
97
+ end
98
+
99
+ def tag_lang!
100
+ return if trace.lang.nil?
101
+
102
+ root_span.set_tag(
103
+ Core::Runtime::Ext::TAG_LANG,
104
+ trace.lang
105
+ )
106
+ end
107
+
108
+ def tag_origin!
109
+ return unless trace.origin
110
+
111
+ root_span.set_tag(
112
+ Tracing::Metadata::Ext::Distributed::TAG_ORIGIN,
113
+ trace.origin
114
+ )
115
+ end
116
+
117
+ def tag_process_id!
118
+ return unless trace.process_id
119
+
120
+ root_span.set_tag(Core::Runtime::Ext::TAG_PROCESS_ID, trace.process_id)
121
+ end
122
+
123
+ def tag_rate_limiter_rate!
124
+ return unless trace.rate_limiter_rate
125
+
126
+ root_span.set_tag(
127
+ Tracing::Metadata::Ext::Sampling::TAG_RATE_LIMITER_RATE,
128
+ trace.rate_limiter_rate
129
+ )
130
+ end
131
+
132
+ def tag_rule_sample_rate!
133
+ return unless trace.rule_sample_rate
134
+
135
+ root_span.set_tag(
136
+ Tracing::Metadata::Ext::Sampling::TAG_RULE_SAMPLE_RATE,
137
+ trace.rule_sample_rate
138
+ )
139
+ end
140
+
141
+ def tag_runtime_id!
142
+ return unless trace.runtime_id
143
+
144
+ root_span.set_tag(
145
+ Core::Runtime::Ext::TAG_ID,
146
+ trace.runtime_id
147
+ )
148
+ end
149
+
150
+ def tag_sample_rate!
151
+ return unless trace.sample_rate
152
+
153
+ root_span.set_tag(
154
+ Tracing::Metadata::Ext::Sampling::TAG_SAMPLE_RATE,
155
+ trace.sample_rate
156
+ )
157
+ end
158
+
159
+ def tag_sampling_decision_maker!
160
+ return unless (decision = trace.sampling_decision_maker)
161
+
162
+ root_span.set_tag(Tracing::Metadata::Ext::Distributed::TAG_DECISION_MAKER, decision)
163
+ end
164
+
165
+ def tag_sampling_priority!
166
+ return unless trace.sampling_priority
167
+
168
+ root_span.set_metric(
169
+ Tracing::Metadata::Ext::Distributed::TAG_SAMPLING_PRIORITY,
170
+ trace.sampling_priority
171
+ )
172
+ end
173
+
174
+ def tag_high_order_trace_id!
175
+ return unless (high_order_tid = trace.high_order_tid)
176
+
177
+ root_span.set_tag(Tracing::Metadata::Ext::Distributed::TAG_TID, high_order_tid)
178
+ end
179
+
180
+ def tag_profiling_enabled!
181
+ return if trace.profiling_enabled.nil?
182
+
183
+ root_span.set_tag(
184
+ Tracing::Metadata::Ext::TAG_PROFILING_ENABLED, trace.profiling_enabled ? 1 : 0
185
+ )
186
+ end
187
+
188
+ private
189
+
190
+ def partial?
191
+ !@found_root_span
192
+ end
193
+
194
+ def find_root_span(trace)
195
+ # TODO: Should we memoize this?
196
+ # Would be safe, but `spans` is mutable, so if
197
+ # the root span were removed, it would be a stale reference.
198
+ # Figure out a better way to deal with this.
199
+ root_span_id = trace.send(:root_span_id)
200
+ root_span = trace.spans.find { |s| s.id == root_span_id } if root_span_id
201
+ @found_root_span = !root_span.nil?
202
+
203
+ # when root span is not found, fall back to last span (partial flush)
204
+ root_span || trace.spans.last
205
+ end
206
+ end
207
+ end
208
+ end
209
+ end
@@ -0,0 +1,224 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../core/chunker'
4
+ require_relative '../../core/transport/parcel'
5
+ require_relative '../../core/transport/request'
6
+ require_relative 'serializable_trace'
7
+ require_relative 'trace_formatter'
8
+
9
+ module Datadog
10
+ module Tracing
11
+ module Transport
12
+ module Traces
13
+ # Data transfer object for encoded traces
14
+ class EncodedParcel
15
+ include Datadog::Core::Transport::Parcel
16
+
17
+ attr_reader :trace_count
18
+
19
+ def initialize(data, trace_count)
20
+ super(data)
21
+ @trace_count = trace_count
22
+ end
23
+
24
+ def count
25
+ data.length
26
+ end
27
+ end
28
+
29
+ # Traces request
30
+ class Request < Datadog::Core::Transport::Request
31
+ end
32
+
33
+ # Traces response
34
+ module Response
35
+ attr_reader :service_rates, :trace_count
36
+ end
37
+
38
+ # Traces chunker
39
+ class Chunker
40
+ # Trace agent limit payload size of 10 MiB (since agent v5.11.0):
41
+ # https://github.com/DataDog/datadog-agent/blob/6.14.1/pkg/trace/api/api.go#L46
42
+ #
43
+ # We set the value to a conservative 5 MiB, in case network speed is slow.
44
+ DEFAULT_MAX_PAYLOAD_SIZE = 5 * 1024 * 1024
45
+
46
+ attr_reader :encoder, :max_size
47
+
48
+ #
49
+ # Single traces larger than +max_size+ will be discarded.
50
+ #
51
+ # @param encoder [Datadog::Core::Encoding::Encoder]
52
+ # @param max_size [String] maximum acceptable payload size
53
+ def initialize(encoder, max_size: DEFAULT_MAX_PAYLOAD_SIZE)
54
+ @encoder = encoder
55
+ @max_size = max_size
56
+ end
57
+
58
+ # Encodes a list of traces in chunks.
59
+ # Before serializing, all traces are normalized. Trace nesting is not changed.
60
+ #
61
+ # @param traces [Enumerable<Trace>] list of traces
62
+ # @return [Enumerable[Array[Bytes,Integer]]] list of encoded chunks: each containing a byte array and
63
+ # number of traces
64
+ def encode_in_chunks(traces)
65
+ encoded_traces = if traces.respond_to?(:filter_map)
66
+ # DEV Supported since Ruby 2.7, saves an intermediate object creation
67
+ traces.filter_map { |t| encode_one(t) }
68
+ else
69
+ traces.map { |t| encode_one(t) }.reject(&:nil?)
70
+ end
71
+
72
+ Datadog::Core::Chunker.chunk_by_size(encoded_traces, max_size).map do |chunk|
73
+ [encoder.join(chunk), chunk.size]
74
+ end
75
+ end
76
+
77
+ private
78
+
79
+ def encode_one(trace)
80
+ encoded = Encoder.encode_trace(encoder, trace)
81
+
82
+ if encoded.size > max_size
83
+ # This single trace is too large, we can't flush it
84
+ Datadog.logger.debug { "Dropping trace. Payload too large: '#{trace.inspect}'" }
85
+ Datadog.health_metrics.transport_trace_too_large(1)
86
+
87
+ return nil
88
+ end
89
+
90
+ encoded
91
+ end
92
+ end
93
+
94
+ # Encodes traces using {Datadog::Core::Encoding::Encoder} instances.
95
+ module Encoder
96
+ module_function
97
+
98
+ def encode_trace(encoder, trace)
99
+ # Format the trace for transport
100
+ TraceFormatter.format!(trace)
101
+
102
+ # Make the trace serializable
103
+ serializable_trace = SerializableTrace.new(trace)
104
+
105
+ Datadog.logger.debug { "Flushing trace: #{JSON.dump(serializable_trace)}" }
106
+
107
+ # Encode the trace
108
+ encoder.encode(serializable_trace)
109
+ end
110
+ end
111
+
112
+ # Sends traces based on transport API configuration.
113
+ #
114
+ # This class initializes the HTTP client, breaks down large
115
+ # batches of traces into smaller chunks and handles
116
+ # API version downgrade handshake.
117
+ class Transport
118
+ attr_reader :client, :apis, :default_api, :current_api_id
119
+
120
+ def initialize(apis, default_api)
121
+ @apis = apis
122
+ @default_api = default_api
123
+
124
+ change_api!(default_api)
125
+ end
126
+
127
+ def send_traces(traces)
128
+ encoder = current_api.encoder
129
+ chunker = Datadog::Tracing::Transport::Traces::Chunker.new(encoder)
130
+
131
+ responses = chunker.encode_in_chunks(traces.lazy).map do |encoded_traces, trace_count|
132
+ request = Request.new(EncodedParcel.new(encoded_traces, trace_count))
133
+
134
+ client.send_traces_payload(request).tap do |response|
135
+ if downgrade?(response)
136
+ downgrade!
137
+ return send_traces(traces)
138
+ end
139
+ end
140
+ end
141
+
142
+ # Force resolution of lazy enumerator.
143
+ #
144
+ # The "correct" method to call here would be `#force`,
145
+ # as this method was created to force the eager loading
146
+ # of a lazy enumerator.
147
+ #
148
+ # Unfortunately, JRuby < 9.2.9.0 erroneously eagerly loads
149
+ # the lazy Enumerator during intermediate steps.
150
+ # This forces us to use `#to_a`, as this method works for both
151
+ # lazy and regular Enumerators.
152
+ # Using `#to_a` can mask the fact that we expect a lazy
153
+ # Enumerator.
154
+ responses = responses.to_a
155
+
156
+ Datadog.health_metrics.transport_chunked(responses.size)
157
+
158
+ responses
159
+ end
160
+
161
+ def stats
162
+ @client.stats
163
+ end
164
+
165
+ def current_api
166
+ apis[@current_api_id]
167
+ end
168
+
169
+ private
170
+
171
+ def downgrade?(response)
172
+ return false unless apis.fallbacks.key?(@current_api_id)
173
+
174
+ response.not_found? || response.unsupported?
175
+ end
176
+
177
+ def downgrade!
178
+ downgrade_api_id = apis.fallbacks[@current_api_id]
179
+ raise NoDowngradeAvailableError, @current_api_id if downgrade_api_id.nil?
180
+
181
+ change_api!(downgrade_api_id)
182
+ end
183
+
184
+ def change_api!(api_id)
185
+ raise UnknownApiVersionError, api_id unless apis.key?(api_id)
186
+
187
+ @current_api_id = api_id
188
+ @client = HTTP::Client.new(current_api)
189
+ end
190
+
191
+ # Raised when configured with an unknown API version
192
+ class UnknownApiVersionError < StandardError
193
+ attr_reader :version
194
+
195
+ def initialize(version)
196
+ super
197
+
198
+ @version = version
199
+ end
200
+
201
+ def message
202
+ "No matching transport API for version #{version}!"
203
+ end
204
+ end
205
+
206
+ # Raised when configured with an unknown API version
207
+ class NoDowngradeAvailableError < StandardError
208
+ attr_reader :version
209
+
210
+ def initialize(version)
211
+ super
212
+
213
+ @version = version
214
+ end
215
+
216
+ def message
217
+ "No downgrade from transport API version #{version} is available!"
218
+ end
219
+ end
220
+ end
221
+ end
222
+ end
223
+ end
224
+ end
@@ -7,7 +7,7 @@ require_relative '../buffer'
7
7
  require_relative '../pipeline'
8
8
  require_relative '../event'
9
9
 
10
- require_relative '../../../ddtrace/transport/http'
10
+ require_relative '../transport/http'
11
11
 
12
12
  module Datadog
13
13
  module Tracing
@@ -24,7 +24,7 @@ module Datadog
24
24
  transport_options[:agent_settings] = options[:agent_settings] if options.key?(:agent_settings)
25
25
 
26
26
  @transport = options.fetch(:transport) do
27
- Transport::HTTP.default(**transport_options)
27
+ Datadog::Tracing::Transport::HTTP.default(**transport_options)
28
28
  end
29
29
  end
30
30
  # rubocop:enable Lint/MissingSuper
@@ -104,6 +104,8 @@ module Datadog
104
104
  # Workers::Queue settings
105
105
  @buffer_size = options.fetch(:buffer_size, DEFAULT_BUFFER_MAX_SIZE)
106
106
  self.buffer = TraceBuffer.new(@buffer_size)
107
+
108
+ @shutdown_timeout = options.fetch(:shutdown_timeout, Core::Workers::Polling::DEFAULT_SHUTDOWN_TIMEOUT)
107
109
  end
108
110
 
109
111
  # NOTE: #perform is wrapped by other modules:
@@ -119,7 +121,7 @@ module Datadog
119
121
  nil
120
122
  end
121
123
 
122
- def stop(*args)
124
+ def stop(force_stop = false, timeout = @shutdown_timeout)
123
125
  buffer.close if running?
124
126
  super
125
127
  end
@@ -14,7 +14,7 @@ module Datadog
14
14
  DEFAULT_TIMEOUT = 5
15
15
  BACK_OFF_RATIO = 1.2
16
16
  BACK_OFF_MAX = 5
17
- SHUTDOWN_TIMEOUT = 1
17
+ DEFAULT_SHUTDOWN_TIMEOUT = 1
18
18
 
19
19
  attr_reader \
20
20
  :trace_buffer
@@ -36,6 +36,7 @@ module Datadog
36
36
 
37
37
  # Threading
38
38
  @shutdown = ConditionVariable.new
39
+ @shutdown_timeout = options.fetch(:shutdown_timeout, DEFAULT_SHUTDOWN_TIMEOUT)
39
40
  @mutex = Mutex.new
40
41
  @worker = nil
41
42
  @run = false
@@ -89,7 +90,7 @@ module Datadog
89
90
 
90
91
  # Block until executor shutdown is complete or until timeout seconds have passed.
91
92
  def join
92
- @worker.join(SHUTDOWN_TIMEOUT)
93
+ @worker.join(@shutdown_timeout)
93
94
  end
94
95
 
95
96
  # Enqueue an item in the trace internal buffer. This operation is thread-safe
@@ -2,7 +2,7 @@ require_relative 'event'
2
2
  require_relative 'runtime/metrics'
3
3
  require_relative 'workers'
4
4
 
5
- require_relative '../../ddtrace/transport/http'
5
+ require_relative 'transport/http'
6
6
 
7
7
  module Datadog
8
8
  module Tracing
@@ -28,6 +28,8 @@ module Datadog
28
28
  Transport::HTTP.default(**transport_options)
29
29
  end
30
30
 
31
+ @shutdown_timeout = options.fetch(:shutdown_timeout, Workers::AsyncTransport::DEFAULT_SHUTDOWN_TIMEOUT)
32
+
31
33
  # handles the thread creation after an eventual fork
32
34
  @mutex_after_fork = Mutex.new
33
35
  @pid = nil
@@ -72,7 +74,8 @@ module Datadog
72
74
  transport: @transport,
73
75
  buffer_size: @buff_size,
74
76
  on_trace: @trace_handler,
75
- interval: @flush_interval
77
+ interval: @flush_interval,
78
+ shutdown_timeout: @shutdown_timeout
76
79
  )
77
80
 
78
81
  @worker.start
@@ -1,44 +1,46 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative '../../datadog/core/transport/ext'
4
+ # DEV(2.0): This file should be replaced by /datadog/core/transport/ext.rb.
3
5
  module Datadog
4
6
  module Transport
5
7
  # @public_api
6
8
  module Ext
7
9
  # @public_api
8
10
  module HTTP
9
- ADAPTER = :net_http # DEV: Rename to simply `:http`, as Net::HTTP is an implementation detail.
10
- DEFAULT_HOST = '127.0.0.1'
11
- DEFAULT_PORT = 8126
11
+ ADAPTER = Datadog::Core::Transport::Ext::HTTP::ADAPTER
12
+ DEFAULT_HOST = Datadog::Core::Transport::Ext::HTTP::DEFAULT_HOST
13
+ DEFAULT_PORT = Datadog::Core::Transport::Ext::HTTP::DEFAULT_PORT
12
14
 
13
- HEADER_CONTAINER_ID = 'Datadog-Container-ID'
14
- HEADER_DD_API_KEY = 'DD-API-KEY'
15
+ HEADER_CONTAINER_ID = Datadog::Core::Transport::Ext::HTTP::HEADER_CONTAINER_ID
16
+ HEADER_DD_API_KEY = Datadog::Core::Transport::Ext::HTTP::HEADER_DD_API_KEY
15
17
  # Tells agent that `_dd.top_level` metrics have been set by the tracer.
16
18
  # The agent will not calculate top-level spans but instead trust the tracer tagging.
17
19
  #
18
20
  # This prevents partially flushed traces being mistakenly marked as top-level.
19
21
  #
20
22
  # Setting this header to any non-empty value enables this feature.
21
- HEADER_CLIENT_COMPUTED_TOP_LEVEL = 'Datadog-Client-Computed-Top-Level'
22
- HEADER_META_LANG = 'Datadog-Meta-Lang'
23
- HEADER_META_LANG_VERSION = 'Datadog-Meta-Lang-Version'
24
- HEADER_META_LANG_INTERPRETER = 'Datadog-Meta-Lang-Interpreter'
25
- HEADER_META_TRACER_VERSION = 'Datadog-Meta-Tracer-Version'
23
+ HEADER_CLIENT_COMPUTED_TOP_LEVEL = Datadog::Core::Transport::Ext::HTTP::HEADER_CLIENT_COMPUTED_TOP_LEVEL
24
+ HEADER_META_LANG = Datadog::Core::Transport::Ext::HTTP::HEADER_META_LANG
25
+ HEADER_META_LANG_VERSION = Datadog::Core::Transport::Ext::HTTP::HEADER_META_LANG_VERSION
26
+ HEADER_META_LANG_INTERPRETER = Datadog::Core::Transport::Ext::HTTP::HEADER_META_LANG_INTERPRETER
27
+ HEADER_META_TRACER_VERSION = Datadog::Core::Transport::Ext::HTTP::HEADER_META_TRACER_VERSION
26
28
 
27
29
  # Header that prevents the Net::HTTP integration from tracing internal trace requests.
28
30
  # Set it to any value to skip tracing.
29
- HEADER_DD_INTERNAL_UNTRACED_REQUEST = 'DD-Internal-Untraced-Request'
31
+ HEADER_DD_INTERNAL_UNTRACED_REQUEST = Datadog::Core::Transport::Ext::HTTP::HEADER_DD_INTERNAL_UNTRACED_REQUEST
30
32
  end
31
33
 
32
34
  # @public_api
33
35
  module Test
34
- ADAPTER = :test
36
+ ADAPTER = Datadog::Core::Transport::Ext::Test::ADAPTER
35
37
  end
36
38
 
37
39
  # @public_api
38
40
  module UnixSocket
39
- ADAPTER = :unix
40
- DEFAULT_PATH = '/var/run/datadog/apm.socket'
41
- DEFAULT_TIMEOUT_SECONDS = 1
41
+ ADAPTER = Datadog::Core::Transport::Ext::UnixSocket::ADAPTER
42
+ DEFAULT_PATH = Datadog::Core::Transport::Ext::UnixSocket::DEFAULT_PATH
43
+ DEFAULT_TIMEOUT_SECONDS = Datadog::Core::Transport::Ext::UnixSocket::DEFAULT_TIMEOUT_SECONDS
42
44
  end
43
45
  end
44
46
  end
@@ -3,7 +3,7 @@
3
3
  module DDTrace
4
4
  module VERSION
5
5
  MAJOR = 1
6
- MINOR = 14
6
+ MINOR = 16
7
7
  PATCH = 0
8
8
  PRE = nil
9
9
  BUILD = nil
data/lib/ddtrace.rb CHANGED
@@ -7,5 +7,5 @@ require_relative 'datadog/tracing/contrib'
7
7
  # Load other products (must follow tracing)
8
8
  require_relative 'datadog/profiling'
9
9
  require_relative 'datadog/appsec'
10
- require_relative 'datadog/ci'
10
+ require 'datadog/ci'
11
11
  require_relative 'datadog/kit'