File Coverage

blib/lib/Linux/GetPidstat/Writer/Mackerel.pm
Criterion Covered Total %
statement 71 78 91.0
branch 17 24 70.8
condition 6 10 60.0
subroutine 12 12 100.0
pod 0 3 0.0
total 106 127 83.4


line stmt bran cond sub pod time code
1             package Linux::GetPidstat::Writer::Mackerel;
2 15     15   106498 use 5.008001;
  15         46  
3 15     15   62 use strict;
  15         29  
  15         219  
4 15     15   49 use warnings;
  15         30  
  15         339  
5              
6 15     15   73 use Carp;
  15         18  
  15         662  
7 15     15   64 use Time::Piece;
  15         27  
  15         79  
8 15     15   5855 use WebService::Mackerel;
  15         513385  
  15         461  
9 15     15   118 use JSON::XS qw/decode_json encode_json/;
  15         30  
  15         3997  
10              
11             sub new {
12 14     14 0 17397 my ( $class, %opt ) = @_;
13              
14             my $mackerel = WebService::Mackerel->new(
15             api_key => $opt{mackerel_api_key},
16             service_name => $opt{mackerel_service_name},
17 14         109 );
18 14         2178 $opt{mackerel} = $mackerel;
19 14 50       58 $opt{mackerel_metric_key_prefix} = "" unless defined $opt{mackerel_metric_key_prefix};
20              
21 14         54 bless \%opt, $class;
22             }
23              
24             sub output {
25 7     7 0 3552 my ($self, $program_name, $metric_name, $metric) = @_;
26 7         31 my $graph_name = sprintf("custom.%s%s.%s", $self->{mackerel_metric_key_prefix}, $metric_name, $program_name);
27              
28 7         16 my $metric_type = $self->{mackerel_metric_type};
29 7 100       21 if ($self->{dry_run}) {
30             printf "(dry_run) mackerel post: type=%s, name=%s, time=%s, metric=%s\n",
31 1         6 $metric_type, $graph_name, $self->{now}->epoch, $metric;
32 1         92 return;
33             }
34              
35 6         10 my $res = do {
36 6 100       20 if ($metric_type eq "service") {
    100          
37             $self->{mackerel}->post_service_metrics([{
38             "name" => $graph_name,
39             "time" => $self->{now}->epoch,
40 4         20 "value" => $metric,
41             }]);
42             } elsif ($metric_type eq "host") {
43             $self->{mackerel}->post_host_metrics([{
44             "hostId" => $self->{mackerel_host_id},
45             "name" => $graph_name,
46             "time" => $self->{now}->epoch,
47 1         7 "value" => $metric,
48             }]);
49             } else {
50 1         147 croak "Invalid metric type of mackerel: type=$metric_type";
51             }
52             };
53              
54 5         4161 my $content = eval { decode_json $res; };
  5         69  
55 5 100       24 if (chomp $@) {
56 1         84 carp "Failed mackerel post $metric_type metrics: err=$@, res=$res";
57 1         63 return;
58             }
59              
60 4   100     48 my $is_success = $content->{success} || 0;
61 4 100 66     45 if ($is_success != JSON::true or $content->{error}) {
62 15     15   7903 use Data::Dumper;
  15         66798  
  15         4549  
63 1         14 local $Data::Dumper::Terse = 1;
64 1         4 local $Data::Dumper::Indent = 0;
65 1         9 carp "Failed mackerel post $metric_type metrics: res=" . Data::Dumper::Dumper($content);
66             }
67             }
68              
69             sub bulk_output {
70 6     6 0 24 my ($self, $ret_pidstats) = @_;
71              
72 6         22 my $metric_type = $self->{mackerel_metric_type};
73 6         10 my @request_stuffs;
74             # ex. backup_mysql => { cpu => 21.0 }
75 6         35 while (my ($program_name, $s) = each %$ret_pidstats) {
76 12         39 while (my ($metric_name, $metric) = each %$s) {
77 108         326 my $graph_name = sprintf("custom.%s%s.%s", $self->{mackerel_metric_key_prefix}, $metric_name, $program_name);
78             my %stuff = (
79             "name" => $graph_name,
80             "time" => $self->{now}->epoch,
81             "value" => $metric,
82 108 50       261 ($metric_type eq "host" ? (hostId => $self->{mackerel_host_id}) : ()),
83             );
84 108         1027 push @request_stuffs, \%stuff;
85             }
86             }
87              
88 6 100       24 if ($self->{dry_run}) {
89             printf "(dry_run) mackerel post: type=%s, time=%s, metric=%s\n",
90 2         13 $metric_type, $self->{now}->epoch, encode_json(\@request_stuffs);
91 2         259 return;
92             }
93              
94 4         11 my $res = do {
95 4 50       22 if ($metric_type eq "service") {
    0          
96 4         33 $self->{mackerel}->post_service_metrics(\@request_stuffs)
97             } elsif ($metric_type eq "host") {
98 0         0 $self->{mackerel}->post_host_metrics(\@request_stuffs)
99             } else {
100 0         0 croak "Invalid metric type of mackerel: type=$metric_type";
101             }
102             };
103              
104 4         315 my $content = eval { decode_json $res; };
  4         97  
105 4 50       16 if (chomp $@) {
106 0         0 carp "Failed mackerel post $metric_type metrics: err=$@, res=$res";
107 0         0 return;
108             }
109              
110 4   50     149 my $is_success = $content->{success} || 0;
111 4 50 33     68 if ($is_success != JSON::true or $content->{error}) {
112 15     15   152 use Data::Dumper;
  15         47  
  15         1655  
113 0           local $Data::Dumper::Terse = 1;
114 0           local $Data::Dumper::Indent = 0;
115 0           carp "Failed mackerel post $metric_type metrics: res=" . Data::Dumper::Dumper($content);
116             }
117             }
118              
119             1;
120             __END__