-
Notifications
You must be signed in to change notification settings - Fork 38
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add support for reading B3 single header #165
Changes from all commits
1bb0e99
8fa5590
f8d6a89
2fef91b
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,6 @@ | ||
# 0.40.0 | ||
* Add support for reading B3 single header. | ||
|
||
# 0.39.2 | ||
* Make Faraday 0.13 the minimum requirement. | ||
|
||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,3 @@ | ||
module ZipkinTracer | ||
VERSION = '0.39.2'.freeze | ||
VERSION = '0.40.0'.freeze | ||
end |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
# frozen_string_literal: true | ||
|
||
module ZipkinTracer | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. how about adding the magic comment about frozen strings? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Added in f8d6a89 |
||
# This format corresponds to the propagation key "b3" (or "B3"). | ||
# b3: {x-b3-traceid}-{x-b3-spanid}-{if x-b3-flags 'd' else x-b3-sampled}-{x-b3-parentspanid} | ||
# For details, see: https://github.com/openzipkin/b3-propagation | ||
class B3SingleHeaderFormat | ||
def self.parse_from_header(b3_single_header) | ||
if b3_single_header.size == 1 | ||
flag = b3_single_header | ||
else | ||
trace_id, span_id, flag, parent_span_id = b3_single_header.split('-') | ||
end | ||
[trace_id, span_id, parent_span_id, parse_sampled(flag), parse_flags(flag)] | ||
end | ||
|
||
def self.parse_sampled(flag) | ||
case flag | ||
when '1', '0' | ||
flag | ||
end | ||
end | ||
|
||
def self.parse_flags(flag) | ||
flag == 'd' ? Trace::Flags::DEBUG : Trace::Flags::EMPTY | ||
end | ||
end | ||
end |
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,73 @@ | ||||||||||||||||||||||||||||||||||||
require 'spec_helper' | ||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||
describe ZipkinTracer::B3SingleHeaderFormat do | ||||||||||||||||||||||||||||||||||||
let(:b3_single_header_format) { described_class.parse_from_header(b3_single_header) } | ||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||
context 'child span' do | ||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. add some malformed tests? Ex in brave we use "not-a-tumor" There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @adriancole In ruby client, we are doing malformed check in another class: zipkin-ruby/lib/zipkin-tracer/trace.rb Lines 134 to 150 in a1b1523
I think we don't need to have malformed tests here but what do you think? |
||||||||||||||||||||||||||||||||||||
let(:b3_single_header) { '80f198ee56343ba864fe8b2a57d3eff7-e457b5a2e4d86bd1-1-05e3ac9a4f6e3b90' } | ||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||
it 'has all fields' do | ||||||||||||||||||||||||||||||||||||
expect(b3_single_header_format.to_a).to eq( | ||||||||||||||||||||||||||||||||||||
['80f198ee56343ba864fe8b2a57d3eff7', 'e457b5a2e4d86bd1', '05e3ac9a4f6e3b90', '1', 0] | ||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||
end | ||||||||||||||||||||||||||||||||||||
end | ||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||
context 'sampled root span' do | ||||||||||||||||||||||||||||||||||||
let(:b3_single_header) { '80f198ee56343ba864fe8b2a57d3eff7-e457b5a2e4d86bd1-1' } | ||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||
it 'does not have parent_span_id' do | ||||||||||||||||||||||||||||||||||||
expect(b3_single_header_format.to_a).to eq(['80f198ee56343ba864fe8b2a57d3eff7', 'e457b5a2e4d86bd1', nil, '1', 0]) | ||||||||||||||||||||||||||||||||||||
end | ||||||||||||||||||||||||||||||||||||
end | ||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||
context 'not yet sampled root span' do | ||||||||||||||||||||||||||||||||||||
let(:b3_single_header) { '80f198ee56343ba864fe8b2a57d3eff7-e457b5a2e4d86bd1' } | ||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||
it 'does not have parent_span_id and sampled' do | ||||||||||||||||||||||||||||||||||||
expect(b3_single_header_format.to_a).to eq(['80f198ee56343ba864fe8b2a57d3eff7', 'e457b5a2e4d86bd1', nil, nil, 0]) | ||||||||||||||||||||||||||||||||||||
end | ||||||||||||||||||||||||||||||||||||
end | ||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||
context 'debug RPC child span' do | ||||||||||||||||||||||||||||||||||||
let(:b3_single_header) { '80f198ee56343ba864fe8b2a57d3eff7-e457b5a2e4d86bd1-d-05e3ac9a4f6e3b90' } | ||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||
it 'has debug flag' do | ||||||||||||||||||||||||||||||||||||
expect(b3_single_header_format.to_a).to eq( | ||||||||||||||||||||||||||||||||||||
['80f198ee56343ba864fe8b2a57d3eff7', 'e457b5a2e4d86bd1', '05e3ac9a4f6e3b90', nil, 1] | ||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||
end | ||||||||||||||||||||||||||||||||||||
end | ||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||
context 'do not sample flag only' do | ||||||||||||||||||||||||||||||||||||
let(:b3_single_header) { '0' } | ||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||
it 'has do not sample flag only' do | ||||||||||||||||||||||||||||||||||||
expect(b3_single_header_format.to_a).to eq([nil, nil, nil, '0', 0]) | ||||||||||||||||||||||||||||||||||||
end | ||||||||||||||||||||||||||||||||||||
end | ||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||
context 'sampled flag only' do | ||||||||||||||||||||||||||||||||||||
let(:b3_single_header) { '1' } | ||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||
it 'has sampled flag only' do | ||||||||||||||||||||||||||||||||||||
expect(b3_single_header_format.to_a).to eq([nil, nil, nil, '1', 0]) | ||||||||||||||||||||||||||||||||||||
end | ||||||||||||||||||||||||||||||||||||
end | ||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||
context 'debug flag only' do | ||||||||||||||||||||||||||||||||||||
let(:b3_single_header) { 'd' } | ||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||
it 'has debug flag only' do | ||||||||||||||||||||||||||||||||||||
expect(b3_single_header_format.to_a).to eq([nil, nil, nil, nil, 1]) | ||||||||||||||||||||||||||||||||||||
end | ||||||||||||||||||||||||||||||||||||
end | ||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||
context 'unknown flag only' do | ||||||||||||||||||||||||||||||||||||
let(:b3_single_header) { 'u' } | ||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||
it 'has nothing' do | ||||||||||||||||||||||||||||||||||||
expect(b3_single_header_format.to_a).to eq([nil, nil, nil, nil, 0]) | ||||||||||||||||||||||||||||||||||||
end | ||||||||||||||||||||||||||||||||||||
end | ||||||||||||||||||||||||||||||||||||
end |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
easier to quote, ain't it :)