#!/usr/bin/perl

use strict;
use warnings;
use open ':std', ':encoding(UTF-8)';

use JSON::XS;
use LWP::Simple;
use Capture::Tiny(qw/capture/);

my $id   = get 'http://169.254.169.254/latest/meta-data/instance-id';
my $ii   = [ capture { system("aws ec2 describe-instances --profile ec2cron --instance-ids $id") } ];
my $href = JSON::XS::decode_json( $ii->[0] );

my $name;
map { $name = $_->{'Value'} if $_->{'Key'} eq 'Name' } @{ $href->{'Reservations'}->[0]->{'Instances'}->[0]->{'Tags'} };
die "No name in tags for instances " if not defined $name;

my $capture = [ capture { system(qq{uptime|awk '{print \$11}'|tr -d ',\n'}) } ];
if ( $capture->[1] ) {
    chomp $capture->[1];
    print $capture->[1] . "\n";
    exit 1;
}
my $value = $capture->[0];

my $jsonInput = { 'Namespace' => 'RSSystem' };
my $data = {
    'MetricName' => 'SystemLoadAverage',
    'Unit'       => 'Count',
    'Value'      => $value * 1,
};
push @{ $data->{'Dimensions'} }, { 'Name' => 'InstanceId',   'Value' => $id };
push @{ $data->{'Dimensions'} }, { 'Name' => 'InstanceName', 'Value' => $name };
push @{ $jsonInput->{'MetricData'} }, $data;

my $aws_capture = [ capture { system( "aws cloudwatch put-metric-data --cli-input-json '" . encode_json($jsonInput) . "'" ) } ];
if ( $aws_capture->[2] ) {
    chomp $aws_capture->[1];
    print $aws_capture->[1] . "\n";
}
