Sensorabfrage aus PRTG

  • Hier bitte nur Fragen und Diskussionen zu diesem Skript und PRTG *

Mal wieder ein kleines Skript von meiner Seite.

Nachdem mich Raketenschnecke auf das Monitoringsystem PRTG aufmerksam gemacht hat, meinen recht herzlichen Dank hierzu :), habe ich in PRTG natürlich meine Überwachung für IP-Symcon eingebaut was

[ul]
[li]Proszessspeicher (IPS)[/li][li]Prozessorzeit (IPS)[/li][li]logging.db (IPS)[/li][li]Protokolldateigröße (IPS)[/li][li]settings (Aktualisierungsintervall)[/li][/ul]betrifft.

Um PRTG betreiben zu können sollten schon ein paar grundsätzliche Netzwerkkentnisse vorhanden sein, läßt sich aber intuitiv bedienen. Eine 30-Tage Trial in vollem Funktionsumfang die nach diesem Zeitraum zur Freeware wird aber nur noch 10 Sensoren abfrägt kann beim Hersteller bezogen werden. Diese Version kann dann noch unter bestimmten Voraussetzungen zur Starter-Version (20 Sensoren) upgegradet werden.

Um die Daten in IPS weiterverarbeiten zu können, sei es in Form von Highcharts-Graphen oder sonstigen Warnmeldungen (übernimmt ja eigentlich PRTG) bietet dieses eine HTTP-API an von der man verwertbare XML-Meldungen geliefert bekommt.

Hierzu habe ich ein kleines Skript gebastelt, das mit einer kleinen Dokumentation versehen, von jedem der mit PRTG arbeitet und schon ein wenig in IPS gebastelt hat, angepasst werden kann.

Aber nun Schluß der vielen Worte.

Einfach das Skript in IPS an dem gewünschten Ort erstellen, Zugangsdaten zum PRTG eintragen, entsprechende Variablen und Pofile anlegen, diese im Skript an der passenden Stelle eintragen und das Skript einmal starten.

Als Ergebnis bekommt ihr im Skripteditor im Ausgabefenster die entsprechend gefiliterten Gruppen-Sensoren. Die vorgestellten ID in die entsprechend angelegten Variablen im Skript eintragen, Kommentierung // entfernen und schon sollte es funktionieren. Vorausgesetzt PRTG ist ähnlich eingerichtet wie auf dem Screenshot zu sehen.

<?
//------------------------------------------------------------------------------
// Skript zum Auslesen der Sensorwerte aus PRTG (Monitoringsystem)
// Trialversion 30 Tage die anschließend zur Freeware mit 10 Sensoren wird
// kann unter der URL http://www.paessler.com/ geladen werden.
//
// Dieses Skript dient nur als Grundgerüst zum Auslesen von Sensoren aus PRTG.
// Sollten mehrer Variablen benötigt werden entsprechend erweitern.
//
// Anleitung:
// Parameter in Zeile 24 - 28 anpassen. Am besten eigenen Benutzer in PRTG anlegen.
// Benötigte Variablen und Profile der abzufragenden Sensoren anlegen
//
// Ausführen-Button in diesem Skripteditor drücken damit die Ausgabe der Sensoren
// und dessen Array-Nummer bekannt wird.
//
// In Zeile 53-57 die gewünscht Array-Nummer der Variablen zuweisen.
//------------------------------------------------------------------------------
 
// Parameter für PRTG
$prtg_url  = 'http://ip:port';  // PRTG-URL inkl. Port wenn nicht 80
$user   = 'ips';         // PRTG-User
$password  = 'ipsymcon';      // PRTG-Passwort
//$prtg_group = 'Local probe';    // Gruppenfilter auf Testweise auf 'Local probe'. Sollte in jedem PRTG vorhanden sein
$prtg_group = 'Dienste';      // Gruppenfilter der angezeigt werden soll.
$url = urldecode("$prtg_url/api/table.xml?content=sensors&columns=objid,group,device,sensor,status,message,lastvalue,priority,favorite&username=$user&password=$password");
$xmlraw = Sys_GetURLContent(($url));
$xml=@simplexml_load_string($xmlraw);
$prtg = array();
$itemIDnew = 0;
for($itemID=0; $itemID < count($xml->item); $itemID++) {
 if($xml->item[$itemID]->group == $prtg_group) {
  $prtg[$itemIDnew]['Gruppe'] = $xml->item[$itemID]->group."\r";
  $prtg[$itemIDnew]['Device'] = utf8_decode($xml->item[$itemID]->device."\r");
  $prtg[$itemIDnew]['Sensor'] = $xml->item[$itemID]->sensor."\r";
  $prtg[$itemIDnew]['SensorStatus'] = $xml->item[$itemID]->status."\r";
  $prtg[$itemIDnew]['LastValueFormatted'] = $xml->item[$itemID]->lastvalue."\r";
  $prtg[$itemIDnew]['LastValueRaw'] = $xml->item[$itemID]->lastvalue_raw."\r";
  $itemIDnew++;
 }
}
// Hier bei $prtg[x] die entsprechende Array-Nummer des Sensors eintragen.
// und die Sensoren einkommentieren
 
//if($prtg[0]['LastValueRaw'] != 0) SetValue(10620 /*[Tools\PRTG Monitoring\IPS-Monitoring (PRTG)\Arbeitssatz]*/, $prtg[0]['LastValueRaw'] / 1024 / 1024);
//if($prtg[2]['LastValueRaw'] != 0) SetValue(29934 /*[Tools\PRTG Monitoring\IPS-Monitoring (PRTG)\Datenbank]*/, $prtg[2]['LastValueRaw'] / 1024 / 1024);
//if($prtg[3]['LastValueRaw'] != 0) SetValue(35802 /*[Tools\PRTG Monitoring\IPS-Monitoring (PRTG)\Protokoll]*/, $prtg[3]['LastValueRaw'] / 1024 / 1024);
//if($prtg[4]['LastValueRaw'] != 0) SetValue(15051 /*[Tools\PRTG Monitoring\IPS-Monitoring (PRTG)\Letzter Schreibzyklus Settings]*/, (int)$prtg[4]['LastValueRaw']);
//if($prtg[1]['LastValueRaw'] != 0) SetValue(46893 /*[Tools\PRTG Monitoring\IPS-Monitoring (PRTG)\Prozessorzeit]*/, (int)$prtg[1]['LastValueRaw']);
 
 
if($_IPS['SENDER'] == "Execute") {
 IPS_SetHidden($_IPS['SELF'], true);
 IPS_SetScriptTimer($_IPS['SELF'], 60);
 echo "ID Sensorname
";
 echo "---------------------
";
 for($id=0; $id < count($prtg); $id++) {
  echo $id."  ".$prtg[$id]['Sensor'];
 }
 echo "-------------------------------------------------
";
 echo "Anzahl Sensoren ohne Filter: ".count($xml->item)."
";
 echo "-------------------------------------------------

";
 echo "Komplettes Array der Sensorendaten für Debugzwecke
";
 echo "-------------------------------------------------
";
 print_r($prtg);
}
 
?>

Viel Spaß damit!

anbei mal als Beispiel die „kritischen IPS-Daten“, die ich mir von PRTG übergeben lasse. Auf einigen Parametern liegen im Hintergrund (in IPS) definierte Alarm-Aktionen (z.B. Mailversand), unabhängig von definierten Events in PRTG

RS.net PRTG Monitoring.PNG

Die API von PRTG liefert aus noch nicht erkennbaren Gründen in undefinierbaren Abständen nicht den korrekten Wert. Es werden immer wieder 0-Werte geliefert die das Auswerteergebnis verfälschen.

Um diese Werte abzufangen solltet Ihr folgenden Code beim SetValue-Block einfügen. Bitte eure Parameter entsprechend einsetzen.

if($prtg[0]['LastValueRaw'] != 0) SetValue(10620 /*[Tools\PRTG Monitoring\IPS-Monitoring (PRTG)\Arbeitssatz]*/, $prtg[0]['LastValueRaw'] / 1024 / 1024);
if($prtg[2]['LastValueRaw'] != 0) SetValue(29934 /*[Tools\PRTG Monitoring\IPS-Monitoring (PRTG)\Datenbank]*/, $prtg[2]['LastValueRaw'] / 1024 / 1024);
if($prtg[3]['LastValueRaw'] != 0) SetValue(35802 /*[Tools\PRTG Monitoring\IPS-Monitoring (PRTG)\Protokoll]*/, $prtg[3]['LastValueRaw'] / 1024 / 1024);
if($prtg[4]['LastValueRaw'] != 0) SetValue(15051 /*[Tools\PRTG Monitoring\IPS-Monitoring (PRTG)\Letzter Schreibzyklus Settings]*/, (int)$prtg[4]['LastValueRaw']);
if($prtg[1]['LastValueRaw'] != 0) SetValue(46893 /*[Tools\PRTG Monitoring\IPS-Monitoring (PRTG)\Prozessorzeit]*/, (int)$prtg[1]['LastValueRaw']);

Sollten 0-Werte bei einem Sensor oder Variable erwünscht sein einfach

if($prtg[x]['LastValueRaw'] != 0) 

entfernen.

Ist zwar keine saubere Lösung aber solange die API solche Werte liefert kann ich nichts anderes anbieten.

Mit dieser Änderung sieht es bei mir deutlich besser aus, seit mehreren Stunden keinen Fehler mehr:

Hallo Werner!

Ich benutze ebenfalls dein Script. Allerdings habe ich ein Problem.
Bin mir aber nicht sicher ob es damit zusammenhängt. :frowning:

Ich habe auf den Variablen (Sensoren aus PRTG) das Logging aktiviert.
Nur wird bei mir hin und wieder ein PHP Error in graph.php
(Pfad: C:\IP-Symcon\webfront\data\graph.php) in der Zeile 273 (Division by zero) angezeigt.

P.S: Der Vergleich auf ungleich 0 ist vorhanden!

Gruß
Günter

Hallo Günter,

habe zwar das interne Logging für die Sensoren nicht aktiviert kann mir aber nur vorstellen das es mit dem Fix für die IPS-Version 2.7 zusammenhängt.

Fix: Potenzieller Division durch Null bei der Graphengenerierung

http://www.ip-symcon.de/service/dokumentation/installation/migration-v26-v27/

Ansonsten kann ich mir nicht vorstellen was hier beim Logging anders laufen soll wie sonst.

Servus Werner

wollte heute mal dein prtg Script testen, aber irgendwie hat es da ein merkwürdiges Problem:

prtg ist eingerichtet und funktioniert
Script ist parametriert, kann sich mit prtg verbinden, bringt aber nur die erste Zeile der prtg xml Antwort.
Irgendwie scheint das „Sys_GetUrlContent“ ein Problem zu haben, denn hier wird schon nur die erste Zeile gelesen.

Kopiere ich die URL die du erzeugst in einen Browser krieg ich eine schöne XML Liste aller Sensoren.

Soweit ich die Structur interpretiere müßte die mit dem Rest deines Scriptes auch sauber auswertbar sein.

Irgendeine Idee ?

thx
bb

Mega… ist ja witzig.
In meiner alten Firma habe ich PRTG mit eingerichtet… in der neuen mal zum Test installiert…
aber mit mehr als 10 Sensoren :slight_smile: (SQL Abfragen, Oracle abfragen, …)
Ist ja cool.

Mit PRTG hat man natürlich sehr schnell ne klasse überwachung (cmds, sql abfrage, ping, disk i/o, festplattenbelegung und vieles vieles mehr - aufgebaut :slight_smile:

Ich kanns nur jedem empfehlen…
Leistungsfähige Hardware vorausgesetzt… (auf meinem 1GHZ Via PC brauch ichs gar nicht erst zu probieren)

Ääähhh ??? hab ich Blödsinn geschrieben ?

Nein, er freut sich nur über PRTG und die Möglichkeiten und daß er es auch kann :wink: :smiley:

Ne kein Blödsinn.
Ich find die Software einfach klasse.

Vor allem intuitiv aufgebaut und sehr vielseitig.
Klar gibt auch andere monitoringlösungen (nagios…)
Aber keine du von der Bedienung her an prtg rankommt.

Hallo, ein dickes Dankeschön für deine PRTG Schnittstelle. Durch meine Weiterempfehlung an eine Firma besteht dort nun der Wunsch die ausgelesenen Daten der eltaco Stromzähler auch im PRTG über die Daten von IPS anzeigen zu lassen.

Besteht irgendwie die Möglichkeit Daten von gewissen Variablen vom IPS im PRTG ausgeben zu lassen? (Hier besteht im Notfall auch die Möglichkeit beide Instanzen auf derselben Maschine laufen zu lassen)

Das geht vergleichsweise simpel.

Lege im Pfad /user/webfront ein Verzeichnis PRTG an. In diesem Verzeichnis erstellt Du z.b. ein solches Skript:


<?
$Value = GetValue(12345);
echo "[".$Value."]";
?>

Die Variablen-ID muss Du natürlich anpassen.

Dann erstellst Du in PRTG einen HTML-Inhalts-Sensor mit dem Link

http://xxx.xxx.xxx.xxx:Port/user/prtg/skriptname.php

Wie Du den genau einrichtest steht hier.

Es lassen sich auch mehrere Variablen auf einen Rutsch übergeben und auch eine Authentifizierung kann man einrichten.