From 6c528ae489269524aeacfb7bae05c5d871e38816 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladimir=20Vrzi=C4=87?= Date: Tue, 25 Oct 2022 18:26:19 +0200 Subject: [PATCH 1/2] Simple script to export metrics to Prometheus --- lrpm-prometheus-metrics.php | 63 +++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 lrpm-prometheus-metrics.php diff --git a/lrpm-prometheus-metrics.php b/lrpm-prometheus-metrics.php new file mode 100644 index 0000000..8f655eb --- /dev/null +++ b/lrpm-prometheus-metrics.php @@ -0,0 +1,63 @@ + $jobStatus) { + $config = $jobStatus['config']; + $state = $jobStatus['state']; + $name = $config['name']; + $workerClass = $config['workerClass']; + $mtime = $config['mtime']; + if (isset($state['restartAt']) && $state['restartAt'] > $state['startedAt']) { + $backoffDuration = $state['restartAt'] - $state['startedAt']; + $labels = [ + 'id' => $jobId, + 'name' => $name + ]; + if (isset($state['lastExitCode'])) $labels['last_exit_code'] = $state['lastExitCode']; + $metric = serialize_prometheus_metric('lrpm_task_backoff', $backoffDuration, $labels); + $output .= $metric . PHP_EOL; + } + } + + return $output; +} + +function get_number_of_active_tasks(array $status) +{ + $active_tasks = array_filter($status, function ($task) { + return isset($task['state']['pid']) && is_int($task['state']['pid']); + }); + return count($active_tasks); +} + +function serialize_prometheus_metric(string $name, $value, array $labels = [], $timestamp = null): string +{ + $output = $name; + if (!empty($labels)) { + $output .= '{'; + $sep = ''; + foreach ($labels as $labelName => $labelValue) { + $output .= $sep . $labelName . '=' . $labelValue; + $sep = ','; + } + $output .= '}'; + } + $output .= ' ' . $value; + if (isset($timestamp)) $output .= ' ' . $timestamp; + return $output; +} From 6147ac2387c6180d98c9cbde4a109912ed3b9d4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladimir=20Vrzi=C4=87?= Date: Tue, 25 Oct 2022 19:15:25 +0200 Subject: [PATCH 2/2] OO serialisation of Prometheus metrics --- lrpm-prometheus-metrics.php | 107 ++++++++++++++++++++++++------------ 1 file changed, 73 insertions(+), 34 deletions(-) diff --git a/lrpm-prometheus-metrics.php b/lrpm-prometheus-metrics.php index 8f655eb..850d542 100644 --- a/lrpm-prometheus-metrics.php +++ b/lrpm-prometheus-metrics.php @@ -1,20 +1,76 @@ name = $name; + $this->value = $value; + $this->labels = $labels; + $this->timestamp = $timestamp; + } + + public function __toString(): string + { + $output = $this->name; + if (!empty($this->labels)) { + $output .= '{'; + $sep = ''; + foreach ($this->labels as $labelName => $labelValue) { + $output .= $sep . $labelName . '=' . $labelValue; + $sep = ','; + } + $output .= '}'; + } + $output .= ' ' . $this->value; + if (isset($this->timestamp)) $output .= ' ' . $this->timestamp; + return $output; + } +} + +class PrometheusMetricsBuilder +{ + private $metrics = []; + private $text = ''; + + public function add(PrometheusMetric $metric): void + { + $this->metrics[] = $metric; + } + + public function __toString(): string + { + foreach ($this->metrics as $metric) { + $this->text .= $metric->__toString() . PHP_EOL; + } + return $this->text; + } +} + +function get_number_of_active_tasks(array $status): int +{ + $active_tasks = array_filter($status, function ($task) { + return isset($task['state']['pid']) && is_int($task['state']['pid']); + }); + return count($active_tasks); +} function lrpm_status_to_prometheus_metrics(array $status): string { + $metricsBuilder = new PrometheusMetricsBuilder(); + $taskCount = count($status); + $metricsBuilder->add(new PrometheusMetric('lrpm_task_count', $taskCount)); + $activeTaskCount = get_number_of_active_tasks($status); $inactiveTaskCount = $taskCount - $activeTaskCount; - $output = "lrpm_task_count $taskCount" . PHP_EOL; - $output .= "lrpm_inactive_task_count $inactiveTaskCount" . PHP_EOL; + $metricsBuilder->add(new PrometheusMetric('lrpm_inactive_task_count', $inactiveTaskCount)); foreach ($status as $jobId => $jobStatus) { $config = $jobStatus['config']; @@ -29,35 +85,18 @@ function lrpm_status_to_prometheus_metrics(array $status): string 'name' => $name ]; if (isset($state['lastExitCode'])) $labels['last_exit_code'] = $state['lastExitCode']; - $metric = serialize_prometheus_metric('lrpm_task_backoff', $backoffDuration, $labels); - $output .= $metric . PHP_EOL; + $metricsBuilder->add(new PrometheusMetric('lrpm_task_backoff', $backoffDuration, $labels)); } } - return $output; + return $metricsBuilder->__toString(); } -function get_number_of_active_tasks(array $status) -{ - $active_tasks = array_filter($status, function ($task) { - return isset($task['state']['pid']) && is_int($task['state']['pid']); - }); - return count($active_tasks); -} +// main entry point -function serialize_prometheus_metric(string $name, $value, array $labels = [], $timestamp = null): string -{ - $output = $name; - if (!empty($labels)) { - $output .= '{'; - $sep = ''; - foreach ($labels as $labelName => $labelValue) { - $output .= $sep . $labelName . '=' . $labelValue; - $sep = ','; - } - $output .= '}'; - } - $output .= ' ' . $value; - if (isset($timestamp)) $output .= ' ' . $timestamp; - return $output; -} +$program = __DIR__ . '/bin/lrpmctl'; +$request = 'jsonstatus'; +$json = shell_exec("$program $request"); +$status = json_decode($json, true); +$output = lrpm_status_to_prometheus_metrics($status); +echo($output);