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.
Files changed (65) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +14 -16
  3. data/crossdock/server +1 -1
  4. data/lib/jaeger/client.rb +25 -15
  5. data/lib/jaeger/client/version.rb +1 -1
  6. data/lib/jaeger/encoders/thrift_encoder.rb +92 -0
  7. data/lib/jaeger/extractors.rb +109 -0
  8. data/lib/jaeger/http_sender.rb +28 -0
  9. data/lib/jaeger/injectors.rb +69 -0
  10. data/lib/jaeger/rate_limiter.rb +61 -0
  11. data/lib/jaeger/{client/reporters.rb → reporters.rb} +0 -0
  12. data/lib/jaeger/reporters/composite_reporter.rb +17 -0
  13. data/lib/jaeger/reporters/in_memory_reporter.rb +30 -0
  14. data/lib/jaeger/reporters/logging_reporter.rb +22 -0
  15. data/lib/jaeger/reporters/null_reporter.rb +11 -0
  16. data/lib/jaeger/reporters/remote_reporter.rb +42 -0
  17. data/lib/jaeger/reporters/remote_reporter/buffer.rb +29 -0
  18. data/lib/jaeger/{client/samplers.rb → samplers.rb} +0 -0
  19. data/lib/jaeger/samplers/const.rb +24 -0
  20. data/lib/jaeger/samplers/guaranteed_throughput_probabilistic.rb +40 -0
  21. data/lib/jaeger/samplers/per_operation.rb +47 -0
  22. data/lib/jaeger/samplers/probabilistic.rb +26 -0
  23. data/lib/jaeger/samplers/rate_limiting.rb +33 -0
  24. data/lib/jaeger/scope.rb +38 -0
  25. data/lib/jaeger/scope_manager.rb +47 -0
  26. data/lib/jaeger/scope_manager/scope_identifier.rb +13 -0
  27. data/lib/jaeger/scope_manager/scope_stack.rb +33 -0
  28. data/lib/jaeger/span.rb +98 -0
  29. data/lib/jaeger/span/thrift_log_builder.rb +18 -0
  30. data/lib/jaeger/span/thrift_tag_builder.rb +43 -0
  31. data/lib/jaeger/span_context.rb +57 -0
  32. data/lib/jaeger/trace_id.rb +39 -0
  33. data/lib/jaeger/tracer.rb +195 -0
  34. data/lib/jaeger/udp_sender.rb +24 -0
  35. data/lib/jaeger/udp_sender/transport.rb +40 -0
  36. metadata +31 -32
  37. data/lib/jaeger/client/carrier.rb +0 -26
  38. data/lib/jaeger/client/encoders/thrift_encoder.rb +0 -94
  39. data/lib/jaeger/client/extractors.rb +0 -111
  40. data/lib/jaeger/client/http_sender.rb +0 -30
  41. data/lib/jaeger/client/injectors.rb +0 -71
  42. data/lib/jaeger/client/rate_limiter.rb +0 -63
  43. data/lib/jaeger/client/reporters/composite_reporter.rb +0 -19
  44. data/lib/jaeger/client/reporters/in_memory_reporter.rb +0 -32
  45. data/lib/jaeger/client/reporters/logging_reporter.rb +0 -24
  46. data/lib/jaeger/client/reporters/null_reporter.rb +0 -13
  47. data/lib/jaeger/client/reporters/remote_reporter.rb +0 -44
  48. data/lib/jaeger/client/reporters/remote_reporter/buffer.rb +0 -31
  49. data/lib/jaeger/client/samplers/const.rb +0 -26
  50. data/lib/jaeger/client/samplers/guaranteed_throughput_probabilistic.rb +0 -42
  51. data/lib/jaeger/client/samplers/per_operation.rb +0 -49
  52. data/lib/jaeger/client/samplers/probabilistic.rb +0 -28
  53. data/lib/jaeger/client/samplers/rate_limiting.rb +0 -35
  54. data/lib/jaeger/client/scope.rb +0 -40
  55. data/lib/jaeger/client/scope_manager.rb +0 -49
  56. data/lib/jaeger/client/scope_manager/scope_identifier.rb +0 -15
  57. data/lib/jaeger/client/scope_manager/scope_stack.rb +0 -35
  58. data/lib/jaeger/client/span.rb +0 -100
  59. data/lib/jaeger/client/span/thrift_log_builder.rb +0 -20
  60. data/lib/jaeger/client/span/thrift_tag_builder.rb +0 -45
  61. data/lib/jaeger/client/span_context.rb +0 -59
  62. data/lib/jaeger/client/trace_id.rb +0 -41
  63. data/lib/jaeger/client/tracer.rb +0 -197
  64. data/lib/jaeger/client/udp_sender.rb +0 -27
  65. 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.9.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