zipkin-tracer 0.0.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ ODM0MDUyZmVmZTcyNjkwODQ1ZjMxOTdhYjQ1NWUzNzE3N2NiNTgwNg==
5
+ data.tar.gz: !binary |-
6
+ ZmI1NTA2NTk0YzdlZDdlYjlmNjZjYmRlYzFlOGJmOGVlY2U3ZTk5Ng==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ M2YyMjk4MDU0MDk3ZDYxMjdmMGU4MGIwMzZhZmM4ZDM4NzM1MTUzMmU2OTFi
10
+ YjRiNmI1OWM0NTJlYmUwNDA5YThlODI0ZTI0MWFiNGI3OTQwMTFkYjA5MTk0
11
+ ZjAyYjBiMGJmYTNmNjkxMmI2YjczNjQ1ZGQ0YjQ4Y2VhMWZjOGI=
12
+ data.tar.gz: !binary |-
13
+ NGJlM2E0MDM2MzViMDVjMTMwYmU5ZjczMWY0ZmU1MTExNTYyOTIyOTRhODBj
14
+ YWQwMWU4ZTAwZmIyYmZhMzlhMjA4MzU5NDE5ODRkOWNiOTRhYzg1NTk4ZDU1
15
+ MGU5ZWE5ZjlkOTAxYTY5Yjg2ZDQ3ZDY3OTMxMWM1Y2Y5OWRlNGU=
@@ -12,6 +12,6 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
  module ZipkinTracer
15
- VERSION = "0.0.1"
15
+ VERSION = "0.2.0"
16
16
  end
17
17
 
data/lib/zipkin-tracer.rb CHANGED
@@ -20,11 +20,14 @@ require 'zipkin-tracer/careless_scribe'
20
20
  module ZipkinTracer extend self
21
21
 
22
22
  class RackHandler
23
- def initialize(app)
23
+ B3_REQUIRED_HEADERS = %w[HTTP_X_B3_TRACEID HTTP_X_B3_PARENTSPANID HTTP_X_B3_SPANID HTTP_X_B3_SAMPLED]
24
+ B3_OPT_HEADERS = %w[HTTP_X_B3_FLAGS]
25
+
26
+ def initialize(app, config=nil)
24
27
  @app = app
25
28
  @lock = Mutex.new
26
29
 
27
- config = app.config.zipkin_tracer
30
+ config ||= app.config.zipkin_tracer # if not specified, try on app (e.g. Rails 3+)
28
31
  @service_name = config[:service_name]
29
32
  @service_port = config[:service_port]
30
33
 
@@ -49,31 +52,69 @@ module ZipkinTracer extend self
49
52
  0.1
50
53
  end
51
54
 
55
+ @annotate_plugin = config[:annotate_plugin] # call for trace annotation
56
+ @filter_plugin = config[:filter_plugin] # skip tracing if returns false
57
+ @whitelist_plugin = config[:whitelist_plugin] # force sampling if returns true
58
+
52
59
  ::Trace.tracer = ::Trace::ZipkinTracer.new(CarelessScribe.new(scribe), scribe_max_buffer)
53
60
  end
54
61
 
55
62
  def call(env)
56
- id = ::Trace::TraceId.new(::Trace.generate_id, nil, ::Trace.generate_id, true)
63
+ # skip certain requests
64
+ return @app.call(env) if filtered?(env)
65
+
57
66
  ::Trace.default_endpoint = ::Trace.default_endpoint.with_service_name(@service_name).with_port(@service_port)
58
67
  ::Trace.sample_rate=(@sample_rate)
59
- tracing_filter(id, env) { @app.call(env) }
68
+ whitelisted = force_sample?(env)
69
+ id = get_or_create_trace_id(env, whitelisted) # note that this depends on the sample rate being set
70
+ tracing_filter(id, env, whitelisted) { @app.call(env) }
60
71
  end
61
72
 
62
73
  private
63
- def tracing_filter(trace_id, env)
74
+ def annotate(env, status, response_headers, response_body)
75
+ @annotate_plugin.call(env, status, response_headers, response_body) if @annotate_plugin
76
+ end
77
+
78
+ def filtered?(env)
79
+ @filter_plugin && !@filter_plugin.call(env)
80
+ end
81
+
82
+ def force_sample?(env)
83
+ @whitelist_plugin && @whitelist_plugin.call(env)
84
+ end
85
+
86
+ def tracing_filter(trace_id, env, whitelisted=false)
64
87
  @lock.synchronize do
65
88
  ::Trace.push(trace_id)
66
89
  ::Trace.set_rpc_name(env["REQUEST_METHOD"]) # get/post and all that jazz
67
90
  ::Trace.record(::Trace::BinaryAnnotation.new("http.uri", env["PATH_INFO"], "STRING", ::Trace.default_endpoint))
68
91
  ::Trace.record(::Trace::Annotation.new(::Trace::Annotation::SERVER_RECV, ::Trace.default_endpoint))
92
+ ::Trace.record(::Trace::Annotation.new('whitelisted', ::Trace.default_endpoint)) if whitelisted
69
93
  end
70
- yield if block_given?
94
+ status, headers, body = yield if block_given?
71
95
  ensure
72
96
  @lock.synchronize do
73
97
  ::Trace.record(::Trace::Annotation.new(::Trace::Annotation::SERVER_SEND, ::Trace.default_endpoint))
98
+ annotate(env, status, headers, body)
74
99
  ::Trace.pop
75
100
  end
76
101
  end
102
+
103
+ private
104
+ def get_or_create_trace_id(env, whitelisted, default_flags = ::Trace::Flags::EMPTY)
105
+ trace_parameters = if B3_REQUIRED_HEADERS.all? { |key| env.has_key?(key) }
106
+ env.values_at(*B3_REQUIRED_HEADERS)
107
+ else
108
+ new_id = Trace.generate_id
109
+ [new_id, nil, new_id, ("true" if whitelisted || Trace.should_sample?)]
110
+ end
111
+ trace_parameters[3] = (trace_parameters[3] == "true")
112
+
113
+ trace_parameters += env.values_at(*B3_OPT_HEADERS) # always check flags
114
+ trace_parameters[4] = (trace_parameters[4] || default_flags).to_i
115
+
116
+ Trace::TraceId.new(*trace_parameters)
117
+ end
77
118
  end
78
119
 
79
120
  end
metadata CHANGED
@@ -1,101 +1,130 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: zipkin-tracer
3
- version: !ruby/object:Gem::Version
4
- hash: 29
5
- prerelease:
6
- segments:
7
- - 0
8
- - 0
9
- - 1
10
- version: 0.0.1
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.0
11
5
  platform: ruby
12
- authors:
6
+ authors:
13
7
  - Franklin Hu
14
8
  autorequire:
15
9
  bindir: bin
16
10
  cert_chain: []
17
-
18
- date: 2012-06-12 00:00:00 Z
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
11
+ date: 2015-07-05 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
21
14
  name: finagle-thrift
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
24
- none: false
25
- requirements:
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
26
17
  - - ~>
27
- - !ruby/object:Gem::Version
28
- hash: 31
29
- segments:
30
- - 1
31
- - 2
32
- - 0
33
- version: 1.2.0
18
+ - !ruby/object:Gem::Version
19
+ version: 1.3.0
34
20
  type: :runtime
35
- version_requirements: *id001
36
- - !ruby/object:Gem::Dependency
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: 1.3.0
27
+ - !ruby/object:Gem::Dependency
37
28
  name: scribe
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: 0.2.4
34
+ type: :runtime
38
35
  prerelease: false
39
- requirement: &id002 !ruby/object:Gem::Requirement
40
- none: false
41
- requirements:
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
42
38
  - - ~>
43
- - !ruby/object:Gem::Version
44
- hash: 31
45
- segments:
46
- - 0
47
- - 2
48
- - 4
39
+ - !ruby/object:Gem::Version
49
40
  version: 0.2.4
41
+ - !ruby/object:Gem::Dependency
42
+ name: rack
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ! '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
50
48
  type: :runtime
51
- version_requirements: *id002
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: 3.0.0
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ version: 3.0.0
69
+ - !ruby/object:Gem::Dependency
70
+ name: rack-test
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ! '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ! '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: thin
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ! '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ! '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
52
97
  description: Adds tracing instrumentation for ruby applications
53
- email:
98
+ email:
54
99
  - franklin@twitter.com
55
100
  executables: []
56
-
57
101
  extensions: []
58
-
59
102
  extra_rdoc_files: []
60
-
61
- files:
103
+ files:
62
104
  - lib/zipkin-tracer/careless_scribe.rb
63
105
  - lib/zipkin-tracer/version.rb
64
106
  - lib/zipkin-tracer.rb
65
107
  homepage: https://github.com/twitter/zipkin
66
108
  licenses: []
67
-
109
+ metadata: {}
68
110
  post_install_message:
69
111
  rdoc_options: []
70
-
71
- require_paths:
112
+ require_paths:
72
113
  - lib
73
- required_ruby_version: !ruby/object:Gem::Requirement
74
- none: false
75
- requirements:
76
- - - ">="
77
- - !ruby/object:Gem::Version
78
- hash: 3
79
- segments:
80
- - 0
81
- version: "0"
82
- required_rubygems_version: !ruby/object:Gem::Requirement
83
- none: false
84
- requirements:
85
- - - ">="
86
- - !ruby/object:Gem::Version
87
- hash: 17
88
- segments:
89
- - 1
90
- - 3
91
- - 5
114
+ required_ruby_version: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - ! '>='
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
119
+ required_rubygems_version: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - ! '>='
122
+ - !ruby/object:Gem::Version
92
123
  version: 1.3.5
93
124
  requirements: []
94
-
95
125
  rubyforge_project:
96
- rubygems_version: 1.8.15
126
+ rubygems_version: 2.1.11
97
127
  signing_key:
98
- specification_version: 3
128
+ specification_version: 4
99
129
  summary: Ruby tracing via Zipkin
100
130
  test_files: []
101
-