ddtrace 0.28.0 → 0.29.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 +4 -4
- data/.circleci/config.yml +8 -0
- data/Appraisals +57 -2
- data/CHANGELOG.md +41 -12
- data/Rakefile +3 -3
- data/ddtrace.gemspec +2 -1
- data/docs/DevelopmentGuide.md +1 -1
- data/docs/GettingStarted.md +6 -6
- data/lib/ddtrace.rb +7 -0
- data/lib/ddtrace/buffer.rb +60 -1
- data/lib/ddtrace/configuration/base.rb +82 -0
- data/lib/ddtrace/configuration/option.rb +28 -5
- data/lib/ddtrace/configuration/option_definition.rb +100 -0
- data/lib/ddtrace/configuration/options.rb +28 -14
- data/lib/ddtrace/configuration/settings.rb +77 -64
- data/lib/ddtrace/contrib/action_pack/configuration/settings.rb +9 -7
- data/lib/ddtrace/contrib/action_view/configuration/settings.rb +8 -6
- data/lib/ddtrace/contrib/active_model_serializers/configuration/settings.rb +8 -14
- data/lib/ddtrace/contrib/active_model_serializers/event.rb +1 -1
- data/lib/ddtrace/contrib/active_record/configuration/settings.rb +11 -16
- data/lib/ddtrace/contrib/active_record/event.rb +1 -1
- data/lib/ddtrace/contrib/active_support/configuration/settings.rb +8 -6
- data/lib/ddtrace/contrib/active_support/notifications/subscriber.rb +2 -2
- data/lib/ddtrace/contrib/active_support/notifications/subscription.rb +4 -1
- data/lib/ddtrace/contrib/aws/configuration/settings.rb +8 -6
- data/lib/ddtrace/contrib/configuration/settings.rb +5 -11
- data/lib/ddtrace/contrib/dalli/configuration/settings.rb +8 -6
- data/lib/ddtrace/contrib/dalli/instrumentation.rb +1 -18
- data/lib/ddtrace/contrib/delayed_job/configuration/settings.rb +8 -6
- data/lib/ddtrace/contrib/elasticsearch/configuration/settings.rb +8 -6
- data/lib/ddtrace/contrib/ethon/configuration/settings.rb +8 -6
- data/lib/ddtrace/contrib/ethon/integration.rb +0 -4
- data/lib/ddtrace/contrib/excon/configuration/settings.rb +9 -7
- data/lib/ddtrace/contrib/excon/middleware.rb +1 -1
- data/lib/ddtrace/contrib/faraday/configuration/settings.rb +8 -6
- data/lib/ddtrace/contrib/faraday/middleware.rb +1 -1
- data/lib/ddtrace/contrib/faraday/patcher.rb +8 -2
- data/lib/ddtrace/contrib/faraday/rack_builder.rb +18 -0
- data/lib/ddtrace/contrib/grape/configuration/settings.rb +8 -6
- data/lib/ddtrace/contrib/grape/instrumentation.rb +2 -42
- data/lib/ddtrace/contrib/graphql/configuration/settings.rb +8 -6
- data/lib/ddtrace/contrib/grpc/configuration/settings.rb +8 -6
- data/lib/ddtrace/contrib/grpc/integration.rb +1 -3
- data/lib/ddtrace/contrib/http/configuration/settings.rb +8 -6
- data/lib/ddtrace/contrib/http/instrumentation.rb +1 -23
- data/lib/ddtrace/contrib/mongodb/configuration/settings.rb +8 -6
- data/lib/ddtrace/contrib/mysql2/configuration/settings.rb +8 -6
- data/lib/ddtrace/contrib/mysql2/instrumentation.rb +1 -23
- data/lib/ddtrace/contrib/patchable.rb +1 -1
- data/lib/ddtrace/contrib/racecar/configuration/settings.rb +8 -14
- data/lib/ddtrace/contrib/racecar/event.rb +1 -1
- data/lib/ddtrace/contrib/rack/configuration/settings.rb +8 -6
- data/lib/ddtrace/contrib/rack/request_queue.rb +7 -6
- data/lib/ddtrace/contrib/rails/configuration/settings.rb +30 -21
- data/lib/ddtrace/contrib/rake/configuration/settings.rb +8 -6
- data/lib/ddtrace/contrib/rake/integration.rb +0 -4
- data/lib/ddtrace/contrib/redis/configuration/settings.rb +8 -6
- data/lib/ddtrace/contrib/resque/configuration/settings.rb +8 -6
- data/lib/ddtrace/contrib/rest_client/configuration/settings.rb +8 -6
- data/lib/ddtrace/contrib/rest_client/integration.rb +0 -4
- data/lib/ddtrace/contrib/rest_client/request_patch.rb +1 -18
- data/lib/ddtrace/contrib/sequel/configuration/settings.rb +8 -6
- data/lib/ddtrace/contrib/sequel/integration.rb +0 -4
- data/lib/ddtrace/contrib/shoryuken/configuration/settings.rb +8 -6
- data/lib/ddtrace/contrib/sidekiq/configuration/settings.rb +8 -6
- data/lib/ddtrace/contrib/sinatra/configuration/settings.rb +8 -6
- data/lib/ddtrace/contrib/sucker_punch/configuration/settings.rb +8 -6
- data/lib/ddtrace/diagnostics/health.rb +30 -0
- data/lib/ddtrace/distributed_tracing/headers/datadog.rb +1 -1
- data/lib/ddtrace/distributed_tracing/headers/headers.rb +2 -0
- data/lib/ddtrace/ext/diagnostics.rb +25 -0
- data/lib/ddtrace/ext/runtime.rb +1 -7
- data/lib/ddtrace/metrics.rb +89 -6
- data/lib/ddtrace/propagation/http_propagator.rb +2 -2
- data/lib/ddtrace/runtime/class_count.rb +3 -3
- data/lib/ddtrace/runtime/object_space.rb +19 -0
- data/lib/ddtrace/span.rb +1 -1
- data/lib/ddtrace/tracer.rb +5 -4
- data/lib/ddtrace/transport/http/client.rb +3 -4
- data/lib/ddtrace/transport/http/response.rb +4 -0
- data/lib/ddtrace/transport/http/statistics.rb +30 -0
- data/lib/ddtrace/transport/statistics.rb +28 -0
- data/lib/ddtrace/version.rb +3 -1
- data/lib/ddtrace/workers.rb +4 -2
- data/lib/ddtrace/writer.rb +3 -3
- metadata +74 -54
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
require 'ddtrace/ext/diagnostics'
|
|
2
|
+
require 'ddtrace/metrics'
|
|
3
|
+
|
|
4
|
+
module Datadog
|
|
5
|
+
module Diagnostics
|
|
6
|
+
# Health-related diagnostics
|
|
7
|
+
module Health
|
|
8
|
+
# Health metrics for diagnostics
|
|
9
|
+
class Metrics < ::Datadog::Metrics
|
|
10
|
+
count :api_errors, Ext::Diagnostics::Health::Metrics::METRIC_API_ERRORS
|
|
11
|
+
count :api_requests, Ext::Diagnostics::Health::Metrics::METRIC_API_REQUESTS
|
|
12
|
+
count :api_responses, Ext::Diagnostics::Health::Metrics::METRIC_API_RESPONSES
|
|
13
|
+
count :queue_accepted, Ext::Diagnostics::Health::Metrics::METRIC_QUEUE_ACCEPTED
|
|
14
|
+
count :queue_accepted_lengths, Ext::Diagnostics::Health::Metrics::METRIC_QUEUE_ACCEPTED_LENGTHS
|
|
15
|
+
count :queue_dropped, Ext::Diagnostics::Health::Metrics::METRIC_QUEUE_DROPPED
|
|
16
|
+
gauge :queue_length, Ext::Diagnostics::Health::Metrics::METRIC_QUEUE_LENGTH
|
|
17
|
+
gauge :queue_max_length, Ext::Diagnostics::Health::Metrics::METRIC_QUEUE_MAX_LENGTH
|
|
18
|
+
gauge :queue_spans, Ext::Diagnostics::Health::Metrics::METRIC_QUEUE_SPANS
|
|
19
|
+
count :traces_filtered, Ext::Diagnostics::Health::Metrics::METRIC_TRACES_FILTERED
|
|
20
|
+
count :writer_cpu_time, Ext::Diagnostics::Health::Metrics::METRIC_WRITER_CPU_TIME
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
module_function
|
|
24
|
+
|
|
25
|
+
def metrics
|
|
26
|
+
Datadog.configuration.diagnostics.health_metrics
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -28,7 +28,7 @@ module Datadog
|
|
|
28
28
|
# Return early if this propagation is not valid
|
|
29
29
|
# DEV: To be valid we need to have a trace id and a parent id or when it is a synthetics trace, just the trace id
|
|
30
30
|
# DEV: `DistributedHeaders#id` will not return 0
|
|
31
|
-
return unless (trace_id && parent_id) || (origin
|
|
31
|
+
return unless (trace_id && parent_id) || (origin && trace_id)
|
|
32
32
|
|
|
33
33
|
# Return new context
|
|
34
34
|
::Datadog::Context.new(trace_id: trace_id,
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
module Datadog
|
|
2
|
+
module Ext
|
|
3
|
+
module Diagnostics
|
|
4
|
+
# Health
|
|
5
|
+
module Health
|
|
6
|
+
# Metrics
|
|
7
|
+
module Metrics
|
|
8
|
+
ENV_ENABLED = 'DD_HEALTH_METRICS_ENABLED'.freeze
|
|
9
|
+
|
|
10
|
+
METRIC_API_ERRORS = 'datadog.tracer.api.errors'.freeze
|
|
11
|
+
METRIC_API_REQUESTS = 'datadog.tracer.api.requests'.freeze
|
|
12
|
+
METRIC_API_RESPONSES = 'datadog.tracer.api.responses'.freeze
|
|
13
|
+
METRIC_QUEUE_ACCEPTED = 'datadog.tracer.queue.accepted'.freeze
|
|
14
|
+
METRIC_QUEUE_ACCEPTED_LENGTHS = 'datadog.tracer.queue.accepted_lengths'.freeze
|
|
15
|
+
METRIC_QUEUE_DROPPED = 'datadog.tracer.queue.dropped'.freeze
|
|
16
|
+
METRIC_QUEUE_LENGTH = 'datadog.tracer.queue.length'.freeze
|
|
17
|
+
METRIC_QUEUE_MAX_LENGTH = 'datadog.tracer.queue.max_length'.freeze
|
|
18
|
+
METRIC_QUEUE_SPANS = 'datadog.tracer.queue.spans'.freeze
|
|
19
|
+
METRIC_TRACES_FILTERED = 'datadog.tracer.traces.filtered'.freeze
|
|
20
|
+
METRIC_WRITER_CPU_TIME = 'datadog.tracer.writer.cpu_time'.freeze
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
data/lib/ddtrace/ext/runtime.rb
CHANGED
|
@@ -5,13 +5,7 @@ module Datadog
|
|
|
5
5
|
module Runtime
|
|
6
6
|
# Identity
|
|
7
7
|
LANG = 'ruby'.freeze
|
|
8
|
-
LANG_INTERPRETER =
|
|
9
|
-
if Gem::Version.new(RUBY_VERSION) > Gem::Version.new('1.9')
|
|
10
|
-
(RUBY_ENGINE + '-' + RUBY_PLATFORM)
|
|
11
|
-
else
|
|
12
|
-
('ruby-' + RUBY_PLATFORM)
|
|
13
|
-
end
|
|
14
|
-
end.freeze
|
|
8
|
+
LANG_INTERPRETER = (RUBY_ENGINE + '-' + RUBY_PLATFORM).freeze
|
|
15
9
|
LANG_VERSION = RUBY_VERSION
|
|
16
10
|
TRACER_VERSION = Datadog::VERSION::STRING
|
|
17
11
|
|
data/lib/ddtrace/metrics.rb
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
require 'ddtrace/ext/metrics'
|
|
2
2
|
|
|
3
3
|
require 'set'
|
|
4
|
+
require 'logger'
|
|
4
5
|
require 'ddtrace/utils/time'
|
|
5
6
|
require 'ddtrace/runtime/identity'
|
|
6
7
|
|
|
@@ -54,8 +55,21 @@ module Datadog
|
|
|
54
55
|
enabled? && !statsd.nil?
|
|
55
56
|
end
|
|
56
57
|
|
|
57
|
-
def
|
|
58
|
+
def count(stat, value = nil, options = nil, &block)
|
|
59
|
+
return unless send_stats? && statsd.respond_to?(:count)
|
|
60
|
+
value, options = yield if block_given?
|
|
61
|
+
raise ArgumentError if value.nil?
|
|
62
|
+
|
|
63
|
+
statsd.count(stat, value, metric_options(options))
|
|
64
|
+
rescue StandardError => e
|
|
65
|
+
Datadog::Tracer.log.error("Failed to send count stat. Cause: #{e.message} Source: #{e.backtrace.first}")
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def distribution(stat, value = nil, options = nil, &block)
|
|
58
69
|
return unless send_stats? && statsd.respond_to?(:distribution)
|
|
70
|
+
value, options = yield if block_given?
|
|
71
|
+
raise ArgumentError if value.nil?
|
|
72
|
+
|
|
59
73
|
statsd.distribution(stat, value, metric_options(options))
|
|
60
74
|
rescue StandardError => e
|
|
61
75
|
Datadog::Tracer.log.error("Failed to send distribution stat. Cause: #{e.message} Source: #{e.backtrace.first}")
|
|
@@ -63,13 +77,18 @@ module Datadog
|
|
|
63
77
|
|
|
64
78
|
def increment(stat, options = nil)
|
|
65
79
|
return unless send_stats? && statsd.respond_to?(:increment)
|
|
80
|
+
options = yield if block_given?
|
|
81
|
+
|
|
66
82
|
statsd.increment(stat, metric_options(options))
|
|
67
83
|
rescue StandardError => e
|
|
68
84
|
Datadog::Tracer.log.error("Failed to send increment stat. Cause: #{e.message} Source: #{e.backtrace.first}")
|
|
69
85
|
end
|
|
70
86
|
|
|
71
|
-
def gauge(stat, value, options = nil)
|
|
87
|
+
def gauge(stat, value = nil, options = nil, &block)
|
|
72
88
|
return unless send_stats? && statsd.respond_to?(:gauge)
|
|
89
|
+
value, options = yield if block_given?
|
|
90
|
+
raise ArgumentError if value.nil?
|
|
91
|
+
|
|
73
92
|
statsd.gauge(stat, value, metric_options(options))
|
|
74
93
|
rescue StandardError => e
|
|
75
94
|
Datadog::Tracer.log.error("Failed to send gauge stat. Cause: #{e.message} Source: #{e.backtrace.first}")
|
|
@@ -92,14 +111,25 @@ module Datadog
|
|
|
92
111
|
end
|
|
93
112
|
end
|
|
94
113
|
|
|
114
|
+
def send_metrics(metrics)
|
|
115
|
+
metrics.each { |m| send(m.type, *[m.name, m.value, m.options].compact) }
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
Metric = Struct.new(:type, :name, :value, :options) do
|
|
119
|
+
def initialize(*args)
|
|
120
|
+
super
|
|
121
|
+
self.options = options || {}
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
|
|
95
125
|
# For defining and adding default options to metrics
|
|
96
126
|
module Options
|
|
97
127
|
DEFAULT = {
|
|
98
128
|
tags: DEFAULT_TAGS = [
|
|
99
|
-
"#{Ext::Metrics::TAG_LANG}:#{Runtime::Identity.lang}".freeze
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
129
|
+
"#{Ext::Metrics::TAG_LANG}:#{Runtime::Identity.lang}".freeze,
|
|
130
|
+
"#{Ext::Metrics::TAG_LANG_INTERPRETER}:#{Runtime::Identity.lang_interpreter}".freeze,
|
|
131
|
+
"#{Ext::Metrics::TAG_LANG_VERSION}:#{Runtime::Identity.lang_version}".freeze,
|
|
132
|
+
"#{Ext::Metrics::TAG_TRACER_VERSION}:#{Runtime::Identity.tracer_version}".freeze
|
|
103
133
|
].freeze
|
|
104
134
|
}.freeze
|
|
105
135
|
|
|
@@ -125,8 +155,61 @@ module Datadog
|
|
|
125
155
|
end
|
|
126
156
|
end
|
|
127
157
|
|
|
158
|
+
# For defining and adding helpers to metrics
|
|
159
|
+
module Helpers
|
|
160
|
+
[
|
|
161
|
+
:count,
|
|
162
|
+
:distribution,
|
|
163
|
+
:increment,
|
|
164
|
+
:gauge,
|
|
165
|
+
:time
|
|
166
|
+
].each do |metric_type|
|
|
167
|
+
define_method(metric_type) do |name, stat|
|
|
168
|
+
name = name.to_sym
|
|
169
|
+
define_method(name) do |*args, &block|
|
|
170
|
+
send(metric_type, stat, *args, &block)
|
|
171
|
+
end
|
|
172
|
+
end
|
|
173
|
+
end
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
module Logging
|
|
177
|
+
# Surrogate for Datadog::Statsd to log elsewhere
|
|
178
|
+
class Adapter
|
|
179
|
+
attr_accessor :logger
|
|
180
|
+
|
|
181
|
+
def initialize(logger = nil)
|
|
182
|
+
@logger = logger || Logger.new(STDOUT).tap do |l|
|
|
183
|
+
l.level = Logger::INFO
|
|
184
|
+
l.progname = nil
|
|
185
|
+
l.formatter = proc do |_severity, datetime, _progname, msg|
|
|
186
|
+
stat = JSON.parse(msg[3..-1]) # Trim off leading progname...
|
|
187
|
+
"#{JSON.dump(timestamp: datetime.to_i, message: 'Metric sent.', metric: stat)}\n"
|
|
188
|
+
end
|
|
189
|
+
end
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
def count(stat, value, options = nil)
|
|
193
|
+
logger.info({ stat: stat, type: :count, value: value, options: options }.to_json)
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
def distribution(stat, value, options = nil)
|
|
197
|
+
logger.info({ stat: stat, type: :distribution, value: value, options: options }.to_json)
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
def increment(stat, options = nil)
|
|
201
|
+
logger.info({ stat: stat, type: :increment, options: options }.to_json)
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
def gauge(stat, value, options = nil)
|
|
205
|
+
logger.info({ stat: stat, type: :gauge, value: value, options: options }.to_json)
|
|
206
|
+
end
|
|
207
|
+
end
|
|
208
|
+
end
|
|
209
|
+
|
|
128
210
|
# Make available on for both class and instance.
|
|
129
211
|
include Options
|
|
130
212
|
extend Options
|
|
213
|
+
extend Helpers
|
|
131
214
|
end
|
|
132
215
|
end
|
|
@@ -24,7 +24,7 @@ module Datadog
|
|
|
24
24
|
end
|
|
25
25
|
|
|
26
26
|
# Inject all configured propagation styles
|
|
27
|
-
::Datadog.configuration.propagation_inject_style.each do |style|
|
|
27
|
+
::Datadog.configuration.distributed_tracing.propagation_inject_style.each do |style|
|
|
28
28
|
propagator = PROPAGATION_STYLES[style]
|
|
29
29
|
propagator.inject!(context, env) unless propagator.nil?
|
|
30
30
|
end
|
|
@@ -36,7 +36,7 @@ module Datadog
|
|
|
36
36
|
context = nil
|
|
37
37
|
dd_context = nil
|
|
38
38
|
|
|
39
|
-
::Datadog.configuration.propagation_extract_style.each do |style|
|
|
39
|
+
::Datadog.configuration.distributed_tracing.propagation_extract_style.each do |style|
|
|
40
40
|
propagator = PROPAGATION_STYLES[style]
|
|
41
41
|
next if propagator.nil?
|
|
42
42
|
|
|
@@ -5,12 +5,12 @@ module Datadog
|
|
|
5
5
|
module_function
|
|
6
6
|
|
|
7
7
|
def value
|
|
8
|
-
ObjectSpace.count_objects[:T_CLASS]
|
|
8
|
+
::ObjectSpace.count_objects[:T_CLASS]
|
|
9
9
|
end
|
|
10
10
|
|
|
11
11
|
def available?
|
|
12
|
-
ObjectSpace.respond_to?(:count_objects) \
|
|
13
|
-
&& ObjectSpace.count_objects.key?(:T_CLASS)
|
|
12
|
+
::ObjectSpace.respond_to?(:count_objects) \
|
|
13
|
+
&& ::ObjectSpace.count_objects.key?(:T_CLASS)
|
|
14
14
|
end
|
|
15
15
|
end
|
|
16
16
|
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
require 'objspace'
|
|
2
|
+
|
|
3
|
+
module Datadog
|
|
4
|
+
module Runtime
|
|
5
|
+
# Retrieves garbage collection statistics
|
|
6
|
+
module ObjectSpace
|
|
7
|
+
module_function
|
|
8
|
+
|
|
9
|
+
def estimate_bytesize(object)
|
|
10
|
+
return 0 unless ::ObjectSpace.respond_to?(:memsize_of)
|
|
11
|
+
|
|
12
|
+
# Rough calculation of bytesize; not very accurate.
|
|
13
|
+
object.instance_variables.inject(::ObjectSpace.memsize_of(object)) do |sum, var|
|
|
14
|
+
sum + ::ObjectSpace.memsize_of(object.instance_variable_get(var))
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
data/lib/ddtrace/span.rb
CHANGED
|
@@ -243,7 +243,7 @@ module Datadog
|
|
|
243
243
|
|
|
244
244
|
private
|
|
245
245
|
|
|
246
|
-
if defined?(JRUBY_VERSION) || Gem::Version.new(RUBY_VERSION) < Gem::Version.new(
|
|
246
|
+
if defined?(JRUBY_VERSION) || Gem::Version.new(RUBY_VERSION) < Gem::Version.new(VERSION::MINIMUM_RUBY_VERSION)
|
|
247
247
|
def now_allocations
|
|
248
248
|
0
|
|
249
249
|
end
|
data/lib/ddtrace/tracer.rb
CHANGED
|
@@ -230,9 +230,10 @@ module Datadog
|
|
|
230
230
|
# root span
|
|
231
231
|
@sampler.sample!(span)
|
|
232
232
|
span.set_tag('system.pid', Process.pid)
|
|
233
|
-
|
|
233
|
+
|
|
234
|
+
if ctx && ctx.trace_id
|
|
234
235
|
span.trace_id = ctx.trace_id
|
|
235
|
-
span.parent_id = ctx.span_id
|
|
236
|
+
span.parent_id = ctx.span_id unless ctx.span_id.nil?
|
|
236
237
|
end
|
|
237
238
|
else
|
|
238
239
|
# child span
|
|
@@ -391,8 +392,8 @@ module Datadog
|
|
|
391
392
|
transport_options = options.fetch(:transport_options, {})
|
|
392
393
|
|
|
393
394
|
# Compile writer options
|
|
394
|
-
|
|
395
|
-
|
|
395
|
+
writer_options = options.fetch(:writer_options, {})
|
|
396
|
+
rebuild_writer = !writer_options.empty?
|
|
396
397
|
|
|
397
398
|
# Re-build the sampler and writer if priority sampling is enabled,
|
|
398
399
|
# but neither are configured. Verify the sampler isn't already a
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
require 'ddtrace/transport/statistics'
|
|
1
|
+
require 'ddtrace/transport/http/statistics'
|
|
2
2
|
require 'ddtrace/transport/http/env'
|
|
3
3
|
|
|
4
4
|
module Datadog
|
|
@@ -6,7 +6,7 @@ module Datadog
|
|
|
6
6
|
module HTTP
|
|
7
7
|
# Routes, encodes, and sends tracer data to the trace agent via HTTP.
|
|
8
8
|
class Client
|
|
9
|
-
include Transport::Statistics
|
|
9
|
+
include Transport::HTTP::Statistics
|
|
10
10
|
|
|
11
11
|
attr_reader \
|
|
12
12
|
:apis,
|
|
@@ -47,8 +47,7 @@ module Datadog
|
|
|
47
47
|
end
|
|
48
48
|
|
|
49
49
|
# Update statistics
|
|
50
|
-
|
|
51
|
-
stats.consecutive_errors += 1
|
|
50
|
+
update_stats_from_exception!(e)
|
|
52
51
|
|
|
53
52
|
InternalErrorResponse.new(e)
|
|
54
53
|
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
require 'ddtrace/transport/statistics'
|
|
2
|
+
|
|
3
|
+
module Datadog
|
|
4
|
+
module Transport
|
|
5
|
+
module HTTP
|
|
6
|
+
# Tracks statistics for HTTP transports
|
|
7
|
+
module Statistics
|
|
8
|
+
def self.included(base)
|
|
9
|
+
base.send(:include, Transport::Statistics)
|
|
10
|
+
base.send(:include, InstanceMethods)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
# Instance methods for HTTP statistics
|
|
14
|
+
module InstanceMethods
|
|
15
|
+
# Decorate metrics for HTTP responses
|
|
16
|
+
def metrics_for_response(response)
|
|
17
|
+
super.tap do |metrics|
|
|
18
|
+
# Add status code tag to api.responses metric
|
|
19
|
+
if metrics.key?(:api_responses)
|
|
20
|
+
(metrics[:api_responses].options[:tags] ||= []).tap do |tags|
|
|
21
|
+
tags << "status_code:#{response.code}"
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
require 'ddtrace/diagnostics/health'
|
|
2
|
+
|
|
1
3
|
module Datadog
|
|
2
4
|
module Transport
|
|
3
5
|
# Tracks statistics for transports
|
|
@@ -16,6 +18,32 @@ module Datadog
|
|
|
16
18
|
stats.internal_error += 1 if response.internal_error?
|
|
17
19
|
stats.consecutive_errors += 1
|
|
18
20
|
end
|
|
21
|
+
|
|
22
|
+
# Send health metrics
|
|
23
|
+
Diagnostics::Health.metrics.send_metrics(
|
|
24
|
+
metrics_for_response(response).values
|
|
25
|
+
)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def metrics_for_response(response)
|
|
29
|
+
{}.tap do |metrics|
|
|
30
|
+
metrics[:api_errors] = Metrics::Metric.new(:api_errors, nil, 1) if response.internal_error?
|
|
31
|
+
metrics[:api_responses] = Metrics::Metric.new(:api_responses, nil, 1) unless response.internal_error?
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def update_stats_from_exception!(exception)
|
|
36
|
+
stats.internal_error += 1
|
|
37
|
+
stats.consecutive_errors += 1
|
|
38
|
+
|
|
39
|
+
# Send health metrics
|
|
40
|
+
Diagnostics::Health.metrics.send_metrics(
|
|
41
|
+
metrics_for_exception(exception).values
|
|
42
|
+
)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def metrics_for_exception(_exception)
|
|
46
|
+
{ api_errors: Metrics::Metric.new(:api_errors, nil, 1) }
|
|
19
47
|
end
|
|
20
48
|
|
|
21
49
|
# Stat counts
|
data/lib/ddtrace/version.rb
CHANGED
data/lib/ddtrace/workers.rb
CHANGED
|
@@ -10,6 +10,8 @@ module Datadog
|
|
|
10
10
|
# will perform a task at regular intervals. The thread can be stopped
|
|
11
11
|
# with the +stop()+ method and can start with the +start()+ method.
|
|
12
12
|
class AsyncTransport
|
|
13
|
+
DEFAULT_BUFFER_MAX_SIZE = 1000
|
|
14
|
+
DEFAULT_FLUSH_INTERVAL = 1
|
|
13
15
|
DEFAULT_TIMEOUT = 5
|
|
14
16
|
BACK_OFF_RATIO = 1.2
|
|
15
17
|
BACK_OFF_MAX = 5
|
|
@@ -26,12 +28,12 @@ module Datadog
|
|
|
26
28
|
@runtime_metrics_task = options[:on_runtime_metrics]
|
|
27
29
|
|
|
28
30
|
# Intervals
|
|
29
|
-
interval = options.fetch(:interval,
|
|
31
|
+
interval = options.fetch(:interval, DEFAULT_FLUSH_INTERVAL)
|
|
30
32
|
@flush_interval = interval
|
|
31
33
|
@back_off = interval
|
|
32
34
|
|
|
33
35
|
# Buffers
|
|
34
|
-
buffer_size = options.fetch(:buffer_size,
|
|
36
|
+
buffer_size = options.fetch(:buffer_size, DEFAULT_BUFFER_MAX_SIZE)
|
|
35
37
|
@trace_buffer = TraceBuffer.new(buffer_size)
|
|
36
38
|
|
|
37
39
|
# Threading
|