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.
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