jaeger-client 0.7.1 → 1.1.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 (70) hide show
  1. checksums.yaml +4 -4
  2. data/.gitmodules +3 -0
  3. data/.rubocop.yml +3 -0
  4. data/.travis.yml +11 -2
  5. data/Makefile +1 -0
  6. data/README.md +127 -13
  7. data/crossdock/Dockerfile +29 -0
  8. data/crossdock/Gemfile +6 -0
  9. data/crossdock/Gemfile.lock +35 -0
  10. data/crossdock/docker-compose.yml +68 -0
  11. data/crossdock/jaeger-docker-compose.yml +48 -0
  12. data/crossdock/rules.mk +35 -0
  13. data/crossdock/server +173 -0
  14. data/jaeger-client.gemspec +4 -2
  15. data/lib/jaeger/client.rb +42 -18
  16. data/lib/jaeger/client/version.rb +1 -1
  17. data/lib/jaeger/encoders/thrift_encoder.rb +142 -0
  18. data/lib/jaeger/extractors.rb +173 -0
  19. data/lib/jaeger/http_sender.rb +28 -0
  20. data/lib/jaeger/injectors.rb +83 -0
  21. data/lib/jaeger/rate_limiter.rb +61 -0
  22. data/lib/jaeger/recurring_executor.rb +35 -0
  23. data/lib/jaeger/reporters.rb +7 -0
  24. data/lib/jaeger/reporters/composite_reporter.rb +17 -0
  25. data/lib/jaeger/reporters/in_memory_reporter.rb +30 -0
  26. data/lib/jaeger/reporters/logging_reporter.rb +22 -0
  27. data/lib/jaeger/reporters/null_reporter.rb +11 -0
  28. data/lib/jaeger/{client/async_reporter.rb → reporters/remote_reporter.rb} +21 -20
  29. data/lib/jaeger/{client/async_reporter → reporters/remote_reporter}/buffer.rb +2 -2
  30. data/lib/jaeger/samplers.rb +8 -0
  31. data/lib/jaeger/samplers/const.rb +24 -0
  32. data/lib/jaeger/samplers/guaranteed_throughput_probabilistic.rb +47 -0
  33. data/lib/jaeger/samplers/per_operation.rb +79 -0
  34. data/lib/jaeger/samplers/probabilistic.rb +38 -0
  35. data/lib/jaeger/samplers/rate_limiting.rb +51 -0
  36. data/lib/jaeger/samplers/remote_controlled.rb +119 -0
  37. data/lib/jaeger/samplers/remote_controlled/instructions_fetcher.rb +34 -0
  38. data/lib/jaeger/scope.rb +38 -0
  39. data/lib/jaeger/scope_manager.rb +47 -0
  40. data/lib/jaeger/scope_manager/scope_identifier.rb +13 -0
  41. data/lib/jaeger/scope_manager/scope_stack.rb +33 -0
  42. data/lib/jaeger/span.rb +97 -0
  43. data/lib/jaeger/span/thrift_log_builder.rb +18 -0
  44. data/lib/jaeger/span_context.rb +57 -0
  45. data/lib/jaeger/thrift_tag_builder.rb +41 -0
  46. data/lib/jaeger/trace_id.rb +48 -0
  47. data/lib/jaeger/tracer.rb +213 -0
  48. data/lib/jaeger/udp_sender.rb +26 -0
  49. data/lib/jaeger/udp_sender/transport.rb +40 -0
  50. metadata +78 -31
  51. data/lib/jaeger/client/carrier.rb +0 -26
  52. data/lib/jaeger/client/encoders/thrift_encoder.rb +0 -94
  53. data/lib/jaeger/client/extractors.rb +0 -88
  54. data/lib/jaeger/client/http_sender.rb +0 -30
  55. data/lib/jaeger/client/injectors.rb +0 -54
  56. data/lib/jaeger/client/samplers.rb +0 -4
  57. data/lib/jaeger/client/samplers/const.rb +0 -29
  58. data/lib/jaeger/client/samplers/probabilistic.rb +0 -30
  59. data/lib/jaeger/client/scope.rb +0 -40
  60. data/lib/jaeger/client/scope_manager.rb +0 -49
  61. data/lib/jaeger/client/scope_manager/scope_identifier.rb +0 -15
  62. data/lib/jaeger/client/scope_manager/scope_stack.rb +0 -35
  63. data/lib/jaeger/client/span.rb +0 -84
  64. data/lib/jaeger/client/span/thrift_log_builder.rb +0 -20
  65. data/lib/jaeger/client/span/thrift_tag_builder.rb +0 -45
  66. data/lib/jaeger/client/span_context.rb +0 -59
  67. data/lib/jaeger/client/trace_id.rb +0 -41
  68. data/lib/jaeger/client/tracer.rb +0 -189
  69. data/lib/jaeger/client/udp_sender.rb +0 -27
  70. data/lib/jaeger/client/udp_sender/transport.rb +0 -42
@@ -0,0 +1,26 @@
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:, max_packet_size: 65_000)
9
+ @encoder = encoder
10
+ @logger = logger
11
+
12
+ transport = Transport.new(host, port)
13
+ @protocol_class = ::Thrift::CompactProtocol
14
+ protocol = @protocol_class.new(transport)
15
+ @client = Jaeger::Thrift::Agent::Client.new(protocol)
16
+ @max_packet_size = max_packet_size
17
+ end
18
+
19
+ def send_spans(spans)
20
+ batches = @encoder.encode_limited_size(spans, @protocol_class, @max_packet_size)
21
+ batches.each { |batch| @client.emitBatch(batch) }
22
+ rescue StandardError => error
23
+ @logger.error("Failure while sending a batch of spans: #{error}")
24
+ end
25
+ end
26
+ 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,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jaeger-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.1
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - SaleMove TechMovers
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-12-16 00:00:00.000000000 Z
11
+ date: 2020-08-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '1.14'
19
+ version: '0'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '1.14'
26
+ version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -80,6 +80,34 @@ dependencies:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
82
  version: 1.24.0
83
+ - !ruby/object:Gem::Dependency
84
+ name: timecop
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '0.9'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '0.9'
97
+ - !ruby/object:Gem::Dependency
98
+ name: webmock
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: 3.4.2
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: 3.4.2
83
111
  - !ruby/object:Gem::Dependency
84
112
  name: opentracing
85
113
  requirement: !ruby/object:Gem::Requirement
@@ -116,40 +144,60 @@ extensions: []
116
144
  extra_rdoc_files: []
117
145
  files:
118
146
  - ".gitignore"
147
+ - ".gitmodules"
119
148
  - ".rspec"
120
149
  - ".rubocop.yml"
121
150
  - ".travis.yml"
122
151
  - Gemfile
123
152
  - LICENSE.txt
153
+ - Makefile
124
154
  - README.md
125
155
  - Rakefile
126
156
  - bin/console
127
157
  - bin/setup
158
+ - crossdock/Dockerfile
159
+ - crossdock/Gemfile
160
+ - crossdock/Gemfile.lock
161
+ - crossdock/docker-compose.yml
162
+ - crossdock/jaeger-docker-compose.yml
163
+ - crossdock/rules.mk
164
+ - crossdock/server
128
165
  - jaeger-client.gemspec
129
166
  - lib/jaeger/client.rb
130
- - lib/jaeger/client/async_reporter.rb
131
- - lib/jaeger/client/async_reporter/buffer.rb
132
- - lib/jaeger/client/carrier.rb
133
- - lib/jaeger/client/encoders/thrift_encoder.rb
134
- - lib/jaeger/client/extractors.rb
135
- - lib/jaeger/client/http_sender.rb
136
- - lib/jaeger/client/injectors.rb
137
- - lib/jaeger/client/samplers.rb
138
- - lib/jaeger/client/samplers/const.rb
139
- - lib/jaeger/client/samplers/probabilistic.rb
140
- - lib/jaeger/client/scope.rb
141
- - lib/jaeger/client/scope_manager.rb
142
- - lib/jaeger/client/scope_manager/scope_identifier.rb
143
- - lib/jaeger/client/scope_manager/scope_stack.rb
144
- - lib/jaeger/client/span.rb
145
- - lib/jaeger/client/span/thrift_log_builder.rb
146
- - lib/jaeger/client/span/thrift_tag_builder.rb
147
- - lib/jaeger/client/span_context.rb
148
- - lib/jaeger/client/trace_id.rb
149
- - lib/jaeger/client/tracer.rb
150
- - lib/jaeger/client/udp_sender.rb
151
- - lib/jaeger/client/udp_sender/transport.rb
152
167
  - lib/jaeger/client/version.rb
168
+ - lib/jaeger/encoders/thrift_encoder.rb
169
+ - lib/jaeger/extractors.rb
170
+ - lib/jaeger/http_sender.rb
171
+ - lib/jaeger/injectors.rb
172
+ - lib/jaeger/rate_limiter.rb
173
+ - lib/jaeger/recurring_executor.rb
174
+ - lib/jaeger/reporters.rb
175
+ - lib/jaeger/reporters/composite_reporter.rb
176
+ - lib/jaeger/reporters/in_memory_reporter.rb
177
+ - lib/jaeger/reporters/logging_reporter.rb
178
+ - lib/jaeger/reporters/null_reporter.rb
179
+ - lib/jaeger/reporters/remote_reporter.rb
180
+ - lib/jaeger/reporters/remote_reporter/buffer.rb
181
+ - lib/jaeger/samplers.rb
182
+ - lib/jaeger/samplers/const.rb
183
+ - lib/jaeger/samplers/guaranteed_throughput_probabilistic.rb
184
+ - lib/jaeger/samplers/per_operation.rb
185
+ - lib/jaeger/samplers/probabilistic.rb
186
+ - lib/jaeger/samplers/rate_limiting.rb
187
+ - lib/jaeger/samplers/remote_controlled.rb
188
+ - lib/jaeger/samplers/remote_controlled/instructions_fetcher.rb
189
+ - lib/jaeger/scope.rb
190
+ - lib/jaeger/scope_manager.rb
191
+ - lib/jaeger/scope_manager/scope_identifier.rb
192
+ - lib/jaeger/scope_manager/scope_stack.rb
193
+ - lib/jaeger/span.rb
194
+ - lib/jaeger/span/thrift_log_builder.rb
195
+ - lib/jaeger/span_context.rb
196
+ - lib/jaeger/thrift_tag_builder.rb
197
+ - lib/jaeger/trace_id.rb
198
+ - lib/jaeger/tracer.rb
199
+ - lib/jaeger/udp_sender.rb
200
+ - lib/jaeger/udp_sender/transport.rb
153
201
  - script/create_follows_from_trace
154
202
  - script/create_trace
155
203
  - thrift/agent.thrift
@@ -167,7 +215,7 @@ files:
167
215
  - thrift/gen-rb/jaeger/thrift/zipkin/zipkincore_types.rb
168
216
  - thrift/jaeger.thrift
169
217
  - thrift/zipkincore.thrift
170
- homepage: ''
218
+ homepage: https://github.com/salemove/jaeger-client-ruby
171
219
  licenses:
172
220
  - MIT
173
221
  metadata: {}
@@ -186,8 +234,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
186
234
  - !ruby/object:Gem::Version
187
235
  version: '0'
188
236
  requirements: []
189
- rubyforge_project:
190
- rubygems_version: 2.7.7
237
+ rubygems_version: 3.0.3
191
238
  signing_key:
192
239
  specification_version: 4
193
240
  summary: OpenTracing Tracer implementation for Jaeger in Ruby
@@ -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,88 +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
- SerializedJaegerTrace.parse(carrier['uber-trace-id'])
28
- end
29
- end
30
-
31
- class JaegerRackCodec
32
- def self.extract(carrier)
33
- SerializedJaegerTrace.parse(carrier['HTTP_UBER_TRACE_ID'])
34
- end
35
- end
36
-
37
- class JaegerBinaryCodec
38
- def self.extract(_carrier)
39
- warn 'Jaeger::Client with binary format is not supported yet'
40
- end
41
- end
42
-
43
- class B3RackCodec
44
- def self.extract(carrier)
45
- trace_id = TraceId.base16_hex_id_to_uint64(carrier['HTTP_X_B3_TRACEID'])
46
- span_id = TraceId.base16_hex_id_to_uint64(carrier['HTTP_X_B3_SPANID'])
47
- parent_id = TraceId.base16_hex_id_to_uint64(carrier['HTTP_X_B3_PARENTSPANID'])
48
- flags = parse_flags(carrier['HTTP_X_B3_FLAGS'], carrier['HTTP_X_B3_SAMPLED'])
49
-
50
- return nil if span_id.nil? || trace_id.nil?
51
- return nil if span_id.zero? || trace_id.zero?
52
-
53
- SpanContext.new(
54
- trace_id: trace_id,
55
- parent_id: parent_id,
56
- span_id: span_id,
57
- flags: flags
58
- )
59
- end
60
-
61
- # if the flags header is '1' then the sampled header should not be present
62
- def self.parse_flags(flags_header, sampled_header)
63
- if flags_header == '1'
64
- Jaeger::Client::SpanContext::Flags::DEBUG
65
- else
66
- TraceId.base16_hex_id_to_uint64(sampled_header)
67
- end
68
- end
69
- private_class_method :parse_flags
70
- end
71
-
72
- DEFAULT_EXTRACTORS = {
73
- OpenTracing::FORMAT_TEXT_MAP => JaegerTextMapCodec,
74
- OpenTracing::FORMAT_BINARY => JaegerBinaryCodec,
75
- OpenTracing::FORMAT_RACK => JaegerRackCodec
76
- }.freeze
77
-
78
- def self.prepare(extractors)
79
- DEFAULT_EXTRACTORS.reduce(extractors) do |acc, (format, default)|
80
- provided_extractors = Array(extractors[format])
81
- provided_extractors += [default] if provided_extractors.empty?
82
-
83
- acc.merge(format => provided_extractors)
84
- end
85
- end
86
- end
87
- end
88
- end