ddtrace 0.34.1 → 0.36.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.
- checksums.yaml +5 -5
- data/.circleci/config.yml +58 -9
- data/.circleci/images/primary/Dockerfile-jruby-9.2 +77 -0
- data/.rubocop.yml +4 -0
- data/Appraisals +9 -7
- data/CHANGELOG.md +89 -3
- data/Rakefile +11 -2
- data/ddtrace.gemspec +5 -3
- data/docker-compose.yml +35 -0
- data/docs/DevelopmentGuide.md +1 -1
- data/docs/GettingStarted.md +89 -36
- data/lib/ddtrace.rb +1 -1
- data/lib/ddtrace/buffer.rb +9 -9
- data/lib/ddtrace/chunker.rb +34 -0
- data/lib/ddtrace/configuration.rb +28 -5
- data/lib/ddtrace/configuration/base.rb +1 -1
- data/lib/ddtrace/configuration/components.rb +154 -0
- data/lib/ddtrace/configuration/options.rb +1 -1
- data/lib/ddtrace/configuration/settings.rb +131 -63
- data/lib/ddtrace/context.rb +6 -6
- data/lib/ddtrace/context_flush.rb +1 -1
- data/lib/ddtrace/contrib/action_cable/instrumentation.rb +1 -1
- data/lib/ddtrace/contrib/action_pack/action_controller/instrumentation.rb +2 -2
- data/lib/ddtrace/contrib/action_view/events/render_partial.rb +1 -1
- data/lib/ddtrace/contrib/action_view/events/render_template.rb +1 -1
- data/lib/ddtrace/contrib/action_view/instrumentation/partial_renderer.rb +1 -1
- data/lib/ddtrace/contrib/action_view/instrumentation/template_renderer.rb +2 -2
- data/lib/ddtrace/contrib/action_view/patcher.rb +1 -1
- data/lib/ddtrace/contrib/active_record/events/instantiation.rb +1 -1
- data/lib/ddtrace/contrib/active_record/events/sql.rb +1 -1
- data/lib/ddtrace/contrib/active_support/cache/instrumentation.rb +2 -2
- data/lib/ddtrace/contrib/active_support/notifications/subscription.rb +2 -2
- data/lib/ddtrace/contrib/analytics.rb +1 -1
- data/lib/ddtrace/contrib/configuration/settings.rb +1 -1
- data/lib/ddtrace/contrib/dalli/patcher.rb +1 -1
- data/lib/ddtrace/contrib/dalli/quantize.rb +1 -1
- data/lib/ddtrace/contrib/elasticsearch/patcher.rb +1 -1
- data/lib/ddtrace/contrib/excon/middleware.rb +2 -2
- data/lib/ddtrace/contrib/extensions.rb +29 -5
- data/lib/ddtrace/contrib/faraday/patcher.rb +1 -1
- data/lib/ddtrace/contrib/grape/endpoint.rb +5 -5
- data/lib/ddtrace/contrib/grape/patcher.rb +1 -1
- data/lib/ddtrace/contrib/grpc/datadog_interceptor/client.rb +1 -1
- data/lib/ddtrace/contrib/grpc/datadog_interceptor/server.rb +2 -2
- data/lib/ddtrace/contrib/grpc/patcher.rb +1 -1
- data/lib/ddtrace/contrib/http/circuit_breaker.rb +8 -32
- data/lib/ddtrace/contrib/http/instrumentation.rb +2 -2
- data/lib/ddtrace/contrib/mongodb/subscribers.rb +2 -2
- data/lib/ddtrace/contrib/patchable.rb +1 -1
- data/lib/ddtrace/contrib/patcher.rb +3 -3
- data/lib/ddtrace/contrib/presto/instrumentation.rb +3 -3
- data/lib/ddtrace/contrib/presto/patcher.rb +1 -1
- data/lib/ddtrace/contrib/rack/middlewares.rb +2 -2
- data/lib/ddtrace/contrib/rack/patcher.rb +2 -2
- data/lib/ddtrace/contrib/rack/request_queue.rb +1 -1
- data/lib/ddtrace/contrib/rails/configuration/settings.rb +14 -0
- data/lib/ddtrace/contrib/rails/framework.rb +54 -48
- data/lib/ddtrace/contrib/rails/integration.rb +1 -1
- data/lib/ddtrace/contrib/rake/instrumentation.rb +2 -2
- data/lib/ddtrace/contrib/redis/quantize.rb +1 -1
- data/lib/ddtrace/contrib/resque/resque_job.rb +2 -2
- data/lib/ddtrace/contrib/sidekiq/tracing.rb +1 -1
- data/lib/ddtrace/contrib/sinatra/env.rb +20 -0
- data/lib/ddtrace/contrib/sinatra/ext.rb +6 -0
- data/lib/ddtrace/contrib/sinatra/patcher.rb +1 -0
- data/lib/ddtrace/contrib/sinatra/tracer.rb +98 -35
- data/lib/ddtrace/contrib/sinatra/tracer_middleware.rb +16 -13
- data/lib/ddtrace/correlation.rb +9 -6
- data/lib/ddtrace/diagnostics/health.rb +2 -6
- data/lib/ddtrace/encoding.rb +13 -39
- data/lib/ddtrace/event.rb +1 -1
- data/lib/ddtrace/ext/correlation.rb +1 -0
- data/lib/ddtrace/ext/diagnostics.rb +2 -0
- data/lib/ddtrace/ext/environment.rb +1 -0
- data/lib/ddtrace/ext/forced_tracing.rb +1 -1
- data/lib/ddtrace/logger.rb +3 -44
- data/lib/ddtrace/metrics.rb +5 -5
- data/lib/ddtrace/monkey.rb +1 -1
- data/lib/ddtrace/opentracer/global_tracer.rb +1 -1
- data/lib/ddtrace/pin.rb +18 -17
- data/lib/ddtrace/pipeline.rb +1 -1
- data/lib/ddtrace/propagation/http_propagator.rb +2 -2
- data/lib/ddtrace/runtime/cgroup.rb +1 -1
- data/lib/ddtrace/runtime/container.rb +1 -1
- data/lib/ddtrace/runtime/metrics.rb +5 -2
- data/lib/ddtrace/sampler.rb +2 -2
- data/lib/ddtrace/sampling/rule.rb +1 -1
- data/lib/ddtrace/sampling/rule_sampler.rb +1 -1
- data/lib/ddtrace/span.rb +4 -4
- data/lib/ddtrace/sync_writer.rb +3 -8
- data/lib/ddtrace/tracer.rb +26 -31
- data/lib/ddtrace/transport/http.rb +1 -1
- data/lib/ddtrace/transport/http/api/instance.rb +4 -0
- data/lib/ddtrace/transport/http/builder.rb +3 -5
- data/lib/ddtrace/transport/http/client.rb +7 -64
- data/lib/ddtrace/transport/http/response.rb +1 -1
- data/lib/ddtrace/transport/http/statistics.rb +1 -1
- data/lib/ddtrace/transport/http/traces.rb +10 -7
- data/lib/ddtrace/transport/io.rb +1 -1
- data/lib/ddtrace/transport/io/client.rb +2 -2
- data/lib/ddtrace/transport/io/response.rb +3 -1
- data/lib/ddtrace/transport/io/traces.rb +50 -3
- data/lib/ddtrace/transport/parcel.rb +0 -4
- data/lib/ddtrace/transport/statistics.rb +2 -2
- data/lib/ddtrace/transport/traces.rb +160 -10
- data/lib/ddtrace/utils.rb +1 -1
- data/lib/ddtrace/version.rb +2 -2
- data/lib/ddtrace/workers.rb +5 -13
- data/lib/ddtrace/workers/async.rb +2 -2
- data/lib/ddtrace/workers/runtime_metrics.rb +47 -0
- data/lib/ddtrace/workers/trace_writer.rb +199 -0
- data/lib/ddtrace/writer.rb +20 -27
- metadata +22 -32
|
@@ -14,8 +14,9 @@ module Datadog
|
|
|
14
14
|
super
|
|
15
15
|
|
|
16
16
|
# Initialize service list
|
|
17
|
-
@services = Set.new
|
|
17
|
+
@services = Set.new(options.fetch(:services, []))
|
|
18
18
|
@service_tags = nil
|
|
19
|
+
compile_service_tags!
|
|
19
20
|
end
|
|
20
21
|
|
|
21
22
|
def associate_with_span(span)
|
|
@@ -55,6 +56,8 @@ module Datadog
|
|
|
55
56
|
def gc_metrics
|
|
56
57
|
Hash[
|
|
57
58
|
GC.stat.map do |k, v|
|
|
59
|
+
next if v.is_a?(Hash) # TODO: JRuby supports additional nested metrics
|
|
60
|
+
|
|
58
61
|
["#{Ext::Runtime::Metrics::METRIC_GC_PREFIX}.#{k}", v]
|
|
59
62
|
end
|
|
60
63
|
]
|
|
@@ -63,7 +66,7 @@ module Datadog
|
|
|
63
66
|
def try_flush
|
|
64
67
|
yield
|
|
65
68
|
rescue StandardError => e
|
|
66
|
-
Datadog
|
|
69
|
+
Datadog.logger.error("Error while sending runtime metric. Cause: #{e.message}")
|
|
67
70
|
end
|
|
68
71
|
|
|
69
72
|
def default_metric_options
|
data/lib/ddtrace/sampler.rb
CHANGED
|
@@ -48,7 +48,7 @@ module Datadog
|
|
|
48
48
|
# sampled.
|
|
49
49
|
def initialize(sample_rate = 1.0)
|
|
50
50
|
unless sample_rate > 0.0 && sample_rate <= 1.0
|
|
51
|
-
Datadog
|
|
51
|
+
Datadog.logger.error('sample rate is not between 0 and 1, disabling the sampler')
|
|
52
52
|
sample_rate = 1.0
|
|
53
53
|
end
|
|
54
54
|
|
|
@@ -176,7 +176,7 @@ module Datadog
|
|
|
176
176
|
update_all(rate_by_service)
|
|
177
177
|
|
|
178
178
|
# Emit metric for service cache size
|
|
179
|
-
|
|
179
|
+
Datadog.health_metrics.sampling_service_cache_length(length)
|
|
180
180
|
end
|
|
181
181
|
|
|
182
182
|
private
|
|
@@ -28,7 +28,7 @@ module Datadog
|
|
|
28
28
|
def match?(span)
|
|
29
29
|
@matcher.match?(span)
|
|
30
30
|
rescue => e
|
|
31
|
-
Datadog
|
|
31
|
+
Datadog.logger.error("Matcher failed. Cause: #{e.message} Source: #{e.backtrace.first}")
|
|
32
32
|
nil
|
|
33
33
|
end
|
|
34
34
|
|
|
@@ -109,7 +109,7 @@ module Datadog
|
|
|
109
109
|
set_limiter_metrics(span, rate_limiter.effective_rate)
|
|
110
110
|
end
|
|
111
111
|
rescue StandardError => e
|
|
112
|
-
Datadog
|
|
112
|
+
Datadog.logger.error("Rule sampling failed. Cause: #{e.message} Source: #{e.backtrace.first}")
|
|
113
113
|
yield(span)
|
|
114
114
|
end
|
|
115
115
|
|
data/lib/ddtrace/span.rb
CHANGED
|
@@ -104,7 +104,7 @@ module Datadog
|
|
|
104
104
|
@meta[key] = value.to_s
|
|
105
105
|
end
|
|
106
106
|
rescue StandardError => e
|
|
107
|
-
Datadog
|
|
107
|
+
Datadog.logger.debug("Unable to set the tag #{key}, ignoring it. Caused by: #{e}")
|
|
108
108
|
end
|
|
109
109
|
|
|
110
110
|
# This method removes a tag for the given key.
|
|
@@ -127,7 +127,7 @@ module Datadog
|
|
|
127
127
|
value = Float(value)
|
|
128
128
|
@metrics[key] = value
|
|
129
129
|
rescue StandardError => e
|
|
130
|
-
Datadog
|
|
130
|
+
Datadog.logger.debug("Unable to set the metric #{key}, ignoring it. Caused by: #{e}")
|
|
131
131
|
end
|
|
132
132
|
|
|
133
133
|
# This method removes a metric for the given key. It acts like {#remove_tag}.
|
|
@@ -179,8 +179,8 @@ module Datadog
|
|
|
179
179
|
@context.close_span(self)
|
|
180
180
|
@tracer.record(self)
|
|
181
181
|
rescue StandardError => e
|
|
182
|
-
Datadog
|
|
183
|
-
|
|
182
|
+
Datadog.logger.debug("error recording finished trace: #{e}")
|
|
183
|
+
Datadog.health_metrics.error_span_finish(1, tags: ["error:#{e.class.name}"])
|
|
184
184
|
end
|
|
185
185
|
self
|
|
186
186
|
end
|
data/lib/ddtrace/sync_writer.rb
CHANGED
|
@@ -4,10 +4,10 @@ require 'ddtrace/runtime/metrics'
|
|
|
4
4
|
|
|
5
5
|
module Datadog
|
|
6
6
|
# SyncWriter flushes both services and traces synchronously
|
|
7
|
+
# DEV: To be replaced by Datadog::Workers::TraceWriter.
|
|
7
8
|
class SyncWriter
|
|
8
9
|
attr_reader \
|
|
9
10
|
:priority_sampler,
|
|
10
|
-
:runtime_metrics,
|
|
11
11
|
:transport
|
|
12
12
|
|
|
13
13
|
def initialize(options = {})
|
|
@@ -16,18 +16,13 @@ module Datadog
|
|
|
16
16
|
Transport::HTTP.default(transport_options)
|
|
17
17
|
end
|
|
18
18
|
|
|
19
|
-
# Runtime metrics
|
|
20
|
-
@runtime_metrics = options.fetch(:runtime_metrics) do
|
|
21
|
-
Runtime::Metrics.new
|
|
22
|
-
end
|
|
23
|
-
|
|
24
19
|
@priority_sampler = options.fetch(:priority_sampler, nil)
|
|
25
20
|
end
|
|
26
21
|
|
|
27
22
|
def write(trace, services = nil)
|
|
28
23
|
unless services.nil?
|
|
29
24
|
Datadog::Patcher.do_once('SyncWriter#write') do
|
|
30
|
-
Datadog
|
|
25
|
+
Datadog.logger.warn(%(
|
|
31
26
|
write: Writing services has been deprecated and no longer need to be provided.
|
|
32
27
|
write(traces, services) can be updted to write(traces)
|
|
33
28
|
))
|
|
@@ -38,7 +33,7 @@ module Datadog
|
|
|
38
33
|
proc { flush_trace(trace) }
|
|
39
34
|
)
|
|
40
35
|
rescue => e
|
|
41
|
-
|
|
36
|
+
Datadog.logger.debug(e)
|
|
42
37
|
end
|
|
43
38
|
|
|
44
39
|
# Added for interface completeness
|
data/lib/ddtrace/tracer.rb
CHANGED
|
@@ -30,7 +30,7 @@ module Datadog
|
|
|
30
30
|
def services
|
|
31
31
|
# Only log each deprecation warning once (safeguard against log spam)
|
|
32
32
|
Datadog::Patcher.do_once('Tracer#set_service_info') do
|
|
33
|
-
Datadog
|
|
33
|
+
Datadog.logger.warn('services: Usage of Tracer.services has been deprecated')
|
|
34
34
|
end
|
|
35
35
|
|
|
36
36
|
{}
|
|
@@ -70,22 +70,23 @@ module Datadog
|
|
|
70
70
|
# * +enabled+: set if the tracer submits or not spans to the local agent. It's enabled
|
|
71
71
|
# by default.
|
|
72
72
|
def initialize(options = {})
|
|
73
|
-
|
|
74
|
-
@writer = options.fetch(:writer, Datadog::Writer.new)
|
|
75
|
-
@sampler = options.fetch(:sampler, Datadog::AllSampler.new)
|
|
76
|
-
|
|
77
|
-
@provider = options.fetch(:context_provider, Datadog::DefaultContextProvider.new)
|
|
78
|
-
@provider ||= Datadog::DefaultContextProvider.new # @provider should never be nil
|
|
79
|
-
|
|
73
|
+
# Configurable options
|
|
80
74
|
@context_flush = if options[:partial_flush]
|
|
81
75
|
Datadog::ContextFlush::Partial.new(options)
|
|
82
76
|
else
|
|
83
77
|
Datadog::ContextFlush::Finished.new
|
|
84
78
|
end
|
|
85
79
|
|
|
80
|
+
@default_service = options[:default_service]
|
|
81
|
+
@enabled = options.fetch(:enabled, true)
|
|
82
|
+
@provider = options.fetch(:context_provider, Datadog::DefaultContextProvider.new)
|
|
83
|
+
@sampler = options.fetch(:sampler, Datadog::AllSampler.new)
|
|
84
|
+
@tags = options.fetch(:tags, {})
|
|
85
|
+
@writer = options.fetch(:writer, Datadog::Writer.new)
|
|
86
|
+
|
|
87
|
+
# Instance variables
|
|
86
88
|
@mutex = Mutex.new
|
|
87
|
-
@
|
|
88
|
-
@default_service = options.fetch(:default_service, Datadog.configuration.service)
|
|
89
|
+
@provider ||= Datadog::DefaultContextProvider.new # @provider should never be nil
|
|
89
90
|
|
|
90
91
|
# Enable priority sampling by default
|
|
91
92
|
activate_priority_sampling!(@sampler)
|
|
@@ -114,11 +115,13 @@ module Datadog
|
|
|
114
115
|
|
|
115
116
|
configure_writer(options)
|
|
116
117
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
118
|
+
if options.key?(:partial_flush)
|
|
119
|
+
@context_flush = if options[:partial_flush]
|
|
120
|
+
Datadog::ContextFlush::Partial.new(options)
|
|
121
|
+
else
|
|
122
|
+
Datadog::ContextFlush::Finished.new
|
|
123
|
+
end
|
|
124
|
+
end
|
|
122
125
|
end
|
|
123
126
|
|
|
124
127
|
# Set the information about the given service. A valid example is:
|
|
@@ -129,7 +132,7 @@ module Datadog
|
|
|
129
132
|
def set_service_info(service, app, app_type)
|
|
130
133
|
# Only log each deprecation warning once (safeguard against log spam)
|
|
131
134
|
Datadog::Patcher.do_once('Tracer#set_service_info') do
|
|
132
|
-
Datadog
|
|
135
|
+
Datadog.logger.warn(%(
|
|
133
136
|
set_service_info: Usage of set_service_info has been deprecated,
|
|
134
137
|
service information no longer needs to be reported to the trace agent.
|
|
135
138
|
))
|
|
@@ -144,7 +147,7 @@ module Datadog
|
|
|
144
147
|
begin
|
|
145
148
|
@default_service = File.basename($PROGRAM_NAME, '.*')
|
|
146
149
|
rescue StandardError => e
|
|
147
|
-
Datadog
|
|
150
|
+
Datadog.logger.error("unable to guess default service: #{e}")
|
|
148
151
|
@default_service = 'ruby'.freeze
|
|
149
152
|
end
|
|
150
153
|
@default_service
|
|
@@ -268,7 +271,7 @@ module Datadog
|
|
|
268
271
|
span = start_span(name, options)
|
|
269
272
|
# rubocop:disable Lint/UselessAssignment
|
|
270
273
|
rescue StandardError => e
|
|
271
|
-
Datadog
|
|
274
|
+
Datadog.logger.debug('Failed to start span: #{e}')
|
|
272
275
|
ensure
|
|
273
276
|
return_value = yield(span)
|
|
274
277
|
end
|
|
@@ -334,11 +337,11 @@ module Datadog
|
|
|
334
337
|
def write(trace)
|
|
335
338
|
return if @writer.nil? || !@enabled
|
|
336
339
|
|
|
337
|
-
if Datadog
|
|
338
|
-
Datadog
|
|
340
|
+
if Datadog.configuration.diagnostics.debug
|
|
341
|
+
Datadog.logger.debug("Writing #{trace.length} spans (enabled: #{@enabled})")
|
|
339
342
|
str = String.new('')
|
|
340
343
|
PP.pp(trace, str)
|
|
341
|
-
Datadog
|
|
344
|
+
Datadog.logger.debug(str)
|
|
342
345
|
end
|
|
343
346
|
|
|
344
347
|
@writer.write(trace)
|
|
@@ -355,10 +358,10 @@ module Datadog
|
|
|
355
358
|
sampler = options.fetch(:sampler, nil)
|
|
356
359
|
priority_sampling = options.fetch(:priority_sampling, nil)
|
|
357
360
|
writer = options.fetch(:writer, nil)
|
|
358
|
-
transport_options = options.fetch(:transport_options, {})
|
|
361
|
+
transport_options = options.fetch(:transport_options, {}).dup
|
|
359
362
|
|
|
360
363
|
# Compile writer options
|
|
361
|
-
writer_options = options.fetch(:writer_options, {})
|
|
364
|
+
writer_options = options.fetch(:writer_options, {}).dup
|
|
362
365
|
rebuild_writer = !writer_options.empty?
|
|
363
366
|
|
|
364
367
|
# Re-build the sampler and writer if priority sampling is enabled,
|
|
@@ -395,14 +398,6 @@ module Datadog
|
|
|
395
398
|
|
|
396
399
|
writer_options[:transport_options] = transport_options
|
|
397
400
|
|
|
398
|
-
# ensure any configuration to runtime_metrics statsd client is
|
|
399
|
-
# passed on when writer gets rebuilt
|
|
400
|
-
unless writer_options.key?(:runtime_metrics)
|
|
401
|
-
if @writer && !@writer.runtime_metrics.nil?
|
|
402
|
-
writer_options[:runtime_metrics] = @writer.runtime_metrics
|
|
403
|
-
end
|
|
404
|
-
end
|
|
405
|
-
|
|
406
401
|
if rebuild_writer || writer
|
|
407
402
|
# Make sure old writer is shut down before throwing away.
|
|
408
403
|
# Don't want additional threads running...
|
|
@@ -70,13 +70,11 @@ module Datadog
|
|
|
70
70
|
@default_api = key
|
|
71
71
|
end
|
|
72
72
|
|
|
73
|
-
def
|
|
73
|
+
def to_transport
|
|
74
74
|
raise NoDefaultApiError if @default_api.nil?
|
|
75
75
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
@default_api
|
|
79
|
-
)
|
|
76
|
+
# DEV: Should not be specific to traces
|
|
77
|
+
Transport::Traces::Transport.new(to_api_instances, @default_api)
|
|
80
78
|
end
|
|
81
79
|
|
|
82
80
|
def to_api_instances
|
|
@@ -8,42 +8,31 @@ module Datadog
|
|
|
8
8
|
class Client
|
|
9
9
|
include Transport::HTTP::Statistics
|
|
10
10
|
|
|
11
|
-
attr_reader
|
|
12
|
-
:apis,
|
|
13
|
-
:current_api_id
|
|
11
|
+
attr_reader :api
|
|
14
12
|
|
|
15
|
-
def initialize(
|
|
16
|
-
@
|
|
17
|
-
|
|
18
|
-
# Activate initial API
|
|
19
|
-
change_api!(current_api_id)
|
|
13
|
+
def initialize(api)
|
|
14
|
+
@api = api
|
|
20
15
|
end
|
|
21
16
|
|
|
22
17
|
def send_request(request, &block)
|
|
23
18
|
# Build request into env
|
|
24
19
|
env = build_env(request)
|
|
25
20
|
|
|
26
|
-
# Get
|
|
27
|
-
response = yield(
|
|
21
|
+
# Get responses from API
|
|
22
|
+
response = yield(api, env)
|
|
28
23
|
|
|
29
24
|
# Update statistics
|
|
30
25
|
update_stats_from_response!(response)
|
|
31
26
|
|
|
32
|
-
# If API should be downgraded, downgrade and try again.
|
|
33
|
-
if downgrade?(response)
|
|
34
|
-
downgrade!
|
|
35
|
-
response = send_request(request, &block)
|
|
36
|
-
end
|
|
37
|
-
|
|
38
27
|
response
|
|
39
28
|
rescue StandardError => e
|
|
40
29
|
message = "Internal error during HTTP transport request. Cause: #{e.message} Location: #{e.backtrace.first}"
|
|
41
30
|
|
|
42
31
|
# Log error
|
|
43
32
|
if stats.consecutive_errors > 0
|
|
44
|
-
Datadog
|
|
33
|
+
Datadog.logger.debug(message)
|
|
45
34
|
else
|
|
46
|
-
Datadog
|
|
35
|
+
Datadog.logger.error(message)
|
|
47
36
|
end
|
|
48
37
|
|
|
49
38
|
# Update statistics
|
|
@@ -55,52 +44,6 @@ module Datadog
|
|
|
55
44
|
def build_env(request)
|
|
56
45
|
Env.new(request)
|
|
57
46
|
end
|
|
58
|
-
|
|
59
|
-
def downgrade?(response)
|
|
60
|
-
return false unless apis.fallbacks.key?(current_api_id)
|
|
61
|
-
response.not_found? || response.unsupported?
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
def current_api
|
|
65
|
-
apis[current_api_id]
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
def change_api!(api_id)
|
|
69
|
-
raise UnknownApiVersionError, api_id unless apis.key?(api_id)
|
|
70
|
-
@current_api_id = api_id
|
|
71
|
-
end
|
|
72
|
-
|
|
73
|
-
def downgrade!
|
|
74
|
-
downgrade_api_id = apis.fallbacks[current_api_id]
|
|
75
|
-
raise NoDowngradeAvailableError, current_api_id if downgrade_api_id.nil?
|
|
76
|
-
change_api!(downgrade_api_id)
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
# Raised when configured with an unknown API version
|
|
80
|
-
class UnknownApiVersionError < StandardError
|
|
81
|
-
attr_reader :version
|
|
82
|
-
|
|
83
|
-
def initialize(version)
|
|
84
|
-
@version = version
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
def message
|
|
88
|
-
"No matching transport API for version #{version}!"
|
|
89
|
-
end
|
|
90
|
-
end
|
|
91
|
-
|
|
92
|
-
# Raised when configured with an unknown API version
|
|
93
|
-
class NoDowngradeAvailableError < StandardError
|
|
94
|
-
attr_reader :version
|
|
95
|
-
|
|
96
|
-
def initialize(version)
|
|
97
|
-
@version = version
|
|
98
|
-
end
|
|
99
|
-
|
|
100
|
-
def message
|
|
101
|
-
"No downgrade from transport API version #{version} is available!"
|
|
102
|
-
end
|
|
103
|
-
end
|
|
104
47
|
end
|
|
105
48
|
end
|
|
106
49
|
end
|
|
@@ -15,7 +15,7 @@ module Datadog
|
|
|
15
15
|
@http_response = http_response
|
|
16
16
|
end
|
|
17
17
|
|
|
18
|
-
def_delegators :@http_response, *Transport::Response.instance_methods
|
|
18
|
+
def_delegators :@http_response, *Datadog::Transport::Response.instance_methods
|
|
19
19
|
|
|
20
20
|
def code
|
|
21
21
|
@http_response.respond_to?(:code) ? @http_response.code : nil
|
|
@@ -12,19 +12,18 @@ module Datadog
|
|
|
12
12
|
# Response from HTTP transport for traces
|
|
13
13
|
class Response
|
|
14
14
|
include HTTP::Response
|
|
15
|
-
include Transport::Traces::Response
|
|
15
|
+
include Datadog::Transport::Traces::Response
|
|
16
16
|
|
|
17
17
|
def initialize(http_response, options = {})
|
|
18
18
|
super(http_response)
|
|
19
19
|
@service_rates = options.fetch(:service_rates, nil)
|
|
20
|
+
@trace_count = options.fetch(:trace_count, 0)
|
|
20
21
|
end
|
|
21
22
|
end
|
|
22
23
|
|
|
23
24
|
# Extensions for HTTP client
|
|
24
25
|
module Client
|
|
25
|
-
def
|
|
26
|
-
request = Transport::Traces::Request.new(traces)
|
|
27
|
-
|
|
26
|
+
def send_payload(request)
|
|
28
27
|
send_request(request) do |api, env|
|
|
29
28
|
api.send_traces(env)
|
|
30
29
|
end
|
|
@@ -45,6 +44,10 @@ module Datadog
|
|
|
45
44
|
traces.call(env, &block)
|
|
46
45
|
end
|
|
47
46
|
|
|
47
|
+
def encoder
|
|
48
|
+
traces.encoder
|
|
49
|
+
end
|
|
50
|
+
|
|
48
51
|
# Raised when traces sent but no traces endpoint is defined
|
|
49
52
|
class NoTraceEndpointDefinedError < StandardError
|
|
50
53
|
attr_reader :spec
|
|
@@ -104,17 +107,17 @@ module Datadog
|
|
|
104
107
|
|
|
105
108
|
def call(env, &block)
|
|
106
109
|
# Add trace count header
|
|
107
|
-
env.headers[HEADER_TRACE_COUNT] = env.request.parcel.
|
|
110
|
+
env.headers[HEADER_TRACE_COUNT] = env.request.parcel.trace_count.to_s
|
|
108
111
|
|
|
109
112
|
# Encode body & type
|
|
110
113
|
env.headers[HEADER_CONTENT_TYPE] = encoder.content_type
|
|
111
|
-
env.body = env.request.parcel.
|
|
114
|
+
env.body = env.request.parcel.data
|
|
112
115
|
|
|
113
116
|
# Query for response
|
|
114
117
|
http_response = super(env, &block)
|
|
115
118
|
|
|
116
119
|
# Process the response
|
|
117
|
-
response_options = {}.tap do |options|
|
|
120
|
+
response_options = { trace_count: env.request.parcel.trace_count }.tap do |options|
|
|
118
121
|
# Parse service rates, if configured to do so.
|
|
119
122
|
if service_rates? && !http_response.payload.to_s.empty?
|
|
120
123
|
body = JSON.parse(http_response.payload)
|