ruby-zipkin 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,86 @@
1
+ require 'finagle-thrift'
2
+ require 'finagle-thrift/trace'
3
+ require 'ruby-zipkin/scriber'
4
+ require 'ruby-zipkin/headers'
5
+ require 'ruby-zipkin/metadata_logger'
6
+ require 'ruby-zipkin/tracesampler'
7
+ require "awesome_print"
8
+
9
+ module RubyZipkin extend self
10
+
11
+ class RackHandler
12
+
13
+ def initialize(app, service_name ='flexd', scribe_server = "204.77.168.48", scribe_port = 9410, scribe_max_buffer = 10 )
14
+ @app = app
15
+ @lock = Mutex.new
16
+ @service_name = service_name
17
+ @scribe_port = scribe_port
18
+ @sample_rate = 0.1
19
+ @scribe = Scribe.new("#{scribe_server}:#{scribe_port}")
20
+ ::Trace.tracer = ::Trace::ZipkinTracer.new(Scriber.new(@scribe), scribe_max_buffer)
21
+ end
22
+
23
+ def call(env)
24
+ ::Trace.default_endpoint = ::Trace.default_endpoint.with_service_name(@service_name).with_port(@service_port)
25
+ ::Trace.sample_rate = 0.1
26
+
27
+ tracing_filter(get_or_create_trace_id(env), env)
28
+ env[ZipkinTraceHeader::PARENT_SPAN_ID] = @spanid
29
+ env[ZipkinTraceHeader::TRACE_ID] = @tid
30
+ @status, @headers, @response = @app.call(env)
31
+
32
+ [@status, @headers, @response]
33
+ end
34
+
35
+ private
36
+ def tracing_filter(trace_id, env)
37
+ @lock.synchronize do
38
+ ::Trace.push(trace_id)
39
+ ::Trace.set_rpc_name(env["PATH_INFO"])
40
+ ::Trace.record(::Trace::BinaryAnnotation.new("http.uri", env["PATH_INFO"], "STRING", ::Trace.default_endpoint))
41
+ ::Trace.record(::Trace::Annotation.new(::Trace::Annotation::SERVER_RECV, ::Trace.default_endpoint))
42
+ ::Trace.record(::Trace::Annotation.new(@service_name, ::Trace.default_endpoint))
43
+ trace_rack_request(env)
44
+ end
45
+ yield if block_given?
46
+ ensure
47
+ @lock.synchronize do
48
+ ::Trace.record(::Trace::Annotation.new(::Trace::Annotation::SERVER_SEND, ::Trace.default_endpoint))
49
+ ::Trace.pop
50
+ end
51
+ end
52
+
53
+ def trace_rack_request(env)
54
+ env.each do |k,v|
55
+ MetadataLogger.log(k.to_s, v.to_s)
56
+ end
57
+ end
58
+
59
+ def get_or_create_trace_id(env)
60
+ if env.has_key?(ZipkinTraceHeader::TRACE_ID)
61
+ @tid = env[ZipkinTraceHeader::TRACE_ID]
62
+ else
63
+ @tid = Trace.generate_id
64
+ end
65
+
66
+ if env.has_key?(ZipkinTraceHeader::SPAN_ID)
67
+ @spanid = env[ZipkinTraceHeader::SPAN_ID]
68
+ else
69
+ @spanid = Trace.generate_id
70
+ end
71
+
72
+ if env.has_key?(ZipkinTraceHeader::PARENT_SPAN_ID)
73
+ @parentspan = env[ZipkinTraceHeader::PARENT_SPAN_ID]
74
+ else
75
+ @parentspan = nil
76
+ end
77
+
78
+ # from Finagle source: flags are 0 = none , 1 = debug
79
+ Trace::TraceId.new @tid, @parentspan, @spanid, true, 0
80
+ end
81
+
82
+ def get_or_create_trace_id2(env)
83
+ id = ::Trace::TraceId.new(::Trace.generate_id, nil, ::Trace.generate_id, true, ::Trace::Flags::EMPTY)
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,11 @@
1
+ # Tracing HTTP header types
2
+ module RubyZipkin
3
+ module ZipkinTraceHeader
4
+ TRACE_ID = "X-ZK-TID"
5
+ SPAN_ID = "X-ZK-SID"
6
+ PARENT_SPAN_ID = "X-ZK-PSID"
7
+ TRACE_SAMPLED = "X-ZK-SMP"
8
+ TRACE_FLAGS = "X-ZK-FLG"
9
+ FORCE_SAMPLE = "X-FORCE-SAMPLE"
10
+ end
11
+ end
@@ -0,0 +1,26 @@
1
+ require 'finagle-thrift'
2
+ require 'finagle-thrift/trace'
3
+
4
+ #writes properties and request headers as metadata into a trace
5
+ module RubyZipkin
6
+ class MetadataLogger
7
+
8
+ def self.log(key, value)
9
+ ::Trace.record(::Trace::BinaryAnnotation.new(key, value, "STRING", ::Trace.default_endpoint))
10
+ end
11
+
12
+ # Do a full dump of a request header into zipkin.
13
+ def self.log_request(headers, service_name = "UNDEFINED")
14
+ if headers
15
+
16
+ #request = Rack::Request.new(headers)
17
+ # MetadataLogger.log("PARAMETERS", headers.params)
18
+
19
+ headers.each do |header, value|
20
+ puts "logging on zipkin: #{header}, #{value}"
21
+ MetadataLogger.log("HEADER_#{header}", value)
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,37 @@
1
+ require 'scribe'
2
+
3
+ # Scribe Writer
4
+ # Based on the original zipkin tracer game
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ module RubyZipkin
18
+ class Scriber
19
+ def initialize(scribe)
20
+ @scribe = scribe
21
+ end
22
+
23
+ def log(*args)
24
+ @scribe.log(*args)
25
+ rescue ThriftClient::NoServersAvailable, Thrift::Exception
26
+ end
27
+
28
+ def batch(&block)
29
+ @scribe.batch(&block)
30
+ rescue ThriftClient::NoServersAvailable, Thrift::Exception
31
+ end
32
+
33
+ def method_missing(name, *args)
34
+ @scribe.send(name, *args)
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,11 @@
1
+ #Filters to decide wheter a request should be traced.
2
+ module RubyZipkin
3
+ class TraceFilter
4
+
5
+ def self.UriFilter(uri)
6
+ #exclude static content requests:
7
+ if(uri.include?(".ttf") )
8
+ end
9
+
10
+ end
11
+ end
@@ -0,0 +1,16 @@
1
+ #Decides wheter a collected trace should be sampled or not.
2
+ module RubyZipkin
3
+ class TraceSampler
4
+
5
+ def self.request_sample_rate(request)
6
+
7
+ if request[RubyZipkin::ZipkinTraceHeader::FORCE_SAMPLE]
8
+ #filter is matched in the request, thus ensure not fitereed by returning 100% tracing (unsampled)
9
+ if request.body.matches(filter)
10
+ return 1
11
+ end
12
+ end
13
+ return 0.01
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,3 @@
1
+ module RubyZipkin
2
+ VERSION = "0.2.0"
3
+ end
metadata ADDED
@@ -0,0 +1,119 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ruby-zipkin
3
+ version: !ruby/object:Gem::Version
4
+ hash: 23
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 2
9
+ - 0
10
+ version: 0.2.0
11
+ platform: ruby
12
+ authors:
13
+ - Ivan Marcin
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2013-09-24 00:00:00 Z
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: finagle-thrift
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ~>
27
+ - !ruby/object:Gem::Version
28
+ hash: 27
29
+ segments:
30
+ - 1
31
+ - 3
32
+ - 0
33
+ version: 1.3.0
34
+ type: :runtime
35
+ version_requirements: *id001
36
+ - !ruby/object:Gem::Dependency
37
+ name: scribe
38
+ prerelease: false
39
+ requirement: &id002 !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ~>
43
+ - !ruby/object:Gem::Version
44
+ hash: 31
45
+ segments:
46
+ - 0
47
+ - 2
48
+ - 4
49
+ version: 0.2.4
50
+ type: :runtime
51
+ version_requirements: *id002
52
+ - !ruby/object:Gem::Dependency
53
+ name: awesome_print
54
+ prerelease: false
55
+ requirement: &id003 !ruby/object:Gem::Requirement
56
+ none: false
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ hash: 3
61
+ segments:
62
+ - 0
63
+ version: "0"
64
+ type: :runtime
65
+ version_requirements: *id003
66
+ description: Track rack header requests on zipkin
67
+ email:
68
+ - ivan.marcin@lookout.com
69
+ executables: []
70
+
71
+ extensions: []
72
+
73
+ extra_rdoc_files: []
74
+
75
+ files:
76
+ - lib/ruby-zipkin/headers.rb
77
+ - lib/ruby-zipkin/metadata_logger.rb
78
+ - lib/ruby-zipkin/scriber.rb
79
+ - lib/ruby-zipkin/trace_filter.rb
80
+ - lib/ruby-zipkin/tracesampler.rb
81
+ - lib/ruby-zipkin/version.rb
82
+ - lib/ruby-zipkin.rb
83
+ homepage: https://github.com/twitter/zipkin
84
+ licenses: []
85
+
86
+ post_install_message:
87
+ rdoc_options: []
88
+
89
+ require_paths:
90
+ - lib
91
+ required_ruby_version: !ruby/object:Gem::Requirement
92
+ none: false
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ hash: 3
97
+ segments:
98
+ - 0
99
+ version: "0"
100
+ required_rubygems_version: !ruby/object:Gem::Requirement
101
+ none: false
102
+ requirements:
103
+ - - ">="
104
+ - !ruby/object:Gem::Version
105
+ hash: 17
106
+ segments:
107
+ - 1
108
+ - 3
109
+ - 5
110
+ version: 1.3.5
111
+ requirements: []
112
+
113
+ rubyforge_project:
114
+ rubygems_version: 1.8.25
115
+ signing_key:
116
+ specification_version: 3
117
+ summary: Ruby tracing via Zipkin
118
+ test_files: []
119
+