zipkin-tracer 0.14.1 → 0.15.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.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- ZjE3ZmE0ZGY1MGU1MDM0MjQ5Y2M2NTdjYjQ4ZTE3ODkzODNhN2IzMQ==
4
+ YmU1ZjgyYTNmNWYzZDQ3N2VjMTFiMGYwZDA1ZmRkZWY5NWE1YTc3Ng==
5
5
  data.tar.gz: !binary |-
6
- ZGQwMzJlOTQwYWU3ZjQ0Nzk0MjA1MWMzZGYzZGMxOTVlMjNlNmU1Zg==
6
+ ZTNhNDM3NTU0ZTAzMTgxZGFhN2I3NmIzODYyZThkYTFmNGEzMmE4Nw==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- YmQ4NjI1ODIzYzYwYmI5ZjdlNjNkNTQ3NDE5MDRkMzBmOWVlMDM3ZGRhMzJi
10
- YjMzYTI4ZDQxOWMyMDg3NWZmYTA5OTBkZjlmNWQ5M2JlNDZkN2IwMDBhMzk5
11
- MjkwOGU1YzE4MzZjMzUyMDE1MDAwZDhiYjY0MTk3ZGFmOWQzOTE=
9
+ OTFmOTc1NDAxZGM3NWE0MDUxNWVmZjVmNzlkZDY2N2FlMTU0ZWIwOGZkMzFl
10
+ NzJiODJiNGNkMWFkNDJjN2YzZDJkODUyZTA0MDQ1MDYxNjdjMDA4MTFhZWNl
11
+ NjgxYjRiYjc3YzZkODRlZDJiNThkZTFlODE3MTIxMWFmOGY1NGQ=
12
12
  data.tar.gz: !binary |-
13
- MTNiYmY4ZGRhNGVjNzA3MDkzNGE3OTBiZTJmZDhjOWRmN2FlYzM1N2RkZGZl
14
- ZmI1MjBiNGQ0ZWExYmVlODllZTg2NzIyZGE2YjU3MDlhOTIwNGQwZTg2NGE3
15
- ZDJlN2JkZGNmNDk5OTI1NjhkYTBiM2U3NzhjM2YxZDE0YTJlZjc=
13
+ OGI0NjFkODBiMzRhZDBmMTc2M2ViYzBmOWFkMGEyNmE1YTU4MTU2MDA2MGU0
14
+ Njc4NjRmMDNjMTBhNGMwZWRiMmI2NmIxNzcwMjAxMGU3YWYzNGZjYmFiOTZi
15
+ ZDQzYjRkMjQ3ZTU3Nzc0OGVmNzUxY2ViZTIyZDE3NGRjYTRhYmU=
@@ -0,0 +1,63 @@
1
+ module ZipkinTracer
2
+ # Resolves hostnames in the endpoints of the annotations.
3
+ # Resolving hostnames is a very expensive operation. We want to store them raw in the main thread
4
+ # and resolve them in a different thread where we do not affect execution times.
5
+ class HostnameResolver
6
+ def spans_with_ips(spans)
7
+ host_to_ip = hosts_to_ipv4(spans)
8
+
9
+ each_annotation(spans) do |annotation|
10
+ hostname = annotation.host.ipv4
11
+ if hostname.to_s =~ /\A[a-zA-Z]/ # hostnames start with letters, else we already have an IP
12
+ annotation.host.ipv4 = host_to_ip[hostname]
13
+ end
14
+ end
15
+ end
16
+
17
+ private
18
+ LOCALHOST = '127.0.0.1'.freeze
19
+ LOCALHOST_I32 = 0x7f000001.freeze
20
+ IP_FIELD = 3
21
+
22
+ def each_annotation(spans, &block)
23
+ spans.each do |span|
24
+ span.annotations.each do |annotation|
25
+ yield annotation
26
+ end
27
+ span.binary_annotations.each do |annotation|
28
+ yield annotation
29
+ end
30
+ end
31
+ end
32
+
33
+ # Annotations come in pairs like CS/CR, SS/SR.
34
+ # Each annnotation has a hostname so we, for sure, will have the same host multiple times.
35
+ # Using this to resolve only once per host
36
+ def hosts_to_ipv4(spans)
37
+ hosts = []
38
+ each_annotation(spans) do |annotation|
39
+ hosts.push(annotation.host)
40
+ end
41
+ hosts.uniq!
42
+ resolve(hosts)
43
+ end
44
+
45
+ def resolve(hosts)
46
+ hosts.inject({}) do |host_map, host|
47
+ hostname = host.ipv4 # This field has been temporarly used to store the hostname.
48
+ ip_format = host.ip_format
49
+ host_map[hostname] = host_to_ip(hostname, ip_format)
50
+ host_map
51
+ end
52
+ end
53
+
54
+ def host_to_ip(hostname, ip_format)
55
+ ipv4 = begin
56
+ ip_format == :string ? Socket.getaddrinfo(hostname, nil, :INET).first[IP_FIELD] : Trace::Endpoint.host_to_i32(hostname)
57
+ rescue
58
+ ip_format == :string ? LOCALHOST : LOCALHOST_I32
59
+ end
60
+ end
61
+ end
62
+
63
+ end
@@ -26,7 +26,6 @@ module ZipkinTracer
26
26
 
27
27
  def initialize(app, config = nil)
28
28
  @app = app
29
- @lock = Mutex.new
30
29
  @config = Config.new(app, config).freeze
31
30
  @tracer = TracerFactory.new.tracer(@config)
32
31
  end
@@ -52,32 +51,20 @@ module ZipkinTracer
52
51
  end
53
52
 
54
53
  def trace!(span, zipkin_env, &block)
55
- synchronize do
56
- #if called by a service, the caller already added the information
57
- trace_request_information(span, zipkin_env.env) unless zipkin_env.called_with_zipkin_headers?
58
- span.record(Trace::Annotation::SERVER_RECV)
59
- span.record('whitelisted') if zipkin_env.force_sample?
60
- end
54
+ #if called by a service, the caller already added the information
55
+ trace_request_information(span, zipkin_env.env) unless zipkin_env.called_with_zipkin_headers?
56
+ span.record(Trace::Annotation::SERVER_RECV)
57
+ span.record('whitelisted') if zipkin_env.force_sample?
61
58
  status, headers, body = yield
62
59
  ensure
63
- synchronize do
64
- annotate_plugin(zipkin_env.env, status, headers, body)
65
- span.record(Trace::Annotation::SERVER_SEND)
66
- end
60
+ annotate_plugin(zipkin_env.env, status, headers, body)
61
+ span.record(Trace::Annotation::SERVER_SEND)
67
62
  end
68
63
 
69
64
  def trace_request_information(span, env)
70
65
  span.record_tag(Trace::BinaryAnnotation::URI, env['PATH_INFO'])
71
66
  end
72
67
 
73
- def synchronize(&block)
74
- @lock.synchronize do
75
- yield
76
- end
77
- rescue => e
78
- @config.logger.error("Exception #{e.message} while sending Zipkin traces. #{e.backtrace}")
79
- end
80
-
81
68
  # Environment with Zipkin information in it
82
69
  class ZipkinEnv
83
70
  attr_reader :env
@@ -38,8 +38,8 @@ module Trace
38
38
  traceId: @span_id.trace_id.to_s,
39
39
  id: @span_id.span_id.to_s,
40
40
  parentId: @span_id.parent_id.nil? ? nil : @span_id.parent_id.to_s,
41
- annotations: @annotations.map!(&:to_h),
42
- binaryAnnotations: @binary_annotations.map!(&:to_h),
41
+ annotations: @annotations.map(&:to_h),
42
+ binaryAnnotations: @binary_annotations.map(&:to_h),
43
43
  timestamp: @timestamp,
44
44
  duration: @duration,
45
45
  debug: @debug
@@ -97,8 +97,6 @@ module Trace
97
97
 
98
98
  # This class is defined in finagle-thrift. We are adding extra methods here
99
99
  class Endpoint
100
- LOCALHOST = '127.0.0.1'.freeze
101
- LOCALHOST_I32 = 0x7f000001.freeze
102
100
  UNKNOWN_URL = 'unknown'.freeze
103
101
 
104
102
  # we cannot override the initializer to add an extra parameter so use a factory
@@ -124,13 +122,7 @@ module Trace
124
122
 
125
123
  private
126
124
  def self.make_endpoint(hostname, service_port, service_name, ip_format)
127
- ipv4 = begin
128
- ip_format == :string ? Socket.getaddrinfo(hostname, nil, :INET)[0][3] : host_to_i32(hostname)
129
- rescue
130
- ip_format == :string ? LOCALHOST : LOCALHOST_I32
131
- end
132
-
133
- ep = Endpoint.new(ipv4, service_port, service_name)
125
+ ep = Endpoint.new(hostname, service_port, service_name)
134
126
  ep.ip_format = ip_format
135
127
  ep
136
128
  end
@@ -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.14.1"
15
+ VERSION = '0.15.0'.freeze
16
16
  end
@@ -1,16 +1,18 @@
1
1
  require 'json'
2
2
  require 'sucker_punch'
3
3
  require 'zipkin-tracer/zipkin_tracer_base'
4
+ require 'zipkin-tracer/hostname_resolver'
4
5
 
5
6
  class AsyncJsonApiClient
6
7
  include SuckerPunch::Job
7
8
  SPANS_PATH = '/api/v1/spans'
8
9
 
9
10
  def perform(json_api_host, spans)
11
+ spans_with_ips = ::ZipkinTracer::HostnameResolver.new.spans_with_ips(spans).map(&:to_h)
10
12
  resp = Faraday.new(json_api_host).post do |req|
11
13
  req.url SPANS_PATH
12
14
  req.headers['Content-Type'] = 'application/json'
13
- req.body = JSON.generate(spans.map!(&:to_h))
15
+ req.body = JSON.generate(spans_with_ips)
14
16
  end
15
17
  rescue => e
16
18
  SuckerPunch.logger.error(e)
@@ -1,6 +1,7 @@
1
1
  require 'hermann/producer'
2
2
  require 'hermann/discovery/zookeeper'
3
3
  require 'zipkin-tracer/zipkin_tracer_base'
4
+ require 'zipkin-tracer/hostname_resolver'
4
5
 
5
6
  module Trace
6
7
  # This class sends information to Zipkin through Kafka.
@@ -16,7 +17,8 @@ module Trace
16
17
  end
17
18
 
18
19
  def flush!
19
- spans.each do |span|
20
+ resolved_spans = ::ZipkinTracer::HostnameResolver.new.spans_with_ips(spans)
21
+ resolved_spans.each do |span|
20
22
  buf = ''
21
23
  trans = Thrift::MemoryBufferTransport.new(buf)
22
24
  oprot = Thrift::BinaryProtocol.new(trans)
@@ -1,4 +1,5 @@
1
1
  require 'zipkin-tracer/zipkin_tracer_base'
2
+ require 'zipkin-tracer/hostname_resolver'
2
3
 
3
4
  module Trace
4
5
  class ZipkinLoggerTracer < ZipkinTracerBase
@@ -9,7 +10,8 @@ module Trace
9
10
  end
10
11
 
11
12
  def flush!
12
- @logger.info("ZIPKIN SPANS: #{spans.map(&:to_h)}")
13
+ formatted_spans = ::ZipkinTracer::HostnameResolver.new.spans_with_ips(spans).map(&:to_h)
14
+ @logger.info "ZIPKIN SPANS: #{formatted_spans}"
13
15
  end
14
16
  end
15
17
  end
@@ -1,5 +1,7 @@
1
1
  require 'zipkin-tracer/zipkin_tracer_base'
2
2
  require 'zipkin-tracer/careless_scribe'
3
+ require 'zipkin-tracer/hostname_resolver'
4
+
3
5
 
4
6
  module Trace
5
7
  class ScribeTracer < ZipkinTracerBase
@@ -11,8 +13,9 @@ module Trace
11
13
  end
12
14
 
13
15
  def flush!
16
+ resolved_spans = ::ZipkinTracer::HostnameResolver.new.spans_with_ips(spans)
14
17
  @scribe.batch do
15
- messages = spans.map do |span|
18
+ messages = resolved_spans.map do |span|
16
19
  buf = ''
17
20
  trans = Thrift::MemoryBufferTransport.new(buf)
18
21
  oprot = Thrift::BinaryProtocol.new(trans)
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.14.1
4
+ version: 0.15.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-02-12 00:00:00.000000000 Z
16
+ date: 2016-02-15 00:00:00.000000000 Z
17
17
  dependencies:
18
18
  - !ruby/object:Gem::Dependency
19
19
  name: faraday
@@ -63,14 +63,14 @@ dependencies:
63
63
  requirements:
64
64
  - - ~>
65
65
  - !ruby/object:Gem::Version
66
- version: '1.0'
66
+ version: '1.6'
67
67
  type: :runtime
68
68
  prerelease: false
69
69
  version_requirements: !ruby/object:Gem::Requirement
70
70
  requirements:
71
71
  - - ~>
72
72
  - !ruby/object:Gem::Version
73
- version: '1.0'
73
+ version: '1.6'
74
74
  - !ruby/object:Gem::Dependency
75
75
  name: rspec
76
76
  requirement: !ruby/object:Gem::Requirement
@@ -186,6 +186,7 @@ files:
186
186
  - lib/zipkin-tracer/careless_scribe.rb
187
187
  - lib/zipkin-tracer/config.rb
188
188
  - lib/zipkin-tracer/faraday/zipkin-tracer.rb
189
+ - lib/zipkin-tracer/hostname_resolver.rb
189
190
  - lib/zipkin-tracer/rack/zipkin-tracer.rb
190
191
  - lib/zipkin-tracer/trace.rb
191
192
  - lib/zipkin-tracer/trace_client.rb