zipkin-tracer 0.27.2.1 → 0.28.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,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