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 )