ruby-zipkin 0.2.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.
@@ -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
+