ddtrace 0.9.2 → 0.10.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.
Files changed (57) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -3
  3. data/Appraisals +1 -0
  4. data/ddtrace.gemspec +3 -0
  5. data/docs/GettingStarted.md +31 -8
  6. data/gemfiles/rails32_postgres_redis.gemfile +1 -0
  7. data/lib/ddtrace.rb +20 -34
  8. data/lib/ddtrace/buffer.rb +1 -7
  9. data/lib/ddtrace/configurable.rb +77 -0
  10. data/lib/ddtrace/configuration.rb +35 -0
  11. data/lib/ddtrace/configuration/proxy.rb +29 -0
  12. data/lib/ddtrace/configuration/resolver.rb +24 -0
  13. data/lib/ddtrace/context.rb +55 -7
  14. data/lib/ddtrace/contrib/active_record/patcher.rb +4 -1
  15. data/lib/ddtrace/contrib/aws/patcher.rb +3 -0
  16. data/lib/ddtrace/contrib/base.rb +14 -0
  17. data/lib/ddtrace/contrib/dalli/patcher.rb +3 -0
  18. data/lib/ddtrace/contrib/elasticsearch/patcher.rb +3 -0
  19. data/lib/ddtrace/contrib/faraday/middleware.rb +5 -6
  20. data/lib/ddtrace/contrib/faraday/patcher.rb +3 -0
  21. data/lib/ddtrace/contrib/grape/patcher.rb +3 -0
  22. data/lib/ddtrace/contrib/http/patcher.rb +22 -7
  23. data/lib/ddtrace/contrib/mongodb/patcher.rb +3 -0
  24. data/lib/ddtrace/contrib/rack/middlewares.rb +21 -35
  25. data/lib/ddtrace/contrib/rails/action_controller.rb +2 -2
  26. data/lib/ddtrace/contrib/rails/action_view.rb +2 -2
  27. data/lib/ddtrace/contrib/rails/active_record.rb +2 -2
  28. data/lib/ddtrace/contrib/rails/active_support.rb +2 -2
  29. data/lib/ddtrace/contrib/rails/framework.rb +36 -58
  30. data/lib/ddtrace/contrib/rails/middlewares.rb +1 -1
  31. data/lib/ddtrace/contrib/rails/patcher.rb +56 -0
  32. data/lib/ddtrace/contrib/rails/railtie.rb +18 -0
  33. data/lib/ddtrace/contrib/rails/utils.rb +1 -1
  34. data/lib/ddtrace/contrib/redis/patcher.rb +4 -0
  35. data/lib/ddtrace/contrib/redis/quantize.rb +1 -1
  36. data/lib/ddtrace/contrib/redis/tags.rb +1 -0
  37. data/lib/ddtrace/contrib/resque/patcher.rb +9 -0
  38. data/lib/ddtrace/contrib/resque/resque_job.rb +6 -6
  39. data/lib/ddtrace/contrib/sidekiq/tracer.rb +11 -11
  40. data/lib/ddtrace/contrib/sinatra/tracer.rb +23 -63
  41. data/lib/ddtrace/contrib/sucker_punch/patcher.rb +3 -0
  42. data/lib/ddtrace/ext/distributed.rb +2 -0
  43. data/lib/ddtrace/ext/redis.rb +6 -0
  44. data/lib/ddtrace/monkey.rb +20 -37
  45. data/lib/ddtrace/propagation/distributed_headers.rb +48 -0
  46. data/lib/ddtrace/propagation/http_propagator.rb +28 -0
  47. data/lib/ddtrace/registry.rb +42 -0
  48. data/lib/ddtrace/registry/registerable.rb +20 -0
  49. data/lib/ddtrace/sampler.rb +61 -1
  50. data/lib/ddtrace/sync_writer.rb +36 -0
  51. data/lib/ddtrace/tracer.rb +23 -21
  52. data/lib/ddtrace/transport.rb +52 -15
  53. data/lib/ddtrace/version.rb +2 -2
  54. data/lib/ddtrace/workers.rb +33 -31
  55. data/lib/ddtrace/writer.rb +20 -1
  56. metadata +42 -3
  57. data/lib/ddtrace/distributed.rb +0 -38
@@ -1,8 +1,8 @@
1
1
  module Datadog
2
2
  module VERSION
3
3
  MAJOR = 0
4
- MINOR = 9
5
- PATCH = 2
4
+ MINOR = 10
5
+ PATCH = 0
6
6
 
7
7
  STRING = [MAJOR, MINOR, PATCH].compact.join('.')
8
8
  end
@@ -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, :shutting_down
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
- @shutting_down = false
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
- return if @run
66
- @run = true
67
- @worker = Thread.new() do
68
- Datadog::Tracer.log.debug("Starting thread in the process: #{Process.pid}")
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
- # Stop the timer execution. Tasks already in the queue will be executed.
75
+ # Closes all available queues and waits for the trace and service buffer to flush
81
76
  def stop
82
- @run = false
83
- end
77
+ @mutex.synchronize do
78
+ return unless @run
84
79
 
85
- # Closes all available queues and waits for the trace and service buffer to flush
86
- def shutdown!
87
- return false if @shutting_down
88
- @shutting_down = true
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
- stop
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(5)
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
@@ -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, Datadog::HTTPTransport.new(HOSTNAME, PORT))
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.9.2
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-03 00:00:00.000000000 Z
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
@@ -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