rubyzipkin 0.4.5 → 0.4.6
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.
- data/lib/rubyzipkin.rb +58 -41
- data/lib/rubyzipkin/version.rb +1 -1
- metadata +4 -4
data/lib/rubyzipkin.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
require 'finagle-thrift'
|
2
2
|
require 'finagle-thrift/trace'
|
3
3
|
require 'scribe'
|
4
|
-
|
5
4
|
require 'rubyzipkin/version'
|
6
5
|
require 'rubyzipkin/scriber'
|
7
6
|
require 'rubyzipkin/headers'
|
@@ -27,73 +26,91 @@ module RubyZipkin extend self
|
|
27
26
|
@uri_sample_filter_list = uri_sample_filter_list
|
28
27
|
@scribe = Scribe.new("#{scribe_server}:#{scribe_port}")
|
29
28
|
@redis_config = redis_config
|
30
|
-
@sampled_ids =
|
29
|
+
@sampled_ids = {}
|
31
30
|
$redis_check_time = Time.now
|
32
31
|
::Trace.tracer = ::Trace::ZipkinTracer.new(Scriber.new(@scribe), scribe_max_buffer)
|
33
32
|
|
34
33
|
begin
|
35
|
-
|
34
|
+
if $redis.nil?
|
35
|
+
$redis = redis_from_config(@redis_config) if File.exist?(@redis_config)
|
36
|
+
end
|
36
37
|
rescue => e
|
37
|
-
$stderr.puts "
|
38
|
+
$stderr.puts "ZIPKIN [ERR] Redis instance could not be configured (nil)"
|
38
39
|
end
|
39
40
|
end
|
40
41
|
|
41
|
-
def
|
42
|
-
|
43
|
-
if
|
44
|
-
|
45
|
-
instance.select(config['db']) if config['db']
|
46
|
-
instance
|
42
|
+
def call(env)
|
43
|
+
|
44
|
+
if $redis.nil?
|
45
|
+
return
|
47
46
|
end
|
48
|
-
end
|
49
47
|
|
50
|
-
def call(env)
|
51
48
|
begin
|
52
49
|
::Trace.default_endpoint = ::Trace.default_endpoint.with_service_name(@service_name + "/#{top_level_path(env['PATH_INFO'])}")
|
53
50
|
set_sample_rate(env)
|
54
51
|
trace_id = get_or_create_trace_id(env)
|
55
|
-
env[ZipkinTraceHeader::PARENT_SPAN_ID] = @spanid
|
56
|
-
env[ZipkinTraceHeader::TRACE_ID] = @tid
|
57
|
-
|
58
52
|
rescue => e
|
59
53
|
$stderr.puts "ZIPKIN [ERR] #{e}"
|
60
54
|
end
|
61
55
|
|
62
56
|
begin
|
63
|
-
|
64
|
-
redis_sampling
|
65
|
-
tracing_filter(trace_id, env,
|
57
|
+
status, headers, response = @app.call(env)
|
58
|
+
redis_sampling(headers)
|
59
|
+
tracing_filter(trace_id, env, headers, status)
|
66
60
|
rescue => e
|
67
61
|
# we want to do the call even if zipkin fails
|
68
62
|
$stderr.puts "ZIPKIN [ERR] #{e} \n\n\n #{e.backtrace}"
|
69
63
|
end
|
70
|
-
[
|
64
|
+
[status, headers, response]
|
65
|
+
end
|
66
|
+
|
67
|
+
# Return the current set of IDS to be unsampled
|
68
|
+
# as selected from redis.
|
69
|
+
def redis_sampled_ids
|
70
|
+
@sampled_ids.to_s
|
71
71
|
end
|
72
72
|
|
73
|
-
|
73
|
+
def redis_from_config(file_name)
|
74
|
+
config = YAML.load_file(file_name)['production']
|
75
|
+
if config && (host = config['host']) && (port = config['port'])
|
76
|
+
instance = Redis.new(:host => host, :port => port, :thread_safe => true)
|
77
|
+
instance.select(config['db']) if config['db']
|
78
|
+
instance
|
79
|
+
end
|
80
|
+
end
|
81
|
+
private :redis_from_config
|
82
|
+
|
74
83
|
def get_ids_from_redis
|
75
|
-
if
|
76
|
-
@sampled_ids =
|
77
|
-
keys = Redis::Safe.instance(:default).get("zipkin_trace_keys")
|
84
|
+
if $redis and (Time.now - $redis_check_time) > 600 # seconds
|
85
|
+
@sampled_ids = {}
|
78
86
|
|
79
|
-
#
|
80
|
-
|
81
|
-
|
87
|
+
# ID's will be set as a sorted map of GUIDS from flexd's admin page
|
88
|
+
key = $redis.get("zipkin_traced_dguids")
|
89
|
+
|
90
|
+
unless key.nil?
|
91
|
+
begin
|
92
|
+
@sampled_ids = JSON.parse(key)
|
93
|
+
rescue => e
|
94
|
+
puts "ZIPKIN [ERR] unable to parse key set from redis keys: #{e.message}"
|
95
|
+
end
|
82
96
|
end
|
83
97
|
|
84
98
|
$redis_check_time = Time.now
|
85
99
|
end
|
86
100
|
end
|
101
|
+
private :get_ids_from_redis
|
87
102
|
|
88
|
-
|
89
|
-
def redis_sampling
|
103
|
+
def redis_sampling(headers)
|
90
104
|
get_ids_from_redis
|
91
|
-
|
92
|
-
::Trace.sample_rate = 1.0
|
93
|
-
end
|
105
|
+
::Trace.sample_rate = 1.0 if id_in_sample_set?(headers)
|
94
106
|
end
|
107
|
+
private :redis_sampling
|
108
|
+
|
109
|
+
def id_in_sample_set?(headers)
|
110
|
+
headers[ZipkinTraceHeader::LOOKOUT_SAMPLE] and @sampled_ids.keys.include?(headers[ZipkinTraceHeader::LOOKOUT_SAMPLE])
|
111
|
+
end
|
112
|
+
private :id_in_sample_set?
|
95
113
|
|
96
|
-
private
|
97
114
|
def set_sample_rate(env)
|
98
115
|
custom_sample_rate =RubyZipkin::TraceFilter.UriSamplingMatches?(normalized_uri(env["PATH_INFO"]), @uri_sample_filter_list)
|
99
116
|
|
@@ -103,19 +120,19 @@ module RubyZipkin extend self
|
|
103
120
|
::Trace.sample_rate = @sample_rate
|
104
121
|
end
|
105
122
|
end
|
123
|
+
private :set_sample_rate
|
106
124
|
|
107
|
-
|
108
|
-
def tracing_filter(trace_id, env, headers=nil)
|
125
|
+
def tracing_filter(trace_id, env, headers=nil, status='')
|
109
126
|
if RubyZipkin::TraceFilter.UriFilterMatches?(normalized_uri(env["PATH_INFO"]), @uri_filter_list)
|
110
|
-
"ZIPKIN: path matches filter. returning"
|
111
127
|
return
|
112
128
|
end
|
113
129
|
@lock.synchronize do
|
114
130
|
::Trace.push(trace_id)
|
115
131
|
|
116
|
-
set_trace_caption(env)
|
132
|
+
set_trace_caption(env, status)
|
133
|
+
|
117
134
|
::Trace.record(::Trace::BinaryAnnotation.new("http.uri", top_level_path(env["PATH_INFO"]), "STRING", ::Trace.default_endpoint))
|
118
|
-
::Trace.record(::Trace::BinaryAnnotation.new("http.status",
|
135
|
+
::Trace.record(::Trace::BinaryAnnotation.new("http.status", status.to_s, "STRING", ::Trace.default_endpoint))
|
119
136
|
::Trace.record(::Trace::Annotation.new(::Trace::Annotation::SERVER_RECV, ::Trace.default_endpoint))
|
120
137
|
|
121
138
|
add_referer(env)
|
@@ -132,6 +149,7 @@ module RubyZipkin extend self
|
|
132
149
|
p = ::Trace.pop
|
133
150
|
end
|
134
151
|
end
|
152
|
+
private :tracing_filter
|
135
153
|
|
136
154
|
def add_referer(env)
|
137
155
|
if env['HTTP_REFERER']
|
@@ -156,12 +174,11 @@ module RubyZipkin extend self
|
|
156
174
|
end
|
157
175
|
end
|
158
176
|
|
159
|
-
def set_trace_caption(env)
|
160
|
-
::Trace.set_rpc_name("#{env['REQUEST_METHOD']} - #{
|
177
|
+
def set_trace_caption(env, status)
|
178
|
+
::Trace.set_rpc_name("#{env['REQUEST_METHOD']} - #{status.to_s} - #{uri_summary(env['PATH_INFO'])}")
|
161
179
|
end
|
162
180
|
|
163
181
|
def trace_post_data(content)
|
164
|
-
|
165
182
|
# Slightly large size cap to the request input to accomodate larger JSON bodies.
|
166
183
|
MetadataLogger.log('HTTP_REQUEST_INPUT', content.to_s, 1024)
|
167
184
|
end
|
@@ -198,7 +215,7 @@ module RubyZipkin extend self
|
|
198
215
|
|
199
216
|
@spanid = Trace.generate_id
|
200
217
|
|
201
|
-
# Save into headers
|
218
|
+
# Save into HTTP headers
|
202
219
|
env[ZipkinTraceHeader::TRACE_ID] = @trace_id
|
203
220
|
env[ZipkinTraceHeader::SPAN_ID] = @spanid
|
204
221
|
env[ZipkinTraceHeader::PARENT_SPAN_ID] = @parentspan
|
data/lib/rubyzipkin/version.rb
CHANGED
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rubyzipkin
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 3
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 4
|
9
|
-
-
|
10
|
-
version: 0.4.
|
9
|
+
- 6
|
10
|
+
version: 0.4.6
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Ivan Marcin
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2014-02-
|
18
|
+
date: 2014-02-14 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
name: scribe
|