[PYTHON] RSS-Daten in Zabbix speichern (externe Prüfung)

Ich habe einen einfachen Mechanismus zum Überwachen von RSS-Updates mit Zabbix entwickelt. Weil es nicht allein durch die Funktion von Zabbix implementiert werden kann. Ich habe es mit der externen Prüfung von Zabbix implementiert. Es wäre schön gewesen, das RSS als Text auszugeben und den Unterschied zum vorherigen Mal zu erhalten, aber wenn der Zabbix-Server ausfällt und auf einem anderen Server ausgeführt wird, wird die Prüfdatei verschoben. Ich habe mich für einen externen Check entschieden, weil es ein Ärger war und ich ihn definitiv vergessen würde.

Umgebung

--CentOS 8.0 (Zugang zum Internet)

Was wurde erreicht?

Sprich hier nicht

Was ich mit Python realisiert habe

In Python wurde der Vorgang ausgeführt, bei dem das RSS über das Internet abgerufen, der Titel und das Aktualisierungsdatum abgerufen und in eine Zeile geschrieben wurden. Die Ausgabe ist Text, sodass sie schließlich an Zabbix übertragen wird. (Wenn Sie API verwenden, können Sie möglicherweise im JSON-Format arbeiten, aber diesmal habe ich es nicht getan.) Da ich keine doppelten Daten an Zabbix senden möchte, habe ich außerdem eine Methode gewählt, um die Daten von Artikeln zu erfassen, die während der vorherigen Erfassungszeit aktualisiert wurden, anstatt alle Fälle zu erfassen.

In Bezug auf die Ausgabe speichert die externe Prüfung von Zabbix das Ergebnis der Standardausgabe im Artikel, sodass die Ausgabe per Druck erfolgt.

Der Code ist unten.

RSS_Checker.py


#!/bin/env python3
import feedparser
from datetime import datetime, timedelta, timezone

#Stellen Sie die vorherige Periode ein(Geben Sie diesmal die Zeit vor einer Stunde an)
lasttime = (datetime.utcnow() - timedelta(hours=1))

#Holen Sie sich RSS
RSS_URL = "(Geben Sie die URL an)"
feed = feedparser.parse(RSS_URL)

#Aktualisieren Sie Artikel seit dem letzten Mal
def f(entry):
    return datetime(*entry.updated_parsed[:6]) >= lasttime

#Wählen Sie Daten mit der Filterfunktion aus
rdflists = filter(f, feed.entries)

#Wenn es nichts gibt, endet der Prozess
if not rdflists:
    sys.exit()

#Ausgabe bei Daten
for entry in rdflists:
    title = entry.title
    link = entry.link
    time = entry.updated

    print (title, link, time) 

Platzierung des Codes auf dem Zabbix-Server

Wenn Sie die externe Überprüfungsfunktion von Zabbix verwenden möchten, müssen Sie die Skriptdatei im Pfad von ExternalScripts in zabbix_server.conf ablegen. Die folgenden Ordner sind standardmäßig angegeben.

ExternalScripts=/usr/lib/zabbix/externalscripts

Vergessen Sie auch nicht, Ausführungsberechtigungen und Eigentümereinstellungen festzulegen, damit Zabbix-Benutzer sie ausführen können.

# cd /usr/lib/zabbix/externalscripts
# chmod 744 RSS_Checker.py
# chown zabbix:zabbix RSS_Checker.py
# ls -l
-rwxr--r-- 1 zabbix zabbix 1200 Jan 01 01:23 RSS_Checker.py

Was Sie in Zabbix eingestellt haben

Zabbix erstellt einen eigenen Gegenstand.

Item 設定画面.jpeg

Wählen Sie als Typ "Externe Prüfung". Als Datentyp wird Text ausgewählt. Da die Hostschnittstelle auf dem Zabbix-Server ausgeführt wird, geben Sie "127.0.0.1:10051" an. Das Überwachungsintervall muss an die im Code angegebene Differenzzeit angepasst werden, sodass es entsprechend geändert werden muss. Lange Codeintervalle können zu doppelter Datenspeicherung führen, und lange Intervalle zur Artikelüberwachung können zu fehlenden Erfassungen führen.

Was hat nicht funktioniert

Bei dieser Konfiguration hat das Zabbix-Element die Daten gespeichert, es gab jedoch zwei Probleme.

  1. Auch wenn mehrere Informationen zur Ausgabeaktualisierung vorhanden sind, werden diese als ein Datensatz in Zabbix gespeichert.
  2. Ein leerer Datensatz wird erstellt, auch wenn keine Aktualisierungsinformationen vorhanden sind.

Es gibt kein besonderes Problem, wenn Sie eine Zeichenkette mit Trigger aufnehmen und benachrichtigen, aber sie ist nicht schön. Ich habe einige Nachforschungen angestellt und es gesehen, aber ich konnte nichts über das Verhalten der Textspeicherung des externen Schecks herausfinden. Das gleiche Ergebnis wurde erhalten, wenn der Datentyp des Elements "log" oder "Zeichenfolge" war.

Ich konnte keine Lösung für dieses Problem finden, aber ich konnte es integrieren, also beschloss ich, es zu vervollständigen.

Hmmm, aber immer noch nicht schön. ..

(Fortsetzen)

Referenzseite

Recommended Posts

RSS-Daten in Zabbix speichern (externe Prüfung)
RSS-Daten in Zabbix speichern (Zabbix-Absender)
Suchen Sie mit Python nach externen Befehlen
Überprüfen Sie die Datenzusammenfassung in CASTable
Überprüfen Sie, ob in Python externe Befehle vorhanden sind (z. B. `which`).
Abtastung in unausgeglichenen Daten
Speichern Sie auf Japanisch in StringProperty im Google App Engine-Datenspeicher