zipkin-tracer 0.30.0 → 0.31.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.
- checksums.yaml +4 -4
- data/lib/zipkin-tracer.rb +0 -2
- data/lib/zipkin-tracer/excon/zipkin-tracer.rb +0 -2
- data/lib/zipkin-tracer/faraday/zipkin-tracer.rb +0 -2
- data/lib/zipkin-tracer/rack/zipkin-tracer.rb +0 -2
- data/lib/zipkin-tracer/rack/zipkin_env.rb +1 -1
- data/lib/zipkin-tracer/trace.rb +138 -52
- data/lib/zipkin-tracer/trace_generator.rb +3 -3
- data/lib/zipkin-tracer/version.rb +1 -1
- data/lib/zipkin-tracer/zipkin_kafka_tracer.rb +2 -1
- data/lib/zipkin-tracer/zipkin_tracer_base.rb +1 -2
- metadata +21 -22
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 831effb5b1041bf625d6aa6ef01d759245674ed4973b2bfd8c989ee4dd4e5fcd
|
4
|
+
data.tar.gz: f90164cd91b0e4e4190d5d15e4e6084cf941e6334e22be7f4aada18600e0844a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 10b1de8bb1d255f6b85438b99b4a049423ebef3fb57c3489197a73d153d2b0ef7c9d72f2e4993813d425d7c911870519e2f4f88870eb87d0bd9a8ab261e069fd
|
7
|
+
data.tar.gz: c481a2312408e698c0b4fc5ca22692e7cccf2539806dc72615d2d8dc4f20d96fb8c5846b5bf0aa1cbd3239e4544a2eb7f22a17a241705d253fb5ec5f70a404a2
|
data/lib/zipkin-tracer.rb
CHANGED
@@ -34,7 +34,7 @@ module ZipkinTracer
|
|
34
34
|
trace_id, span_id = @env.values_at(*B3_REQUIRED_HEADERS)
|
35
35
|
parent_span_id = @env['HTTP_X_B3_PARENTSPANID']
|
36
36
|
else
|
37
|
-
span_id =
|
37
|
+
span_id = TraceGenerator.new.generate_id
|
38
38
|
trace_id = TraceGenerator.new.generate_id_from_span_id(span_id)
|
39
39
|
parent_span_id = nil
|
40
40
|
end
|
data/lib/zipkin-tracer/trace.rb
CHANGED
@@ -1,21 +1,134 @@
|
|
1
|
-
require 'finagle-thrift/trace'
|
2
1
|
require 'zipkin-tracer/zipkin_tracer_base'
|
3
|
-
#
|
2
|
+
# Most of this code is copied from Finagle
|
4
3
|
# https://github.com/twitter/finagle/blob/finagle-6.39.0/finagle-thrift/src/main/ruby/lib/finagle-thrift/trace.rb
|
4
|
+
# But moved and improved here.
|
5
5
|
module Trace
|
6
|
+
# These methods and attr_accessor below are used as global configuration of this gem
|
7
|
+
# Most of these are set by the config class and then used around.
|
8
|
+
# TODO: Move this out of the Trace module , take out that extend self and be happier
|
9
|
+
extend self
|
6
10
|
attr_accessor :trace_id_128bit
|
7
11
|
|
8
|
-
# We need this to access the tracer from the Faraday middleware.
|
9
12
|
def self.tracer
|
10
13
|
@tracer
|
11
14
|
end
|
12
15
|
|
13
|
-
def sample_rate
|
16
|
+
def self.sample_rate
|
14
17
|
@sample_rate
|
15
18
|
end
|
16
19
|
|
20
|
+
def self.tracer=(tracer)
|
21
|
+
@tracer = tracer
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.sample_rate=(sample_rate)
|
25
|
+
if sample_rate > 1 || sample_rate < 0
|
26
|
+
raise ArgumentError.new("sample rate must be [0,1]")
|
27
|
+
end
|
28
|
+
@sample_rate = sample_rate
|
29
|
+
end
|
30
|
+
|
31
|
+
def default_endpoint=(endpoint)
|
32
|
+
@default_endpoint = endpoint
|
33
|
+
end
|
34
|
+
|
35
|
+
def default_endpoint
|
36
|
+
@default_endpoint
|
37
|
+
end
|
38
|
+
|
39
|
+
# These classes all come from Finagle-thrift + some needed modifications (.to_h)
|
40
|
+
# Moved here as a first step, eventually move them out of the Trace module
|
41
|
+
|
42
|
+
class Annotation
|
43
|
+
CLIENT_SEND = "cs"
|
44
|
+
CLIENT_RECV = "cr"
|
45
|
+
SERVER_SEND = "ss"
|
46
|
+
SERVER_RECV = "sr"
|
47
|
+
|
48
|
+
attr_reader :value, :host, :timestamp
|
49
|
+
def initialize(value, host)
|
50
|
+
@timestamp = (Time.now.to_f * 1000 * 1000).to_i # micros
|
51
|
+
@value = value
|
52
|
+
@host = host
|
53
|
+
end
|
54
|
+
|
55
|
+
def to_h
|
56
|
+
{
|
57
|
+
value: @value,
|
58
|
+
timestamp: @timestamp,
|
59
|
+
endpoint: host.to_h
|
60
|
+
}
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
class BinaryAnnotation
|
65
|
+
SERVER_ADDRESS = 'sa'.freeze
|
66
|
+
URI = 'http.url'.freeze
|
67
|
+
METHOD = 'http.method'.freeze
|
68
|
+
PATH = 'http.path'.freeze
|
69
|
+
STATUS = 'http.status'.freeze
|
70
|
+
LOCAL_COMPONENT = 'lc'.freeze
|
71
|
+
ERROR = 'error'.freeze
|
72
|
+
|
73
|
+
module Type
|
74
|
+
BOOL = "BOOL"
|
75
|
+
STRING = "STRING"
|
76
|
+
end
|
77
|
+
attr_reader :key, :value, :host
|
78
|
+
|
79
|
+
def initialize(key, value, annotation_type, host)
|
80
|
+
@key = key
|
81
|
+
@value = value
|
82
|
+
@annotation_type = annotation_type
|
83
|
+
@host = host
|
84
|
+
end
|
85
|
+
|
86
|
+
def to_h
|
87
|
+
{
|
88
|
+
key: @key,
|
89
|
+
value: @value,
|
90
|
+
endpoint: host.to_h
|
91
|
+
}
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
class Flags
|
96
|
+
# no flags set
|
97
|
+
EMPTY = 0
|
98
|
+
# the debug flag is used to ensure we pass all the sampling layers and that the trace is stored
|
99
|
+
DEBUG = 1
|
100
|
+
end
|
101
|
+
|
102
|
+
class SpanId
|
103
|
+
HEX_REGEX = /^[a-f0-9]{16,32}$/i
|
104
|
+
MAX_SIGNED_I64 = 9223372036854775807
|
105
|
+
MASK = (2 ** 64) - 1
|
106
|
+
|
107
|
+
def self.from_value(v)
|
108
|
+
if v.is_a?(String) && v =~ HEX_REGEX
|
109
|
+
# drops any bits higher than 64 by selecting right-most 16 characters
|
110
|
+
new(v.length > 16 ? v[v.length - 16, 16].hex : v.hex)
|
111
|
+
elsif v.is_a?(Numeric)
|
112
|
+
new(v)
|
113
|
+
elsif v.is_a?(SpanId)
|
114
|
+
v
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
def initialize(value)
|
119
|
+
@value = value
|
120
|
+
@i64 = if @value > MAX_SIGNED_I64
|
121
|
+
-1 * ((@value ^ MASK) + 1)
|
122
|
+
else
|
123
|
+
@value
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
def to_s; "%016x" % @value; end
|
128
|
+
def to_i; @i64; end
|
129
|
+
end
|
130
|
+
|
17
131
|
# A TraceId contains all the information of a given trace id
|
18
|
-
# This class is defined in finagle-thrift. We are overwriting it here
|
19
132
|
class TraceId
|
20
133
|
attr_reader :trace_id, :parent_id, :span_id, :sampled, :flags
|
21
134
|
|
@@ -27,8 +140,8 @@ module Trace
|
|
27
140
|
@flags = flags
|
28
141
|
end
|
29
142
|
|
30
|
-
def next_id
|
31
|
-
TraceId.new(@trace_id, @span_id,
|
143
|
+
def next_id(next_span_id)
|
144
|
+
TraceId.new(@trace_id, @span_id, next_span_id, @sampled, @flags)
|
32
145
|
end
|
33
146
|
|
34
147
|
# the debug flag is used to ensure the trace passes ALL samplers
|
@@ -45,8 +158,6 @@ module Trace
|
|
45
158
|
end
|
46
159
|
end
|
47
160
|
|
48
|
-
# This class is the 128-bit version of the SpanId class:
|
49
|
-
# https://github.com/twitter/finagle/blob/finagle-6.39.0/finagle-thrift/src/main/ruby/lib/finagle-thrift/trace.rb#L102
|
50
161
|
class TraceId128Bit < SpanId
|
51
162
|
HEX_REGEX_16 = /^[a-f0-9]{16}$/i
|
52
163
|
HEX_REGEX_32 = /^[a-f0-9]{32}$/i
|
@@ -79,8 +190,8 @@ module Trace
|
|
79
190
|
end
|
80
191
|
|
81
192
|
# A span may contain many annotations
|
82
|
-
# This class is defined in finagle-thrift. We are adding extra methods here
|
83
193
|
class Span
|
194
|
+
attr_accessor :name, :annotations, :binary_annotations, :debug
|
84
195
|
def initialize(name, span_id)
|
85
196
|
@name = name
|
86
197
|
@span_id = span_id
|
@@ -136,51 +247,33 @@ module Trace
|
|
136
247
|
end
|
137
248
|
end
|
138
249
|
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
value: @value,
|
144
|
-
timestamp: @timestamp,
|
145
|
-
endpoint: host.to_h
|
146
|
-
}
|
147
|
-
end
|
148
|
-
end
|
149
|
-
|
150
|
-
# This class is defined in finagle-thrift. We are adding extra methods here
|
151
|
-
class BinaryAnnotation
|
152
|
-
SERVER_ADDRESS = 'sa'.freeze
|
153
|
-
URI = 'http.uri'.freeze
|
154
|
-
METHOD = 'http.method'.freeze
|
155
|
-
PATH = 'http.path'.freeze
|
156
|
-
STATUS = 'http.status'.freeze
|
157
|
-
LOCAL_COMPONENT = 'lc'.freeze
|
158
|
-
ERROR = 'error'.freeze
|
250
|
+
class Endpoint < Struct.new(:ipv4, :port, :service_name, :ip_format)
|
251
|
+
MAX_I32 = ((2 ** 31) - 1)
|
252
|
+
MASK = (2 ** 32) - 1
|
253
|
+
UNKNOWN_URL = 'unknown'.freeze
|
159
254
|
|
160
|
-
def
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
endpoint: host.to_h
|
165
|
-
}
|
166
|
-
end
|
167
|
-
end
|
255
|
+
def self.host_to_i32(host)
|
256
|
+
unsigned_i32 = Socket.getaddrinfo(host, nil)[0][3].split(".").map do |i|
|
257
|
+
i.to_i
|
258
|
+
end.inject(0) { |a,e| (a << 8) + e }
|
168
259
|
|
169
|
-
|
170
|
-
|
171
|
-
|
260
|
+
signed_i32 = if unsigned_i32 > MAX_I32
|
261
|
+
-1 * ((unsigned_i32 ^ MASK) + 1)
|
262
|
+
else
|
263
|
+
unsigned_i32
|
264
|
+
end
|
172
265
|
|
173
|
-
|
174
|
-
|
266
|
+
signed_i32
|
267
|
+
end
|
175
268
|
|
176
269
|
def self.local_endpoint(service_port, service_name, ip_format)
|
177
270
|
hostname = Socket.gethostname
|
178
|
-
Endpoint.
|
271
|
+
Endpoint.new(hostname, service_port, service_name, ip_format)
|
179
272
|
end
|
180
273
|
|
181
274
|
def self.remote_endpoint(url, remote_service_name, ip_format)
|
182
275
|
service_name = remote_service_name || url.host.split('.').first || UNKNOWN_URL # default to url-derived service name
|
183
|
-
Endpoint.
|
276
|
+
Endpoint.new(url.host, url.port, service_name, ip_format)
|
184
277
|
end
|
185
278
|
|
186
279
|
def to_h
|
@@ -191,12 +284,5 @@ module Trace
|
|
191
284
|
}
|
192
285
|
end
|
193
286
|
|
194
|
-
private
|
195
|
-
def self.make_endpoint(hostname, service_port, service_name, ip_format)
|
196
|
-
ep = Endpoint.new(hostname, service_port, service_name)
|
197
|
-
ep.ip_format = ip_format
|
198
|
-
ep
|
199
|
-
end
|
200
|
-
|
201
287
|
end
|
202
288
|
end
|
@@ -4,7 +4,7 @@ module ZipkinTracer
|
|
4
4
|
# Next id, based on the current information in the container
|
5
5
|
def next_trace_id
|
6
6
|
if TraceContainer.tracing_information_set?
|
7
|
-
TraceContainer.current.next_id
|
7
|
+
TraceContainer.current.next_id(generate_id)
|
8
8
|
else
|
9
9
|
generate_trace_id
|
10
10
|
end
|
@@ -23,12 +23,12 @@ module ZipkinTracer
|
|
23
23
|
Trace.trace_id_128bit ? generate_id_128bit(span_id) : span_id
|
24
24
|
end
|
25
25
|
|
26
|
-
private
|
27
|
-
|
28
26
|
def generate_id
|
29
27
|
rand(TRACE_ID_UPPER_BOUND)
|
30
28
|
end
|
31
29
|
|
30
|
+
private
|
31
|
+
|
32
32
|
def generate_id_128bit(span_id)
|
33
33
|
trace_id_low_64bit = '%016x' % span_id
|
34
34
|
"#{trace_id_epoch_seconds}#{trace_id_high_32bit}#{trace_id_low_64bit}".hex
|
@@ -2,6 +2,7 @@
|
|
2
2
|
begin
|
3
3
|
require 'hermann/producer'
|
4
4
|
require 'hermann/discovery/zookeeper'
|
5
|
+
require 'finagle-thrift'
|
5
6
|
rescue LoadError => e
|
6
7
|
end
|
7
8
|
|
@@ -26,7 +27,7 @@ module Trace
|
|
26
27
|
end
|
27
28
|
super(options)
|
28
29
|
end
|
29
|
-
|
30
|
+
|
30
31
|
def flush!
|
31
32
|
resolved_spans = ::ZipkinTracer::HostnameResolver.new.spans_with_ips(spans)
|
32
33
|
resolved_spans.each do |span|
|
@@ -1,5 +1,4 @@
|
|
1
1
|
require 'faraday'
|
2
|
-
require 'finagle-thrift/tracer'
|
3
2
|
|
4
3
|
module Trace
|
5
4
|
# This class is a base for tracers sending information to Zipkin.
|
@@ -7,7 +6,7 @@ module Trace
|
|
7
6
|
# is done with its request
|
8
7
|
# Traces dealing with zipkin should inherit from this class and implement the
|
9
8
|
# flush! method which actually sends the information
|
10
|
-
class ZipkinTracerBase
|
9
|
+
class ZipkinTracerBase
|
11
10
|
|
12
11
|
def initialize(options={})
|
13
12
|
@options = options
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: zipkin-tracer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.31.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Franklin Hu
|
@@ -13,7 +13,7 @@ authors:
|
|
13
13
|
autorequire:
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
|
-
date:
|
16
|
+
date: 2019-01-08 00:00:00.000000000 Z
|
17
17
|
dependencies:
|
18
18
|
- !ruby/object:Gem::Dependency
|
19
19
|
name: faraday
|
@@ -29,20 +29,6 @@ dependencies:
|
|
29
29
|
- - "~>"
|
30
30
|
- !ruby/object:Gem::Version
|
31
31
|
version: '0.8'
|
32
|
-
- !ruby/object:Gem::Dependency
|
33
|
-
name: finagle-thrift
|
34
|
-
requirement: !ruby/object:Gem::Requirement
|
35
|
-
requirements:
|
36
|
-
- - "~>"
|
37
|
-
- !ruby/object:Gem::Version
|
38
|
-
version: 1.4.2
|
39
|
-
type: :runtime
|
40
|
-
prerelease: false
|
41
|
-
version_requirements: !ruby/object:Gem::Requirement
|
42
|
-
requirements:
|
43
|
-
- - "~>"
|
44
|
-
- !ruby/object:Gem::Version
|
45
|
-
version: 1.4.2
|
46
32
|
- !ruby/object:Gem::Dependency
|
47
33
|
name: rack
|
48
34
|
requirement: !ruby/object:Gem::Requirement
|
@@ -91,28 +77,28 @@ dependencies:
|
|
91
77
|
requirements:
|
92
78
|
- - "~>"
|
93
79
|
- !ruby/object:Gem::Version
|
94
|
-
version: '3.
|
80
|
+
version: '3.8'
|
95
81
|
type: :development
|
96
82
|
prerelease: false
|
97
83
|
version_requirements: !ruby/object:Gem::Requirement
|
98
84
|
requirements:
|
99
85
|
- - "~>"
|
100
86
|
- !ruby/object:Gem::Version
|
101
|
-
version: '3.
|
87
|
+
version: '3.8'
|
102
88
|
- !ruby/object:Gem::Dependency
|
103
89
|
name: rack-test
|
104
90
|
requirement: !ruby/object:Gem::Requirement
|
105
91
|
requirements:
|
106
92
|
- - "~>"
|
107
93
|
- !ruby/object:Gem::Version
|
108
|
-
version: '
|
94
|
+
version: '1.1'
|
109
95
|
type: :development
|
110
96
|
prerelease: false
|
111
97
|
version_requirements: !ruby/object:Gem::Requirement
|
112
98
|
requirements:
|
113
99
|
- - "~>"
|
114
100
|
- !ruby/object:Gem::Version
|
115
|
-
version: '
|
101
|
+
version: '1.1'
|
116
102
|
- !ruby/object:Gem::Dependency
|
117
103
|
name: rake
|
118
104
|
requirement: !ruby/object:Gem::Requirement
|
@@ -155,6 +141,20 @@ dependencies:
|
|
155
141
|
- - "~>"
|
156
142
|
- !ruby/object:Gem::Version
|
157
143
|
version: '3.0'
|
144
|
+
- !ruby/object:Gem::Dependency
|
145
|
+
name: simplecov
|
146
|
+
requirement: !ruby/object:Gem::Requirement
|
147
|
+
requirements:
|
148
|
+
- - "~>"
|
149
|
+
- !ruby/object:Gem::Version
|
150
|
+
version: '0.16'
|
151
|
+
type: :development
|
152
|
+
prerelease: false
|
153
|
+
version_requirements: !ruby/object:Gem::Requirement
|
154
|
+
requirements:
|
155
|
+
- - "~>"
|
156
|
+
- !ruby/object:Gem::Version
|
157
|
+
version: '0.16'
|
158
158
|
description: Adds tracing instrumentation for ruby applications
|
159
159
|
email:
|
160
160
|
- franklin@twitter.com
|
@@ -206,8 +206,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
206
206
|
- !ruby/object:Gem::Version
|
207
207
|
version: 1.3.5
|
208
208
|
requirements: []
|
209
|
-
|
210
|
-
rubygems_version: 2.7.8
|
209
|
+
rubygems_version: 3.0.2
|
211
210
|
signing_key:
|
212
211
|
specification_version: 4
|
213
212
|
summary: Ruby tracing via Zipkin
|