File: injectors.rb

package info (click to toggle)
ruby-jaeger-client 1.3.0-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 624 kB
  • sloc: ruby: 3,381; makefile: 6; sh: 4
file content (83 lines) | stat: -rw-r--r-- 2,625 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# frozen_string_literal: true

module Jaeger
  module Injectors
    def self.context_as_jaeger_string(span_context)
      [
        span_context.trace_id.to_s(16),
        span_context.span_id.to_s(16),
        span_context.parent_id.to_s(16),
        span_context.flags.to_s(16)
      ].join(':')
    end

    class JaegerTextMapCodec
      def self.inject(span_context, carrier)
        carrier['uber-trace-id'] = Injectors.context_as_jaeger_string(span_context)
        span_context.baggage.each do |key, value|
          carrier["uberctx-#{key}"] = value
        end
      end
    end

    class JaegerRackCodec
      def self.inject(span_context, carrier)
        carrier['uber-trace-id'] =
          CGI.escape(Injectors.context_as_jaeger_string(span_context))
        span_context.baggage.each do |key, value|
          carrier["uberctx-#{key}"] = CGI.escape(value)
        end
      end
    end

    class JaegerBinaryCodec
      def self.inject(_span_context, _carrier)
        warn 'Jaeger::Client with binary format is not supported yet'
      end
    end

    class B3RackCodec
      def self.inject(span_context, carrier)
        carrier['x-b3-traceid'] = TraceId.to_hex(span_context.trace_id)
        carrier['x-b3-spanid'] = TraceId.to_hex(span_context.span_id)
        carrier['x-b3-parentspanid'] = TraceId.to_hex(span_context.parent_id)

        # flags (for debug) and sampled headers are mutually exclusive
        if span_context.flags == Jaeger::SpanContext::Flags::DEBUG
          carrier['x-b3-flags'] = '1'
        else
          carrier['x-b3-sampled'] = span_context.flags.to_s(16)
        end
      end
    end

    class TraceContextRackCodec
      def self.inject(span_context, carrier)
        flags = span_context.sampled? || span_context.debug? ? 1 : 0

        carrier['traceparent'] = format(
          '%<version>s-%<trace_id>s-%<span_id>s-%<flags>s',
          version: '00',
          trace_id: span_context.trace_id.to_s(16).rjust(32, '0'),
          span_id: span_context.span_id.to_s(16).rjust(16, '0'),
          flags: flags.to_s(16).rjust(2, '0')
        )
      end
    end

    DEFAULT_INJECTORS = {
      OpenTracing::FORMAT_TEXT_MAP => JaegerTextMapCodec,
      OpenTracing::FORMAT_BINARY => JaegerBinaryCodec,
      OpenTracing::FORMAT_RACK => JaegerRackCodec
    }.freeze

    def self.prepare(injectors)
      DEFAULT_INJECTORS.reduce(injectors) do |acc, (format, default)|
        provided_injectors = Array(injectors[format])
        provided_injectors += [default] if provided_injectors.empty?

        acc.merge(format => provided_injectors)
      end
    end
  end
end