From b0e9ec65a0712e13ba404cd4133ad82b7f2c3677 Mon Sep 17 00:00:00 2001 From: lub Date: Thu, 26 Dec 2019 03:43:34 +0100 Subject: [PATCH] add ts3_up metric to signal failed query connection --- src/help.php | 1 + src/metrics.php | 88 +++++++++++++++++++++++++++---------------------- 2 files changed, 49 insertions(+), 40 deletions(-) diff --git a/src/help.php b/src/help.php index 7690098..26f4e23 100644 --- a/src/help.php +++ b/src/help.php @@ -1,6 +1,7 @@ 'Query connection; 1 = success, 0 = fail', 'virtualserver_clientsonline' => 'Clients online (e.g. Users)', 'virtualserver_queryclientsonline' => 'Query clients online (e.g. this exporter)', 'virtualserver_total_packetloss_speech' => 'Average packet loss', diff --git a/src/metrics.php b/src/metrics.php index 0bb6e4e..98753c8 100644 --- a/src/metrics.php +++ b/src/metrics.php @@ -3,15 +3,6 @@ require_once('../vendor/autoload.php'); require_once('help.php'); // provides $help_texts -$host = 'localhost'; -$port = 10011; -$user = rawurlencode('serveradmin'); -$password = rawurlencode('4NReP1Wf'); -$ssh = TRUE; - -$uri = 'serverquery://'.$user.':'.$password.'@'.$host.':'.$port.'/'; - - // initialize the Prometheus registry $registry = new \Prometheus\CollectorRegistry(new \Prometheus\Storage\InMemory()); $namespace = 'ts3'; @@ -20,47 +11,64 @@ $virtualserver_label_keys = [ 'virtualserver_port', 'virtualserver_unique_identifier' ]; -$totals = [ - 'virtualserver_uptime' -]; + +// set ${namespace}_up for exporter status +$up = $registry->getOrRegisterGauge( + $namespace, + 'up', + $help_texts['up'], + [] +); +$up->set(1, []); -// open a connection to the server -$ts3 = TeamSpeak3::factory($uri); +$host = '192.168.178.55'; +$port = 10011; +$user = rawurlencode('serveradmin'); +$password = rawurlencode('4NReP1Wf'); -// loop over all virtualservers, because some statistics (e.g. packet loss) -// are tracked per virtualserver -foreach($ts3->serverList() as $virtualserver) { - $infos = array_map(function($info_raw) { - return is_object($info_raw) ? $info_raw->toString() : $info_raw; - }, $virtualserver->getInfo()); +$uri = 'serverquery://'.$user.':'.$password.'@'.$host.':'.$port.'/'; - // fill $virtualserver_label_values - foreach($virtualserver_label_keys as $virtualserver_label_key) { - $value = $infos[$virtualserver_label_key]; - $virtualserver_label_values[] = $infos[$virtualserver_label_key]; - } +try { + // open a connection to the server + $ts3 = TeamSpeak3::factory($uri); - foreach($infos as $name => $data) { - // gauge only supports floats - // $infos/$data is a mix of int, string and NULL - if(preg_match('/^\d*(\.\d*)?$/', $data)) { - $gauge = $registry->getOrRegisterGauge( - $namespace, - $name, - array_key_exists($name, $help_texts) ? $help_texts[$name] : 'no help text available', - preg_match('/^virtualserver_/', $name) ? $virtualserver_label_keys : [] - ); - $gauge->set( - (float) $data, - preg_match('/^virtualserver_/', $name) ? $virtualserver_label_values : [] - ); + // loop over all virtualservers, because some statistics (e.g. packet loss) + // are tracked per virtualserver + foreach($ts3->serverList() as $virtualserver) { + $infos = array_map(function($info_raw) { + return is_object($info_raw) ? $info_raw->toString() : $info_raw; + }, $virtualserver->getInfo()); + + // fill $virtualserver_label_values + foreach($virtualserver_label_keys as $virtualserver_label_key) { + $virtualserver_label_values[] = $infos[$virtualserver_label_key]; + } + + foreach($infos as $name => $data) { + // gauge only supports floats + // $infos/$data is a mix of int, string and NULL + if(preg_match('/^\d*(\.\d*)?$/', $data)) { + $gauge = $registry->getOrRegisterGauge( + $namespace, + $name, + array_key_exists($name, $help_texts) ? $help_texts[$name] : 'no help text available', + preg_match('/^virtualserver_/', $name) ? $virtualserver_label_keys : [] + ); + $gauge->set( + (float) $data, + preg_match('/^virtualserver_/', $name) ? $virtualserver_label_values : [] + ); + } } } +} catch (Exception $e) { + // something failed, set ${namespace}_up to 0 + $up->set(0, []); } -// render all metrics as HTML and output them +// render all metrics and output them $renderer = new \Prometheus\RenderTextFormat(); $result = $renderer->render($registry->getMetricFamilySamples());