File Coverage

blib/lib/OpenTracing/WrapScope.pm
Criterion Covered Total %
statement 73 76 96.0
branch 28 30 93.3
condition 5 5 100.0
subroutine 17 17 100.0
pod 2 2 100.0
total 125 130 96.1


line stmt bran cond sub pod time code
1             package OpenTracing::WrapScope;
2             our $VERSION = '0.101.0';
3 6     6   3951667 use strict;
  6         61  
  6         192  
4 6     6   32 use warnings;
  6         13  
  6         185  
5 6     6   35 use warnings::register;
  6         15  
  6         752  
6 6     6   46 use B::Hooks::EndOfScope;
  6         10  
  6         59  
7 6     6   503 use OpenTracing::GlobalTracer;
  6         13  
  6         39  
8 6     6   420 use PerlX::Maybe;
  6         12  
  6         58  
9 6     6   3047 use Sub::Info qw/sub_info/;
  6         41376  
  6         41  
10              
11             { # transparent caller, stolen from Hook::LexWrap
12 6     6   203 no warnings 'redefine';
  6         23  
  6         2194  
13             *CORE::GLOBAL::caller = sub (;$) {
14 166   100 166   3225835225 my ($height) = ($_[0]||0);
15 166         292 my $i=1;
16 166         248 my $name_cache;
17 166         267 while (1) {
18             my @caller = CORE::caller() eq 'DB'
19 283 50       1877 ? do { package DB; CORE::caller($i++) }
  0         0  
20             : CORE::caller($i++);
21 283 100       792 return if not @caller;
22 273 100       564 $caller[3] = $name_cache if $name_cache;
23 273 100       592 $name_cache = $caller[0] eq __PACKAGE__ ? $caller[3] : '';
24 273 100 100     1010 next if $name_cache || $height-- != 0;
25 156 100       827 return wantarray ? @_ ? @caller : @caller[0..2] : $caller[0];
    100          
26             }
27             };
28             }
29              
30             sub import {
31 6     6   71 my (undef, @subs) = @_;
32 6         18 my $pkg = caller;
33             on_scope_end {
34 6     6   74 foreach my $sub (@subs) {
35 15         37 install_wrapped(_qualify_sub($sub, $pkg));
36             }
37 6         49 };
38 6         1215 return;
39             }
40              
41             sub install_wrapped {
42 15     15 1 32 my ($sub) = @_;
43 15         44 $sub = _qualify_sub($sub, scalar caller);
44              
45 15 50       77 if (not defined &$sub) {
46 0         0 warnings::warn "Couldn't find sub: $sub";
47 0         0 return;
48             }
49              
50 6     6   56 no strict 'refs';
  6         12  
  6         245  
51 6     6   39 no warnings 'redefine';
  6         14  
  6         2783  
52 15         43 *$sub = wrapped(\&$sub);
53              
54 15         61 return;
55             }
56              
57             sub wrapped {
58 15     15 1 28 my ($coderef) = @_;
59 15         48 my $info = sub_info($coderef);
60              
61             return sub {
62 21     21   9982 my ($call_package, $call_filename, $call_line) = caller(0);
63 21         132 my $call_sub = (caller(1))[3];
64 21         207 my $tracer = OpenTracing::GlobalTracer->get_global_tracer;
65             my $scope = $tracer->start_active_span(
66             "$info->{package}::$info->{name}",
67             tags => {
68             'source.subname' => $info->{name},
69             'source.file' => $info->{file},
70             'source.line' => $info->{start_line},
71             'source.package' => $info->{package},
72 21         367 maybe
73             'caller.subname' => $call_sub,
74             'caller.file' => $call_filename,
75             'caller.line' => $call_line,
76             'caller.package' => $call_package,
77             },
78             );
79              
80 21         30415 my $result;
81 21         50 my $wantarray = wantarray; # eval will have its own
82 21         42 my $ok = eval {
83 21 100       61 if (defined $wantarray) {
84 4 100       22 $result = $wantarray ? [&$coderef] : &$coderef;
85             }
86             else {
87 17         61 &$coderef;
88             }
89 20         8672 1;
90             };
91 21 100       91 $scope->get_span->add_tag(error => $@) unless $ok;
92 21         294 $scope->close();
93              
94 21 100       3223 die $@ unless $ok;
95 20 100       252 return if not defined wantarray;
96 4 100       58 return wantarray ? @$result : $result;
97 15         2432 };
98             }
99              
100             sub _qualify_sub {
101 30     30   80 my ($sub, $pkg) = @_;
102 30 100       160 return $sub if $sub =~ /'|::/;
103 15         112 return "${pkg}::$sub";
104             }
105              
106             1;