jaeger-client 0.9.0 → 0.10.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7de16fd42664a20ad343e3fdc701f057b93df9e9c8ac6e76d4ea6b36895a7733
|
4
|
+
data.tar.gz: 32421b715a39b2710cae5bf9f7c6ca075872717ac53964de98429f063ebc93ba
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dacf1771b57e8f12074a0426b75b09b6a19610c13d4cb86b687e9930fc24a7e4a20f5c5e2819760e02a88baf01a8438f2175688be57dff2dffd80e5d45303522
|
7
|
+
data.tar.gz: b8bdaa192c6c2109b7711431ec9eebe3e4352e5e71426c65355abd5aad358cf0f4ceaaecb25dec2cf3a622d0982294ea578858234c71682a841f7bb3bb4090c0
|
data/README.md
CHANGED
@@ -43,11 +43,11 @@ To use `HttpSender`:
|
|
43
43
|
```ruby
|
44
44
|
OpenTracing.global_tracer = Jaeger::Client.build(
|
45
45
|
service_name: 'service_name',
|
46
|
-
reporter: Jaeger::
|
47
|
-
sender: Jaeger::
|
46
|
+
reporter: Jaeger::Reporters::RemoteReporter.new(
|
47
|
+
sender: Jaeger::HttpSender.new(
|
48
48
|
url: 'http://localhost:14268/api/traces',
|
49
49
|
headers: { 'key' => 'value' }, # headers key is optional
|
50
|
-
encoder: Jaeger::
|
50
|
+
encoder: Jaeger::Encoders::ThriftEncoder.new(service_name: 'service_name')
|
51
51
|
),
|
52
52
|
flush_interval: 10
|
53
53
|
)
|
@@ -61,7 +61,7 @@ NullReporter ignores all spans.
|
|
61
61
|
```ruby
|
62
62
|
OpenTracing.global_tracer = Jaeger::Client.build(
|
63
63
|
service_name: 'service_name',
|
64
|
-
reporter: Jaeger::
|
64
|
+
reporter: Jaeger::Reporters::NullReporter.new
|
65
65
|
)
|
66
66
|
```
|
67
67
|
|
@@ -72,43 +72,41 @@ LoggingReporter prints some details about the span using `logger`. This is meant
|
|
72
72
|
```ruby
|
73
73
|
OpenTracing.global_tracer = Jaeger::Client.build(
|
74
74
|
service_name: 'service_name',
|
75
|
-
reporter: Jaeger::
|
75
|
+
reporter: Jaeger::Reporters::LoggingReporter.new
|
76
76
|
)
|
77
77
|
```
|
78
78
|
|
79
79
|
LoggingReporter can also use a custom logger. For this provide logger using `logger` keyword argument.
|
80
80
|
|
81
|
-
See [opentracing-ruby](https://github.com/opentracing/opentracing-ruby) for more examples.
|
82
|
-
|
83
81
|
### Samplers
|
84
82
|
|
85
83
|
#### Const sampler
|
86
84
|
|
87
|
-
`Const` sampler always makes the same decision for new traces depending on the initialization value. Set `sampler` to: `Jaeger::
|
85
|
+
`Const` sampler always makes the same decision for new traces depending on the initialization value. Set `sampler` to: `Jaeger::Samplers::Const.new(true)` to mark all new traces as sampled.
|
88
86
|
|
89
87
|
#### Probabilistic sampler
|
90
88
|
|
91
|
-
`Probabilistic` sampler samples traces with probability equal to `rate` (must be between 0.0 and 1.0). This can be enabled by setting `Jaeger::
|
89
|
+
`Probabilistic` sampler samples traces with probability equal to `rate` (must be between 0.0 and 1.0). This can be enabled by setting `Jaeger::Samplers::Probabilistic.new(rate: 0.1)`
|
92
90
|
|
93
91
|
#### RateLimiting sampler
|
94
92
|
|
95
93
|
`RateLimiting` sampler samples at most `max_traces_per_second`. The distribution of sampled traces follows burstiness of the service, i.e. a service with uniformly distributed requests will have those requests sampled uniformly as well, but if requests are bursty, especially sub-second, then a number of sequential requests can be sampled each second.
|
96
94
|
|
97
|
-
Set `sampler` to `Jaeger::
|
95
|
+
Set `sampler` to `Jaeger::Samplers::RateLimiting.new(max_traces_per_second: 100)`
|
98
96
|
|
99
97
|
#### GuaranteedThroughputProbabilistic sampler
|
100
98
|
|
101
99
|
`GuaranteedThroughputProbabilistic` is a sampler that guarantees a throughput by using a Probabilistic sampler and RateLimiting sampler The RateLimiting sampler is used to establish a lower_bound so that every operation is sampled at least once in the time interval defined by the lower_bound.
|
102
100
|
|
103
|
-
Set `sampler` to `Jaeger::
|
101
|
+
Set `sampler` to `Jaeger::Samplers::GuaranteedThroughputProbabilistic.new(lower_bound: 10, rate: 0.001)`
|
104
102
|
|
105
103
|
#### PerOperation sampler
|
106
104
|
|
107
105
|
`PerOperation` sampler leverages both Probabilistic sampler and RateLimiting sampler via the GuaranteedThroughputProbabilistic sampler. This sampler keeps track of all operations and delegates calls the the respective GuaranteedThroughputProbabilistic sampler.
|
108
106
|
|
109
107
|
Set `sampler` to
|
110
|
-
```
|
111
|
-
Jaeger::
|
108
|
+
```ruby
|
109
|
+
Jaeger::Samplers::PerOperation.new(
|
112
110
|
strategies: {
|
113
111
|
per_operation_strategies: [
|
114
112
|
{ operation: 'GET /articles', probabilistic_sampling: 0.5 },
|
@@ -127,14 +125,14 @@ Jaeger Tracer supports Zipkin B3 Propagation HTTP headers, which are used by a l
|
|
127
125
|
|
128
126
|
To set it up you need to change FORMAT_RACK injector and extractor.
|
129
127
|
|
130
|
-
```
|
128
|
+
```ruby
|
131
129
|
OpenTracing.global_tracer = Jaeger::Client.build(
|
132
130
|
service_name: 'service_name',
|
133
131
|
injectors: {
|
134
|
-
OpenTracing::FORMAT_RACK => [Jaeger::
|
132
|
+
OpenTracing::FORMAT_RACK => [Jaeger::Injectors::B3RackCodec]
|
135
133
|
},
|
136
134
|
extractors: {
|
137
|
-
OpenTracing::FORMAT_RACK => [Jaeger::
|
135
|
+
OpenTracing::FORMAT_RACK => [Jaeger::Extractors::B3RackCodec]
|
138
136
|
}
|
139
137
|
)
|
140
138
|
```
|
data/crossdock/server
CHANGED
data/lib/jaeger/client.rb
CHANGED
@@ -6,25 +6,35 @@ require 'opentracing'
|
|
6
6
|
require 'jaeger/thrift/agent'
|
7
7
|
require 'logger'
|
8
8
|
|
9
|
-
require_relative '
|
10
|
-
require_relative '
|
11
|
-
require_relative '
|
12
|
-
require_relative '
|
13
|
-
require_relative '
|
14
|
-
require_relative '
|
15
|
-
require_relative '
|
16
|
-
require_relative '
|
17
|
-
require_relative '
|
18
|
-
require_relative 'client/reporters'
|
9
|
+
require_relative 'tracer'
|
10
|
+
require_relative 'span'
|
11
|
+
require_relative 'span_context'
|
12
|
+
require_relative 'scope'
|
13
|
+
require_relative 'scope_manager'
|
14
|
+
require_relative 'trace_id'
|
15
|
+
require_relative 'udp_sender'
|
16
|
+
require_relative 'http_sender'
|
17
|
+
require_relative 'reporters'
|
19
18
|
require_relative 'client/version'
|
20
|
-
require_relative '
|
21
|
-
require_relative '
|
22
|
-
require_relative '
|
23
|
-
require_relative '
|
24
|
-
require_relative '
|
19
|
+
require_relative 'samplers'
|
20
|
+
require_relative 'encoders/thrift_encoder'
|
21
|
+
require_relative 'injectors'
|
22
|
+
require_relative 'extractors'
|
23
|
+
require_relative 'rate_limiter'
|
25
24
|
|
26
25
|
module Jaeger
|
27
26
|
module Client
|
27
|
+
# We initially had everything under Jaeger::Client namespace. This however
|
28
|
+
# was not very useful and was removed. These assignments are here for
|
29
|
+
# backwards compatibility. Fine to remove in the next major version.
|
30
|
+
UdpSender = Jaeger::UdpSender
|
31
|
+
HttpSender = Jaeger::HttpSender
|
32
|
+
Encoders = Jaeger::Encoders
|
33
|
+
Samplers = Jaeger::Samplers
|
34
|
+
Reporters = Jaeger::Reporters
|
35
|
+
Injectors = Jaeger::Injectors
|
36
|
+
Extractors = Jaeger::Extractors
|
37
|
+
|
28
38
|
DEFAULT_FLUSH_INTERVAL = 10
|
29
39
|
|
30
40
|
def self.build(host: '127.0.0.1',
|
@@ -0,0 +1,92 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Jaeger
|
4
|
+
module Encoders
|
5
|
+
class ThriftEncoder
|
6
|
+
def initialize(service_name:)
|
7
|
+
@service_name = service_name
|
8
|
+
@tags = [
|
9
|
+
Jaeger::Thrift::Tag.new(
|
10
|
+
'key' => 'jaeger.version',
|
11
|
+
'vType' => Jaeger::Thrift::TagType::STRING,
|
12
|
+
'vStr' => 'Ruby-' + Jaeger::Client::VERSION
|
13
|
+
),
|
14
|
+
Jaeger::Thrift::Tag.new(
|
15
|
+
'key' => 'hostname',
|
16
|
+
'vType' => Jaeger::Thrift::TagType::STRING,
|
17
|
+
'vStr' => Socket.gethostname
|
18
|
+
)
|
19
|
+
]
|
20
|
+
ipv4 = Socket.ip_address_list.find { |ai| ai.ipv4? && !ai.ipv4_loopback? }
|
21
|
+
unless ipv4.nil? # rubocop:disable Style/GuardClause
|
22
|
+
@tags << Jaeger::Thrift::Tag.new(
|
23
|
+
'key' => 'ip',
|
24
|
+
'vType' => Jaeger::Thrift::TagType::STRING,
|
25
|
+
'vStr' => ipv4.ip_address
|
26
|
+
)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def encode(spans)
|
31
|
+
Jaeger::Thrift::Batch.new(
|
32
|
+
'process' => Jaeger::Thrift::Process.new(
|
33
|
+
'serviceName' => @service_name,
|
34
|
+
'tags' => @tags
|
35
|
+
),
|
36
|
+
'spans' => spans.map(&method(:encode_span))
|
37
|
+
)
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def encode_span(span)
|
43
|
+
context = span.context
|
44
|
+
start_ts, duration = build_timestamps(span)
|
45
|
+
|
46
|
+
Jaeger::Thrift::Span.new(
|
47
|
+
'traceIdLow' => TraceId.uint64_id_to_int64(context.trace_id),
|
48
|
+
'traceIdHigh' => 0,
|
49
|
+
'spanId' => TraceId.uint64_id_to_int64(context.span_id),
|
50
|
+
'parentSpanId' => TraceId.uint64_id_to_int64(context.parent_id),
|
51
|
+
'operationName' => span.operation_name,
|
52
|
+
'references' => build_references(span.references || []),
|
53
|
+
'flags' => context.flags,
|
54
|
+
'startTime' => start_ts,
|
55
|
+
'duration' => duration,
|
56
|
+
'tags' => span.tags,
|
57
|
+
'logs' => span.logs
|
58
|
+
)
|
59
|
+
end
|
60
|
+
|
61
|
+
def build_references(references)
|
62
|
+
references.map do |ref|
|
63
|
+
Jaeger::Thrift::SpanRef.new(
|
64
|
+
'refType' => span_ref_type(ref.type),
|
65
|
+
'traceIdLow' => TraceId.uint64_id_to_int64(ref.context.trace_id),
|
66
|
+
'traceIdHigh' => 0,
|
67
|
+
'spanId' => TraceId.uint64_id_to_int64(ref.context.span_id)
|
68
|
+
)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def build_timestamps(span)
|
73
|
+
start_ts = (span.start_time.to_f * 1_000_000).to_i
|
74
|
+
end_ts = (span.end_time.to_f * 1_000_000).to_i
|
75
|
+
duration = end_ts - start_ts
|
76
|
+
[start_ts, duration]
|
77
|
+
end
|
78
|
+
|
79
|
+
def span_ref_type(type)
|
80
|
+
case type
|
81
|
+
when OpenTracing::Reference::CHILD_OF
|
82
|
+
Jaeger::Thrift::SpanRefType::CHILD_OF
|
83
|
+
when OpenTracing::Reference::FOLLOWS_FROM
|
84
|
+
Jaeger::Thrift::SpanRefType::FOLLOWS_FROM
|
85
|
+
else
|
86
|
+
warn "Jaeger::Client with format #{type} is not supported yet"
|
87
|
+
nil
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
@@ -0,0 +1,109 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Jaeger
|
4
|
+
module Extractors
|
5
|
+
class SerializedJaegerTrace
|
6
|
+
def self.parse(trace)
|
7
|
+
return nil if !trace || trace == ''
|
8
|
+
|
9
|
+
trace_arguments = trace.split(':').map(&TraceId.method(:base16_hex_id_to_uint64))
|
10
|
+
return nil if trace_arguments.size != 4
|
11
|
+
|
12
|
+
trace_id, span_id, parent_id, flags = trace_arguments
|
13
|
+
return nil if trace_id.zero? || span_id.zero?
|
14
|
+
|
15
|
+
SpanContext.new(
|
16
|
+
trace_id: trace_id,
|
17
|
+
parent_id: parent_id,
|
18
|
+
span_id: span_id,
|
19
|
+
flags: flags
|
20
|
+
)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
class JaegerTextMapCodec
|
25
|
+
def self.extract(carrier)
|
26
|
+
context = SerializedJaegerTrace.parse(carrier['uber-trace-id'])
|
27
|
+
return nil unless context
|
28
|
+
|
29
|
+
carrier.each do |key, value|
|
30
|
+
baggage_match = key.match(/\Auberctx-([\w-]+)\Z/)
|
31
|
+
if baggage_match
|
32
|
+
context.set_baggage_item(baggage_match[1], value)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
context
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
class JaegerRackCodec
|
41
|
+
def self.extract(carrier)
|
42
|
+
serialized_trace = carrier['HTTP_UBER_TRACE_ID']
|
43
|
+
serialized_trace = CGI.unescape(serialized_trace) if serialized_trace
|
44
|
+
context = SerializedJaegerTrace.parse(serialized_trace)
|
45
|
+
return nil unless context
|
46
|
+
|
47
|
+
carrier.each do |key, value|
|
48
|
+
baggage_match = key.match(/\AHTTP_UBERCTX_(\w+)\Z/)
|
49
|
+
if baggage_match
|
50
|
+
key = baggage_match[1].downcase.tr('_', '-')
|
51
|
+
context.set_baggage_item(key, CGI.unescape(value))
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
context
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
class JaegerBinaryCodec
|
60
|
+
def self.extract(_carrier)
|
61
|
+
warn 'Jaeger::Client with binary format is not supported yet'
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
class B3RackCodec
|
66
|
+
def self.extract(carrier)
|
67
|
+
trace_id = TraceId.base16_hex_id_to_uint64(carrier['HTTP_X_B3_TRACEID'])
|
68
|
+
span_id = TraceId.base16_hex_id_to_uint64(carrier['HTTP_X_B3_SPANID'])
|
69
|
+
parent_id = TraceId.base16_hex_id_to_uint64(carrier['HTTP_X_B3_PARENTSPANID'])
|
70
|
+
flags = parse_flags(carrier['HTTP_X_B3_FLAGS'], carrier['HTTP_X_B3_SAMPLED'])
|
71
|
+
|
72
|
+
return nil if span_id.nil? || trace_id.nil?
|
73
|
+
return nil if span_id.zero? || trace_id.zero?
|
74
|
+
|
75
|
+
SpanContext.new(
|
76
|
+
trace_id: trace_id,
|
77
|
+
parent_id: parent_id,
|
78
|
+
span_id: span_id,
|
79
|
+
flags: flags
|
80
|
+
)
|
81
|
+
end
|
82
|
+
|
83
|
+
# if the flags header is '1' then the sampled header should not be present
|
84
|
+
def self.parse_flags(flags_header, sampled_header)
|
85
|
+
if flags_header == '1'
|
86
|
+
Jaeger::SpanContext::Flags::DEBUG
|
87
|
+
else
|
88
|
+
TraceId.base16_hex_id_to_uint64(sampled_header)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
private_class_method :parse_flags
|
92
|
+
end
|
93
|
+
|
94
|
+
DEFAULT_EXTRACTORS = {
|
95
|
+
OpenTracing::FORMAT_TEXT_MAP => JaegerTextMapCodec,
|
96
|
+
OpenTracing::FORMAT_BINARY => JaegerBinaryCodec,
|
97
|
+
OpenTracing::FORMAT_RACK => JaegerRackCodec
|
98
|
+
}.freeze
|
99
|
+
|
100
|
+
def self.prepare(extractors)
|
101
|
+
DEFAULT_EXTRACTORS.reduce(extractors) do |acc, (format, default)|
|
102
|
+
provided_extractors = Array(extractors[format])
|
103
|
+
provided_extractors += [default] if provided_extractors.empty?
|
104
|
+
|
105
|
+
acc.merge(format => provided_extractors)
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'logger'
|
4
|
+
|
5
|
+
module Jaeger
|
6
|
+
class HttpSender
|
7
|
+
def initialize(url:, headers: {}, encoder:, logger: Logger.new(STDOUT))
|
8
|
+
@encoder = encoder
|
9
|
+
@logger = logger
|
10
|
+
|
11
|
+
@uri = URI(url)
|
12
|
+
@uri.query = 'format=jaeger.thrift'
|
13
|
+
|
14
|
+
@transport = ::Thrift::HTTPClientTransport.new(@uri.to_s)
|
15
|
+
@transport.add_headers(headers)
|
16
|
+
|
17
|
+
@serializer = ::Thrift::Serializer.new
|
18
|
+
end
|
19
|
+
|
20
|
+
def send_spans(spans)
|
21
|
+
batch = @encoder.encode(spans)
|
22
|
+
@transport.write(@serializer.serialize(batch))
|
23
|
+
@transport.flush
|
24
|
+
rescue StandardError => error
|
25
|
+
@logger.error("Failure while sending a batch of spans: #{error}")
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Jaeger
|
4
|
+
module Injectors
|
5
|
+
def self.context_as_jaeger_string(span_context)
|
6
|
+
[
|
7
|
+
span_context.trace_id.to_s(16),
|
8
|
+
span_context.span_id.to_s(16),
|
9
|
+
span_context.parent_id.to_s(16),
|
10
|
+
span_context.flags.to_s(16)
|
11
|
+
].join(':')
|
12
|
+
end
|
13
|
+
|
14
|
+
class JaegerTextMapCodec
|
15
|
+
def self.inject(span_context, carrier)
|
16
|
+
carrier['uber-trace-id'] = Injectors.context_as_jaeger_string(span_context)
|
17
|
+
span_context.baggage.each do |key, value|
|
18
|
+
carrier["uberctx-#{key}"] = value
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
class JaegerRackCodec
|
24
|
+
def self.inject(span_context, carrier)
|
25
|
+
carrier['uber-trace-id'] =
|
26
|
+
CGI.escape(Injectors.context_as_jaeger_string(span_context))
|
27
|
+
span_context.baggage.each do |key, value|
|
28
|
+
carrier["uberctx-#{key}"] = CGI.escape(value)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
class JaegerBinaryCodec
|
34
|
+
def self.inject(_span_context, _carrier)
|
35
|
+
warn 'Jaeger::Client with binary format is not supported yet'
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
class B3RackCodec
|
40
|
+
def self.inject(span_context, carrier)
|
41
|
+
carrier['x-b3-traceid'] = TraceId.to_hex(span_context.trace_id)
|
42
|
+
carrier['x-b3-spanid'] = TraceId.to_hex(span_context.span_id)
|
43
|
+
carrier['x-b3-parentspanid'] = TraceId.to_hex(span_context.parent_id)
|
44
|
+
|
45
|
+
# flags (for debug) and sampled headers are mutually exclusive
|
46
|
+
if span_context.flags == Jaeger::SpanContext::Flags::DEBUG
|
47
|
+
carrier['x-b3-flags'] = '1'
|
48
|
+
else
|
49
|
+
carrier['x-b3-sampled'] = span_context.flags.to_s(16)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
DEFAULT_INJECTORS = {
|
55
|
+
OpenTracing::FORMAT_TEXT_MAP => JaegerTextMapCodec,
|
56
|
+
OpenTracing::FORMAT_BINARY => JaegerBinaryCodec,
|
57
|
+
OpenTracing::FORMAT_RACK => JaegerRackCodec
|
58
|
+
}.freeze
|
59
|
+
|
60
|
+
def self.prepare(extractors)
|
61
|
+
DEFAULT_INJECTORS.reduce(extractors) do |acc, (format, default)|
|
62
|
+
provided_extractors = Array(extractors[format])
|
63
|
+
provided_extractors += [default] if provided_extractors.empty?
|
64
|
+
|
65
|
+
acc.merge(format => provided_extractors)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|