File Coverage

blib/lib/App/RedisTop/Component.pm
Criterion Covered Total %
statement 73 103 70.8
branch 23 38 60.5
condition 4 14 28.5
subroutine 11 14 78.5
pod 0 13 0.0
total 111 182 60.9


line stmt bran cond sub pod time code
1             package App::RedisTop::Component;
2 2     2   2036 use Term::ANSIColor qw/colored/;
  2         8683  
  2         3041  
3              
4             sub new {
5 0     0 0 0 my $class = shift;
6              
7 0         0 my %args = @_;
8 0         0 my $self = bless {
9             redis_config => $args{redis_config},
10             }, $class;
11             }
12              
13             sub redis_config {
14 15     15 0 2830 my ($self, $value) = @_;
15 15 100       29 if($value) {
16 9         52 $self->{redis_config} = $value;
17             }
18 15         55 return $self->{redis_config};
19             }
20              
21             sub stat_values {
22 8     8 0 11 my ($self, $stat, $prev_stat) = @_;
23 8         8 my @results;
24 8         10 for my $row (@{$self->{items}}) {
  8         18  
25 14 100       40 my $stat_key = ref $row->{stat_key} eq 'CODE' ? $row->{stat_key}->($stat->{redis_version}) : $row->{stat_key};
26 14         12 my $value;
27 14 100       37 if ($row->{diff}) {
    100          
    50          
28 6   50     14 my $prev_uptime = $prev_stat->{uptime_in_seconds} || 0;
29 6   50     15 my $prev_value = $prev_stat->{$stat_key} || 0;
30 6         7 eval {
31 6         15 $value
32             = ( $stat->{$stat_key} - $prev_value )
33             / ( $stat->{uptime_in_seconds} - $prev_uptime);
34             };
35 6 50       12 if ($@) {
36 0         0 $value = $stat->{$stat_key};
37             }
38             } elsif($row->{denominator_key}) {
39 2 50 33     5 if($self->redis_config && $self->redis_config->{$row->{denominator_key}}) {
40 2         7 $value = sprintf("%.2f", ($stat->{$stat_key} / $self->redis_config->{$row->{denominator_key}}) * 100);
41             } else {
42 0         0 $value = "-1";
43             }
44             } elsif($row->{data}) {
45 0         0 $value = $row->{data}->();
46             } else {
47 6         19 $value = $stat->{$stat_key};
48             }
49 14         34 push @results, $value;
50             }
51 8         21 return @results;
52             }
53              
54             sub unit {
55 12     12 0 21 my ($self, $value) = @_;
56 12   50     25 $value ||= 0;
57              
58 12         13 my $round = '';
59 12         25 my @units = qw/K M G T P/;
60 12         22 unshift @units, ' ';
61 12         15 for my $unit (@units) {
62 15 100       36 if($value / 1000 < 1) {
63 12 100       40 $round = 2 if index($value, '.') > 0; # float
64 12         64 return sprintf("%.${round}f%s", $value, $unit);
65             }
66 3         4 $value = $value / 1000;
67 3         5 $round = 2;
68             }
69             }
70              
71 18     18 0 289 sub separator { colored("|", "blue") }
72              
73             sub header {
74 9     9 0 62 my ($self) = @_;
75 9         13 my $title = $self->{group};
76 9         54 my $diff = $self->component_width - length($title);
77 9         18 my $left = $diff / 2;
78 9         14 my $right = $diff - $left;
79              
80 9         22 my $line = '-' x $left . $title . '-' x $right;
81 9         10 my $line_len = length($line);
82 9 100       16 if($line_len > $self->component_width-1) {
    50          
83 3         7 $line = substr($line, 0, length($line)-1);
84             } elsif($line_len < $self->component_width-1) {
85 0         0 $line .= '-';
86             }
87 9         31 return colored("${line} ", "blue");
88             }
89              
90             sub sub_header {
91 9     9 0 3689 my ($self) = @_;
92 9         26 my $format = "%" . $self->{width} . "s";
93 9         11 my $line = join(' ', map { sprintf($format, $_->{name}) } @{$self->{items}});
  16         60  
  9         18  
94 9         28 return colored("${line}", "cyan") . $self->separator;
95             }
96              
97             sub line {
98 48     48 0 61 my ($self, $spt) = @_;
99 48         48 my $item_len = scalar @{$self->{items}};
  48         76  
100 48         80 my $line = join(' ', map { $spt x $self->{width} } 1..$item_len);
  84         208  
101 48         142 return colored("${line} ", "blue");
102             }
103              
104             sub component_width {
105 24     24 0 28 my ($self) = @_;
106 24         64 my $line = $self->line('-');
107 24         600 return length($self->colorstrip($self->line('-')));
108             }
109              
110             sub colorstrip {
111 24     24 0 571 my ($self, @string) = @_;
112 24         33 for my $string (@string) {
113 24         151 $string =~ s{ \e\[ [\d;]* m }{}xmsg;
114             }
115 24 50       109 return wantarray ? @string : join q{}, @string;
116             }
117              
118             sub body {
119 9     9 0 3202 my ($self, $stat, $prev_stat) = @_;
120 9         9 my @cols;
121 9         49 for my $value ($self->stat_values($stat, $prev_stat)) {
122 16 100       60 my $stat = ($self->{unit}) ? $self->unit($value) : $value;
123 16 100       45 my $format = ($self->{round}) ? "%" . $self->{width} . ".1f" : "%" . $self->{width} . "s" ;
124 16         55 push @cols, sprintf($format, $stat);
125             }
126 9         21 my $line = join(' ', @cols);
127 9         79 return $line . $self->separator;
128             }
129              
130             sub average {
131 0     0 0   my ($self, $values, $instance_count) = @_;
132 0   0       $values ||= [ map { '' } @{$self->{items}} ];
  0            
  0            
133              
134 0           my @cols;
135 0           for my $value (@$values) {
136 0           my $avg_value = 0;
137 0 0 0       $avg_value = $value / $instance_count if $value && $instance_count;
138              
139 0 0         my $stat = ($self->{unit}) ? $self->unit($avg_value) : $avg_value;
140 0 0         my $format = ($self->{round}) ? "%" . $self->{width} . ".1f" : "%" . $self->{width} . "s" ;
141 0           push @cols, sprintf($format, $stat);
142             }
143 0           my $line = join(' ', @cols);
144 0           return $line . $self->separator;
145             }
146              
147             sub total {
148 0     0 0   my ($self, $values) = @_;
149              
150 0           my @cols;
151 0           for my $value (@$values) {
152 0           my $stat = '';
153 0 0         if($self->{total}){
154 0 0         $stat = ($self->{unit}) ? $self->unit($value) : $value;
155             }
156 0           my $format = "%" . $self->{width} . "s";
157 0           push @cols, sprintf($format, $stat);
158             }
159 0           my $line = join(' ', @cols);
160 0           return $line . $self->separator;
161             }
162              
163             1;