#!/usr/bin/perl use strict; use warnings; use IO::Socket::INET; my $adminport = 5200; my $mcastport = 8650; my $sleep_time = 30; our $dry_run = 0; our $daemonize = 0; use Getopt::Long; Getopt::Long::GetOptions( 'd|daemon' => \$daemonize, 'dry-run' => \$dry_run, 'sleep=i' => \$sleep_time, ); MAIN: while(1) { my $addr = "127.0.0.1:$adminport"; my $sock = IO::Socket::INET->new(PeerAddr => "$addr", Timeout => 10); unless ($sock) { warn "Cannot connect to server ($addr)"; sleep 10; } my %stats; my %output; while(1) { $sock->write("counters\r\n") || next MAIN; while (my $line = $sock->getline || next MAIN) { last if $line =~ /^\./; $line =~ /^\s*(.+?)\s+(\d+)/; my ($key, $val) = ($1, $2); next unless($key); if (exists $stats{$key}) { if ($stats{$key} >= $val) { # someone reset a counter # or there where was no change $output{$key} = 0 if exists $output{$key}; } else { $output{$key} = (($val - $stats{$key}) / $sleep_time); $stats{$key} = $val; } } $stats{$key} = $val; } use Data::Dumper; print Dumper(\%output); foreach my $key (keys %output) { my $metric_key = $key; $metric_key =~ s/\W/_/g; run_command("gmetric","-n","dj-$metric_key", "-v" ,"$output{$key}", "-t", "int32","-u", "per sec", "-p$mcastport"); } $sock->write("stats\r\n") || next MAIN; while (my $line = $sock->getline || next MAIN) { last if $line =~ /^\./; $line =~ /^\s*(.+?)\s+([\d.]+)\s+([\w\/]+)/; my ($key, $val, $unit) = ($1, $2, $3); my $metric_key = $key; $metric_key =~ s/\W/_/g; run_command("gmetric","-n","dj-stat-$metric_key", "-v" ,"$val", "-t", "int32","-u", "$unit", "-p$mcastport"); } # special case connections # run_command("gmetric","-n","dj-connections", "-v" ,$stats{connect} - $stats{disconnect}, "-t", "int32","-u", "current", "-p$mcastport"); sleep $sleep_time; } # exit; } sub run_command { if($dry_run) { print "Would execute: . " . join(" ", @_) . "\n"; } else { system(@_) and die; } }