File Coverage

blib/lib/Mojolicious/Plugin/Statsd.pm
Criterion Covered Total %
statement 38 43 88.3
branch 8 10 80.0
condition 6 7 85.7
subroutine 13 15 86.6
pod 8 8 100.0
total 73 83 87.9


line stmt bran cond sub pod time code
1             package Mojolicious::Plugin::Statsd;
2              
3 2     2   1558777 use v5.16;
  2         7  
4              
5 2     2   10 use Mojo::Base 'Mojolicious::Plugin';
  2         2  
  2         18  
6              
7 2     2   550 use Mojo::Loader;
  2         3  
  2         83  
8 2     2   8 use Time::HiRes qw(gettimeofday tv_interval);
  2         4  
  2         14  
9              
10             our $VERSION = '0.06';
11              
12             has adapter => undef;
13             has prefix => '';
14              
15             sub register {
16 6     6 1 40401 my ($self, $app, $conf) = @_;
17              
18 6   100     32 $self->_load_adapter(($conf->{adapter} // 'Statsd'), $conf);
19              
20 6   66     84 $self->{prefix} = $conf->{prefix} // $app->moniker . q[.];
21              
22 6   100 6   124 $app->helper(($conf->{helper} // 'stats') => sub {$self});
  6         7247  
23             }
24              
25             sub _load_adapter {
26 6     6   11 my ($self, $adapter, $conf) = @_;
27              
28 6 100       15 return $self->adapter($adapter) if ref $adapter;
29              
30 5         9 my $class = sprintf('%s::Adapter::%s', ref $self, $adapter);
31 5         10 my $err = Mojo::Loader::load_class $class;
32              
33 5 50       67 if (ref $err) {
34 0         0 die "Loading adapter $class failed: $err";
35             }
36              
37 5         39 $self->adapter($class->new(%$conf));
38             }
39              
40             sub with_prefix {
41 2     2 1 2014 my ($self, $add_prefix) = @_;
42              
43 2         11 (ref $self)->new(%$self, prefix => $self->prefix . $add_prefix);
44             }
45              
46             sub counter {
47 5     5 1 19 my ($self, $name, @args) = @_;
48              
49 5         20 $self->adapter->counter($self->_prepare_names($name), @args);
50             }
51              
52             sub increment {
53 2     2 1 436 (shift)->counter(shift, 1, shift);
54             }
55              
56             sub decrement {
57 1     1 1 5 (shift)->counter(shift, -1, shift);
58             }
59              
60             sub timing {
61 3     3 1 13 my ($self, $name, @args) = @_;
62              
63 3 50       13 my ($time, $sample_rate) = ref $args[1] ? reverse(@args) : @args;
64              
65 3 100       14 if (ref $time eq 'CODE') {
66 1         7 my @start = gettimeofday();
67 1         5 $time->();
68 1         140 $time = int(tv_interval(\@start) * 1000);
69             }
70              
71 3         32 $self->adapter->timing($self->_prepare_names($name), $time, $sample_rate);
72             }
73              
74             sub gauge {
75 0     0 1 0 my ($self, $name, $value) = @_;
76              
77 0         0 $self->adapter->gauge($self->_prepare_names($name), $value);
78             }
79              
80             sub set_add {
81 0     0 1 0 my ($self, $name, @values) = @_;
82              
83 0         0 $self->adapter->set_add($self->_prepare_names($name), @values);
84             }
85              
86             sub _prepare_names {
87 8     8   56 my ($self, $names) = @_;
88              
89 8 100       26 return [map { $self->prefix . $_ } ref($names) ? @$names : $names];
  9         33  
90             }
91              
92             1;
93              
94             # ABSTRACT: Emit to Statsd, easy!
95              
96             __END__