File Coverage

blib/lib/Linux/GetPidstat.pm
Criterion Covered Total %
statement 57 58 98.2
branch 16 18 88.8
condition 11 15 73.3
subroutine 11 11 100.0
pod 1 2 50.0
total 96 104 92.3


line stmt bran cond sub pod time code
1             package Linux::GetPidstat;
2 13     13   1090348 use 5.008001;
  13         50  
3 13     13   63 use strict;
  13         13  
  13         221  
4 13     13   40 use warnings;
  13         25  
  13         408  
5              
6             our $VERSION = "0.09";
7              
8 13     13   51 use Carp;
  13         32  
  13         720  
9 13     13   3781 use Time::Piece::MySQL;
  13         97811  
  13         54  
10              
11 13     13   3924 use Linux::GetPidstat::Reader;
  13         27  
  13         328  
12 13     13   3130 use Linux::GetPidstat::Collector;
  13         28  
  13         316  
13 13     13   2903 use Linux::GetPidstat::Writer;
  13         62  
  13         6369  
14              
15             sub new {
16 12     12 0 5519 my $class = shift;
17 12         28 bless {}, $class;
18             }
19              
20             sub run {
21 46     46 1 215727 my ($self, %args) = @_;
22              
23 46         355 $self->_validate_args(%args);
24              
25 46         98 my $pid_dir_path = $args{pid_dir};
26 46         74 my $datetime;
27 46 50       147 unless (length $args{datetime}) {
28 0         0 $datetime = localtime;
29             } else {
30 46         244 $datetime = localtime->from_mysql_datetime($args{datetime});
31             }
32              
33             my $program_pid_mapping = Linux::GetPidstat::Reader->new(
34             pid_dir => $pid_dir_path,
35             include_child => $args{include_child},
36             max_child_limit => $args{max_child_limit},
37 46         8675 )->get_program_pid_mapping;
38              
39 46 100       580 unless (@$program_pid_mapping) {
40 11         682 croak "Not found pids in pid_dir: $pid_dir_path";
41             }
42              
43             my $ret_pidstats = Linux::GetPidstat::Collector->new(
44             interval => $args{interval},
45             count => $args{count},
46 35         596 )->get_pidstats_results($program_pid_mapping);
47              
48 25 100       11578 unless (%$ret_pidstats) {
49 9         2520 croak "Failed to collect metrics";
50             }
51              
52             Linux::GetPidstat::Writer->new(
53             res_file => $args{res_file},
54             mackerel_metric_type => $args{mackerel_metric_type},
55             mackerel_api_key => $args{mackerel_api_key},
56             mackerel_service_name => $args{mackerel_service_name},
57             mackerel_metric_key_prefix => $args{mackerel_metric_key_prefix},
58             mackerel_host_id => $args{mackerel_host_id},
59             now => $datetime,
60             dry_run => $args{dry_run},
61 16         528 )->output($ret_pidstats);
62             }
63              
64             sub _validate_args {
65 134     134   84325 my ($self, %args) = @_;
66              
67 134 100       419 unless (length $args{pid_dir}) {
68 11         1375 croak("pid_dir required");
69             }
70              
71 123         234 my $mackerel_metric_type = $args{mackerel_metric_type};
72 123         162 my $mackerel_api_key = $args{mackerel_api_key};
73 123         167 my $mackerel_service_name = $args{mackerel_service_name};
74 123 100 100     495 if (length $mackerel_metric_type && $mackerel_metric_type eq "service") {
75 41 100 66     216 unless (length $mackerel_api_key &&
76             length $mackerel_service_name) {
77 11         682 croak("when mackerel_metric_type is 'service', mackerel_[api_key|service_name] are required");
78             }
79 30         79 return;
80             }
81              
82 82         129 my $mackerel_host_id = $args{mackerel_host_id};
83 82 100 66     237 if (length $mackerel_metric_type && $mackerel_metric_type eq "host") {
84 22 50 66     77 unless (length $mackerel_api_key &&
      66        
85             length $mackerel_service_name &&
86             length $mackerel_host_id) {
87 11         671 croak("when mackerel_metric_type is 'host', mackerel_[api_key|service_name|host_id] are required");
88             }
89 11         44 return;
90             }
91              
92 60         116 my $res_file = $args{res_file};
93 60 100       288 if (length $res_file) {
94 49         337 return;
95             }
96              
97 11         748 croak("res_file or mackerel_metric_type required");
98             }
99              
100             1;
101             __END__