81 lines
No EOL
2 KiB
PHP
81 lines
No EOL
2 KiB
PHP
<?php
|
|
// Pluggable datasource for PHP Weathermap 0.9
|
|
// - return values from prometheus
|
|
|
|
// for interfaces scraped via node_exporter
|
|
// prometheus:instance:interface
|
|
// Example: TARGET prometheus:suede0.hamburg.freifunk.net:ens2.310
|
|
|
|
// for interfaces scraped via snmp_exporter
|
|
// the label to match the interface name with has to be given:
|
|
// prometheus:instance:interface:label
|
|
// Example: TARGET prometheus:192.168.112.30:ath0:ifDescr
|
|
|
|
<?php
|
|
// Pluggable datasource for PHP Weathermap 0.9
|
|
// - return a static value
|
|
|
|
// TARGET static:10M
|
|
// TARGET static:2M:256K
|
|
|
|
class WeatherMapDataSource_prometheus extends WeatherMapDataSource {
|
|
|
|
function Recognise($targetstring)
|
|
{
|
|
if( preg_match("/^prometheus:.*$/", $targetstring) )
|
|
{
|
|
return TRUE;
|
|
}
|
|
else
|
|
{
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
function ReadData($targetstring, &$map, &$item)
|
|
{
|
|
$parts = explode(':', $targetstring);
|
|
$router = $parts[1];
|
|
$device = $parts[2];
|
|
|
|
if (count($parts) > 3) {
|
|
$query_rx = "irate(ifInOctets{instance='$router',$parts[3]='$device'}[10m])";
|
|
$query_tx = "irate(ifOutOctets{instance='$router',$parts[3]='$device'}[10m])";
|
|
} else {
|
|
$query_rx = "irate(node_network_receive_bytes_total{instance='$router:9100',device='$device'}[5m])";
|
|
$query_tx = "irate(node_network_transmit_bytes_total{instance='$router:9100',device='$device'}[5m])";
|
|
}
|
|
|
|
$rx_rate = $this->prometheus_query($query_rx) * 8;
|
|
$tx_rate = $this->prometheus_query($query_tx) * 8;
|
|
|
|
return ( array($rx_rate, $tx_rate, 0) );
|
|
}
|
|
|
|
function prometheus_query($query)
|
|
{
|
|
$time = time();
|
|
$query = urlencode($query);
|
|
$url = "http://localhost:9090/api/v1/query?time=$time&query=$query";
|
|
$ch = curl_init();
|
|
curl_setopt($ch, CURLOPT_URL, $url);
|
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
|
|
$content = curl_exec($ch);
|
|
$data = json_decode($content, true);
|
|
|
|
if ($data['status'] != "success")
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
if ($data['data']['resultType'] != "vector")
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
return $data['data']['result'][0]['value'][1];
|
|
}
|
|
}
|
|
|
|
// vim:ts=4:sw=4:
|
|
?>
|