zipkin-tracer 0.10.3 → 0.11.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- MmJiM2JiYjE0ZTJjZTJhOGZkNGExYjUwODMyZjlmMWI1NGYyMTA2ZQ==
4
+ MmU0MDJhYzQxZGM5ODVkZmI0NzliYzI3MGQ0MmRhYjUyNmRhNjE2MQ==
5
5
  data.tar.gz: !binary |-
6
- MTRhZjBkZjY0MDM1MGM4ZGJjYWQwZjZhMzUxOTdhMzVhYjYxODJiMQ==
6
+ YWQ3ZDNhMmY4YjhkMmUxZDgwOTY5NzIyZGU0NzJkYjNmNGFkZGM0Zg==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- YzEwYTYxYzE0N2QyOWIwNTE5YTFmZmU3MDc3YWY3YTJkMjc3OTc1OTg1ZGI3
10
- OWYzMDI0YzE4ZDc3ZWJlNTE4OWE0MTQzNmU2ZTIwZDk5YTllYzE0OGIzYTU4
11
- YjIxMWIyYmZjN2EwNTFhMWE1NTVmZDZlNzg1NjA0MzNmMmY4OWM=
9
+ NmRlMTEzYmEzYzM5YmQ4MzllNTViZDdjOWY0ZmU1YzMzYjYxZjZlZWM5MGFl
10
+ NWU3OGVmMDA1MGJiZTA0Y2I5M2M4ZTRiOGZkMTJiYWI2ZmU1NTY5NTM4MWU2
11
+ NWY3MWFjZDEzNzY0N2UwMmJkZDBiNWM4NTcxNjU5YzhiYzA0YmY=
12
12
  data.tar.gz: !binary |-
13
- NzQxYjI5YTBmMzM2NjcwNTc2MTU5NzFmYjJlNTI4MmJkMjZhNDk3ZTc4ZTgx
14
- ZjEyOGY1NjdjZDk3YWQ0NGRiMGQzYzUzOWJmNjBjNTYxMmU5YjBlZmYyNTc4
15
- MzkxMzdlYmU5MTY5MzEwYzA1OGYyODJmZTczZmNiMTBjZDBiNGY=
13
+ NmNjMzA2OWQzYmE5ZGVkNDNjOWM5ODkyZjYxZjZiN2FmMWM5MjljMTdjODdh
14
+ ZGQ4YjVlOWFmOWMzODgyMWEyNWZlNzdjODk4YjA5ODk0YTU0ZjM1NjBjNTRh
15
+ MzVjZmFmZmY2YmIzMDRhYjU1MWIxOGRlMTRhY2M1NzBjMTBlMzI=
@@ -49,16 +49,17 @@ module ZipkinTracer
49
49
  url = env[:url].respond_to?(:host) ? env[:url] : URI.parse(env[:url].to_s)
50
50
  local_endpoint = Trace.default_endpoint # The rack middleware set this up for us.
51
51
  remote_endpoint = callee_endpoint(url, local_endpoint.ip_format) # The endpoint we are calling.
52
- # annotate with method (GET/POST/etc.) and uri path
53
- @tracer.set_rpc_name(trace_id, env[:method].to_s.downcase)
54
- @tracer.record(trace_id, Trace::BinaryAnnotation.new(URI_KEY, url.path, STRING_TYPE, local_endpoint))
55
- @tracer.record(trace_id, Trace::BinaryAnnotation.new(SERVER_ADDRESS, SERVER_ADDRESS_SPECIAL_VALUE, BOOLEAN_TYPE, remote_endpoint))
56
- @tracer.record(trace_id, Trace::Annotation.new(Trace::Annotation::CLIENT_SEND, local_endpoint))
57
- response = @app.call(env).on_complete do |renv|
58
- # record HTTP status code on response
59
- @tracer.record(trace_id, Trace::BinaryAnnotation.new(STATUS_KEY, renv[:status].to_s, STRING_TYPE, local_endpoint))
52
+ @tracer.with_new_span(trace_id, env[:method].to_s.downcase) do |span|
53
+ # annotate with method (GET/POST/etc.) and uri path
54
+ span.record(Trace::BinaryAnnotation.new(URI_KEY, url.path, STRING_TYPE, local_endpoint))
55
+ span.record(Trace::BinaryAnnotation.new(SERVER_ADDRESS, SERVER_ADDRESS_SPECIAL_VALUE, BOOLEAN_TYPE, remote_endpoint))
56
+ span.record(Trace::Annotation.new(Trace::Annotation::CLIENT_SEND, local_endpoint))
57
+ response = @app.call(env).on_complete do |renv|
58
+ # record HTTP status code on response
59
+ span.record(Trace::BinaryAnnotation.new(STATUS_KEY, renv[:status].to_s, STRING_TYPE, local_endpoint))
60
+ end
61
+ span.record(Trace::Annotation.new(Trace::Annotation::CLIENT_RECV, local_endpoint))
60
62
  end
61
- @tracer.record(trace_id, Trace::Annotation.new(Trace::Annotation::CLIENT_RECV, local_endpoint))
62
63
  response
63
64
  end
64
65
 
@@ -38,7 +38,9 @@ module ZipkinTracer
38
38
  if !trace_id.sampled? || !routable_request?(env)
39
39
  @app.call(env)
40
40
  else
41
- trace!(trace_id, zipkin_env) { @app.call(env) }
41
+ @tracer.with_new_span(trace_id, zipkin_env.env['REQUEST_METHOD'].to_s.downcase) do |span|
42
+ trace!(span, zipkin_env) { @app.call(env) }
43
+ end
42
44
  end
43
45
  end
44
46
  end
@@ -52,10 +54,6 @@ module ZipkinTracer
52
54
  Trace.pop
53
55
  end
54
56
 
55
- def record(annotation)
56
- @tracer.record(@trace_id, annotation)
57
- end
58
-
59
57
  # If the request is not valid for this service, we do not what to trace it.
60
58
  def routable_request?(env)
61
59
  return true unless defined?(Rails) # If not running on a Rails app, we can't verify if it is invalid
@@ -69,24 +67,23 @@ module ZipkinTracer
69
67
  @config.annotate_plugin.call(env, status, response_headers, response_body) if @config.annotate_plugin
70
68
  end
71
69
 
72
- def trace!(trace_id, zipkin_env, &block)
70
+ def trace!(span, zipkin_env, &block)
73
71
  synchronize do
74
72
  #if called by a service, the caller already added the information
75
- trace_request_information(trace_id, zipkin_env.env) unless zipkin_env.called_with_zipkin_headers?
76
- @tracer.record(trace_id, Trace::Annotation.new(Trace::Annotation::SERVER_RECV, Trace.default_endpoint))
77
- @tracer.record(trace_id, Trace::Annotation.new('whitelisted', Trace.default_endpoint)) if zipkin_env.force_sample?
73
+ trace_request_information(span, zipkin_env.env) unless zipkin_env.called_with_zipkin_headers?
74
+ span.record(Trace::Annotation.new(Trace::Annotation::SERVER_RECV, Trace.default_endpoint))
75
+ span.record(Trace::Annotation.new('whitelisted', Trace.default_endpoint)) if zipkin_env.force_sample?
78
76
  end
79
77
  status, headers, body = yield
80
78
  ensure
81
79
  synchronize do
82
80
  annotate_plugin(zipkin_env.env, status, headers, body)
83
- @tracer.record(trace_id, Trace::Annotation.new(Trace::Annotation::SERVER_SEND, Trace.default_endpoint))
81
+ span.record(Trace::Annotation.new(Trace::Annotation::SERVER_SEND, Trace.default_endpoint))
84
82
  end
85
83
  end
86
84
 
87
- def trace_request_information(trace_id, env)
88
- @tracer.set_rpc_name(trace_id, env['REQUEST_METHOD'].to_s.downcase) # get/post and all that jazz
89
- @tracer.record(trace_id, Trace::BinaryAnnotation.new('http.uri', env['PATH_INFO'], 'STRING', Trace.default_endpoint))
85
+ def trace_request_information(span, env)
86
+ span.record(Trace::BinaryAnnotation.new('http.uri', env['PATH_INFO'], 'STRING', Trace.default_endpoint))
90
87
  end
91
88
 
92
89
  def synchronize(&block)
@@ -9,6 +9,20 @@ module Trace
9
9
  end
10
10
 
11
11
  class Span
12
+ attr_reader :size
13
+
14
+ # We record information into spans, then we send these spans to zipkin
15
+ def record(annotation)
16
+ @size ||= 0
17
+ case annotation
18
+ when BinaryAnnotation
19
+ binary_annotations << annotation
20
+ when Annotation
21
+ annotations << annotation
22
+ end
23
+ @size = @size + 1
24
+ end
25
+
12
26
  def to_h
13
27
  {
14
28
  name: @name,
@@ -1,4 +1,3 @@
1
-
2
1
  module ZipkinTracer
3
2
  class TracerFactory
4
3
  def tracer(config)
@@ -10,12 +9,13 @@ module ZipkinTracer
10
9
  options = { json_api_host: config.json_api_host, traces_buffer: config.traces_buffer, logger: config.logger }
11
10
  Trace::ZipkinJsonTracer.new(options)
12
11
  when :scribe
13
- require 'zipkin-tracer/careless_scribe'
14
- Trace::ZipkinTracer.new(CarelessScribe.new(config.scribe_server), config.scribe_max_buffer)
12
+ require 'zipkin-tracer/zipkin_scribe_tracer'
13
+ Trace::ScribeTracer.new(scribe_server: config.scribe_server, traces_buffer: config.scribe_max_buffer)
15
14
  when :kafka
16
15
  require 'zipkin-tracer/zipkin_kafka_tracer'
17
16
  Trace::ZipkinKafkaTracer.new(zookeepers: config.zookeeper)
18
17
  else
18
+ require 'zipkin-tracer/zipkin_null_tracer'
19
19
  Trace::NullTracer.new
20
20
  end
21
21
  Trace.tracer = tracer
@@ -12,5 +12,5 @@
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.10.3"
15
+ VERSION = "0.11.0"
16
16
  end
@@ -0,0 +1,11 @@
1
+ module Trace
2
+ # Monkey patching Nulltracer from thrift.
3
+ # All our tracers have a start_span method, adding it to
4
+ # the NullTracer also.
5
+ class NullTracer
6
+ def with_new_span(trace_id, name)
7
+ span = Span.new(name, trace_id)
8
+ yield span
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,27 @@
1
+ require 'zipkin-tracer/zipkin_tracer_base'
2
+ require 'zipkin-tracer/careless_scribe'
3
+
4
+ module Trace
5
+ class ScribeTracer < ZipkinTracerBase
6
+ TRACER_CATEGORY = "zipkin".freeze
7
+
8
+ def initialize(options)
9
+ @scribe = CarelessScribe.new(options[:scribe_server])
10
+ super(options)
11
+ end
12
+
13
+ def flush!
14
+ @scribe.batch do
15
+ messages = spans.values.map do |span|
16
+ buf = ''
17
+ trans = Thrift::MemoryBufferTransport.new(buf)
18
+ oprot = Thrift::BinaryProtocol.new(trans)
19
+ span.to_thrift.write(oprot)
20
+ Base64.encode64(buf).gsub("\n", "")
21
+ end
22
+ @scribe.log(messages, TRACER_CATEGORY)
23
+ end
24
+ reset
25
+ end
26
+ end
27
+ end
@@ -8,7 +8,6 @@ module Trace
8
8
  # Traces dealing with zipkin should inherit from this class and implement the
9
9
  # flush! method which actually sends the information
10
10
  class ZipkinTracerBase < Tracer
11
- TRACER_CATEGORY = "zipkin".freeze
12
11
 
13
12
  def initialize(options={})
14
13
  @options = options
@@ -16,27 +15,25 @@ module Trace
16
15
  reset
17
16
  end
18
17
 
19
- def record(id, annotation)
20
- span = get_span_for_id(id)
21
-
22
- case annotation
23
- when BinaryAnnotation
24
- span.binary_annotations << annotation
25
- when Annotation
26
- span.annotations << annotation
27
- end
28
- count = current_count
29
- set_current_count(count + 1)
18
+ def with_new_span(trace_id, name)
19
+ span = start_span(trace_id, name)
20
+ result = yield span
21
+ may_flush(span)
22
+ result
23
+ end
30
24
 
31
- if current_count >= @traces_buffer || (annotation.is_a?(Annotation) && annotation.value == Annotation::SERVER_SEND)
25
+ def may_flush(span)
26
+ size = spans.values.map(&:size).inject(:+) || 0
27
+ if size >= @traces_buffer || span.annotations.any?{ |ann| ann == Annotation::SERVER_SEND }
32
28
  flush!
33
29
  reset
34
30
  end
35
31
  end
36
32
 
37
- def set_rpc_name(id, name)
38
- span = get_span_for_id(id)
39
- span.name = name.to_s
33
+ def start_span(trace_id, name)
34
+ span = get_span_for_id(trace_id)
35
+ span.name = name
36
+ span
40
37
  end
41
38
 
42
39
  def flush!
@@ -49,14 +46,6 @@ module Trace
49
46
  Thread.current[:zipkin_spans] ||= {}
50
47
  end
51
48
 
52
- def current_count
53
- Thread.current[:zipkin_spans_count] ||= 0
54
- end
55
-
56
- def set_current_count(count)
57
- Thread.current[:zipkin_spans_count] = count
58
- end
59
-
60
49
  def get_span_for_id(id)
61
50
  key = id.span_id.to_s
62
51
  spans[key] ||= Span.new("", id)
@@ -64,7 +53,6 @@ module Trace
64
53
 
65
54
  def reset
66
55
  Thread.current[:zipkin_spans] = {}
67
- set_current_count(0)
68
56
  end
69
57
  end
70
58
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zipkin-tracer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.3
4
+ version: 0.11.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Franklin Hu
@@ -13,7 +13,7 @@ authors:
13
13
  autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
- date: 2016-01-14 00:00:00.000000000 Z
16
+ date: 2016-01-28 00:00:00.000000000 Z
17
17
  dependencies:
18
18
  - !ruby/object:Gem::Dependency
19
19
  name: faraday
@@ -191,6 +191,8 @@ files:
191
191
  - lib/zipkin-tracer/version.rb
192
192
  - lib/zipkin-tracer/zipkin_json_tracer.rb
193
193
  - lib/zipkin-tracer/zipkin_kafka_tracer.rb
194
+ - lib/zipkin-tracer/zipkin_null_tracer.rb
195
+ - lib/zipkin-tracer/zipkin_scribe_tracer.rb
194
196
  - lib/zipkin-tracer/zipkin_tracer_base.rb
195
197
  homepage: https://github.com/openzipkin/zipkin-tracer
196
198
  licenses: []