ddtrace 0.37.0 → 0.38.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.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/Appraisals +15 -0
- data/CHANGELOG.md +33 -1
- data/Rakefile +11 -10
- data/docker-compose.yml +2 -2
- data/docs/GettingStarted.md +55 -0
- data/lib/ddtrace.rb +2 -0
- data/lib/ddtrace/configuration/settings.rb +18 -0
- data/lib/ddtrace/contrib/active_support/notifications/subscription.rb +1 -1
- data/lib/ddtrace/contrib/extensions.rb +10 -0
- data/lib/ddtrace/contrib/faraday/middleware.rb +5 -3
- data/lib/ddtrace/contrib/faraday/patcher.rb +3 -0
- data/lib/ddtrace/contrib/grpc/datadog_interceptor/client.rb +1 -3
- data/lib/ddtrace/contrib/httprb/configuration/settings.rb +27 -0
- data/lib/ddtrace/contrib/httprb/ext.rb +14 -0
- data/lib/ddtrace/contrib/httprb/instrumentation.rb +163 -0
- data/lib/ddtrace/contrib/httprb/integration.rb +43 -0
- data/lib/ddtrace/contrib/httprb/patcher.rb +35 -0
- data/lib/ddtrace/contrib/kafka/configuration/settings.rb +25 -0
- data/lib/ddtrace/contrib/kafka/consumer_event.rb +14 -0
- data/lib/ddtrace/contrib/kafka/consumer_group_event.rb +14 -0
- data/lib/ddtrace/contrib/kafka/event.rb +51 -0
- data/lib/ddtrace/contrib/kafka/events.rb +44 -0
- data/lib/ddtrace/contrib/kafka/events/connection/request.rb +34 -0
- data/lib/ddtrace/contrib/kafka/events/consumer/process_batch.rb +41 -0
- data/lib/ddtrace/contrib/kafka/events/consumer/process_message.rb +39 -0
- data/lib/ddtrace/contrib/kafka/events/consumer_group/heartbeat.rb +39 -0
- data/lib/ddtrace/contrib/kafka/events/consumer_group/join_group.rb +29 -0
- data/lib/ddtrace/contrib/kafka/events/consumer_group/leave_group.rb +29 -0
- data/lib/ddtrace/contrib/kafka/events/consumer_group/sync_group.rb +29 -0
- data/lib/ddtrace/contrib/kafka/events/produce_operation/send_messages.rb +32 -0
- data/lib/ddtrace/contrib/kafka/events/producer/deliver_messages.rb +35 -0
- data/lib/ddtrace/contrib/kafka/ext.rb +38 -0
- data/lib/ddtrace/contrib/kafka/integration.rb +39 -0
- data/lib/ddtrace/contrib/kafka/patcher.rb +26 -0
- data/lib/ddtrace/contrib/rack/middlewares.rb +15 -12
- data/lib/ddtrace/contrib/rest_client/request_patch.rb +2 -2
- data/lib/ddtrace/contrib/sidekiq/ext.rb +1 -0
- data/lib/ddtrace/contrib/sidekiq/patcher.rb +8 -1
- data/lib/ddtrace/contrib/sidekiq/server_tracer.rb +1 -0
- data/lib/ddtrace/diagnostics/environment_logger.rb +278 -0
- data/lib/ddtrace/environment.rb +5 -1
- data/lib/ddtrace/ext/diagnostics.rb +2 -0
- data/lib/ddtrace/ext/environment.rb +2 -0
- data/lib/ddtrace/pipeline/span_filter.rb +15 -15
- data/lib/ddtrace/sampler.rb +2 -0
- data/lib/ddtrace/span.rb +10 -0
- data/lib/ddtrace/tracer.rb +13 -6
- data/lib/ddtrace/transport/http/adapters/net.rb +8 -0
- data/lib/ddtrace/transport/http/adapters/test.rb +4 -0
- data/lib/ddtrace/transport/http/adapters/unix_socket.rb +4 -0
- data/lib/ddtrace/transport/response.rb +11 -0
- data/lib/ddtrace/version.rb +1 -1
- data/lib/ddtrace/workers/trace_writer.rb +3 -0
- data/lib/ddtrace/writer.rb +33 -12
- metadata +27 -3
data/lib/ddtrace/sampler.rb
CHANGED
data/lib/ddtrace/span.rb
CHANGED
@@ -107,6 +107,16 @@ module Datadog
|
|
107
107
|
Datadog.logger.debug("Unable to set the tag #{key}, ignoring it. Caused by: #{e}")
|
108
108
|
end
|
109
109
|
|
110
|
+
# Sets tags from given hash, for each key in hash it sets the tag with that key
|
111
|
+
# and associated value from the hash. It is shortcut for `set_tag`. Keys and values
|
112
|
+
# of the hash must be strings. Note that nested hashes are not supported.
|
113
|
+
# A valid example is:
|
114
|
+
#
|
115
|
+
# span.set_tags({ "http.method" => "GET", "user.id" => "234" })
|
116
|
+
def set_tags(tags)
|
117
|
+
tags.each { |k, v| set_tag(k, v) }
|
118
|
+
end
|
119
|
+
|
110
120
|
# This method removes a tag for the given key.
|
111
121
|
def clear_tag(key)
|
112
122
|
@meta.delete(key)
|
data/lib/ddtrace/tracer.rb
CHANGED
@@ -212,8 +212,8 @@ module Datadog
|
|
212
212
|
# child span
|
213
213
|
span.parent = parent # sets service, trace_id, parent_id, sampled
|
214
214
|
end
|
215
|
-
|
216
|
-
|
215
|
+
span.set_tags(@tags) unless @tags.empty?
|
216
|
+
span.set_tags(tags) unless tags.empty?
|
217
217
|
span.start_time = start_time
|
218
218
|
|
219
219
|
# this could at some point be optional (start_active_span vs start_manual_span)
|
@@ -255,9 +255,11 @@ module Datadog
|
|
255
255
|
# * +service+: the service name for this span
|
256
256
|
# * +resource+: the resource this span refers, or \name if it's missing
|
257
257
|
# * +span_type+: the type of the span (such as \http, \db and so on)
|
258
|
+
# * +child_of+: a \Span or a \Context instance representing the parent for this span.
|
259
|
+
# If not set, defaults to Tracer.call_context
|
258
260
|
# * +tags+: extra tags which should be added to the span.
|
259
261
|
def trace(name, options = {})
|
260
|
-
options[:child_of]
|
262
|
+
options[:child_of] ||= call_context
|
261
263
|
|
262
264
|
# call the finish only if a block is given; this ensures
|
263
265
|
# that a call to tracer.trace() without a block, returns
|
@@ -269,11 +271,16 @@ module Datadog
|
|
269
271
|
begin
|
270
272
|
begin
|
271
273
|
span = start_span(name, options)
|
272
|
-
# rubocop:disable Lint/UselessAssignment
|
273
274
|
rescue StandardError => e
|
274
|
-
Datadog.logger.debug(
|
275
|
+
Datadog.logger.debug("Failed to start span: #{e}")
|
275
276
|
ensure
|
276
|
-
|
277
|
+
# We should yield to the provided block when possible, as this
|
278
|
+
# block is application code that we don't want to hinder. We call:
|
279
|
+
# * `yield(span)` during normal execution.
|
280
|
+
# * `yield(nil)` if `start_span` fails with a runtime error.
|
281
|
+
# * We don't yield during a fatal error, as the application is likely trying to
|
282
|
+
# end its execution (either due to a system error or graceful shutdown).
|
283
|
+
return_value = yield(span) if span || e.is_a?(StandardError)
|
277
284
|
end
|
278
285
|
# rubocop:disable Lint/RescueException
|
279
286
|
# Here we really want to catch *any* exception, not only StandardError,
|
@@ -47,6 +47,10 @@ module Datadog
|
|
47
47
|
Response.new(http_response)
|
48
48
|
end
|
49
49
|
|
50
|
+
def url
|
51
|
+
"http://#{hostname}:#{port}?timeout=#{timeout}"
|
52
|
+
end
|
53
|
+
|
50
54
|
# Raised when called with an unknown HTTP method
|
51
55
|
class UnknownHTTPMethod < StandardError
|
52
56
|
attr_reader :verb
|
@@ -104,6 +108,10 @@ module Datadog
|
|
104
108
|
return super if http_response.nil?
|
105
109
|
code.between?(500, 599)
|
106
110
|
end
|
111
|
+
|
112
|
+
def inspect
|
113
|
+
"#{super}, http_response:#{http_response}"
|
114
|
+
end
|
107
115
|
end
|
108
116
|
end
|
109
117
|
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
|
data/lib/ddtrace/version.rb
CHANGED
@@ -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
|
data/lib/ddtrace/writer.rb
CHANGED
@@ -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
|
-
@
|
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
|
-
|
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
|
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
|
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.
|
4
|
+
version: 0.38.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-
|
11
|
+
date: 2020-07-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: msgpack
|
@@ -546,7 +546,29 @@ files:
|
|
546
546
|
- lib/ddtrace/contrib/http/integration.rb
|
547
547
|
- lib/ddtrace/contrib/http/patcher.rb
|
548
548
|
- lib/ddtrace/contrib/http_annotation_helper.rb
|
549
|
+
- lib/ddtrace/contrib/httprb/configuration/settings.rb
|
550
|
+
- lib/ddtrace/contrib/httprb/ext.rb
|
551
|
+
- lib/ddtrace/contrib/httprb/instrumentation.rb
|
552
|
+
- lib/ddtrace/contrib/httprb/integration.rb
|
553
|
+
- lib/ddtrace/contrib/httprb/patcher.rb
|
549
554
|
- lib/ddtrace/contrib/integration.rb
|
555
|
+
- lib/ddtrace/contrib/kafka/configuration/settings.rb
|
556
|
+
- lib/ddtrace/contrib/kafka/consumer_event.rb
|
557
|
+
- lib/ddtrace/contrib/kafka/consumer_group_event.rb
|
558
|
+
- lib/ddtrace/contrib/kafka/event.rb
|
559
|
+
- lib/ddtrace/contrib/kafka/events.rb
|
560
|
+
- lib/ddtrace/contrib/kafka/events/connection/request.rb
|
561
|
+
- lib/ddtrace/contrib/kafka/events/consumer/process_batch.rb
|
562
|
+
- lib/ddtrace/contrib/kafka/events/consumer/process_message.rb
|
563
|
+
- lib/ddtrace/contrib/kafka/events/consumer_group/heartbeat.rb
|
564
|
+
- lib/ddtrace/contrib/kafka/events/consumer_group/join_group.rb
|
565
|
+
- lib/ddtrace/contrib/kafka/events/consumer_group/leave_group.rb
|
566
|
+
- lib/ddtrace/contrib/kafka/events/consumer_group/sync_group.rb
|
567
|
+
- lib/ddtrace/contrib/kafka/events/produce_operation/send_messages.rb
|
568
|
+
- lib/ddtrace/contrib/kafka/events/producer/deliver_messages.rb
|
569
|
+
- lib/ddtrace/contrib/kafka/ext.rb
|
570
|
+
- lib/ddtrace/contrib/kafka/integration.rb
|
571
|
+
- lib/ddtrace/contrib/kafka/patcher.rb
|
550
572
|
- lib/ddtrace/contrib/mongodb/configuration/settings.rb
|
551
573
|
- lib/ddtrace/contrib/mongodb/ext.rb
|
552
574
|
- lib/ddtrace/contrib/mongodb/instrumentation.rb
|
@@ -647,6 +669,7 @@ files:
|
|
647
669
|
- lib/ddtrace/contrib/sucker_punch/integration.rb
|
648
670
|
- lib/ddtrace/contrib/sucker_punch/patcher.rb
|
649
671
|
- lib/ddtrace/correlation.rb
|
672
|
+
- lib/ddtrace/diagnostics/environment_logger.rb
|
650
673
|
- lib/ddtrace/diagnostics/health.rb
|
651
674
|
- lib/ddtrace/distributed_tracing/headers/b3.rb
|
652
675
|
- lib/ddtrace/distributed_tracing/headers/b3_single.rb
|
@@ -784,7 +807,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
784
807
|
- !ruby/object:Gem::Version
|
785
808
|
version: 2.0.0
|
786
809
|
requirements: []
|
787
|
-
|
810
|
+
rubyforge_project:
|
811
|
+
rubygems_version: 2.7.6.2
|
788
812
|
signing_key:
|
789
813
|
specification_version: 4
|
790
814
|
summary: Datadog tracing code for your Ruby applications
|