ddtrace 0.9.0 → 0.9.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Rakefile +2 -0
- data/ddtrace.gemspec +1 -0
- data/docs/GettingStarted.md +58 -38
- data/lib/ddtrace/contrib/rails/action_controller.rb +2 -12
- data/lib/ddtrace/contrib/rails/action_view.rb +5 -25
- data/lib/ddtrace/contrib/rails/active_support.rb +3 -13
- data/lib/ddtrace/contrib/rails/core_extensions.rb +52 -38
- data/lib/ddtrace/contrib/resque/resque_job.rb +12 -1
- data/lib/ddtrace/pin.rb +1 -2
- data/lib/ddtrace/tracer.rb +2 -7
- data/lib/ddtrace/version.rb +1 -1
- data/lib/ddtrace/workers.rb +9 -4
- data/lib/ddtrace/writer.rb +7 -16
- metadata +16 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b0875d09844d2557b344cda645c3a378d0b33a1b
|
4
|
+
data.tar.gz: dd0bfd29b724ae66809b769512d971379cc56853
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cf0a24f6e5dc2198f8108fbb6f477295d73db47bd439d1f9b10b4b8b01e9aa006e9922180976b7a851b5bb6474558ccd950543944e343e332c00e77de7a503b3
|
7
|
+
data.tar.gz: 48410c488ae9fdaec44b519e702badf58ccc651bfb4204988b11e078598b6c4f6bc61c607a97ee313fcc708d562e9bf035045c13beb463fae6e1beb94cb46cea
|
data/Rakefile
CHANGED
data/ddtrace.gemspec
CHANGED
data/docs/GettingStarted.md
CHANGED
@@ -24,17 +24,18 @@ The easiest way to get started with the tracing client is to instrument your web
|
|
24
24
|
provides auto instrumentation for the following web frameworks and libraries:
|
25
25
|
|
26
26
|
* [Ruby on Rails](#Ruby_on_Rails)
|
27
|
-
* [Sidekiq](#Sidekiq)
|
28
27
|
* [Sinatra](#Sinatra)
|
29
28
|
* [Rack](#Rack)
|
30
29
|
* [Grape](#Grape)
|
31
30
|
* [Active Record](#Active_Record)
|
32
31
|
* [Elastic Search](#Elastic_Search)
|
33
32
|
* [MongoDB](#MongoDB)
|
34
|
-
* [
|
35
|
-
* [
|
33
|
+
* [Sidekiq](#Sidekiq)
|
34
|
+
* [Resque](#Resque)
|
36
35
|
* [SuckerPunch](#SuckerPunch)
|
37
36
|
* [Net/HTTP](#Net_HTTP)
|
37
|
+
* [Faraday](#Faraday)
|
38
|
+
* [Dalli](#Dalli)
|
38
39
|
* [Redis](#Redis)
|
39
40
|
|
40
41
|
## Web Frameworks
|
@@ -365,6 +366,23 @@ The `faraday` integration is available through the `ddtrace` middleware:
|
|
365
366
|
|
366
367
|
connection.get('/foo')
|
367
368
|
|
369
|
+
Where `options` is an optional `Hash` that accepts the following parameters:
|
370
|
+
|
371
|
+
| Key | Type | Default | Description |
|
372
|
+
| --- | --- | --- | --- |
|
373
|
+
| `split_by_domain` | Boolean | `false` | Uses the request domain as the service name when set to `true`. |
|
374
|
+
| `distributed_tracing` | Boolean | `false` | Propagates tracing context along the HTTP request when set to `true`. |
|
375
|
+
| `error_handler` | Callable | ``5xx`` evaluated as errors | A callable object that receives a single argument – the request environment. If it evaluates to a *truthy* value, the trace span is marked as an error. |
|
376
|
+
|
377
|
+
It's worth mentioning that `ddtrace` also supports instrumentation for the
|
378
|
+
`net/http` library, so if you're using it as farady's backend you might see
|
379
|
+
instrumentation both on `faraday` and `net/http` levels. If you want to avoid
|
380
|
+
multiple levels of instrumentation for your HTTP requests, remember that you can
|
381
|
+
always fine tune which libraries are patched by calling:
|
382
|
+
|
383
|
+
Datadog::Monkey.patch([:faraday, :redis])
|
384
|
+
# instead of using Datadog::Monkey.patch_all
|
385
|
+
|
368
386
|
### AWS
|
369
387
|
|
370
388
|
The AWS integration will trace every interaction (e.g. API calls) with AWS
|
@@ -422,21 +440,6 @@ executions. It can be added as any other Sidekiq middleware:
|
|
422
440
|
end
|
423
441
|
end
|
424
442
|
|
425
|
-
### SuckerPunch
|
426
|
-
|
427
|
-
The `sucker_punch` integration traces all scheduled jobs:
|
428
|
-
|
429
|
-
require 'ddtrace'
|
430
|
-
|
431
|
-
Datadog::Monkey.patch_module(:sucker_punch)
|
432
|
-
|
433
|
-
# the execution of this job is traced
|
434
|
-
LogJob.perform_async('login')
|
435
|
-
|
436
|
-
# to change SuckerPunch service name, use the Pin class
|
437
|
-
pin = Datadog::Pin.get_from(::SuckerPunch)
|
438
|
-
pin.service = 'deploy-queues'
|
439
|
-
|
440
443
|
#### Configure the tracer middleware
|
441
444
|
|
442
445
|
To modify the default configuration, simply pass arguments to the middleware.
|
@@ -475,22 +478,41 @@ giving precedence to the middleware settings. Inherited configurations are:
|
|
475
478
|
* ``trace_agent_hostname``
|
476
479
|
* ``trace_agent_port``
|
477
480
|
|
478
|
-
|
481
|
+
### Resque
|
479
482
|
|
480
|
-
|
481
|
-
|
482
|
-
|
483
|
-
| `distributed_tracing` | Boolean | `false` | Propagates tracing context along the HTTP request when set to `true`. |
|
484
|
-
| `error_handler` | Callable | [Click Here](https://github.com/DataDog/dd-trace-rb/blob/4fe3bc9df032eac3cd294b0bebcc866080dbe04f/lib/ddtrace/contrib/faraday/middleware.rb#L11-L13) | A callable object that receives a single argument – the request environment. If it evaluates to a *truthy* value, the trace span is marked as an error. By default, only server-side errors (e.g. `5xx`) are flagged as errors. |
|
483
|
+
The Resque integration uses Resque hooks that wraps the ``perform`` method.
|
484
|
+
To add tracing to a Resque job, extend your base class with the provided
|
485
|
+
one:
|
485
486
|
|
486
|
-
|
487
|
-
|
488
|
-
|
489
|
-
|
490
|
-
|
487
|
+
require 'ddtrace'
|
488
|
+
require 'ddtrace/contrib/resque/resque_job'
|
489
|
+
|
490
|
+
# patch Resque
|
491
|
+
Datadog::Monkey.patch_module(:resque)
|
492
|
+
|
493
|
+
class MyJob
|
494
|
+
# extend MyJob with integration hooks
|
495
|
+
extend Datadog::Contrib::Resque::ResqueJob
|
496
|
+
|
497
|
+
def self.perform(*args)
|
498
|
+
# do_something
|
499
|
+
end
|
500
|
+
end
|
501
|
+
|
502
|
+
### SuckerPunch
|
503
|
+
|
504
|
+
The `sucker_punch` integration traces all scheduled jobs:
|
505
|
+
|
506
|
+
require 'ddtrace'
|
507
|
+
|
508
|
+
Datadog::Monkey.patch_module(:sucker_punch)
|
509
|
+
|
510
|
+
# the execution of this job is traced
|
511
|
+
LogJob.perform_async('login')
|
491
512
|
|
492
|
-
|
493
|
-
|
513
|
+
# to change SuckerPunch service name, use the Pin class
|
514
|
+
pin = Datadog::Pin.get_from(::SuckerPunch)
|
515
|
+
pin.service = 'deploy-queues'
|
494
516
|
|
495
517
|
## Advanced usage
|
496
518
|
|
@@ -771,8 +793,11 @@ sent upstream. To achieve that, you can hook custom *processors* into the
|
|
771
793
|
pipeline using the method `Datadog::Pipeline.before_flush`:
|
772
794
|
|
773
795
|
Datadog::Pipeline.before_flush(
|
796
|
+
# filter the Span if the given block evaluates true
|
774
797
|
Datadog::Pipeline::SpanFilter.new { |span| span.resource =~ /PingController/ },
|
775
798
|
Datadog::Pipeline::SpanFilter.new { |span| span.get_tag('host') == 'localhost' }
|
799
|
+
|
800
|
+
# alter the Span updating fields or tags
|
776
801
|
Datadog::Pipeline::SpanProcessor.new { |span| span.resource.gsub!(/password=.*/, '') }
|
777
802
|
)
|
778
803
|
|
@@ -844,11 +869,6 @@ Currently we are supporting Sinatra >= 1.4.0.
|
|
844
869
|
|
845
870
|
Currently we are supporting Sidekiq >= 4.0.0.
|
846
871
|
|
847
|
-
###
|
872
|
+
### Terminology
|
848
873
|
|
849
|
-
|
850
|
-
* ``Resource``: A particular query to a service. For a web application, some examples might be a URL stem like ``/user/home`` or a
|
851
|
-
handler function like ``web.user.home``. For a SQL database, a resource would be the SQL of the query itself like ``select * from users where id = ?``.
|
852
|
-
You can track thousands (not millions or billions) of unique resources per services, so prefer resources like ``/user/home`` rather than ``/user/home?id=123456789``.
|
853
|
-
* ``Span``: A span tracks a unit of work in a service, like querying a database or rendering a template. Spans are associated
|
854
|
-
with a service and optionally a resource. Spans have names, start times, durations and optional tags.
|
874
|
+
If you need more context about the terminology used in the APM, take a look at the [official documentation](https://docs.datadoghq.com/tracing/terminology/).
|
@@ -9,19 +9,9 @@ module Datadog
|
|
9
9
|
def self.instrument
|
10
10
|
# patch Rails core components
|
11
11
|
Datadog::RailsActionPatcher.patch_action_controller
|
12
|
-
|
13
|
-
# subscribe when the request processing starts
|
14
|
-
::ActiveSupport::Notifications.subscribe('!datadog.start_processing.action_controller') do |*args|
|
15
|
-
start_processing(*args)
|
16
|
-
end
|
17
|
-
|
18
|
-
# subscribe when the request processing has been completed
|
19
|
-
::ActiveSupport::Notifications.subscribe('!datadog.finish_processing.action_controller') do |*args|
|
20
|
-
finish_processing(*args)
|
21
|
-
end
|
22
12
|
end
|
23
13
|
|
24
|
-
def self.start_processing(
|
14
|
+
def self.start_processing(payload)
|
25
15
|
# trace the execution
|
26
16
|
tracer = ::Rails.configuration.datadog_trace.fetch(:tracer)
|
27
17
|
service = ::Rails.configuration.datadog_trace.fetch(:default_controller_service)
|
@@ -35,7 +25,7 @@ module Datadog
|
|
35
25
|
Datadog::Tracer.log.error(e.message)
|
36
26
|
end
|
37
27
|
|
38
|
-
def self.finish_processing(
|
28
|
+
def self.finish_processing(payload)
|
39
29
|
# retrieve the tracing context and the latest active span
|
40
30
|
tracing_context = payload.fetch(:tracing_context)
|
41
31
|
span = tracing_context[:dd_request_span]
|
@@ -7,30 +7,10 @@ module Datadog
|
|
7
7
|
module ActionView
|
8
8
|
def self.instrument
|
9
9
|
# patch Rails core components
|
10
|
-
Datadog::RailsRendererPatcher.patch_renderer
|
11
|
-
|
12
|
-
# subscribe when the template rendering starts
|
13
|
-
::ActiveSupport::Notifications.subscribe('!datadog.start_render_template.action_view') do |*args|
|
14
|
-
start_render_template(*args)
|
15
|
-
end
|
16
|
-
|
17
|
-
# subscribe when the template rendering has been processed
|
18
|
-
::ActiveSupport::Notifications.subscribe('!datadog.finish_render_template.action_view') do |*args|
|
19
|
-
finish_render_template(*args)
|
20
|
-
end
|
21
|
-
|
22
|
-
# subscribe when the partial rendering starts
|
23
|
-
::ActiveSupport::Notifications.subscribe('!datadog.start_render_partial.action_view') do |*args|
|
24
|
-
start_render_partial(*args)
|
25
|
-
end
|
26
|
-
|
27
|
-
# subscribe when the partial rendering has been processed
|
28
|
-
::ActiveSupport::Notifications.subscribe('!datadog.finish_render_partial.action_view') do |*args|
|
29
|
-
finish_render_partial(*args)
|
30
|
-
end
|
10
|
+
Datadog::RailsRendererPatcher.patch_renderer
|
31
11
|
end
|
32
12
|
|
33
|
-
def self.start_render_template(
|
13
|
+
def self.start_render_template(payload)
|
34
14
|
# retrieve the tracing context
|
35
15
|
tracing_context = payload.fetch(:tracing_context)
|
36
16
|
|
@@ -42,7 +22,7 @@ module Datadog
|
|
42
22
|
Datadog::Tracer.log.debug(e.message)
|
43
23
|
end
|
44
24
|
|
45
|
-
def self.finish_render_template(
|
25
|
+
def self.finish_render_template(payload)
|
46
26
|
# retrieve the tracing context and the latest active span
|
47
27
|
tracing_context = payload.fetch(:tracing_context)
|
48
28
|
span = tracing_context[:dd_rails_template_span]
|
@@ -64,7 +44,7 @@ module Datadog
|
|
64
44
|
Datadog::Tracer.log.debug(e.message)
|
65
45
|
end
|
66
46
|
|
67
|
-
def self.start_render_partial(
|
47
|
+
def self.start_render_partial(payload)
|
68
48
|
# retrieve the tracing context
|
69
49
|
tracing_context = payload.fetch(:tracing_context)
|
70
50
|
|
@@ -75,7 +55,7 @@ module Datadog
|
|
75
55
|
Datadog::Tracer.log.debug(e.message)
|
76
56
|
end
|
77
57
|
|
78
|
-
def self.finish_render_partial(
|
58
|
+
def self.finish_render_partial(payload)
|
79
59
|
# retrieve the tracing context and the latest active span
|
80
60
|
tracing_context = payload.fetch(:tracing_context)
|
81
61
|
span = tracing_context[:dd_rails_partial_span]
|
@@ -8,20 +8,10 @@ module Datadog
|
|
8
8
|
module ActiveSupport
|
9
9
|
def self.instrument
|
10
10
|
# patch Rails core components
|
11
|
-
Datadog::RailsCachePatcher.patch_cache_store
|
12
|
-
|
13
|
-
# subscribe when a cache read starts being processed
|
14
|
-
::ActiveSupport::Notifications.subscribe('!datadog.start_cache_tracing.active_support') do |*args|
|
15
|
-
start_trace_cache(*args)
|
16
|
-
end
|
17
|
-
|
18
|
-
# subscribe when a cache read has been processed
|
19
|
-
::ActiveSupport::Notifications.subscribe('!datadog.finish_cache_tracing.active_support') do |*args|
|
20
|
-
finish_trace_cache(*args)
|
21
|
-
end
|
11
|
+
Datadog::RailsCachePatcher.patch_cache_store
|
22
12
|
end
|
23
13
|
|
24
|
-
def self.start_trace_cache(
|
14
|
+
def self.start_trace_cache(payload)
|
25
15
|
tracer = ::Rails.configuration.datadog_trace.fetch(:tracer)
|
26
16
|
tracing_context = payload.fetch(:tracing_context)
|
27
17
|
|
@@ -45,7 +35,7 @@ module Datadog
|
|
45
35
|
Datadog::Tracer.log.debug(e.message)
|
46
36
|
end
|
47
37
|
|
48
|
-
def self.finish_trace_cache(
|
38
|
+
def self.finish_trace_cache(payload)
|
49
39
|
# retrieve the tracing context and continue the trace
|
50
40
|
tracing_context = payload.fetch(:tracing_context)
|
51
41
|
span = tracing_context[:dd_cache_span]
|
@@ -2,7 +2,7 @@ module Datadog
|
|
2
2
|
# RailsRendererPatcher contains function to patch Rails rendering libraries.
|
3
3
|
# rubocop:disable Lint/RescueException
|
4
4
|
# rubocop:disable Metrics/MethodLength
|
5
|
-
# rubocop:disable Metrics/
|
5
|
+
# rubocop:disable Metrics/ModuleLength
|
6
6
|
module RailsRendererPatcher
|
7
7
|
module_function
|
8
8
|
|
@@ -27,11 +27,9 @@ module Datadog
|
|
27
27
|
# context when a partial is rendered
|
28
28
|
@tracing_context ||= {}
|
29
29
|
if @tracing_context.empty?
|
30
|
-
::
|
31
|
-
'!datadog.start_render_template.action_view',
|
32
|
-
tracing_context: @tracing_context
|
33
|
-
)
|
30
|
+
Datadog::Contrib::Rails::ActionView.start_render_template(tracing_context: @tracing_context)
|
34
31
|
end
|
32
|
+
|
35
33
|
render_without_datadog(*args)
|
36
34
|
rescue Exception => e
|
37
35
|
# attach the exception to the tracing context if any
|
@@ -39,10 +37,7 @@ module Datadog
|
|
39
37
|
raise e
|
40
38
|
ensure
|
41
39
|
# ensure that the template `Span` is finished even during exceptions
|
42
|
-
::
|
43
|
-
'!datadog.finish_render_template.action_view',
|
44
|
-
tracing_context: @tracing_context
|
45
|
-
)
|
40
|
+
Datadog::Contrib::Rails::ActionView.finish_render_template(tracing_context: @tracing_context)
|
46
41
|
end
|
47
42
|
|
48
43
|
def render_template_with_datadog(*args)
|
@@ -90,10 +85,7 @@ module Datadog
|
|
90
85
|
def render_with_datadog(*args, &block)
|
91
86
|
# create a tracing context and start the rendering span
|
92
87
|
@tracing_context = {}
|
93
|
-
::
|
94
|
-
'!datadog.start_render_partial.action_view',
|
95
|
-
tracing_context: @tracing_context
|
96
|
-
)
|
88
|
+
Datadog::Contrib::Rails::ActionView.start_render_partial(tracing_context: @tracing_context)
|
97
89
|
render_without_datadog(*args)
|
98
90
|
rescue Exception => e
|
99
91
|
# attach the exception to the tracing context if any
|
@@ -101,10 +93,7 @@ module Datadog
|
|
101
93
|
raise e
|
102
94
|
ensure
|
103
95
|
# ensure that the template `Span` is finished even during exceptions
|
104
|
-
::
|
105
|
-
'!datadog.finish_render_partial.action_view',
|
106
|
-
tracing_context: @tracing_context
|
107
|
-
)
|
96
|
+
Datadog::Contrib::Rails::ActionView.finish_render_partial(tracing_context: @tracing_context)
|
108
97
|
end
|
109
98
|
|
110
99
|
def render_partial_with_datadog(*args)
|
@@ -143,24 +132,25 @@ module Datadog
|
|
143
132
|
# mutable payload with a tracing context that is used in two different
|
144
133
|
# signals; it propagates the request span so that it can be finished
|
145
134
|
# no matter what
|
146
|
-
|
135
|
+
payload = {
|
147
136
|
controller: self.class.name,
|
148
137
|
action: action_name,
|
149
138
|
tracing_context: {}
|
150
139
|
}
|
151
140
|
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
# - https://github.com/rails/rails/blob/5-1-stable/actionpack/lib/action_controller/metal/instrumentation.rb#L17-L39
|
156
|
-
ActiveSupport::Notifications.instrument('!datadog.start_processing.action_controller', raw_payload)
|
157
|
-
|
158
|
-
# process the request and finish the trace
|
159
|
-
ActiveSupport::Notifications.instrument('!datadog.finish_processing.action_controller', raw_payload) do |payload|
|
141
|
+
begin
|
142
|
+
# process and catch request exceptions
|
143
|
+
Datadog::Contrib::Rails::ActionController.start_processing(payload)
|
160
144
|
result = process_action_without_datadog(*args)
|
161
145
|
payload[:status] = response.status
|
162
146
|
result
|
147
|
+
rescue Exception => e
|
148
|
+
payload[:exception] = [e.class.name, e.message]
|
149
|
+
payload[:exception_object] = e
|
150
|
+
raise e
|
163
151
|
end
|
152
|
+
ensure
|
153
|
+
Datadog::Contrib::Rails::ActionController.finish_processing(payload)
|
164
154
|
end
|
165
155
|
|
166
156
|
alias_method :process_action_without_datadog, :process_action
|
@@ -206,11 +196,17 @@ module Datadog
|
|
206
196
|
tracing_context: {}
|
207
197
|
}
|
208
198
|
|
209
|
-
|
210
|
-
|
211
|
-
|
199
|
+
begin
|
200
|
+
# process and catch cache exceptions
|
201
|
+
Datadog::Contrib::Rails::ActiveSupport.start_trace_cache(raw_payload)
|
212
202
|
read_without_datadog(*args, &block)
|
203
|
+
rescue Exception => e
|
204
|
+
payload[:exception] = [e.class.name, e.message]
|
205
|
+
payload[:exception_object] = e
|
206
|
+
raise e
|
213
207
|
end
|
208
|
+
ensure
|
209
|
+
Datadog::Contrib::Rails::ActiveSupport.finish_trace_cache(raw_payload)
|
214
210
|
end
|
215
211
|
end
|
216
212
|
end
|
@@ -225,11 +221,17 @@ module Datadog
|
|
225
221
|
tracing_context: {}
|
226
222
|
}
|
227
223
|
|
228
|
-
|
229
|
-
|
230
|
-
|
224
|
+
begin
|
225
|
+
# process and catch cache exceptions
|
226
|
+
Datadog::Contrib::Rails::ActiveSupport.start_trace_cache(raw_payload)
|
231
227
|
fetch_without_datadog(*args, &block)
|
228
|
+
rescue Exception => e
|
229
|
+
payload[:exception] = [e.class.name, e.message]
|
230
|
+
payload[:exception_object] = e
|
231
|
+
raise e
|
232
232
|
end
|
233
|
+
ensure
|
234
|
+
Datadog::Contrib::Rails::ActiveSupport.finish_trace_cache(raw_payload)
|
233
235
|
end
|
234
236
|
end
|
235
237
|
end
|
@@ -244,11 +246,17 @@ module Datadog
|
|
244
246
|
tracing_context: {}
|
245
247
|
}
|
246
248
|
|
247
|
-
|
248
|
-
|
249
|
-
|
249
|
+
begin
|
250
|
+
# process and catch cache exceptions
|
251
|
+
Datadog::Contrib::Rails::ActiveSupport.start_trace_cache(raw_payload)
|
250
252
|
write_without_datadog(*args, &block)
|
253
|
+
rescue Exception => e
|
254
|
+
payload[:exception] = [e.class.name, e.message]
|
255
|
+
payload[:exception_object] = e
|
256
|
+
raise e
|
251
257
|
end
|
258
|
+
ensure
|
259
|
+
Datadog::Contrib::Rails::ActiveSupport.finish_trace_cache(raw_payload)
|
252
260
|
end
|
253
261
|
end
|
254
262
|
end
|
@@ -263,11 +271,17 @@ module Datadog
|
|
263
271
|
tracing_context: {}
|
264
272
|
}
|
265
273
|
|
266
|
-
|
267
|
-
|
268
|
-
|
274
|
+
begin
|
275
|
+
# process and catch cache exceptions
|
276
|
+
Datadog::Contrib::Rails::ActiveSupport.start_trace_cache(raw_payload)
|
269
277
|
delete_without_datadog(*args, &block)
|
278
|
+
rescue Exception => e
|
279
|
+
payload[:exception] = [e.class.name, e.message]
|
280
|
+
payload[:exception_object] = e
|
281
|
+
raise e
|
270
282
|
end
|
283
|
+
ensure
|
284
|
+
Datadog::Contrib::Rails::ActiveSupport.finish_trace_cache(raw_payload)
|
271
285
|
end
|
272
286
|
end
|
273
287
|
end
|
@@ -8,6 +8,7 @@ module Datadog
|
|
8
8
|
module ResqueJob
|
9
9
|
def around_perform(*args)
|
10
10
|
pin = Pin.get_from(::Resque)
|
11
|
+
return yield unless pin && pin.tracer
|
11
12
|
pin.tracer.trace('resque.job', service: pin.service) do |span|
|
12
13
|
span.resource = name
|
13
14
|
span.span_type = pin.app_type
|
@@ -18,7 +19,7 @@ module Datadog
|
|
18
19
|
|
19
20
|
def after_perform(*args)
|
20
21
|
pin = Pin.get_from(::Resque)
|
21
|
-
pin.tracer.shutdown!
|
22
|
+
pin.tracer.shutdown! if pin && pin.tracer
|
22
23
|
end
|
23
24
|
end
|
24
25
|
end
|
@@ -27,5 +28,15 @@ end
|
|
27
28
|
|
28
29
|
Resque.before_first_fork do
|
29
30
|
pin = Datadog::Pin.get_from(Resque)
|
31
|
+
next unless pin && pin.tracer
|
30
32
|
pin.tracer.set_service_info(pin.service, 'resque', Datadog::Ext::AppTypes::WORKER)
|
31
33
|
end
|
34
|
+
|
35
|
+
Resque.after_fork do
|
36
|
+
# get the current tracer
|
37
|
+
pin = Datadog::Pin.get_from(Resque)
|
38
|
+
next unless pin && pin.tracer
|
39
|
+
# clean the state so no CoW happens
|
40
|
+
pin.tracer.provider.context = nil
|
41
|
+
pin.tracer.writer.start
|
42
|
+
end
|
data/lib/ddtrace/pin.rb
CHANGED
@@ -34,11 +34,11 @@ module Datadog
|
|
34
34
|
false
|
35
35
|
end
|
36
36
|
|
37
|
+
# rubocop:disable Style/TrivialAccessors
|
37
38
|
def onto(obj)
|
38
39
|
unless obj.respond_to? :datadog_pin=
|
39
40
|
obj.instance_exec do
|
40
41
|
def datadog_pin=(pin)
|
41
|
-
Datadog::Tracer.log.debug("Set pin #{pin.service} on #{self.class}.")
|
42
42
|
@datadog_pin = pin
|
43
43
|
end
|
44
44
|
end
|
@@ -47,7 +47,6 @@ module Datadog
|
|
47
47
|
unless obj.respond_to? :datadog_pin
|
48
48
|
obj.instance_exec do
|
49
49
|
def datadog_pin
|
50
|
-
Datadog::Tracer.log.debug("Get pin from #{self.class}.")
|
51
50
|
@datadog_pin
|
52
51
|
end
|
53
52
|
end
|
data/lib/ddtrace/tracer.rb
CHANGED
@@ -259,13 +259,8 @@ module Datadog
|
|
259
259
|
# * +span_type+: the type of the span (such as \http, \db and so on)
|
260
260
|
# * +tags+: extra tags which should be added to the span.
|
261
261
|
def trace(name, options = {})
|
262
|
-
|
263
|
-
|
264
|
-
# Plus, this documents the code (Ruby 2 named args would be better but we're Ruby 1.9 compatible)
|
265
|
-
[:service, :resource, :span_type, :tags].include?(k)
|
266
|
-
end
|
267
|
-
opts[:child_of] = call_context
|
268
|
-
span = start_span(name, opts)
|
262
|
+
options[:child_of] = call_context
|
263
|
+
span = start_span(name, options)
|
269
264
|
|
270
265
|
# call the finish only if a block is given; this ensures
|
271
266
|
# that a call to tracer.trace() without a block, returns
|
data/lib/ddtrace/version.rb
CHANGED
data/lib/ddtrace/workers.rb
CHANGED
@@ -10,6 +10,8 @@ module Datadog
|
|
10
10
|
# with the +stop()+ method and can start with the +start()+ method.
|
11
11
|
class AsyncTransport
|
12
12
|
DEFAULT_TIMEOUT = 5
|
13
|
+
BACK_OFF_RATIO = 1.2
|
14
|
+
BACK_OFF_MAX = 5
|
13
15
|
|
14
16
|
attr_reader :trace_buffer, :service_buffer, :shutting_down
|
15
17
|
|
@@ -17,6 +19,7 @@ module Datadog
|
|
17
19
|
@trace_task = trace_task
|
18
20
|
@service_task = service_task
|
19
21
|
@flush_interval = interval
|
22
|
+
@back_off = interval
|
20
23
|
@trace_buffer = TraceBuffer.new(buff_size)
|
21
24
|
@service_buffer = TraceBuffer.new(buff_size)
|
22
25
|
@transport = transport
|
@@ -28,7 +31,7 @@ module Datadog
|
|
28
31
|
|
29
32
|
# Callback function that process traces and executes the +send_traces()+ method.
|
30
33
|
def callback_traces
|
31
|
-
return if @trace_buffer.empty?
|
34
|
+
return true if @trace_buffer.empty?
|
32
35
|
|
33
36
|
begin
|
34
37
|
traces = @trace_buffer.pop()
|
@@ -44,7 +47,7 @@ module Datadog
|
|
44
47
|
|
45
48
|
# Callback function that process traces and executes the +send_services()+ method.
|
46
49
|
def callback_services
|
47
|
-
return if @service_buffer.empty?
|
50
|
+
return true if @service_buffer.empty?
|
48
51
|
|
49
52
|
begin
|
50
53
|
services = @service_buffer.pop()
|
@@ -65,9 +68,11 @@ module Datadog
|
|
65
68
|
Datadog::Tracer.log.debug("Starting thread in the process: #{Process.pid}")
|
66
69
|
|
67
70
|
while @run
|
68
|
-
callback_traces
|
71
|
+
@back_off = callback_traces ? @flush_interval : [@back_off * BACK_OFF_RATIO, BACK_OFF_MAX].min
|
72
|
+
|
69
73
|
callback_services
|
70
|
-
|
74
|
+
|
75
|
+
sleep(@back_off) if @run
|
71
76
|
end
|
72
77
|
end
|
73
78
|
end
|
data/lib/ddtrace/writer.rb
CHANGED
@@ -33,6 +33,7 @@ module Datadog
|
|
33
33
|
# spawns two different workers for spans and services;
|
34
34
|
# they share the same transport which is thread-safe
|
35
35
|
def start
|
36
|
+
@pid = Process.pid
|
36
37
|
@trace_handler = ->(items, transport) { send_spans(items, transport) }
|
37
38
|
@service_handler = ->(items, transport) { send_services(items, transport) }
|
38
39
|
@worker = Datadog::Workers::AsyncTransport.new(@transport,
|
@@ -55,16 +56,10 @@ module Datadog
|
|
55
56
|
return true if traces.empty?
|
56
57
|
|
57
58
|
code = transport.send(:traces, traces)
|
59
|
+
status = !transport.server_error?(code)
|
60
|
+
@traces_flushed += traces.length if status
|
58
61
|
|
59
|
-
|
60
|
-
traces[0..@buff_size].each do |trace|
|
61
|
-
@worker.enqueue_trace trace
|
62
|
-
end
|
63
|
-
return false
|
64
|
-
end
|
65
|
-
|
66
|
-
@traces_flushed += traces.length()
|
67
|
-
true
|
62
|
+
status
|
68
63
|
end
|
69
64
|
|
70
65
|
# flush services to the trace-agent, handles services only
|
@@ -72,13 +67,10 @@ module Datadog
|
|
72
67
|
return true if services.empty?
|
73
68
|
|
74
69
|
code = transport.send(:services, services)
|
75
|
-
|
76
|
-
|
77
|
-
return false
|
78
|
-
end
|
70
|
+
status = !transport.server_error?(code)
|
71
|
+
@services_flushed += 1 if status
|
79
72
|
|
80
|
-
|
81
|
-
true
|
73
|
+
status
|
82
74
|
end
|
83
75
|
|
84
76
|
# enqueue the trace for submission to the API
|
@@ -94,7 +86,6 @@ module Datadog
|
|
94
86
|
pid = Process.pid
|
95
87
|
@mutex_after_fork.synchronize do
|
96
88
|
if pid != @pid
|
97
|
-
@pid = pid
|
98
89
|
# we should start threads because the worker doesn't own this
|
99
90
|
start()
|
100
91
|
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.9.
|
4
|
+
version: 0.9.1
|
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
|
+
date: 2017-11-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: msgpack
|
@@ -94,6 +94,20 @@ dependencies:
|
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0.9'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: redcarpet
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '3.4'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '3.4'
|
97
111
|
description: |
|
98
112
|
ddtrace is Datadog’s tracing client for Ruby. It is used to trace requests
|
99
113
|
as they flow across web servers, databases and microservices so that developers
|