Skip to content

Commit 9bc42a6

Browse files
committed
Simple script to export metrics to Prometheus
1 parent 2ccf3a4 commit 9bc42a6

1 file changed

Lines changed: 63 additions & 0 deletions

File tree

lrpm-prometheus-metrics.php

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
<?php
2+
# php -S 127.0.0.1:8080 lrpm-prometheus-metrics.php
3+
4+
$program = __DIR__ . '/bin/lrpmctl';
5+
$request = 'jsonstatus';
6+
$json = shell_exec("$program $request");
7+
$status = json_decode($json, true);
8+
$output = lrpm_status_to_prometheus_metrics($status);
9+
echo($output);
10+
11+
function lrpm_status_to_prometheus_metrics(array $status): string
12+
{
13+
$taskCount = count($status);
14+
$activeTaskCount = get_number_of_active_tasks($status);
15+
$inactiveTaskCount = $taskCount - $activeTaskCount;
16+
$output = "lrpm_task_count $taskCount" . PHP_EOL;
17+
$output .= "lrpm_inactive_task_count $inactiveTaskCount" . PHP_EOL;
18+
19+
foreach ($status as $jobId => $jobStatus) {
20+
$config = $jobStatus['config'];
21+
$state = $jobStatus['state'];
22+
$name = $config['name'];
23+
$workerClass = $config['workerClass'];
24+
$mtime = $config['mtime'];
25+
if (isset($state['restartAt']) && $state['restartAt'] > $state['startedAt']) {
26+
$backoffDuration = $state['restartAt'] - $state['startedAt'];
27+
$labels = [
28+
'id' => $jobId,
29+
'name' => $name
30+
];
31+
if (isset($state['lastExitCode'])) $labels['last_exit_code'] = $state['lastExitCode'];
32+
$metric = serialize_prometheus_metric('lrpm_task_backoff', $labels, $backoffDuration);
33+
$output .= $metric . PHP_EOL;
34+
}
35+
}
36+
37+
return $output;
38+
}
39+
40+
function get_number_of_active_tasks(array $status)
41+
{
42+
$active_tasks = array_filter($status, function ($task) {
43+
return isset($task['state']['pid']) && is_int($task['state']['pid']);
44+
});
45+
return count($active_tasks);
46+
}
47+
48+
function serialize_prometheus_metric(string $name, array $labels, $value, $timestamp = null): string
49+
{
50+
$output = $name;
51+
if (!empty($labels)) {
52+
$output .= '{';
53+
$sep = '';
54+
foreach ($labels as $labelName => $labelValue) {
55+
$output .= $sep . $labelName . '=' . $labelValue;
56+
$sep = ',';
57+
}
58+
$output .= '}';
59+
}
60+
$output .= ' ' . $value;
61+
if (isset($timestamp)) $output .= ' ' . $timestamp;
62+
return $output;
63+
}

0 commit comments

Comments
 (0)