From d5445bfc1d25067da7a5773b8f7f57f6d5541037 Mon Sep 17 00:00:00 2001 From: Graham Christensen Date: Sat, 28 Dec 2019 21:39:20 +0000 Subject: [PATCH] job: create a prometheus endpoint Export the most recent stop time and exit status in a prometheus-friendly format. --- src/lib/Hydra/Controller/Job.pm | 37 ++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/src/lib/Hydra/Controller/Job.pm b/src/lib/Hydra/Controller/Job.pm index 1147bc76..ba51616d 100644 --- a/src/lib/Hydra/Controller/Job.pm +++ b/src/lib/Hydra/Controller/Job.pm @@ -6,7 +6,7 @@ use warnings; use base 'Hydra::Base::Controller::ListBuilds'; use Hydra::Helper::Nix; use Hydra::Helper::CatalystUtils; - +use Net::Prometheus; sub job : Chained('/') PathPart('job') CaptureArgs(3) { my ($self, $c, $projectName, $jobsetName, $jobName) = @_; @@ -29,6 +29,41 @@ sub job : Chained('/') PathPart('job') CaptureArgs(3) { $c->stash->{project} = $c->stash->{job}->project; } +sub prometheus : Chained('job') PathPart('prometheus') Args(0) { + my ($self, $c) = @_; + my $job = $c->stash->{job}; + my $prometheus = Net::Prometheus->new; + + my $lastBuild = $job->builds->find( + { finished => 1 }, + { order_by => 'id DESC', rows => 1, columns => [@buildListColumns] } + ); + + $prometheus->new_counter( + name => "hydra_job_completion_time", + help => "The most recent job's completion time", + labels => [ "project", "jobset", "job", "nixname" ] + )->labels( + $c->stash->{project}->name, + $c->stash->{jobset}->name, + $c->stash->{job}->name, + $lastBuild->nixname, + )->inc($lastBuild->stoptime); + + $prometheus->new_gauge( + name => "hydra_job_failed", + help => "Record if the most recent version of this job failed (1 means failed)", + labels => [ "project", "jobset", "job", "nixname" ] + )->labels( + $c->stash->{project}->name, + $c->stash->{jobset}->name, + $c->stash->{job}->name, + $lastBuild->nixname, + )->inc($lastBuild->stoptime >= 0); + + $c->stash->{'plain'} = { data => $prometheus->render }; + $c->forward('Hydra::View::Plain'); +} sub overview : Chained('job') PathPart('') Args(0) { my ($self, $c) = @_;