ddtrace 0.40.0 → 0.41.0

Sign up to get free protection for your applications and to get access to all the features.
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