ddtrace 0.9.2 → 0.10.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +2 -3
- data/Appraisals +1 -0
- data/ddtrace.gemspec +3 -0
- data/docs/GettingStarted.md +31 -8
- data/gemfiles/rails32_postgres_redis.gemfile +1 -0
- data/lib/ddtrace.rb +20 -34
- data/lib/ddtrace/buffer.rb +1 -7
- data/lib/ddtrace/configurable.rb +77 -0
- data/lib/ddtrace/configuration.rb +35 -0
- data/lib/ddtrace/configuration/proxy.rb +29 -0
- data/lib/ddtrace/configuration/resolver.rb +24 -0
- data/lib/ddtrace/context.rb +55 -7
- data/lib/ddtrace/contrib/active_record/patcher.rb +4 -1
- data/lib/ddtrace/contrib/aws/patcher.rb +3 -0
- data/lib/ddtrace/contrib/base.rb +14 -0
- data/lib/ddtrace/contrib/dalli/patcher.rb +3 -0
- data/lib/ddtrace/contrib/elasticsearch/patcher.rb +3 -0
- data/lib/ddtrace/contrib/faraday/middleware.rb +5 -6
- data/lib/ddtrace/contrib/faraday/patcher.rb +3 -0
- data/lib/ddtrace/contrib/grape/patcher.rb +3 -0
- data/lib/ddtrace/contrib/http/patcher.rb +22 -7
- data/lib/ddtrace/contrib/mongodb/patcher.rb +3 -0
- data/lib/ddtrace/contrib/rack/middlewares.rb +21 -35
- data/lib/ddtrace/contrib/rails/action_controller.rb +2 -2
- data/lib/ddtrace/contrib/rails/action_view.rb +2 -2
- data/lib/ddtrace/contrib/rails/active_record.rb +2 -2
- data/lib/ddtrace/contrib/rails/active_support.rb +2 -2
- data/lib/ddtrace/contrib/rails/framework.rb +36 -58
- data/lib/ddtrace/contrib/rails/middlewares.rb +1 -1
- data/lib/ddtrace/contrib/rails/patcher.rb +56 -0
- data/lib/ddtrace/contrib/rails/railtie.rb +18 -0
- data/lib/ddtrace/contrib/rails/utils.rb +1 -1
- data/lib/ddtrace/contrib/redis/patcher.rb +4 -0
- data/lib/ddtrace/contrib/redis/quantize.rb +1 -1
- data/lib/ddtrace/contrib/redis/tags.rb +1 -0
- data/lib/ddtrace/contrib/resque/patcher.rb +9 -0
- data/lib/ddtrace/contrib/resque/resque_job.rb +6 -6
- data/lib/ddtrace/contrib/sidekiq/tracer.rb +11 -11
- data/lib/ddtrace/contrib/sinatra/tracer.rb +23 -63
- data/lib/ddtrace/contrib/sucker_punch/patcher.rb +3 -0
- data/lib/ddtrace/ext/distributed.rb +2 -0
- data/lib/ddtrace/ext/redis.rb +6 -0
- data/lib/ddtrace/monkey.rb +20 -37
- data/lib/ddtrace/propagation/distributed_headers.rb +48 -0
- data/lib/ddtrace/propagation/http_propagator.rb +28 -0
- data/lib/ddtrace/registry.rb +42 -0
- data/lib/ddtrace/registry/registerable.rb +20 -0
- data/lib/ddtrace/sampler.rb +61 -1
- data/lib/ddtrace/sync_writer.rb +36 -0
- data/lib/ddtrace/tracer.rb +23 -21
- data/lib/ddtrace/transport.rb +52 -15
- data/lib/ddtrace/version.rb +2 -2
- data/lib/ddtrace/workers.rb +33 -31
- data/lib/ddtrace/writer.rb +20 -1
- metadata +42 -3
- data/lib/ddtrace/distributed.rb +0 -38
data/lib/ddtrace/version.rb
CHANGED
data/lib/ddtrace/workers.rb
CHANGED
@@ -12,8 +12,9 @@ module Datadog
|
|
12
12
|
DEFAULT_TIMEOUT = 5
|
13
13
|
BACK_OFF_RATIO = 1.2
|
14
14
|
BACK_OFF_MAX = 5
|
15
|
+
SHUTDOWN_TIMEOUT = 1
|
15
16
|
|
16
|
-
attr_reader :trace_buffer, :service_buffer
|
17
|
+
attr_reader :trace_buffer, :service_buffer
|
17
18
|
|
18
19
|
def initialize(transport, buff_size, trace_task, service_task, interval)
|
19
20
|
@trace_task = trace_task
|
@@ -23,7 +24,8 @@ module Datadog
|
|
23
24
|
@trace_buffer = TraceBuffer.new(buff_size)
|
24
25
|
@service_buffer = TraceBuffer.new(buff_size)
|
25
26
|
@transport = transport
|
26
|
-
@
|
27
|
+
@shutdown = ConditionVariable.new
|
28
|
+
@mutex = Mutex.new
|
27
29
|
|
28
30
|
@worker = nil
|
29
31
|
@run = false
|
@@ -62,47 +64,32 @@ module Datadog
|
|
62
64
|
|
63
65
|
# Start the timer execution.
|
64
66
|
def start
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
while @run
|
71
|
-
@back_off = callback_traces ? @flush_interval : [@back_off * BACK_OFF_RATIO, BACK_OFF_MAX].min
|
72
|
-
|
73
|
-
callback_services
|
74
|
-
|
75
|
-
sleep(@back_off) if @run
|
76
|
-
end
|
67
|
+
@mutex.synchronize do
|
68
|
+
return if @run
|
69
|
+
@run = true
|
70
|
+
Tracer.log.debug("Starting thread in the process: #{Process.pid}")
|
71
|
+
@worker = Thread.new { perform }
|
77
72
|
end
|
78
73
|
end
|
79
74
|
|
80
|
-
#
|
75
|
+
# Closes all available queues and waits for the trace and service buffer to flush
|
81
76
|
def stop
|
82
|
-
@
|
83
|
-
|
77
|
+
@mutex.synchronize do
|
78
|
+
return unless @run
|
84
79
|
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
@trace_buffer.close
|
90
|
-
@service_buffer.close
|
91
|
-
sleep(0.1)
|
92
|
-
timeout_time = Time.now + DEFAULT_TIMEOUT
|
93
|
-
while (!@trace_buffer.empty? || !@service_buffer.empty?) && Time.now <= timeout_time
|
94
|
-
sleep(0.05)
|
95
|
-
Datadog::Tracer.log.debug('Waiting for the buffers to clear before exiting')
|
80
|
+
@trace_buffer.close
|
81
|
+
@service_buffer.close
|
82
|
+
@run = false
|
83
|
+
@shutdown.signal
|
96
84
|
end
|
97
|
-
|
85
|
+
|
98
86
|
join
|
99
|
-
@shutting_down = false
|
100
87
|
true
|
101
88
|
end
|
102
89
|
|
103
90
|
# Block until executor shutdown is complete or until timeout seconds have passed.
|
104
91
|
def join
|
105
|
-
@worker.join(
|
92
|
+
@worker.join(SHUTDOWN_TIMEOUT)
|
106
93
|
end
|
107
94
|
|
108
95
|
# Enqueue an item in the trace internal buffer. This operation is thread-safe
|
@@ -116,6 +103,21 @@ module Datadog
|
|
116
103
|
return if service == {} # no use to send this, not worth it
|
117
104
|
@service_buffer.push(service)
|
118
105
|
end
|
106
|
+
|
107
|
+
private
|
108
|
+
|
109
|
+
def perform
|
110
|
+
loop do
|
111
|
+
@back_off = callback_traces ? @flush_interval : [@back_off * BACK_OFF_RATIO, BACK_OFF_MAX].min
|
112
|
+
|
113
|
+
callback_services
|
114
|
+
|
115
|
+
@mutex.synchronize do
|
116
|
+
return if !@run && @trace_buffer.empty? && @service_buffer.empty?
|
117
|
+
@shutdown.wait(@mutex, @back_off)
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
119
121
|
end
|
120
122
|
end
|
121
123
|
end
|
data/lib/ddtrace/writer.rb
CHANGED
@@ -14,9 +14,20 @@ module Datadog
|
|
14
14
|
# writer and transport parameters
|
15
15
|
@buff_size = options.fetch(:buffer_size, 100)
|
16
16
|
@flush_interval = options.fetch(:flush_interval, 1)
|
17
|
+
transport_options = options.fetch(:transport_options, {})
|
18
|
+
|
19
|
+
# priority sampling
|
20
|
+
if options[:priority_sampler]
|
21
|
+
@priority_sampler = options[:priority_sampler]
|
22
|
+
transport_options[:api_version] ||= HTTPTransport::V4
|
23
|
+
transport_options[:response_callback] ||= method(:sampling_updater)
|
24
|
+
end
|
17
25
|
|
18
26
|
# transport and buffers
|
19
|
-
@transport = options.fetch(:transport
|
27
|
+
@transport = options.fetch(:transport) do
|
28
|
+
HTTPTransport.new(HOSTNAME, PORT, transport_options)
|
29
|
+
end
|
30
|
+
|
20
31
|
@services = {}
|
21
32
|
|
22
33
|
# handles the thread creation after an eventual fork
|
@@ -103,5 +114,13 @@ module Datadog
|
|
103
114
|
transport: @transport.stats
|
104
115
|
}
|
105
116
|
end
|
117
|
+
|
118
|
+
private
|
119
|
+
|
120
|
+
def sampling_updater(response)
|
121
|
+
return unless response.is_a?(Net::HTTPOK)
|
122
|
+
service_rates = JSON.parse(response.body)
|
123
|
+
@priority_sampler.update(service_rates)
|
124
|
+
end
|
106
125
|
end
|
107
126
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ddtrace
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.10.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Datadog, Inc.
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-11-
|
11
|
+
date: 2017-11-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: msgpack
|
@@ -94,6 +94,34 @@ dependencies:
|
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0.9'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: webmock
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '2.0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '2.0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: addressable
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 2.4.0
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: 2.4.0
|
97
125
|
- !ruby/object:Gem::Dependency
|
98
126
|
name: redcarpet
|
99
127
|
requirement: !ruby/object:Gem::Requirement
|
@@ -149,12 +177,17 @@ files:
|
|
149
177
|
- gemfiles/rails5_postgres_sidekiq.gemfile
|
150
178
|
- lib/ddtrace.rb
|
151
179
|
- lib/ddtrace/buffer.rb
|
180
|
+
- lib/ddtrace/configurable.rb
|
181
|
+
- lib/ddtrace/configuration.rb
|
182
|
+
- lib/ddtrace/configuration/proxy.rb
|
183
|
+
- lib/ddtrace/configuration/resolver.rb
|
152
184
|
- lib/ddtrace/context.rb
|
153
185
|
- lib/ddtrace/contrib/active_record/patcher.rb
|
154
186
|
- lib/ddtrace/contrib/aws/instrumentation.rb
|
155
187
|
- lib/ddtrace/contrib/aws/parsed_context.rb
|
156
188
|
- lib/ddtrace/contrib/aws/patcher.rb
|
157
189
|
- lib/ddtrace/contrib/aws/services.rb
|
190
|
+
- lib/ddtrace/contrib/base.rb
|
158
191
|
- lib/ddtrace/contrib/dalli/instrumentation.rb
|
159
192
|
- lib/ddtrace/contrib/dalli/patcher.rb
|
160
193
|
- lib/ddtrace/contrib/dalli/quantize.rb
|
@@ -176,6 +209,8 @@ files:
|
|
176
209
|
- lib/ddtrace/contrib/rails/core_extensions.rb
|
177
210
|
- lib/ddtrace/contrib/rails/framework.rb
|
178
211
|
- lib/ddtrace/contrib/rails/middlewares.rb
|
212
|
+
- lib/ddtrace/contrib/rails/patcher.rb
|
213
|
+
- lib/ddtrace/contrib/rails/railtie.rb
|
179
214
|
- lib/ddtrace/contrib/rails/utils.rb
|
180
215
|
- lib/ddtrace/contrib/redis/patcher.rb
|
181
216
|
- lib/ddtrace/contrib/redis/quantize.rb
|
@@ -187,7 +222,6 @@ files:
|
|
187
222
|
- lib/ddtrace/contrib/sucker_punch/exception_handler.rb
|
188
223
|
- lib/ddtrace/contrib/sucker_punch/instrumentation.rb
|
189
224
|
- lib/ddtrace/contrib/sucker_punch/patcher.rb
|
190
|
-
- lib/ddtrace/distributed.rb
|
191
225
|
- lib/ddtrace/encoding.rb
|
192
226
|
- lib/ddtrace/error.rb
|
193
227
|
- lib/ddtrace/ext/app_types.rb
|
@@ -205,9 +239,14 @@ files:
|
|
205
239
|
- lib/ddtrace/pipeline.rb
|
206
240
|
- lib/ddtrace/pipeline/span_filter.rb
|
207
241
|
- lib/ddtrace/pipeline/span_processor.rb
|
242
|
+
- lib/ddtrace/propagation/distributed_headers.rb
|
243
|
+
- lib/ddtrace/propagation/http_propagator.rb
|
208
244
|
- lib/ddtrace/provider.rb
|
245
|
+
- lib/ddtrace/registry.rb
|
246
|
+
- lib/ddtrace/registry/registerable.rb
|
209
247
|
- lib/ddtrace/sampler.rb
|
210
248
|
- lib/ddtrace/span.rb
|
249
|
+
- lib/ddtrace/sync_writer.rb
|
211
250
|
- lib/ddtrace/tracer.rb
|
212
251
|
- lib/ddtrace/transport.rb
|
213
252
|
- lib/ddtrace/utils.rb
|
data/lib/ddtrace/distributed.rb
DELETED
@@ -1,38 +0,0 @@
|
|
1
|
-
require 'ddtrace/span'
|
2
|
-
|
3
|
-
module Datadog
|
4
|
-
# Common code related to distributed tracing.
|
5
|
-
module Distributed
|
6
|
-
module_function
|
7
|
-
|
8
|
-
# Parses a trace_id and a parent_id, typically sent as headers in
|
9
|
-
# a distributed tracing context, and returns a couple of trace_id,parent_id
|
10
|
-
# which are garanteed to be both non-zero. This does not 100% ensure they
|
11
|
-
# are valid (after all, the caller could mess up data) but at least it
|
12
|
-
# sorts out most common errors, such as syntax, nil values, etc.
|
13
|
-
# Both headers must be set, else nil values are returned, for both.
|
14
|
-
# Reports problem on debug log.
|
15
|
-
def parse_trace_headers(trace_id_header, parent_id_header)
|
16
|
-
return nil, nil if trace_id_header.nil? || parent_id_header.nil?
|
17
|
-
trace_id = trace_id_header.to_i
|
18
|
-
parent_id = parent_id_header.to_i
|
19
|
-
if trace_id.zero?
|
20
|
-
Datadog::Tracer.log.debug("invalid trace_id header: #{trace_id_header}")
|
21
|
-
return nil, nil
|
22
|
-
end
|
23
|
-
if parent_id.zero?
|
24
|
-
Datadog::Tracer.log.debug("invalid parent_id header: #{parent_id_header}")
|
25
|
-
return nil, nil
|
26
|
-
end
|
27
|
-
if trace_id < 0 || trace_id >= Datadog::Span::MAX_ID
|
28
|
-
Datadog::Tracer.log.debug("trace_id out of range: #{trace_id_header}")
|
29
|
-
return nil, nil
|
30
|
-
end
|
31
|
-
if parent_id < 0 || parent_id >= Datadog::Span::MAX_ID
|
32
|
-
Datadog::Tracer.log.debug("parent_id out of range: #{parent_id_header}")
|
33
|
-
return nil, nil
|
34
|
-
end
|
35
|
-
[trace_id, parent_id]
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|