custom-prometheus-exporter/script.php
Jeroen De Meerleer f7f3cb9704
Refactored script for better readability
The code has been refactored to improve readability and maintainability. The main changes include removing unnecessary condition checks, simplifying the flow of control, and reorganizing the code blocks for better logical grouping. This should make it easier to understand and modify in the future.
2024-06-13 15:52:08 +02:00

136 lines
5.2 KiB
PHP

<?php
require 'vendor/autoload.php';
$configFile = getenv('CONFIG_FILE') ?: 'config.php';
$cacheFile = 'twig_cache/' . hash('murmur3f', $configFile);
if (file_exists($configFile)) {
require ($configFile);
} else {
echo ("Configuration file not found: " . $configFile);
exit(1);
}
if(file_exists($cacheFile)) {
$oldconfig = json_decode(file_get_contents($cacheFile), true);
} else {
$oldconfig = [];
}
foreach ($config as $key => &$metric) {
if (!isset($metric['submetrics'])) {
$metric['submetrics'] = [$metric];
}
foreach ($metric['submetrics'] as $subkey => &$submetric) {
$pid = pcntl_fork();
if ($pid > 0) {
$pids[] = $pid;
} else {
if (isset($submetric['command'])) {
$output = null;
$retval = null;
try {
exec($submetric['command'], $output, $retval);
$output = implode("\n", $output);
} catch (Exception $e) {
$output = '';
}
} elseif (isset($submetric['http'])) {
$client = new GuzzleHttp\Client();
$options = [];
$output = NULL;
if (isset($submetric['http']['proxy'])) {
$options['proxy'] = $submetric['http']['proxy'];
}
if (isset($submetric['http']['data']) && $submetric['http']['data'] == 'responsetime') {
$options['on_stats'] = function (GuzzleHttp\TransferStats $stats) use (&$output) {
$output = $stats->getTransferTime();
};
}
$hasresponse = NULL;
try {
$res = $client->request('GET', $submetric['http']['url'], $options);
$hasresponse = true;
} catch (GuzzleHttp\Exception\GuzzleException $e) {
if (method_exists($e, 'getResponse')) {
$res = $e->getResponse();
$hasresponse = true;
} else {
$hasresponse = false;
}
}
if (isset($submetric['http']['data']) && $submetric['http']['data'] == 'responsebody') {
if ($hasresponse) {
$output = $res->getBody()->getContents();
} else {
$output = '';
}
} elseif ((isset($submetric['http']['statuscode'])) && (isset($submetric['http']['data']) && $submetric['http']['data'] == 'hasresponse')) {
if ($hasresponse) {
$output = $output = (int)in_array($res->getStatusCode(), $submetric['http']['statuscode']);;
} else {
$output = 0;
}
} elseif (isset($submetric['http']['data']) && $submetric['http']['data'] == 'hasresponse') {
$output = (int)$hasresponse;
}
}
if (isset($submetric['jsonelem'])) {
$submetric['value'] = getArrayValue($submetric['jsonelem'], json_decode($output, true));
} else {
$submetric['value'] = $output;
}
if (is_bool($submetric['value'])) $submetric['value'] = $submetric['value'] ? 1 : 0;
file_put_contents('/tmp/.metrics.' . $key . '.' . $subkey, $submetric['value']);
exit();
}
}
}
foreach ($pids as $pid) {
pcntl_waitpid($pid, $none);
}
foreach ($config as $key => &$metric) {
foreach ($metric['submetrics'] as $subkey => &$submetric) {
$submetric['value'] = file_get_contents('/tmp/.metrics.' . $key . '.' . $subkey);
if (!empty($oldconfig) && !isset($submetric['value']) && (isset($submetric['fallback']) && !empty($submetric['fallback']))) {
if (!isset($submetric['fallback']['maxage']) || time() < ($oldconfig[$key]['submetrics'][$subkey]['time'] + $submetric['fallback']['maxage'])) {
if ($submetric['fallback']['type'] == 'previous') {
$submetric['value'] = $oldconfig[$key]['submetrics'][$subkey]['value'];
} elseif ($submetric['fallback']['type'] == 'static') {
$submetric['value'] = $submetric['fallback']['value'];
}
$submetric['time'] = $oldconfig[$key]['submetrics'][$subkey]['time'];
} else {
$submetric['value'] = '';
$submetric['time'] = 0;
}
} else {
$submetric['time'] = time();
}
unlink('/tmp/.metrics.' . $key . '.' . $subkey);
}
}
file_put_contents($cacheFile, json_encode($config, JSON_PRETTY_PRINT));
$loader = new \Twig\Loader\FilesystemLoader('templates');
$twig = new \Twig\Environment($loader, [
'cache' => 'twig_cache',
]);
echo $twig->render('metrics.twig', ['config' => $config]);
function getArrayValue($elem, $array) {
$elem = explode('.', $elem);
$new_array = $array;
foreach ($elem as $i) {
if(empty($new_array)) break;
$new_array = $new_array[$i];
}
return $new_array;
}