diff --git a/lib/Core/PostgresReplayLag.pm b/lib/Core/PostgresReplayLag.pm new file mode 100644 index 0000000000000000000000000000000000000000..dc38501b7b76ba0eec1b686a0588057f8704c87e --- /dev/null +++ b/lib/Core/PostgresReplayLag.pm @@ -0,0 +1,83 @@ +package Core::PostgresReplayLag; + +use strict; +use warnings; + +use base 'Resmon::Module'; + +use Time::Local; + +=pod + +=head1 NAME + +Core::PostgresReplayLag - Monitor postgres replay lag + +=head1 SYNOPSIS + + Core::PostgresReplayLag { + pg : logdir => /data/set/foo/pgdata/82/pg_log + } + +=head1 DESCRIPTION + +This module monitors how long it's been since a postgres replay log was +restored. + +=head1 CONFIGURATION + +=over + +=item check_name + +The check name is descriptive only in this check. It is not used for anything. + +=item logdir + +Postgres log directory + +=back + +=head1 METRICS + +=over + +=item lag + +The number of seconds since the last restore. + +=back + +=cut + +sub handler { + my $self = shift; + my $config = $self->{config}; # All configuration is in here + + opendir(my $dh, $config->{logdir}); + my @files = sort grep /^postgresql-[\d-]+_?\d*\.log$/, readdir($dh); + closedir($dh); + my $wallog = $files[-1]; + + open(my $fh, "<", "$config->{logdir}/$wallog"); + my @lines = grep(/LOG: restored log file/, <$fh>); + close($fh); + + if ($#lines < 0) { + return { "error" => ["Nothing restored", "s"] } + } + + my ($year,$month,$day,$hour,$min) = ( + $lines[-1] =~ /^(\d\d\d\d)-(\d\d)-(\d\d)\s(\d+):(\d+)/ ); + + my $restoretime = timelocal(0,$min,$hour,$day,$month-1,$year); + my $now = time(); + + my $lag = $now - $restoretime; + + return { + "lag" => [$lag, "i"] + }; +}; + +1;