ddtrace 0.40.0 → 0.41.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 (46) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +34 -1
  3. data/Rakefile +0 -23
  4. data/ddtrace.gemspec +1 -0
  5. data/lib/ddtrace/buffer.rb +154 -43
  6. data/lib/ddtrace/configuration.rb +4 -1
  7. data/lib/ddtrace/configuration/options.rb +3 -1
  8. data/lib/ddtrace/configuration/settings.rb +5 -1
  9. data/lib/ddtrace/contrib/active_record/events/sql.rb +4 -0
  10. data/lib/ddtrace/contrib/active_support/notifications/subscription.rb +2 -2
  11. data/lib/ddtrace/contrib/aws/instrumentation.rb +4 -0
  12. data/lib/ddtrace/contrib/dalli/instrumentation.rb +4 -0
  13. data/lib/ddtrace/contrib/elasticsearch/patcher.rb +4 -0
  14. data/lib/ddtrace/contrib/ethon/easy_patch.rb +4 -2
  15. data/lib/ddtrace/contrib/ethon/multi_patch.rb +4 -0
  16. data/lib/ddtrace/contrib/excon/middleware.rb +4 -0
  17. data/lib/ddtrace/contrib/faraday/middleware.rb +4 -0
  18. data/lib/ddtrace/contrib/grape/endpoint.rb +6 -4
  19. data/lib/ddtrace/contrib/grpc/datadog_interceptor/client.rb +4 -0
  20. data/lib/ddtrace/contrib/grpc/datadog_interceptor/server.rb +4 -0
  21. data/lib/ddtrace/contrib/http/instrumentation.rb +4 -0
  22. data/lib/ddtrace/contrib/httprb/instrumentation.rb +3 -0
  23. data/lib/ddtrace/contrib/mongodb/subscribers.rb +4 -0
  24. data/lib/ddtrace/contrib/mysql2/instrumentation.rb +4 -0
  25. data/lib/ddtrace/contrib/presto/instrumentation.rb +3 -0
  26. data/lib/ddtrace/contrib/racecar/event.rb +4 -0
  27. data/lib/ddtrace/contrib/redis/tags.rb +4 -0
  28. data/lib/ddtrace/contrib/rest_client/request_patch.rb +4 -0
  29. data/lib/ddtrace/contrib/sequel/database.rb +3 -1
  30. data/lib/ddtrace/contrib/sequel/dataset.rb +3 -2
  31. data/lib/ddtrace/contrib/sequel/ext.rb +1 -0
  32. data/lib/ddtrace/contrib/sequel/utils.rb +16 -5
  33. data/lib/ddtrace/ext/integration.rb +8 -0
  34. data/lib/ddtrace/ext/runtime.rb +1 -0
  35. data/lib/ddtrace/opentracer/distributed_headers.rb +1 -1
  36. data/lib/ddtrace/propagation/grpc_propagator.rb +2 -2
  37. data/lib/ddtrace/runtime/metrics.rb +6 -2
  38. data/lib/ddtrace/sampler.rb +2 -2
  39. data/lib/ddtrace/span.rb +152 -27
  40. data/lib/ddtrace/tracer.rb +3 -4
  41. data/lib/ddtrace/transport/http/adapters/net.rb +8 -2
  42. data/lib/ddtrace/transport/http/statistics.rb +14 -1
  43. data/lib/ddtrace/transport/traces.rb +7 -2
  44. data/lib/ddtrace/utils.rb +7 -3
  45. data/lib/ddtrace/version.rb +1 -1
  46. metadata +17 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 38d23bcce474aa2b77029ef98bcc73a47a929aa75e6b1c2779671248b0f238e2
4
- data.tar.gz: 0723d895065ae562813f7a9d9474a330cb8e8902e0f5b6ed4a75370fdabe1a80
3
+ metadata.gz: 0bbda933f09b8f29d20edc57d6825f6491158161b7e5164252deb006931e0e7d
4
+ data.tar.gz: b3aaa6718e835fbfe97db64faa62f82b2f3ff76aefadb53cb27fb9b236b842e3
5
5
  SHA512:
6
- metadata.gz: 28c1958972c5e046ae96670b6dcc6b454e8272f5c7ee6b6d0362f51d149db852d09de4fd76bf1eeac76a483c30ad9464845ec2cf3f052b95f432210c2f92da9e
7
- data.tar.gz: d5b07614bc418f759fac5cf8be3fedf39d6354dd18f086c2461e5d494970b7c1b270585bea37066fd06843f8278ed7fa9863b883b4fdd7062ca4bc8e37c8e663
6
+ metadata.gz: 60d239de8c63091ede6a810127ad580629428b96181982cf543e77f45a89087dfdd238b98418fe72f0e27ebefae6d5f730208c5f6149541dfe1d1c6923579826
7
+ data.tar.gz: 1d3657bc28458d0b50d0c2c68d3397b20ef6b2d4c2a0adf2ec834f701fd2c7701bcdac7f6fbce913743482e5eb2492a6409baf7c9c37c3467677ead705fd752e
@@ -2,6 +2,38 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [0.41.0] - 2020-09-30
6
+
7
+ Release notes: https://github.com/DataDog/dd-trace-rb/releases/tag/v0.41.0
8
+
9
+ Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.40.0...v0.41.0
10
+
11
+ ### Added
12
+
13
+ - Improve duration counting using monotonic clock (#424, #1173) (@soulcutter)
14
+
15
+ ### Changed
16
+
17
+ - Add peer.service tag to external services and skip tagging external services with language tag for runtime metrics (#934, #935, #1180)
18
+ - This helps support the way runtime metrics are associated with spans in the UI.
19
+ - Faster TraceBuffer for CRuby (#1172)
20
+ - Reduce memory usage during gem statup (#1090)
21
+ - Reduce memory usage of the HTTP transport (#1165)
22
+
23
+ ### Fixed
24
+
25
+ - Improved prepared statement support for Sequel integrations (#1186)
26
+ - Fix Sequel instrumentation when executing literal strings (#1185) (@matchbookmac)
27
+ - Remove explicit `Logger` class verification (#1181) (@bartekbsh)
28
+ - This allows users to pass in a custom logger that does not inherit from `Logger` class.
29
+ - Correct tracer buffer metric counting (#1182)
30
+ - Fix Span#pretty_print for empty duration (#1183)
31
+
32
+ ### Refactored
33
+
34
+ - Improvements to test suite & CI (#1179, #1184, #1177, #1178, #1176)
35
+ - Reduce generated Span ID range to fit in Fixnum (#1189)
36
+
5
37
  ## [0.40.0] - 2020-09-08
6
38
 
7
39
  Release notes: https://github.com/DataDog/dd-trace-rb/releases/tag/v0.40.0
@@ -1395,7 +1427,8 @@ Release notes: https://github.com/DataDog/dd-trace-rb/releases/tag/v0.3.1
1395
1427
 
1396
1428
  Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
1397
1429
 
1398
- [Unreleased]: https://github.com/DataDog/dd-trace-rb/compare/v0.40.0...master
1430
+ [Unreleased]: https://github.com/DataDog/dd-trace-rb/compare/v0.41.0...master
1431
+ [0.41.0]: https://github.com/DataDog/dd-trace-rb/compare/v0.40.0...v0.41.0
1399
1432
  [0.40.0]: https://github.com/DataDog/dd-trace-rb/compare/v0.39.0...v0.40.0
1400
1433
  [0.39.0]: https://github.com/DataDog/dd-trace-rb/compare/v0.38.0...v0.39.0
1401
1434
  [0.38.0]: https://github.com/DataDog/dd-trace-rb/compare/v0.37.0...v0.38.0
data/Rakefile CHANGED
@@ -209,8 +209,6 @@ task :ci do
209
209
  declare 'bundle exec rake test:main'
210
210
  declare 'bundle exec rake spec:main'
211
211
  declare 'bundle exec rake spec:contrib'
212
- # Benchmarks
213
- declare 'bundle exec rake spec:benchmark'
214
212
 
215
213
  if RUBY_PLATFORM != 'java'
216
214
  # Contrib minitests
@@ -265,8 +263,6 @@ task :ci do
265
263
  declare 'bundle exec rake spec:main'
266
264
  declare 'bundle exec rake spec:contrib'
267
265
  declare 'bundle exec rake spec:opentracer'
268
- # Benchmarks
269
- declare 'bundle exec rake spec:benchmark'
270
266
 
271
267
  if RUBY_PLATFORM != 'java'
272
268
  # Contrib minitests
@@ -328,8 +324,6 @@ task :ci do
328
324
  declare 'bundle exec rake spec:main'
329
325
  declare 'bundle exec rake spec:contrib'
330
326
  declare 'bundle exec rake spec:opentracer'
331
- # Benchmarks
332
- declare 'bundle exec rake spec:benchmark'
333
327
 
334
328
  if RUBY_PLATFORM != 'java'
335
329
  # Contrib minitests
@@ -403,8 +397,6 @@ task :ci do
403
397
  declare 'bundle exec rake spec:main'
404
398
  declare 'bundle exec rake spec:contrib'
405
399
  declare 'bundle exec rake spec:opentracer'
406
- # Benchmarks
407
- declare 'bundle exec rake spec:benchmark'
408
400
 
409
401
  if RUBY_PLATFORM != 'java'
410
402
  # Contrib minitests
@@ -481,12 +473,8 @@ task :ci do
481
473
  declare 'bundle exec rake spec:contrib'
482
474
  declare 'bundle exec rake spec:opentracer'
483
475
  declare 'bundle exec rake spec:opentelemetry'
484
- # Benchmarks
485
- declare 'bundle exec rake spec:benchmark'
486
476
 
487
477
  if RUBY_PLATFORM != 'java'
488
- # Benchmarks
489
- declare 'bundle exec rake benchmark'
490
478
  # Contrib minitests
491
479
  # Contrib specs
492
480
  declare 'bundle exec appraisal contrib rake spec:action_pack'
@@ -546,9 +534,6 @@ task :ci do
546
534
  declare 'bundle exec rake spec:contrib'
547
535
  declare 'bundle exec rake spec:opentracer'
548
536
  declare 'bundle exec rake spec:opentelemetry'
549
- # Benchmarks
550
- declare 'bundle exec rake spec:benchmark' if RUBY_PLATFORM != 'java' # Too slow due to repeated JVM instantiation
551
- declare 'bundle exec rake benchmark'
552
537
  # Contrib minitests
553
538
  # Contrib specs
554
539
  declare 'bundle exec appraisal contrib rake spec:action_pack'
@@ -617,12 +602,8 @@ task :ci do
617
602
  declare 'bundle exec rake spec:contrib'
618
603
  declare 'bundle exec rake spec:opentracer'
619
604
  declare 'bundle exec rake spec:opentelemetry'
620
- # Benchmarks
621
- declare 'bundle exec rake spec:benchmark'
622
605
 
623
606
  if RUBY_PLATFORM != 'java'
624
- # Benchmarks
625
- declare 'bundle exec rake benchmark'
626
607
  # Contrib minitests
627
608
  # Contrib specs
628
609
  declare 'bundle exec appraisal contrib rake spec:action_pack'
@@ -691,12 +672,8 @@ task :ci do
691
672
  declare 'bundle exec rake spec:contrib'
692
673
  declare 'bundle exec rake spec:opentracer'
693
674
  declare 'bundle exec rake spec:opentelemetry'
694
- # Benchmarks
695
- declare 'bundle exec rake spec:benchmark'
696
675
 
697
676
  if RUBY_PLATFORM != 'java'
698
- # Benchmarks
699
- declare 'bundle exec rake benchmark'
700
677
  # Contrib minitests
701
678
  # Contrib specs
702
679
  declare 'bundle exec appraisal contrib rake spec:action_pack'
@@ -41,6 +41,7 @@ Gem::Specification.new do |spec|
41
41
  spec.add_development_dependency 'opentracing', '>= 0.4.1'
42
42
 
43
43
  # Development dependencies
44
+ spec.add_development_dependency 'concurrent-ruby' # Leave it open as we also have it as an integration and want Appraisal to control the version under test.
44
45
  spec.add_development_dependency 'rake', '>= 10.5'
45
46
  spec.add_development_dependency 'rubocop', '= 0.49.1' if RUBY_VERSION >= '2.1.0'
46
47
  spec.add_development_dependency 'rspec', '~> 3.0'
@@ -2,23 +2,79 @@ require 'thread'
2
2
  require 'ddtrace/diagnostics/health'
3
3
  require 'ddtrace/runtime/object_space'
4
4
 
5
+ # Trace buffer that accumulates traces for a consumer.
6
+ # Consumption can happen from a different thread.
5
7
  module Datadog
6
- # Trace buffer that stores application traces. The buffer has a maximum size and when
7
- # the buffer is full, a random trace is discarded. This class is thread-safe and is used
8
- # automatically by the ``Tracer`` instance when a ``Span`` is finished.
9
- class TraceBuffer
10
- def initialize(max_size)
11
- @max_size = max_size
8
+ # Aggregate metrics:
9
+ # They reflect buffer activity since last #pop.
10
+ # These may not be as accurate or as granular, but they
11
+ # don't use as much network traffic as live stats.
12
+ class MeasuredBuffer
13
+ def initialize
14
+ @buffer_accepted = 0
15
+ @buffer_accepted_lengths = 0
16
+ @buffer_dropped = 0
17
+ @buffer_spans = 0
18
+ end
12
19
 
13
- @mutex = Mutex.new()
14
- @traces = []
15
- @closed = false
20
+ def measure_accept(trace)
21
+ @buffer_accepted += 1
22
+ @buffer_accepted_lengths += trace.length
23
+
24
+ @buffer_spans += trace.length
25
+ rescue StandardError => e
26
+ Datadog.logger.debug("Failed to measure queue accept. Cause: #{e.message} Source: #{e.backtrace.first}")
27
+ end
16
28
 
17
- # Initialize metric values
29
+ def measure_drop(trace)
30
+ @buffer_dropped += 1
31
+
32
+ @buffer_spans -= trace.length
33
+ rescue StandardError => e
34
+ Datadog.logger.debug("Failed to measure queue drop. Cause: #{e.message} Source: #{e.backtrace.first}")
35
+ end
36
+
37
+ def measure_pop(traces)
38
+ # Accepted, cumulative totals
39
+ Datadog.health_metrics.queue_accepted(@buffer_accepted)
40
+ Datadog.health_metrics.queue_accepted_lengths(@buffer_accepted_lengths)
41
+
42
+ # Dropped, cumulative totals
43
+ Datadog.health_metrics.queue_dropped(@buffer_dropped)
44
+ # TODO: are we missing a +queue_dropped_lengths+ metric?
45
+
46
+ # Queue gauges, current values
47
+ Datadog.health_metrics.queue_max_length(@max_size)
48
+ Datadog.health_metrics.queue_spans(@buffer_spans)
49
+ Datadog.health_metrics.queue_length(traces.length)
50
+
51
+ # Reset aggregated metrics
18
52
  @buffer_accepted = 0
19
53
  @buffer_accepted_lengths = 0
20
54
  @buffer_dropped = 0
21
55
  @buffer_spans = 0
56
+ rescue StandardError => e
57
+ Datadog.logger.debug("Failed to measure queue. Cause: #{e.message} Source: #{e.backtrace.first}")
58
+ end
59
+ end
60
+
61
+ # Trace buffer that stores application traces and
62
+ # can be safely used concurrently on any environment.
63
+ #
64
+ # This implementation uses a {Mutex} around public methods, incurring
65
+ # overhead in order to ensure full thread-safety.
66
+ #
67
+ # This is implementation is recommended for non-CRuby environments.
68
+ # If using CRuby, {Datadog::CRubyTraceBuffer} is a faster implementation with minimal compromise.
69
+ class ThreadSafeBuffer < MeasuredBuffer
70
+ def initialize(max_size)
71
+ super()
72
+
73
+ @max_size = max_size
74
+
75
+ @mutex = Mutex.new()
76
+ @traces = []
77
+ @closed = false
22
78
  end
23
79
 
24
80
  # Add a new ``trace`` in the local queue. This method doesn't block the execution
@@ -72,48 +128,103 @@ module Datadog
72
128
  @closed = true
73
129
  end
74
130
  end
131
+ end
132
+
133
+ # Trace buffer that stores application traces and
134
+ # can be safely used concurrently with CRuby.
135
+ #
136
+ # Under extreme concurrency scenarios, this class can exceed
137
+ # its +max_size+ by up to 4%.
138
+ #
139
+ # Because singular +Array+ operations are thread-safe in CRuby,
140
+ # we can implement the trace buffer without an explicit lock,
141
+ # while making the compromise of allowing the buffer to go
142
+ # over its maximum limit under extreme circumstances.
143
+ #
144
+ # On the following scenario:
145
+ # * 4.5 million spans/second.
146
+ # * Pushed into a single CRubyTraceBuffer from 1000 threads.
147
+ # The buffer can exceed its maximum size by no more than 4%.
148
+ #
149
+ # This implementation allocates less memory and is faster
150
+ # than {Datadog::ThreadSafeBuffer}.
151
+ #
152
+ # @see spec/ddtrace/benchmark/buffer_benchmark_spec.rb Buffer benchmarks
153
+ # @see https://github.com/ruby-concurrency/concurrent-ruby/blob/c1114a0c6891d9634f019f1f9fe58dcae8658964/lib/concurrent-ruby/concurrent/array.rb#L23-L27
154
+ class CRubyTraceBuffer < MeasuredBuffer
155
+ def initialize(max_size)
156
+ super()
157
+
158
+ @max_size = max_size
159
+
160
+ @traces = []
161
+ @closed = false
162
+ end
75
163
 
76
- # Aggregate metrics:
77
- # They reflect buffer activity since last #pop.
78
- # These may not be as accurate or as granular, but they
79
- # don't use as much network traffic as live stats.
164
+ # Add a new ``trace`` in the local queue. This method doesn't block the execution
165
+ # even if the buffer is full. In that case, a random trace is discarded.
166
+ def push(trace)
167
+ return if @closed
168
+ len = @traces.length
169
+ if len < @max_size || @max_size <= 0
170
+ @traces << trace
171
+ else
172
+ # we should replace a random trace with the new one
173
+ replace_index = rand(len)
174
+ replaced_trace = @traces.delete_at(replace_index)
175
+ @traces << trace
176
+
177
+ # Check if we deleted the element right when the buffer
178
+ # was popped. In that case we didn't actually delete anything,
179
+ # we just inserted into a newly cleared buffer instead.
180
+ measure_drop(replaced_trace) if replaced_trace
181
+ end
80
182
 
81
- def measure_accept(trace)
82
- @buffer_spans += trace.length
83
- @buffer_accepted += 1
84
- @buffer_accepted_lengths += trace.length
85
- rescue StandardError => e
86
- Datadog.logger.debug("Failed to measure queue accept. Cause: #{e.message} Source: #{e.backtrace.first}")
183
+ measure_accept(trace)
87
184
  end
88
185
 
89
- def measure_drop(trace)
90
- @buffer_dropped += 1
91
- @buffer_spans -= trace.length
92
- @buffer_accepted_lengths -= trace.length
93
- rescue StandardError => e
94
- Datadog.logger.debug("Failed to measure queue drop. Cause: #{e.message} Source: #{e.backtrace.first}")
186
+ # Return the current number of stored traces.
187
+ def length
188
+ @traces.length
95
189
  end
96
190
 
97
- def measure_pop(traces)
98
- # Accepted
99
- Datadog.health_metrics.queue_accepted(@buffer_accepted)
100
- Datadog.health_metrics.queue_accepted_lengths(@buffer_accepted_lengths)
191
+ # Return if the buffer is empty.
192
+ def empty?
193
+ @traces.empty?
194
+ end
101
195
 
102
- # Dropped
103
- Datadog.health_metrics.queue_dropped(@buffer_dropped)
196
+ # Return all traces stored and reset buffer.
197
+ def pop
198
+ traces = @traces.pop(VERY_LARGE_INTEGER)
104
199
 
105
- # Queue gauges
106
- Datadog.health_metrics.queue_max_length(@max_size)
107
- Datadog.health_metrics.queue_spans(@buffer_spans)
108
- Datadog.health_metrics.queue_length(traces.length)
200
+ measure_pop(traces)
109
201
 
110
- # Reset aggregated metrics
111
- @buffer_accepted = 0
112
- @buffer_accepted_lengths = 0
113
- @buffer_dropped = 0
114
- @buffer_spans = 0
115
- rescue StandardError => e
116
- Datadog.logger.debug("Failed to measure queue. Cause: #{e.message} Source: #{e.backtrace.first}")
202
+ traces
203
+ end
204
+
205
+ # Very large value, to ensure that we drain the whole buffer.
206
+ # 1<<62-1 happens to be the largest integer that can be stored inline in CRuby.
207
+ VERY_LARGE_INTEGER = 1 << 62 - 1
208
+
209
+ def close
210
+ @closed = true
117
211
  end
118
212
  end
213
+
214
+ # Choose default TraceBuffer implementation for current platform.
215
+ BUFFER_IMPLEMENTATION = if Datadog::Ext::Runtime::RUBY_ENGINE == 'ruby'
216
+ CRubyTraceBuffer
217
+ else
218
+ ThreadSafeBuffer
219
+ end
220
+ private_constant :BUFFER_IMPLEMENTATION
221
+
222
+ # Trace buffer that stores application traces. The buffer has a maximum size and when
223
+ # the buffer is full, a random trace is discarded. This class is thread-safe and is used
224
+ # automatically by the ``Tracer`` instance when a ``Span`` is finished.
225
+ #
226
+ # TODO We should restructure this module, so that classes are not declared at top-level ::Datadog.
227
+ # TODO Making such a change is potentially breaking for users manually configuring the tracer.
228
+ class TraceBuffer < BUFFER_IMPLEMENTATION
229
+ end
119
230
  end
@@ -56,7 +56,10 @@ module Datadog
56
56
  end
57
57
 
58
58
  def shutdown!
59
- components.shutdown! if instance_variable_defined?(:@components) && @components
59
+ if instance_variable_defined?(:@components) && @components
60
+ components.shutdown!
61
+ @components = nil
62
+ end
60
63
  end
61
64
 
62
65
  protected
@@ -26,7 +26,9 @@ module Datadog
26
26
  builder = OptionDefinition::Builder.new(name, meta, &block)
27
27
  options[name] = builder.to_definition.tap do
28
28
  # Resolve and define helper functions
29
- helpers = default_helpers(name).merge(builder.helpers)
29
+ helpers = default_helpers(name)
30
+ # Prevent unnecessary creation of an identical copy of helpers if there's nothing to merge
31
+ helpers = helpers.merge(builder.helpers) unless builder.helpers.empty?
30
32
  define_helpers(helpers)
31
33
  end
32
34
  end
@@ -40,6 +40,11 @@ module Datadog
40
40
  option :debug do |o|
41
41
  o.default { env_to_bool(Datadog::Ext::Diagnostics::DD_TRACE_DEBUG, false) }
42
42
  o.lazy
43
+ o.on_set do |enabled|
44
+ # Enable rich debug print statements.
45
+ # We do not need to unnecessarily load 'pp' unless in debugging mode.
46
+ require 'pp' if enabled
47
+ end
43
48
  end
44
49
 
45
50
  settings :health_metrics do
@@ -91,7 +96,6 @@ module Datadog
91
96
 
92
97
  settings :logger do
93
98
  option :instance do |o|
94
- o.setter { |value, old_value| value.is_a?(::Logger) ? value : old_value }
95
99
  o.on_set { |value| set_option(:level, value.level) unless value.nil? }
96
100
  end
97
101
 
@@ -1,3 +1,4 @@
1
+ require 'ddtrace/ext/integration'
1
2
  require 'ddtrace/ext/net'
2
3
  require 'ddtrace/contrib/analytics'
3
4
  require 'ddtrace/contrib/active_record/ext'
@@ -39,6 +40,9 @@ module Datadog
39
40
  span.resource = payload.fetch(:sql)
40
41
  span.span_type = Datadog::Ext::SQL::TYPE
41
42
 
43
+ # Tag as an external peer service
44
+ span.set_tag(Datadog::Ext::Integration::TAG_PEER_SERVICE, span.service)
45
+
42
46
  # Set analytics sample rate
43
47
  if Contrib::Analytics.enabled?(configuration[:analytics_enabled])
44
48
  Contrib::Analytics.set_sample_rate(span, configuration[:analytics_sample_rate])
@@ -76,8 +76,8 @@ module Datadog
76
76
 
77
77
  # Start a trace
78
78
  tracer.trace(@span_name, @options.dup).tap do |span|
79
- # Assign start time if provided
80
- span.start_time = start unless start.nil?
79
+ # Start span if time is provided
80
+ span.start(start) unless start.nil?
81
81
  payload[:datadog_span] = span
82
82
  end
83
83
  end