File Coverage

blib/lib/OpenTelemetry/Propagator/TraceContext.pm
Criterion Covered Total %
statement 76 77 98.7
branch 7 8 87.5
condition 9 14 64.2
subroutine 15 15 100.0
pod 3 3 100.0
total 110 117 94.0


line stmt bran cond sub pod time code
1 2     2   245510 use Object::Pad;
  2         16055  
  2         40  
2             # ABSTRACT: Propagate context using the W3C TraceContext format
3              
4             package OpenTelemetry::Propagator::TraceContext;
5              
6             our $VERSION = '0.033';
7              
8 1     1   828 class OpenTelemetry::Propagator::TraceContext :does(OpenTelemetry::Propagator) {
  1         4  
  1         116  
9 2     2   1170 use isa 'OpenTelemetry::X';
  2         11419  
  2         15  
10              
11 2     2   987 use Feature::Compat::Try;
  2         622  
  2         14  
12 2     2   780 use URL::Encode qw( url_decode_utf8 url_encode_utf8 );
  2         2245  
  2         185  
13              
14 2     2   650 use OpenTelemetry;
  2         6  
  2         24  
15 2     2   734 use OpenTelemetry::Common ();
  2         6  
  2         63  
16 2     2   12 use OpenTelemetry::Propagator::TextMap;
  2         6  
  2         98  
17 2     2   646 use OpenTelemetry::Propagator::TraceContext::TraceParent;
  2         5  
  2         93  
18 2     2   15 use OpenTelemetry::Propagator::TraceContext::TraceState;
  2         3  
  2         62  
19 2     2   10 use OpenTelemetry::Trace::SpanContext;
  2         5  
  2         58  
20 2     2   12 use OpenTelemetry::Trace;
  2         4  
  2         3409  
21              
22             my $TRACE_PARENT_KEY = 'traceparent';
23             my $TRACE_STATE_KEY = 'tracestate';
24              
25             my $logger = OpenTelemetry::Common::internal_logger;
26              
27             method inject (
28 5         16 $carrier,
  5         5  
29 5         9 $context = undef,
30             $setter = undef
31 5     5 1 3076 ) {
  5         7  
  5         6  
32 5   66     48 $context //= OpenTelemetry::Context->current;
33 5   66     38 $setter //= OpenTelemetry::Propagator::TextMap::SETTER;
34              
35 5         9 try {
36 5         25 my $span_context = OpenTelemetry::Trace
37             ->span_from_context($context)
38             ->context;
39              
40 5 100       14 return $self unless $span_context->valid;
41              
42 3         21 my $trace_parent = OpenTelemetry::Propagator::TraceContext::TraceParent
43             ->from_span_context($span_context);
44              
45 3         12 $setter->( $carrier, $TRACE_PARENT_KEY, $trace_parent->to_string );
46 2         9 $setter->( $carrier, $TRACE_STATE_KEY, $span_context->trace_state->to_string );
47             }
48             catch($e) {
49 1 50       11 if ( isa_OpenTelemetry_X $e ) { $logger->warn($e->get_message) }
  0         0  
50             else {
51 1         8 OpenTelemetry->handle_error(
52             exception => $e,
53             message => 'Error while injecting trace context',
54             );
55             }
56             }
57              
58 3         13 return $self;
59             }
60              
61             method extract (
62 6         17 $carrier,
  6         11  
63 6         7 $context = undef,
64             $getter = undef
65 6     6 1 1088 ) {
  6         10  
  6         7  
66 6   66     34 $context //= OpenTelemetry::Context->current;
67 6   66     35 $getter //= OpenTelemetry::Propagator::TextMap::GETTER;
68              
69 6         13 try {
70 6 100       13 my $string = $getter->( $carrier, $TRACE_PARENT_KEY )
71             or return $context;
72              
73 3         24 my $trace_parent = OpenTelemetry::Propagator::TraceContext::TraceParent
74             ->from_string($string);
75              
76 2   50     7 my $trace_state = OpenTelemetry::Propagator::TraceContext::TraceState
77             ->from_string( $getter->( $carrier, $TRACE_STATE_KEY ) // '' );
78              
79 2         9 my $span_context = OpenTelemetry::Trace::SpanContext->new(
80             trace_id => $trace_parent->trace_id,
81             span_id => $trace_parent->span_id,
82             trace_flags => $trace_parent->trace_flags,
83             trace_state => $trace_state,
84             remote => 1,
85             );
86              
87 2         14 my $span = OpenTelemetry::Trace->non_recording_span( $span_context );
88              
89 2         8 return OpenTelemetry::Trace->context_with_span( $span, $context );
90             }
91             catch ($e) {
92 2 100       594 if ( isa_OpenTelemetry_X $e ) { $logger->warn($e->get_message) }
  1         5  
93             else {
94 1         5 OpenTelemetry->handle_error(
95             exception => $e,
96             message => 'Error while extracting trace context',
97             );
98             }
99              
100 2         108 return $context;
101             }
102             }
103              
104 3     3 1 6945 method keys () { ( $TRACE_PARENT_KEY, $TRACE_STATE_KEY ) }
  3         8  
  3         4  
  3         26  
105             }