ddtrace 0.42.0 → 0.43.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (70) hide show
  1. checksums.yaml +5 -5
  2. data/.github/workflows/add-milestone-to-pull-requests.yml +42 -0
  3. data/.github/workflows/create-next-milestone.yml +20 -0
  4. data/.simplecov +1 -1
  5. data/Appraisals +160 -132
  6. data/CHANGELOG.md +36 -0
  7. data/CONTRIBUTING.md +1 -1
  8. data/Rakefile +39 -0
  9. data/docs/DevelopmentGuide.md +2 -2
  10. data/docs/GettingStarted.md +71 -1
  11. data/lib/ddtrace.rb +2 -0
  12. data/lib/ddtrace/configuration.rb +20 -4
  13. data/lib/ddtrace/configuration/settings.rb +4 -2
  14. data/lib/ddtrace/context.rb +18 -0
  15. data/lib/ddtrace/context_provider.rb +12 -1
  16. data/lib/ddtrace/contrib/active_support/cache/instrumentation.rb +104 -3
  17. data/lib/ddtrace/contrib/active_support/cache/patcher.rb +21 -0
  18. data/lib/ddtrace/contrib/active_support/ext.rb +3 -0
  19. data/lib/ddtrace/contrib/active_support/notifications/event.rb +10 -0
  20. data/lib/ddtrace/contrib/aws/instrumentation.rb +2 -1
  21. data/lib/ddtrace/contrib/aws/patcher.rb +0 -1
  22. data/lib/ddtrace/contrib/configurable.rb +2 -0
  23. data/lib/ddtrace/contrib/configuration/resolvers/pattern_resolver.rb +4 -5
  24. data/lib/ddtrace/contrib/cucumber/configuration/settings.rb +38 -0
  25. data/lib/ddtrace/contrib/cucumber/ext.rb +19 -0
  26. data/lib/ddtrace/contrib/cucumber/formatter.rb +104 -0
  27. data/lib/ddtrace/contrib/cucumber/instrumentation.rb +24 -0
  28. data/lib/ddtrace/contrib/cucumber/integration.rb +40 -0
  29. data/lib/ddtrace/contrib/cucumber/patcher.rb +23 -0
  30. data/lib/ddtrace/contrib/delayed_job/configuration/settings.rb +1 -0
  31. data/lib/ddtrace/contrib/delayed_job/plugin.rb +3 -1
  32. data/lib/ddtrace/contrib/excon/middleware.rb +7 -1
  33. data/lib/ddtrace/contrib/faraday/patcher.rb +1 -1
  34. data/lib/ddtrace/contrib/grape/configuration/settings.rb +7 -0
  35. data/lib/ddtrace/contrib/grape/endpoint.rb +19 -4
  36. data/lib/ddtrace/contrib/http/instrumentation.rb +2 -2
  37. data/lib/ddtrace/contrib/httprb/instrumentation.rb +2 -2
  38. data/lib/ddtrace/contrib/kafka/event.rb +1 -1
  39. data/lib/ddtrace/contrib/que/configuration/settings.rb +1 -0
  40. data/lib/ddtrace/contrib/que/tracer.rb +2 -1
  41. data/lib/ddtrace/contrib/rails/patcher.rb +5 -2
  42. data/lib/ddtrace/contrib/resque/configuration/settings.rb +1 -0
  43. data/lib/ddtrace/contrib/resque/resque_job.rb +1 -1
  44. data/lib/ddtrace/contrib/rspec/configuration/settings.rb +38 -0
  45. data/lib/ddtrace/contrib/rspec/example.rb +61 -0
  46. data/lib/ddtrace/contrib/rspec/example_group.rb +61 -0
  47. data/lib/ddtrace/contrib/rspec/ext.rb +19 -0
  48. data/lib/ddtrace/contrib/rspec/integration.rb +41 -0
  49. data/lib/ddtrace/contrib/rspec/patcher.rb +25 -0
  50. data/lib/ddtrace/contrib/shoryuken/configuration/settings.rb +1 -0
  51. data/lib/ddtrace/contrib/shoryuken/tracer.rb +4 -1
  52. data/lib/ddtrace/contrib/sidekiq/configuration/settings.rb +1 -0
  53. data/lib/ddtrace/contrib/sidekiq/server_tracer.rb +4 -1
  54. data/lib/ddtrace/contrib/sneakers/configuration/settings.rb +1 -0
  55. data/lib/ddtrace/contrib/sneakers/tracer.rb +17 -20
  56. data/lib/ddtrace/contrib/status_code_matcher.rb +67 -0
  57. data/lib/ddtrace/ext/app_types.rb +1 -0
  58. data/lib/ddtrace/ext/ci.rb +265 -0
  59. data/lib/ddtrace/ext/distributed.rb +8 -2
  60. data/lib/ddtrace/ext/git.rb +12 -0
  61. data/lib/ddtrace/ext/runtime.rb +1 -0
  62. data/lib/ddtrace/ext/test.rb +24 -0
  63. data/lib/ddtrace/runtime/identity.rb +4 -5
  64. data/lib/ddtrace/sampling/rate_limiter.rb +65 -16
  65. data/lib/ddtrace/tracer.rb +14 -1
  66. data/lib/ddtrace/utils.rb +10 -11
  67. data/lib/ddtrace/utils/forking.rb +52 -0
  68. data/lib/ddtrace/version.rb +1 -1
  69. data/lib/ddtrace/writer.rb +19 -1
  70. metadata +23 -31
@@ -20,8 +20,14 @@ module Datadog
20
20
  PROPAGATION_STYLE_DATADOG = 'Datadog'.freeze
21
21
  PROPAGATION_STYLE_B3 = 'B3'.freeze
22
22
  PROPAGATION_STYLE_B3_SINGLE_HEADER = 'B3 single header'.freeze
23
- PROPAGATION_INJECT_STYLE_ENV = 'DD_PROPAGATION_INJECT_STYLE'.freeze
24
- PROPAGATION_EXTRACT_STYLE_ENV = 'DD_PROPAGATION_EXTRACT_STYLE'.freeze
23
+ PROPAGATION_STYLE_INJECT_ENV = 'DD_PROPAGATION_STYLE_INJECT'.freeze
24
+ PROPAGATION_STYLE_EXTRACT_ENV = 'DD_PROPAGATION_STYLE_EXTRACT'.freeze
25
+ # Note: the below inject/extract values are deprecated and were defined erronously
26
+ # they were never part of the datadog language client standard or documentation
27
+ # some users may already be relying on them, but we should look to remove these in the future
28
+ # or before 1.0.
29
+ PROPAGATION_INJECT_STYLE_ENV_OLD = 'DD_PROPAGATION_INJECT_STYLE'.freeze
30
+ PROPAGATION_EXTRACT_STYLE_ENV_OLD = 'DD_PROPAGATION_EXTRACT_STYLE'.freeze
25
31
 
26
32
  # gRPC metadata keys for distributed tracing. https://github.com/grpc/grpc-go/blob/v1.10.x/Documentation/grpc-metadata.md
27
33
  GRPC_METADATA_TRACE_ID = 'x-datadog-trace-id'.freeze
@@ -0,0 +1,12 @@
1
+ module Datadog
2
+ module Ext
3
+ # Defines constants for Git tags
4
+ module Git
5
+ TAG_BRANCH = 'git.branch'.freeze
6
+ TAG_COMMIT_SHA = 'git.commit.sha'.freeze
7
+ TAG_DEPRECATED_COMMIT_SHA = 'git.commit_sha'.freeze
8
+ TAG_REPOSITORY_URL = 'git.repository_url'.freeze
9
+ TAG_TAG = 'git.tag'.freeze
10
+ end
11
+ end
12
+ end
@@ -10,6 +10,7 @@ module Datadog
10
10
  RUBY_ENGINE = ::RUBY_ENGINE # e.g. 'ruby', 'jruby', 'truffleruby'
11
11
  TRACER_VERSION = Datadog::VERSION::STRING
12
12
 
13
+ TAG_ID = 'runtime-id'.freeze
13
14
  TAG_LANG = 'language'.freeze
14
15
 
15
16
  # Metrics
@@ -0,0 +1,24 @@
1
+ module Datadog
2
+ module Ext
3
+ # Defines constants for test tags
4
+ module Test
5
+ TAG_ARGUMENTS = 'test.arguments'.freeze
6
+ TAG_FRAMEWORK = 'test.framework'.freeze
7
+ TAG_NAME = 'test.name'.freeze
8
+ TAG_SKIP_REASON = 'test.skip_reason'.freeze
9
+ TAG_STATUS = 'test.status'.freeze
10
+ TAG_SUITE = 'test.suite'.freeze
11
+ TAG_TRAITS = 'test.traits'.freeze
12
+ TAG_TYPE = 'test.type'.freeze
13
+
14
+ # TODO: is there a better place for SPAN_KIND?
15
+ TAG_SPAN_KIND = 'span.kind'.freeze
16
+
17
+ module Status
18
+ PASS = 'pass'.freeze
19
+ FAIL = 'fail'.freeze
20
+ SKIP = 'skip'.freeze
21
+ end
22
+ end
23
+ end
24
+ end
@@ -1,22 +1,21 @@
1
1
  require 'securerandom'
2
2
  require 'ddtrace/ext/runtime'
3
+ require 'ddtrace/utils/forking'
3
4
 
4
5
  module Datadog
5
6
  module Runtime
6
7
  # For runtime identity
7
8
  module Identity
9
+ extend Datadog::Utils::Forking
10
+
8
11
  module_function
9
12
 
10
13
  # Retrieves number of classes from runtime
11
14
  def id
12
- @pid ||= Process.pid
13
15
  @id ||= SecureRandom.uuid
14
16
 
15
17
  # Check if runtime has changed, e.g. forked.
16
- if Process.pid != @pid
17
- @pid = Process.pid
18
- @id = SecureRandom.uuid
19
- end
18
+ after_fork! { @id = SecureRandom.uuid }
20
19
 
21
20
  @id
22
21
  end
@@ -38,6 +38,10 @@ module Datadog
38
38
  @tokens = max_tokens
39
39
  @total_messages = 0
40
40
  @conforming_messages = 0
41
+ @prev_conforming_messages = nil
42
+ @prev_total_messages = nil
43
+ @current_window = nil
44
+
41
45
  @last_refill = Utils::Time.get_time
42
46
  end
43
47
 
@@ -47,28 +51,17 @@ module Datadog
47
51
  # If it does, return +true+ and remove +size+
48
52
  # tokens from the bucket.
49
53
  # If it does not, return +false+ without affecting
50
- # the tokens form the bucket.
54
+ # the tokens from the bucket.
51
55
  #
52
56
  # @return [Boolean] +true+ if message conforms with current bucket limit
53
57
  def allow?(size)
54
- return false if @rate.zero?
55
- return true if @rate < 0
56
-
57
- refill_since_last_message
58
-
59
- increment_total_count
60
-
61
- return false if @tokens < size
62
-
63
- increment_conforming_count
64
-
65
- @tokens -= size
66
-
67
- true
58
+ allowed = should_allow?(size)
59
+ update_rate_counts(allowed)
60
+ allowed
68
61
  end
69
62
 
70
63
  # Ratio of 'conformance' per 'total messages' checked
71
- # on this bucket.
64
+ # averaged for the past 2 buckets
72
65
  #
73
66
  # Returns +1.0+ when no messages have been checked yet.
74
67
  #
@@ -77,6 +70,20 @@ module Datadog
77
70
  return 0.0 if @rate.zero?
78
71
  return 1.0 if @rate < 0 || @total_messages.zero?
79
72
 
73
+ return current_window_rate if @prev_conforming_messages.nil? || @prev_total_messages.nil?
74
+
75
+ (@conforming_messages.to_f + @prev_conforming_messages.to_f) / (@total_messages + @prev_total_messages)
76
+ end
77
+
78
+ # Ratio of 'conformance' per 'total messages' checked
79
+ # on this bucket
80
+ #
81
+ # Returns +1.0+ when no messages have been checked yet.
82
+ #
83
+ # @return [Float] Conformance ratio, between +[0,1]+
84
+ def current_window_rate
85
+ return 1.0 if @total_messages.zero?
86
+
80
87
  @conforming_messages.to_f / @total_messages
81
88
  end
82
89
 
@@ -91,6 +98,8 @@ module Datadog
91
98
  now = Utils::Time.get_time
92
99
  elapsed = now - @last_refill
93
100
 
101
+ # Update the number of available tokens, but ensure we do not exceed the max
102
+ # we return the min of tokens + rate*elapsed, or max tokens
94
103
  refill_tokens(@rate * elapsed)
95
104
 
96
105
  @last_refill = now
@@ -108,6 +117,46 @@ module Datadog
108
117
  def increment_conforming_count
109
118
  @conforming_messages += 1
110
119
  end
120
+
121
+ def should_allow?(size)
122
+ # rate limit of 0 blocks everything
123
+ return false if @rate.zero?
124
+
125
+ # negative rate limit disables rate limiting
126
+ return true if @rate < 0
127
+
128
+ refill_since_last_message
129
+
130
+ # if tokens < 1 we don't allow?
131
+ return false if @tokens < size
132
+
133
+ @tokens -= size
134
+
135
+ true
136
+ end
137
+
138
+ # Sets and Updates the past two 1 second windows for which
139
+ # the rate limiter must compute it's rate over and updates
140
+ # the total count, and conforming message count if +allowed+
141
+ def update_rate_counts(allowed)
142
+ now = Utils::Time.get_time
143
+
144
+ # No tokens have been seen yet, start a new window
145
+ if @current_window.nil?
146
+ @current_window = now
147
+ # If more than 1 second has past since last window, reset
148
+ elsif now - @current_window >= 1
149
+ @prev_conforming_messages = @conforming_messages
150
+ @prev_total_messages = @total_messages
151
+ @conforming_messages = 0
152
+ @total_messages = 0
153
+ @current_window = now
154
+ end
155
+
156
+ increment_conforming_count if allowed
157
+
158
+ increment_total_count
159
+ end
111
160
  end
112
161
 
113
162
  # \RateLimiter that accepts all resources,
@@ -7,6 +7,7 @@ require 'ddtrace/span'
7
7
  require 'ddtrace/context'
8
8
  require 'ddtrace/logger'
9
9
  require 'ddtrace/writer'
10
+ require 'ddtrace/runtime/identity'
10
11
  require 'ddtrace/sampler'
11
12
  require 'ddtrace/sampling'
12
13
  require 'ddtrace/correlation'
@@ -201,6 +202,7 @@ module Datadog
201
202
  # root span
202
203
  @sampler.sample!(span)
203
204
  span.set_tag('system.pid', Process.pid)
205
+ span.set_tag(Datadog::Ext::Runtime::TAG_ID, Datadog::Runtime::Identity.id)
204
206
 
205
207
  if ctx && ctx.trace_id
206
208
  span.trace_id = ctx.trace_id
@@ -287,8 +289,19 @@ module Datadog
287
289
  # and it is user code which should be executed no matter what.
288
290
  # It's not a problem since we re-raise it afterwards so for example a
289
291
  # SignalException::Interrupt would still bubble up.
292
+ # rubocop:disable Metrics/BlockNesting
290
293
  rescue Exception => e
291
- (options[:on_error] || DEFAULT_ON_ERROR).call(span, e)
294
+ if (on_error_handler = options[:on_error]) && on_error_handler.respond_to?(:call)
295
+ begin
296
+ on_error_handler.call(span, e)
297
+ rescue
298
+ Datadog.logger.debug('Custom on_error handler failed, falling back to default')
299
+ DEFAULT_ON_ERROR.call(span, e)
300
+ end
301
+ else
302
+ Datadog.logger.debug('Custom on_error handler must be a callable, falling back to default') if on_error_handler
303
+ DEFAULT_ON_ERROR.call(span, e)
304
+ end
292
305
  raise e
293
306
  ensure
294
307
  span.finish unless span.nil?
@@ -1,8 +1,11 @@
1
1
  require 'ddtrace/utils/database'
2
+ require 'ddtrace/utils/forking'
2
3
 
3
4
  module Datadog
4
5
  # Utils contains low-level utilities, typically to provide pseudo-random trace IDs.
5
6
  module Utils
7
+ extend Utils::Forking
8
+
6
9
  EMPTY_STRING = ''.encode(::Encoding::UTF_8).freeze
7
10
  # We use a custom random number generator because we want no interference
8
11
  # with the default one. Using the default prng, we could break code that
@@ -10,23 +13,19 @@ module Datadog
10
13
 
11
14
  # Return a span id
12
15
  def self.next_id
13
- reset! if was_forked?
14
-
15
- @rnd.rand(Datadog::Span::RUBY_MAX_ID)
16
+ after_fork! { reset! }
17
+ id_rng.rand(Datadog::Span::RUBY_MAX_ID)
16
18
  end
17
19
 
18
- def self.reset!
19
- @pid = Process.pid
20
- @rnd = Random.new
20
+ def self.id_rng
21
+ @id_rng ||= Random.new
21
22
  end
22
23
 
23
- def self.was_forked?
24
- Process.pid != @pid
24
+ def self.reset!
25
+ @id_rng = Random.new
25
26
  end
26
27
 
27
- private_class_method :reset!, :was_forked?
28
-
29
- reset!
28
+ private_class_method :id_rng, :reset!
30
29
 
31
30
  def self.truncate(value, size, omission = '...'.freeze)
32
31
  string = value.to_s
@@ -0,0 +1,52 @@
1
+ module Datadog
2
+ module Utils
3
+ # Helper methods for managing forking behavior
4
+ module Forking
5
+ def self.included(base)
6
+ base.send(:prepend, ClassExtensions) if base.is_a?(Class)
7
+ end
8
+
9
+ def self.extended(base)
10
+ # Explicitly update PID here because there's a case where
11
+ # the code path that lazily updates the PID may not be exercised
12
+ # until after a fork occurs, thus causing the event to be missed.
13
+ # By eagerly setting this, we avoid this scenario.
14
+ base.update_fork_pid!
15
+ end
16
+
17
+ def after_fork!
18
+ if forked?
19
+ yield
20
+ update_fork_pid!
21
+ true
22
+ else
23
+ false
24
+ end
25
+ end
26
+
27
+ def forked?
28
+ Process.pid != fork_pid
29
+ end
30
+
31
+ def update_fork_pid!
32
+ @fork_pid = Process.pid
33
+ end
34
+
35
+ def fork_pid
36
+ @fork_pid ||= Process.pid
37
+ end
38
+
39
+ # Adds additional functionality for Classes that implement Forking
40
+ module ClassExtensions
41
+ # Addresses an edge case where forking before invoking #update_fork_pid! on the
42
+ # object will cause forking to not be detected in the fork when it should have.
43
+ #
44
+ # This wrapper prevents this by initializing the fork PID when the object is created.
45
+ def initialize(*args, &block)
46
+ super
47
+ update_fork_pid!
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -1,7 +1,7 @@
1
1
  module Datadog
2
2
  module VERSION
3
3
  MAJOR = 0
4
- MINOR = 42
4
+ MINOR = 43
5
5
  PATCH = 0
6
6
  PRE = nil
7
7
 
@@ -42,13 +42,22 @@ module Datadog
42
42
 
43
43
  # one worker for traces
44
44
  @worker = nil
45
+
46
+ # Once stopped, this writer instance cannot be restarted.
47
+ # This allow for graceful shutdown, while preventing
48
+ # the host application from inadvertently start new
49
+ # threads during shutdown.
50
+ @stopped = false
45
51
  end
46
52
 
47
53
  def start
48
54
  @mutex_after_fork.synchronize do
55
+ return false if @stopped
56
+
49
57
  pid = Process.pid
50
58
  return if @worker && pid == @pid
51
59
  @pid = pid
60
+
52
61
  start_worker
53
62
  true
54
63
  end
@@ -67,14 +76,23 @@ module Datadog
67
76
  @worker.start
68
77
  end
69
78
 
79
+ # Gracefully shuts down this writer.
80
+ #
81
+ # Once stopped methods calls won't fail, but
82
+ # no internal work will be performed.
83
+ #
84
+ # It is not possible to restart a stopped writer instance.
70
85
  def stop
71
86
  @mutex_after_fork.synchronize { stop_worker }
72
87
  end
73
88
 
74
89
  def stop_worker
90
+ @stopped = true
91
+
75
92
  return if @worker.nil?
76
93
  @worker.stop
77
94
  @worker = nil
95
+
78
96
  true
79
97
  end
80
98
 
@@ -136,7 +154,7 @@ module Datadog
136
154
 
137
155
  if worker_local
138
156
  worker_local.enqueue_trace(trace)
139
- else
157
+ elsif !@stopped
140
158
  Datadog.logger.debug('Writer either failed to start or was stopped before #write could complete')
141
159
  end
142
160
  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.42.0
4
+ version: 0.43.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-10-21 00:00:00.000000000 Z
11
+ date: 2020-11-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: msgpack
@@ -122,20 +122,6 @@ dependencies:
122
122
  - - "~>"
123
123
  - !ruby/object:Gem::Version
124
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'
139
125
  - !ruby/object:Gem::Dependency
140
126
  name: minitest
141
127
  requirement: !ruby/object:Gem::Requirement
@@ -374,20 +360,6 @@ dependencies:
374
360
  - - "~>"
375
361
  - !ruby/object:Gem::Version
376
362
  version: '0.17'
377
- - !ruby/object:Gem::Dependency
378
- name: warning
379
- requirement: !ruby/object:Gem::Requirement
380
- requirements:
381
- - - "~>"
382
- - !ruby/object:Gem::Version
383
- version: '1'
384
- type: :development
385
- prerelease: false
386
- version_requirements: !ruby/object:Gem::Requirement
387
- requirements:
388
- - - "~>"
389
- - !ruby/object:Gem::Version
390
- version: '1'
391
363
  description: |
392
364
  ddtrace is Datadog’s tracing client for Ruby. It is used to trace requests
393
365
  as they flow across web servers, databases and microservices so that developers
@@ -411,6 +383,8 @@ files:
411
383
  - ".dockerignore"
412
384
  - ".env"
413
385
  - ".github/CODEOWNERS"
386
+ - ".github/workflows/add-milestone-to-pull-requests.yml"
387
+ - ".github/workflows/create-next-milestone.yml"
414
388
  - ".gitignore"
415
389
  - ".gitlab-ci.yml"
416
390
  - ".rspec"
@@ -529,6 +503,12 @@ files:
529
503
  - lib/ddtrace/contrib/configuration/resolver.rb
530
504
  - lib/ddtrace/contrib/configuration/resolvers/pattern_resolver.rb
531
505
  - lib/ddtrace/contrib/configuration/settings.rb
506
+ - lib/ddtrace/contrib/cucumber/configuration/settings.rb
507
+ - lib/ddtrace/contrib/cucumber/ext.rb
508
+ - lib/ddtrace/contrib/cucumber/formatter.rb
509
+ - lib/ddtrace/contrib/cucumber/instrumentation.rb
510
+ - lib/ddtrace/contrib/cucumber/integration.rb
511
+ - lib/ddtrace/contrib/cucumber/patcher.rb
532
512
  - lib/ddtrace/contrib/dalli/configuration/settings.rb
533
513
  - lib/ddtrace/contrib/dalli/ext.rb
534
514
  - lib/ddtrace/contrib/dalli/instrumentation.rb
@@ -685,6 +665,12 @@ files:
685
665
  - lib/ddtrace/contrib/rest_client/integration.rb
686
666
  - lib/ddtrace/contrib/rest_client/patcher.rb
687
667
  - lib/ddtrace/contrib/rest_client/request_patch.rb
668
+ - lib/ddtrace/contrib/rspec/configuration/settings.rb
669
+ - lib/ddtrace/contrib/rspec/example.rb
670
+ - lib/ddtrace/contrib/rspec/example_group.rb
671
+ - lib/ddtrace/contrib/rspec/ext.rb
672
+ - lib/ddtrace/contrib/rspec/integration.rb
673
+ - lib/ddtrace/contrib/rspec/patcher.rb
688
674
  - lib/ddtrace/contrib/sequel/configuration/settings.rb
689
675
  - lib/ddtrace/contrib/sequel/database.rb
690
676
  - lib/ddtrace/contrib/sequel/dataset.rb
@@ -717,6 +703,7 @@ files:
717
703
  - lib/ddtrace/contrib/sneakers/integration.rb
718
704
  - lib/ddtrace/contrib/sneakers/patcher.rb
719
705
  - lib/ddtrace/contrib/sneakers/tracer.rb
706
+ - lib/ddtrace/contrib/status_code_matcher.rb
720
707
  - lib/ddtrace/contrib/sucker_punch/configuration/settings.rb
721
708
  - lib/ddtrace/contrib/sucker_punch/exception_handler.rb
722
709
  - lib/ddtrace/contrib/sucker_punch/ext.rb
@@ -737,12 +724,14 @@ files:
737
724
  - lib/ddtrace/event.rb
738
725
  - lib/ddtrace/ext/analytics.rb
739
726
  - lib/ddtrace/ext/app_types.rb
727
+ - lib/ddtrace/ext/ci.rb
740
728
  - lib/ddtrace/ext/correlation.rb
741
729
  - lib/ddtrace/ext/diagnostics.rb
742
730
  - lib/ddtrace/ext/distributed.rb
743
731
  - lib/ddtrace/ext/environment.rb
744
732
  - lib/ddtrace/ext/errors.rb
745
733
  - lib/ddtrace/ext/forced_tracing.rb
734
+ - lib/ddtrace/ext/git.rb
746
735
  - lib/ddtrace/ext/http.rb
747
736
  - lib/ddtrace/ext/integration.rb
748
737
  - lib/ddtrace/ext/manual_tracing.rb
@@ -752,6 +741,7 @@ files:
752
741
  - lib/ddtrace/ext/runtime.rb
753
742
  - lib/ddtrace/ext/sampling.rb
754
743
  - lib/ddtrace/ext/sql.rb
744
+ - lib/ddtrace/ext/test.rb
755
745
  - lib/ddtrace/ext/transport.rb
756
746
  - lib/ddtrace/forced_tracing.rb
757
747
  - lib/ddtrace/logger.rb
@@ -830,6 +820,7 @@ files:
830
820
  - lib/ddtrace/transport/traces.rb
831
821
  - lib/ddtrace/utils.rb
832
822
  - lib/ddtrace/utils/database.rb
823
+ - lib/ddtrace/utils/forking.rb
833
824
  - lib/ddtrace/utils/time.rb
834
825
  - lib/ddtrace/vendor/active_record/connection_specification.rb
835
826
  - lib/ddtrace/version.rb
@@ -863,7 +854,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
863
854
  - !ruby/object:Gem::Version
864
855
  version: 2.0.0
865
856
  requirements: []
866
- rubygems_version: 3.0.3
857
+ rubyforge_project:
858
+ rubygems_version: 2.2.5
867
859
  signing_key:
868
860
  specification_version: 4
869
861
  summary: Datadog tracing code for your Ruby applications