jaeger-client 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/jaeger-client.gemspec +1 -1
- data/lib/jaeger/client.rb +14 -3
- data/lib/jaeger/client/collector.rb +86 -0
- data/lib/jaeger/client/span.rb +4 -4
- data/lib/jaeger/client/tracer.rb +11 -9
- data/lib/jaeger/client/udp_sender.rb +25 -105
- data/lib/jaeger/client/udp_sender/transport.rb +38 -0
- data/script/create_trace +7 -4
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dc47584b45bef088c9871ca1a40a73ebbc04bad8
|
4
|
+
data.tar.gz: '03990b88b5c512ef7278be81980e1ba8e23b9b8d'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8c8b9cd13c3fd71a6b83ce793ae55d4ddfc59e0169c2c1f0ef75390df37eedd4fc5f9c34c24654d2f4c2bd86e13aee6f4eca3c043f0ad6b17bbca898a771c3bd
|
7
|
+
data.tar.gz: 26098a8331acd51cbbcf345ae510158cd96ab4e37c55857cf5db4b327bef6634eba46f7ae35b59a03e45e34093b16db0692c1d0698d5d2da32189e981c04d51f
|
data/jaeger-client.gemspec
CHANGED
data/lib/jaeger/client.rb
CHANGED
@@ -8,12 +8,23 @@ require_relative 'client/span_context'
|
|
8
8
|
require_relative 'client/carrier'
|
9
9
|
require_relative 'client/trace_id'
|
10
10
|
require_relative 'client/udp_sender'
|
11
|
+
require_relative 'client/collector'
|
11
12
|
|
12
13
|
module Jaeger
|
13
14
|
module Client
|
14
|
-
|
15
|
-
|
16
|
-
|
15
|
+
DEFAULT_FLUSH_INTERVAL = 10
|
16
|
+
|
17
|
+
def self.build(host: '127.0.0.1', port: 6831, service_name:, flush_interval: DEFAULT_FLUSH_INTERVAL)
|
18
|
+
collector = Collector.new
|
19
|
+
sender = UdpSender.new(
|
20
|
+
service_name: service_name,
|
21
|
+
host: host,
|
22
|
+
port: port,
|
23
|
+
collector: collector,
|
24
|
+
flush_interval: flush_interval
|
25
|
+
)
|
26
|
+
sender.start
|
27
|
+
Tracer.new(collector, sender)
|
17
28
|
end
|
18
29
|
end
|
19
30
|
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
require 'thread'
|
2
|
+
|
3
|
+
module Jaeger
|
4
|
+
module Client
|
5
|
+
class Collector
|
6
|
+
def initialize
|
7
|
+
@buffer = Buffer.new
|
8
|
+
end
|
9
|
+
|
10
|
+
def send_span(span, end_time)
|
11
|
+
context = span.context
|
12
|
+
start_ts, duration = build_timestamps(span, end_time)
|
13
|
+
|
14
|
+
@buffer << Jaeger::Thrift::Span.new(
|
15
|
+
'traceIdLow' => context.trace_id,
|
16
|
+
'traceIdHigh' => context.trace_id,
|
17
|
+
'spanId' => context.span_id,
|
18
|
+
'parentSpanId' => context.parent_id || 0,
|
19
|
+
'operationName' => span.operation_name,
|
20
|
+
'references' => [],
|
21
|
+
'flags' => context.flags,
|
22
|
+
'startTime' => start_ts,
|
23
|
+
'duration' => duration,
|
24
|
+
'tags' => build_tags(span.tags),
|
25
|
+
'logs' => build_logs(span.logs)
|
26
|
+
)
|
27
|
+
end
|
28
|
+
|
29
|
+
def retrieve
|
30
|
+
@buffer.retrieve
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def build_tags(tags)
|
36
|
+
tags.map {|name, value| build_tag(name, value)}
|
37
|
+
end
|
38
|
+
|
39
|
+
def build_logs(logs)
|
40
|
+
logs.map do |timestamp:, fields:|
|
41
|
+
Jaeger::Thrift::Log.new(
|
42
|
+
'timestamp' => (timestamp.to_f * 1_000_000).to_i,
|
43
|
+
'fields' => fields.map {|name, value| build_tag(name, value)}
|
44
|
+
)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def build_tag(name, value)
|
49
|
+
Jaeger::Thrift::Tag.new(
|
50
|
+
'key' => name.to_s,
|
51
|
+
'vType' => Jaeger::Thrift::TagType::STRING,
|
52
|
+
'vStr' => value.to_s
|
53
|
+
)
|
54
|
+
end
|
55
|
+
|
56
|
+
def build_timestamps(span, end_time)
|
57
|
+
start_ts = (span.start_time.to_f * 1_000_000).to_i
|
58
|
+
end_ts = (end_time.to_f * 1_000_000).to_i
|
59
|
+
duration = end_ts - start_ts
|
60
|
+
[start_ts, duration]
|
61
|
+
end
|
62
|
+
|
63
|
+
class Buffer
|
64
|
+
def initialize
|
65
|
+
@buffer = []
|
66
|
+
@mutex = Mutex.new
|
67
|
+
end
|
68
|
+
|
69
|
+
def <<(element)
|
70
|
+
@mutex.synchronize do
|
71
|
+
@buffer << element
|
72
|
+
true
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def retrieve
|
77
|
+
@mutex.synchronize do
|
78
|
+
elements = @buffer.dup
|
79
|
+
@buffer.clear
|
80
|
+
elements
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
data/lib/jaeger/client/span.rb
CHANGED
@@ -9,13 +9,13 @@ module Jaeger
|
|
9
9
|
#
|
10
10
|
# @param context [SpanContext] the context of the span
|
11
11
|
# @param context [String] the operation name
|
12
|
-
# @param
|
12
|
+
# @param collector [Collector] span collector
|
13
13
|
#
|
14
14
|
# @return [Span] a new Span
|
15
|
-
def initialize(context, operation_name,
|
15
|
+
def initialize(context, operation_name, collector, start_time: Time.now, tags: {})
|
16
16
|
@context = context
|
17
17
|
@operation_name = operation_name
|
18
|
-
@
|
18
|
+
@collector = collector
|
19
19
|
@start_time = start_time
|
20
20
|
@tags = tags
|
21
21
|
@logs = []
|
@@ -59,7 +59,7 @@ module Jaeger
|
|
59
59
|
#
|
60
60
|
# @param end_time [Time] custom end time, if not now
|
61
61
|
def finish(end_time: Time.now)
|
62
|
-
@
|
62
|
+
@collector.send_span(self, end_time)
|
63
63
|
end
|
64
64
|
|
65
65
|
private
|
data/lib/jaeger/client/tracer.rb
CHANGED
@@ -1,8 +1,13 @@
|
|
1
1
|
module Jaeger
|
2
2
|
module Client
|
3
3
|
class Tracer
|
4
|
-
def initialize(
|
5
|
-
@
|
4
|
+
def initialize(collector, sender)
|
5
|
+
@collector = collector
|
6
|
+
@sender = sender
|
7
|
+
end
|
8
|
+
|
9
|
+
def stop
|
10
|
+
@sender.stop
|
6
11
|
end
|
7
12
|
|
8
13
|
# Starts a new span.
|
@@ -23,7 +28,7 @@ module Jaeger
|
|
23
28
|
else
|
24
29
|
SpanContext.create_parent_context
|
25
30
|
end
|
26
|
-
Span.new(context, operation_name, @
|
31
|
+
Span.new(context, operation_name, @collector, start_time: start_time, tags: tags)
|
27
32
|
end
|
28
33
|
|
29
34
|
# Inject a SpanContext into the given carrier
|
@@ -68,13 +73,10 @@ module Jaeger
|
|
68
73
|
return nil if !trace || trace == ''
|
69
74
|
trace_id, span_id, parent_id, _flags = trace.split(':')
|
70
75
|
|
71
|
-
parent_id = parent_id
|
72
|
-
parent_id = nil if parent_id ==
|
73
|
-
|
74
|
-
trace_id = trace_id.to_i
|
75
|
-
span_id = span_id.to_i
|
76
|
+
parent_id = parent_id
|
77
|
+
parent_id = nil if parent_id == ''
|
76
78
|
|
77
|
-
if trace_id !=
|
79
|
+
if trace_id != '' && span_id != ''
|
78
80
|
SpanContext.new(trace_id: trace_id, parent_id: parent_id, span_id: span_id)
|
79
81
|
else
|
80
82
|
nil
|
@@ -1,130 +1,50 @@
|
|
1
|
+
require_relative './udp_sender/transport'
|
1
2
|
require 'jaeger/thrift/agent'
|
2
3
|
require 'thread'
|
3
4
|
|
4
5
|
module Jaeger
|
5
6
|
module Client
|
6
7
|
class UdpSender
|
7
|
-
def initialize(service_name
|
8
|
+
def initialize(service_name:, host:, port:, collector:, flush_interval:)
|
8
9
|
@service_name = service_name
|
10
|
+
@collector = collector
|
11
|
+
@flush_interval = flush_interval
|
9
12
|
|
10
|
-
|
11
|
-
emitter.start
|
12
|
-
transport = Transport.new(emitter)
|
13
|
+
transport = Transport.new(host, port)
|
13
14
|
protocol = ::Thrift::CompactProtocol.new(transport)
|
14
|
-
|
15
15
|
@client = Jaeger::Thrift::Agent::Client.new(protocol)
|
16
16
|
end
|
17
17
|
|
18
|
-
def
|
19
|
-
|
20
|
-
|
18
|
+
def start
|
19
|
+
# Sending spans in a separate thread to avoid blocking the main thread.
|
20
|
+
@thread = Thread.new do
|
21
|
+
loop do
|
22
|
+
emit_batch(@collector.retrieve)
|
23
|
+
sleep @flush_interval
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def stop
|
29
|
+
@thread.terminate if @thread
|
30
|
+
emit_batch(@collector.retrieve)
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def emit_batch(thrift_spans)
|
36
|
+
return if thrift_spans.empty?
|
21
37
|
|
22
|
-
thrift_span = Jaeger::Thrift::Span.new(
|
23
|
-
'traceIdLow' => context.trace_id,
|
24
|
-
'traceIdHigh' => context.trace_id,
|
25
|
-
'spanId' => context.span_id,
|
26
|
-
'parentSpanId' => context.parent_id || 0,
|
27
|
-
'operationName' => span.operation_name,
|
28
|
-
'references' => [],
|
29
|
-
'flags' => context.flags,
|
30
|
-
'startTime' => start_ts,
|
31
|
-
'duration' => duration,
|
32
|
-
'tags' => build_tags(span.tags),
|
33
|
-
'logs' => build_logs(span.logs)
|
34
|
-
)
|
35
38
|
batch = Jaeger::Thrift::Batch.new(
|
36
39
|
'process' => Jaeger::Thrift::Process.new(
|
37
40
|
'serviceName' => @service_name,
|
38
41
|
'tags' => [],
|
39
42
|
),
|
40
|
-
'spans' =>
|
43
|
+
'spans' => thrift_spans
|
41
44
|
)
|
42
45
|
|
43
46
|
@client.emitBatch(batch)
|
44
47
|
end
|
45
|
-
|
46
|
-
private
|
47
|
-
|
48
|
-
def build_tags(tags)
|
49
|
-
tags.map {|name, value| build_tag(name, value)}
|
50
|
-
end
|
51
|
-
|
52
|
-
def build_logs(logs)
|
53
|
-
logs.map do |timestamp:, fields:|
|
54
|
-
Jaeger::Thrift::Log.new(
|
55
|
-
'timestamp' => (timestamp.to_f * 1_000_000).to_i,
|
56
|
-
'fields' => fields.map {|name, value| build_tag(name, value)}
|
57
|
-
)
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
def build_tag(name, value)
|
62
|
-
Jaeger::Thrift::Tag.new(
|
63
|
-
'key' => name.to_s,
|
64
|
-
'vType' => Jaeger::Thrift::TagType::STRING,
|
65
|
-
'vStr' => value.to_s
|
66
|
-
)
|
67
|
-
end
|
68
|
-
|
69
|
-
def build_timestamps(span, end_time)
|
70
|
-
start_ts = (span.start_time.to_f * 1_000_000).to_i
|
71
|
-
end_ts = (end_time.to_f * 1_000_000).to_i
|
72
|
-
duration = end_ts - start_ts
|
73
|
-
[start_ts, duration]
|
74
|
-
end
|
75
|
-
|
76
|
-
class Transport
|
77
|
-
def initialize(emitter)
|
78
|
-
@emitter = emitter
|
79
|
-
@buffer = ::Thrift::MemoryBufferTransport.new
|
80
|
-
end
|
81
|
-
|
82
|
-
def write(str)
|
83
|
-
@buffer.write(str)
|
84
|
-
end
|
85
|
-
|
86
|
-
def flush
|
87
|
-
@emitter.emit(@buffer.read(@buffer.available))
|
88
|
-
@buffer.reset_buffer
|
89
|
-
end
|
90
|
-
|
91
|
-
def open; end
|
92
|
-
def close; end
|
93
|
-
end
|
94
|
-
|
95
|
-
class SocketEmitter
|
96
|
-
FLAGS = 0
|
97
|
-
|
98
|
-
def initialize(host, port)
|
99
|
-
@socket = UDPSocket.new
|
100
|
-
@socket.connect(host, port)
|
101
|
-
@encoded_spans = Queue.new
|
102
|
-
end
|
103
|
-
|
104
|
-
def emit(encoded_spans)
|
105
|
-
@encoded_spans << encoded_spans
|
106
|
-
end
|
107
|
-
|
108
|
-
def start
|
109
|
-
# Sending spans in a separate thread to avoid blocking the main thread.
|
110
|
-
Thread.new do
|
111
|
-
while encoded_span = @encoded_spans.pop
|
112
|
-
send_bytes(encoded_span)
|
113
|
-
end
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
|
-
private
|
118
|
-
|
119
|
-
def send_bytes(bytes)
|
120
|
-
@socket.send(bytes, FLAGS)
|
121
|
-
@socket.flush
|
122
|
-
rescue Errno::ECONNREFUSED
|
123
|
-
warn 'Unable to connect to Jaeger Agent'
|
124
|
-
rescue => e
|
125
|
-
warn "Unable to send spans: #{e.message}"
|
126
|
-
end
|
127
|
-
end
|
128
48
|
end
|
129
49
|
end
|
130
50
|
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module Jaeger
|
2
|
+
module Client
|
3
|
+
class UdpSender
|
4
|
+
class Transport
|
5
|
+
FLAGS = 0
|
6
|
+
|
7
|
+
def initialize(host, port)
|
8
|
+
@socket = UDPSocket.new
|
9
|
+
@socket.connect(host, port)
|
10
|
+
@buffer = ::Thrift::MemoryBufferTransport.new
|
11
|
+
end
|
12
|
+
|
13
|
+
def write(str)
|
14
|
+
@buffer.write(str)
|
15
|
+
end
|
16
|
+
|
17
|
+
def flush
|
18
|
+
data = @buffer.read(@buffer.available)
|
19
|
+
send_bytes(data)
|
20
|
+
end
|
21
|
+
|
22
|
+
def open; end
|
23
|
+
def close; end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def send_bytes(bytes)
|
28
|
+
@socket.send(bytes, FLAGS)
|
29
|
+
@socket.flush
|
30
|
+
rescue Errno::ECONNREFUSED
|
31
|
+
warn 'Unable to connect to Jaeger Agent'
|
32
|
+
rescue => e
|
33
|
+
warn "Unable to send spans: #{e.message}"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
data/script/create_trace
CHANGED
@@ -8,8 +8,8 @@ require 'jaeger/client'
|
|
8
8
|
host = ENV['JAEGER_HOST'] || '127.0.0.1'
|
9
9
|
port = ENV['JAEGER_HOST'] || 6831
|
10
10
|
|
11
|
-
tracer1 = Jaeger::Client.build(host: host, port: port.to_i, service_name: 'test-service')
|
12
|
-
tracer2 = Jaeger::Client.build(host: host, port: port.to_i, service_name: 'downstream-service')
|
11
|
+
tracer1 = Jaeger::Client.build(host: host, port: port.to_i, service_name: 'test-service', flush_interval: 1)
|
12
|
+
tracer2 = Jaeger::Client.build(host: host, port: port.to_i, service_name: 'downstream-service', flush_interval: 1)
|
13
13
|
|
14
14
|
outer_span = tracer1.start_span('receive request', tags: {
|
15
15
|
'span.kind' => 'server'
|
@@ -39,5 +39,8 @@ inner_span.finish
|
|
39
39
|
sleep 0.1 # doing something with fetched info
|
40
40
|
outer_span.finish
|
41
41
|
|
42
|
-
|
43
|
-
|
42
|
+
tracer1.stop
|
43
|
+
tracer2.stop
|
44
|
+
|
45
|
+
puts "Finished"
|
46
|
+
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jaeger-client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.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: 2017-
|
11
|
+
date: 2017-07-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -99,11 +99,13 @@ files:
|
|
99
99
|
- jaeger-client.gemspec
|
100
100
|
- lib/jaeger/client.rb
|
101
101
|
- lib/jaeger/client/carrier.rb
|
102
|
+
- lib/jaeger/client/collector.rb
|
102
103
|
- lib/jaeger/client/span.rb
|
103
104
|
- lib/jaeger/client/span_context.rb
|
104
105
|
- lib/jaeger/client/trace_id.rb
|
105
106
|
- lib/jaeger/client/tracer.rb
|
106
107
|
- lib/jaeger/client/udp_sender.rb
|
108
|
+
- lib/jaeger/client/udp_sender/transport.rb
|
107
109
|
- script/create_trace
|
108
110
|
- thrift/agent.thrift
|
109
111
|
- thrift/gen-rb/jaeger/thrift/agent.rb
|
@@ -140,7 +142,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
140
142
|
version: '0'
|
141
143
|
requirements: []
|
142
144
|
rubyforge_project:
|
143
|
-
rubygems_version: 2.6.
|
145
|
+
rubygems_version: 2.6.11
|
144
146
|
signing_key:
|
145
147
|
specification_version: 4
|
146
148
|
summary: OpenTracing Tracer implementation for Jaeger in Ruby
|