#!/usr/bin/env perl

# Parameters supported:       
#                             
# config                      
# autoconf                    
#                             
# Magic markers:              
#%# family=auto               
#%# capabilities=autoconf     
                              
use strict;                   
use warnings;                 
use LWP;                      
use JSON qw/decode_json/;     
                              
=head1 NAME                   
                              
elasticsearch_jvm - A munin plugin that collects stats from the JVM of your elasticsearch instances
                              
=head1 APPLICABLE SYSTEMS     
                              
ElasticSearch                 
                              
=head1 CONFIGURATION

None

=head1 BUGS

None known so far. If you find any, let me know.

=head1 AUTHOR

Tomas Doran (t0m) - c<< <bobtfish@bobtfish.net> >>

=cut

my $host = 'localhost';

my $ua = LWP::UserAgent->new;
$ua->timeout(10);

sub get_json_from_url {
    my $uri = shift;
    my $res = $ua->get($uri, 'Content-Type' => 'application/json' );
    Carp::confess($res->code . " for " . $uri) unless $res->is_success;
    my $data = do { local $@; eval { decode_json($res->content) } };
    die("Could not decode JSON from: " . $res->content) unless $data;
    return $data;
}

my $data = get_json_from_url("http://$host:9200/_cluster/nodes");
my %out;

foreach my $full_node_name (keys %{$data->{nodes}}) {
    foreach my $name (grep { /_in_bytes$/ } keys %{ $data->{nodes}{$full_node_name}{jvm}{mem} }) {
        my ($dname) = $name =~ m/(.+)_in_bytes$/;
        $out{$dname} = $data->{nodes}{$full_node_name}{jvm}{mem}{$name};
    }
}
if ($ARGV[0] and $ARGV[0] eq 'config') {
    print "graph_args --base 1024\n";
    print "graph_title ElasticSearch JVM memory\n";
    print "graph_category elasticsearch\n";
    print "graph_vlabel Bytes\n";

    foreach my $name (keys %out) {
        print "$name.label $name\n"."$name.type GAUGE\n";
    }
}
elsif (!$ARGV[0] || $ARGV[0] eq 'autoconf') {
    foreach my $name (keys %out) {
        print "$name.value " . $out{$name} . "\n";
    }
}

exit(0);