ddtrace 0.35.2 → 0.40.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 (177) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +59 -1
  3. data/.gitignore +2 -0
  4. data/.gitlab-ci.yml +27 -0
  5. data/.rubocop.yml +4 -0
  6. data/.simplecov +38 -0
  7. data/Appraisals +139 -12
  8. data/CHANGELOG.md +185 -1
  9. data/Rakefile +524 -464
  10. data/ddtrace.gemspec +6 -0
  11. data/docker-compose.yml +37 -2
  12. data/docs/DevelopmentGuide.md +16 -0
  13. data/docs/GettingStarted.md +192 -111
  14. data/lib/ddtrace.rb +4 -0
  15. data/lib/ddtrace/configuration.rb +36 -5
  16. data/lib/ddtrace/configuration/components.rb +4 -7
  17. data/lib/ddtrace/configuration/pin_setup.rb +3 -2
  18. data/lib/ddtrace/configuration/settings.rb +27 -3
  19. data/lib/ddtrace/contrib/action_cable/configuration/settings.rb +7 -2
  20. data/lib/ddtrace/contrib/action_cable/ext.rb +5 -2
  21. data/lib/ddtrace/contrib/action_pack/configuration/settings.rb +7 -2
  22. data/lib/ddtrace/contrib/action_pack/ext.rb +5 -2
  23. data/lib/ddtrace/contrib/action_view/configuration/settings.rb +7 -2
  24. data/lib/ddtrace/contrib/action_view/ext.rb +5 -2
  25. data/lib/ddtrace/contrib/active_model_serializers/configuration/settings.rb +7 -2
  26. data/lib/ddtrace/contrib/active_model_serializers/ext.rb +5 -2
  27. data/lib/ddtrace/contrib/active_record/configuration/settings.rb +7 -2
  28. data/lib/ddtrace/contrib/active_record/ext.rb +5 -2
  29. data/lib/ddtrace/contrib/active_support/cache/redis.rb +1 -1
  30. data/lib/ddtrace/contrib/active_support/configuration/settings.rb +7 -2
  31. data/lib/ddtrace/contrib/active_support/ext.rb +5 -2
  32. data/lib/ddtrace/contrib/active_support/notifications/event.rb +3 -1
  33. data/lib/ddtrace/contrib/active_support/notifications/subscription.rb +1 -1
  34. data/lib/ddtrace/contrib/aws/configuration/settings.rb +7 -2
  35. data/lib/ddtrace/contrib/aws/ext.rb +5 -2
  36. data/lib/ddtrace/contrib/concurrent_ruby/configuration/settings.rb +5 -0
  37. data/lib/ddtrace/contrib/concurrent_ruby/context_composite_executor_service.rb +9 -3
  38. data/lib/ddtrace/contrib/concurrent_ruby/ext.rb +1 -0
  39. data/lib/ddtrace/contrib/configuration/settings.rb +19 -0
  40. data/lib/ddtrace/contrib/dalli/configuration/settings.rb +7 -2
  41. data/lib/ddtrace/contrib/dalli/ext.rb +5 -2
  42. data/lib/ddtrace/contrib/dalli/patcher.rb +1 -5
  43. data/lib/ddtrace/contrib/delayed_job/configuration/settings.rb +7 -2
  44. data/lib/ddtrace/contrib/delayed_job/ext.rb +5 -2
  45. data/lib/ddtrace/contrib/elasticsearch/configuration/settings.rb +7 -2
  46. data/lib/ddtrace/contrib/elasticsearch/ext.rb +5 -2
  47. data/lib/ddtrace/contrib/elasticsearch/patcher.rb +1 -2
  48. data/lib/ddtrace/contrib/ethon/configuration/settings.rb +7 -2
  49. data/lib/ddtrace/contrib/ethon/ext.rb +5 -2
  50. data/lib/ddtrace/contrib/excon/configuration/settings.rb +7 -2
  51. data/lib/ddtrace/contrib/excon/ext.rb +5 -2
  52. data/lib/ddtrace/contrib/extensions.rb +39 -5
  53. data/lib/ddtrace/contrib/faraday/configuration/settings.rb +7 -2
  54. data/lib/ddtrace/contrib/faraday/ext.rb +5 -2
  55. data/lib/ddtrace/contrib/faraday/middleware.rb +5 -3
  56. data/lib/ddtrace/contrib/faraday/patcher.rb +13 -5
  57. data/lib/ddtrace/contrib/grape/configuration/settings.rb +7 -3
  58. data/lib/ddtrace/contrib/grape/ext.rb +5 -2
  59. data/lib/ddtrace/contrib/grape/patcher.rb +1 -1
  60. data/lib/ddtrace/contrib/graphql/configuration/settings.rb +7 -2
  61. data/lib/ddtrace/contrib/graphql/ext.rb +5 -2
  62. data/lib/ddtrace/contrib/graphql/patcher.rb +6 -3
  63. data/lib/ddtrace/contrib/grpc/configuration/settings.rb +7 -2
  64. data/lib/ddtrace/contrib/grpc/datadog_interceptor.rb +1 -1
  65. data/lib/ddtrace/contrib/grpc/datadog_interceptor/client.rb +1 -3
  66. data/lib/ddtrace/contrib/grpc/ext.rb +5 -2
  67. data/lib/ddtrace/contrib/grpc/patcher.rb +1 -5
  68. data/lib/ddtrace/contrib/http/configuration/settings.rb +7 -2
  69. data/lib/ddtrace/contrib/http/ext.rb +5 -2
  70. data/lib/ddtrace/contrib/http/instrumentation.rb +12 -7
  71. data/lib/ddtrace/contrib/httprb/configuration/settings.rb +32 -0
  72. data/lib/ddtrace/contrib/httprb/ext.rb +17 -0
  73. data/lib/ddtrace/contrib/httprb/instrumentation.rb +160 -0
  74. data/lib/ddtrace/contrib/httprb/integration.rb +43 -0
  75. data/lib/ddtrace/contrib/httprb/patcher.rb +35 -0
  76. data/lib/ddtrace/contrib/kafka/configuration/settings.rb +30 -0
  77. data/lib/ddtrace/contrib/kafka/consumer_event.rb +14 -0
  78. data/lib/ddtrace/contrib/kafka/consumer_group_event.rb +14 -0
  79. data/lib/ddtrace/contrib/kafka/event.rb +51 -0
  80. data/lib/ddtrace/contrib/kafka/events.rb +44 -0
  81. data/lib/ddtrace/contrib/kafka/events/connection/request.rb +34 -0
  82. data/lib/ddtrace/contrib/kafka/events/consumer/process_batch.rb +41 -0
  83. data/lib/ddtrace/contrib/kafka/events/consumer/process_message.rb +39 -0
  84. data/lib/ddtrace/contrib/kafka/events/consumer_group/heartbeat.rb +39 -0
  85. data/lib/ddtrace/contrib/kafka/events/consumer_group/join_group.rb +29 -0
  86. data/lib/ddtrace/contrib/kafka/events/consumer_group/leave_group.rb +29 -0
  87. data/lib/ddtrace/contrib/kafka/events/consumer_group/sync_group.rb +29 -0
  88. data/lib/ddtrace/contrib/kafka/events/produce_operation/send_messages.rb +32 -0
  89. data/lib/ddtrace/contrib/kafka/events/producer/deliver_messages.rb +35 -0
  90. data/lib/ddtrace/contrib/kafka/ext.rb +41 -0
  91. data/lib/ddtrace/contrib/kafka/integration.rb +39 -0
  92. data/lib/ddtrace/contrib/kafka/patcher.rb +26 -0
  93. data/lib/ddtrace/contrib/mongodb/configuration/settings.rb +7 -2
  94. data/lib/ddtrace/contrib/mongodb/ext.rb +5 -2
  95. data/lib/ddtrace/contrib/mongodb/instrumentation.rb +1 -2
  96. data/lib/ddtrace/contrib/mysql2/configuration/settings.rb +7 -2
  97. data/lib/ddtrace/contrib/mysql2/ext.rb +5 -2
  98. data/lib/ddtrace/contrib/mysql2/instrumentation.rb +1 -1
  99. data/lib/ddtrace/contrib/patcher.rb +14 -8
  100. data/lib/ddtrace/contrib/presto/configuration/settings.rb +7 -2
  101. data/lib/ddtrace/contrib/presto/ext.rb +5 -2
  102. data/lib/ddtrace/contrib/que/configuration/settings.rb +42 -0
  103. data/lib/ddtrace/contrib/que/ext.rb +30 -0
  104. data/lib/ddtrace/contrib/que/integration.rb +42 -0
  105. data/lib/ddtrace/contrib/que/patcher.rb +24 -0
  106. data/lib/ddtrace/contrib/que/tracer.rb +56 -0
  107. data/lib/ddtrace/contrib/racecar/configuration/settings.rb +7 -2
  108. data/lib/ddtrace/contrib/racecar/events.rb +2 -0
  109. data/lib/ddtrace/contrib/racecar/events/consume.rb +27 -0
  110. data/lib/ddtrace/contrib/racecar/ext.rb +6 -2
  111. data/lib/ddtrace/contrib/rack/configuration/settings.rb +7 -2
  112. data/lib/ddtrace/contrib/rack/ext.rb +5 -2
  113. data/lib/ddtrace/contrib/rack/middlewares.rb +17 -12
  114. data/lib/ddtrace/contrib/rails/configuration/settings.rb +10 -11
  115. data/lib/ddtrace/contrib/rails/ext.rb +6 -2
  116. data/lib/ddtrace/contrib/rails/framework.rb +52 -46
  117. data/lib/ddtrace/contrib/rails/integration.rb +1 -1
  118. data/lib/ddtrace/contrib/rails/log_injection.rb +81 -0
  119. data/lib/ddtrace/contrib/rails/middlewares.rb +7 -2
  120. data/lib/ddtrace/contrib/rails/patcher.rb +15 -0
  121. data/lib/ddtrace/contrib/rake/configuration/settings.rb +7 -3
  122. data/lib/ddtrace/contrib/rake/ext.rb +5 -2
  123. data/lib/ddtrace/contrib/redis/configuration/settings.rb +7 -2
  124. data/lib/ddtrace/contrib/redis/ext.rb +5 -2
  125. data/lib/ddtrace/contrib/redis/patcher.rb +1 -1
  126. data/lib/ddtrace/contrib/resque/configuration/settings.rb +7 -2
  127. data/lib/ddtrace/contrib/resque/ext.rb +5 -2
  128. data/lib/ddtrace/contrib/rest_client/configuration/settings.rb +7 -2
  129. data/lib/ddtrace/contrib/rest_client/ext.rb +5 -2
  130. data/lib/ddtrace/contrib/rest_client/request_patch.rb +2 -2
  131. data/lib/ddtrace/contrib/sequel/configuration/settings.rb +7 -2
  132. data/lib/ddtrace/contrib/sequel/database.rb +1 -1
  133. data/lib/ddtrace/contrib/sequel/ext.rb +5 -2
  134. data/lib/ddtrace/contrib/sequel/utils.rb +19 -1
  135. data/lib/ddtrace/contrib/shoryuken/configuration/settings.rb +7 -2
  136. data/lib/ddtrace/contrib/shoryuken/ext.rb +5 -2
  137. data/lib/ddtrace/contrib/sidekiq/configuration/settings.rb +7 -2
  138. data/lib/ddtrace/contrib/sidekiq/ext.rb +6 -2
  139. data/lib/ddtrace/contrib/sidekiq/patcher.rb +8 -1
  140. data/lib/ddtrace/contrib/sidekiq/server_tracer.rb +1 -0
  141. data/lib/ddtrace/contrib/sinatra/configuration/settings.rb +7 -2
  142. data/lib/ddtrace/contrib/sinatra/env.rb +5 -4
  143. data/lib/ddtrace/contrib/sinatra/ext.rb +5 -2
  144. data/lib/ddtrace/contrib/sinatra/tracer.rb +21 -42
  145. data/lib/ddtrace/contrib/sinatra/tracer_middleware.rb +50 -23
  146. data/lib/ddtrace/contrib/sneakers/configuration/settings.rb +32 -0
  147. data/lib/ddtrace/contrib/sneakers/ext.rb +22 -0
  148. data/lib/ddtrace/contrib/sneakers/integration.rb +41 -0
  149. data/lib/ddtrace/contrib/sneakers/patcher.rb +24 -0
  150. data/lib/ddtrace/contrib/sneakers/tracer.rb +58 -0
  151. data/lib/ddtrace/contrib/sucker_punch/configuration/settings.rb +7 -2
  152. data/lib/ddtrace/contrib/sucker_punch/ext.rb +5 -2
  153. data/lib/ddtrace/contrib/sucker_punch/patcher.rb +1 -1
  154. data/lib/ddtrace/diagnostics/environment_logger.rb +278 -0
  155. data/lib/ddtrace/environment.rb +17 -3
  156. data/lib/ddtrace/ext/diagnostics.rb +3 -0
  157. data/lib/ddtrace/ext/environment.rb +2 -0
  158. data/lib/ddtrace/ext/transport.rb +1 -0
  159. data/lib/ddtrace/logger.rb +1 -1
  160. data/lib/ddtrace/pin.rb +39 -15
  161. data/lib/ddtrace/pipeline/span_filter.rb +15 -15
  162. data/lib/ddtrace/runtime/metrics.rb +18 -4
  163. data/lib/ddtrace/sampler.rb +2 -0
  164. data/lib/ddtrace/span.rb +10 -0
  165. data/lib/ddtrace/tracer.rb +15 -8
  166. data/lib/ddtrace/transport/http.rb +15 -0
  167. data/lib/ddtrace/transport/http/adapters/net.rb +8 -0
  168. data/lib/ddtrace/transport/http/adapters/test.rb +6 -0
  169. data/lib/ddtrace/transport/http/adapters/unix_socket.rb +4 -0
  170. data/lib/ddtrace/transport/response.rb +11 -0
  171. data/lib/ddtrace/version.rb +2 -2
  172. data/lib/ddtrace/workers/async.rb +2 -2
  173. data/lib/ddtrace/workers/loop.rb +1 -1
  174. data/lib/ddtrace/workers/polling.rb +1 -1
  175. data/lib/ddtrace/workers/trace_writer.rb +3 -0
  176. data/lib/ddtrace/writer.rb +33 -12
  177. metadata +124 -4
@@ -10,12 +10,22 @@ module Datadog
10
10
  @criteria = filter || block
11
11
  end
12
12
 
13
+ # Note: this SpanFilter implementation only handles traces in which child spans appear
14
+ # after parent spans in the trace array. If in the future child spans can be before
15
+ # parent spans, then the code below will need to be updated.
13
16
  def call(trace)
14
- black_list = trace.select(&method(:drop_it?))
15
-
16
- clean_trace(black_list, trace) while black_list.any?
17
-
18
- trace
17
+ deleted = Set.new
18
+
19
+ trace.delete_if do |span|
20
+ if deleted.include?(span.parent)
21
+ deleted << span
22
+ true
23
+ else
24
+ drop = drop_it?(span)
25
+ deleted << span if drop
26
+ drop
27
+ end
28
+ end
19
29
  end
20
30
 
21
31
  private
@@ -23,16 +33,6 @@ module Datadog
23
33
  def drop_it?(span)
24
34
  @criteria.call(span) rescue false
25
35
  end
26
-
27
- def clean_trace(black_list, trace)
28
- current = black_list.shift
29
-
30
- trace.delete(current)
31
-
32
- trace.each do |span|
33
- black_list << span if span.parent == current
34
- end
35
- end
36
36
  end
37
37
  end
38
38
  end
@@ -55,10 +55,8 @@ module Datadog
55
55
 
56
56
  def gc_metrics
57
57
  Hash[
58
- GC.stat.map do |k, v|
59
- next if v.is_a?(Hash) # TODO: JRuby supports additional nested metrics
60
-
61
- ["#{Ext::Runtime::Metrics::METRIC_GC_PREFIX}.#{k}", v]
58
+ GC.stat.flat_map do |k, v|
59
+ nested_gc_metric(Ext::Runtime::Metrics::METRIC_GC_PREFIX, k, v)
62
60
  end
63
61
  ]
64
62
  end
@@ -91,6 +89,22 @@ module Datadog
91
89
  "#{Ext::Runtime::Metrics::TAG_SERVICE}:#{service}".freeze
92
90
  end
93
91
  end
92
+
93
+ def nested_gc_metric(prefix, k, v)
94
+ path = "#{prefix}.#{k}"
95
+
96
+ if v.is_a?(Hash)
97
+ v.flat_map do |key, value|
98
+ nested_gc_metric(path, key, value)
99
+ end
100
+ else
101
+ [[to_metric_name(path), v]]
102
+ end
103
+ end
104
+
105
+ def to_metric_name(str)
106
+ str.downcase.gsub(/[-\s]/, '_')
107
+ end
94
108
  end
95
109
  end
96
110
  end
@@ -193,6 +193,8 @@ module Datadog
193
193
  class PrioritySampler
194
194
  extend Forwardable
195
195
 
196
+ attr_reader :pre_sampler, :priority_sampler
197
+
196
198
  SAMPLE_RATE_METRIC_KEY = '_sample_rate'.freeze
197
199
 
198
200
  def initialize(opts = {})
@@ -107,6 +107,16 @@ module Datadog
107
107
  Datadog.logger.debug("Unable to set the tag #{key}, ignoring it. Caused by: #{e}")
108
108
  end
109
109
 
110
+ # Sets tags from given hash, for each key in hash it sets the tag with that key
111
+ # and associated value from the hash. It is shortcut for `set_tag`. Keys and values
112
+ # of the hash must be strings. Note that nested hashes are not supported.
113
+ # A valid example is:
114
+ #
115
+ # span.set_tags({ "http.method" => "GET", "user.id" => "234" })
116
+ def set_tags(tags)
117
+ tags.each { |k, v| set_tag(k, v) }
118
+ end
119
+
110
120
  # This method removes a tag for the given key.
111
121
  def clear_tag(key)
112
122
  @meta.delete(key)
@@ -212,8 +212,8 @@ module Datadog
212
212
  # child span
213
213
  span.parent = parent # sets service, trace_id, parent_id, sampled
214
214
  end
215
- @tags.each { |k, v| span.set_tag(k, v) } unless @tags.empty?
216
- tags.each { |k, v| span.set_tag(k, v) } unless tags.empty?
215
+ span.set_tags(@tags) unless @tags.empty?
216
+ span.set_tags(tags) unless tags.empty?
217
217
  span.start_time = start_time
218
218
 
219
219
  # this could at some point be optional (start_active_span vs start_manual_span)
@@ -255,9 +255,11 @@ module Datadog
255
255
  # * +service+: the service name for this span
256
256
  # * +resource+: the resource this span refers, or \name if it's missing
257
257
  # * +span_type+: the type of the span (such as \http, \db and so on)
258
+ # * +child_of+: a \Span or a \Context instance representing the parent for this span.
259
+ # If not set, defaults to Tracer.call_context
258
260
  # * +tags+: extra tags which should be added to the span.
259
261
  def trace(name, options = {})
260
- options[:child_of] = call_context
262
+ options[:child_of] ||= call_context
261
263
 
262
264
  # call the finish only if a block is given; this ensures
263
265
  # that a call to tracer.trace() without a block, returns
@@ -269,11 +271,16 @@ module Datadog
269
271
  begin
270
272
  begin
271
273
  span = start_span(name, options)
272
- # rubocop:disable Lint/UselessAssignment
273
274
  rescue StandardError => e
274
- Datadog.logger.debug('Failed to start span: #{e}')
275
+ Datadog.logger.debug("Failed to start span: #{e}")
275
276
  ensure
276
- return_value = yield(span)
277
+ # We should yield to the provided block when possible, as this
278
+ # block is application code that we don't want to hinder. We call:
279
+ # * `yield(span)` during normal execution.
280
+ # * `yield(nil)` if `start_span` fails with a runtime error.
281
+ # * We don't yield during a fatal error, as the application is likely trying to
282
+ # end its execution (either due to a system error or graceful shutdown).
283
+ return_value = yield(span) if span || e.is_a?(StandardError)
277
284
  end
278
285
  # rubocop:disable Lint/RescueException
279
286
  # Here we really want to catch *any* exception, not only StandardError,
@@ -314,7 +321,7 @@ module Datadog
314
321
  def record_context(context)
315
322
  trace = @context_flush.consume!(context)
316
323
 
317
- write(trace) if trace && !trace.empty?
324
+ write(trace) if @enabled && trace && !trace.empty?
318
325
  end
319
326
 
320
327
  # Return the current active span or +nil+.
@@ -335,7 +342,7 @@ module Datadog
335
342
  # Send the trace to the writer to enqueue the spans list in the agent
336
343
  # sending queue.
337
344
  def write(trace)
338
- return if @writer.nil? || !@enabled
345
+ return if @writer.nil?
339
346
 
340
347
  if Datadog.configuration.diagnostics.debug
341
348
  Datadog.logger.debug("Writing #{trace.length} spans (enabled: #{@enabled})")
@@ -10,6 +10,7 @@ require 'ddtrace/transport/http/api'
10
10
  require 'ddtrace/transport/http/adapters/net'
11
11
  require 'ddtrace/transport/http/adapters/test'
12
12
  require 'ddtrace/transport/http/adapters/unix_socket'
13
+ require 'uri'
13
14
 
14
15
  module Datadog
15
16
  module Transport
@@ -75,13 +76,27 @@ module Datadog
75
76
  end
76
77
 
77
78
  def default_hostname
79
+ return default_url.hostname if default_url
80
+
78
81
  ENV.fetch(Datadog::Ext::Transport::HTTP::ENV_DEFAULT_HOST, Datadog::Ext::Transport::HTTP::DEFAULT_HOST)
79
82
  end
80
83
 
81
84
  def default_port
85
+ return default_url.port if default_url
86
+
82
87
  ENV.fetch(Datadog::Ext::Transport::HTTP::ENV_DEFAULT_PORT, Datadog::Ext::Transport::HTTP::DEFAULT_PORT).to_i
83
88
  end
84
89
 
90
+ def default_url
91
+ url_env = ENV.fetch(Datadog::Ext::Transport::HTTP::ENV_DEFAULT_URL, nil)
92
+
93
+ if url_env
94
+ uri_parsed = URI.parse(url_env)
95
+
96
+ uri_parsed if %w[http https].include?(uri_parsed.scheme)
97
+ end
98
+ end
99
+
85
100
  # Add adapters to registry
86
101
  Builder::REGISTRY.set(Adapters::Net, :net_http)
87
102
  Builder::REGISTRY.set(Adapters::Test, :test)
@@ -47,6 +47,10 @@ module Datadog
47
47
  Response.new(http_response)
48
48
  end
49
49
 
50
+ def url
51
+ "http://#{hostname}:#{port}?timeout=#{timeout}"
52
+ end
53
+
50
54
  # Raised when called with an unknown HTTP method
51
55
  class UnknownHTTPMethod < StandardError
52
56
  attr_reader :verb
@@ -104,6 +108,10 @@ module Datadog
104
108
  return super if http_response.nil?
105
109
  code.between?(500, 599)
106
110
  end
111
+
112
+ def inspect
113
+ "#{super}, http_response:#{http_response}"
114
+ end
107
115
  end
108
116
  end
109
117
  end
@@ -33,6 +33,8 @@ module Datadog
33
33
  @status = status
34
34
  end
35
35
 
36
+ def url; end
37
+
36
38
  # Response for test adapter
37
39
  class Response
38
40
  include Datadog::Transport::Response
@@ -69,6 +71,10 @@ module Datadog
69
71
  def server_error?
70
72
  code.between?(500, 599)
71
73
  end
74
+
75
+ def inspect
76
+ "#{super}, code:#{code}"
77
+ end
72
78
  end
73
79
  end
74
80
  end
@@ -31,6 +31,10 @@ module Datadog
31
31
  end
32
32
  end
33
33
 
34
+ def url
35
+ "http+unix://#{filepath}?timeout=#{timeout}"
36
+ end
37
+
34
38
  # Re-implements Net:HTTP with underlying Unix socket
35
39
  class HTTP < ::Net::HTTP
36
40
  DEFAULT_TIMEOUT = 1
@@ -29,6 +29,13 @@ module Datadog
29
29
  def internal_error?
30
30
  nil
31
31
  end
32
+
33
+ def inspect
34
+ "#{self.class} ok?:#{ok?} unsupported?:#{unsupported?}, " \
35
+ "not_found?:#{not_found?}, client_error?:#{client_error?}, " \
36
+ "server_error?:#{server_error?}, internal_error?:#{internal_error?}, " \
37
+ "payload:#{payload}"
38
+ end
32
39
  end
33
40
 
34
41
  # A generic error response for internal errors
@@ -44,6 +51,10 @@ module Datadog
44
51
  def internal_error?
45
52
  true
46
53
  end
54
+
55
+ def inspect
56
+ "#{super}, error_type:#{error.class} error:#{error}"
57
+ end
47
58
  end
48
59
  end
49
60
  end
@@ -1,8 +1,8 @@
1
1
  module Datadog
2
2
  module VERSION
3
3
  MAJOR = 0
4
- MINOR = 35
5
- PATCH = 2
4
+ MINOR = 40
5
+ PATCH = 0
6
6
  PRE = nil
7
7
 
8
8
  STRING = [MAJOR, MINOR, PATCH, PRE].compact.join('.')
@@ -42,7 +42,7 @@ module Datadog
42
42
  end
43
43
 
44
44
  def run_async?
45
- @run_async = false unless instance_variable_defined?(:@run_async)
45
+ return false unless instance_variable_defined?(:@run_async)
46
46
  @run_async == true
47
47
  end
48
48
 
@@ -55,7 +55,7 @@ module Datadog
55
55
  end
56
56
 
57
57
  def error?
58
- @error = nil unless instance_variable_defined?(:@error)
58
+ return false unless instance_variable_defined?(:@error)
59
59
  !@error.nil?
60
60
  end
61
61
 
@@ -33,7 +33,7 @@ module Datadog
33
33
  end
34
34
 
35
35
  def run_loop?
36
- @run_loop = false unless instance_variable_defined?(:@run_loop)
36
+ return false unless instance_variable_defined?(:@run_loop)
37
37
  @run_loop == true
38
38
  end
39
39
 
@@ -34,7 +34,7 @@ module Datadog
34
34
  end
35
35
 
36
36
  def enabled?
37
- @enabled = true unless instance_variable_defined?(:@enabled)
37
+ return true unless instance_variable_defined?(:@enabled)
38
38
  @enabled
39
39
  end
40
40
 
@@ -72,6 +72,9 @@ module Datadog
72
72
  end
73
73
  end
74
74
 
75
+ # TODO: Register `Datadog::Diagnostics::EnvironmentLogger.log!`
76
+ # TODO: as a flush_completed subscriber when the `TraceWriter`
77
+ # TODO: instantiation code is implemented.
75
78
  def flush_completed
76
79
  @flush_completed ||= FlushCompleted.new
77
80
  end
@@ -7,6 +7,7 @@ require 'ddtrace/transport/http'
7
7
  require 'ddtrace/transport/io'
8
8
  require 'ddtrace/encoding'
9
9
  require 'ddtrace/workers'
10
+ require 'ddtrace/diagnostics/environment_logger'
10
11
 
11
12
  module Datadog
12
13
  # Processor that sends traces and metadata to the agent
@@ -43,9 +44,18 @@ module Datadog
43
44
  @worker = nil
44
45
  end
45
46
 
46
- # spawns a worker for spans; they share the same transport which is thread-safe
47
47
  def start
48
- @pid = Process.pid
48
+ @mutex_after_fork.synchronize do
49
+ pid = Process.pid
50
+ return if @worker && pid == @pid
51
+ @pid = pid
52
+ start_worker
53
+ true
54
+ end
55
+ end
56
+
57
+ # spawns a worker for spans; they share the same transport which is thread-safe
58
+ def start_worker
49
59
  @trace_handler = ->(items, transport) { send_spans(items, transport) }
50
60
  @worker = Datadog::Workers::AsyncTransport.new(
51
61
  transport: @transport,
@@ -57,14 +67,19 @@ module Datadog
57
67
  @worker.start
58
68
  end
59
69
 
60
- # stops worker for spans.
61
70
  def stop
62
- return if worker.nil?
71
+ @mutex_after_fork.synchronize { stop_worker }
72
+ end
73
+
74
+ def stop_worker
75
+ return if @worker.nil?
63
76
  @worker.stop
64
77
  @worker = nil
65
78
  true
66
79
  end
67
80
 
81
+ private :start_worker, :stop_worker
82
+
68
83
  # flush spans to the trace-agent, handles spans only
69
84
  def send_spans(traces, transport)
70
85
  return true if traces.empty?
@@ -83,6 +98,8 @@ module Datadog
83
98
  # Update priority sampler
84
99
  update_priority_sampler(responses.last)
85
100
 
101
+ record_environment_information!(responses)
102
+
86
103
  # Return if server error occurred.
87
104
  !responses.find(&:server_error?)
88
105
  end
@@ -106,13 +123,7 @@ module Datadog
106
123
  #
107
124
  # This check ensures that if a process doesn't own the current +Writer+, async workers
108
125
  # will be initialized again (but only once for each process).
109
- pid = Process.pid
110
- if pid != @pid # avoid using Mutex when pids are equal
111
- @mutex_after_fork.synchronize do
112
- # we should start threads because the worker doesn't own this
113
- start if pid != @pid
114
- end
115
- end
126
+ start if @worker.nil? || @pid != Process.pid
116
127
 
117
128
  # TODO: Remove this, and have the tracer pump traces directly to runtime metrics
118
129
  # instead of working through the trace writer.
@@ -121,7 +132,13 @@ module Datadog
121
132
  Datadog.runtime_metrics.associate_with_span(trace.first)
122
133
  end
123
134
 
124
- @worker.enqueue_trace(trace)
135
+ worker_local = @worker
136
+
137
+ if worker_local
138
+ worker_local.enqueue_trace(trace)
139
+ else
140
+ Datadog.logger.debug('Writer either failed to start or was stopped before #write could complete')
141
+ end
125
142
  end
126
143
 
127
144
  # stats returns a dictionary of stats about the writer.
@@ -150,5 +167,9 @@ module Datadog
150
167
 
151
168
  priority_sampler.update(response.service_rates)
152
169
  end
170
+
171
+ def record_environment_information!(responses)
172
+ Diagnostics::EnvironmentLogger.log!(responses)
173
+ end
153
174
  end
154
175
  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.35.2
4
+ version: 0.40.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: 2020-05-11 00:00:00.000000000 Z
11
+ date: 2020-09-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: msgpack
@@ -122,6 +122,34 @@ dependencies:
122
122
  - - '='
123
123
  - !ruby/object:Gem::Version
124
124
  version: 5.10.1
125
+ - !ruby/object:Gem::Dependency
126
+ name: minitest-around
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - '='
130
+ - !ruby/object:Gem::Version
131
+ version: 0.5.0
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - '='
137
+ - !ruby/object:Gem::Version
138
+ version: 0.5.0
139
+ - !ruby/object:Gem::Dependency
140
+ name: minitest-stub_any_instance
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - '='
144
+ - !ruby/object:Gem::Version
145
+ version: 1.0.2
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - '='
151
+ - !ruby/object:Gem::Version
152
+ version: 1.0.2
125
153
  - !ruby/object:Gem::Dependency
126
154
  name: appraisal
127
155
  requirement: !ruby/object:Gem::Requirement
@@ -220,6 +248,48 @@ dependencies:
220
248
  - - "~>"
221
249
  - !ruby/object:Gem::Version
222
250
  version: 2.4.0
251
+ - !ruby/object:Gem::Dependency
252
+ name: benchmark-ips
253
+ requirement: !ruby/object:Gem::Requirement
254
+ requirements:
255
+ - - "~>"
256
+ - !ruby/object:Gem::Version
257
+ version: '2.8'
258
+ type: :development
259
+ prerelease: false
260
+ version_requirements: !ruby/object:Gem::Requirement
261
+ requirements:
262
+ - - "~>"
263
+ - !ruby/object:Gem::Version
264
+ version: '2.8'
265
+ - !ruby/object:Gem::Dependency
266
+ name: benchmark-memory
267
+ requirement: !ruby/object:Gem::Requirement
268
+ requirements:
269
+ - - "~>"
270
+ - !ruby/object:Gem::Version
271
+ version: '0.1'
272
+ type: :development
273
+ prerelease: false
274
+ version_requirements: !ruby/object:Gem::Requirement
275
+ requirements:
276
+ - - "~>"
277
+ - !ruby/object:Gem::Version
278
+ version: '0.1'
279
+ - !ruby/object:Gem::Dependency
280
+ name: memory_profiler
281
+ requirement: !ruby/object:Gem::Requirement
282
+ requirements:
283
+ - - "~>"
284
+ - !ruby/object:Gem::Version
285
+ version: '0.9'
286
+ type: :development
287
+ prerelease: false
288
+ version_requirements: !ruby/object:Gem::Requirement
289
+ requirements:
290
+ - - "~>"
291
+ - !ruby/object:Gem::Version
292
+ version: '0.9'
223
293
  - !ruby/object:Gem::Dependency
224
294
  name: redcarpet
225
295
  requirement: !ruby/object:Gem::Requirement
@@ -262,6 +332,20 @@ dependencies:
262
332
  - - "~>"
263
333
  - !ruby/object:Gem::Version
264
334
  version: 0.4.9.2
335
+ - !ruby/object:Gem::Dependency
336
+ name: simplecov
337
+ requirement: !ruby/object:Gem::Requirement
338
+ requirements:
339
+ - - "~>"
340
+ - !ruby/object:Gem::Version
341
+ version: '0.17'
342
+ type: :development
343
+ prerelease: false
344
+ version_requirements: !ruby/object:Gem::Requirement
345
+ requirements:
346
+ - - "~>"
347
+ - !ruby/object:Gem::Version
348
+ version: '0.17'
265
349
  - !ruby/object:Gem::Dependency
266
350
  name: warning
267
351
  requirement: !ruby/object:Gem::Requirement
@@ -300,8 +384,10 @@ files:
300
384
  - ".env"
301
385
  - ".github/CODEOWNERS"
302
386
  - ".gitignore"
387
+ - ".gitlab-ci.yml"
303
388
  - ".rspec"
304
389
  - ".rubocop.yml"
390
+ - ".simplecov"
305
391
  - ".yardopts"
306
392
  - Appraisals
307
393
  - CHANGELOG.md
@@ -475,7 +561,29 @@ files:
475
561
  - lib/ddtrace/contrib/http/integration.rb
476
562
  - lib/ddtrace/contrib/http/patcher.rb
477
563
  - lib/ddtrace/contrib/http_annotation_helper.rb
564
+ - lib/ddtrace/contrib/httprb/configuration/settings.rb
565
+ - lib/ddtrace/contrib/httprb/ext.rb
566
+ - lib/ddtrace/contrib/httprb/instrumentation.rb
567
+ - lib/ddtrace/contrib/httprb/integration.rb
568
+ - lib/ddtrace/contrib/httprb/patcher.rb
478
569
  - lib/ddtrace/contrib/integration.rb
570
+ - lib/ddtrace/contrib/kafka/configuration/settings.rb
571
+ - lib/ddtrace/contrib/kafka/consumer_event.rb
572
+ - lib/ddtrace/contrib/kafka/consumer_group_event.rb
573
+ - lib/ddtrace/contrib/kafka/event.rb
574
+ - lib/ddtrace/contrib/kafka/events.rb
575
+ - lib/ddtrace/contrib/kafka/events/connection/request.rb
576
+ - lib/ddtrace/contrib/kafka/events/consumer/process_batch.rb
577
+ - lib/ddtrace/contrib/kafka/events/consumer/process_message.rb
578
+ - lib/ddtrace/contrib/kafka/events/consumer_group/heartbeat.rb
579
+ - lib/ddtrace/contrib/kafka/events/consumer_group/join_group.rb
580
+ - lib/ddtrace/contrib/kafka/events/consumer_group/leave_group.rb
581
+ - lib/ddtrace/contrib/kafka/events/consumer_group/sync_group.rb
582
+ - lib/ddtrace/contrib/kafka/events/produce_operation/send_messages.rb
583
+ - lib/ddtrace/contrib/kafka/events/producer/deliver_messages.rb
584
+ - lib/ddtrace/contrib/kafka/ext.rb
585
+ - lib/ddtrace/contrib/kafka/integration.rb
586
+ - lib/ddtrace/contrib/kafka/patcher.rb
479
587
  - lib/ddtrace/contrib/mongodb/configuration/settings.rb
480
588
  - lib/ddtrace/contrib/mongodb/ext.rb
481
589
  - lib/ddtrace/contrib/mongodb/instrumentation.rb
@@ -495,10 +603,16 @@ files:
495
603
  - lib/ddtrace/contrib/presto/instrumentation.rb
496
604
  - lib/ddtrace/contrib/presto/integration.rb
497
605
  - lib/ddtrace/contrib/presto/patcher.rb
606
+ - lib/ddtrace/contrib/que/configuration/settings.rb
607
+ - lib/ddtrace/contrib/que/ext.rb
608
+ - lib/ddtrace/contrib/que/integration.rb
609
+ - lib/ddtrace/contrib/que/patcher.rb
610
+ - lib/ddtrace/contrib/que/tracer.rb
498
611
  - lib/ddtrace/contrib/racecar/configuration/settings.rb
499
612
  - lib/ddtrace/contrib/racecar/event.rb
500
613
  - lib/ddtrace/contrib/racecar/events.rb
501
614
  - lib/ddtrace/contrib/racecar/events/batch.rb
615
+ - lib/ddtrace/contrib/racecar/events/consume.rb
502
616
  - lib/ddtrace/contrib/racecar/events/message.rb
503
617
  - lib/ddtrace/contrib/racecar/ext.rb
504
618
  - lib/ddtrace/contrib/racecar/integration.rb
@@ -513,6 +627,7 @@ files:
513
627
  - lib/ddtrace/contrib/rails/ext.rb
514
628
  - lib/ddtrace/contrib/rails/framework.rb
515
629
  - lib/ddtrace/contrib/rails/integration.rb
630
+ - lib/ddtrace/contrib/rails/log_injection.rb
516
631
  - lib/ddtrace/contrib/rails/middlewares.rb
517
632
  - lib/ddtrace/contrib/rails/patcher.rb
518
633
  - lib/ddtrace/contrib/rails/railtie.rb
@@ -569,6 +684,11 @@ files:
569
684
  - lib/ddtrace/contrib/sinatra/patcher.rb
570
685
  - lib/ddtrace/contrib/sinatra/tracer.rb
571
686
  - lib/ddtrace/contrib/sinatra/tracer_middleware.rb
687
+ - lib/ddtrace/contrib/sneakers/configuration/settings.rb
688
+ - lib/ddtrace/contrib/sneakers/ext.rb
689
+ - lib/ddtrace/contrib/sneakers/integration.rb
690
+ - lib/ddtrace/contrib/sneakers/patcher.rb
691
+ - lib/ddtrace/contrib/sneakers/tracer.rb
572
692
  - lib/ddtrace/contrib/sucker_punch/configuration/settings.rb
573
693
  - lib/ddtrace/contrib/sucker_punch/exception_handler.rb
574
694
  - lib/ddtrace/contrib/sucker_punch/ext.rb
@@ -576,6 +696,7 @@ files:
576
696
  - lib/ddtrace/contrib/sucker_punch/integration.rb
577
697
  - lib/ddtrace/contrib/sucker_punch/patcher.rb
578
698
  - lib/ddtrace/correlation.rb
699
+ - lib/ddtrace/diagnostics/environment_logger.rb
579
700
  - lib/ddtrace/diagnostics/health.rb
580
701
  - lib/ddtrace/distributed_tracing/headers/b3.rb
581
702
  - lib/ddtrace/distributed_tracing/headers/b3_single.rb
@@ -713,8 +834,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
713
834
  - !ruby/object:Gem::Version
714
835
  version: 2.0.0
715
836
  requirements: []
716
- rubyforge_project:
717
- rubygems_version: 2.7.6.2
837
+ rubygems_version: 3.0.3
718
838
  signing_key:
719
839
  specification_version: 4
720
840
  summary: Datadog tracing code for your Ruby applications