ddtrace 0.9.2 → 0.10.0

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