File Coverage

blib/lib/AnyEvent/Monitor.pm
Criterion Covered Total %
statement 21 55 38.1
branch 0 14 0.0
condition 0 2 0.0
subroutine 11 19 57.8
pod n/a
total 32 90 35.5


line stmt bran cond sub pod time code
1             package AnyEvent::Monitor;
2 2     2   27732 use 5.10.1;
  2         6  
  2         97  
3 2     2   3325 use AnyEvent;
  2         13586  
  2         75  
4 2     2   2237 use Method::Signatures::Simple;
  2         73362  
  2         19  
5 2     2   3189 use Any::Moose;
  2         89828  
  2         15  
6              
7             our $VERSION = '0.32';
8              
9             has on_softfail => ( is => "ro", isa => "CodeRef" );
10             has on_hardfail => ( is => "ro", isa => "CodeRef" );
11             has on_resume => ( is => "ro", isa => "CodeRef" );
12             has on_fatal => ( is => "ro", isa => "CodeRef" );
13             has status => ( is => "rw", isa => "Str", default => sub {''} );
14             has timer => ( is => 'ro', isa => 'HashRef', default => sub { {} } );
15             has soft_timeout => ( is => 'rw', isa => 'Num', default => sub { 10 } );
16             has hard_timeout => ( is => 'rw', isa => 'Num', default => sub { 45 } );
17              
18             has fail_detected => ( is => 'rw', isa => 'Num' );
19              
20 2     2   2828 method BUILD {
  0     0      
  0            
21 0           $self->install_timers(0);
22             };
23              
24 2     2   965 method install_timers($delay) {
  0     0      
  0            
  0            
25 0           $self->install_timer( soft => $delay + $self->soft_timeout );
26 0           $self->install_timer( hard => $delay + $self->hard_timeout );
27             }
28              
29 2     2   791 method install_timer($which, $after) {
  0     0      
  0            
  0            
30 0           my $method = "${which}fail";
31             $self->timer->{$which} = AnyEvent->timer(after => $after,
32             cb => sub {
33 0 0   0     $self->fail_detected(AnyEvent->now) unless $self->fail_detected;
34 0           $self->$method();
35             },
36 0           );
37             }
38              
39 2     2   876 method heartbeat($timestamp, $status) {
  0     0      
  0            
  0            
40 0 0         if ($status eq 'normal') {
41 0           $self->install_timers($timestamp - AnyEvent->now);
42 0 0         if ($self->status ne 'normal') {
43 0 0         my $outage = $self->fail_detected ? AnyEvent->now - $self->fail_detected : 0;
44 0           $self->fail_detected(0);
45              
46 0           $self->on_resume->($self->status, $outage);
47             }
48             }
49 0           $self->status($status);
50             }
51              
52 2     2   882 method softfail {
  0     0      
  0            
53 0 0         $self->status('soft timeout')
54             if $self->status eq 'normal';
55 0           $self->on_softfail->();
56             }
57              
58 2     2   648 method hardfail {
  0     0      
  0            
59 0 0         $self->status('hard timeout')
60             if $self->status eq 'normal';
61             $self->on_hardfail->(sub {
62 0 0 0 0     $self->install_timers(shift || 60)
63             unless $self->status eq 'normal'
64 0           });
65             }
66              
67             __PACKAGE__->meta->make_immutable;
68 2     2   281 no Any::Moose;
  2         5  
  2         14  
69             1;
70             __END__