File Coverage

blib/lib/OpenTelemetry/Trace/Tracer.pm
Criterion Covered Total %
statement 32 32 100.0
branch n/a
condition n/a
subroutine 10 10 100.0
pod 1 1 100.0
total 43 43 100.0


line stmt bran cond sub pod time code
1 11     11   237689 use Object::Pad;
  11         15345  
  11         79  
2             # ABSTRACT: A span factory for OpenTelemetry
3              
4             package OpenTelemetry::Trace::Tracer;
5              
6             our $VERSION = '0.033';
7              
8             class OpenTelemetry::Trace::Tracer {
9 11     11   13837 use Feature::Compat::Try;
  11         14193  
  11         66  
10 11     11   6789 use Syntax::Keyword::Dynamically;
  11         16543  
  11         81  
11 11     11   2212 use Ref::Util 'is_coderef';
  11         6530  
  11         997  
12              
13 11     11   1289 use OpenTelemetry::Constants qw( SPAN_STATUS_ERROR SPAN_STATUS_OK );
  11         29  
  11         103  
14 11     11   11332 use OpenTelemetry::Context;
  11         31  
  11         469  
15 11     11   4315 use OpenTelemetry::Trace::Span;
  11         55  
  11         513  
16 11     11   5008 use OpenTelemetry::Trace;
  11         95  
  11         590  
17 11     11   136 use OpenTelemetry::X;
  11         135  
  11         12522  
18              
19 1     1 1 12171 method create_span ( %args ) {
  1         7  
  1         5  
  1         2  
20 1         9 OpenTelemetry::Trace::Span::INVALID;
21             }
22              
23             # Experimental
24             method in_span {
25             is_coderef $_[-1] or die OpenTelemetry::X->create(
26             Invalid => 'Missing required code block in call to Tracer->in_span',
27             );
28              
29             my $block = pop;
30             my $name = shift;
31             my %args = @_;
32              
33             $args{name} = $name or die OpenTelemetry::X->create(
34             Invalid => 'Missing required span name to Tracer->in_span',
35             );
36              
37             my $span = $self->create_span(
38             %args,
39             parent => OpenTelemetry::Context->current
40             );
41              
42             my $context = OpenTelemetry::Trace->context_with_span($span);
43              
44             dynamically OpenTelemetry::Context->current = $context;
45              
46             my ( $error );
47             try {
48             return $block->( $span, $context );
49             }
50             catch ($e) {
51             $span->record_exception($e);
52              
53             ($error) = split /\n/, "$e", 2;
54             $error =~ s/ at \S+ line \d+\.$//;
55              
56             die $e;
57             }
58             finally {
59             $span->set_status(
60             $error ? ( SPAN_STATUS_ERROR, $error ) : SPAN_STATUS_OK
61             );
62              
63             $span->end;
64             }
65             }
66             }