zipkin-tracer 0.40.1 → 0.41.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: 6fb27433f11b9d5dfc9cc09817d1305d95b2445ab2f38b2e214e3ada541f8fed
4
- data.tar.gz: '09d6e7cf7a2c34116e6d583c8143dbad1026638947167d8274ad8f4094c2368d'
3
+ metadata.gz: fe7fb284e2e5c8aef9203ab72d41403481835e5def3b07d847e80d21ed88a653
4
+ data.tar.gz: d4e8dedf195a458910af20a913f9c29256df653056cd848e6a00140be212a5ba
5
5
  SHA512:
6
- metadata.gz: a6d424dd4b62b267c21aa57bf3ea245f3fab6e006128da2de8d32a013587aa0691240451c908263e81c7de50dd382f068376faa35c2b8ca84b15176cd27db35a
7
- data.tar.gz: 7ecaf86d01df64132cd59aa58b22010a88a687d6f7813fd252b5c5369b8b914da54f2e97aabb8f5011e8ce44bb797aa0fae8d051ca20e3c16ff48720390e2946
6
+ metadata.gz: a8212bd6eec326a0066b5a9074a0567efd92f7ad5bbad9f88a5d7ecc0d5a607f25aaa96f9fba829fdc574c5fefb9e726763fd4a838f8551d35e744620c07e50a
7
+ data.tar.gz: b7f334ab931fdc97d379ed46d199d54860dfbaf7413afa5ade8c99a9c048552338f6d3655849e6855783b54d08ef6231804368271fd79672d63e654c88371ee5
@@ -1,3 +1,10 @@
1
+ # 0.41.0
2
+ * Add support for writing B3 single header.
3
+ * Omit ParentSpanId header for root spans.
4
+
5
+ # 0.40.1
6
+ * Fix to pass `async` option to the HTTP sender.
7
+
1
8
  # 0.40.0
2
9
  * Add support for reading B3 single header.
3
10
 
data/README.md CHANGED
@@ -24,6 +24,7 @@ use ZipkinTracer::RackHandler, config
24
24
  * `:trace_id_128bit` - When set to true, high 8-bytes will be prepended to trace_id. The upper 4-bytes are epoch seconds and the lower 4-bytes are random. This makes it convertible to Amazon X-Ray trace ID format v1. (See http://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-request-tracing.html)
25
25
  * `:async` - By default senders will flush traces asynchronously. Set to `false` to make that process synchronous. Only supported by the HTTP, RabbitMQ, and SQS senders.
26
26
  * `:logger` - The default logger for Rails apps is `Rails.logger`, else it is `STDOUT`. Use this option to pass a custom logger.
27
+ * `:write_b3_single_format` - When set to true, only writes a single b3 header for outbound propagation.
27
28
 
28
29
  #### Sender specific
29
30
  * `:json_api_host` - Hostname with protocol of a zipkin api instance (e.g. `https://zipkin.example.com`) to use the HTTP sender
@@ -6,6 +6,7 @@ require 'zipkin-tracer/trace_container'
6
6
  require 'zipkin-tracer/trace_generator'
7
7
  require 'zipkin-tracer/trace_wrapper'
8
8
  require 'zipkin-tracer/zipkin_b3_single_header_format'
9
+ require 'zipkin-tracer/zipkin_b3_header_helper'
9
10
 
10
11
  begin
11
12
  require 'faraday'
@@ -8,7 +8,7 @@ module ZipkinTracer
8
8
  attr_reader :service_name, :sample_rate, :sampled_as_boolean, :trace_id_128bit, :async, :logger,
9
9
  :json_api_host, :zookeeper, :kafka_producer, :kafka_topic, :sqs_queue_name, :sqs_region, :log_tracing,
10
10
  :annotate_plugin, :filter_plugin, :whitelist_plugin, :rabbit_mq_connection, :rabbit_mq_exchange,
11
- :rabbit_mq_routing_key
11
+ :rabbit_mq_routing_key, :write_b3_single_format
12
12
 
13
13
  def initialize(app, config_hash)
14
14
  config = config_hash || Application.config(app)
@@ -53,9 +53,13 @@ module ZipkinTracer
53
53
  # This makes it convertible to Amazon X-Ray trace ID format v1.
54
54
  # (See http://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-request-tracing.html)
55
55
  @trace_id_128bit = config[:trace_id_128bit].nil? ? DEFAULTS[:trace_id_128bit] : config[:trace_id_128bit]
56
+ # When set to true, only writes a single b3 header for outbound propagation.
57
+ @write_b3_single_format =
58
+ config[:write_b3_single_format].nil? ? DEFAULTS[:write_b3_single_format] : config[:write_b3_single_format]
56
59
 
57
60
  Trace.sample_rate = @sample_rate
58
61
  Trace.trace_id_128bit = @trace_id_128bit
62
+ Trace.write_b3_single_format = @write_b3_single_format
59
63
 
60
64
  Trace.default_endpoint = Trace::Endpoint.local_endpoint(
61
65
  domain_service_name(@service_name)
@@ -91,7 +95,8 @@ module ZipkinTracer
91
95
  DEFAULTS = {
92
96
  sample_rate: 0.1,
93
97
  sampled_as_boolean: true,
94
- trace_id_128bit: false
98
+ trace_id_128bit: false,
99
+ write_b3_single_format: false
95
100
  }
96
101
 
97
102
  def present?(str)
@@ -3,6 +3,8 @@ require 'excon'
3
3
 
4
4
  module ZipkinTracer
5
5
  class ExconHandler < Excon::Middleware::Base
6
+ include B3HeaderHelper
7
+
6
8
  def initialize(_)
7
9
  super
8
10
  end
@@ -15,10 +17,7 @@ module ZipkinTracer
15
17
  trace_id = TraceGenerator.new.next_trace_id
16
18
 
17
19
  TraceContainer.with_trace_id(trace_id) do
18
- b3_headers.each do |method, header|
19
- datum[:headers][header] = trace_id.send(method).to_s
20
- end
21
-
20
+ set_b3_header(datum[:headers], trace_id)
22
21
  trace!(datum, trace_id) if Trace.tracer && trace_id.sampled?
23
22
  end
24
23
 
@@ -36,16 +35,6 @@ module ZipkinTracer
36
35
 
37
36
  private
38
37
 
39
- def b3_headers
40
- {
41
- trace_id: 'X-B3-TraceId',
42
- parent_id: 'X-B3-ParentSpanId',
43
- span_id: 'X-B3-SpanId',
44
- sampled: 'X-B3-Sampled',
45
- flags: 'X-B3-Flags'
46
- }
47
- end
48
-
49
38
  def remote_endpoint(url, service_name)
50
39
  Trace::Endpoint.remote_endpoint(url, service_name) # The endpoint we are calling.
51
40
  end
@@ -4,6 +4,8 @@ require 'uri'
4
4
  module ZipkinTracer
5
5
  # Faraday middleware. It will add CR/CS annotations to outgoing connections done by Faraday
6
6
  class FaradayHandler < ::Faraday::Middleware
7
+ include B3HeaderHelper
8
+
7
9
  def initialize(app, service_name = nil)
8
10
  @app = app
9
11
  @service_name = service_name
@@ -12,9 +14,7 @@ module ZipkinTracer
12
14
  def call(env)
13
15
  trace_id = TraceGenerator.new.next_trace_id
14
16
  TraceContainer.with_trace_id(trace_id) do
15
- b3_headers.each do |method, header|
16
- env[:request_headers][header] = trace_id.send(method).to_s
17
- end
17
+ set_b3_header(env[:request_headers], trace_id)
18
18
  if Trace.tracer && trace_id.sampled?
19
19
  trace!(env, trace_id)
20
20
  else
@@ -25,16 +25,6 @@ module ZipkinTracer
25
25
 
26
26
  private
27
27
 
28
- def b3_headers
29
- {
30
- trace_id: 'X-B3-TraceId',
31
- parent_id: 'X-B3-ParentSpanId',
32
- span_id: 'X-B3-SpanId',
33
- sampled: 'X-B3-Sampled',
34
- flags: 'X-B3-Flags'
35
- }
36
- end
37
-
38
28
  def trace!(env, trace_id)
39
29
  response = nil
40
30
  # handle either a URI object (passed by Faraday v0.8.x in testing), or something string-izable
@@ -8,7 +8,7 @@ module Trace
8
8
  # Most of these are set by the config class and then used around.
9
9
  # TODO: Move this out of the Trace module , take out that extend self and be happier
10
10
  extend self
11
- attr_accessor :trace_id_128bit
11
+ attr_accessor :trace_id_128bit, :write_b3_single_format
12
12
 
13
13
  # This method is deprecated, please use TraceGenerator.current
14
14
  # Note that this method will always return a trace, it will
@@ -1,3 +1,3 @@
1
1
  module ZipkinTracer
2
- VERSION = '0.40.1'.freeze
2
+ VERSION = '0.41.0'.freeze
3
3
  end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ZipkinTracer
4
+ module B3HeaderHelper
5
+ private
6
+
7
+ B3_SINGLE_HEADER = 'b3'
8
+
9
+ def set_b3_header(headers, trace_id)
10
+ if Trace.write_b3_single_format
11
+ headers[B3_SINGLE_HEADER] = B3SingleHeaderFormat.create_header(trace_id)
12
+ else
13
+ b3_headers.each do |method, header|
14
+ header_value = trace_id.send(method).to_s
15
+ headers[header] = header_value unless header_value.empty?
16
+ end
17
+ end
18
+ end
19
+
20
+ def b3_headers
21
+ {
22
+ trace_id: 'X-B3-TraceId',
23
+ parent_id: 'X-B3-ParentSpanId',
24
+ span_id: 'X-B3-SpanId',
25
+ sampled: 'X-B3-Sampled',
26
+ flags: 'X-B3-Flags'
27
+ }
28
+ end
29
+ end
30
+ end
@@ -5,6 +5,10 @@ module ZipkinTracer
5
5
  # b3: {x-b3-traceid}-{x-b3-spanid}-{if x-b3-flags 'd' else x-b3-sampled}-{x-b3-parentspanid}
6
6
  # For details, see: https://github.com/openzipkin/b3-propagation
7
7
  class B3SingleHeaderFormat
8
+ SAMPLED = '1'
9
+ NOT_SAMPLED = '0'
10
+ DEBUG = 'd'
11
+
8
12
  def self.parse_from_header(b3_single_header)
9
13
  if b3_single_header.size == 1
10
14
  flag = b3_single_header
@@ -16,13 +20,19 @@ module ZipkinTracer
16
20
 
17
21
  def self.parse_sampled(flag)
18
22
  case flag
19
- when '1', '0'
23
+ when SAMPLED, NOT_SAMPLED
20
24
  flag
21
25
  end
22
26
  end
23
27
 
24
28
  def self.parse_flags(flag)
25
- flag == 'd' ? Trace::Flags::DEBUG : Trace::Flags::EMPTY
29
+ flag == DEBUG ? Trace::Flags::DEBUG : Trace::Flags::EMPTY
30
+ end
31
+
32
+ def self.create_header(trace_id)
33
+ flag = trace_id.debug? ? DEBUG : (trace_id.sampled? ? SAMPLED : NOT_SAMPLED)
34
+ parent_id_with_hyphen = "-#{trace_id.parent_id}" unless trace_id.parent_id.nil?
35
+ "#{trace_id.trace_id}-#{trace_id.span_id}-#{flag}#{parent_id_with_hyphen}"
26
36
  end
27
37
  end
28
38
  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.40.1
4
+ version: 0.41.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Franklin Hu
@@ -225,6 +225,7 @@ files:
225
225
  - lib/zipkin-tracer/trace_wrapper.rb
226
226
  - lib/zipkin-tracer/tracer_factory.rb
227
227
  - lib/zipkin-tracer/version.rb
228
+ - lib/zipkin-tracer/zipkin_b3_header_helper.rb
228
229
  - lib/zipkin-tracer/zipkin_b3_single_header_format.rb
229
230
  - lib/zipkin-tracer/zipkin_http_sender.rb
230
231
  - lib/zipkin-tracer/zipkin_kafka_sender.rb