ddtrace 0.37.0 → 0.42.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (186) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +56 -0
  3. data/.gitignore +2 -0
  4. data/.gitlab-ci.yml +1 -0
  5. data/.simplecov +38 -0
  6. data/Appraisals +186 -11
  7. data/CHANGELOG.md +188 -1
  8. data/CONTRIBUTING.md +1 -1
  9. data/Rakefile +518 -482
  10. data/ddtrace.gemspec +3 -0
  11. data/docker-compose.yml +2 -2
  12. data/docs/DevelopmentGuide.md +26 -0
  13. data/docs/GettingStarted.md +188 -78
  14. data/lib/ddtrace.rb +4 -0
  15. data/lib/ddtrace/buffer.rb +259 -52
  16. data/lib/ddtrace/configuration.rb +39 -5
  17. data/lib/ddtrace/configuration/components.rb +4 -7
  18. data/lib/ddtrace/configuration/options.rb +3 -1
  19. data/lib/ddtrace/configuration/settings.rb +32 -4
  20. data/lib/ddtrace/context_provider.rb +6 -5
  21. data/lib/ddtrace/contrib/action_cable/configuration/settings.rb +7 -2
  22. data/lib/ddtrace/contrib/action_cable/ext.rb +5 -2
  23. data/lib/ddtrace/contrib/action_pack/configuration/settings.rb +7 -2
  24. data/lib/ddtrace/contrib/action_pack/ext.rb +5 -2
  25. data/lib/ddtrace/contrib/action_view/configuration/settings.rb +7 -2
  26. data/lib/ddtrace/contrib/action_view/ext.rb +5 -2
  27. data/lib/ddtrace/contrib/active_model_serializers/configuration/settings.rb +7 -2
  28. data/lib/ddtrace/contrib/active_model_serializers/ext.rb +5 -2
  29. data/lib/ddtrace/contrib/active_record/configuration/settings.rb +7 -2
  30. data/lib/ddtrace/contrib/active_record/events/sql.rb +4 -0
  31. data/lib/ddtrace/contrib/active_record/ext.rb +5 -2
  32. data/lib/ddtrace/contrib/active_support/configuration/settings.rb +7 -2
  33. data/lib/ddtrace/contrib/active_support/ext.rb +5 -2
  34. data/lib/ddtrace/contrib/active_support/notifications/subscription.rb +3 -3
  35. data/lib/ddtrace/contrib/aws/configuration/settings.rb +7 -2
  36. data/lib/ddtrace/contrib/aws/ext.rb +5 -2
  37. data/lib/ddtrace/contrib/aws/instrumentation.rb +4 -0
  38. data/lib/ddtrace/contrib/concurrent_ruby/configuration/settings.rb +5 -0
  39. data/lib/ddtrace/contrib/concurrent_ruby/ext.rb +1 -0
  40. data/lib/ddtrace/contrib/configuration/settings.rb +1 -0
  41. data/lib/ddtrace/contrib/dalli/configuration/settings.rb +7 -2
  42. data/lib/ddtrace/contrib/dalli/ext.rb +5 -2
  43. data/lib/ddtrace/contrib/dalli/instrumentation.rb +4 -0
  44. data/lib/ddtrace/contrib/delayed_job/configuration/settings.rb +8 -2
  45. data/lib/ddtrace/contrib/delayed_job/ext.rb +7 -2
  46. data/lib/ddtrace/contrib/delayed_job/plugin.rb +37 -15
  47. data/lib/ddtrace/contrib/elasticsearch/configuration/settings.rb +7 -2
  48. data/lib/ddtrace/contrib/elasticsearch/ext.rb +5 -2
  49. data/lib/ddtrace/contrib/elasticsearch/patcher.rb +4 -0
  50. data/lib/ddtrace/contrib/ethon/configuration/settings.rb +7 -2
  51. data/lib/ddtrace/contrib/ethon/easy_patch.rb +4 -2
  52. data/lib/ddtrace/contrib/ethon/ext.rb +5 -2
  53. data/lib/ddtrace/contrib/ethon/multi_patch.rb +4 -0
  54. data/lib/ddtrace/contrib/excon/configuration/settings.rb +7 -2
  55. data/lib/ddtrace/contrib/excon/ext.rb +5 -2
  56. data/lib/ddtrace/contrib/excon/middleware.rb +4 -0
  57. data/lib/ddtrace/contrib/extensions.rb +11 -1
  58. data/lib/ddtrace/contrib/faraday/configuration/settings.rb +7 -2
  59. data/lib/ddtrace/contrib/faraday/ext.rb +5 -2
  60. data/lib/ddtrace/contrib/faraday/middleware.rb +9 -3
  61. data/lib/ddtrace/contrib/faraday/patcher.rb +12 -0
  62. data/lib/ddtrace/contrib/grape/configuration/settings.rb +7 -3
  63. data/lib/ddtrace/contrib/grape/endpoint.rb +6 -4
  64. data/lib/ddtrace/contrib/grape/ext.rb +5 -2
  65. data/lib/ddtrace/contrib/graphql/configuration/settings.rb +7 -2
  66. data/lib/ddtrace/contrib/graphql/ext.rb +5 -2
  67. data/lib/ddtrace/contrib/grpc/configuration/settings.rb +7 -2
  68. data/lib/ddtrace/contrib/grpc/datadog_interceptor/client.rb +6 -4
  69. data/lib/ddtrace/contrib/grpc/datadog_interceptor/server.rb +4 -0
  70. data/lib/ddtrace/contrib/grpc/ext.rb +5 -2
  71. data/lib/ddtrace/contrib/http/configuration/settings.rb +7 -2
  72. data/lib/ddtrace/contrib/http/ext.rb +5 -2
  73. data/lib/ddtrace/contrib/http/instrumentation.rb +4 -0
  74. data/lib/ddtrace/contrib/httprb/configuration/settings.rb +32 -0
  75. data/lib/ddtrace/contrib/httprb/ext.rb +17 -0
  76. data/lib/ddtrace/contrib/httprb/instrumentation.rb +163 -0
  77. data/lib/ddtrace/contrib/httprb/integration.rb +43 -0
  78. data/lib/ddtrace/contrib/httprb/patcher.rb +35 -0
  79. data/lib/ddtrace/contrib/kafka/configuration/settings.rb +30 -0
  80. data/lib/ddtrace/contrib/kafka/consumer_event.rb +14 -0
  81. data/lib/ddtrace/contrib/kafka/consumer_group_event.rb +14 -0
  82. data/lib/ddtrace/contrib/kafka/event.rb +51 -0
  83. data/lib/ddtrace/contrib/kafka/events.rb +44 -0
  84. data/lib/ddtrace/contrib/kafka/events/connection/request.rb +34 -0
  85. data/lib/ddtrace/contrib/kafka/events/consumer/process_batch.rb +41 -0
  86. data/lib/ddtrace/contrib/kafka/events/consumer/process_message.rb +39 -0
  87. data/lib/ddtrace/contrib/kafka/events/consumer_group/heartbeat.rb +39 -0
  88. data/lib/ddtrace/contrib/kafka/events/consumer_group/join_group.rb +29 -0
  89. data/lib/ddtrace/contrib/kafka/events/consumer_group/leave_group.rb +29 -0
  90. data/lib/ddtrace/contrib/kafka/events/consumer_group/sync_group.rb +29 -0
  91. data/lib/ddtrace/contrib/kafka/events/produce_operation/send_messages.rb +32 -0
  92. data/lib/ddtrace/contrib/kafka/events/producer/deliver_messages.rb +35 -0
  93. data/lib/ddtrace/contrib/kafka/ext.rb +41 -0
  94. data/lib/ddtrace/contrib/kafka/integration.rb +39 -0
  95. data/lib/ddtrace/contrib/kafka/patcher.rb +26 -0
  96. data/lib/ddtrace/contrib/mongodb/configuration/settings.rb +7 -2
  97. data/lib/ddtrace/contrib/mongodb/ext.rb +5 -2
  98. data/lib/ddtrace/contrib/mongodb/subscribers.rb +4 -0
  99. data/lib/ddtrace/contrib/mysql2/configuration/settings.rb +7 -2
  100. data/lib/ddtrace/contrib/mysql2/ext.rb +5 -2
  101. data/lib/ddtrace/contrib/mysql2/instrumentation.rb +4 -0
  102. data/lib/ddtrace/contrib/presto/configuration/settings.rb +7 -2
  103. data/lib/ddtrace/contrib/presto/ext.rb +5 -2
  104. data/lib/ddtrace/contrib/presto/instrumentation.rb +3 -0
  105. data/lib/ddtrace/contrib/que/configuration/settings.rb +42 -0
  106. data/lib/ddtrace/contrib/que/ext.rb +30 -0
  107. data/lib/ddtrace/contrib/que/integration.rb +42 -0
  108. data/lib/ddtrace/contrib/que/patcher.rb +24 -0
  109. data/lib/ddtrace/contrib/que/tracer.rb +56 -0
  110. data/lib/ddtrace/contrib/racecar/configuration/settings.rb +7 -2
  111. data/lib/ddtrace/contrib/racecar/event.rb +4 -0
  112. data/lib/ddtrace/contrib/racecar/events.rb +2 -0
  113. data/lib/ddtrace/contrib/racecar/events/consume.rb +27 -0
  114. data/lib/ddtrace/contrib/racecar/ext.rb +6 -2
  115. data/lib/ddtrace/contrib/rack/configuration/settings.rb +7 -2
  116. data/lib/ddtrace/contrib/rack/ext.rb +5 -2
  117. data/lib/ddtrace/contrib/rack/middlewares.rb +17 -12
  118. data/lib/ddtrace/contrib/rails/configuration/settings.rb +12 -2
  119. data/lib/ddtrace/contrib/rails/ext.rb +6 -2
  120. data/lib/ddtrace/contrib/rails/log_injection.rb +81 -0
  121. data/lib/ddtrace/contrib/rails/middlewares.rb +7 -2
  122. data/lib/ddtrace/contrib/rails/patcher.rb +26 -0
  123. data/lib/ddtrace/contrib/rake/configuration/settings.rb +7 -3
  124. data/lib/ddtrace/contrib/rake/ext.rb +5 -2
  125. data/lib/ddtrace/contrib/redis/configuration/settings.rb +7 -2
  126. data/lib/ddtrace/contrib/redis/ext.rb +5 -2
  127. data/lib/ddtrace/contrib/redis/tags.rb +4 -0
  128. data/lib/ddtrace/contrib/resque/configuration/settings.rb +7 -2
  129. data/lib/ddtrace/contrib/resque/ext.rb +5 -2
  130. data/lib/ddtrace/contrib/resque/integration.rb +1 -1
  131. data/lib/ddtrace/contrib/rest_client/configuration/settings.rb +7 -2
  132. data/lib/ddtrace/contrib/rest_client/ext.rb +5 -2
  133. data/lib/ddtrace/contrib/rest_client/request_patch.rb +6 -2
  134. data/lib/ddtrace/contrib/sequel/configuration/settings.rb +7 -2
  135. data/lib/ddtrace/contrib/sequel/database.rb +3 -1
  136. data/lib/ddtrace/contrib/sequel/dataset.rb +3 -2
  137. data/lib/ddtrace/contrib/sequel/ext.rb +6 -2
  138. data/lib/ddtrace/contrib/sequel/utils.rb +35 -6
  139. data/lib/ddtrace/contrib/shoryuken/configuration/settings.rb +7 -2
  140. data/lib/ddtrace/contrib/shoryuken/ext.rb +5 -2
  141. data/lib/ddtrace/contrib/sidekiq/configuration/settings.rb +7 -2
  142. data/lib/ddtrace/contrib/sidekiq/ext.rb +6 -2
  143. data/lib/ddtrace/contrib/sidekiq/patcher.rb +8 -1
  144. data/lib/ddtrace/contrib/sidekiq/server_tracer.rb +1 -0
  145. data/lib/ddtrace/contrib/sinatra/configuration/settings.rb +7 -2
  146. data/lib/ddtrace/contrib/sinatra/env.rb +5 -4
  147. data/lib/ddtrace/contrib/sinatra/ext.rb +5 -2
  148. data/lib/ddtrace/contrib/sinatra/tracer.rb +21 -42
  149. data/lib/ddtrace/contrib/sinatra/tracer_middleware.rb +50 -23
  150. data/lib/ddtrace/contrib/sneakers/configuration/settings.rb +32 -0
  151. data/lib/ddtrace/contrib/sneakers/ext.rb +22 -0
  152. data/lib/ddtrace/contrib/sneakers/integration.rb +41 -0
  153. data/lib/ddtrace/contrib/sneakers/patcher.rb +24 -0
  154. data/lib/ddtrace/contrib/sneakers/tracer.rb +58 -0
  155. data/lib/ddtrace/contrib/sucker_punch/configuration/settings.rb +7 -2
  156. data/lib/ddtrace/contrib/sucker_punch/ext.rb +5 -2
  157. data/lib/ddtrace/diagnostics/environment_logger.rb +278 -0
  158. data/lib/ddtrace/environment.rb +17 -3
  159. data/lib/ddtrace/ext/diagnostics.rb +3 -0
  160. data/lib/ddtrace/ext/environment.rb +2 -0
  161. data/lib/ddtrace/ext/integration.rb +8 -0
  162. data/lib/ddtrace/ext/runtime.rb +1 -0
  163. data/lib/ddtrace/ext/transport.rb +1 -0
  164. data/lib/ddtrace/logger.rb +1 -1
  165. data/lib/ddtrace/opentracer/distributed_headers.rb +1 -1
  166. data/lib/ddtrace/pipeline/span_filter.rb +15 -15
  167. data/lib/ddtrace/propagation/grpc_propagator.rb +18 -6
  168. data/lib/ddtrace/runtime/metrics.rb +24 -6
  169. data/lib/ddtrace/sampler.rb +4 -2
  170. data/lib/ddtrace/span.rb +162 -27
  171. data/lib/ddtrace/tracer.rb +24 -18
  172. data/lib/ddtrace/transport/http.rb +15 -0
  173. data/lib/ddtrace/transport/http/adapters/net.rb +16 -2
  174. data/lib/ddtrace/transport/http/adapters/test.rb +6 -0
  175. data/lib/ddtrace/transport/http/adapters/unix_socket.rb +4 -0
  176. data/lib/ddtrace/transport/http/statistics.rb +14 -1
  177. data/lib/ddtrace/transport/response.rb +11 -0
  178. data/lib/ddtrace/transport/traces.rb +7 -2
  179. data/lib/ddtrace/utils.rb +7 -3
  180. data/lib/ddtrace/version.rb +1 -1
  181. data/lib/ddtrace/workers/async.rb +2 -2
  182. data/lib/ddtrace/workers/loop.rb +1 -1
  183. data/lib/ddtrace/workers/polling.rb +1 -1
  184. data/lib/ddtrace/workers/trace_writer.rb +3 -0
  185. data/lib/ddtrace/writer.rb +33 -12
  186. metadata +81 -2
@@ -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)
@@ -20,8 +20,14 @@ module Datadog
20
20
  end
21
21
 
22
22
  def open
23
- # Open connection
24
- ::Net::HTTP.start(hostname, port, open_timeout: timeout, read_timeout: timeout) do |http|
23
+ # DEV Initializing +Net::HTTP+ directly help us avoid expensive
24
+ # options processing done in +Net::HTTP.start+:
25
+ # https://github.com/ruby/ruby/blob/b2d96abb42abbe2e01f010ffc9ac51f0f9a50002/lib/net/http.rb#L614-L618
26
+ req = ::Net::HTTP.new(hostname, port, nil)
27
+
28
+ req.open_timeout = req.read_timeout = timeout
29
+
30
+ req.start do |http|
25
31
  yield(http)
26
32
  end
27
33
  end
@@ -47,6 +53,10 @@ module Datadog
47
53
  Response.new(http_response)
48
54
  end
49
55
 
56
+ def url
57
+ "http://#{hostname}:#{port}?timeout=#{timeout}"
58
+ end
59
+
50
60
  # Raised when called with an unknown HTTP method
51
61
  class UnknownHTTPMethod < StandardError
52
62
  attr_reader :verb
@@ -104,6 +114,10 @@ module Datadog
104
114
  return super if http_response.nil?
105
115
  code.between?(500, 599)
106
116
  end
117
+
118
+ def inspect
119
+ "#{super}, http_response:#{http_response}"
120
+ end
107
121
  end
108
122
  end
109
123
  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
@@ -18,11 +18,24 @@ module Datadog
18
18
  # Add status code tag to api.responses metric
19
19
  if metrics.key?(:api_responses)
20
20
  (metrics[:api_responses].options[:tags] ||= []).tap do |tags|
21
- tags << "status_code:#{response.code}"
21
+ tags << metrics_tag_value(response.code)
22
22
  end
23
23
  end
24
24
  end
25
25
  end
26
+
27
+ private
28
+
29
+ # The most common status code on a healthy tracer
30
+ STATUS_CODE_200 = 'status_code:200'.freeze
31
+
32
+ def metrics_tag_value(status_code)
33
+ if status_code == 200
34
+ STATUS_CODE_200 # DEV Saves string concatenation/creation for common case
35
+ else
36
+ "status_code:#{status_code}"
37
+ end
38
+ end
26
39
  end
27
40
  end
28
41
  end
@@ -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
@@ -57,7 +57,12 @@ module Datadog
57
57
  # @return [Enumerable[Array[Bytes,Integer]]] list of encoded chunks: each containing a byte array and
58
58
  # number of traces
59
59
  def encode_in_chunks(traces)
60
- encoded_traces = traces.map { |t| encode_one(t) }.reject(&:nil?)
60
+ encoded_traces = if traces.respond_to?(:filter_map)
61
+ # DEV Supported since Ruby 2.7, saves an intermediate object creation
62
+ traces.filter_map { |t| encode_one(t) }
63
+ else
64
+ traces.map { |t| encode_one(t) }.reject(&:nil?)
65
+ end
61
66
 
62
67
  Datadog::Chunker.chunk_by_size(encoded_traces, max_size).map do |chunk|
63
68
  [encoder.join(chunk), chunk.size]
@@ -86,7 +91,7 @@ module Datadog
86
91
  module_function
87
92
 
88
93
  def encode_trace(encoder, trace)
89
- encoder.encode(trace.map(&:to_hash))
94
+ encoder.encode(trace)
90
95
  end
91
96
  end
92
97
 
@@ -3,7 +3,7 @@ require 'ddtrace/utils/database'
3
3
  module Datadog
4
4
  # Utils contains low-level utilities, typically to provide pseudo-random trace IDs.
5
5
  module Utils
6
- STRING_PLACEHOLDER = ''.encode(::Encoding::UTF_8).freeze
6
+ EMPTY_STRING = ''.encode(::Encoding::UTF_8).freeze
7
7
  # We use a custom random number generator because we want no interference
8
8
  # with the default one. Using the default prng, we could break code that
9
9
  # would rely on srand/rand sequences.
@@ -12,7 +12,7 @@ module Datadog
12
12
  def self.next_id
13
13
  reset! if was_forked?
14
14
 
15
- @rnd.rand(Datadog::Span::MAX_ID)
15
+ @rnd.rand(Datadog::Span::RUBY_MAX_ID)
16
16
  end
17
17
 
18
18
  def self.reset!
@@ -53,13 +53,17 @@ module Datadog
53
53
  str.encode('UTF-8', 'binary', invalid: :replace, undef: :replace, replace: '')
54
54
  elsif str.encoding == ::Encoding::UTF_8
55
55
  str
56
+ elsif str.empty?
57
+ # DEV Optimization as `nil.to_s` is a very common source for an empty string,
58
+ # DEV but it comes encoded as US_ASCII.
59
+ EMPTY_STRING
56
60
  else
57
61
  str.encode(::Encoding::UTF_8)
58
62
  end
59
63
  rescue => e
60
64
  Datadog.logger.debug("Error encoding string in UTF-8: #{e}")
61
65
 
62
- options.fetch(:placeholder, STRING_PLACEHOLDER)
66
+ options.fetch(:placeholder, EMPTY_STRING)
63
67
  end
64
68
  end
65
69
  end
@@ -1,7 +1,7 @@
1
1
  module Datadog
2
2
  module VERSION
3
3
  MAJOR = 0
4
- MINOR = 37
4
+ MINOR = 42
5
5
  PATCH = 0
6
6
  PRE = nil
7
7
 
@@ -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.37.0
4
+ version: 0.42.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-06-24 00:00:00.000000000 Z
11
+ date: 2020-10-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: msgpack
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: 0.4.1
55
+ - !ruby/object:Gem::Dependency
56
+ name: concurrent-ruby
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: rake
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -108,6 +122,20 @@ dependencies:
108
122
  - - "~>"
109
123
  - !ruby/object:Gem::Version
110
124
  version: '1.1'
125
+ - !ruby/object:Gem::Dependency
126
+ name: ruby-prof
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '1.4'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '1.4'
111
139
  - !ruby/object:Gem::Dependency
112
140
  name: minitest
113
141
  requirement: !ruby/object:Gem::Requirement
@@ -332,6 +360,20 @@ dependencies:
332
360
  - - "~>"
333
361
  - !ruby/object:Gem::Version
334
362
  version: 0.4.9.2
363
+ - !ruby/object:Gem::Dependency
364
+ name: simplecov
365
+ requirement: !ruby/object:Gem::Requirement
366
+ requirements:
367
+ - - "~>"
368
+ - !ruby/object:Gem::Version
369
+ version: '0.17'
370
+ type: :development
371
+ prerelease: false
372
+ version_requirements: !ruby/object:Gem::Requirement
373
+ requirements:
374
+ - - "~>"
375
+ - !ruby/object:Gem::Version
376
+ version: '0.17'
335
377
  - !ruby/object:Gem::Dependency
336
378
  name: warning
337
379
  requirement: !ruby/object:Gem::Requirement
@@ -373,6 +415,7 @@ files:
373
415
  - ".gitlab-ci.yml"
374
416
  - ".rspec"
375
417
  - ".rubocop.yml"
418
+ - ".simplecov"
376
419
  - ".yardopts"
377
420
  - Appraisals
378
421
  - CHANGELOG.md
@@ -546,7 +589,29 @@ files:
546
589
  - lib/ddtrace/contrib/http/integration.rb
547
590
  - lib/ddtrace/contrib/http/patcher.rb
548
591
  - lib/ddtrace/contrib/http_annotation_helper.rb
592
+ - lib/ddtrace/contrib/httprb/configuration/settings.rb
593
+ - lib/ddtrace/contrib/httprb/ext.rb
594
+ - lib/ddtrace/contrib/httprb/instrumentation.rb
595
+ - lib/ddtrace/contrib/httprb/integration.rb
596
+ - lib/ddtrace/contrib/httprb/patcher.rb
549
597
  - lib/ddtrace/contrib/integration.rb
598
+ - lib/ddtrace/contrib/kafka/configuration/settings.rb
599
+ - lib/ddtrace/contrib/kafka/consumer_event.rb
600
+ - lib/ddtrace/contrib/kafka/consumer_group_event.rb
601
+ - lib/ddtrace/contrib/kafka/event.rb
602
+ - lib/ddtrace/contrib/kafka/events.rb
603
+ - lib/ddtrace/contrib/kafka/events/connection/request.rb
604
+ - lib/ddtrace/contrib/kafka/events/consumer/process_batch.rb
605
+ - lib/ddtrace/contrib/kafka/events/consumer/process_message.rb
606
+ - lib/ddtrace/contrib/kafka/events/consumer_group/heartbeat.rb
607
+ - lib/ddtrace/contrib/kafka/events/consumer_group/join_group.rb
608
+ - lib/ddtrace/contrib/kafka/events/consumer_group/leave_group.rb
609
+ - lib/ddtrace/contrib/kafka/events/consumer_group/sync_group.rb
610
+ - lib/ddtrace/contrib/kafka/events/produce_operation/send_messages.rb
611
+ - lib/ddtrace/contrib/kafka/events/producer/deliver_messages.rb
612
+ - lib/ddtrace/contrib/kafka/ext.rb
613
+ - lib/ddtrace/contrib/kafka/integration.rb
614
+ - lib/ddtrace/contrib/kafka/patcher.rb
550
615
  - lib/ddtrace/contrib/mongodb/configuration/settings.rb
551
616
  - lib/ddtrace/contrib/mongodb/ext.rb
552
617
  - lib/ddtrace/contrib/mongodb/instrumentation.rb
@@ -566,10 +631,16 @@ files:
566
631
  - lib/ddtrace/contrib/presto/instrumentation.rb
567
632
  - lib/ddtrace/contrib/presto/integration.rb
568
633
  - lib/ddtrace/contrib/presto/patcher.rb
634
+ - lib/ddtrace/contrib/que/configuration/settings.rb
635
+ - lib/ddtrace/contrib/que/ext.rb
636
+ - lib/ddtrace/contrib/que/integration.rb
637
+ - lib/ddtrace/contrib/que/patcher.rb
638
+ - lib/ddtrace/contrib/que/tracer.rb
569
639
  - lib/ddtrace/contrib/racecar/configuration/settings.rb
570
640
  - lib/ddtrace/contrib/racecar/event.rb
571
641
  - lib/ddtrace/contrib/racecar/events.rb
572
642
  - lib/ddtrace/contrib/racecar/events/batch.rb
643
+ - lib/ddtrace/contrib/racecar/events/consume.rb
573
644
  - lib/ddtrace/contrib/racecar/events/message.rb
574
645
  - lib/ddtrace/contrib/racecar/ext.rb
575
646
  - lib/ddtrace/contrib/racecar/integration.rb
@@ -584,6 +655,7 @@ files:
584
655
  - lib/ddtrace/contrib/rails/ext.rb
585
656
  - lib/ddtrace/contrib/rails/framework.rb
586
657
  - lib/ddtrace/contrib/rails/integration.rb
658
+ - lib/ddtrace/contrib/rails/log_injection.rb
587
659
  - lib/ddtrace/contrib/rails/middlewares.rb
588
660
  - lib/ddtrace/contrib/rails/patcher.rb
589
661
  - lib/ddtrace/contrib/rails/railtie.rb
@@ -640,6 +712,11 @@ files:
640
712
  - lib/ddtrace/contrib/sinatra/patcher.rb
641
713
  - lib/ddtrace/contrib/sinatra/tracer.rb
642
714
  - lib/ddtrace/contrib/sinatra/tracer_middleware.rb
715
+ - lib/ddtrace/contrib/sneakers/configuration/settings.rb
716
+ - lib/ddtrace/contrib/sneakers/ext.rb
717
+ - lib/ddtrace/contrib/sneakers/integration.rb
718
+ - lib/ddtrace/contrib/sneakers/patcher.rb
719
+ - lib/ddtrace/contrib/sneakers/tracer.rb
643
720
  - lib/ddtrace/contrib/sucker_punch/configuration/settings.rb
644
721
  - lib/ddtrace/contrib/sucker_punch/exception_handler.rb
645
722
  - lib/ddtrace/contrib/sucker_punch/ext.rb
@@ -647,6 +724,7 @@ files:
647
724
  - lib/ddtrace/contrib/sucker_punch/integration.rb
648
725
  - lib/ddtrace/contrib/sucker_punch/patcher.rb
649
726
  - lib/ddtrace/correlation.rb
727
+ - lib/ddtrace/diagnostics/environment_logger.rb
650
728
  - lib/ddtrace/diagnostics/health.rb
651
729
  - lib/ddtrace/distributed_tracing/headers/b3.rb
652
730
  - lib/ddtrace/distributed_tracing/headers/b3_single.rb
@@ -666,6 +744,7 @@ files:
666
744
  - lib/ddtrace/ext/errors.rb
667
745
  - lib/ddtrace/ext/forced_tracing.rb
668
746
  - lib/ddtrace/ext/http.rb
747
+ - lib/ddtrace/ext/integration.rb
669
748
  - lib/ddtrace/ext/manual_tracing.rb
670
749
  - lib/ddtrace/ext/metrics.rb
671
750
  - lib/ddtrace/ext/net.rb