ddtrace 0.34.1 → 0.36.0
Sign up to get free protection for your applications and to get access to all the features.
- 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)
|