class ZipkinTracer::ZipkinEnv

This class manages the Zipkin related information in the Rack environment. It is only used by the rack middleware.

Constants

B3_OPT_HEADERS
B3_REQUIRED_HEADERS
B3_SINGLE_HEADER

Attributes

env[R]

Public Class Methods

new(env, config) click to toggle source
# File lib/zipkin-tracer/rack/zipkin_env.rb, line 7
def initialize(env, config)
  @env    = env
  @config = config
end

Public Instance Methods

called_with_zipkin_b3_single_header?() click to toggle source
# File lib/zipkin-tracer/rack/zipkin_env.rb, line 19
def called_with_zipkin_b3_single_header?
  @called_with_zipkin_b3_single_header ||= @env.key?(B3_SINGLE_HEADER)
end
called_with_zipkin_headers?() click to toggle source
# File lib/zipkin-tracer/rack/zipkin_env.rb, line 23
def called_with_zipkin_headers?
  @called_with_zipkin_headers ||= B3_REQUIRED_HEADERS.all? { |key| @env.key?(key) }
end
trace_id(default_flags = Trace::Flags::EMPTY) click to toggle source
# File lib/zipkin-tracer/rack/zipkin_env.rb, line 12
def trace_id(default_flags = Trace::Flags::EMPTY)
  trace_id, span_id, parent_span_id, sampled, flags, shared = retrieve_or_generate_ids
  sampled = sampled_header_value(sampled)
  flags = (flags || default_flags).to_i
  Trace::TraceId.new(trace_id, parent_span_id, span_id, sampled, flags, shared)
end

Private Instance Methods

current_trace_sampled?() click to toggle source
# File lib/zipkin-tracer/rack/zipkin_env.rb, line 66
def current_trace_sampled?
  rand < @config.sample_rate
end
filtered?() click to toggle source
# File lib/zipkin-tracer/rack/zipkin_env.rb, line 82
def filtered?
  @config.filter_plugin && !@config.filter_plugin.call(@env)
end
force_sample?() click to toggle source
# File lib/zipkin-tracer/rack/zipkin_env.rb, line 78
def force_sample?
  @config.whitelist_plugin && @config.whitelist_plugin.call(@env)
end
new_sampled_header_value(sampled) click to toggle source
# File lib/zipkin-tracer/rack/zipkin_env.rb, line 53
def new_sampled_header_value(sampled)
  case [@config.sampled_as_boolean, sampled]
  when [true, true]
    'true'
  when [true, false]
    'false'
  when [false, true]
    '1'
  when [false, false]
    '0'
  end
end
retrieve_or_generate_ids() click to toggle source
# File lib/zipkin-tracer/rack/zipkin_env.rb, line 33
def retrieve_or_generate_ids
  if called_with_zipkin_b3_single_header?
    trace_id, span_id, parent_span_id, sampled, flags =
      B3SingleHeaderFormat.parse_from_header(@env[B3_SINGLE_HEADER])
    shared = true
  elsif called_with_zipkin_headers?
    trace_id, span_id, parent_span_id, sampled, flags = @env.values_at(*B3_REQUIRED_HEADERS, *B3_OPT_HEADERS)
    shared = true
  end

  unless trace_id
    span_id = TraceGenerator.new.generate_id
    trace_id = TraceGenerator.new.generate_id_from_span_id(span_id)
    parent_span_id = nil
    shared = false
  end

  [trace_id, span_id, parent_span_id, sampled, flags, shared]
end
sampled_header_value(parent_trace_sampled) click to toggle source
# File lib/zipkin-tracer/rack/zipkin_env.rb, line 70
def sampled_header_value(parent_trace_sampled)
  if parent_trace_sampled # A service upstream decided this goes in all the way
    parent_trace_sampled
  else
    new_sampled_header_value(force_sample? || current_trace_sampled? && !filtered? && traceable_request?)
  end
end
traceable_request?() click to toggle source
# File lib/zipkin-tracer/rack/zipkin_env.rb, line 86
def traceable_request?
  return true unless @config.check_routes

  Application.routable_request?(@env)
end