zipkin-tracer 0.6.3 → 0.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/lib/zipkin-tracer/careless_scribe.rb +48 -13
- data/lib/zipkin-tracer/rack/zipkin-tracer.rb +20 -10
- data/lib/zipkin-tracer/version.rb +1 -1
- metadata +16 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
YzJiNzAzYmI1YTJkNzc2YTViYzdhZjM5YzZjMmZkZTJiYjEyNWNhYQ==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
ZGQzMDkwYTdiODdlYTRhNjFkYWRjYmU4OTU4MWFiNjViNTRkYTI0Ng==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
ODQ5NWQ0YzA1OTI2MjMyNWM3NGIwNTNlODZkOGVhY2I3OWMzOTJhOWFlZmMw
|
10
|
+
MTgzZjU3ODBlNTViNmMwMzYyOTE2ODYxNjY5ZjdjN2IwMTA3ZDk0NjRjZGIw
|
11
|
+
MjYzNjBhZWY4YzNjMmQyNjY1MWVjZTdiODdkYmFjMjRiNmUyNzU=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
Zjc4MzJmYTg1ODEzYWVmM2YyODA1ZTRjZGNiNWRmODA2MTlhYWY1MTc0OGQw
|
14
|
+
MDk3NzcxYTRjZTAwOTAyOTM1NDdmYjEwOWZkZGNkOGM5NTVmZmRjZTZlODQx
|
15
|
+
NmE3Y2ZiOGMxOTBmMGZhMDg4ODk4YjU0NTU4ODhkNTQwZDNjOTM=
|
@@ -1,35 +1,70 @@
|
|
1
1
|
# Copyright 2012 Twitter Inc.
|
2
|
-
#
|
2
|
+
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
5
5
|
# You may obtain a copy of the License at
|
6
|
-
#
|
6
|
+
#
|
7
7
|
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
-
#
|
8
|
+
#
|
9
9
|
# Unless required by applicable law or agreed to in writing, software
|
10
10
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
11
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
12
|
# See the License for the specific language governing permissions and
|
13
13
|
# limitations under the License.
|
14
14
|
|
15
|
-
|
16
|
-
|
17
|
-
|
15
|
+
require 'sucker_punch'
|
16
|
+
|
17
|
+
|
18
|
+
module ScribeThrift
|
19
|
+
# This is here just for the monkey partching
|
20
|
+
class Client
|
21
|
+
# This method in the original class was both sending and receiving logs.
|
22
|
+
# The original class: https://github.com/twitter/scribe/blob/master/vendor/gen-rb/scribe.rb
|
23
|
+
# Receiving logs may take even several seconds, depending on the buffering of the collector.
|
24
|
+
# We are just sending and forgetting here, we do not really care about the result
|
25
|
+
def Log(messages)
|
26
|
+
send_Log(messages)
|
27
|
+
0 # 0 means success , the original code called recv_Log()
|
28
|
+
end
|
18
29
|
end
|
30
|
+
end
|
19
31
|
|
20
|
-
|
21
|
-
|
32
|
+
# SuckerPunch creates a queue and a thread pool to work on jobs on the queue
|
33
|
+
# calling perform adds the code to the queue
|
34
|
+
class AsyncScribe
|
35
|
+
include SuckerPunch::Job
|
36
|
+
|
37
|
+
PROTOCOL_TIMEOUT = 10 # If the timeout is low, the protocol will lose spans when collector is not fast enough
|
38
|
+
CATEGORY = 'ruby' # Thrift-client already uses this as default, seems to not affect anything
|
39
|
+
ADD_NEWLINES_TO_MESSAGES = true # True is the default in Thrift-client, seems a necessary internal hack
|
40
|
+
|
41
|
+
def perform(server_address, *args)
|
42
|
+
# May seem wasteful to open a new connection per each span but the way the scribe is done
|
43
|
+
# it is difficult to ensure there will be no threading issues unless we create here the connection
|
44
|
+
scribe = Scribe.new(server_address, CATEGORY, ADD_NEWLINES_TO_MESSAGES, timeout: PROTOCOL_TIMEOUT)
|
45
|
+
scribe.log(*args)
|
22
46
|
rescue ThriftClient::NoServersAvailable, Thrift::Exception
|
23
47
|
# I couldn't care less
|
24
48
|
end
|
25
49
|
|
50
|
+
end
|
51
|
+
|
52
|
+
# Scribe which rescue thrift errors to avoid them to raise to the client
|
53
|
+
class CarelessScribe
|
54
|
+
|
55
|
+
def initialize(scribe_server_address)
|
56
|
+
@server_address = scribe_server_address
|
57
|
+
end
|
58
|
+
|
59
|
+
def log(*args)
|
60
|
+
AsyncScribe.new.async.perform(@server_address, *args)
|
61
|
+
end
|
62
|
+
|
26
63
|
def batch(&block)
|
27
|
-
|
64
|
+
yield #We just yield here
|
65
|
+
# the block finagle-thrift-1.4.1/lib/finagle-thrift/tracer.rb flush! method will call log also.
|
28
66
|
rescue ThriftClient::NoServersAvailable, Thrift::Exception
|
29
67
|
# I couldn't care less
|
30
68
|
end
|
31
69
|
|
32
|
-
|
33
|
-
@scribe.send(name, *args)
|
34
|
-
end
|
35
|
-
end
|
70
|
+
end
|
@@ -36,23 +36,23 @@ module ZipkinTracer extend self
|
|
36
36
|
config = Config.new(app, config)
|
37
37
|
|
38
38
|
::Trace.tracer = if config.using_scribe?
|
39
|
-
|
40
|
-
::Trace::ZipkinTracer.new(CarelessScribe.new(scribe), config.scribe_max_buffer)
|
39
|
+
::Trace::ZipkinTracer.new(CarelessScribe.new(config.scribe_server), config.scribe_max_buffer)
|
41
40
|
elsif config.using_kafka?
|
42
41
|
kafkaTracer = ::Trace::ZipkinKafkaTracer.new
|
43
42
|
kafkaTracer.connect(config.zookeeper)
|
44
43
|
kafkaTracer
|
44
|
+
else
|
45
|
+
::Trace::NullTracer.new
|
45
46
|
end
|
46
|
-
|
47
|
+
::Trace.default_endpoint = ::Trace.default_endpoint.with_service_name(config.service_name).with_port(config.service_port)
|
48
|
+
::Trace.sample_rate=(config.sample_rate)
|
47
49
|
|
50
|
+
@config = config
|
48
51
|
end
|
49
52
|
|
50
53
|
def call(env)
|
51
54
|
# skip certain requests
|
52
55
|
return @app.call(env) if filtered?(env) || !routable_request?(env)
|
53
|
-
|
54
|
-
::Trace.default_endpoint = ::Trace.default_endpoint.with_service_name(@config.service_name).with_port(@config.service_port)
|
55
|
-
::Trace.sample_rate=(@config.sample_rate)
|
56
56
|
whitelisted = force_sample?(env)
|
57
57
|
id = get_or_create_trace_id(env, whitelisted) # note that this depends on the sample rate being set
|
58
58
|
tracing_filter(id, env, whitelisted) { @app.call(env) }
|
@@ -84,22 +84,32 @@ module ZipkinTracer extend self
|
|
84
84
|
def tracing_filter(trace_id, env, whitelisted=false)
|
85
85
|
synchronize do
|
86
86
|
::Trace.push(trace_id)
|
87
|
-
|
88
|
-
|
87
|
+
#if called by a service, the caller already added the information
|
88
|
+
add_request_information(env) unless called_with_zipkin_headers?(env)
|
89
89
|
::Trace.record(::Trace::Annotation.new(::Trace::Annotation::SERVER_RECV, ::Trace.default_endpoint))
|
90
90
|
::Trace.record(::Trace::Annotation.new('whitelisted', ::Trace.default_endpoint)) if whitelisted
|
91
91
|
end
|
92
92
|
status, headers, body = yield if block_given?
|
93
93
|
ensure
|
94
94
|
synchronize do
|
95
|
-
::Trace.record(::Trace::Annotation.new(::Trace::Annotation::SERVER_SEND, ::Trace.default_endpoint))
|
96
95
|
annotate(env, status, headers, body)
|
96
|
+
::Trace.record(::Trace::Annotation.new(::Trace::Annotation::SERVER_SEND, ::Trace.default_endpoint))
|
97
97
|
::Trace.pop
|
98
98
|
end
|
99
|
+
[status, headers, body]
|
99
100
|
end
|
100
101
|
|
101
102
|
private
|
102
103
|
|
104
|
+
def add_request_information(env)
|
105
|
+
::Trace.set_rpc_name(env["REQUEST_METHOD"]) # get/post and all that jazz
|
106
|
+
::Trace.record(::Trace::BinaryAnnotation.new("http.uri", env["PATH_INFO"], "STRING", ::Trace.default_endpoint))
|
107
|
+
end
|
108
|
+
|
109
|
+
def called_with_zipkin_headers?(env)
|
110
|
+
B3_REQUIRED_HEADERS.all? { |key| env.has_key?(key) }
|
111
|
+
end
|
112
|
+
|
103
113
|
def synchronize(&block)
|
104
114
|
@lock.synchronize do
|
105
115
|
yield
|
@@ -111,7 +121,7 @@ module ZipkinTracer extend self
|
|
111
121
|
end
|
112
122
|
|
113
123
|
def get_or_create_trace_id(env, whitelisted, default_flags = ::Trace::Flags::EMPTY)
|
114
|
-
trace_parameters = if
|
124
|
+
trace_parameters = if called_with_zipkin_headers?(env)
|
115
125
|
env.values_at(*B3_REQUIRED_HEADERS)
|
116
126
|
else
|
117
127
|
new_id = Trace.generate_id
|
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.7'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Franklin Hu
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2015-10-
|
13
|
+
date: 2015-10-21 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: finagle-thrift
|
@@ -54,6 +54,20 @@ dependencies:
|
|
54
54
|
- - ~>
|
55
55
|
- !ruby/object:Gem::Version
|
56
56
|
version: '1.3'
|
57
|
+
- !ruby/object:Gem::Dependency
|
58
|
+
name: sucker_punch
|
59
|
+
requirement: !ruby/object:Gem::Requirement
|
60
|
+
requirements:
|
61
|
+
- - ~>
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: '1.0'
|
64
|
+
type: :runtime
|
65
|
+
prerelease: false
|
66
|
+
version_requirements: !ruby/object:Gem::Requirement
|
67
|
+
requirements:
|
68
|
+
- - ~>
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: '1.0'
|
57
71
|
- !ruby/object:Gem::Dependency
|
58
72
|
name: rspec
|
59
73
|
requirement: !ruby/object:Gem::Requirement
|