lib/opentelemetry/trace.rb in opentelemetry-api-0.7.0 vs lib/opentelemetry/trace.rb in opentelemetry-api-0.8.0
- old
+ new
@@ -7,35 +7,70 @@
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')
+
+ private_constant :CURRENT_SPAN_KEY
+
# 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 self.generate_trace_id
+ def generate_trace_id
loop do
id = Random::DEFAULT.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 self.generate_span_id
+ def generate_span_id
loop do
id = Random::DEFAULT.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'