ddtrace 0.15.0.internaltracinfeature1 → 0.15.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/lib/ddtrace/contrib/http/patcher.rb +7 -20
- data/lib/ddtrace/tracer.rb +1 -3
- data/lib/ddtrace/transport.rb +28 -88
- data/lib/ddtrace/utils.rb +0 -1
- data/lib/ddtrace/version.rb +1 -1
- metadata +4 -5
- data/lib/ddtrace/utils/internal_traces.rb +0 -53
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 83a0125cb996a905f1d25812abb1f64d4703b4ba870b378dbb746675322ea7f4
|
4
|
+
data.tar.gz: 98dbbbffe51a7912106269183b12f41fea114f1b7fa7dc42e3266ad910ba57ff
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4f750d5f3418be21196ee9109f1faa9eb904baf7bd5d4f8eb07b00e6bce5f1b7dc393e080a4be53e350bbfbeedf3216823b4b58df7720fa64688fb9c1ab10f64
|
7
|
+
data.tar.gz: 4c056618940a40462006828d0ede6613a51e78c062555544605480f540a471747a9fb76c9ee496dc3b9b82f7595a77df4a933d14eed3db18457a61c9c76ff880
|
@@ -14,37 +14,27 @@ module Datadog
|
|
14
14
|
|
15
15
|
module_function
|
16
16
|
|
17
|
-
def
|
17
|
+
def should_skip_tracing?(req, address, port, transport, pin)
|
18
18
|
# we don't want to trace our own call to the API (they use net/http)
|
19
19
|
# when we know the host & port (from the URI) we use it, else (most-likely
|
20
20
|
# called with a block) rely on the URL at the end.
|
21
21
|
if req.respond_to?(:uri) && req.uri
|
22
22
|
if req.uri.host.to_s == transport.hostname.to_s &&
|
23
23
|
req.uri.port.to_i == transport.port.to_i
|
24
|
-
true
|
24
|
+
return true
|
25
25
|
end
|
26
26
|
elsif address && port &&
|
27
27
|
address.to_s == transport.hostname.to_s &&
|
28
28
|
port.to_i == transport.port.to_i
|
29
|
-
true
|
29
|
+
return true
|
30
30
|
end
|
31
|
-
end
|
32
|
-
|
33
|
-
def tracing_recursive_request?(tracer)
|
34
31
|
# we don't want a "shotgun" effect with two nested traces for one
|
35
32
|
# logical get, and request is likely to call itself recursively
|
36
|
-
active = tracer.active_span
|
33
|
+
active = pin.tracer.active_span()
|
37
34
|
return true if active && (active.name == NAME)
|
38
35
|
false
|
39
36
|
end
|
40
37
|
|
41
|
-
# @deprecated This method will be removed in 1.0
|
42
|
-
def should_skip_tracing?(req, address, port, transport, pin)
|
43
|
-
Datadog::Tracer.log.error('should_skip_tracing? will be deprecated in 1.0')
|
44
|
-
|
45
|
-
tracing_transport?(req, address, port, transport) || tracing_recursive_request?(pin.tracer)
|
46
|
-
end
|
47
|
-
|
48
38
|
def should_skip_distributed_tracing?(pin)
|
49
39
|
if pin.config && pin.config.key?(:distributed_tracing)
|
50
40
|
return !pin.config[:distributed_tracing]
|
@@ -109,15 +99,12 @@ module Datadog
|
|
109
99
|
end
|
110
100
|
|
111
101
|
def request(req, body = nil, &block) # :yield: +response+
|
112
|
-
transport = Datadog.configuration[:http][:tracer].writer.transport
|
113
|
-
if Datadog::Contrib::HTTP.tracing_transport?(req, @address, @port, transport)
|
114
|
-
return request_without_datadog(req, body, &block)
|
115
|
-
end
|
116
|
-
|
117
102
|
pin = datadog_pin
|
118
103
|
return request_without_datadog(req, body, &block) unless pin && pin.tracer
|
119
104
|
|
120
|
-
|
105
|
+
transport = pin.tracer.writer.transport
|
106
|
+
|
107
|
+
if Datadog::Contrib::HTTP.should_skip_tracing?(req, @address, @port, transport, pin)
|
121
108
|
return request_without_datadog(req, body, &block)
|
122
109
|
end
|
123
110
|
|
data/lib/ddtrace/tracer.rb
CHANGED
@@ -20,7 +20,7 @@ module Datadog
|
|
20
20
|
# rubocop:disable Metrics/ClassLength
|
21
21
|
class Tracer
|
22
22
|
attr_reader :sampler, :services, :tags, :provider
|
23
|
-
attr_accessor :enabled, :writer
|
23
|
+
attr_accessor :enabled, :writer
|
24
24
|
attr_writer :default_service
|
25
25
|
|
26
26
|
ALLOWED_SPAN_OPTIONS = [:service, :resource, :span_type].freeze
|
@@ -102,7 +102,6 @@ module Datadog
|
|
102
102
|
@provider ||= Datadog::DefaultContextProvider.new # @provider should never be nil
|
103
103
|
|
104
104
|
@context_flush = options[:partial_flush] ? Datadog::ContextFlush.new(options) : nil
|
105
|
-
@internal_traces = options[:internal_traces] || false
|
106
105
|
|
107
106
|
@mutex = Mutex.new
|
108
107
|
@services = {}
|
@@ -124,7 +123,6 @@ module Datadog
|
|
124
123
|
enabled = options.fetch(:enabled, nil)
|
125
124
|
hostname = options.fetch(:hostname, nil)
|
126
125
|
port = options.fetch(:port, nil)
|
127
|
-
@internal_traces = options.fetch(:internal_traces, false)
|
128
126
|
|
129
127
|
# Those are rare "power-user" options.
|
130
128
|
sampler = options.fetch(:sampler, nil)
|
data/lib/ddtrace/transport.rb
CHANGED
@@ -3,7 +3,6 @@ require 'net/http'
|
|
3
3
|
|
4
4
|
require 'ddtrace/encoding'
|
5
5
|
require 'ddtrace/version'
|
6
|
-
require 'ddtrace/utils'
|
7
6
|
|
8
7
|
module Datadog
|
9
8
|
# Transport class that handles the spans delivery to the
|
@@ -11,9 +10,6 @@ module Datadog
|
|
11
10
|
# so that the Transport is thread-safe.
|
12
11
|
# rubocop:disable Metrics/ClassLength
|
13
12
|
class HTTPTransport
|
14
|
-
include Datadog::Utils::InternalTraces
|
15
|
-
self.internal_trace_service = 'datadog.transport'.freeze
|
16
|
-
|
17
13
|
attr_accessor :hostname, :port
|
18
14
|
attr_reader :traces_endpoint, :services_endpoint
|
19
15
|
|
@@ -49,12 +45,6 @@ module Datadog
|
|
49
45
|
|
50
46
|
private_constant :API
|
51
47
|
|
52
|
-
CONTENT_TYPE = 'Content-Type'.freeze
|
53
|
-
DATADOG_META_LANG = 'Datadog-Meta-Lang'.freeze
|
54
|
-
DATADOG_META_LANG_VERSION = 'Datadog-Meta-Lang-Version'.freeze
|
55
|
-
DATADOG_META_LANG_INTERPRETER = 'Datadog-Meta-Lang-Interpreter'.freeze
|
56
|
-
DATADOG_META_TRACER_VERSION = 'Datadog-Meta-Tracer-Version'.freeze
|
57
|
-
|
58
48
|
def initialize(hostname, port, options = {})
|
59
49
|
api_version = options.fetch(:api_version, V3)
|
60
50
|
|
@@ -66,11 +56,11 @@ module Datadog
|
|
66
56
|
|
67
57
|
# overwrite the Content-type with the one chosen in the Encoder
|
68
58
|
@headers = options.fetch(:headers, {})
|
69
|
-
@headers[
|
70
|
-
@headers[
|
71
|
-
@headers[
|
72
|
-
@headers[
|
73
|
-
@headers[
|
59
|
+
@headers['Content-Type'] = @encoder.content_type
|
60
|
+
@headers['Datadog-Meta-Lang'] = 'ruby'
|
61
|
+
@headers['Datadog-Meta-Lang-Version'] = RUBY_VERSION
|
62
|
+
@headers['Datadog-Meta-Lang-Interpreter'] = RUBY_INTERPRETER
|
63
|
+
@headers['Datadog-Meta-Tracer-Version'] = Datadog::VERSION::STRING
|
74
64
|
|
75
65
|
# stats
|
76
66
|
@mutex = Mutex.new
|
@@ -83,27 +73,28 @@ module Datadog
|
|
83
73
|
|
84
74
|
# route the send to the right endpoint
|
85
75
|
def send(endpoint, data)
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
status_code = send_traces(data)
|
92
|
-
else
|
93
|
-
with_active_internal_span { |s| s.set_error(RuntimeError.new("Unsupported endpoint: #{endpoint}")) }
|
94
|
-
|
95
|
-
Datadog::Tracer.log.error("Unsupported endpoint: #{endpoint}")
|
96
|
-
return nil
|
76
|
+
case endpoint
|
77
|
+
when :services
|
78
|
+
payload = @encoder.encode_services(data)
|
79
|
+
status_code = post(@api[:services_endpoint], payload) do |response|
|
80
|
+
process_callback(:services, response)
|
97
81
|
end
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
end
|
104
|
-
else
|
105
|
-
status_code
|
82
|
+
when :traces
|
83
|
+
count = data.length
|
84
|
+
payload = @encoder.encode_traces(data)
|
85
|
+
status_code = post(@api[:traces_endpoint], payload, count) do |response|
|
86
|
+
process_callback(:traces, response)
|
106
87
|
end
|
88
|
+
else
|
89
|
+
Datadog::Tracer.log.error("Unsupported endpoint: #{endpoint}")
|
90
|
+
return nil
|
91
|
+
end
|
92
|
+
|
93
|
+
if downgrade?(status_code)
|
94
|
+
downgrade!
|
95
|
+
send(endpoint, data)
|
96
|
+
else
|
97
|
+
status_code
|
107
98
|
end
|
108
99
|
end
|
109
100
|
|
@@ -115,11 +106,10 @@ module Datadog
|
|
115
106
|
headers = headers.merge(@headers)
|
116
107
|
request = Net::HTTP::Post.new(url, headers)
|
117
108
|
request.body = data
|
109
|
+
|
118
110
|
response = Net::HTTP.start(@hostname, @port, read_timeout: TIMEOUT) { |http| http.request(request) }
|
119
111
|
handle_response(response)
|
120
112
|
rescue StandardError => e
|
121
|
-
with_active_internal_span { |s| s.set_error(e) }
|
122
|
-
|
123
113
|
log_error_once(e.message)
|
124
114
|
500
|
125
115
|
end.tap do
|
@@ -136,7 +126,7 @@ module Datadog
|
|
136
126
|
|
137
127
|
@api = API.fetch(fallback_version)
|
138
128
|
@encoder = @api[:encoder].new
|
139
|
-
@headers[
|
129
|
+
@headers['Content-Type'] = @encoder.content_type
|
140
130
|
end
|
141
131
|
end
|
142
132
|
|
@@ -178,10 +168,9 @@ module Datadog
|
|
178
168
|
# function is handled within the HTTP mutex.synchronize so it's thread-safe.
|
179
169
|
def handle_response(response)
|
180
170
|
status_code = response.code.to_i
|
181
|
-
with_active_internal_span { |s| s.set_tag('response.code', status_code) }
|
182
171
|
|
183
172
|
if success?(status_code)
|
184
|
-
Datadog::Tracer.log.debug('Payload correctly sent to the trace agent.'
|
173
|
+
Datadog::Tracer.log.debug('Payload correctly sent to the trace agent.')
|
185
174
|
@mutex.synchronize { @count_consecutive_errors = 0 }
|
186
175
|
@mutex.synchronize { @count_success += 1 }
|
187
176
|
elsif downgrade?(status_code)
|
@@ -197,7 +186,6 @@ module Datadog
|
|
197
186
|
rescue StandardError => e
|
198
187
|
log_error_once(e.message)
|
199
188
|
@mutex.synchronize { @count_internal_error += 1 }
|
200
|
-
with_active_internal_span { |s| s.set_error(e) }
|
201
189
|
|
202
190
|
500
|
203
191
|
end
|
@@ -215,54 +203,6 @@ module Datadog
|
|
215
203
|
|
216
204
|
private
|
217
205
|
|
218
|
-
def do_trace?(data)
|
219
|
-
# Create the span if we already are traced
|
220
|
-
return true if Datadog.tracer.active_span
|
221
|
-
# Don't trace empty data
|
222
|
-
return false unless data
|
223
|
-
|
224
|
-
# over 3 traces means that we most certainly send more than only internal traces
|
225
|
-
return true if data.length > 3
|
226
|
-
|
227
|
-
# all spans in all traces shouldn't be only 'datadog.internal' spans
|
228
|
-
!data.respond_to?(:all?) || data.all? do |trace|
|
229
|
-
!trace.respond_to?(:none?) || trace.none? do |span|
|
230
|
-
span.respond_to?(:get_tag) && span.get_tag(Utils::InternalTraces::INTERNAL_TAG)
|
231
|
-
end
|
232
|
-
end
|
233
|
-
end
|
234
|
-
|
235
|
-
def send_traces(data)
|
236
|
-
count = data.length
|
237
|
-
|
238
|
-
payload = internal_child_span('datadog.encode.traces'.freeze) do
|
239
|
-
with_active_internal_span { |s| s.set_tag('traces.count'.freeze, count) }
|
240
|
-
@encoder.encode_traces(data)
|
241
|
-
end
|
242
|
-
|
243
|
-
internal_child_span('datadog.traces.post'.freeze) do
|
244
|
-
post(@api[:traces_endpoint], payload, count) do |response|
|
245
|
-
internal_child_span('datadog.traces.response_callback'.freeze) do
|
246
|
-
process_callback(:traces, response)
|
247
|
-
end
|
248
|
-
end
|
249
|
-
end
|
250
|
-
end
|
251
|
-
|
252
|
-
def send_services(data)
|
253
|
-
payload = internal_child_span('datadog.services.encode'.freeze) do
|
254
|
-
@encoder.encode_services(data)
|
255
|
-
end
|
256
|
-
|
257
|
-
internal_child_span('datadog.services.post'.freeze) do
|
258
|
-
post(@api[:services_endpoint], payload) do |response|
|
259
|
-
internal_child_span('datadog.services.response_callback'.freeze) do
|
260
|
-
process_callback(:services, response)
|
261
|
-
end
|
262
|
-
end
|
263
|
-
end
|
264
|
-
end
|
265
|
-
|
266
206
|
def log_error_once(*args)
|
267
207
|
if @count_consecutive_errors > 0
|
268
208
|
Datadog::Tracer.log.debug(*args)
|
data/lib/ddtrace/utils.rb
CHANGED
data/lib/ddtrace/version.rb
CHANGED
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.15.0
|
4
|
+
version: 0.15.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: 2018-09-
|
11
|
+
date: 2018-09-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: msgpack
|
@@ -420,7 +420,6 @@ files:
|
|
420
420
|
- lib/ddtrace/transport.rb
|
421
421
|
- lib/ddtrace/utils.rb
|
422
422
|
- lib/ddtrace/utils/database.rb
|
423
|
-
- lib/ddtrace/utils/internal_traces.rb
|
424
423
|
- lib/ddtrace/vendor/active_record/connection_specification.rb
|
425
424
|
- lib/ddtrace/version.rb
|
426
425
|
- lib/ddtrace/workers.rb
|
@@ -441,9 +440,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
441
440
|
version: 1.9.1
|
442
441
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
443
442
|
requirements:
|
444
|
-
- - "
|
443
|
+
- - ">="
|
445
444
|
- !ruby/object:Gem::Version
|
446
|
-
version:
|
445
|
+
version: '0'
|
447
446
|
requirements: []
|
448
447
|
rubyforge_project:
|
449
448
|
rubygems_version: 2.7.7
|
@@ -1,53 +0,0 @@
|
|
1
|
-
module Datadog
|
2
|
-
module Utils
|
3
|
-
# Traces generated by the client internals
|
4
|
-
module InternalTraces
|
5
|
-
def self.included(klass)
|
6
|
-
klass.extend(ClassMethods)
|
7
|
-
end
|
8
|
-
|
9
|
-
# ClassMethods
|
10
|
-
module ClassMethods
|
11
|
-
attr_writer :internal_trace_service
|
12
|
-
|
13
|
-
def internal_trace_service
|
14
|
-
@internal_trace_service ||= 'datadog.unknown'.freeze
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
INTERNAL_TAG = 'datadog.internal'.freeze
|
19
|
-
|
20
|
-
def internal_span(name, *args)
|
21
|
-
return yield unless Datadog.tracer.internal_traces
|
22
|
-
|
23
|
-
Datadog.tracer.trace(name, *args) do |span|
|
24
|
-
span.set_tag(INTERNAL_TAG, true)
|
25
|
-
span.service = self.class.internal_trace_service
|
26
|
-
yield
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
def internal_span_when(condition, name, *args, &block)
|
31
|
-
return yield unless Datadog.tracer.internal_traces
|
32
|
-
|
33
|
-
condition = condition.call if condition.respond_to?(:send)
|
34
|
-
return yield unless condition
|
35
|
-
|
36
|
-
internal_span(name, *args, &block)
|
37
|
-
end
|
38
|
-
|
39
|
-
def internal_child_span(name, *args, &block)
|
40
|
-
return yield unless Datadog.tracer.internal_traces
|
41
|
-
|
42
|
-
internal_span_when(-> { Datadog.tracer.active_span }, name, *args, &block)
|
43
|
-
end
|
44
|
-
|
45
|
-
def with_active_internal_span
|
46
|
-
return unless Datadog.tracer.internal_traces
|
47
|
-
|
48
|
-
span = Datadog.tracer.active_span
|
49
|
-
yield(span) if span && span.get_tag(INTERNAL_TAG)
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|