jaeger-client 0.9.0 → 0.10.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/README.md +14 -16
- data/crossdock/server +1 -1
- data/lib/jaeger/client.rb +25 -15
- data/lib/jaeger/client/version.rb +1 -1
- data/lib/jaeger/encoders/thrift_encoder.rb +92 -0
- data/lib/jaeger/extractors.rb +109 -0
- data/lib/jaeger/http_sender.rb +28 -0
- data/lib/jaeger/injectors.rb +69 -0
- data/lib/jaeger/rate_limiter.rb +61 -0
- data/lib/jaeger/{client/reporters.rb → reporters.rb} +0 -0
- data/lib/jaeger/reporters/composite_reporter.rb +17 -0
- data/lib/jaeger/reporters/in_memory_reporter.rb +30 -0
- data/lib/jaeger/reporters/logging_reporter.rb +22 -0
- data/lib/jaeger/reporters/null_reporter.rb +11 -0
- data/lib/jaeger/reporters/remote_reporter.rb +42 -0
- data/lib/jaeger/reporters/remote_reporter/buffer.rb +29 -0
- data/lib/jaeger/{client/samplers.rb → samplers.rb} +0 -0
- data/lib/jaeger/samplers/const.rb +24 -0
- data/lib/jaeger/samplers/guaranteed_throughput_probabilistic.rb +40 -0
- data/lib/jaeger/samplers/per_operation.rb +47 -0
- data/lib/jaeger/samplers/probabilistic.rb +26 -0
- data/lib/jaeger/samplers/rate_limiting.rb +33 -0
- data/lib/jaeger/scope.rb +38 -0
- data/lib/jaeger/scope_manager.rb +47 -0
- data/lib/jaeger/scope_manager/scope_identifier.rb +13 -0
- data/lib/jaeger/scope_manager/scope_stack.rb +33 -0
- data/lib/jaeger/span.rb +98 -0
- data/lib/jaeger/span/thrift_log_builder.rb +18 -0
- data/lib/jaeger/span/thrift_tag_builder.rb +43 -0
- data/lib/jaeger/span_context.rb +57 -0
- data/lib/jaeger/trace_id.rb +39 -0
- data/lib/jaeger/tracer.rb +195 -0
- data/lib/jaeger/udp_sender.rb +24 -0
- data/lib/jaeger/udp_sender/transport.rb +40 -0
- metadata +31 -32
- data/lib/jaeger/client/carrier.rb +0 -26
- data/lib/jaeger/client/encoders/thrift_encoder.rb +0 -94
- data/lib/jaeger/client/extractors.rb +0 -111
- data/lib/jaeger/client/http_sender.rb +0 -30
- data/lib/jaeger/client/injectors.rb +0 -71
- data/lib/jaeger/client/rate_limiter.rb +0 -63
- data/lib/jaeger/client/reporters/composite_reporter.rb +0 -19
- data/lib/jaeger/client/reporters/in_memory_reporter.rb +0 -32
- data/lib/jaeger/client/reporters/logging_reporter.rb +0 -24
- data/lib/jaeger/client/reporters/null_reporter.rb +0 -13
- data/lib/jaeger/client/reporters/remote_reporter.rb +0 -44
- data/lib/jaeger/client/reporters/remote_reporter/buffer.rb +0 -31
- data/lib/jaeger/client/samplers/const.rb +0 -26
- data/lib/jaeger/client/samplers/guaranteed_throughput_probabilistic.rb +0 -42
- data/lib/jaeger/client/samplers/per_operation.rb +0 -49
- data/lib/jaeger/client/samplers/probabilistic.rb +0 -28
- data/lib/jaeger/client/samplers/rate_limiting.rb +0 -35
- data/lib/jaeger/client/scope.rb +0 -40
- data/lib/jaeger/client/scope_manager.rb +0 -49
- data/lib/jaeger/client/scope_manager/scope_identifier.rb +0 -15
- data/lib/jaeger/client/scope_manager/scope_stack.rb +0 -35
- data/lib/jaeger/client/span.rb +0 -100
- data/lib/jaeger/client/span/thrift_log_builder.rb +0 -20
- data/lib/jaeger/client/span/thrift_tag_builder.rb +0 -45
- data/lib/jaeger/client/span_context.rb +0 -59
- data/lib/jaeger/client/trace_id.rb +0 -41
- data/lib/jaeger/client/tracer.rb +0 -197
- data/lib/jaeger/client/udp_sender.rb +0 -27
- data/lib/jaeger/client/udp_sender/transport.rb +0 -42
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative './udp_sender/transport'
|
4
|
+
require 'socket'
|
5
|
+
|
6
|
+
module Jaeger
|
7
|
+
class UdpSender
|
8
|
+
def initialize(host:, port:, encoder:, logger:)
|
9
|
+
@encoder = encoder
|
10
|
+
@logger = logger
|
11
|
+
|
12
|
+
transport = Transport.new(host, port)
|
13
|
+
protocol = ::Thrift::CompactProtocol.new(transport)
|
14
|
+
@client = Jaeger::Thrift::Agent::Client.new(protocol)
|
15
|
+
end
|
16
|
+
|
17
|
+
def send_spans(spans)
|
18
|
+
batch = @encoder.encode(spans)
|
19
|
+
@client.emitBatch(batch)
|
20
|
+
rescue StandardError => error
|
21
|
+
@logger.error("Failure while sending a batch of spans: #{error}")
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Jaeger
|
4
|
+
class UdpSender
|
5
|
+
class Transport
|
6
|
+
FLAGS = 0
|
7
|
+
|
8
|
+
def initialize(host, port)
|
9
|
+
@socket = UDPSocket.new
|
10
|
+
@host = host
|
11
|
+
@port = port
|
12
|
+
@buffer = ::Thrift::MemoryBufferTransport.new
|
13
|
+
end
|
14
|
+
|
15
|
+
def write(str)
|
16
|
+
@buffer.write(str)
|
17
|
+
end
|
18
|
+
|
19
|
+
def flush
|
20
|
+
data = @buffer.read(@buffer.available)
|
21
|
+
send_bytes(data)
|
22
|
+
end
|
23
|
+
|
24
|
+
def open; end
|
25
|
+
|
26
|
+
def close; end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def send_bytes(bytes)
|
31
|
+
@socket.send(bytes, FLAGS, @host, @port)
|
32
|
+
@socket.flush
|
33
|
+
rescue Errno::ECONNREFUSED
|
34
|
+
warn 'Unable to connect to Jaeger Agent'
|
35
|
+
rescue StandardError => e
|
36
|
+
warn "Unable to send spans: #{e.message}"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jaeger-client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.10.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- SaleMove TechMovers
|
@@ -150,38 +150,37 @@ files:
|
|
150
150
|
- crossdock/server
|
151
151
|
- jaeger-client.gemspec
|
152
152
|
- lib/jaeger/client.rb
|
153
|
-
- lib/jaeger/client/carrier.rb
|
154
|
-
- lib/jaeger/client/encoders/thrift_encoder.rb
|
155
|
-
- lib/jaeger/client/extractors.rb
|
156
|
-
- lib/jaeger/client/http_sender.rb
|
157
|
-
- lib/jaeger/client/injectors.rb
|
158
|
-
- lib/jaeger/client/rate_limiter.rb
|
159
|
-
- lib/jaeger/client/reporters.rb
|
160
|
-
- lib/jaeger/client/reporters/composite_reporter.rb
|
161
|
-
- lib/jaeger/client/reporters/in_memory_reporter.rb
|
162
|
-
- lib/jaeger/client/reporters/logging_reporter.rb
|
163
|
-
- lib/jaeger/client/reporters/null_reporter.rb
|
164
|
-
- lib/jaeger/client/reporters/remote_reporter.rb
|
165
|
-
- lib/jaeger/client/reporters/remote_reporter/buffer.rb
|
166
|
-
- lib/jaeger/client/samplers.rb
|
167
|
-
- lib/jaeger/client/samplers/const.rb
|
168
|
-
- lib/jaeger/client/samplers/guaranteed_throughput_probabilistic.rb
|
169
|
-
- lib/jaeger/client/samplers/per_operation.rb
|
170
|
-
- lib/jaeger/client/samplers/probabilistic.rb
|
171
|
-
- lib/jaeger/client/samplers/rate_limiting.rb
|
172
|
-
- lib/jaeger/client/scope.rb
|
173
|
-
- lib/jaeger/client/scope_manager.rb
|
174
|
-
- lib/jaeger/client/scope_manager/scope_identifier.rb
|
175
|
-
- lib/jaeger/client/scope_manager/scope_stack.rb
|
176
|
-
- lib/jaeger/client/span.rb
|
177
|
-
- lib/jaeger/client/span/thrift_log_builder.rb
|
178
|
-
- lib/jaeger/client/span/thrift_tag_builder.rb
|
179
|
-
- lib/jaeger/client/span_context.rb
|
180
|
-
- lib/jaeger/client/trace_id.rb
|
181
|
-
- lib/jaeger/client/tracer.rb
|
182
|
-
- lib/jaeger/client/udp_sender.rb
|
183
|
-
- lib/jaeger/client/udp_sender/transport.rb
|
184
153
|
- lib/jaeger/client/version.rb
|
154
|
+
- lib/jaeger/encoders/thrift_encoder.rb
|
155
|
+
- lib/jaeger/extractors.rb
|
156
|
+
- lib/jaeger/http_sender.rb
|
157
|
+
- lib/jaeger/injectors.rb
|
158
|
+
- lib/jaeger/rate_limiter.rb
|
159
|
+
- lib/jaeger/reporters.rb
|
160
|
+
- lib/jaeger/reporters/composite_reporter.rb
|
161
|
+
- lib/jaeger/reporters/in_memory_reporter.rb
|
162
|
+
- lib/jaeger/reporters/logging_reporter.rb
|
163
|
+
- lib/jaeger/reporters/null_reporter.rb
|
164
|
+
- lib/jaeger/reporters/remote_reporter.rb
|
165
|
+
- lib/jaeger/reporters/remote_reporter/buffer.rb
|
166
|
+
- lib/jaeger/samplers.rb
|
167
|
+
- lib/jaeger/samplers/const.rb
|
168
|
+
- lib/jaeger/samplers/guaranteed_throughput_probabilistic.rb
|
169
|
+
- lib/jaeger/samplers/per_operation.rb
|
170
|
+
- lib/jaeger/samplers/probabilistic.rb
|
171
|
+
- lib/jaeger/samplers/rate_limiting.rb
|
172
|
+
- lib/jaeger/scope.rb
|
173
|
+
- lib/jaeger/scope_manager.rb
|
174
|
+
- lib/jaeger/scope_manager/scope_identifier.rb
|
175
|
+
- lib/jaeger/scope_manager/scope_stack.rb
|
176
|
+
- lib/jaeger/span.rb
|
177
|
+
- lib/jaeger/span/thrift_log_builder.rb
|
178
|
+
- lib/jaeger/span/thrift_tag_builder.rb
|
179
|
+
- lib/jaeger/span_context.rb
|
180
|
+
- lib/jaeger/trace_id.rb
|
181
|
+
- lib/jaeger/tracer.rb
|
182
|
+
- lib/jaeger/udp_sender.rb
|
183
|
+
- lib/jaeger/udp_sender/transport.rb
|
185
184
|
- script/create_follows_from_trace
|
186
185
|
- script/create_trace
|
187
186
|
- thrift/agent.thrift
|
@@ -1,26 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Jaeger
|
4
|
-
module Client
|
5
|
-
# Carriers are used for inject and extract operations. A carrier should be a
|
6
|
-
# Hash or hash-like object. At a minimum, it should implement `[]`, `[]=`, and
|
7
|
-
# `each` shown here.
|
8
|
-
class Carrier
|
9
|
-
# [] retrieves a value by the given key
|
10
|
-
# @param key [String] key to retrieve the value
|
11
|
-
# @return [String] the desired value
|
12
|
-
def [](key); end
|
13
|
-
|
14
|
-
# []= sets the value for the given key
|
15
|
-
# @param key [String] key to set
|
16
|
-
# @param value [String] value to set
|
17
|
-
def []=(key, value); end
|
18
|
-
|
19
|
-
# each iterates over every key-value pair in the carrier
|
20
|
-
# @yield [key, value]
|
21
|
-
# @yieldparam key [String] the key of the tuple
|
22
|
-
# @yieldparam value [String] the value of the tuple
|
23
|
-
def each(&block); end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
@@ -1,94 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Jaeger
|
4
|
-
module Client
|
5
|
-
module Encoders
|
6
|
-
class ThriftEncoder
|
7
|
-
def initialize(service_name:)
|
8
|
-
@service_name = service_name
|
9
|
-
@tags = [
|
10
|
-
Jaeger::Thrift::Tag.new(
|
11
|
-
'key' => 'jaeger.version',
|
12
|
-
'vType' => Jaeger::Thrift::TagType::STRING,
|
13
|
-
'vStr' => 'Ruby-' + Jaeger::Client::VERSION
|
14
|
-
),
|
15
|
-
Jaeger::Thrift::Tag.new(
|
16
|
-
'key' => 'hostname',
|
17
|
-
'vType' => Jaeger::Thrift::TagType::STRING,
|
18
|
-
'vStr' => Socket.gethostname
|
19
|
-
)
|
20
|
-
]
|
21
|
-
ipv4 = Socket.ip_address_list.find { |ai| ai.ipv4? && !ai.ipv4_loopback? }
|
22
|
-
unless ipv4.nil? # rubocop:disable Style/GuardClause
|
23
|
-
@tags << Jaeger::Thrift::Tag.new(
|
24
|
-
'key' => 'ip',
|
25
|
-
'vType' => Jaeger::Thrift::TagType::STRING,
|
26
|
-
'vStr' => ipv4.ip_address
|
27
|
-
)
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
def encode(spans)
|
32
|
-
Jaeger::Thrift::Batch.new(
|
33
|
-
'process' => Jaeger::Thrift::Process.new(
|
34
|
-
'serviceName' => @service_name,
|
35
|
-
'tags' => @tags
|
36
|
-
),
|
37
|
-
'spans' => spans.map(&method(:encode_span))
|
38
|
-
)
|
39
|
-
end
|
40
|
-
|
41
|
-
private
|
42
|
-
|
43
|
-
def encode_span(span)
|
44
|
-
context = span.context
|
45
|
-
start_ts, duration = build_timestamps(span)
|
46
|
-
|
47
|
-
Jaeger::Thrift::Span.new(
|
48
|
-
'traceIdLow' => TraceId.uint64_id_to_int64(context.trace_id),
|
49
|
-
'traceIdHigh' => 0,
|
50
|
-
'spanId' => TraceId.uint64_id_to_int64(context.span_id),
|
51
|
-
'parentSpanId' => TraceId.uint64_id_to_int64(context.parent_id),
|
52
|
-
'operationName' => span.operation_name,
|
53
|
-
'references' => build_references(span.references || []),
|
54
|
-
'flags' => context.flags,
|
55
|
-
'startTime' => start_ts,
|
56
|
-
'duration' => duration,
|
57
|
-
'tags' => span.tags,
|
58
|
-
'logs' => span.logs
|
59
|
-
)
|
60
|
-
end
|
61
|
-
|
62
|
-
def build_references(references)
|
63
|
-
references.map do |ref|
|
64
|
-
Jaeger::Thrift::SpanRef.new(
|
65
|
-
'refType' => span_ref_type(ref.type),
|
66
|
-
'traceIdLow' => TraceId.uint64_id_to_int64(ref.context.trace_id),
|
67
|
-
'traceIdHigh' => 0,
|
68
|
-
'spanId' => TraceId.uint64_id_to_int64(ref.context.span_id)
|
69
|
-
)
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
def build_timestamps(span)
|
74
|
-
start_ts = (span.start_time.to_f * 1_000_000).to_i
|
75
|
-
end_ts = (span.end_time.to_f * 1_000_000).to_i
|
76
|
-
duration = end_ts - start_ts
|
77
|
-
[start_ts, duration]
|
78
|
-
end
|
79
|
-
|
80
|
-
def span_ref_type(type)
|
81
|
-
case type
|
82
|
-
when OpenTracing::Reference::CHILD_OF
|
83
|
-
Jaeger::Thrift::SpanRefType::CHILD_OF
|
84
|
-
when OpenTracing::Reference::FOLLOWS_FROM
|
85
|
-
Jaeger::Thrift::SpanRefType::FOLLOWS_FROM
|
86
|
-
else
|
87
|
-
warn "Jaeger::Client with format #{type} is not supported yet"
|
88
|
-
nil
|
89
|
-
end
|
90
|
-
end
|
91
|
-
end
|
92
|
-
end
|
93
|
-
end
|
94
|
-
end
|
@@ -1,111 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Jaeger
|
4
|
-
module Client
|
5
|
-
module Extractors
|
6
|
-
class SerializedJaegerTrace
|
7
|
-
def self.parse(trace)
|
8
|
-
return nil if !trace || trace == ''
|
9
|
-
|
10
|
-
trace_arguments = trace.split(':').map(&TraceId.method(:base16_hex_id_to_uint64))
|
11
|
-
return nil if trace_arguments.size != 4
|
12
|
-
|
13
|
-
trace_id, span_id, parent_id, flags = trace_arguments
|
14
|
-
return nil if trace_id.zero? || span_id.zero?
|
15
|
-
|
16
|
-
SpanContext.new(
|
17
|
-
trace_id: trace_id,
|
18
|
-
parent_id: parent_id,
|
19
|
-
span_id: span_id,
|
20
|
-
flags: flags
|
21
|
-
)
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
class JaegerTextMapCodec
|
26
|
-
def self.extract(carrier)
|
27
|
-
context = SerializedJaegerTrace.parse(carrier['uber-trace-id'])
|
28
|
-
return nil unless context
|
29
|
-
|
30
|
-
carrier.each do |key, value|
|
31
|
-
baggage_match = key.match(/\Auberctx-([\w-]+)\Z/)
|
32
|
-
if baggage_match
|
33
|
-
context.set_baggage_item(baggage_match[1], value)
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
context
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
class JaegerRackCodec
|
42
|
-
def self.extract(carrier)
|
43
|
-
serialized_trace = carrier['HTTP_UBER_TRACE_ID']
|
44
|
-
serialized_trace = CGI.unescape(serialized_trace) if serialized_trace
|
45
|
-
context = SerializedJaegerTrace.parse(serialized_trace)
|
46
|
-
return nil unless context
|
47
|
-
|
48
|
-
carrier.each do |key, value|
|
49
|
-
baggage_match = key.match(/\AHTTP_UBERCTX_(\w+)\Z/)
|
50
|
-
if baggage_match
|
51
|
-
key = baggage_match[1].downcase.tr('_', '-')
|
52
|
-
context.set_baggage_item(key, CGI.unescape(value))
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
context
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
class JaegerBinaryCodec
|
61
|
-
def self.extract(_carrier)
|
62
|
-
warn 'Jaeger::Client with binary format is not supported yet'
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
class B3RackCodec
|
67
|
-
def self.extract(carrier)
|
68
|
-
trace_id = TraceId.base16_hex_id_to_uint64(carrier['HTTP_X_B3_TRACEID'])
|
69
|
-
span_id = TraceId.base16_hex_id_to_uint64(carrier['HTTP_X_B3_SPANID'])
|
70
|
-
parent_id = TraceId.base16_hex_id_to_uint64(carrier['HTTP_X_B3_PARENTSPANID'])
|
71
|
-
flags = parse_flags(carrier['HTTP_X_B3_FLAGS'], carrier['HTTP_X_B3_SAMPLED'])
|
72
|
-
|
73
|
-
return nil if span_id.nil? || trace_id.nil?
|
74
|
-
return nil if span_id.zero? || trace_id.zero?
|
75
|
-
|
76
|
-
SpanContext.new(
|
77
|
-
trace_id: trace_id,
|
78
|
-
parent_id: parent_id,
|
79
|
-
span_id: span_id,
|
80
|
-
flags: flags
|
81
|
-
)
|
82
|
-
end
|
83
|
-
|
84
|
-
# if the flags header is '1' then the sampled header should not be present
|
85
|
-
def self.parse_flags(flags_header, sampled_header)
|
86
|
-
if flags_header == '1'
|
87
|
-
Jaeger::Client::SpanContext::Flags::DEBUG
|
88
|
-
else
|
89
|
-
TraceId.base16_hex_id_to_uint64(sampled_header)
|
90
|
-
end
|
91
|
-
end
|
92
|
-
private_class_method :parse_flags
|
93
|
-
end
|
94
|
-
|
95
|
-
DEFAULT_EXTRACTORS = {
|
96
|
-
OpenTracing::FORMAT_TEXT_MAP => JaegerTextMapCodec,
|
97
|
-
OpenTracing::FORMAT_BINARY => JaegerBinaryCodec,
|
98
|
-
OpenTracing::FORMAT_RACK => JaegerRackCodec
|
99
|
-
}.freeze
|
100
|
-
|
101
|
-
def self.prepare(extractors)
|
102
|
-
DEFAULT_EXTRACTORS.reduce(extractors) do |acc, (format, default)|
|
103
|
-
provided_extractors = Array(extractors[format])
|
104
|
-
provided_extractors += [default] if provided_extractors.empty?
|
105
|
-
|
106
|
-
acc.merge(format => provided_extractors)
|
107
|
-
end
|
108
|
-
end
|
109
|
-
end
|
110
|
-
end
|
111
|
-
end
|
@@ -1,30 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'logger'
|
4
|
-
|
5
|
-
module Jaeger
|
6
|
-
module Client
|
7
|
-
class HttpSender
|
8
|
-
def initialize(url:, headers: {}, encoder:, logger: Logger.new(STDOUT))
|
9
|
-
@encoder = encoder
|
10
|
-
@logger = logger
|
11
|
-
|
12
|
-
@uri = URI(url)
|
13
|
-
@uri.query = 'format=jaeger.thrift'
|
14
|
-
|
15
|
-
@transport = ::Thrift::HTTPClientTransport.new(@uri.to_s)
|
16
|
-
@transport.add_headers(headers)
|
17
|
-
|
18
|
-
@serializer = ::Thrift::Serializer.new
|
19
|
-
end
|
20
|
-
|
21
|
-
def send_spans(spans)
|
22
|
-
batch = @encoder.encode(spans)
|
23
|
-
@transport.write(@serializer.serialize(batch))
|
24
|
-
@transport.flush
|
25
|
-
rescue StandardError => error
|
26
|
-
@logger.error("Failure while sending a batch of spans: #{error}")
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
@@ -1,71 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Jaeger
|
4
|
-
module Client
|
5
|
-
module Injectors
|
6
|
-
def self.context_as_jaeger_string(span_context)
|
7
|
-
[
|
8
|
-
span_context.trace_id.to_s(16),
|
9
|
-
span_context.span_id.to_s(16),
|
10
|
-
span_context.parent_id.to_s(16),
|
11
|
-
span_context.flags.to_s(16)
|
12
|
-
].join(':')
|
13
|
-
end
|
14
|
-
|
15
|
-
class JaegerTextMapCodec
|
16
|
-
def self.inject(span_context, carrier)
|
17
|
-
carrier['uber-trace-id'] = Injectors.context_as_jaeger_string(span_context)
|
18
|
-
span_context.baggage.each do |key, value|
|
19
|
-
carrier["uberctx-#{key}"] = value
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
class JaegerRackCodec
|
25
|
-
def self.inject(span_context, carrier)
|
26
|
-
carrier['uber-trace-id'] =
|
27
|
-
CGI.escape(Injectors.context_as_jaeger_string(span_context))
|
28
|
-
span_context.baggage.each do |key, value|
|
29
|
-
carrier["uberctx-#{key}"] = CGI.escape(value)
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
class JaegerBinaryCodec
|
35
|
-
def self.inject(_span_context, _carrier)
|
36
|
-
warn 'Jaeger::Client with binary format is not supported yet'
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
class B3RackCodec
|
41
|
-
def self.inject(span_context, carrier)
|
42
|
-
carrier['x-b3-traceid'] = TraceId.to_hex(span_context.trace_id)
|
43
|
-
carrier['x-b3-spanid'] = TraceId.to_hex(span_context.span_id)
|
44
|
-
carrier['x-b3-parentspanid'] = TraceId.to_hex(span_context.parent_id)
|
45
|
-
|
46
|
-
# flags (for debug) and sampled headers are mutually exclusive
|
47
|
-
if span_context.flags == Jaeger::Client::SpanContext::Flags::DEBUG
|
48
|
-
carrier['x-b3-flags'] = '1'
|
49
|
-
else
|
50
|
-
carrier['x-b3-sampled'] = span_context.flags.to_s(16)
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
DEFAULT_INJECTORS = {
|
56
|
-
OpenTracing::FORMAT_TEXT_MAP => JaegerTextMapCodec,
|
57
|
-
OpenTracing::FORMAT_BINARY => JaegerBinaryCodec,
|
58
|
-
OpenTracing::FORMAT_RACK => JaegerRackCodec
|
59
|
-
}.freeze
|
60
|
-
|
61
|
-
def self.prepare(extractors)
|
62
|
-
DEFAULT_INJECTORS.reduce(extractors) do |acc, (format, default)|
|
63
|
-
provided_extractors = Array(extractors[format])
|
64
|
-
provided_extractors += [default] if provided_extractors.empty?
|
65
|
-
|
66
|
-
acc.merge(format => provided_extractors)
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|