[PYTHON] Stocker les données RSS dans Zabbix (vérification externe)

J'ai créé un mécanisme simple pour surveiller les mises à jour RSS avec Zabbix. Parce qu'il ne peut pas être implémenté par la fonction de Zabbix seule. Je l'ai implémenté en utilisant le contrôle externe de Zabbix. Cela aurait été bien de sortir le RSS en texte et d'obtenir la différence par rapport à la fois précédente, mais lorsque le serveur Zabbix échoue et qu'il démarre sur un autre serveur, le fichier de contrôle est déplacé. J'ai choisi une vérification externe parce que c'était un problème et je l'oublierais certainement.

environnement

Ce qui a été réalisé

Ne parle pas ici

--Comment initialiser Python

Ce que j'ai réalisé avec Python

En Python, le processus d'obtention du RSS via Internet, d'obtention du titre et de la date de mise à jour et de l'écriture sur une seule ligne a été effectué. La sortie est du texte afin qu'elle soit éventuellement transférée vers Zabbix. (Si vous utilisez l'API, vous pourrez peut-être utiliser le format JSON, mais je ne l'ai pas fait cette fois.) De plus, comme je ne souhaite pas envoyer de doublons à Zabbix, j'ai décidé d'acquérir les données des articles mis à jour lors de l'acquisition précédente au lieu d'acquérir tous les cas.

En ce qui concerne la sortie, la vérification externe de Zabbix stocke le résultat de la sortie standard dans l'élément, donc la sortie se fait par impression.

Le code est ci-dessous.

RSS_Checker.py


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

#Définir la période précédente(Cette fois, spécifiez l'heure il y a une heure)
lasttime = (datetime.utcnow() - timedelta(hours=1))

#Obtenez RSS
RSS_URL = "(Spécifiez l'URL)"
feed = feedparser.parse(RSS_URL)

#Obtenez des articles mis à jour depuis la dernière fois
def f(entry):
    return datetime(*entry.updated_parsed[:6]) >= lasttime

#Sélectionnez les données à l'aide de la fonction de filtrage
rdflists = filter(f, feed.entries)

#Quand il n'y a rien, le processus se termine
if not rdflists:
    sys.exit()

#Sortie lorsqu'il y a des données
for entry in rdflists:
    title = entry.title
    link = entry.link
    time = entry.updated

    print (title, link, time) 

Placement de code sur le serveur Zabbix

Si vous souhaitez utiliser la fonction de vérification externe de Zabbix, vous devez placer le fichier de script dans le chemin de ExternalScripts dans zabbix_server.conf. Les dossiers suivants sont spécifiés par défaut.

ExternalScripts=/usr/lib/zabbix/externalscripts

N'oubliez pas non plus de définir les autorisations d'exécution et les paramètres du propriétaire afin que les utilisateurs de Zabbix puissent s'exécuter.

# 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

Ce que vous définissez dans Zabbix

Zabbix crée son propre élément.

Item 設定画面.jpeg

Sélectionnez "Contrôle externe" comme type. Le texte est sélectionné comme type de données. Puisque l'interface hôte s'exécute sur le serveur Zabbix, spécifiez "127.0.0.1:10051". L'intervalle de surveillance doit être ajusté au temps de différence spécifié dans le code, il doit donc être modifié le cas échéant. De longs intervalles de code peuvent entraîner un stockage de données en double, et de longs intervalles de surveillance des éléments peuvent conduire à des acquisitions manquées.

Ce qui n'a pas fonctionné

Avec cette configuration, l'élément Zabbix stockait les données, mais il y avait deux problèmes.

  1. Même s'il y a plusieurs informations de mise à jour de sortie, elles seront stockées comme un seul enregistrement dans Zabbix.
  2. Un enregistrement vide est créé même s'il n'y a aucune information de mise à jour.

Il n'y a pas de problème particulier lors de la prise d'une chaîne de caractères avec Trigger et de sa notification, mais ce n'est pas beau. J'ai fait des recherches et je l'ai vu, mais je n'ai pas pu découvrir le comportement du stockage de texte du chèque externe. Le même résultat a été obtenu lorsque le type de données de l'élément était «journal» ou «chaîne de caractères».

Je n'ai pas trouvé de solution à ce problème, mais j'ai pu l'intégrer, j'ai donc décidé de le compléter.

Hmmm, mais toujours pas beau. ..

(Continuer)

Site de référence

Recommended Posts

Stocker les données RSS dans Zabbix (vérification externe)
Stocker les données RSS dans Zabbix (expéditeur Zabbix)
Rechercher des commandes externes avec python
Vérifiez le résumé des données dans CASTable
Vérifiez l'existence de commandes externes en Python (comme `which`)
Échantillonnage dans des données déséquilibrées
Enregistrer en japonais dans StringProperty dans le magasin de données Google App Engine