zipkin-tracer 0.27.2.1 → 0.28.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7b9286e346ac3ab6cb9cded254eeb3df0117241e4c07d252f3e5c9b15f7067c2
4
- data.tar.gz: aa0102da08828fb648582fe55b907630a6d73631480d816dd59ea475fd31ffd6
3
+ metadata.gz: 1fd814c00e7d43bd9fbd4678181407182904b369759f480c4334060f0de76a7b
4
+ data.tar.gz: 207b8aba87d59166639646babb7c86d174a9880bca955e0e4a3e7d67ed40f49c
5
5
  SHA512:
6
- metadata.gz: ffc2fdfa24cf887da6e588490f4b9329bf971f10d61923f36b89a12942c602147b8700beec988a94882767c27764116f5c6eb5584bf03777c4d4c938ff282828
7
- data.tar.gz: bfc03ce3b379fa40e8da2a30029f3780a6681306848f6e11a468c24d2eb03f443bd4694dc8a1bccbf11a1ac6e7e355637b6b492ead9b54a3f5d022deebb2f6bd
6
+ metadata.gz: bd5ff092a5b46f170a6978cdf5e88c2239e35abafb7b7c8d00a29cf9eaa007549dc18a15eb4e3172ec3152e4a2a12d589173e42f7d7fc405384defd8505ea6b2
7
+ data.tar.gz: f9fece44e302cac6ede9a0023b5ab68683bef98cd300bc978998d403d9a8f528068c4f184fb3e69dcb4fae1c22bf5f47f26b7e6749bf2bba09a3c47df1445300
@@ -9,7 +9,7 @@ module ZipkinTracer
9
9
  :zookeeper, :sample_rate, :logger, :log_tracing,
10
10
  :annotate_plugin, :filter_plugin, :whitelist_plugin,
11
11
  :sampled_as_boolean, :record_on_server_receive,
12
- :kafka_producer, :kafka_topic
12
+ :kafka_producer, :kafka_topic, :trace_id_128bit
13
13
 
14
14
  def initialize(app, config_hash)
15
15
  config = config_hash || Application.config(app)
@@ -46,7 +46,14 @@ module ZipkinTracer
46
46
  # Record the given tags on server receive, even if the zipkin headers were present in the incoming request?
47
47
  @record_on_server_receive = parse_tags(config[:record_on_server_receive])
48
48
 
49
+ # When set to true, high 8-bytes will be prepended to trace_id.
50
+ # The upper 4-bytes are epoch seconds and the lower 4-bytes are random.
51
+ # This makes it convertible to Amazon X-Ray trace ID format v1.
52
+ # (See http://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-request-tracing.html)
53
+ @trace_id_128bit = config[:trace_id_128bit].nil? ? DEFAULTS[:trace_id_128bit] : config[:trace_id_128bit]
54
+
49
55
  Trace.sample_rate = @sample_rate
56
+ Trace.trace_id_128bit = @trace_id_128bit
50
57
  end
51
58
 
52
59
  def adapter
@@ -68,7 +75,8 @@ module ZipkinTracer
68
75
  DEFAULTS = {
69
76
  sample_rate: 0.1,
70
77
  service_port: 80,
71
- sampled_as_boolean: true
78
+ sampled_as_boolean: true,
79
+ trace_id_128bit: false
72
80
  }
73
81
 
74
82
  def parse_tags(tag_names)
@@ -34,7 +34,8 @@ module ZipkinTracer
34
34
  trace_id, span_id = @env.values_at(*B3_REQUIRED_HEADERS)
35
35
  parent_span_id = @env['HTTP_X_B3_PARENTSPANID']
36
36
  else
37
- trace_id = span_id = Trace.generate_id
37
+ span_id = Trace.generate_id
38
+ trace_id = TraceGenerator.new.generate_id_from_span_id(span_id)
38
39
  parent_span_id = nil
39
40
  end
40
41
  [trace_id, span_id, parent_span_id]
@@ -3,6 +3,7 @@ require 'zipkin-tracer/zipkin_tracer_base'
3
3
  # Module with a mix of functions and overwrites from the finagle implementation:
4
4
  # https://github.com/twitter/finagle/blob/finagle-6.39.0/finagle-thrift/src/main/ruby/lib/finagle-thrift/trace.rb
5
5
  module Trace
6
+ attr_accessor :trace_id_128bit
6
7
 
7
8
  # We need this to access the tracer from the Faraday middleware.
8
9
  def self.tracer
@@ -19,7 +20,7 @@ module Trace
19
20
  attr_reader :trace_id, :parent_id, :span_id, :sampled, :flags
20
21
 
21
22
  def initialize(trace_id, parent_id, span_id, sampled, flags)
22
- @trace_id = SpanId.from_value(trace_id)
23
+ @trace_id = Trace.trace_id_128bit ? TraceId128Bit.from_value(trace_id) : SpanId.from_value(trace_id)
23
24
  @parent_id = parent_id.nil? ? nil : SpanId.from_value(parent_id)
24
25
  @span_id = SpanId.from_value(span_id)
25
26
  @sampled = sampled
@@ -44,6 +45,39 @@ module Trace
44
45
  end
45
46
  end
46
47
 
48
+ # This class is the 128-bit version of the SpanId class:
49
+ # https://github.com/twitter/finagle/blob/finagle-6.39.0/finagle-thrift/src/main/ruby/lib/finagle-thrift/trace.rb#L102
50
+ class TraceId128Bit < SpanId
51
+ HEX_REGEX_16 = /^[a-f0-9]{16}$/i
52
+ HEX_REGEX_32 = /^[a-f0-9]{32}$/i
53
+ MAX_SIGNED_I128 = (2 ** 128 / 2) -1
54
+ MASK = (2 ** 128) - 1
55
+
56
+ def self.from_value(v)
57
+ if v.is_a?(String) && v =~ HEX_REGEX_16
58
+ SpanId.new(v.hex)
59
+ elsif v.is_a?(String) && v =~ HEX_REGEX_32
60
+ new(v.hex)
61
+ elsif v.is_a?(Numeric)
62
+ new(v)
63
+ elsif v.is_a?(SpanId)
64
+ v
65
+ end
66
+ end
67
+
68
+ def initialize(value)
69
+ @value = value
70
+ @i128 = if @value > MAX_SIGNED_I128
71
+ -1 * ((@value ^ MASK) + 1)
72
+ else
73
+ @value
74
+ end
75
+ end
76
+
77
+ def to_s; '%032x' % @value; end
78
+ def to_i; @i128; end
79
+ end
80
+
47
81
  # A span may contain many annotations
48
82
  # This class is defined in finagle-thrift. We are adding extra methods here
49
83
  class Span
@@ -12,20 +12,38 @@ module ZipkinTracer
12
12
 
13
13
  def generate_trace_id
14
14
  span_id = generate_id
15
- Trace::TraceId.new(span_id, nil, span_id, should_sample?.to_s, Trace::Flags::EMPTY)
15
+ Trace::TraceId.new(generate_id_from_span_id(span_id), nil, span_id, should_sample?.to_s, Trace::Flags::EMPTY)
16
16
  end
17
17
 
18
18
  def should_sample?
19
19
  rand < (Trace.sample_rate || DEFAULT_SAMPLE_RATE)
20
20
  end
21
21
 
22
+ def generate_id_from_span_id(span_id)
23
+ Trace.trace_id_128bit ? generate_id_128bit(span_id) : span_id
24
+ end
25
+
22
26
  private
23
27
 
24
28
  def generate_id
25
29
  rand(TRACE_ID_UPPER_BOUND)
26
30
  end
27
31
 
32
+ def generate_id_128bit(span_id)
33
+ trace_id_low_64bit = '%016x' % span_id
34
+ "#{trace_id_epoch_seconds}#{trace_id_high_32bit}#{trace_id_low_64bit}".hex
35
+ end
36
+
37
+ def trace_id_epoch_seconds
38
+ '%08x' % Time.now.to_i
39
+ end
40
+
41
+ def trace_id_high_32bit
42
+ '%08x' % rand(TRACE_ID_HIGH_32BIT_UPPER_BOUND)
43
+ end
44
+
28
45
  TRACE_ID_UPPER_BOUND = 2**64
46
+ TRACE_ID_HIGH_32BIT_UPPER_BOUND = 2**32
29
47
  DEFAULT_SAMPLE_RATE = 0.001
30
48
  end
31
49
  end
@@ -1,3 +1,3 @@
1
1
  module ZipkinTracer
2
- VERSION = '0.27.2.1'.freeze
2
+ VERSION = '0.28.0'.freeze
3
3
  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.27.2.1
4
+ version: 0.28.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: 2018-02-13 00:00:00.000000000 Z
16
+ date: 2018-05-15 00:00:00.000000000 Z
17
17
  dependencies:
18
18
  - !ruby/object:Gem::Dependency
19
19
  name: faraday
@@ -207,7 +207,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
207
207
  version: 1.3.5
208
208
  requirements: []
209
209
  rubyforge_project:
210
- rubygems_version: 2.7.5
210
+ rubygems_version: 2.7.6
211
211
  signing_key:
212
212
  specification_version: 4
213
213
  summary: Ruby tracing via Zipkin