Send queue runner stats to statsd

This is currently done by a separate program that periodically
calls "hydra-queue-runner --status". Eventually, I'll do this
in the queue runner directly.

Fixes #220.
This commit is contained in:
Eelco Dolstra 2015-06-23 14:54:34 +02:00
parent af5cbe97aa
commit 62219adaf3
2 changed files with 61 additions and 0 deletions

View file

@ -81,6 +81,18 @@ in rec {
#nix = nixUnstable; #nix = nixUnstable;
NetStatsd = buildPerlPackage {
name = "Net-Statsd-0.11";
src = fetchurl {
url = mirror://cpan/authors/id/C/CO/COSIMO/Net-Statsd-0.11.tar.gz;
sha256 = "0f56c95846c7e65e6d32cec13ab9df65716429141f106d2dc587f1de1e09e163";
};
meta = {
description = "Sends statistics to the stats daemon over UDP";
license = "perl";
};
};
perlDeps = buildEnv { perlDeps = buildEnv {
name = "hydra-perl-deps"; name = "hydra-perl-deps";
paths = with perlPackages; paths = with perlPackages;
@ -116,6 +128,7 @@ in rec {
LWP LWP
LWPProtocolHttps LWPProtocolHttps
NetAmazonS3 NetAmazonS3
NetStatsd
PadWalker PadWalker
Readonly Readonly
SQLSplitStatement SQLSplitStatement

48
src/script/hydra-send-stats Executable file
View file

@ -0,0 +1,48 @@
#! /run/current-system/sw/bin/perl
use strict;
use utf8;
use Net::Statsd;
use JSON;
STDERR->autoflush(1);
binmode STDERR, ":encoding(utf8)";
sub gauge {
my ($name, $val) = @_;
die unless defined $val;
Net::Statsd::gauge($name, $val);
}
sub sendQueueRunnerStats {
my $s = `hydra-queue-runner --status`;
die "cannot get queue runner stats\n" if $? != 0;
my $json = decode_json($s) or die "cannot decode queue runner status";
return if $json->{status} ne "up";
gauge("hydra.queue.steps.active", $json->{nrActiveSteps});
gauge("hydra.queue.steps.building", $json->{nrStepsBuilding});
gauge("hydra.queue.steps.runnable", $json->{nrRunnableSteps});
gauge("hydra.queue.steps.unfinished", $json->{nrUnfinishedSteps});
gauge("hydra.queue.steps.finished", $json->{nrStepsDone});
gauge("hydra.queue.steps.retries", $json->{nrRetries});
gauge("hydra.queue.steps.max_retries", $json->{maxNrRetries});
if ($json->{nrStepsDone}) {
gauge("hydra.queue.steps.avg_total_time", $json->{avgStepTime});
gauge("hydra.queue.steps.avg_build_time", $json->{avgStepBuildTime});
}
gauge("hydra.queue.builds.read", $json->{nrBuildsRead});
gauge("hydra.queue.builds.unfinished", $json->{nrQueuedBuilds});
gauge("hydra.queue.builds.finished", $json->{nrBuildsDone});
gauge("hydra.queue.checks", $json->{nrQueueWakeups});
}
while (1) {
eval { sendQueueRunnerStats(); };
if ($@) { warn "$@"; }
sleep(30);
}