-
Notifications
You must be signed in to change notification settings - Fork 247
/
trace.rb
96 lines (83 loc) · 3.23 KB
/
trace.rb
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
84
85
86
87
88
89
90
91
92
93
94
95
96
# frozen_string_literal: true
# Copyright The OpenTelemetry Authors
#
# SPDX-License-Identifier: Apache-2.0
module OpenTelemetry
# The Trace API allows recording a set of events, triggered as a result of a
# single logical operation, consolidated across various components of an
# application.
module Trace
extend self
CURRENT_SPAN_KEY = Context.create_key('current-span')
# Random number generator for generating IDs. This is an object that can
# respond to `#bytes` and uses the system PRNG. The current logic is
# compatible with Ruby 2.5 (which does not implement the `Random.bytes`
# class method) and with Ruby 3.0+ (which deprecates `Random::DEFAULT`).
# When we drop support for Ruby 2.5, this can simply be replaced with
# the class `Random`.
#
# @return [#bytes]
RANDOM = Random.respond_to?(:bytes) ? Random : Random::DEFAULT
private_constant :CURRENT_SPAN_KEY, :RANDOM
# An invalid trace identifier, a 16-byte string with all zero bytes.
INVALID_TRACE_ID = ("\0" * 16).b
# An invalid span identifier, an 8-byte string with all zero bytes.
INVALID_SPAN_ID = ("\0" * 8).b
# Generates a valid trace identifier, a 16-byte string with at least one
# non-zero byte.
#
# @return [String] a valid trace ID.
def generate_trace_id
loop do
id = RANDOM.bytes(16)
return id unless id == INVALID_TRACE_ID
end
end
# Generates a valid span identifier, an 8-byte string with at least one
# non-zero byte.
#
# @return [String] a valid span ID.
def generate_span_id
loop do
id = RANDOM.bytes(8)
return id unless id == INVALID_SPAN_ID
end
end
# Returns the current span from the current or provided context
#
# @param [optional Context] context The context to lookup the current
# {Span} from. Defaults to Context.current
def current_span(context = nil)
context ||= Context.current
context.value(CURRENT_SPAN_KEY) || Span::INVALID
end
# Returns a context containing the span, derived from the optional parent
# context, or the current context if one was not provided.
#
# @param [optional Context] context The context to use as the parent for
# the returned context
def context_with_span(span, parent_context: Context.current)
parent_context.set_value(CURRENT_SPAN_KEY, span)
end
# Activates/deactivates the Span within the current Context, which makes the "current span"
# available implicitly.
#
# On exit, the Span that was active before calling this method will be reactivated.
#
# @param [Span] span the span to activate
# @yield [span, context] yields span and a context containing the span to the block.
def with_span(span)
Context.with_value(CURRENT_SPAN_KEY, span) { |c, s| yield s, c }
end
end
end
require 'opentelemetry/trace/link'
require 'opentelemetry/trace/trace_flags'
require 'opentelemetry/trace/tracestate'
require 'opentelemetry/trace/span_context'
require 'opentelemetry/trace/span_kind'
require 'opentelemetry/trace/span'
require 'opentelemetry/trace/status'
require 'opentelemetry/trace/propagation'
require 'opentelemetry/trace/tracer'
require 'opentelemetry/trace/tracer_provider'