rubyzipkin 0.4.2 → 0.4.3
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 +54 -4
- data/lib/rubyzipkin/headers.rb +1 -0
- data/lib/rubyzipkin/permanent_header_filter.rb +2 -1
- data/lib/rubyzipkin/version.rb +1 -1
- metadata +4 -4
data/lib/rubyzipkin.rb
CHANGED
@@ -15,7 +15,7 @@ module RubyZipkin extend self
|
|
15
15
|
|
16
16
|
class RackHandler
|
17
17
|
|
18
|
-
def initialize(app, service_name, scribe_server, scribe_port, uri_filter_list = [], http_header_filter_list = [], uri_sample_filter_list = {}, sampling_rate = 0.0001, scribe_max_buffer = 50 )
|
18
|
+
def initialize(app, service_name, scribe_server, scribe_port, uri_filter_list = [], http_header_filter_list = [], uri_sample_filter_list = {}, sampling_rate = 0.0001, scribe_max_buffer = 50, redis_config = 'config/redis.yml')
|
19
19
|
@app = app
|
20
20
|
@lock = Mutex.new
|
21
21
|
|
@@ -26,12 +26,30 @@ module RubyZipkin extend self
|
|
26
26
|
@http_header_filter_list = http_header_filter_list
|
27
27
|
@uri_sample_filter_list = uri_sample_filter_list
|
28
28
|
@scribe = Scribe.new("#{scribe_server}:#{scribe_port}")
|
29
|
+
@redis_config = redis_config
|
30
|
+
@sampled_ids = []
|
31
|
+
$redis_check_time = Time.now
|
29
32
|
::Trace.tracer = ::Trace::ZipkinTracer.new(Scriber.new(@scribe), scribe_max_buffer)
|
33
|
+
|
34
|
+
begin
|
35
|
+
@redis = redis_from_config(redis_config) if File.exists?(@redis_config)
|
36
|
+
rescue => e
|
37
|
+
$stderr.puts "No Redis instance"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def redis_from_config(file_name)
|
42
|
+
config = YAML.load_file(file_name)['production']
|
43
|
+
if config && (host = config['host']) && (port = config['port'])
|
44
|
+
instance = Redis.new(:host => host, :port => port, :logger => Rails.logger, :thread_safe => true)
|
45
|
+
instance.select(config['db']) if config['db']
|
46
|
+
instance
|
47
|
+
end
|
30
48
|
end
|
31
49
|
|
32
50
|
def call(env)
|
33
51
|
begin
|
34
|
-
::Trace.default_endpoint = ::Trace.default_endpoint.with_service_name(@service_name + "
|
52
|
+
::Trace.default_endpoint = ::Trace.default_endpoint.with_service_name(@service_name + "/#{top_level_path(env['PATH_INFO'])}")
|
35
53
|
set_sample_rate(env)
|
36
54
|
trace_id = get_or_create_trace_id(env)
|
37
55
|
env[ZipkinTraceHeader::PARENT_SPAN_ID] = @spanid
|
@@ -43,6 +61,7 @@ module RubyZipkin extend self
|
|
43
61
|
|
44
62
|
begin
|
45
63
|
@status, @headers, @response = @app.call(env)
|
64
|
+
redis_sampling
|
46
65
|
tracing_filter(trace_id, env, @headers)
|
47
66
|
rescue => e
|
48
67
|
# we want to do the call even if zipkin fails
|
@@ -51,6 +70,24 @@ module RubyZipkin extend self
|
|
51
70
|
[@status, @headers, @response]
|
52
71
|
end
|
53
72
|
|
73
|
+
private
|
74
|
+
def get_ids_from_redis
|
75
|
+
if @redis and (Time.now - $redis_check_time) > 1 #5 minutes
|
76
|
+
@sampled_ids = []
|
77
|
+
keys = Redis::Safe.instance(:default).keys("zipkin*")
|
78
|
+
keys.each { |i| @sampled_ids.push( i.split('_')[1] ) }
|
79
|
+
$redis_check_time = Time.now
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
private
|
84
|
+
def redis_sampling
|
85
|
+
get_ids_from_redis
|
86
|
+
if @headers[ZipkinTraceHeader::LOOKOUT_SAMPLE] and @sampled_ids.include?(@headers[ZipkinTraceHeader::LOOKOUT_SAMPLE])
|
87
|
+
::Trace.sample_rate = 1.0
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
54
91
|
private
|
55
92
|
def set_sample_rate(env)
|
56
93
|
custom_sample_rate =RubyZipkin::TraceFilter.UriSamplingMatches?(normalized_uri(env["PATH_INFO"]), @uri_sample_filter_list)
|
@@ -72,7 +109,7 @@ module RubyZipkin extend self
|
|
72
109
|
::Trace.push(trace_id)
|
73
110
|
|
74
111
|
set_trace_caption(env)
|
75
|
-
::Trace.record(::Trace::BinaryAnnotation.new("http.uri",
|
112
|
+
::Trace.record(::Trace::BinaryAnnotation.new("http.uri", top_level_path(env["PATH_INFO"]), "STRING", ::Trace.default_endpoint))
|
76
113
|
::Trace.record(::Trace::BinaryAnnotation.new("http.status", @status.to_s, "STRING", ::Trace.default_endpoint))
|
77
114
|
::Trace.record(::Trace::Annotation.new(::Trace::Annotation::SERVER_RECV, ::Trace.default_endpoint))
|
78
115
|
|
@@ -101,8 +138,21 @@ module RubyZipkin extend self
|
|
101
138
|
path.gsub(/\/\d+/, '/:id')
|
102
139
|
end
|
103
140
|
|
141
|
+
def top_level_path(path)
|
142
|
+
path.split('/')[1]
|
143
|
+
end
|
144
|
+
|
145
|
+
def uri_summary(path)
|
146
|
+
suffix = path.match /\w+$/
|
147
|
+
if suffix.to_s.length > 10
|
148
|
+
normalized_uri(path.gsub(/\w+$/,''))
|
149
|
+
else
|
150
|
+
normalized_uri(path)
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
104
154
|
def set_trace_caption(env)
|
105
|
-
::Trace.set_rpc_name("#{env['REQUEST_METHOD']} - #{@status.to_s} - #{
|
155
|
+
::Trace.set_rpc_name("#{env['REQUEST_METHOD']} - #{@status.to_s} - #{uri_summary(env['PATH_INFO'])}")
|
106
156
|
end
|
107
157
|
|
108
158
|
def trace_post_data(content)
|
data/lib/rubyzipkin/headers.rb
CHANGED
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: 9
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 4
|
9
|
-
-
|
10
|
-
version: 0.4.
|
9
|
+
- 3
|
10
|
+
version: 0.4.3
|
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:
|
18
|
+
date: 2014-01-26 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
name: scribe
|