lib/opentelemetry/baggage/manager.rb in opentelemetry-api-0.16.0 vs lib/opentelemetry/baggage/manager.rb in opentelemetry-api-0.17.0

- old
+ new

@@ -4,38 +4,101 @@ # # SPDX-License-Identifier: Apache-2.0 module OpenTelemetry module Baggage - # No op implementation of Baggage::Manager + # Operational Baggage Manager implementation class Manager - NOOP_BUILDER = Builder.new - EMPTY_VALUES = {}.freeze - private_constant(:NOOP_BUILDER, :EMPTY_VALUES) + BAGGAGE_KEY = OpenTelemetry::Baggage::Propagation::ContextKeys.baggage_key + EMPTY_BAGGAGE = {}.freeze + private_constant(:BAGGAGE_KEY, :EMPTY_BAGGAGE) + # Used to chain modifications to baggage. The result is a + # context with an updated baggage. If only a single + # modification is being made to baggage, use the other + # methods on +Manager+, if multiple modifications are being made, use + # this one. + # + # @param [optional Context] context The context to update with with new + # modified baggage. Defaults to +Context.current+ + # @return [Context] def build(context: Context.current) - yield NOOP_BUILDER - context + builder = Builder.new(baggage_for(context).dup) + yield builder + context.set_value(BAGGAGE_KEY, builder.entries) end - def set_value(key, value, context: Context.current) - context + # Returns a new context with empty baggage + # + # @param [optional Context] context Context to clear baggage from. Defaults + # to +Context.current+ + # @return [Context] + def clear(context: Context.current) + context.set_value(BAGGAGE_KEY, EMPTY_BAGGAGE) end + # Returns the corresponding baggage.entry (or nil) for key + # + # @param [String] key The lookup key + # @param [optional Context] context The context from which to retrieve + # the key. + # Defaults to +Context.current+ + # @return [String] def value(key, context: Context.current) - nil + baggage_for(context)[key]&.value end + # Returns the baggage + # + # @param [optional Context] context The context from which to retrieve + # the baggage. + # Defaults to +Context.current+ + # @return [Hash] def values(context: Context.current) - EMPTY_VALUES + baggage_for(context).transform_values(&:value) end + # @api private + def raw_entries(context: Context.current) + baggage_for(context).dup.freeze + end + + # Returns a new context with new key-value pair + # + # @param [String] key The key to store this value under + # @param [String] value String value to be stored under key + # @param [optional String] metadata This is here to store properties + # received from other W3C Baggage impelmentations but is not exposed in + # OpenTelemetry. This is condsidered private API and not for use by + # end-users. + # @param [optional Context] context The context to update with new + # value. Defaults to +Context.current+ + # @return [Context] + def set_value(key, value, metadata: nil, context: Context.current) + new_baggage = baggage_for(context).dup + new_baggage[key] = Entry.new(value, metadata) + context.set_value(BAGGAGE_KEY, new_baggage) + end + + # Returns a new context with value at key removed + # + # @param [String] key The key to remove + # @param [optional Context] context The context to remove baggage + # from. Defaults to +Context.current+ + # @return [Context] def remove_value(key, context: Context.current) - context + baggage = baggage_for(context) + return context unless baggage.key?(key) + + new_baggage = baggage.dup + new_baggage.delete(key) + context.set_value(BAGGAGE_KEY, new_baggage) end - def clear(context: Context.current) - context + private + + def baggage_for(context) + context.value(BAGGAGE_KEY) || EMPTY_BAGGAGE end end end end