File Coverage

blib/lib/OpenTelemetry/Propagator/TraceContext/TraceParent.pm
Criterion Covered Total %
statement 40 40 100.0
branch 10 10 100.0
condition 11 12 91.6
subroutine 11 11 100.0
pod 7 7 100.0
total 79 80 98.7


line stmt bran cond sub pod time code
1 3     3   290606 use Object::Pad ':experimental(init_expr)';
  3         18075  
  3         27  
2             # ABSTRACT: Represents a TraceParent in a W3C TraceContext
3              
4             package OpenTelemetry::Propagator::TraceContext::TraceParent;
5              
6             our $VERSION = '0.033';
7              
8             class OpenTelemetry::Propagator::TraceContext::TraceParent {
9 3     3   2282 use OpenTelemetry::X;
  3         8  
  3         151  
10 3         31 use OpenTelemetry::Constants qw(
11             HEX_INVALID_TRACE_ID
12             HEX_INVALID_SPAN_ID
13 3     3   647 );
  3         11  
14 3     3   4394 use OpenTelemetry::Propagator::TraceContext::TraceFlags;
  3         11  
  3         4263  
15              
16 5     5 1 257 field $span_id :param :reader;
  5         24  
17 5     5 1 255 field $trace_flags :param :reader;
  5         69  
18 5     5 1 304 field $trace_id :param :reader;
  5         28  
19 2     2 1 2087 field $version :param :reader = 0;
20              
21 2     5 1 9 method to_string () {
  5         529  
  5         15  
  5         8  
22 5         40 join '-',
23             '00',
24             unpack( 'H*', $trace_id ),
25             unpack( 'H*', $span_id ),
26             $trace_flags->to_string;
27             }
28              
29 4     4 1 8 sub from_span_context ( $class, $context ) {
  4         10  
  4         8  
  4         6  
30 4         16 $class->new(
31             span_id => $context->span_id,
32             trace_flags => $context->trace_flags,
33             trace_id => $context->trace_id,
34             );
35             }
36              
37 10     10 1 423153 sub from_string ( $class, $string ) {
  10         19  
  10         20  
  10         18  
38 10         56 my $version = substr $string, 0, 2;
39              
40 10 100 66     161 die OpenTelemetry::X->create(
      100        
      100        
41             'Unsupported',
42             "Unsupported TraceParent version ($version) when parsing string: $string"
43             ) if !$version
44             || $version !~ /^\d+$/a
45             || ( $version > 0 && length $string < 55 );
46              
47 8 100       81 my ( $trace_id, $span_id, $trace_flags ) = $string =~ /
48             ^ [A-Za-z0-9]{2} # version
49             - ([A-Za-z0-9]{32}) # trace ID
50             - ([A-Za-z0-9]{16}) # span ID
51             - ([A-Za-z0-9]{2}) # trace flags
52             ( $ | - )
53             /x or die OpenTelemetry::X->create(
54             'Parsing',
55             "Could not parse TraceParent from string: '$string'"
56             );
57              
58 7 100 100     45 die OpenTelemetry::X->create(
59             'Parsing',
60             "Malformed TraceParent string had trailing data after trace-flags: '$string'"
61             ) if $version == 0 && length $string > 55;
62              
63 6 100       26 die OpenTelemetry::X->create(
64             'Parsing',
65             "Invalid trace ID ($trace_id) when parsing string: '$string'"
66             ) if $trace_id eq HEX_INVALID_TRACE_ID;
67              
68 5 100       23 die OpenTelemetry::X->create(
69             'Parsing',
70             "Invalid span ID ($span_id) when parsing string: '$string'"
71             ) if $span_id eq HEX_INVALID_SPAN_ID;
72              
73 4         72 $class->new(
74             version => 0+$version,
75             trace_id => pack( 'H*', $trace_id ),
76             span_id => pack( 'H*', $span_id ),
77             trace_flags => OpenTelemetry::Propagator::TraceContext::TraceFlags
78             ->new( hex $trace_flags ),
79             );
80             }
81             }