opentelemetry-api 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.yardopts +9 -0
- data/OVERVIEW.md +66 -0
- data/lib/{opentelemetry/distributed_context/manager.rb → opentelemetry-api.rb} +1 -6
- data/lib/opentelemetry.rb +34 -16
- data/lib/opentelemetry/context.rb +138 -15
- data/lib/opentelemetry/context/key.rb +29 -0
- data/lib/opentelemetry/context/propagation.rb +22 -0
- data/lib/opentelemetry/context/propagation/composite_propagator.rb +77 -0
- data/lib/opentelemetry/context/propagation/default_getter.rb +26 -0
- data/lib/opentelemetry/context/propagation/default_setter.rb +26 -0
- data/lib/opentelemetry/context/propagation/noop_extractor.rb +26 -0
- data/lib/opentelemetry/context/propagation/noop_injector.rb +26 -0
- data/lib/opentelemetry/context/propagation/propagation.rb +27 -0
- data/lib/opentelemetry/context/propagation/propagator.rb +64 -0
- data/lib/opentelemetry/correlation_context.rb +16 -0
- data/lib/opentelemetry/correlation_context/builder.rb +18 -0
- data/lib/opentelemetry/correlation_context/manager.rb +36 -0
- data/lib/opentelemetry/correlation_context/propagation.rb +57 -0
- data/lib/opentelemetry/correlation_context/propagation/context_keys.rb +27 -0
- data/lib/opentelemetry/correlation_context/propagation/text_extractor.rb +60 -0
- data/lib/opentelemetry/correlation_context/propagation/text_injector.rb +55 -0
- data/lib/opentelemetry/instrumentation.rb +15 -0
- data/lib/opentelemetry/instrumentation/adapter.rb +244 -0
- data/lib/opentelemetry/instrumentation/registry.rb +87 -0
- data/lib/opentelemetry/metrics.rb +1 -1
- data/lib/opentelemetry/metrics/handles.rb +5 -15
- data/lib/opentelemetry/metrics/instruments.rb +18 -69
- data/lib/opentelemetry/metrics/meter.rb +2 -39
- data/lib/opentelemetry/metrics/{meter_factory.rb → meter_provider.rb} +2 -2
- data/lib/opentelemetry/trace.rb +2 -2
- data/lib/opentelemetry/trace/event.rb +4 -3
- data/lib/opentelemetry/trace/link.rb +4 -3
- data/lib/opentelemetry/trace/propagation.rb +17 -0
- data/lib/opentelemetry/trace/propagation/context_keys.rb +35 -0
- data/lib/opentelemetry/trace/propagation/trace_context.rb +59 -0
- data/lib/opentelemetry/trace/propagation/trace_context/text_extractor.rb +58 -0
- data/lib/opentelemetry/trace/propagation/trace_context/text_injector.rb +55 -0
- data/lib/opentelemetry/trace/propagation/trace_context/trace_parent.rb +126 -0
- data/lib/opentelemetry/trace/span.rb +14 -6
- data/lib/opentelemetry/trace/status.rb +7 -2
- data/lib/opentelemetry/trace/tracer.rb +47 -13
- data/lib/opentelemetry/trace/tracer_provider.rb +22 -0
- data/lib/opentelemetry/trace/util/http_to_status.rb +47 -0
- data/lib/opentelemetry/version.rb +1 -1
- metadata +33 -13
- data/lib/opentelemetry/distributed_context.rb +0 -19
- data/lib/opentelemetry/distributed_context/distributed_context.rb +0 -24
- data/lib/opentelemetry/distributed_context/entry.rb +0 -66
- data/lib/opentelemetry/distributed_context/propagation.rb +0 -19
- data/lib/opentelemetry/distributed_context/propagation/binary_format.rb +0 -26
- data/lib/opentelemetry/distributed_context/propagation/text_format.rb +0 -76
- data/lib/opentelemetry/distributed_context/propagation/trace_parent.rb +0 -124
- data/lib/opentelemetry/trace/sampling_hint.rb +0 -22
- data/lib/opentelemetry/trace/tracer_factory.rb +0 -45
@@ -8,46 +8,9 @@ module OpenTelemetry
|
|
8
8
|
module Metrics
|
9
9
|
# No-op implementation of Meter.
|
10
10
|
class Meter
|
11
|
-
|
12
|
-
private_constant(:NOOP_LABEL_SET)
|
11
|
+
def record_batch(*measurements, labels: nil); end
|
13
12
|
|
14
|
-
|
15
|
-
|
16
|
-
# Canonicalizes labels, returning an opaque {LabelSet} object.
|
17
|
-
#
|
18
|
-
# @param [Hash<String, String>] labels
|
19
|
-
# @return [LabelSet]
|
20
|
-
def labels(labels)
|
21
|
-
NOOP_LABEL_SET
|
22
|
-
end
|
23
|
-
|
24
|
-
# Create and return a floating point gauge.
|
25
|
-
#
|
26
|
-
# @param [String] name Name of the metric. See {Meter} for required metric name syntax.
|
27
|
-
# @param [optional String] description Descriptive text documenting the instrument.
|
28
|
-
# @param [optional String] unit Unit specified according to http://unitsofmeasure.org/ucum.html.
|
29
|
-
# @param [optional Enumerable<String>] recommended_label_keys Recommended grouping keys for this instrument.
|
30
|
-
# @param [optional Boolean] monotonic Whether the gauge accepts only monotonic updates. Defaults to false.
|
31
|
-
# @return [FloatGauge]
|
32
|
-
def create_float_gauge(name, description: nil, unit: nil, recommended_label_keys: nil, monotonic: false)
|
33
|
-
raise ArgumentError if name.nil?
|
34
|
-
|
35
|
-
Instruments::FloatGauge.new
|
36
|
-
end
|
37
|
-
|
38
|
-
# Create and return an integer gauge.
|
39
|
-
#
|
40
|
-
# @param [String] name Name of the metric. See {Meter} for required metric name syntax.
|
41
|
-
# @param [optional String] description Descriptive text documenting the instrument.
|
42
|
-
# @param [optional String] unit Unit specified according to http://unitsofmeasure.org/ucum.html.
|
43
|
-
# @param [optional Enumerable<String>] recommended_label_keys Recommended grouping keys for this instrument.
|
44
|
-
# @param [optional Boolean] monotonic Whether the gauge accepts only monotonic updates. Defaults to false.
|
45
|
-
# @return [IntegerGauge]
|
46
|
-
def create_integer_gauge(name, description: nil, unit: nil, recommended_label_keys: nil, monotonic: false)
|
47
|
-
raise ArgumentError if name.nil?
|
48
|
-
|
49
|
-
Instruments::IntegerGauge.new
|
50
|
-
end
|
13
|
+
# TODO: Observers.
|
51
14
|
|
52
15
|
# Create and return a floating point counter.
|
53
16
|
#
|
@@ -6,8 +6,8 @@
|
|
6
6
|
|
7
7
|
module OpenTelemetry
|
8
8
|
module Metrics
|
9
|
-
# No-op implementation of a meter
|
10
|
-
class
|
9
|
+
# No-op implementation of a meter provider.
|
10
|
+
class MeterProvider
|
11
11
|
# Returns a {Meter} instance.
|
12
12
|
#
|
13
13
|
# @param [optional String] name Instrumentation package name
|
data/lib/opentelemetry/trace.rb
CHANGED
@@ -43,11 +43,11 @@ end
|
|
43
43
|
|
44
44
|
require 'opentelemetry/trace/event'
|
45
45
|
require 'opentelemetry/trace/link'
|
46
|
+
require 'opentelemetry/trace/propagation'
|
46
47
|
require 'opentelemetry/trace/trace_flags'
|
47
48
|
require 'opentelemetry/trace/span_context'
|
48
49
|
require 'opentelemetry/trace/span_kind'
|
49
50
|
require 'opentelemetry/trace/span'
|
50
|
-
require 'opentelemetry/trace/sampling_hint'
|
51
51
|
require 'opentelemetry/trace/status'
|
52
52
|
require 'opentelemetry/trace/tracer'
|
53
|
-
require 'opentelemetry/trace/
|
53
|
+
require 'opentelemetry/trace/tracer_provider'
|
@@ -19,7 +19,7 @@ module OpenTelemetry
|
|
19
19
|
|
20
20
|
# Returns the frozen attributes for this event
|
21
21
|
#
|
22
|
-
# @return [Hash<String,
|
22
|
+
# @return [Hash{String => String, Numeric, Boolean, Array<String, Numeric, Boolean>}]
|
23
23
|
attr_reader :attributes
|
24
24
|
|
25
25
|
# Returns the timestamp for this event
|
@@ -30,8 +30,9 @@ module OpenTelemetry
|
|
30
30
|
# Returns a new immutable {Event}.
|
31
31
|
#
|
32
32
|
# @param [String] name The name of this event
|
33
|
-
# @param [optional Hash
|
34
|
-
# event. Attributes will be
|
33
|
+
# @param [optional Hash{String => String, Numeric, Boolean, Array<String, Numeric, Boolean>}]
|
34
|
+
# attributes A hash of attributes for this event. Attributes will be
|
35
|
+
# frozen during Event initialization.
|
35
36
|
# @param [optional Time] timestamp The timestamp for this event.
|
36
37
|
# Defaults to Time.now.
|
37
38
|
# @return [Event]
|
@@ -22,14 +22,15 @@ module OpenTelemetry
|
|
22
22
|
|
23
23
|
# Returns the frozen attributes for this link.
|
24
24
|
#
|
25
|
-
# @return [Hash<String,
|
25
|
+
# @return [Hash{String => String, Numeric, Boolean, Array<String, Numeric, Boolean>}]
|
26
26
|
attr_reader :attributes
|
27
27
|
|
28
28
|
# Returns a new immutable {Link}.
|
29
29
|
#
|
30
30
|
# @param [SpanContext] span_context The context of the linked {Span}.
|
31
|
-
# @param [optional Hash
|
32
|
-
# this link. Attributes will be
|
31
|
+
# @param [optional Hash{String => String, Numeric, Boolean, Array<String, Numeric, Boolean>}]
|
32
|
+
# attributes A hash of attributes for this link. Attributes will be
|
33
|
+
# frozen during Link initialization.
|
33
34
|
# @return [Link]
|
34
35
|
def initialize(span_context, attributes = nil)
|
35
36
|
@context = span_context
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright 2019 OpenTelemetry Authors
|
4
|
+
#
|
5
|
+
# SPDX-License-Identifier: Apache-2.0
|
6
|
+
|
7
|
+
require 'opentelemetry/trace/propagation/context_keys'
|
8
|
+
require 'opentelemetry/trace/propagation/trace_context'
|
9
|
+
|
10
|
+
module OpenTelemetry
|
11
|
+
module Trace
|
12
|
+
# The Trace::Propagation module contains injectors and extractors for
|
13
|
+
# sending and receiving span context over the wire
|
14
|
+
module Propagation
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright 2019 OpenTelemetry Authors
|
4
|
+
#
|
5
|
+
# SPDX-License-Identifier: Apache-2.0
|
6
|
+
|
7
|
+
module OpenTelemetry
|
8
|
+
module Trace
|
9
|
+
module Propagation
|
10
|
+
# Contains the keys used to index the current span, or extracted span
|
11
|
+
# context in a {Context} instance
|
12
|
+
module ContextKeys
|
13
|
+
extend self
|
14
|
+
|
15
|
+
EXTRACTED_SPAN_CONTEXT_KEY = Context.create_key('extracted-span-context')
|
16
|
+
CURRENT_SPAN_KEY = Context.create_key('current-span')
|
17
|
+
private_constant :EXTRACTED_SPAN_CONTEXT_KEY, :CURRENT_SPAN_KEY
|
18
|
+
|
19
|
+
# Returns the context key that an extracted span context is indexed by
|
20
|
+
#
|
21
|
+
# @return [Context::Key]
|
22
|
+
def extracted_span_context_key
|
23
|
+
EXTRACTED_SPAN_CONTEXT_KEY
|
24
|
+
end
|
25
|
+
|
26
|
+
# Returns the context key that the current span is indexed by
|
27
|
+
#
|
28
|
+
# @return [Context::Key]
|
29
|
+
def current_span_key
|
30
|
+
CURRENT_SPAN_KEY
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright 2020 OpenTelemetry Authors
|
4
|
+
#
|
5
|
+
# SPDX-License-Identifier: Apache-2.0
|
6
|
+
|
7
|
+
require 'opentelemetry/trace/propagation/trace_context/trace_parent'
|
8
|
+
require 'opentelemetry/trace/propagation/trace_context/text_extractor'
|
9
|
+
require 'opentelemetry/trace/propagation/trace_context/text_injector'
|
10
|
+
|
11
|
+
module OpenTelemetry
|
12
|
+
module Trace
|
13
|
+
module Propagation
|
14
|
+
# The TraceContext module contains injectors, extractors, and utilties
|
15
|
+
# for context propagation in the W3C Trace Context format.
|
16
|
+
module TraceContext
|
17
|
+
extend self
|
18
|
+
|
19
|
+
TEXT_EXTRACTOR = TextExtractor.new
|
20
|
+
TEXT_INJECTOR = TextInjector.new
|
21
|
+
RACK_EXTRACTOR = TextExtractor.new(
|
22
|
+
traceparent_key: 'HTTP_TRACEPARENT',
|
23
|
+
tracestate_key: 'HTTP_TRACESTATE'
|
24
|
+
)
|
25
|
+
RACK_INJECTOR = TextInjector.new(
|
26
|
+
traceparent_key: 'HTTP_TRACEPARENT',
|
27
|
+
tracestate_key: 'HTTP_TRACESTATE'
|
28
|
+
)
|
29
|
+
|
30
|
+
private_constant :TEXT_INJECTOR, :TEXT_EXTRACTOR,
|
31
|
+
:RACK_INJECTOR, :RACK_EXTRACTOR
|
32
|
+
|
33
|
+
# Returns an extractor that extracts context using the W3C Trace Context
|
34
|
+
# format
|
35
|
+
def text_extractor
|
36
|
+
TEXT_EXTRACTOR
|
37
|
+
end
|
38
|
+
|
39
|
+
# Returns an injector that injects context using the W3C Trace Context
|
40
|
+
# format
|
41
|
+
def text_injector
|
42
|
+
TEXT_INJECTOR
|
43
|
+
end
|
44
|
+
|
45
|
+
# Returns an extractor that extracts context using the W3C Trace Context
|
46
|
+
# with Rack normalized keys (upcased and prefixed with HTTP_)
|
47
|
+
def rack_extractor
|
48
|
+
RACK_EXTRACTOR
|
49
|
+
end
|
50
|
+
|
51
|
+
# Returns an injector that injects context using the W3C Trace Context
|
52
|
+
# format with Rack normalized keys (upcased and prefixed with HTTP_)
|
53
|
+
def rack_injector
|
54
|
+
RACK_INJECTOR
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright 2020 OpenTelemetry Authors
|
4
|
+
#
|
5
|
+
# SPDX-License-Identifier: Apache-2.0
|
6
|
+
module OpenTelemetry
|
7
|
+
module Trace
|
8
|
+
module Propagation
|
9
|
+
module TraceContext
|
10
|
+
# Extracts context from carriers in the W3C Trace Context format
|
11
|
+
class TextExtractor
|
12
|
+
include Context::Propagation::DefaultGetter
|
13
|
+
|
14
|
+
# Returns a new TextExtractor that extracts context using the
|
15
|
+
# specified header keys
|
16
|
+
#
|
17
|
+
# @param [String] traceparent_key The traceparent header key used in the carrier
|
18
|
+
# @param [String] tracestate_key The tracestate header key used in the carrier
|
19
|
+
# @return [TextExtractor]
|
20
|
+
def initialize(traceparent_key: 'traceparent',
|
21
|
+
tracestate_key: 'tracestate')
|
22
|
+
@traceparent_key = traceparent_key
|
23
|
+
@tracestate_key = tracestate_key
|
24
|
+
end
|
25
|
+
|
26
|
+
# Extract a remote {Trace::SpanContext} from the supplied carrier.
|
27
|
+
# Invalid headers will result in a new, valid, non-remote {Trace::SpanContext}.
|
28
|
+
#
|
29
|
+
# @param [Carrier] carrier The carrier to get the header from.
|
30
|
+
# @param [Context] context The context to be updated with extracted context
|
31
|
+
# @param [optional Callable] getter An optional callable that takes a carrier and a key and
|
32
|
+
# returns the value associated with the key. If omitted the default getter will be used
|
33
|
+
# which expects the carrier to respond to [] and []=.
|
34
|
+
# @yield [Carrier, String] if an optional getter is provided, extract will yield the carrier
|
35
|
+
# and the header key to the getter.
|
36
|
+
# @return [Context] Updated context with span context from the header, or the original
|
37
|
+
# context if parsing fails.
|
38
|
+
def extract(carrier, context, &getter)
|
39
|
+
getter ||= default_getter
|
40
|
+
header = getter.call(carrier, @traceparent_key)
|
41
|
+
tp = TraceParent.from_string(header)
|
42
|
+
|
43
|
+
tracestate = getter.call(carrier, @tracestate_key)
|
44
|
+
|
45
|
+
span_context = Trace::SpanContext.new(trace_id: tp.trace_id,
|
46
|
+
span_id: tp.span_id,
|
47
|
+
trace_flags: tp.flags,
|
48
|
+
tracestate: tracestate,
|
49
|
+
remote: true)
|
50
|
+
context.set_value(ContextKeys.extracted_span_context_key, span_context)
|
51
|
+
rescue OpenTelemetry::Error
|
52
|
+
context
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright 2020 OpenTelemetry Authors
|
4
|
+
#
|
5
|
+
# SPDX-License-Identifier: Apache-2.0
|
6
|
+
module OpenTelemetry
|
7
|
+
module Trace
|
8
|
+
module Propagation
|
9
|
+
module TraceContext
|
10
|
+
# Injects context into carriers using the W3C Trace Context format
|
11
|
+
class TextInjector
|
12
|
+
include Context::Propagation::DefaultSetter
|
13
|
+
|
14
|
+
# Returns a new TextInjector that injects context using the
|
15
|
+
# specified header keys
|
16
|
+
#
|
17
|
+
# @param [String] traceparent_key The traceparent header key used in the carrier
|
18
|
+
# @param [String] tracestate_key The tracestate header key used in the carrier
|
19
|
+
# @return [TextInjector]
|
20
|
+
def initialize(traceparent_key: 'traceparent',
|
21
|
+
tracestate_key: 'tracestate')
|
22
|
+
@traceparent_key = traceparent_key
|
23
|
+
@tracestate_key = tracestate_key
|
24
|
+
end
|
25
|
+
|
26
|
+
# Set the span context on the supplied carrier.
|
27
|
+
#
|
28
|
+
# @param [Context] context The active {Context}.
|
29
|
+
# @param [optional Callable] setter An optional callable that takes a carrier and a key and
|
30
|
+
# a value and assigns the key-value pair in the carrier. If omitted the default setter
|
31
|
+
# will be used which expects the carrier to respond to [] and []=.
|
32
|
+
# @yield [Carrier, String, String] if an optional setter is provided, inject will yield
|
33
|
+
# carrier, header key, header value to the setter.
|
34
|
+
# @return [Object] the carrier with context injected
|
35
|
+
def inject(carrier, context, &setter)
|
36
|
+
return carrier unless (span_context = span_context_from(context))
|
37
|
+
|
38
|
+
setter ||= DEFAULT_SETTER
|
39
|
+
setter.call(carrier, @traceparent_key, TraceParent.from_context(span_context).to_s)
|
40
|
+
setter.call(carrier, @tracestate_key, span_context.tracestate) unless span_context.tracestate.nil?
|
41
|
+
|
42
|
+
carrier
|
43
|
+
end
|
44
|
+
|
45
|
+
private
|
46
|
+
|
47
|
+
def span_context_from(context)
|
48
|
+
context[ContextKeys.current_span_key]&.context ||
|
49
|
+
context[ContextKeys.extracted_span_context_key]
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,126 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright 2020 OpenTelemetry Authors
|
4
|
+
#
|
5
|
+
# SPDX-License-Identifier: Apache-2.0
|
6
|
+
module OpenTelemetry
|
7
|
+
module Trace
|
8
|
+
module Propagation
|
9
|
+
module TraceContext
|
10
|
+
# A TraceParent is an implementation of the W3C trace context specification
|
11
|
+
# https://www.w3.org/TR/trace-context/
|
12
|
+
# {Trace::SpanContext}
|
13
|
+
class TraceParent
|
14
|
+
InvalidFormatError = Class.new(Error)
|
15
|
+
InvalidVersionError = Class.new(Error)
|
16
|
+
InvalidTraceIDError = Class.new(Error)
|
17
|
+
InvalidSpanIDError = Class.new(Error)
|
18
|
+
|
19
|
+
TRACE_PARENT_HEADER = 'traceparent'
|
20
|
+
SUPPORTED_VERSION = 0
|
21
|
+
private_constant :SUPPORTED_VERSION
|
22
|
+
MAX_VERSION = 254
|
23
|
+
private_constant :MAX_VERSION
|
24
|
+
|
25
|
+
REGEXP = /^(?<version>[A-Fa-f0-9]{2})-(?<trace_id>[A-Fa-f0-9]{32})-(?<span_id>[A-Fa-f0-9]{16})-(?<flags>[A-Fa-f0-9]{2})(?<ignored>-.*)?$/.freeze
|
26
|
+
private_constant :REGEXP
|
27
|
+
|
28
|
+
class << self
|
29
|
+
# Creates a new {TraceParent} from a supplied {Trace::SpanContext}
|
30
|
+
# @param [SpanContext] ctx The context
|
31
|
+
# @return [TraceParent] a trace parent
|
32
|
+
def from_context(ctx)
|
33
|
+
new(trace_id: ctx.trace_id, span_id: ctx.span_id, flags: ctx.trace_flags)
|
34
|
+
end
|
35
|
+
|
36
|
+
# Deserializes the {TraceParent} from the string representation
|
37
|
+
# @param [String] string The serialized trace parent
|
38
|
+
# @return [TraceParent] a trace_parent
|
39
|
+
# @raise [InvalidFormatError] on an invalid format
|
40
|
+
# @raise [InvalidVerionError] on an invalid version
|
41
|
+
# @raise [InvalidTraceIDError] on an invalid trace_id
|
42
|
+
# @raise [InvalidSpanIDError] on an invalid span_id
|
43
|
+
def from_string(string)
|
44
|
+
matches = match_input(string)
|
45
|
+
|
46
|
+
version = parse_version(matches[:version])
|
47
|
+
raise InvalidFormatError if version > SUPPORTED_VERSION && string.length < 55
|
48
|
+
|
49
|
+
trace_id = parse_trace_id(matches[:trace_id])
|
50
|
+
span_id = parse_span_id(matches[:span_id])
|
51
|
+
flags = parse_flags(matches[:flags])
|
52
|
+
|
53
|
+
new(trace_id: trace_id, span_id: span_id, flags: flags)
|
54
|
+
end
|
55
|
+
|
56
|
+
private
|
57
|
+
|
58
|
+
def match_input(string)
|
59
|
+
matches = REGEXP.match(string)
|
60
|
+
raise InvalidFormatError, 'regexp match failed' if !matches || matches.length < 6
|
61
|
+
|
62
|
+
matches
|
63
|
+
end
|
64
|
+
|
65
|
+
def parse_version(string)
|
66
|
+
v = string.to_i(16)
|
67
|
+
raise InvalidFormatError, string unless v
|
68
|
+
raise InvalidVersionError, v if v > MAX_VERSION
|
69
|
+
|
70
|
+
v
|
71
|
+
end
|
72
|
+
|
73
|
+
def parse_trace_id(string)
|
74
|
+
raise InvalidTraceIDError, string if string == OpenTelemetry::Trace::INVALID_TRACE_ID
|
75
|
+
|
76
|
+
string.downcase!
|
77
|
+
string
|
78
|
+
end
|
79
|
+
|
80
|
+
def parse_span_id(string)
|
81
|
+
raise InvalidSpanIDError, string if string == OpenTelemetry::Trace::INVALID_SPAN_ID
|
82
|
+
|
83
|
+
string.downcase!
|
84
|
+
string
|
85
|
+
end
|
86
|
+
|
87
|
+
def parse_flags(string)
|
88
|
+
OpenTelemetry::Trace::TraceFlags.from_byte(string.to_i(16))
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
attr_reader :version, :trace_id, :span_id, :flags
|
93
|
+
|
94
|
+
private_class_method :new
|
95
|
+
|
96
|
+
# Returns the sampling choice from the trace_flags
|
97
|
+
# @return [Boolean] the sampling choice
|
98
|
+
def sampled?
|
99
|
+
flags.sampled?
|
100
|
+
end
|
101
|
+
|
102
|
+
# converts this object into a string according to the w3c spec
|
103
|
+
# @return [String] the serialized trace_parent
|
104
|
+
def to_s
|
105
|
+
"00-#{trace_id}-#{span_id}-#{flag_string}"
|
106
|
+
end
|
107
|
+
|
108
|
+
private
|
109
|
+
|
110
|
+
def flag_string
|
111
|
+
# the w3c standard only dictates the one flag for this version
|
112
|
+
# therefore we can only output the one flag.
|
113
|
+
flags.sampled? ? '01' : '00'
|
114
|
+
end
|
115
|
+
|
116
|
+
def initialize(trace_id: nil, span_id: nil, version: SUPPORTED_VERSION, flags: Trace::TraceFlags::DEFAULT)
|
117
|
+
@trace_id = trace_id
|
118
|
+
@span_id = span_id
|
119
|
+
@version = version
|
120
|
+
@flags = flags
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|