Zabbix API mit cURL unter Windows abfragen
Aus znilwiki
Ich wollte ein paar Dinge aus der Zabbix-API ziehen und im Anschluss weiter verarbeiten.
Dabei wollte ich aber nicht die ganzen php-Frameworks etc. nutzen - und vor allen wollte ich es unter Windows nutzen - da soll am Ende ein AutoIt Programm bei rauskommen für Reports
Als Hilfsmittel habe ich cURL genommen, für Windows findet Ihr es unter http://curl.haxx.se/download.html
Ich habe dort die "Win32 - Generic" bzw. "Win64 - Generic" Versionen genommen mit SSL Unterstützung.
Als erste Vorlage / Ideenlieferant dazu hatte ich diese Seite im Internet gefunden: http://doc.bonfire-project.eu/R2/monitoring/monitoring_zabbix_API.html
Leider sind die Bespiele zum einen für eine alte Zabbix-Version geschrieben, zum anderen für die Linux-Version.
Ich hab das ganze hier mal für Windows umgesetzt. cURL möchte die Angaben alle in Anführungszeichen haben ... wir benötigen die Anfürhungszeichen aber auch für die Parameterübergabe. Die Anführungszeichen für die Parameter müssen deshalb alle ein \ davor haben (Escaping)
Rahmenbedingungen
curl.exe
curl.exe liegt im Suchpfad oder im gleichen Verzeichnis
Bei allen nachfolgenden Befehlen mit curl.exe kann man am Anfang auch noch ein
-i = Ausführliche Antwort zeigen (Er zeigt dann alles an was er Empfängt, nicht nur den eigentlichen Text)
einbauen - zur Fehlersuche.
Mit
-k
klappt es auch bei https-Verbindungen
Adresse Zabbix API
Zabbix Server API ist über
http://10.106.207.105/api_jsonrpc.php
zu erreichen. Ich habe Zabbix aber so installiert das man im Webbrowser kein /zabbix angeben muss. Ihr müsst also eventuell
http://IP_oder_DNSNAME/zabbix/api_jsonrpc.php
angeben!
Anmeldung
Wir müssen uns einmal an der API anmelden und erhalten als Antort ein Token. Später verwenden wir nur noch dieses Token statt Benutzernamen und Passwort.
user.login
Das nachfolgende muss alles in einer Zeile stehen, ich habs hier nur zur Lesbarkeit in mehrere Zeilen kopiert!
curl.exe -X POST -H "Content-Type:application/json" -d "{\"jsonrpc\": \"2.0\",\"method\":\"user.login\",\"params\":{\"user\":\"admin\",\"password\":\"test1234\"},\"id\":1}" http://10.106.207.105/api_jsonrpc.php
hier nochmal in einer Zeile:
curl.exe -X POST -H "Content-Type:application/json" -d "{\"jsonrpc\": \"2.0\",\"method\":\"user.login\",\"params\":{\"user\":\"admin\",\"password\":\"test1234\"},\"id\":1}" http://10.106.207.105/api_jsonrpc.php
hier die Erklärung der Parameter (erspare ich mir später)
-X POST Wir wollen etwas senden -H "Content-Type:application/json" Das ist der Header den wir angeben, sprich welches Format hat das was wir senden (hier: json Syntax) -d "{\"jsonrpc\": \"2.0\",\"method\":\"user.login\",\"params\":{\"user\":\"admin\",\"password\":\"test1234\"},\"id\":1}" Gemäß https://www.zabbix.com/documentation/2.0/manual/appendix/api/user/login melden wir uns mit unserem Benutzer an (Benutzer: admin, Passwort: test1234) http://10.106.207.105/api_jsonrpc.php Adresse zur Zabbix API (ggf. mit /zabbix/ dawischen, siehe Hinweise bei Rahmenbedingungen
Als Antwort bekommen wir:
{"jsonrpc":"2.0","result":"3be40c8810a03c7e60ba1fe194c7514b","id":1}
Die lange Hexadezimale Zahl ist unser Token
Hosts abfragen
Gezielt bestimmten Host abfragen
Wir fragen gezielt Daten des Hosts SERVER ab:
curl.exe -X POST -H "Content-Type: application/json" -d"{\"jsonrpc\":\"2.0\",\"method\":\"host.get\",\"params\":{\"output\":\"extend\",\"filter\":{\"host\":\"SERVER\"}},\"auth\":\"3be40c8810a03c7e60ba1fe194c7514b\",\"id\":1}" http://10.106.207.105/api_jsonrpc.php curl.exe -X POST -H "Content-Type: application/json" -d"{\"jsonrpc\":\"2.0\",\"method\":\"host.get\",\"params\":{\"output\":\"extend\",\"filter\":{\"host\":\"SERVER\"}},\"auth\":\"3be40c8810a03c7e60ba1fe194c7514b\",\"id\":1}" http://10.106.207.105/api_jsonrpc.php
Details siehe: https://www.zabbix.com/documentation/2.0/manual/appendix/api/host/get Wichtig ist die Tokennummer Antwort:
{"jsonrpc":"2.0","result":[{"maintenances":[],"hostid":"100100000010111","proxy_hostid":"0","host":"SERVER","status":"0","disable_until":"0","error":"","available":"1","errors_from":"0","lastaccess":"0","ipmi_authtype":"-1","ipmi_privilege":"2","ipmi_username":"","ipmi_password":"","ipmi_disable_until":"0","ipmi_available":"0","snmp_disable_until":"0","snmp_available":"0","maintenanceid":"0","maintenance_status":"0","maintenance_type":"0","maintenance_from":"0","ipmi_errors_from":"0","snmp_errors_from":"0","ipmi_error":"","snmp_error":"","jmx_disable_until":"0","jmx_available":"0","jmx_errors_from":"0","jmx_error":"","name":"SERVER"}],"id":1}
oder besser aufgedröselt:
{"jsonrpc":"2.0","result":[{ "maintenances":[], "hostid":"100100000010111", "proxy_hostid":"0", "host":"SERVER", "status":"0", "disable_until":"0", "error":"", "available":"1", "errors_from":"0", "lastaccess":"0", "ipmi_authtype":"-1", "ipmi_privilege":"2", "ipmi_username":"", "ipmi_password":"", "ipmi_disable_until":"0", "ipmi_available":"0", "snmp_disable_until":"0", "snmp_available":"0", "maintenanceid":"0", "maintenance_status":"0", "maintenance_type":"0", "maintenance_from":"0", "ipmi_errors_from":"0", "snmp_errors_from":"0", "ipmi_error":"", "snmp_error":"", "jmx_disable_until":"0", "jmx_available":"0", "jmx_errors_from":"0", "jmx_error":"", "name":"SERVER" }],"id":1}
Liste aller Hosts abfragen
Folgender Befehl findet alle Hosts in allen Gruppen, sortiert nach Namen!
curl.exe -X POST -H "Content-Type: application/json" -d"{\"jsonrpc\":\"2.0\",\"method\":\"host.get\",\"params\":{\"output\":[\"name\"],\"sortfield\":\"name\"},\"auth\":\"3be40c8810a03c7e60ba1fe194c7514b\",\"id\":1}" http://10.106.207.105/api_jsonrpc.php curl.exe -X POST -H "Content-Type: application/json" -d"{\"jsonrpc\":\"2.0\",\"method\":\"host.get\",\"params\":{\"output\":[\"name\"],\"sortfield\":\"name\"},\"auth\":\"3be40c8810a03c7e60ba1fe194c7514b\",\"id\":1}" http://10.106.207.105/api_jsonrpc.php
ergibt folgende Liste: (normal als Fließtext, ich habs hier auseinandergedröselt)
{"jsonrpc":"2.0","result":[ {"hostid":"100100000010085","name":"ESXi06"}, {"hostid":"100100000010106","name":"EXSRV"}, {"hostid":"100100000010121","name":"KServer"}, {"hostid":"100100000010108","name":"MQSERVER1"}, {"hostid":"100100000010109","name":"MQSERVER2"}, {"hostid":"100100000010110","name":"MQTEL01"}, {"hostid":"100100000010089","name":"OBServer"}, {"hostid":"100100000010105","name":"S10"}, {"hostid":"100100000010104","name":"S11"}, {"hostid":"100100000010112","name":"S12"}, {"hostid":"100100000010113","name":"S13"}, {"hostid":"100100000010114","name":"S14"}, {"hostid":"100100000010115","name":"S15"}, {"hostid":"100100000010116","name":"S16"}, {"hostid":"100100000010117","name":"S17"}, {"hostid":"100100000010118","name":"S18"}, {"hostid":"100100000010119","name":"S19"}, {"hostid":"100100000010120","name":"S20"}, {"hostid":"100100000010111","name":"SERVER"}, {"hostid":"100100000010107","name":"SQLSRV"}, {"hostid":"100100000010101","name":"W2KDC"}, {"hostid":"100100000010102","name":"W2K8DC"}, {"hostid":"100100000010084","name":"Zabbix server"}, "id":1}
Liste aller Gruppen abfragen
Ergibt eine Liste aller Hostgruppen, alphabetisch sortiert:
curl.exe -X POST -H "Content-Type: application/json" -d"{\"jsonrpc\":\"2.0\",\"method\":\"hostgroup.get\",\"params\":{\"output\":[\"name\"],\"sortfield\":\"name\"},\"auth\":\"3be40c8810a03c7e60ba1fe194c7514b\",\"id\":1}" http://10.106.207.105/api_jsonrpc.php curl.exe -X POST -H "Content-Type: application/json" -d"{\"jsonrpc\":\"2.0\",\"method\":\"hostgroup.get\",\"params\":{\"output\":[\"name\"],\"sortfield\":\"name\"},\"auth\":\"3be40c8810a03c7e60ba1fe194c7514b\",\"id\":1}" http://10.106.207.105/api_jsonrpc.php
Ausgabe:
{"jsonrpc":"2.0","result":[ {"groupid":"100100000000008","name":"Amt B"}, {"groupid":"100100000000009","name":"Amt C"}, {"groupid":"100100000000010","name":"Amt N"}, {"groupid":"100100000000011","name":"Amt O"}, {"groupid":"100100000000012","name":"Ball 1"}, {"groupid":"100100000000013","name":"Ball 2"}, {"groupid":"100100000000006","name":"Cluster"}, {"groupid":"100100000000005","name":"Discovered hosts"}, {"groupid":"100100000000014","name":"DKKH"}, {"groupid":"100100000000007","name":"Flieger"}, {"groupid":"100100000000015","name":"Für Günther"}, {"groupid":"100100000000016","name":"Göttingen-1"}, {"groupid":"100100000000017","name":"Göttingen-2"}, {"groupid":"100100000000002","name":"Linux servers"}, {"groupid":"100100000000020","name":"MSSQL"}, {"groupid":"100100000000001","name":"Templates"}, {"groupid":"100100000000004","name":"Zabbix servers"}, ],"id":1}
Liste aller Hosts in Gruppe x abfragen
Wir wollen alle Hosts in der Gruppe MSSQL abfragen:
Zuerst müssen wir die ID der Gruppe MSSQL in Erfahrung bringen:
curl.exe -X POST -H "Content-Type: application/json" -d"{\"jsonrpc\":\"2.0\",\"method\":\"hostgroup.get\",\"params\":{\"output\":[\"name\"],\"filter\":{\"name\":\"MSSQL\"}},\"auth\":\"3be40c8810a03c7e60ba1fe194c7514b\",\"id\":1}" http://10.106.207.105/api_jsonrpc.php curl.exe -X POST -H "Content-Type: application/json" -d"{\"jsonrpc\":\"2.0\",\"method\":\"hostgroup.get\",\"params\":{\"output\":[\"name\"],\"filter\":{\"name\":\"MSSQL\"}},\"auth\":\"3be40c8810a03c7e60ba1fe194c7514b\",\"id\":1}" http://10.106.207.105/api_jsonrpc.php
Ausgabe:
{"jsonrpc":"2.0","result":[{"groupid":"100100000000020","name":"MSSQL"}],"id":1}
Die Group-ID ist also 100100000000020
Mit der Group-ID 100100000000020
können wir dann die Hosts abfragen - Listet alle Hosts in der Gruppe "MSSQL" auf:
curl.exe -X POST -H "Content-Type: application/json" -d"{\"jsonrpc\":\"2.0\",\"method\":\"host.get\",\"params\":{\"output\":[\"name\"],\"groupids\":\"100100000000020\"},\"auth\":\"3be40c8810a03c7e60ba1fe194c7514b\",\"id\":1}" http://10.106.207.105/api_jsonrpc.php curl.exe -X POST -H "Content-Type: application/json" -d"{\"jsonrpc\":\"2.0\",\"method\":\"host.get\",\"params\":{\"output\":[\"name\"],\"groupids\":\"100100000000020\"},\"auth\":\"3be40c8810a03c7e60ba1fe194c7514b\",\"id\":1}" http://10.106.207.105/api_jsonrpc.php
Ausgabe:
{"jsonrpc":"2.0","result":[ {"groups":[{"groupid":"100100000000020"}],"hostid":"100100000010108","name":"MSSLQSERVER1"}, {"groups":[{"groupid":"100100000000020"}],"hostid":"100100000010109","name":"MSSQLSERVER2"}, {"groups":[{"groupid":"100100000000020"}],"hostid":"100100000010110","name":"MQLTEL01"}, {"groups":[{"groupid":"100100000000020"}],"hostid":"100100000010111","name":"SERVER"}] ,"id":1}
Liste aller Items eines Hosts abfragen
In dem Beispiel hier fragen wir alle Items des Host SERVER abfragen.
Zunächste müssen wir die Host-ID des Hosts in Erfahrung bringen:
curl.exe -X POST -H "Content-Type: application/json" -d"{\"jsonrpc\":\"2.0\",\"method\":\"host.get\",\"params\":{\"output\":\"shorten\",\"filter\":{\"host\":\"SERVER\"}},\"auth\":\"3be40c8810a03c7e60ba1fe194c7514b\",\"id\":1}" http://10.106.207.105/api_jsonrpc.php curl.exe -X POST -H "Content-Type: application/json" -d"{\"jsonrpc\":\"2.0\",\"method\":\"host.get\",\"params\":{\"output\":\"shorten\",\"filter\":{\"host\":\"SERVER\"}},\"auth\":\"3be40c8810a03c7e60ba1fe194c7514b\",\"id\":1}" http://10.106.207.105/api_jsonrpc.php
Ausgabe:'
{"jsonrpc":"2.0","result":[{"hostid":"100100000010111"}],"id":1}
Mit dieser können wir dann die Items abfragen:
curl.exe -X POST -H "Content-Type: application/json" -d "{\"jsonrpc\":\"2.0\",\"method\":\"item.get\",\"params\":{\"output\":[\"name\"],\"filter\":{\"hostid\":\"100100000010111\"}},\"auth\":\"3be40c8810a03c7e60ba1fe194c7514b\",\"id\":1}" http://10.106.207.105/api_jsonrpc.php curl.exe -X POST -H "Content-Type: application/json" -d "{\"jsonrpc\":\"2.0\",\"method\":\"item.get\",\"params\":{\"output\":[\"name\"],\"filter\":{\"hostid\":\"100100000010111\"}},\"auth\":\"3be40c8810a03c7e60ba1fe194c7514b\",\"id\":1}" http://10.106.207.105/api_jsonrpc.php
Ausgabe:
{"jsonrpc":"2.0","result":[ {"itemid":"100100000024179","name":"Host name of zabbix_agentd running"}, {"itemid":"100100000024180","name":"Agent ping"}, {"itemid":"100100000024181","name":"Version of zabbix_agent(d) running"}, {"itemid":"100100000024182","name":"Average disk read queue length"}, {"itemid":"100100000024183","name":"Average disk write queue length"}, {"itemid":"100100000024184","name":"File read bytes per second"}, {"itemid":"100100000024185","name":"File write bytes per second"}, {"itemid":"100100000024186","name":"Number of threads"}, {"itemid":"100100000024187","name":"Number of processes"}, {"itemid":"100100000024188","name":"Processor load (15 min average)"}, {"itemid":"100100000024189","name":"Processor load (1 min average)"}, {"itemid":"100100000024190","name":"Processor load (5 min average)"}, {"itemid":"100100000024191","name":"Free swap space"}, {"itemid":"100100000024192","name":"Total swap space"}, {"itemid":"100100000024193","name":"System information"}, {"itemid":"100100000024194","name":"System uptime"}, {"itemid":"100100000024195","name":"Free Disk Space C:\\"}, {"itemid":"100100000024196","name":"Disk C:\\"}, {"itemid":"100100000024197","name":"Free Disk Space D:\\"}, {"itemid":"100100000024198","name":"Free Disk Space E:\\"}, {"itemid":"100100000024199","name":"Free memory"}, {"itemid":"100100000024200","name":"Total memory"}] ,"id":1}
ID eines bestimmten Items eines Hosts anhand des Names abfragen
Item "System uptime" auf dem Host abfragen (Host-D muss natürlich mit angegeben werden):
curl.exe -X POST -H "Content-Type: application/json" -d "{\"jsonrpc\":\"2.0\",\"method\":\"item.get\",\"params\":{\"output\":[\"name\"], \"filter\":{\hostid\":\"100100000010111\",\"name\":\"System uptime\"}},\"auth\":\"3be40c8810a03c7e60ba1fe194c7514b\",\"id\":1}" http://10.106.207.105/api_jsonrpc.php curl.exe -X POST -H "Content-Type: application/json" -d "{\"jsonrpc\":\"2.0\",\"method\":\"item.get\",\"params\":{\"output\":[\"name\"],\"filter\":{\hostid\":\"100100000010111\",\"name\":\"System uptime\"}},\"auth\":\"3be40c8810a03c7e60ba1fe194c7514b\",\"id\":1}" http://10.106.207.105/api_jsonrpc.php
Ausgabe:
{"jsonrpc":"2.0","result":[{"itemid":"100100000024194","name":"System uptime"}],"id":1}
Hinweis zu Itemwerten
Es gibt bei den Abfragen immer einen Wert
history:
Damit wird das Zahlenformat des Rückgabewertes angegeben.
Mögliche Werte sind:
0 - float 1 - string 2 - log; 3 - integer 4 - text
Der Wert sollte zu dem passen was beim Item angegeben ist.
Man kann den richtigen Wert über "item.get" abfragen:
curl.exe -X POST -H "Content-Type: application/json" -d "{\"jsonrpc\":\"2.0\",\"method\": \"item.get\",\"params\":{\"output\":\"extend\",\"itemids\":[\"2002000000024464\"]},\"auth\":\"fdf42546cc122d7a7a6aafaa3b9b6d82\",\"id\":1}" http://192.168.3.1/zabbix/api_jsonrpc.php curl.exe -X POST -H "Content-Type: application/json" -d "{\"jsonrpc\":\"2.0\",\"method\": \"item.get\",\"params\":{\"output\":\"extend\", \"itemids\":[\"2002000000024464\"]},\"auth\":\"fdf42546cc122d7a7a6aafaa3b9b6d82\",\"id\":1}" http://192.168.3.1/zabbix/api_jsonrpc.php
Die Rückgabe sieht wie folgt aus:
{"jsonrpc":"2.0","result":[ {"itemid":"2002000000024464", "type":"0", "snmp_community":"", "snmp_oid":"", "hostid":"2002000000010152", "name":"Free disk space", "key_":"datastore.size[{HOST.HOST},free]", "delay":"60", "history":"90", "trends":"365", "lastvalue":"278760783872", "lastclock":"1383135864", "prevvalue":"278760783872", "status":"0", "value_type":"3", "trapper_hosts":"", "units":"B", "multiplier":"0", "delta":"0", "prevorgvalue":"0", "snmpv3_securityname":"", "snmpv3_securitylevel":"0", "snmpv3_authpassphrase":"", "snmpv3_privpassphrase":"", "formula":"1", "error":"", "lastlogsize":"0", "logtimefmt":"", "templateid":"2002000000024300", "valuemapid":"0", "delay_flex":"", "params":"", "ipmi_sensor":"", "data_type":"0", "authtype":"0", "username":"", "password":"", "publickey":"", "privatekey":"", "mtime":"0", "lastns":"184745875", "flags":"0", "filter":"", "interfaceid":"2002000000000060", "port":"", "description":"", "inventory_link":"0", "lifetime":"30" }],"id":1}
Und der richtige History-Wert ist der Wert bei
"value_type":"3",
Die letzten X Werte eines Items abfragen
Entscheidend ist der "limit" Parameter, hier 10. Abgefragt habe ich das Item "Processor load (5 min average)" des Host "SERVER" (ist ja die Item-ID, siehe oben)
curl.exe -X POST -H "Content-Type: application/json" -d "{\"jsonrpc\":\"2.0\",\"method\": \"history.get\",\"params\":{\"output\":\"extend\",\"history\":0, \"itemids\":[\"100100000024190\"],\"sortfield\":\"clock\",\"sortorder\":\"DESC\",\"limit\":10}, \"auth\":\"3be40c8810a03c7e60ba1fe194c7514b\",\"id\":1}" http://10.106.207.105/api_jsonrpc.php curl.exe -X POST -H "Content-Type: application/json" -d "{\"jsonrpc\":\"2.0\",\"method\": \"history.get\",\"params\":{\"output\":\"extend\",\"history\":0,\"itemids\":[\"100100000024190\"],\"sortfield\":\"clock\",\"sortorder\":\"DESC\",\"limit\":10},\"auth\":\"3be40c8810a03c7e60ba1fe194c7514b\",\"id\":1}" http://10.106.207.105/api_jsonrpc.php
Ausgabe:
{"jsonrpc":"2.0","result":[ {"itemid":"100100000024190","clock":"1381830650","value":"0.0233","ns":"114173658"}, {"itemid":"100100000024190","clock":"1381830589","value":"0.0167","ns":"37308873"}, {"itemid":"100100000024190","clock":"1381830527","value":"0.0133","ns":"994331854"}, {"itemid":"100100000024190","clock":"1381830466","value":"0.0567","ns":"824871648"}, {"itemid":"100100000024190","clock":"1381830406","value":"0.1100","ns":"622690693"}, {"itemid":"100100000024190","clock":"1381830344","value":"0.1167","ns":"916714067"}, {"itemid":"100100000024190","clock":"1381830284","value":"0.1133","ns":"966625291"}, {"itemid":"100100000024190","clock":"1381830223","value":"0.1067","ns":"925286313"}, {"itemid":"100100000024190","clock":"1381830163","value":"0.0700","ns":"369212205"}, {"itemid":"100100000024190","clock":"1381830100","value":"0.0200","ns":"694179380"} ],"id":1}
hier noch mal die Ausgabe bei Abfrage "Disk C:\" für den Host "SERVER", Item-ID 100100000024196, die letzten 4 Werte (der sollte sich ja nicht ändern)
curl.exe -X POST -H "Content-Type: application/json" -d "{\"jsonrpc\":\"2.0\",\"method\": \"history.get\",\"params\":{\"output\":\"extend\",\"history\":0,\"itemids\":[\"100100000024196\"],\"sortfield\":\"clock\",\"sortorder\":\"DESC\",\"limit\":4},\"auth\":\"3be40c8810a03c7e60ba1fe194c7514b\",\"id\":1}" http://10.106.207.105/api_jsonrpc.php
Ausgabe:
{"jsonrpc":"2.0","result":[ {"itemid":"100100000024196","clock":"1381832884","value":"31459717120.0000","ns":"70175739"}, {"itemid":"100100000024196","clock":"1381832854","value":"31459717120.0000","ns":"214846936"}, {"itemid":"100100000024196","clock":"1381832823","value":"31459717120.0000","ns":"252300665"}, {"itemid":"100100000024196","clock":"1381832792","value":"31459717120.0000","ns":"547505348"} ],"id":1}
Erklärung der Werte:
{"itemid":"100100000024196","clock":"1381832884","value":"31459717120.0000","ns":"70175739"}, "itemid":"100100000024196" : Die ID des Items, hier "Disk C:\" des Hosts "SERVER" (muss ermitelt werden vor Abfrage "clock":"1381832884", : Von wann ist der Wert im UNIX-Timestamp Format (= 15.10.2013 12:28:04) "value":"31459717120.0000" : Wert des Items, hier 31.459.717.120 Byte = 29,30 GByte "ns":"70175739"} : Nanosekunden als der Wert empfangen wurde (wofür auch immer)
Werte eines Items für Zeitraum X abfragen
Nun wird es komplizierter ... die Datum/Zeit-Angaben müssen wir in einen UNIX-Timestamp umrechen - und nein, das macht man nicht eben so.
Nehmt eines der vorhandenen Tools aus dem Internet - ich werde auch noch ein Kommandozeilentool schreiben.
Ich frage nachfolgend folgenden Zeitraum ab:
14.10.2013 08:00:00 ==> 1381737600 bis 14.10.2013 17:00:00 ==> 1381770000
curl.exe -X POST -H "Content-Type: application/json" -d "{\"jsonrpc\":\"2.0\",\"method\": \"history.get\",\"params\":{\"output\":\"extend\",\"history\":0, \"itemids\":[\"100100000024196\"],\"sortfield\":\"clock\",\"sortorder\":\"DESC\", \"time_from\":\"1381737600\",\"time_till\":\"1381770000\"},\"auth\":\"3be40c8810a03c7e60ba1fe194c7514b\",\"id\":1}" http://10.106.207.105/api_jsonrpc.php curl.exe -X POST -H "Content-Type: application/json" -d "{\"jsonrpc\":\"2.0\",\"method\": \"history.get\",\"params\":{\"output\":\"extend\",\"history\":0,\"itemids\":[\"100100000024196\"],\"sortfield\":\"clock\",\"sortorder\":\"DESC\",\"time_from\":\"1381737600\",\"time_till\":\"1381770000\"},\"auth\":\"3be40c8810a03c7e60ba1fe194c7514b\",\"id\":1}" http://10.106.207.105/api_jsonrpc.php
Ausgabe: (gekürzt, sind 1063 Werte)
{"jsonrpc":"2.0","result":[ {"itemid":"100100000024196","clock":"1381769995","value":"31459717120.0000","ns":"22289698"}, {"itemid":"100100000024196","clock":"1381769965","value":"31459717120.0000","ns":"373646510"}, {"itemid":"100100000024196","clock":"1381769935","value":"31459717120.0000","ns":"516204202"}, {"itemid":"100100000024196","clock":"1381769904","value":"31459717120.0000","ns":"642602519"}, {"itemid":"100100000024196","clock":"1381769873","value":"31459717120.0000","ns":"759310056"}, {"itemid":"100100000024196","clock":"1381769842","value":"31459717120.0000","ns":"118481494"}, {"itemid":"100100000024196","clock":"1381769812","value":"31459717120.0000","ns":"258240633"}, ... ... {"itemid":"100100000024196","clock":"1381737753","value":"31459717120.0000","ns":"464421332"}, {"itemid":"100100000024196","clock":"1381737723","value":"31459717120.0000","ns":"116896451"}, {"itemid":"100100000024196","clock":"1381737693","value":"31459717120.0000","ns":"469424716"}, {"itemid":"100100000024196","clock":"1381737662","value":"31459717120.0000","ns":"922421284"}, {"itemid":"100100000024196","clock":"1381737631","value":"31459717120.0000","ns":"257596636"}, {"itemid":"100100000024196","clock":"1381737601","value":"31459717120.0000","ns":"291164907"} ],"id":1}
Vorhandene Grafiken eines Host abfragen
Welche Grafiken für unseren Host SERVER sind vorhanden?
Methode 1: (graph.get) mit Host-ID
curl.exe -X POST -H "Content-Type: application/json" -d "{\"jsonrpc\":\"2.0\",\"method\":\"graph.get\",\"params\":{\"output\":\"extend\",\"hostids\":100100000010111, \"sortfield\":\"name\"},\"auth\":\"3be40c8810a03c7e60ba1fe194c7514b\",\"id\":1}" http://10.106.207.105/api_jsonrpc.php curl.exe -X POST -H "Content-Type: application/json" -d "{\"jsonrpc\":\"2.0\",\"method\":\"graph.get\",\"params\":{\"output\":\"extend\",\"hostids\":100100000010111,\"sortfield\":\"name\"},\"auth\":\"3be40c8810a03c7e60ba1fe194c7514b\",\"id\":1}" http://10.106.207.105/api_jsonrpc.php
Methode 2: (graph.getobjects) mit Hostnamen
curl.exe -X POST -H "Content-Type: application/json" -d "{\"jsonrpc\":\"2.0\",\"method\":\"graph.getobjects\",\"params\":{\"host\":\"SERVER\"},\"auth\":\"3be40c8810a03c7e60ba1fe194c7514b\",\"id\":1}" http://10.106.207.105/api_jsonrpc.php
Ausgabe:
{"jsonrpc":"2.0","result":[ {"hosts":[{"hostid":"100100000010111"}], "graphid":"100100000000671", "name":"CPU load", "width":"900", "height":"200", "yaxismin":"0.0000", "yaxismax":"100.0000", "templateid":"100100000000531", "show_work_period":"1", "show_triggers":"1", "graphtype":"0", "show_legend":"1", "show_3d":"0", "percent_left":"0.0000", "percent_right":"0.0000", "ymin_type":"1", "ymax_type":"0", "ymin_itemid":"0", "ymax_itemid":"0", "flags":"0"} ],"id":1}
In diesem Fall eine also eine bescheidene Grafik über die CPU-Auslastung.
Grafiken aus Zabbix herunterladen
Wir wollen nun die Grafik herunterladen die wir zuvor ermittelt haben.
Das geht NICHT über die API, da müssen wir über das normale Webinterface gehen ...
Ich war so nett auch dies mit cURL zu realisieren (hatte es erst mit wget probiert)
An Zabbix Webseite mit cURL anmelden
In diesem Beispiel ist mein Benutzer Admin
mit dem Kennwort geheim
Die normale Login-Seite erreicht man unter
http://10.106.207.105/index.php
Ihr müsst ggf. noch ein zabbix/
dazwischen setzen.
Aufruf wie folgt:
curl.exe -X POST --cookie-jar tmpjar --cookie tmpjar -d name="Admin" -d password="geheim" -d enter="Sign in" http://10.106.207.105/index.php -X POST : Wir wollen etwas an die Webseite senden --cookie-jar tmpjar : erstelle ein Cookie tmpjar" im aktuellen Verzeichnis (Pfadangaben wären erlaubt) --cookie tmpjar : Benutze für die aktuelle Sitzung das Cookie "tmpjar" im aktuellen Verzeichnis -d name="Admin" : Schreibe in das Formularfeld name das Wort "Admin" -d password="geheim" : Schreibe in das Formularfeld password das Wort "geheim" -d enter="Sign in" : Drücke den Butten der mit "Sign in" Beschriftet ist http://10.106.207.105/index.php : Adresse der Login-Seite
Als Rückmeldung bekommt Ihr wenn es geklaptt hat - nichts -
Wenn es nicht klappt kommt jede Menge html-Code.
gezielt bestimmte Grafik anfordern
Weiter oben haben wir vom Host SERVER die vorhandenen Grafiken ermittelt (eine) mit der
"graphid":"100100000000671"
Diese ID brauchen wir nun!
curl.exe --cookie tmpjar -o grafik.png --remote-name "http://10.106.207.105/chart2.php?graphid=100100000000671&width=900&height=300&period=7200&stime=20131015083000" --cookie tmpjar : Den zuvor erstellten (bei der Anmeldung) Cookie verwenden -o grafik.png : Unter diesem Namen wird die Grafik gespeichert (Pfadangaben erlaubt) --remote-name : Webseite von der wir herunterladen wollen (-O wäre auch ok gewesen) "http://10.106.207.105/chart2.php? : URL von Zabbix, statt login.php hier die chart2.php graphid=100100000000671 : ID der Grafik angeben wie ermittelt &width=900 : Breite der Grafik in Pixeln &height=300 : Höhe der Grafik in Pixeln &period=7200 : Zeitraum in Sekunden der angezeigt werden soll, hier 2h &stime=20131015083000" : Beginn den vorherigen Zeitraumes mit Datum + Uhrzeit 20131015083000 2013 Jahr 10 Monat 15 Tag 08 Stunde 30 Minute 00 Sekunde
Ausgabe: (von cURL)
% Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 41903 0 41903 0 0 137k 0 --:--:-- --:--:-- --:--:-- 137k
Und die Grafik die wir bekommen haben (Datei grafik.png):
Zu beachten ist: Wir haben zwar angegeben das die Grafik 900 x 300 Pixel sein groß soll - aber das ist nur die nackte Grafik ohne Beschriftung! Die Beschriftung kommt noch hinzu!
Es gibt noch eine Menge Optionen zur Anzeige - die ich nach und nach ausklingele
Mögliche Parameter bei Grafiken
curtime
curtime=1381846910381 : keine Ahnung wofür, UNIX-Timestamp ist es NICHT
graphid
graphid=100100000000671 : ID der zu ladenen Grafik
height
height=300 : Höhe der Grafik in Pixeln
period
period=7200 : Zeitraum in Sekunden der angezeigt werden soll, hier 2h
profileIdx
profileIdx=web.screens : ????
profileIdx2
profileIdx2=100100000000671 : ???? Wert scheint der gleiche wie graphid
zu sein - aber wofür?
stime
stime=20131015083000" : Beginn den vorherigen Zeitraumes mit Datum + Uhrzeit 20131015083000 2013 Jahr 10 Monat 15 Tag 08 Stunde 30 Minute 00 Sekunde
updateProfile
updateProfile=1 : ???
width
width=900 : Breite der Grafik in Pixeln
Vorhandene Grafiken gezielt löschen
Beim spielen mit den Grafiken hatte ich es geschafft - Ich hatte eine "herrenlose" Grafik produziert, ohne Hosts etc.
Man kommt nur noch über
Monitoring --> Graph --> Group: all --> Host: all --> Name der Grafik
an diese heran - blöd.
Also löschen! Alles was wir dazu brauchen ist die GraphID, die finden wir im Link der Webseite:
https://10.111.0.60/zabbix/charts.php?sid=eb26d0f15aad0894&form_refresh=1&fullscreen=0&groupid=0&hostid=0&graphid=2002000000002148
Ihr seht schon, die letzen Stellen sind es.
Also, an der API Anmelden und dann mit
curl.exe -X POST -H "Content-Type: application/json" -d "{\"jsonrpc\":\"2.0\",\"method\":\"graph.delete\",\"params\":\"2002000000002148\"],\"auth\":\"ec7b42b81cf6d09b7db5a30d161dec49\",\"id\":1}" http://10.111.0.60/zabbix/api_jsonrpc.php curl.exe -X POST -H "Content-Type: application/json" -d "{\"jsonrpc\":\"2.0\",\"method\":\"graph.delete\",\"params\":\"2002000000002148\"],\"auth\":\"ec7b42b81cf6d09b7db5a30d161dec49\",\"id\":1}" http://10.111.0.60/zabbix/api_jsonrpc.php
löschen. Als Antwort gibt es:
{"jsonrpc":"2.0","result":{"graphids":["2002000000002148"]},"id":1}
die Graph-ID noch mal zurück.
Maps
Liste aller Maps abfragen
Listet alle vorhandenen Maps auf:
curl.exe -X POST -H "Content-Type: application/json" -d"{\"jsonrpc\":\"2.0\",\"method\":\"map.get\",\"params\":{\"output\":[\"name\"],\"sortfield\":\"name\"},\"auth\":\"05a7877f986da73f48d786a438a5b032\", \"id\":1}" http://10.106.207.105/api_jsonrpc.php curl.exe -X POST -H "Content-Type: application/json" -d"{\"jsonrpc\":\"2.0\",\"method\":\"map.get\",\"params\":{\"output\":[\"name\"],\"sortfield\":\"name\"},\"auth\":\"05a7877f986da73f48d786a438a5b032\",\"id\":1}" http://10.106.207.105/api_jsonrpc.php
Ausgabe:
{ "jsonrpc": "2.0", "result": [ { "sysmapid": "100100000000007", "name": "Albert Leymann Baustoffe GmbH" }, { "sysmapid": "100100000000004", "name": "DGHB" }, { "sysmapid": "100100000000008", "name": "DGHB Gesamt" }, { "sysmapid": "100100000000005", "name": "Hochschule für Künste Bremen" }, { "sysmapid": "100100000000006", "name": "Intax Fahrzeugbau" }, { "sysmapid": "100100000000001", "name": "Local network" }, { "sysmapid": "100100000000009", "name": "Test Linz" }, { "sysmapid": "100100000000002", "name": "Test Map DG HRO" }, { "sysmapid": "100100000000003", "name": "Vermessungsbüro Stechert" } ], "id": 1 }
Maps Downloaden
Zuerst müsst ihr euch wie hier beschrieben an der Weboberfläche anmelden (nicht an der API): An_Zabbix_Webseite_mit_cURL_anmelden
Wie haben mit der Abfrage zuvor ja gezielt die ID's der Grafiken ermittelt, z.B.
"sysmapid": "100100000000001", "name": "Local network"
Diese sysmapid benötigen wir für den Download:
curl.exe --cookie tmpjar -o map1.png --remote-name "http://10.106.207.105/map.php?sysmapid=100100000000001&severity_min=1" --cookie tmpjar : Den zuvor erstellten (bei der Anmeldung) Cookie verwenden -o map1.png : Unter diesem Namen wird die Grafik gespeichert (Pfadangaben erlaubt) --remote-name : Webseite von der wir herunterladen wollen (-O wäre auch ok gewesen) "http://10.106.207.105/map.php? : URL von Zabbix, statt login.php hier die map.php sysmapid=100100000000001 : ID der Grafik angeben wie ermittelt &severity_min=1 : Warnstufe der Meldungen, Mögliche Werte: 0 - Not classified 1 - Information 2 - Warning 3 - Average 4 - High 5 - Disaster
Ich habe hier gerade die Standard-Map heruntergeladen die bei Zabbix immer dabei ist:
Im Gegensatz zu den anderen Grafiken wie z.B. ber die CPU Last können wir hier keine weiteren Angaben machen, also auch nicht die Größe/Abmessungen bestimmen.
Nur die Warnstufe lässt sich beinflussen.
Events abfragen
Liste aller Events einer Gruppe abfragen
Listet alle Events der Gruppe mit der Group-ID 2002000000000011 im Zeitraum 01.10.2013 00:00 bis 05.10.2013 00:00 auf:
curl.exe -X POST -H "Content-Type: application/json" -d"{\"jsonrpc\":\"2.0\",\"method\":\"event.get\",\"params\":{\"output\":\"extend\", \"time_from\":\"1380585600\",\"time_till\":\"1380931200\",\"sortfield\":\"eventid\", \"sortorder\": \"desc\",\"groupids\":\"2002000000000011\"},\"auth\":\"b940f4bd3fe2bfa41e8aacaee1c20a14\",\"id\":1}" http://10.111.0.60/zabbix/api_jsonrpc.php curl.exe -k -X POST -H "Content-Type: application/json" -d"{\"jsonrpc\":\"2.0\",\"method\":\"event.get\",\"params\":{\"output\":\"extend\",\"time_from\":\"1380585600\",\"time_till\":\"1380931200\",\"sortfield\":\"eventid\",\"sortorder\": \"desc\",\"groupids\":\"2002000000000011\"},\"auth\":\"b940f4bd3fe2bfa41e8aacaee1c20a14\",\"id\":1}" https://10.111.0.60/zabbix/api_jsonrpc.php
Ausgabe:
{"jsonrpc":"2.0","result":[ {"groupid":"2002000000000011", "eventid":"2002000000790785", "source":"0", "object":"0", "objectid":"2002000000015442", "clock":"1380870488", "value":"1", "acknowledged":"0", "ns":"778135634", "value_changed":"1"}, {"groupid":"2002000000000011", "eventid":"2002000000790786", "source":"0", "object":"0", "objectid":"2002000000015823", "clock":"1380870512", "value":"1", "acknowledged":"0", "ns":"728222800", "value_changed":"1"}, {"groupid":"2002000000000011", "eventid":"2002000000790787", "source":"0", "object":"0", "objectid":"2002000000013949", "clock":"1380870573", "value":"1", "acknowledged":"0", "ns":"823327962", "value_changed":"1"}, {"groupid":"2002000000000011", "eventid":"2002000000790788", "source":"0", "object":"0", "objectid":"2002000000014905", "clock":"1380873642", "value":"2", "acknowledged":"0", "ns":"76816194", "value_changed":"0"}, {"groupid":"2002000000000011", "eventid":"2002000000790789", "source":"0", "object":"0", "objectid":"2002000000014906", "clock":"1380873642", "value":"2", "acknowledged":"0", "ns":"76816194", "value_changed":"0"}, {"groupid":"2002000000000011", "eventid":"2002000000790790", "source":"0", "object":"0", "objectid":"2002000000015823", "clock":"1380876182", "value":"0", "acknowledged":"0", "ns":"321560825", "value_changed":"1"}, {"groupid":"2002000000000011", "eventid":"2002000000790791", "source":"0", "object":"0", "objectid":"2002000000013949", "clock":"1380876273", "value":"0", "acknowledged":"0", "ns":"610356699", "value_changed":"1"}, {"groupid":"2002000000000011", "eventid":"2002000000790792", "source":"0", "object":"0", "objectid":"2002000000015442", "clock":"1380876825", "value":"0", "acknowledged":"0", "ns":"614342012", "value_changed":"1"}, {"groupid":"2002000000000011", "eventid":"2002000000790793", "source":"0", "object":"0", "objectid":"2002000000015385", "clock":"1380878284", "value":"0", "acknowledged":"0", "ns":"571052717", "value_changed":"0"}, {"groupid":"2002000000000011", "eventid":"2002000000790794", "source":"0", "object":"0", "objectid":"2002000000015386", "clock":"1380878284", "value":"0", "acknowledged":"0", "ns":"571052717", "value_changed":"0"}, {"groupid":"2002000000000011", "eventid":"2002000035024994", "source":"0", "object":"0", "objectid":"2002000000014587", "clock":"1380889475", "value":"2", "acknowledged":"0", "ns":"0", "value_changed":"0"}, {"groupid":"2002000000000011", "eventid":"2002000035025072", "source":"0", "object":"0", "objectid":"2002000000015387", "clock":"1380878328", "value":"2", "acknowledged":"0", "ns":"0", "value_changed":"0"}], "id":1}
Alerts abfragen
Alle Alerts im Zeitraum X abfragen
Listet alle Alerts im Zeitraum 01.10.2013 00:00 bis 01.10.2013 08:00:00 auf:
curl.exe -X POST -H "Content-Type: application/json" -d"{\"jsonrpc\":\"2.0\",\"method\":\"alert.get\",\"params\":{\"output\":\"extend\",\"time_from\":\"1380585600\", \"time_till\":\"1380672000\",\"sortfield\":\"alertid\",\"sortorder\": \"desc\"},\"auth\":\"b940f4bd3fe2bfa41e8aacaee1c20a14\",\"id\":1}" http://10.111.0.60/zabbix/api_jsonrpc.php curl.exe -X POST -H "Content-Type: application/json" -d"{\"jsonrpc\":\"2.0\",\"method\":\"alert.get\",\"params\":{\"output\":\"extend\",\"time_from\":\"1380585600\",\"time_till\":\"1380672000\",\"sortfield\":\"alertid\",\"sortorder\": \"desc\"},\"auth\":\"b940f4bd3fe2bfa41e8aacaee1c20a14\",\"id\":1}" http://10.111.0.60/zabbix/api_jsonrpc.php
Ausgabe:
{"jsonrpc":"2.0","result":[ {"users":[ {"userid":"2002000000000003"}] "mediatypes":[ {"mediatypeid":"2002000000000002"}] "alertid":"2000000000029835" "actionid":"2002000000000012" "eventid":"2002000000790767" "userid":"2002000000000003" "clock":"1380586662" "mediatypeid":"2002000000000002" "sendto":"xxx-xxx@xxxxxx.xxx.xx" "subject":"" "message":"Disaster: XX-XX-VeeamBackup_XX-BACKUP: \"Used disk space in %\" (Low free disk space (<1%) on datastore VeeamBackup_XX-BACKUP) - - Host: XX-XX-VeeamBackup_XX-BACKUP - IP:10.10.1.1 - Item: Used disk space in % - Trigger:Low free disk space (<1%) on datastore VeeamBackup_XX-BACKUP - Trigger status: PROBLEM - Trigger severity: Disaster - Trigger URL: - Event Time: 02:17:35 2013.10.01 - - Item values: - - 1. Used disk space in % (XX-XX-VeeamBackup_XX-BACKUP): 99.12 % - 2. *UNKNOWN* (*UNKNOWN*): *UNKNOWN* - 3. *UNKNOWN* (*UNKNOWN*): *UNKNOWN*" "status":"2" "retries":"0" "error":"Media type disabled" "nextcheck":"0" "esc_step":"1" "alerttype":"0"} {"users":[ {"userid":"2002000000000006"}] "mediatypes":[ {"mediatypeid":"2002000000000001"}] "alertid":"2000000000029836" "actionid":"2002000000000005" "eventid":"2002000000790768" "userid":"2002000000000006" "clock":"1380595718" "mediatypeid":"2002000000000001" "sendto":"XXXXXXXXX-XXXXX@datagroup.de" "subject":"Recover: XX-XX-VeeamBackup_XX-BACKUP: \"Used disk space in %\" (Disaster: Low free disk space (<1%) on datastore VeeamBackup_XX-BACKUP)" "message":"Host: XX-XX-VeeamBackup_XX-BACKUP - IP: 10.10.1.1 - Item: Used disk space in % - Trigger:Low free disk space (<1%) on datastore VeeamBackup_XX-BACKUP - Trigger status: OK - Trigger severity: Disaster - Trigger URL: - Event Time: 04:48:35 2013.10.01 - - Item values: - - 1. Used disk space in % (XX-XX-VeeamBackup_XX-BACKUP): 98.28 % - 2. *UNKNOWN* (*UNKNOWN*): *UNKNOWN* - 3. *UNKNOWN* (*UNKNOWN*): *UNKNOWN*" "status":"1" "retries":"0" "error":"" "nextcheck":"0" "esc_step":"0" "alerttype":"0"} {"users":[ {"userid":"2002000000000004"}] "mediatypes":[ {"mediatypeid":"2002000000000001"}] "alertid":"2000000000029837" "actionid":"2002000000000005" "eventid":"2002000000790768" "userid":"2002000000000004" "clock":"1380595718" "mediatypeid":"2002000000000001" "sendto":"XXX-XXXXXXX@datagroup.de" "subject":"Recover: XX-XX-VeeamBackup_XX-BACKUP: \"Used disk space in %\" (Disaster: Low free disk space (<1%) on datastore VeeamBackup_XX-BACKUP)" "message":"Host: XX-XX-VeeamBackup_XX-BACKUP - IP: 10.10.1.1 - Item: Used disk space in % - Trigger:Low free disk space (<1%) on datastore VeeamBackup_XX-BACKUP - Trigger status: OK - Trigger severity: Disaster - Trigger URL: - Event Time: 04:48:35 2013.10.01 - - Item values: - - 1. Used disk space in % (XX-XX-VeeamBackup_XX-BACKUP): 98.28 % - 2. *UNKNOWN* (*UNKNOWN*): *UNKNOWN* - 3. *UNKNOWN* (*UNKNOWN*): *UNKNOWN*" "status":"1" "retries":"0" "error":"" "nextcheck":"0" "esc_step":"0" "alerttype":"0"} {"users":[ {"userid":"2002000000000003"}] "mediatypes":[ {"mediatypeid":"2002000000000002"}] "alertid":"2000000000029838" "actionid":"2002000000000012" "eventid":"2002000000790768" "userid":"2002000000000003" "clock":"1380595718" "mediatypeid":"2002000000000002" "sendto":"XXXX-XXXXX@XXXXXX.XXX.XX" "subject":"" "message":"Recover: XX-XX-VeeamBackup_XX-BACKUP: \"Used disk space in %\" (Disaster: Low free disk space (<1%) on datastore VeeamBackup_XX-BACKUP) - - Host: XX-XX-VeeamBackup_XX-BACKUP - IP: 10.10.1.1 - Item: Used disk space in % - Trigger:Low free disk space (<1%) on datastore VeeamBackup_ XX-BACKUP - Trigger status: OK - Trigger severity: Disaster - Trigger URL: - Event Time: 04:48:35 2013.10.01 - - Item values: - - 1. Used disk space in % (XX-XX-VeeamBackup_XX-BACKUP): 98.28 % - 2. *UNKNOWN* (*UNKNOWN*): *UNKNOWN* - 3. *UNKNOWN* (*UNKNOWN*): *UNKNOWN*" "status":"2" "retries":"0" "error":"Media type disabled" "nextcheck":"0" "esc_step":"0" "alerttype":"0"}] "id":1}
Alle Alerts einer Gruppe im Zeitraum X abfragen
Vorweg: mit alert.get geht es schlichtweg nicht - schaut euch die Ausgabe beim vorherigen Beispiel an - da gibt es nirgends die Group-ID ... also kann man auch nicht danach filtern.
Aber man kann bei event.get den Parameter select_alerts mit angeben - dann bekommen wir zwar immer noch die ganze Liste mit allen Events, also auch die Events die keinen Alarm haben - aber ich habe sie schon mal und kann ja dann die Ausgabe extern filtern:
curl.exe -X POST -H "Content-Type: application/json" -d"{\"jsonrpc\":\"2.0\",\"method\":\"event.get\",\"params\":{\"output\":\"extend\",\"time_from\":\"1382313600\", \"time_till\":\"1382659200\",\"sortfield\":\"eventid\",\"sortorder\": \"desc\",\"select_alerts\":\"extend\", \"groupids\":\"2002000000000015\"},\"auth\":\"b940f4bd3fe2bfa41e8aacaee1c20a14\",\"id\":1}" http://10.111.0.60/zabbix/api_jsonrpc.php curl.exe -X POST -H "Content-Type: application/json" -d"{\"jsonrpc\":\"2.0\",\"method\":\"event.get\",\"params\":{\"output\":\"extend\",\"time_from\":\"1382313600\",\"time_till\":\"1382659200\",\"sortfield\":\"eventid\",\"sortorder\": \"desc\",\"select_alerts\":\"extend\",\"groupids\":\"2002000000000015\"},\"auth\":\"b940f4bd3fe2bfa41e8aacaee1c20a14\",\"id\":1}" http://10.111.0.60/zabbix/api_jsonrpc.php
In der nachfolgende (stark gekürzten) Ausgabe hat das erste Item keinen Alert ( "alerts":[] ), die beiden danach haben einen. In Wirklichkeit waren es ein hundert Items, hier auf 3 gekürzt.
Hier ist eine Tape-Library nicht mehr erreichbar - er meldet das mehrmals auch weil die Empfänger des Alarm nicht erreichbar sind (keine Mailadresse hinterlegt)
Da muss man den Kontext mit auswerten den ich hier habe versucht durch das einrücken darzustellen:
Ausgabe:
{"jsonrpc":"2.0","result":[ {"alerts":[] "groupid":"2002000000000015", "eventid":"2002000037654862", "source":"0", "object":"0", "objectid":"2002000000014088", "clock":"1382337601", "value":"1", "acknowledged":"0", "ns":"474369269", "value_changed":"1"} {"alerts":[ {"mediatypes":[] "users":[{"userid":"2002000000000010"}] "alertid":"2000000000037634", "actionid":"2002000000000005", "eventid":"2002000037654868", "userid":"2002000000000010", "clock":"1382407527", "mediatypeid":"0", "sendto":"", "subject":"Error: XX-XX2-TAPELIB: "Host status" (Host XX-XX2-TAPELIB (168.192.1.65) is down)", "message":"Host: XX-XX2-TAPELIB IP: 168.192.1.65 Item: Host Status Trigger: Host XX-XX2-TAPELIB (168.192.1.65) is down Trigger status: PROBLEM Trigger severity: Error Trigger URL: Event Time: 04:05:20 2013.10.22 Item values: 1. Host status (XX-XX2-TAPELIB): Down/Unreachable (0) 2. *UNKNOWN* (*UNKNOWN*): *UNKNOWN* 3. *UNKNOWN* (*UNKNOWN*): *UNKNOWN*", "status":"2", "retries":"3", "error":"No media defined for user "apiuser apiuser (apiuser)\"", "nextcheck":"0", "esc_step":"1", "alerttype":"0"} {"mediatypes":[] "users":[{"userid":"2002000000000009"}] "alertid":"2000000000037635", "actionid":"2002000000000005", "eventid":"2002000037654868", "userid":"2002000000000009", "clock":"1382407527", "mediatypeid":"0", "sendto":"", "subject":"Error: XX-XX2-TAPELIB: "Host status" (Host XX-XX2-TAPELIB (168.192.1.65) is down)", "message":"Host: XX-XX2-TAPELIB IP: 168.192.1.65 Item: Host Status Trigger: Host XX-XX2-TAPELIB (168.192.1.65) is down Trigger status: PROBLEM Trigger severity: Error Trigger URL: Event Time: 04:05:20 2013.10.22 Item values: 1. Host status (XX-XX2-TAPELIB): Down/Unreachable (0) 2. *UNKNOWN* (*UNKNOWN*): *UNKNOWN* 3. *UNKNOWN* (*UNKNOWN*): *UNKNOWN*", "status":"2", "retries":"3", "error":"No media defined for user \"Bernhard Linz (b.linz)\"", "nextcheck":"0", "esc_step":"1", "alerttype":"0"} {"mediatypes":[] "users":[{"userid":"2002000000000008"}] "alertid":"2000000000037636", "actionid":"2002000000000005", "eventid":"2002000037654868", "userid":"2002000000000008", "clock":"1382407527", "mediatypeid":"0", "sendto":"", "subject":"Error: XX-XX2-TAPELIB: "Host status" (Host XX-XX2-TAPELIB (168.192.1.65) is down)", "message":"Host: XX-XX2-TAPELIB IP: 168.192.1.65 Item: Host Status Trigger: Host XX-XX2-TAPELIB (168.192.1.65) is down Trigger status: PROBLEM Trigger severity: Error Trigger URL: Event Time: 04:05:20 2013.10.22 Item values: 1. Host status (XX-XX2-TAPELIB): Down/Unreachable (0) 2. *UNKNOWN* (*UNKNOWN*): *UNKNOWN* 3. *UNKNOWN* (*UNKNOWN*): *UNKNOWN*", "status":"2", "retries":"3", "error":"No media defined for user "xxxxxx xxxxxxx (x.xxxxxxxx)"", "nextcheck":"0", "esc_step":"1", "alerttype":"0"} {"mediatypes":[] "users":[{"userid":"2002000000000007"}] "alertid":"2000000000037637", "actionid":"2002000000000005", "eventid":"2002000037654868", "userid":"2002000000000007", "clock":"1382407527", "mediatypeid":"0", "sendto":"", "subject":"Error: XX-XX2-TAPELIB: \"Host status\" (Host XX-XX2-TAPELIB (168.192.1.65) is down)", "message":"Host: XX-XX2-TAPELIB IP: 168.192.1.65 Item: Host Status Trigger: Host XX-XX2-TAPELIB (168.192.1.65) is down Trigger status: PROBLEM Trigger severity: Error Trigger URL: Event Time: 04:05:20 2013.10.22 Item values: 1. Host status (XX-XX2-TAPELIB): Down/Unreachable (0) 2. *UNKNOWN* (*UNKNOWN*): *UNKNOWN* 3. *UNKNOWN* (*UNKNOWN*): *UNKNOWN*", "status":"2", "retries":"3", "error":"No media defined for user "Reporting XXXXX XXXXX (XXXX-XXXX)"", "nextcheck":"0", "esc_step":"1", "alerttype":"0"} {"mediatypes":[ {"mediatypeid":"2002000000000001", "type":"0", "description":"Email", "smtp_server":"127.0.0.1", "smtp_helo":"XXXXX-XXX-XX.XXX-XXX.XX", "smtp_email":"zabbix@XXXXX.XX-XX.XX", "exec_path":"", "gsm_modem":"", "username":"", "passwd":"", "status":"0"}] "users":[ {"userid":"2002000000000006"}] "alertid":"2000000000037638", "actionid":"2002000000000005", "eventid":"2002000037654868", "userid":"2002000000000006", "clock":"1382407527", "mediatypeid":"2002000000000001", "sendto":"xxxxxxxxxx-xxxxxxxxx@xxxxxxxxxx.xx", "subject":"Error: XX-XX2-TAPELIB: "Host status" (Host XX-XX2-TAPELIB (168.192.1.65) is down)", "message":"Host: XX-XX2-TAPELIB IP: 168.192.1.65 Item: Host Status Trigger: Host XX-XX2-TAPELIB (168.192.1.65) is down Trigger status: PROBLEM Trigger severity: Error Trigger URL: Event Time: 04:05:20 2013.10.22 Item values: 1. Host status (XX-XX2-TAPELIB): Down/Unreachable (0) 2. *UNKNOWN* (*UNKNOWN*): *UNKNOWN* 3. *UNKNOWN* (*UNKNOWN*): *UNKNOWN*", "status":"1", "retries":"0", "error":"", "nextcheck":"0", "esc_step":"1", "alerttype":"0"} {"mediatypes":[] "users":[ {"userid":"2002000000000005"}] "alertid":"2000000000037639", "actionid":"2002000000000005", "eventid":"2002000037654868", "userid":"2002000000000005", "clock":"1382407527", "mediatypeid":"0", "sendto":"", "subject":"Error: XX-XX2-TAPELIB: "Host status" (Host XX-XX2-TAPELIB (168.192.1.65) is down)", "message":"Host: XX-XX2-TAPELIB IP: 168.192.1.65 Item: Host Status Trigger: Host XX-XX2-TAPELIB (168.192.1.65) is down Trigger status: PROBLEM Trigger severity: Error Trigger URL: Event Time: 04:05:20 2013.10.22 Item values: 1. Host status (XX-XX2-TAPELIB): Down/Unreachable (0) 2. *UNKNOWN* (*UNKNOWN*): *UNKNOWN* 3. *UNKNOWN* (*UNKNOWN*): *UNKNOWN*", "status":"2", "retries":"3", "error":"No media defined for user \"XXX XXXXXX (XXX XXXXXXXX)\"", "nextcheck":"0", "esc_step":"1", "alerttype":"0"} {"mediatypes":[ {"mediatypeid":"2002000000000001", "type":"0", "description":"Email", "smtp_server":"127.0.0.1", "smtp_helo":"XXXX-XXX-XX.XXXXXXXXX-XXXXXX.XX", "smtp_email":"zabbix@XXXXX.XXXXXX-XXXXXX.XX", "exec_path":"", "gsm_modem":"", "username":"", "passwd":"", "status":"0"}] "users":[{"userid":"2002000000000004"}] "alertid":"2000000000037640", "actionid":"2002000000000005", "eventid":"2002000037654868", "userid":"2002000000000004", "clock":"1382407527", "mediatypeid":"2002000000000001", "sendto":"XXX-XXXXXXX@xxxxxxxxxxx.xx", "subject":"Error: XX-XX2-TAPELIB: \"Host status\" (Host XX-XX2-TAPELIB (168.192.1.65) is down)", "message":"Host: XX-XX2-TAPELIB IP: 168.192.1.65 Item: Host Status Trigger: Host XX-XX2-TAPELIB (168.192.1.65) is down Trigger status: PROBLEM Trigger severity: Error Trigger URL: Event Time: 04:05:20 2013.10.22 Item values: 1. Host status (XX-XX2-TAPELIB): Down/Unreachable (0) 2. *UNKNOWN* (*UNKNOWN*): *UNKNOWN* 3. *UNKNOWN* (*UNKNOWN*): *UNKNOWN*", "status":"1", "retries":"0", "error":"", "nextcheck":"0", "esc_step":"1", "alerttype":"0"} {"mediatypes":[] "users":[ {"userid":"2002000000000003"}] "alertid":"2000000000037641", "actionid":"2002000000000005", "eventid":"2002000037654868", "userid":"2002000000000003", "clock":"1382407527", "mediatypeid":"0", "sendto":"", "subject":"Error: XX-XX2-TAPELIB: \"Host status\" (Host XX-XX2-TAPELIB (168.192.1.65) is down)", "message":"Host: XX-XX2-TAPELIB IP: 168.192.1.65 Item: Host Status Trigger: Host XX-XX2-TAPELIB (168.192.1.65) is down Trigger status: PROBLEM Trigger severity: Error Trigger URL: Event Time: 04:05:20 2013.10.22 Item values: 1. Host status (XX-XX2-TAPELIB): Down/Unreachable (0) 2. *UNKNOWN* (*UNKNOWN*): *UNKNOWN* 3. *UNKNOWN* (*UNKNOWN*): *UNKNOWN*", "status":"2", "retries":"3", "error":"No media defined for user "xxxxxx xxxxxxx (x.xxxxxxx)\"", "nextcheck":"0", "esc_step":"1", "alerttype":"0"} {"mediatypes":[] "users":[ {"userid":"2002000000000010"}] "alertid":"2000000000037642", "actionid":"2002000000000012", "eventid":"2002000037654868", "userid":"2002000000000010", "clock":"1382407527", "mediatypeid":"0", "sendto":"", "subject":"", "message":"Error: XX-XX2-TAPELIB: "Host status" (Host XX-XX2-TAPELIB (168.192.1.65) is down) Host: XX-XX2-TAPELIB IP: 168.192.1.65 Item: Host status Trigger: Host XX-XX2-TAPELIB (168.192.1.65) is down Trigger status: PROBLEM Trigger severity: Error Trigger URL: Event Time: 04:05:20 2013.10.22 Item values: 1. Host status (XX-XX2-TAPELIB): Down\/Unreachable (0) 2. *UNKNOWN* (*UNKNOWN*): *UNKNOWN* 3. *UNKNOWN* (*UNKNOWN*): *UNKNOWN*", "status":"2", "retries":"3", "error":"No media defined for user "xxxxx xxxxxx (xxxxxxx)\"", "nextcheck":"0", "esc_step":"1", "alerttype":"0"} ... ... "id":1}