File Coverage

blib/lib/OpenTracing/Integration/Email/Sender.pm
Criterion Covered Total %
statement 44 46 95.6
branch 2 4 50.0
condition 1 3 33.3
subroutine 10 10 100.0
pod 0 1 0.0
total 57 64 89.0


line stmt bran cond sub pod time code
1             package OpenTracing::Integration::Email::Sender;
2             # ABSTRACT: OpenTracing APM support for email sent via Email::Sender
3              
4 1     1   287466 use strict;
  1         10  
  1         32  
5 1     1   6 use warnings;
  1         2  
  1         50  
6              
7             our $VERSION = '0.001';
8             our $AUTHORITY = 'cpan:TEAM'; # AUTHORITY
9              
10 1     1   6 no indirect;
  1         3  
  1         5  
11 1     1   44 use utf8;
  1         3  
  1         4  
12              
13             =encoding utf8
14              
15             =head1 NAME
16              
17             OpenTracing::Integration::Email::Sender - support L tracing
18              
19             =head1 SYNOPSIS
20              
21             use OpenTracing::Integration qw(Email::Sender);
22             HTTP::Tiny->new->get('https://metacpan.org');
23              
24             =head1 DESCRIPTION
25              
26             See L for more details.
27              
28             =cut
29              
30 1     1   41 use Syntax::Keyword::Try;
  1         4  
  1         8  
31 1     1   593 use Role::Tiny::With;
  1         268  
  1         60  
32 1     1   8 use Class::Method::Modifiers qw(install_modifier);
  1         1  
  1         68  
33              
34 1     1   484 use OpenTracing::DSL qw(:v1);
  1         953  
  1         852  
35              
36             with qw(OpenTracing::Integration);
37              
38             my $loaded;
39              
40             sub load {
41 1     1 0 15 my ($class, $load_deps) = @_;
42 1 50 33     6 return unless $load_deps or Email::Sender::Simple->can('send');
43              
44 1 50       5 unless($loaded++) {
45 1         8 require Email::Sender::Simple;
46 1         3 require Email::Simple::Header;
47 1         559 require Email::Address::XS;
48             install_modifier q{Email::Sender::Simple}, around => send => sub {
49 1     1   4228 my ($code, $self, $message, $env, @rest) = @_;
50 1         15 my $hdr = $message->header_obj;
51 1         9 my $subject = $hdr->header_raw('Subject');
52 1         35 my @to = map { $_->address } map { Email::Address::XS->parse($_) } $hdr->header_raw('To');
  1         46  
  1         38  
53 1         84 my @from = map { $_->address } map { Email::Address::XS->parse($_) } $hdr->header_raw('From');
  1         26  
  1         25  
54 1         28 my @cc = map { $_->address } map { Email::Address::XS->parse($_) } $hdr->header_raw('Cc');
  0         0  
  0         0  
55             return trace {
56 1         106 my ($span) = @_;
57             try {
58             $span->tag(
59             'component' => 'Email::Sender::Simple',
60             'email.to' => join(',', @to),
61             'email.from' => join(',', @from),
62             (@cc ? ('email.cc' => join(',', @cc)) : ()),
63             'email.subject' => $subject,
64             'email.body_size' => length($message->body),
65             'span.kind' => 'client',
66             );
67             return $self->$code($message, $env, @rest);
68 1         3 } catch {
69             my $err = $@;
70             $span->tag(
71             error => 1,
72             );
73             die $@;
74             }
75 1         29 } operation_name => 'email: ' . $subject;
76 1         2807 };
77             }
78             }
79              
80             1;
81              
82             __END__