Algorithm-EventsPerSecond
view release on metacpan or search on metacpan
lib/Algorithm/EventsPerSecond/Sukkal.pm view on Meta::CPAN
package Algorithm::EventsPerSecond::Sukkal;
use 5.006;
use strict;
use warnings;
use Errno qw(EAGAIN EWOULDBLOCK EINTR);
use IO::Select;
use IO::Socket::UNIX;
use Socket qw(SOCK_STREAM);
use Algorithm::EventsPerSecond;
=encoding utf8
=head1 NAME
Algorithm::EventsPerSecond::Sukkal - A unix-socket daemon serving per-key sliding-window event rates.
=head1 VERSION
Version 0.1.0
=cut
our $VERSION = '0.1.0';
# per-connection buffer ceilings: a single line may not span more than
# _RBUF_MAX, and a client that stops reading is dropped once _WBUF_MAX
# of replies have queued up
use constant {
_RBUF_MAX => 1024 * 1024,
_WBUF_MAX => 8 * 1024 * 1024,
_READ_CHUNK => 65536,
};
=head1 SYNOPSIS
use Algorithm::EventsPerSecond::Sukkal;
my $sukkal = Algorithm::EventsPerSecond::Sukkal->new(
socket => '/var/run/iqbi-damiq.sock',
window => 60,
);
$SIG{TERM} = $SIG{INT} = sub { $sukkal->stop };
$sukkal->run; # blocks until stop()
Then, from any client:
use IO::Socket::UNIX;
my $sock = IO::Socket::UNIX->new(
Type => SOCK_STREAM,
Peer => '/var/run/iqbi-damiq.sock',
);
print $sock "MARK requests\n"; # fire and forget
print $sock "MARK errors 3\n";
print $sock "RATE requests\n";
my $reply = <$sock>; # "OK 41.2\n"
print $sock "MARKRATE requests\n"; # mark and rate in one call
my $rate = <$sock>; # "OK 41.3\n"
=head1 DESCRIPTION
A sukkal is the vizier-messenger of a Mesopotamian court: petitioners
speak to it, and it relays word of them to the throne. This sukkal
listens on a unix stream socket, records events marked against
arbitrary client-chosen keys, and answers queries about their rates.
Each key gets its own L<Algorithm::EventsPerSecond> meter, so C<mark>
( run in 3.799 seconds using v1.01-cache-2.11-cpan-600a1bdf6e4 )