Net-Statsd-Server
view release on metacpan or search on metacpan
lib/Net/Statsd/Server/Backend/Rrdtool.pm view on Meta::CPAN
# vim: ts=2 sw=4 et
# Flush stats to RRDtool
#
# To enable this backend, include 'rrd' in the backends
# configuration array:
#
# backends: ['./backends/rrd']
# (if the config file is in the statsd folder)
#
# A sample configuration can be found in exampleRRDConfig.js
#
# This backend supports the following config options:
#
# path: root path of the RRD files (default: '/tmp')
#
package Net::Statsd::Server::Backend::Rrdtool;
use 5.010;
use strict;
use warnings;
use base qw(Net::Statsd::Server::Backend);
our $VERSION = '0.01';
our $CONFIG = { path => '/tmp' };
use Data::Dumper;
use File::Basename;
use File::Path;
use File::Spec;
# Not on CPAN, usually provided by 'rrdtool'
use RRDs;
my $debug = 0;
my $flushInterval;
my $rrdPath;
my $stats = {};
sub _dir_file {
my ($key) = @_;
my @key = split m{\.}, $key;
my $filename = join('/', @key) . '.rrd';
my $fullfile = File::Spec->catfile($CONFIG->{path}, $filename);
my $basename = File::Basename::basename($filename);
my $folder = File::Basename::dirname($fullfile);
#warn "folder=$folder base=$basename full=$fullfile\n";
return ($folder, $basename, $fullfile);
}
sub write_counter {
my ($self, @args) = @_;
return $self->_write_rrd('COUNTER', @args);
}
sub write_gauge {
my ($self, @args) = @_;
return $self->_write_rrd('GAUGE', @args);
}
sub _ds_name {
my ($self, $name) = @_;
if ($name) {
$name =~ s{\.rrd$}{};
}
my $rrd_name = substr($name, 0, 19);
return $rrd_name;
}
# With RRDs, so we can set our statsd-biased defaults
sub _rrd_create {
my ($self, $full_filename, $ds_name, $type) = @_;
if (! $ds_name || ! $type || ! $full_filename) {
die "Incorrect parameters to _rrd_create()";
}
if (-e $full_filename) {
return;
}
my $flush_interval = $CONFIG->{flushInterval} / 1000;
my %statsd_to_rrd_type = (
COUNTER => 'ABSOLUTE',
GAUGE => 'GAUGE',
TIMER => 'GAUGE', # Sadly, no timer type in RRD
);
my $ds_type = $statsd_to_rrd_type{$type};
my $min_value = $ds_type eq 'ABSOLUTE' ? 0 : 'U';
my $max_value = 'U';
my $ds_name = $self->_ds_name($ds_name);
my @rrd_spec = (
'-b' => "-${flush_interval}s",
'-s' => $flush_interval,
"DS:${ds_name}:${ds_type}:${flush_interval}:${min_value}:${max_value}",
);
my $xff = $CONFIG->{xff} || 0.5;
my @rra = (
[ 'AVERAGE', $xff, 10, 1 ], # 10=seconds, 1=days
( run in 0.469 second using v1.01-cache-2.11-cpan-71847e10f99 )