#!/usr/bin/perl

use strict;
use warnings;

use FindBin;
use lib "$FindBin::Bin/../../lib";
use Wigo::Probe qw/:all/;

###
# DEFAULT CONFIG
###

my $conf = {
    'warnLevel'     => 75,
    'critLevel'     => 90,
    'wantedFields'  => ['SwapFree','SwapTotal','Cached','MemTotal','MemFree'],
};

init( config => $conf );

if ( ! open MEMINFO, '<', '/proc/meminfo' )
{
    status  500;
    message "Error while fetching meminfo : " . $!;
    output 1;
}
my @meminfo = <MEMINFO>;
close MEMINFO;

my %values = map { chomp; $_ =~ /(.*):\s+(.*) [\w]+/ } @meminfo;
foreach my $key ( keys %values )
{
    if ( grep { $_ eq $key } @{ config->{'wantedFields'} } )
    {
        my $value   = $values{ $key } || 0;
        my $Metric  = {
            Tags    => { type => $key },
            Value   => $value,
        };

        add_metric $Metric;
    }
}

my $realFree         = $values{'MemFree'} + $values{'Cached'} + $values{'Buffers'};
my $realUsed         = $values{'MemTotal'} - $realFree;
my $usePercentage    = sprintf( "%.2f", $realUsed * 100 / $values{'MemTotal'});

message "Current memory usage is $usePercentage%";

if ( $usePercentage > config->{'critLevel'} )
{
    raise 300;
}
elsif ( $usePercentage > config->{'warnLevel'} )
{
    raise 200;
}

# Add MemUsed
add_metric { Tags => { type => "MemUsed" },     Value   => $realUsed };
add_metric { Tags => { type => "MemRealFree" }, Value   => $realFree };
add_metric { Tags => { type => "MemUsedPct" }, Value    => $usePercentage };

output 0;