ddtrace 0.28.0 → 0.29.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 (86) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +8 -0
  3. data/Appraisals +57 -2
  4. data/CHANGELOG.md +41 -12
  5. data/Rakefile +3 -3
  6. data/ddtrace.gemspec +2 -1
  7. data/docs/DevelopmentGuide.md +1 -1
  8. data/docs/GettingStarted.md +6 -6
  9. data/lib/ddtrace.rb +7 -0
  10. data/lib/ddtrace/buffer.rb +60 -1
  11. data/lib/ddtrace/configuration/base.rb +82 -0
  12. data/lib/ddtrace/configuration/option.rb +28 -5
  13. data/lib/ddtrace/configuration/option_definition.rb +100 -0
  14. data/lib/ddtrace/configuration/options.rb +28 -14
  15. data/lib/ddtrace/configuration/settings.rb +77 -64
  16. data/lib/ddtrace/contrib/action_pack/configuration/settings.rb +9 -7
  17. data/lib/ddtrace/contrib/action_view/configuration/settings.rb +8 -6
  18. data/lib/ddtrace/contrib/active_model_serializers/configuration/settings.rb +8 -14
  19. data/lib/ddtrace/contrib/active_model_serializers/event.rb +1 -1
  20. data/lib/ddtrace/contrib/active_record/configuration/settings.rb +11 -16
  21. data/lib/ddtrace/contrib/active_record/event.rb +1 -1
  22. data/lib/ddtrace/contrib/active_support/configuration/settings.rb +8 -6
  23. data/lib/ddtrace/contrib/active_support/notifications/subscriber.rb +2 -2
  24. data/lib/ddtrace/contrib/active_support/notifications/subscription.rb +4 -1
  25. data/lib/ddtrace/contrib/aws/configuration/settings.rb +8 -6
  26. data/lib/ddtrace/contrib/configuration/settings.rb +5 -11
  27. data/lib/ddtrace/contrib/dalli/configuration/settings.rb +8 -6
  28. data/lib/ddtrace/contrib/dalli/instrumentation.rb +1 -18
  29. data/lib/ddtrace/contrib/delayed_job/configuration/settings.rb +8 -6
  30. data/lib/ddtrace/contrib/elasticsearch/configuration/settings.rb +8 -6
  31. data/lib/ddtrace/contrib/ethon/configuration/settings.rb +8 -6
  32. data/lib/ddtrace/contrib/ethon/integration.rb +0 -4
  33. data/lib/ddtrace/contrib/excon/configuration/settings.rb +9 -7
  34. data/lib/ddtrace/contrib/excon/middleware.rb +1 -1
  35. data/lib/ddtrace/contrib/faraday/configuration/settings.rb +8 -6
  36. data/lib/ddtrace/contrib/faraday/middleware.rb +1 -1
  37. data/lib/ddtrace/contrib/faraday/patcher.rb +8 -2
  38. data/lib/ddtrace/contrib/faraday/rack_builder.rb +18 -0
  39. data/lib/ddtrace/contrib/grape/configuration/settings.rb +8 -6
  40. data/lib/ddtrace/contrib/grape/instrumentation.rb +2 -42
  41. data/lib/ddtrace/contrib/graphql/configuration/settings.rb +8 -6
  42. data/lib/ddtrace/contrib/grpc/configuration/settings.rb +8 -6
  43. data/lib/ddtrace/contrib/grpc/integration.rb +1 -3
  44. data/lib/ddtrace/contrib/http/configuration/settings.rb +8 -6
  45. data/lib/ddtrace/contrib/http/instrumentation.rb +1 -23
  46. data/lib/ddtrace/contrib/mongodb/configuration/settings.rb +8 -6
  47. data/lib/ddtrace/contrib/mysql2/configuration/settings.rb +8 -6
  48. data/lib/ddtrace/contrib/mysql2/instrumentation.rb +1 -23
  49. data/lib/ddtrace/contrib/patchable.rb +1 -1
  50. data/lib/ddtrace/contrib/racecar/configuration/settings.rb +8 -14
  51. data/lib/ddtrace/contrib/racecar/event.rb +1 -1
  52. data/lib/ddtrace/contrib/rack/configuration/settings.rb +8 -6
  53. data/lib/ddtrace/contrib/rack/request_queue.rb +7 -6
  54. data/lib/ddtrace/contrib/rails/configuration/settings.rb +30 -21
  55. data/lib/ddtrace/contrib/rake/configuration/settings.rb +8 -6
  56. data/lib/ddtrace/contrib/rake/integration.rb +0 -4
  57. data/lib/ddtrace/contrib/redis/configuration/settings.rb +8 -6
  58. data/lib/ddtrace/contrib/resque/configuration/settings.rb +8 -6
  59. data/lib/ddtrace/contrib/rest_client/configuration/settings.rb +8 -6
  60. data/lib/ddtrace/contrib/rest_client/integration.rb +0 -4
  61. data/lib/ddtrace/contrib/rest_client/request_patch.rb +1 -18
  62. data/lib/ddtrace/contrib/sequel/configuration/settings.rb +8 -6
  63. data/lib/ddtrace/contrib/sequel/integration.rb +0 -4
  64. data/lib/ddtrace/contrib/shoryuken/configuration/settings.rb +8 -6
  65. data/lib/ddtrace/contrib/sidekiq/configuration/settings.rb +8 -6
  66. data/lib/ddtrace/contrib/sinatra/configuration/settings.rb +8 -6
  67. data/lib/ddtrace/contrib/sucker_punch/configuration/settings.rb +8 -6
  68. data/lib/ddtrace/diagnostics/health.rb +30 -0
  69. data/lib/ddtrace/distributed_tracing/headers/datadog.rb +1 -1
  70. data/lib/ddtrace/distributed_tracing/headers/headers.rb +2 -0
  71. data/lib/ddtrace/ext/diagnostics.rb +25 -0
  72. data/lib/ddtrace/ext/runtime.rb +1 -7
  73. data/lib/ddtrace/metrics.rb +89 -6
  74. data/lib/ddtrace/propagation/http_propagator.rb +2 -2
  75. data/lib/ddtrace/runtime/class_count.rb +3 -3
  76. data/lib/ddtrace/runtime/object_space.rb +19 -0
  77. data/lib/ddtrace/span.rb +1 -1
  78. data/lib/ddtrace/tracer.rb +5 -4
  79. data/lib/ddtrace/transport/http/client.rb +3 -4
  80. data/lib/ddtrace/transport/http/response.rb +4 -0
  81. data/lib/ddtrace/transport/http/statistics.rb +30 -0
  82. data/lib/ddtrace/transport/statistics.rb +28 -0
  83. data/lib/ddtrace/version.rb +3 -1
  84. data/lib/ddtrace/workers.rb +4 -2
  85. data/lib/ddtrace/writer.rb +3 -3
  86. metadata +74 -54
@@ -0,0 +1,30 @@
1
+ require 'ddtrace/ext/diagnostics'
2
+ require 'ddtrace/metrics'
3
+
4
+ module Datadog
5
+ module Diagnostics
6
+ # Health-related diagnostics
7
+ module Health
8
+ # Health metrics for diagnostics
9
+ class Metrics < ::Datadog::Metrics
10
+ count :api_errors, Ext::Diagnostics::Health::Metrics::METRIC_API_ERRORS
11
+ count :api_requests, Ext::Diagnostics::Health::Metrics::METRIC_API_REQUESTS
12
+ count :api_responses, Ext::Diagnostics::Health::Metrics::METRIC_API_RESPONSES
13
+ count :queue_accepted, Ext::Diagnostics::Health::Metrics::METRIC_QUEUE_ACCEPTED
14
+ count :queue_accepted_lengths, Ext::Diagnostics::Health::Metrics::METRIC_QUEUE_ACCEPTED_LENGTHS
15
+ count :queue_dropped, Ext::Diagnostics::Health::Metrics::METRIC_QUEUE_DROPPED
16
+ gauge :queue_length, Ext::Diagnostics::Health::Metrics::METRIC_QUEUE_LENGTH
17
+ gauge :queue_max_length, Ext::Diagnostics::Health::Metrics::METRIC_QUEUE_MAX_LENGTH
18
+ gauge :queue_spans, Ext::Diagnostics::Health::Metrics::METRIC_QUEUE_SPANS
19
+ count :traces_filtered, Ext::Diagnostics::Health::Metrics::METRIC_TRACES_FILTERED
20
+ count :writer_cpu_time, Ext::Diagnostics::Health::Metrics::METRIC_WRITER_CPU_TIME
21
+ end
22
+
23
+ module_function
24
+
25
+ def metrics
26
+ Datadog.configuration.diagnostics.health_metrics
27
+ end
28
+ end
29
+ end
30
+ end
@@ -28,7 +28,7 @@ module Datadog
28
28
  # Return early if this propagation is not valid
29
29
  # DEV: To be valid we need to have a trace id and a parent id or when it is a synthetics trace, just the trace id
30
30
  # DEV: `DistributedHeaders#id` will not return 0
31
- return unless (trace_id && parent_id) || (origin == 'synthetics' && trace_id)
31
+ return unless (trace_id && parent_id) || (origin && trace_id)
32
32
 
33
33
  # Return new context
34
34
  ::Datadog::Context.new(trace_id: trace_id,
@@ -13,6 +13,8 @@ module Datadog
13
13
  @env = env
14
14
  end
15
15
 
16
+ # TODO: Don't assume Rack format.
17
+ # Make distributed tracing headers apathetic.
16
18
  def header(name)
17
19
  rack_header = "http-#{name}".upcase!.tr('-', '_')
18
20
 
@@ -0,0 +1,25 @@
1
+ module Datadog
2
+ module Ext
3
+ module Diagnostics
4
+ # Health
5
+ module Health
6
+ # Metrics
7
+ module Metrics
8
+ ENV_ENABLED = 'DD_HEALTH_METRICS_ENABLED'.freeze
9
+
10
+ METRIC_API_ERRORS = 'datadog.tracer.api.errors'.freeze
11
+ METRIC_API_REQUESTS = 'datadog.tracer.api.requests'.freeze
12
+ METRIC_API_RESPONSES = 'datadog.tracer.api.responses'.freeze
13
+ METRIC_QUEUE_ACCEPTED = 'datadog.tracer.queue.accepted'.freeze
14
+ METRIC_QUEUE_ACCEPTED_LENGTHS = 'datadog.tracer.queue.accepted_lengths'.freeze
15
+ METRIC_QUEUE_DROPPED = 'datadog.tracer.queue.dropped'.freeze
16
+ METRIC_QUEUE_LENGTH = 'datadog.tracer.queue.length'.freeze
17
+ METRIC_QUEUE_MAX_LENGTH = 'datadog.tracer.queue.max_length'.freeze
18
+ METRIC_QUEUE_SPANS = 'datadog.tracer.queue.spans'.freeze
19
+ METRIC_TRACES_FILTERED = 'datadog.tracer.traces.filtered'.freeze
20
+ METRIC_WRITER_CPU_TIME = 'datadog.tracer.writer.cpu_time'.freeze
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -5,13 +5,7 @@ module Datadog
5
5
  module Runtime
6
6
  # Identity
7
7
  LANG = 'ruby'.freeze
8
- LANG_INTERPRETER = begin
9
- if Gem::Version.new(RUBY_VERSION) > Gem::Version.new('1.9')
10
- (RUBY_ENGINE + '-' + RUBY_PLATFORM)
11
- else
12
- ('ruby-' + RUBY_PLATFORM)
13
- end
14
- end.freeze
8
+ LANG_INTERPRETER = (RUBY_ENGINE + '-' + RUBY_PLATFORM).freeze
15
9
  LANG_VERSION = RUBY_VERSION
16
10
  TRACER_VERSION = Datadog::VERSION::STRING
17
11
 
@@ -1,6 +1,7 @@
1
1
  require 'ddtrace/ext/metrics'
2
2
 
3
3
  require 'set'
4
+ require 'logger'
4
5
  require 'ddtrace/utils/time'
5
6
  require 'ddtrace/runtime/identity'
6
7
 
@@ -54,8 +55,21 @@ module Datadog
54
55
  enabled? && !statsd.nil?
55
56
  end
56
57
 
57
- def distribution(stat, value, options = nil)
58
+ def count(stat, value = nil, options = nil, &block)
59
+ return unless send_stats? && statsd.respond_to?(:count)
60
+ value, options = yield if block_given?
61
+ raise ArgumentError if value.nil?
62
+
63
+ statsd.count(stat, value, metric_options(options))
64
+ rescue StandardError => e
65
+ Datadog::Tracer.log.error("Failed to send count stat. Cause: #{e.message} Source: #{e.backtrace.first}")
66
+ end
67
+
68
+ def distribution(stat, value = nil, options = nil, &block)
58
69
  return unless send_stats? && statsd.respond_to?(:distribution)
70
+ value, options = yield if block_given?
71
+ raise ArgumentError if value.nil?
72
+
59
73
  statsd.distribution(stat, value, metric_options(options))
60
74
  rescue StandardError => e
61
75
  Datadog::Tracer.log.error("Failed to send distribution stat. Cause: #{e.message} Source: #{e.backtrace.first}")
@@ -63,13 +77,18 @@ module Datadog
63
77
 
64
78
  def increment(stat, options = nil)
65
79
  return unless send_stats? && statsd.respond_to?(:increment)
80
+ options = yield if block_given?
81
+
66
82
  statsd.increment(stat, metric_options(options))
67
83
  rescue StandardError => e
68
84
  Datadog::Tracer.log.error("Failed to send increment stat. Cause: #{e.message} Source: #{e.backtrace.first}")
69
85
  end
70
86
 
71
- def gauge(stat, value, options = nil)
87
+ def gauge(stat, value = nil, options = nil, &block)
72
88
  return unless send_stats? && statsd.respond_to?(:gauge)
89
+ value, options = yield if block_given?
90
+ raise ArgumentError if value.nil?
91
+
73
92
  statsd.gauge(stat, value, metric_options(options))
74
93
  rescue StandardError => e
75
94
  Datadog::Tracer.log.error("Failed to send gauge stat. Cause: #{e.message} Source: #{e.backtrace.first}")
@@ -92,14 +111,25 @@ module Datadog
92
111
  end
93
112
  end
94
113
 
114
+ def send_metrics(metrics)
115
+ metrics.each { |m| send(m.type, *[m.name, m.value, m.options].compact) }
116
+ end
117
+
118
+ Metric = Struct.new(:type, :name, :value, :options) do
119
+ def initialize(*args)
120
+ super
121
+ self.options = options || {}
122
+ end
123
+ end
124
+
95
125
  # For defining and adding default options to metrics
96
126
  module Options
97
127
  DEFAULT = {
98
128
  tags: DEFAULT_TAGS = [
99
- "#{Ext::Metrics::TAG_LANG}:#{Runtime::Identity.lang}".freeze
100
- # "#{Ext::Metrics::TAG_LANG_INTERPRETER}:#{Runtime::Identity.lang_interpreter}".freeze,
101
- # "#{Ext::Metrics::TAG_LANG_VERSION}:#{Runtime::Identity.lang_version}".freeze,
102
- # "#{Ext::Metrics::TAG_TRACER_VERSION}:#{Runtime::Identity.tracer_version}".freeze
129
+ "#{Ext::Metrics::TAG_LANG}:#{Runtime::Identity.lang}".freeze,
130
+ "#{Ext::Metrics::TAG_LANG_INTERPRETER}:#{Runtime::Identity.lang_interpreter}".freeze,
131
+ "#{Ext::Metrics::TAG_LANG_VERSION}:#{Runtime::Identity.lang_version}".freeze,
132
+ "#{Ext::Metrics::TAG_TRACER_VERSION}:#{Runtime::Identity.tracer_version}".freeze
103
133
  ].freeze
104
134
  }.freeze
105
135
 
@@ -125,8 +155,61 @@ module Datadog
125
155
  end
126
156
  end
127
157
 
158
+ # For defining and adding helpers to metrics
159
+ module Helpers
160
+ [
161
+ :count,
162
+ :distribution,
163
+ :increment,
164
+ :gauge,
165
+ :time
166
+ ].each do |metric_type|
167
+ define_method(metric_type) do |name, stat|
168
+ name = name.to_sym
169
+ define_method(name) do |*args, &block|
170
+ send(metric_type, stat, *args, &block)
171
+ end
172
+ end
173
+ end
174
+ end
175
+
176
+ module Logging
177
+ # Surrogate for Datadog::Statsd to log elsewhere
178
+ class Adapter
179
+ attr_accessor :logger
180
+
181
+ def initialize(logger = nil)
182
+ @logger = logger || Logger.new(STDOUT).tap do |l|
183
+ l.level = Logger::INFO
184
+ l.progname = nil
185
+ l.formatter = proc do |_severity, datetime, _progname, msg|
186
+ stat = JSON.parse(msg[3..-1]) # Trim off leading progname...
187
+ "#{JSON.dump(timestamp: datetime.to_i, message: 'Metric sent.', metric: stat)}\n"
188
+ end
189
+ end
190
+ end
191
+
192
+ def count(stat, value, options = nil)
193
+ logger.info({ stat: stat, type: :count, value: value, options: options }.to_json)
194
+ end
195
+
196
+ def distribution(stat, value, options = nil)
197
+ logger.info({ stat: stat, type: :distribution, value: value, options: options }.to_json)
198
+ end
199
+
200
+ def increment(stat, options = nil)
201
+ logger.info({ stat: stat, type: :increment, options: options }.to_json)
202
+ end
203
+
204
+ def gauge(stat, value, options = nil)
205
+ logger.info({ stat: stat, type: :gauge, value: value, options: options }.to_json)
206
+ end
207
+ end
208
+ end
209
+
128
210
  # Make available on for both class and instance.
129
211
  include Options
130
212
  extend Options
213
+ extend Helpers
131
214
  end
132
215
  end
@@ -24,7 +24,7 @@ module Datadog
24
24
  end
25
25
 
26
26
  # Inject all configured propagation styles
27
- ::Datadog.configuration.propagation_inject_style.each do |style|
27
+ ::Datadog.configuration.distributed_tracing.propagation_inject_style.each do |style|
28
28
  propagator = PROPAGATION_STYLES[style]
29
29
  propagator.inject!(context, env) unless propagator.nil?
30
30
  end
@@ -36,7 +36,7 @@ module Datadog
36
36
  context = nil
37
37
  dd_context = nil
38
38
 
39
- ::Datadog.configuration.propagation_extract_style.each do |style|
39
+ ::Datadog.configuration.distributed_tracing.propagation_extract_style.each do |style|
40
40
  propagator = PROPAGATION_STYLES[style]
41
41
  next if propagator.nil?
42
42
 
@@ -5,12 +5,12 @@ module Datadog
5
5
  module_function
6
6
 
7
7
  def value
8
- ObjectSpace.count_objects[:T_CLASS]
8
+ ::ObjectSpace.count_objects[:T_CLASS]
9
9
  end
10
10
 
11
11
  def available?
12
- ObjectSpace.respond_to?(:count_objects) \
13
- && ObjectSpace.count_objects.key?(:T_CLASS)
12
+ ::ObjectSpace.respond_to?(:count_objects) \
13
+ && ::ObjectSpace.count_objects.key?(:T_CLASS)
14
14
  end
15
15
  end
16
16
  end
@@ -0,0 +1,19 @@
1
+ require 'objspace'
2
+
3
+ module Datadog
4
+ module Runtime
5
+ # Retrieves garbage collection statistics
6
+ module ObjectSpace
7
+ module_function
8
+
9
+ def estimate_bytesize(object)
10
+ return 0 unless ::ObjectSpace.respond_to?(:memsize_of)
11
+
12
+ # Rough calculation of bytesize; not very accurate.
13
+ object.instance_variables.inject(::ObjectSpace.memsize_of(object)) do |sum, var|
14
+ sum + ::ObjectSpace.memsize_of(object.instance_variable_get(var))
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -243,7 +243,7 @@ module Datadog
243
243
 
244
244
  private
245
245
 
246
- if defined?(JRUBY_VERSION) || Gem::Version.new(RUBY_VERSION) < Gem::Version.new('2.0.0')
246
+ if defined?(JRUBY_VERSION) || Gem::Version.new(RUBY_VERSION) < Gem::Version.new(VERSION::MINIMUM_RUBY_VERSION)
247
247
  def now_allocations
248
248
  0
249
249
  end
@@ -230,9 +230,10 @@ module Datadog
230
230
  # root span
231
231
  @sampler.sample!(span)
232
232
  span.set_tag('system.pid', Process.pid)
233
- if ctx && ctx.trace_id && ctx.span_id
233
+
234
+ if ctx && ctx.trace_id
234
235
  span.trace_id = ctx.trace_id
235
- span.parent_id = ctx.span_id
236
+ span.parent_id = ctx.span_id unless ctx.span_id.nil?
236
237
  end
237
238
  else
238
239
  # child span
@@ -391,8 +392,8 @@ module Datadog
391
392
  transport_options = options.fetch(:transport_options, {})
392
393
 
393
394
  # Compile writer options
394
- rebuild_writer = false
395
- writer_options = {}
395
+ writer_options = options.fetch(:writer_options, {})
396
+ rebuild_writer = !writer_options.empty?
396
397
 
397
398
  # Re-build the sampler and writer if priority sampling is enabled,
398
399
  # but neither are configured. Verify the sampler isn't already a
@@ -1,4 +1,4 @@
1
- require 'ddtrace/transport/statistics'
1
+ require 'ddtrace/transport/http/statistics'
2
2
  require 'ddtrace/transport/http/env'
3
3
 
4
4
  module Datadog
@@ -6,7 +6,7 @@ module Datadog
6
6
  module HTTP
7
7
  # Routes, encodes, and sends tracer data to the trace agent via HTTP.
8
8
  class Client
9
- include Transport::Statistics
9
+ include Transport::HTTP::Statistics
10
10
 
11
11
  attr_reader \
12
12
  :apis,
@@ -47,8 +47,7 @@ module Datadog
47
47
  end
48
48
 
49
49
  # Update statistics
50
- stats.internal_error += 1
51
- stats.consecutive_errors += 1
50
+ update_stats_from_exception!(e)
52
51
 
53
52
  InternalErrorResponse.new(e)
54
53
  end
@@ -16,6 +16,10 @@ module Datadog
16
16
  end
17
17
 
18
18
  def_delegators :@http_response, *Transport::Response.instance_methods
19
+
20
+ def code
21
+ @http_response.respond_to?(:code) ? @http_response.code : nil
22
+ end
19
23
  end
20
24
  end
21
25
  end
@@ -0,0 +1,30 @@
1
+ require 'ddtrace/transport/statistics'
2
+
3
+ module Datadog
4
+ module Transport
5
+ module HTTP
6
+ # Tracks statistics for HTTP transports
7
+ module Statistics
8
+ def self.included(base)
9
+ base.send(:include, Transport::Statistics)
10
+ base.send(:include, InstanceMethods)
11
+ end
12
+
13
+ # Instance methods for HTTP statistics
14
+ module InstanceMethods
15
+ # Decorate metrics for HTTP responses
16
+ def metrics_for_response(response)
17
+ super.tap do |metrics|
18
+ # Add status code tag to api.responses metric
19
+ if metrics.key?(:api_responses)
20
+ (metrics[:api_responses].options[:tags] ||= []).tap do |tags|
21
+ tags << "status_code:#{response.code}"
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -1,3 +1,5 @@
1
+ require 'ddtrace/diagnostics/health'
2
+
1
3
  module Datadog
2
4
  module Transport
3
5
  # Tracks statistics for transports
@@ -16,6 +18,32 @@ module Datadog
16
18
  stats.internal_error += 1 if response.internal_error?
17
19
  stats.consecutive_errors += 1
18
20
  end
21
+
22
+ # Send health metrics
23
+ Diagnostics::Health.metrics.send_metrics(
24
+ metrics_for_response(response).values
25
+ )
26
+ end
27
+
28
+ def metrics_for_response(response)
29
+ {}.tap do |metrics|
30
+ metrics[:api_errors] = Metrics::Metric.new(:api_errors, nil, 1) if response.internal_error?
31
+ metrics[:api_responses] = Metrics::Metric.new(:api_responses, nil, 1) unless response.internal_error?
32
+ end
33
+ end
34
+
35
+ def update_stats_from_exception!(exception)
36
+ stats.internal_error += 1
37
+ stats.consecutive_errors += 1
38
+
39
+ # Send health metrics
40
+ Diagnostics::Health.metrics.send_metrics(
41
+ metrics_for_exception(exception).values
42
+ )
43
+ end
44
+
45
+ def metrics_for_exception(_exception)
46
+ { api_errors: Metrics::Metric.new(:api_errors, nil, 1) }
19
47
  end
20
48
 
21
49
  # Stat counts
@@ -1,10 +1,12 @@
1
1
  module Datadog
2
2
  module VERSION
3
3
  MAJOR = 0
4
- MINOR = 28
4
+ MINOR = 29
5
5
  PATCH = 0
6
6
  PRE = nil
7
7
 
8
8
  STRING = [MAJOR, MINOR, PATCH, PRE].compact.join('.')
9
+
10
+ MINIMUM_RUBY_VERSION = '2.0.0'.freeze
9
11
  end
10
12
  end
@@ -10,6 +10,8 @@ module Datadog
10
10
  # will perform a task at regular intervals. The thread can be stopped
11
11
  # with the +stop()+ method and can start with the +start()+ method.
12
12
  class AsyncTransport
13
+ DEFAULT_BUFFER_MAX_SIZE = 1000
14
+ DEFAULT_FLUSH_INTERVAL = 1
13
15
  DEFAULT_TIMEOUT = 5
14
16
  BACK_OFF_RATIO = 1.2
15
17
  BACK_OFF_MAX = 5
@@ -26,12 +28,12 @@ module Datadog
26
28
  @runtime_metrics_task = options[:on_runtime_metrics]
27
29
 
28
30
  # Intervals
29
- interval = options.fetch(:interval, 1)
31
+ interval = options.fetch(:interval, DEFAULT_FLUSH_INTERVAL)
30
32
  @flush_interval = interval
31
33
  @back_off = interval
32
34
 
33
35
  # Buffers
34
- buffer_size = options.fetch(:buffer_size, 100)
36
+ buffer_size = options.fetch(:buffer_size, DEFAULT_BUFFER_MAX_SIZE)
35
37
  @trace_buffer = TraceBuffer.new(buffer_size)
36
38
 
37
39
  # Threading