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
@@ -11,7 +11,7 @@ require_relative 'v1/dependency'
11
11
  require_relative 'v1/host'
12
12
  require_relative 'v1/integration'
13
13
  require_relative 'v1/product'
14
- require_relative '../../../ddtrace/transport/ext'
14
+ require_relative '../transport/ext'
15
15
 
16
16
  module Datadog
17
17
  module Core
@@ -146,6 +146,7 @@ module Datadog
146
146
  options['logger.instance'] = configuration.logger.instance.class.to_s
147
147
  options['appsec.enabled'] = configuration.dig('appsec', 'enabled') if configuration.respond_to?('appsec')
148
148
  options['tracing.opentelemetry.enabled'] = !defined?(Datadog::OpenTelemetry::LOADED).nil?
149
+ options['tracing.opentracing.enabled'] = !defined?(Datadog::OpenTracer::LOADED).nil?
149
150
  options.compact!
150
151
  options
151
152
  end
@@ -190,7 +191,7 @@ module Datadog
190
191
 
191
192
  def agent_transport
192
193
  adapter = Core::Configuration::AgentSettingsResolver.call(Datadog.configuration).adapter
193
- if adapter == Datadog::Transport::Ext::UnixSocket::ADAPTER
194
+ if adapter == Datadog::Core::Transport::Ext::UnixSocket::ADAPTER
194
195
  'UDS'
195
196
  else
196
197
  'TCP'
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative '../../configuration/settings'
4
+ require_relative '../../transport/ext'
4
5
  require_relative 'env'
5
6
  require_relative 'ext'
6
7
  require_relative 'adapters/net'
@@ -38,7 +39,7 @@ module Datadog
38
39
 
39
40
  def headers(request_type:, api_version: Http::Ext::API_VERSION)
40
41
  {
41
- Datadog::Transport::Ext::HTTP::HEADER_DD_INTERNAL_UNTRACED_REQUEST => '1',
42
+ Datadog::Core::Transport::Ext::HTTP::HEADER_DD_INTERNAL_UNTRACED_REQUEST => '1',
42
43
  Http::Ext::HEADER_CONTENT_TYPE => Http::Ext::CONTENT_TYPE_APPLICATION_JSON,
43
44
  Http::Ext::HEADER_DD_TELEMETRY_API_VERSION => api_version,
44
45
  Http::Ext::HEADER_DD_TELEMETRY_REQUEST_TYPE => request_type,
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../configuration/ext'
4
+ # DEV(2.0): This file should replace /ddtrace/transport/ext.rb
5
+ # WARN: This file is used in /dd trace/transport/ext.rb which is a public API. Any changes here
6
+ # should be treated as changes to a public API.
7
+ module Datadog
8
+ module Core
9
+ module Transport
10
+ module Ext
11
+ module HTTP
12
+ ADAPTER = Datadog::Core::Configuration::Ext::Agent::HTTP::ADAPTER
13
+ DEFAULT_HOST = Datadog::Core::Configuration::Ext::Agent::HTTP::DEFAULT_HOST
14
+ DEFAULT_PORT = Datadog::Core::Configuration::Ext::Agent::HTTP::DEFAULT_PORT
15
+
16
+ HEADER_CONTAINER_ID = 'Datadog-Container-ID'
17
+ HEADER_DD_API_KEY = 'DD-API-KEY'
18
+ # Tells agent that `_dd.top_level` metrics have been set by the tracer.
19
+ # The agent will not calculate top-level spans but instead trust the tracer tagging.
20
+ #
21
+ # This prevents partially flushed traces being mistakenly marked as top-level.
22
+ #
23
+ # Setting this header to any non-empty value enables this feature.
24
+ HEADER_CLIENT_COMPUTED_TOP_LEVEL = 'Datadog-Client-Computed-Top-Level'
25
+ HEADER_META_LANG = 'Datadog-Meta-Lang'
26
+ HEADER_META_LANG_VERSION = 'Datadog-Meta-Lang-Version'
27
+ HEADER_META_LANG_INTERPRETER = 'Datadog-Meta-Lang-Interpreter'
28
+ HEADER_META_TRACER_VERSION = 'Datadog-Meta-Tracer-Version'
29
+
30
+ # Header that prevents the Net::HTTP integration from tracing internal trace requests.
31
+ # Set it to any value to skip tracing.
32
+ HEADER_DD_INTERNAL_UNTRACED_REQUEST = 'DD-Internal-Untraced-Request'
33
+ end
34
+
35
+ module Test
36
+ ADAPTER = :test
37
+ end
38
+
39
+ module UnixSocket
40
+ ADAPTER = Datadog::Core::Configuration::Ext::Agent::UnixSocket::ADAPTER
41
+ DEFAULT_PATH = Datadog::Core::Configuration::Ext::Agent::UnixSocket::DEFAULT_PATH
42
+ DEFAULT_TIMEOUT_SECONDS = Datadog::Core::Configuration::Ext::Agent::UnixSocket::DEFAULT_TIMEOUT_SECONDS
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,168 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../../../core/transport/response'
4
+ require_relative '../../../../core/vendor/multipart-post/net/http/post/multipart'
5
+
6
+ module Datadog
7
+ module Core
8
+ module Transport
9
+ module HTTP
10
+ module Adapters
11
+ # Adapter for Net::HTTP
12
+ class Net
13
+ attr_reader \
14
+ :hostname,
15
+ :port,
16
+ :timeout,
17
+ :ssl
18
+
19
+ # in seconds
20
+ DEFAULT_TIMEOUT = 30
21
+
22
+ # @deprecated Positional parameters are deprecated. Use named parameters instead.
23
+ def initialize(hostname = nil, port = nil, **options)
24
+ @hostname = hostname || options.fetch(:hostname)
25
+ @port = port || options.fetch(:port)
26
+ @timeout = options[:timeout] || DEFAULT_TIMEOUT
27
+ @ssl = options.key?(:ssl) ? options[:ssl] == true : false
28
+ end
29
+
30
+ def self.build(agent_settings)
31
+ new(
32
+ hostname: agent_settings.hostname,
33
+ port: agent_settings.port,
34
+ timeout: agent_settings.timeout_seconds,
35
+ ssl: agent_settings.ssl
36
+ )
37
+ end
38
+
39
+ def open(&block)
40
+ # DEV Initializing +Net::HTTP+ directly help us avoid expensive
41
+ # options processing done in +Net::HTTP.start+:
42
+ # https://github.com/ruby/ruby/blob/b2d96abb42abbe2e01f010ffc9ac51f0f9a50002/lib/net/http.rb#L614-L618
43
+ req = ::Net::HTTP.new(hostname, port, nil)
44
+
45
+ req.use_ssl = ssl
46
+ req.open_timeout = req.read_timeout = timeout
47
+
48
+ req.start(&block)
49
+ end
50
+
51
+ def call(env)
52
+ if respond_to?(env.verb)
53
+ send(env.verb, env)
54
+ else
55
+ raise UnknownHTTPMethod, env
56
+ end
57
+ end
58
+
59
+ def get(env)
60
+ get = ::Net::HTTP::Get.new(env.path, env.headers)
61
+
62
+ # Connect and send the request
63
+ http_response = open do |http|
64
+ http.request(get)
65
+ end
66
+
67
+ # Build and return response
68
+ Response.new(http_response)
69
+ end
70
+
71
+ def post(env)
72
+ post = nil
73
+
74
+ if env.form.nil? || env.form.empty?
75
+ post = ::Net::HTTP::Post.new(env.path, env.headers)
76
+ post.body = env.body
77
+ else
78
+ post = ::Datadog::Core::Vendor::Net::HTTP::Post::Multipart.new(
79
+ env.path,
80
+ env.form,
81
+ env.headers
82
+ )
83
+ end
84
+
85
+ # Connect and send the request
86
+ http_response = open do |http|
87
+ http.request(post)
88
+ end
89
+
90
+ # Build and return response
91
+ Response.new(http_response)
92
+ end
93
+
94
+ def url
95
+ "http://#{hostname}:#{port}?timeout=#{timeout}"
96
+ end
97
+
98
+ # Raised when called with an unknown HTTP method
99
+ class UnknownHTTPMethod < StandardError
100
+ attr_reader :verb
101
+
102
+ def initialize(verb)
103
+ super("No matching Net::HTTP function for '#{verb}'!")
104
+ end
105
+ end
106
+
107
+ # A wrapped Net::HTTP response that implements the Transport::Response interface
108
+ class Response
109
+ include Datadog::Core::Transport::Response
110
+
111
+ attr_reader :http_response
112
+
113
+ def initialize(http_response)
114
+ @http_response = http_response
115
+ end
116
+
117
+ def payload
118
+ return super if http_response.nil?
119
+
120
+ http_response.body
121
+ end
122
+
123
+ def code
124
+ return super if http_response.nil?
125
+
126
+ http_response.code.to_i
127
+ end
128
+
129
+ def ok?
130
+ return super if http_response.nil?
131
+
132
+ code.between?(200, 299)
133
+ end
134
+
135
+ def unsupported?
136
+ return super if http_response.nil?
137
+
138
+ code == 415
139
+ end
140
+
141
+ def not_found?
142
+ return super if http_response.nil?
143
+
144
+ code == 404
145
+ end
146
+
147
+ def client_error?
148
+ return super if http_response.nil?
149
+
150
+ code.between?(400, 499)
151
+ end
152
+
153
+ def server_error?
154
+ return super if http_response.nil?
155
+
156
+ code.between?(500, 599)
157
+ end
158
+
159
+ def inspect
160
+ "#{super}, http_response:#{http_response}"
161
+ end
162
+ end
163
+ end
164
+ end
165
+ end
166
+ end
167
+ end
168
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Datadog
4
+ module Core
5
+ module Transport
6
+ module HTTP
7
+ module Adapters
8
+ # List of available adapters
9
+ class Registry
10
+ def initialize
11
+ @adapters = {}
12
+ end
13
+
14
+ def get(name)
15
+ @adapters[name]
16
+ end
17
+
18
+ def set(klass, name = nil)
19
+ name ||= klass.to_s
20
+ return if name.nil?
21
+
22
+ @adapters[name] = klass
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,89 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../../../core/transport/response'
4
+
5
+ module Datadog
6
+ module Core
7
+ module Transport
8
+ module HTTP
9
+ module Adapters
10
+ # Adapter for testing
11
+ class Test
12
+ attr_reader \
13
+ :buffer,
14
+ :status
15
+
16
+ # @param buffer [Array] an optional array that will capture all spans sent to this adapter, defaults to +nil+
17
+ # @deprecated Positional parameters are deprecated. Use named parameters instead.
18
+ def initialize(buffer = nil, **options)
19
+ @buffer = buffer || options[:buffer]
20
+ @mutex = Mutex.new
21
+ @status = 200
22
+ end
23
+
24
+ def call(env)
25
+ add_request(env)
26
+ Response.new(status)
27
+ end
28
+
29
+ def buffer?
30
+ !@buffer.nil?
31
+ end
32
+
33
+ def add_request(env)
34
+ @mutex.synchronize { buffer << env } if buffer?
35
+ end
36
+
37
+ def set_status!(status)
38
+ @status = status
39
+ end
40
+
41
+ def url; end
42
+
43
+ # Response for test adapter
44
+ class Response
45
+ include Datadog::Core::Transport::Response
46
+
47
+ attr_reader \
48
+ :body,
49
+ :code
50
+
51
+ def initialize(code, body = nil)
52
+ @code = code
53
+ @body = body
54
+ end
55
+
56
+ def payload
57
+ @body
58
+ end
59
+
60
+ def ok?
61
+ code.between?(200, 299)
62
+ end
63
+
64
+ def unsupported?
65
+ code == 415
66
+ end
67
+
68
+ def not_found?
69
+ code == 404
70
+ end
71
+
72
+ def client_error?
73
+ code.between?(400, 499)
74
+ end
75
+
76
+ def server_error?
77
+ code.between?(500, 599)
78
+ end
79
+
80
+ def inspect
81
+ "#{super}, code:#{code}"
82
+ end
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,83 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'net/http'
4
+ require_relative '../../../transport/ext'
5
+ require_relative 'net'
6
+
7
+ module Datadog
8
+ module Core
9
+ module Transport
10
+ module HTTP
11
+ module Adapters
12
+ # Adapter for Unix sockets
13
+ class UnixSocket < Adapters::Net
14
+ attr_reader \
15
+ :filepath, # DEV(1.0): Rename to `uds_path`
16
+ :timeout
17
+
18
+ alias_method :uds_path, :filepath
19
+
20
+ # @deprecated Positional parameters are deprecated. Use named parameters instead.
21
+ # rubocop:disable Lint/MissingSuper
22
+ def initialize(uds_path = nil, **options)
23
+ @filepath = uds_path || options.fetch(:uds_path)
24
+ @timeout = options[:timeout] || Datadog::Core::Transport::Ext::UnixSocket::DEFAULT_TIMEOUT_SECONDS
25
+ end
26
+ # rubocop:enable Lint/MissingSuper
27
+
28
+ def self.build(agent_settings)
29
+ new(
30
+ uds_path: agent_settings.uds_path,
31
+ timeout: agent_settings.timeout_seconds,
32
+ )
33
+ end
34
+
35
+ def open(&block)
36
+ # Open connection
37
+ connection = HTTP.new(
38
+ uds_path,
39
+ read_timeout: timeout,
40
+ continue_timeout: timeout
41
+ )
42
+
43
+ connection.start(&block)
44
+ end
45
+
46
+ def url
47
+ "http+unix://#{uds_path}?timeout=#{timeout}"
48
+ end
49
+
50
+ # Re-implements Net:HTTP with underlying Unix socket
51
+ class HTTP < ::Net::HTTP
52
+ DEFAULT_TIMEOUT = 1
53
+
54
+ attr_reader \
55
+ :filepath, # DEV(1.0): Rename to `uds_path`
56
+ :unix_socket
57
+
58
+ alias_method :uds_path, :filepath
59
+
60
+ def initialize(uds_path, options = {})
61
+ super('localhost', 80)
62
+ @filepath = uds_path
63
+ @read_timeout = options.fetch(:read_timeout, DEFAULT_TIMEOUT)
64
+ @continue_timeout = options.fetch(:continue_timeout, DEFAULT_TIMEOUT)
65
+ @debug_output = options[:debug_output] if options.key?(:debug_output)
66
+ end
67
+
68
+ def connect
69
+ @unix_socket = UNIXSocket.open(uds_path)
70
+ @socket = ::Net::BufferedIO.new(@unix_socket).tap do |socket|
71
+ socket.read_timeout = @read_timeout
72
+ socket.continue_timeout = @continue_timeout
73
+ socket.debug_output = @debug_output
74
+ end
75
+ on_connect
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'json'
4
+
5
+ module Datadog
6
+ module Core
7
+ module Transport
8
+ module HTTP
9
+ module API
10
+ # Endpoint
11
+ class Endpoint
12
+ attr_reader \
13
+ :verb,
14
+ :path
15
+
16
+ def initialize(verb, path)
17
+ @verb = verb
18
+ @path = path
19
+ end
20
+
21
+ def call(env)
22
+ env.verb = verb
23
+ env.path = path
24
+ yield(env)
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Datadog
4
+ module Core
5
+ module Transport
6
+ module HTTP
7
+ module API
8
+ # Extension for Map with adds fallback versions.
9
+ module Fallbacks
10
+ def fallbacks
11
+ @fallbacks ||= {}
12
+ end
13
+
14
+ def with_fallbacks(fallbacks)
15
+ tap { add_fallbacks!(fallbacks) }
16
+ end
17
+
18
+ def add_fallbacks!(fallbacks)
19
+ self.fallbacks.merge!(fallbacks)
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'fallbacks'
4
+
5
+ module Datadog
6
+ module Core
7
+ module Transport
8
+ module HTTP
9
+ module API
10
+ # A mapping of API version => API Routes/Instance
11
+ class Map < Hash
12
+ include Fallbacks
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Datadog
4
+ module Core
5
+ module Transport
6
+ module HTTP
7
+ # Data structure for an HTTP request
8
+ class Env < Hash
9
+ attr_reader \
10
+ :request
11
+
12
+ # rubocop:disable Lint/MissingSuper
13
+ def initialize(request, options = nil)
14
+ @request = request
15
+ merge!(options) unless options.nil?
16
+ end
17
+ # rubocop:enable Lint/MissingSuper
18
+
19
+ def verb
20
+ self[:verb]
21
+ end
22
+
23
+ def verb=(value)
24
+ self[:verb] = value
25
+ end
26
+
27
+ def path
28
+ self[:path]
29
+ end
30
+
31
+ def path=(value)
32
+ self[:path] = value
33
+ end
34
+
35
+ def body
36
+ self[:body]
37
+ end
38
+
39
+ def body=(value)
40
+ self[:body] = value
41
+ end
42
+
43
+ def headers
44
+ self[:headers] ||= {}
45
+ end
46
+
47
+ def headers=(value)
48
+ self[:headers] = value
49
+ end
50
+
51
+ def form
52
+ self[:form] ||= {}
53
+ end
54
+
55
+ def form=(value)
56
+ self[:form] = value
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../../core/transport/response'
4
+
5
+ module Datadog
6
+ module Core
7
+ module Transport
8
+ module HTTP
9
+ # Wraps an HTTP response from an adapter.
10
+ #
11
+ # Used by endpoints to wrap responses from adapters with
12
+ # fields or behavior that's specific to that endpoint.
13
+ module Response
14
+ def initialize(http_response)
15
+ @http_response = http_response
16
+ end
17
+
18
+ # (see Datadog::Core::Transport::Response#payload)
19
+ def payload
20
+ @http_response.payload
21
+ end
22
+
23
+ # (see Datadog::Core::Transport::Response#internal_error?)
24
+ def internal_error?
25
+ @http_response.internal_error?
26
+ end
27
+
28
+ # (see Datadog::Core::Transport::Response#unsupported?)
29
+ def unsupported?
30
+ @http_response.unsupported?
31
+ end
32
+
33
+ # (see Datadog::Core::Transport::Response#ok?)
34
+ def ok?
35
+ @http_response.ok?
36
+ end
37
+
38
+ # (see Datadog::Core::Transport::Response#not_found?)
39
+ def not_found?
40
+ @http_response.not_found?
41
+ end
42
+
43
+ # (see Datadog::Core::Transport::Response#client_error?)
44
+ def client_error?
45
+ @http_response.client_error?
46
+ end
47
+
48
+ # (see Datadog::Core::Transport::Response#server_error?)
49
+ def server_error?
50
+ @http_response.server_error?
51
+ end
52
+
53
+ def code
54
+ @http_response.respond_to?(:code) ? @http_response.code : nil
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Datadog
4
+ module Core
5
+ module Transport
6
+ # Data transfer object for generic data
7
+ # @abstract
8
+ module Parcel
9
+ attr_reader \
10
+ :data
11
+
12
+ def initialize(data)
13
+ @data = data
14
+ end
15
+
16
+ def encode_with(encoder)
17
+ raise NotImplementedError
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end