zipkin 1.0.0 → 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.
- checksums.yaml +4 -4
- data/.rubocop.yml +25 -0
- data/Rakefile +6 -3
- data/bin/console +4 -4
- data/lib/zipkin/carrier.rb +3 -6
- data/lib/zipkin/collector.rb +3 -3
- data/lib/zipkin/json_client.rb +9 -7
- data/lib/zipkin/span.rb +11 -0
- data/lib/zipkin/trace_id.rb +1 -1
- data/lib/zipkin/tracer.rb +23 -18
- data/script/create_trace +21 -14
- data/zipkin.gemspec +7 -6
- metadata +35 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f7dab2beecf1b862caceca696f39c800ed9a337a
|
4
|
+
data.tar.gz: d5047d7b504e42a2d4357f991e651e9dc70fd9f3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 42534373a551f427b6be03b32ca2709e7fae389b36a9d93c224ab7e3b4b1db04459a2ad5046a12dcf5e1cf7d3a3e0dbb8c2fbc8d61d72d9d2181cf61a7011e16
|
7
|
+
data.tar.gz: cd4a6a54266e0972a6ab0af9314bb929de8624bb9af13db6f2a25d433ad4cb89d1c282c0aed41378fa89b6a27c763508c3b49763376302df5d8792ce3203cedd
|
data/.rubocop.yml
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
require: rubocop-rspec
|
2
|
+
|
3
|
+
Style/Documentation:
|
4
|
+
Enabled: no
|
5
|
+
|
6
|
+
Style/IfUnlessModifier:
|
7
|
+
Enabled: no
|
8
|
+
|
9
|
+
RSpec/NestedGroups:
|
10
|
+
Max: 4
|
11
|
+
|
12
|
+
Metrics/BlockLength:
|
13
|
+
Enabled: no
|
14
|
+
|
15
|
+
Metrics/MethodLength:
|
16
|
+
Enabled: no
|
17
|
+
|
18
|
+
Metrics/AbcSize:
|
19
|
+
Enabled: no
|
20
|
+
|
21
|
+
Lint/UnusedMethodArgument:
|
22
|
+
Enabled: no
|
23
|
+
|
24
|
+
Metrics/LineLength:
|
25
|
+
Max: 120
|
data/Rakefile
CHANGED
@@ -1,6 +1,9 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require 'bundler/gem_tasks'
|
2
|
+
require 'rspec/core/rake_task'
|
3
|
+
require 'rubocop/rake_task'
|
3
4
|
|
4
5
|
RSpec::Core::RakeTask.new(:spec)
|
5
6
|
|
6
|
-
|
7
|
+
RuboCop::RakeTask.new(:rubocop)
|
8
|
+
|
9
|
+
task default: %i[rubocop spec]
|
data/bin/console
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require 'bundler/setup'
|
4
|
+
require 'zipkin'
|
5
5
|
|
6
6
|
# You can add fixtures and/or initialization code here to make experimenting
|
7
7
|
# with your gem easier. You can also use a different console, if you like.
|
8
8
|
|
9
9
|
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
-
# require
|
10
|
+
# require 'pry'
|
11
11
|
# Pry.start
|
12
12
|
|
13
|
-
require
|
13
|
+
require 'irb'
|
14
14
|
IRB.start(__FILE__)
|
data/lib/zipkin/carrier.rb
CHANGED
@@ -6,20 +6,17 @@ module Zipkin
|
|
6
6
|
# [] retrieves a value by the given key
|
7
7
|
# @param key [String] key to retrieve the value
|
8
8
|
# @return [String] the desired value
|
9
|
-
def [](key)
|
10
|
-
end
|
9
|
+
def [](key); end
|
11
10
|
|
12
11
|
# []= sets the value for the given key
|
13
12
|
# @param key [String] key to set
|
14
13
|
# @param value [String] value to set
|
15
|
-
def []=(key, value)
|
16
|
-
end
|
14
|
+
def []=(key, value); end
|
17
15
|
|
18
16
|
# each iterates over every key-value pair in the carrier
|
19
17
|
# @yield [key, value]
|
20
18
|
# @yieldparam key [String] the key of the tuple
|
21
19
|
# @yieldparam value [String] the value of the tuple
|
22
|
-
def each(&block)
|
23
|
-
end
|
20
|
+
def each(&block); end
|
24
21
|
end
|
25
22
|
end
|
data/lib/zipkin/collector.rb
CHANGED
@@ -15,7 +15,7 @@ module Zipkin
|
|
15
15
|
finish_ts = (end_time.to_f * 1_000_000).to_i
|
16
16
|
start_ts = (span.start_time.to_f * 1_000_000).to_i
|
17
17
|
duration = finish_ts - start_ts
|
18
|
-
is_server = [
|
18
|
+
is_server = %w[server consumer].include?(span.tags['span.kind'] || 'server')
|
19
19
|
|
20
20
|
@buffer << {
|
21
21
|
traceId: span.context.trace_id,
|
@@ -32,7 +32,7 @@ module Zipkin
|
|
32
32
|
},
|
33
33
|
{
|
34
34
|
timestamp: finish_ts,
|
35
|
-
value: is_server ? 'ss': 'cr',
|
35
|
+
value: is_server ? 'ss' : 'cr',
|
36
36
|
endpoint: @local_endpoint
|
37
37
|
}
|
38
38
|
],
|
@@ -44,7 +44,7 @@ module Zipkin
|
|
44
44
|
|
45
45
|
def build_binary_annotations(span)
|
46
46
|
span.tags.map do |name, value|
|
47
|
-
{key: name, value: value.to_s}
|
47
|
+
{ key: name, value: value.to_s }
|
48
48
|
end
|
49
49
|
end
|
50
50
|
|
data/lib/zipkin/json_client.rb
CHANGED
@@ -4,10 +4,11 @@ require 'json'
|
|
4
4
|
|
5
5
|
module Zipkin
|
6
6
|
class JsonClient
|
7
|
-
def initialize(url:, collector:, flush_interval:)
|
7
|
+
def initialize(url:, collector:, flush_interval:, logger: Logger.new(STDOUT))
|
8
8
|
@collector = collector
|
9
9
|
@flush_interval = flush_interval
|
10
10
|
@spans_uri = URI.parse("#{url}/api/v1/spans")
|
11
|
+
@logger = logger
|
11
12
|
end
|
12
13
|
|
13
14
|
def start
|
@@ -31,17 +32,18 @@ module Zipkin
|
|
31
32
|
|
32
33
|
http = Net::HTTP.new(@spans_uri.host, @spans_uri.port)
|
33
34
|
http.use_ssl = @spans_uri.scheme == 'https'
|
34
|
-
request = Net::HTTP::Post.new(
|
35
|
+
request = Net::HTTP::Post.new(
|
36
|
+
@spans_uri.request_uri,
|
35
37
|
'Content-Type' => 'application/json'
|
36
|
-
|
38
|
+
)
|
37
39
|
request.body = JSON.dump(spans)
|
38
40
|
response = http.request(request)
|
39
41
|
|
40
|
-
if response.code != 202
|
41
|
-
|
42
|
+
if response.code != '202'
|
43
|
+
@logger.error("Received bad response from Zipkin. status: #{response.code}, body: #{response.body.inspect}")
|
42
44
|
end
|
43
|
-
rescue => e
|
44
|
-
|
45
|
+
rescue StandardError => e
|
46
|
+
@logger.error("Error emitting spans batch: #{e.message}\n#{e.backtrace.join("\n")}")
|
45
47
|
end
|
46
48
|
end
|
47
49
|
end
|
data/lib/zipkin/span.rb
CHANGED
@@ -50,7 +50,18 @@ module Zipkin
|
|
50
50
|
# @param event [String] event name for the log
|
51
51
|
# @param timestamp [Time] time of the log
|
52
52
|
# @param fields [Hash] Additional information to log
|
53
|
+
#
|
54
|
+
# @deprecated Use {#log_kv} instead.
|
53
55
|
def log(event: nil, timestamp: Time.now, **fields)
|
56
|
+
warn 'Span#log is deprecated. Please use Span#log_kv instead.'
|
57
|
+
nil
|
58
|
+
end
|
59
|
+
|
60
|
+
# Add a log entry to this span
|
61
|
+
#
|
62
|
+
# @param timestamp [Time] time of the log
|
63
|
+
# @param fields [Hash] Additional information to log
|
64
|
+
def log_kv(timestamp: Time.now, **fields)
|
54
65
|
nil
|
55
66
|
end
|
56
67
|
|
data/lib/zipkin/trace_id.rb
CHANGED
data/lib/zipkin/tracer.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'opentracing'
|
2
|
+
require 'logger'
|
2
3
|
|
3
4
|
require_relative 'span'
|
4
5
|
require_relative 'span_context'
|
@@ -12,20 +13,22 @@ module Zipkin
|
|
12
13
|
class Tracer
|
13
14
|
DEFAULT_FLUSH_INTERVAL = 10
|
14
15
|
|
15
|
-
def self.build(url:, service_name:, flush_interval: DEFAULT_FLUSH_INTERVAL)
|
16
|
+
def self.build(url:, service_name:, flush_interval: DEFAULT_FLUSH_INTERVAL, logger: Logger.new(STDOUT))
|
16
17
|
collector = Collector.new(Endpoint.local_endpoint(service_name))
|
17
18
|
sender = JsonClient.new(
|
18
19
|
url: url,
|
19
20
|
collector: collector,
|
20
|
-
flush_interval: flush_interval
|
21
|
+
flush_interval: flush_interval,
|
22
|
+
logger: logger
|
21
23
|
)
|
22
24
|
sender.start
|
23
|
-
new(collector, sender)
|
25
|
+
new(collector, sender, logger: logger)
|
24
26
|
end
|
25
27
|
|
26
|
-
def initialize(collector, sender)
|
28
|
+
def initialize(collector, sender, logger: Logger.new(STDOUT))
|
27
29
|
@collector = collector
|
28
30
|
@sender = sender
|
31
|
+
@logger = logger
|
29
32
|
end
|
30
33
|
|
31
34
|
def stop
|
@@ -50,10 +53,13 @@ module Zipkin
|
|
50
53
|
else
|
51
54
|
SpanContext.create_parent_context
|
52
55
|
end
|
53
|
-
Span.new(
|
56
|
+
Span.new(
|
57
|
+
context,
|
58
|
+
operation_name,
|
59
|
+
@collector,
|
54
60
|
start_time: start_time,
|
55
61
|
tags: tags
|
56
|
-
|
62
|
+
)
|
57
63
|
end
|
58
64
|
|
59
65
|
# Inject a SpanContext into the given carrier
|
@@ -74,7 +80,7 @@ module Zipkin
|
|
74
80
|
carrier['X-B3-SpanId'] = span_context.span_id
|
75
81
|
carrier['X-B3-Sampled'] = span_context.sampled? ? '1' : '0'
|
76
82
|
else
|
77
|
-
|
83
|
+
@logger.error "Logasm::Tracer with format #{format} is not supported yet"
|
78
84
|
end
|
79
85
|
end
|
80
86
|
|
@@ -100,23 +106,22 @@ module Zipkin
|
|
100
106
|
|
101
107
|
create_span_context(trace_id, span_id, parent_id, sampled)
|
102
108
|
else
|
103
|
-
|
109
|
+
@logger.error "Logasm::Tracer with format #{format} is not supported yet"
|
104
110
|
nil
|
105
111
|
end
|
106
112
|
end
|
107
113
|
|
108
114
|
private
|
115
|
+
|
109
116
|
def create_span_context(trace_id, span_id, parent_id, sampled)
|
110
|
-
if trace_id
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
nil
|
119
|
-
end
|
117
|
+
return nil if !trace_id || !span_id
|
118
|
+
|
119
|
+
SpanContext.new(
|
120
|
+
trace_id: trace_id,
|
121
|
+
parent_id: parent_id,
|
122
|
+
span_id: span_id,
|
123
|
+
sampled: sampled
|
124
|
+
)
|
120
125
|
end
|
121
126
|
end
|
122
127
|
end
|
data/script/create_trace
CHANGED
@@ -10,22 +10,29 @@ url = ENV['ZIPKIN_URL'] || 'http://localhost:9411'
|
|
10
10
|
tracer1 = Zipkin::Tracer.build(url: url, service_name: 'test-service')
|
11
11
|
tracer2 = Zipkin::Tracer.build(url: url, service_name: 'downstream-service')
|
12
12
|
|
13
|
-
outer_span = tracer1.start_span(
|
14
|
-
'
|
15
|
-
}
|
13
|
+
outer_span = tracer1.start_span(
|
14
|
+
'receive request',
|
15
|
+
tags: { 'span.kind' => 'server' }
|
16
|
+
)
|
16
17
|
sleep 1
|
17
18
|
|
18
|
-
inner_span = tracer1.start_span(
|
19
|
-
'
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
19
|
+
inner_span = tracer1.start_span(
|
20
|
+
'fetch info from downstream',
|
21
|
+
child_of: outer_span,
|
22
|
+
tags: {
|
23
|
+
'span.kind' => 'client',
|
24
|
+
'peer.service' => 'downstream-service',
|
25
|
+
'peer.ipv4' => '6.6.6.6',
|
26
|
+
'peer.port' => 443
|
27
|
+
}
|
28
|
+
)
|
24
29
|
sleep 0.3 # emulate network delay
|
25
30
|
|
26
|
-
downstream_span = tracer2.start_span(
|
27
|
-
'
|
28
|
-
|
31
|
+
downstream_span = tracer2.start_span(
|
32
|
+
'downstream operation',
|
33
|
+
child_of: inner_span,
|
34
|
+
tags: { 'span.kind' => 'server' }
|
35
|
+
)
|
29
36
|
sleep 0.5
|
30
37
|
downstream_span.finish
|
31
38
|
|
@@ -36,10 +43,10 @@ inner_span.finish
|
|
36
43
|
sleep 0.1 # doing something with fetched info
|
37
44
|
outer_span.finish
|
38
45
|
|
39
|
-
puts
|
46
|
+
puts 'Finishing...'
|
40
47
|
sleep 3
|
41
48
|
|
42
49
|
tracer1.stop
|
43
50
|
tracer2.stop
|
44
51
|
|
45
|
-
puts
|
52
|
+
puts 'Finished'
|
data/zipkin.gemspec
CHANGED
@@ -1,15 +1,14 @@
|
|
1
|
-
|
2
|
-
lib = File.expand_path('../lib', __FILE__)
|
1
|
+
lib = File.expand_path('lib', __dir__)
|
3
2
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
3
|
|
5
4
|
Gem::Specification.new do |spec|
|
6
5
|
spec.name = 'zipkin'
|
7
|
-
spec.version = '1.
|
6
|
+
spec.version = '1.1.0'
|
8
7
|
spec.authors = ['SaleMove TechMovers']
|
9
8
|
spec.email = ['techmovers@salemove.com']
|
10
9
|
|
11
|
-
spec.summary =
|
12
|
-
spec.description =
|
10
|
+
spec.summary = 'OpenTracing Tracer implementation for Zipkin in Ruby'
|
11
|
+
spec.description = ''
|
13
12
|
spec.homepage = ''
|
14
13
|
spec.license = 'MIT'
|
15
14
|
|
@@ -22,7 +21,9 @@ Gem::Specification.new do |spec|
|
|
22
21
|
spec.add_development_dependency 'bundler', '~> 1.14'
|
23
22
|
spec.add_development_dependency 'rake', '~> 10.0'
|
24
23
|
spec.add_development_dependency 'rspec', '~> 3.0'
|
24
|
+
spec.add_development_dependency 'rubocop', '~> 0.54.0'
|
25
|
+
spec.add_development_dependency 'rubocop-rspec', '~> 1.24.0'
|
25
26
|
|
26
|
-
spec.add_dependency 'opentracing', '~> 0.3'
|
27
27
|
spec.add_dependency 'json'
|
28
|
+
spec.add_dependency 'opentracing', '~> 0.3'
|
28
29
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: zipkin
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 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:
|
11
|
+
date: 2018-04-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -53,19 +53,33 @@ dependencies:
|
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '3.0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
56
|
+
name: rubocop
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
62
|
-
type: :
|
61
|
+
version: 0.54.0
|
62
|
+
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version:
|
68
|
+
version: 0.54.0
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rubocop-rspec
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 1.24.0
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 1.24.0
|
69
83
|
- !ruby/object:Gem::Dependency
|
70
84
|
name: json
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -80,6 +94,20 @@ dependencies:
|
|
80
94
|
- - ">="
|
81
95
|
- !ruby/object:Gem::Version
|
82
96
|
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: opentracing
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0.3'
|
104
|
+
type: :runtime
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0.3'
|
83
111
|
description: ''
|
84
112
|
email:
|
85
113
|
- techmovers@salemove.com
|
@@ -89,6 +117,7 @@ extra_rdoc_files: []
|
|
89
117
|
files:
|
90
118
|
- ".gitignore"
|
91
119
|
- ".rspec"
|
120
|
+
- ".rubocop.yml"
|
92
121
|
- ".travis.yml"
|
93
122
|
- Gemfile
|
94
123
|
- LICENSE.txt
|