Eigene Check Bilbliothek
Hier landen eigen gebaute Checks

Endian VPN Überwachung
Beschreibung: 

 Ein Custom Check für ein python Script zur endian VPN überwachung. Dieses script gibt Graphen mit Anzahl der Verbindung für jede VPN Instanzen aus. und eine Gesamtverbindungsübersicht für alle VPN Instanzen. 

 Das Script: 

 

 Endian RVS5 

 #!/bin/bash 

 STRING=$(python /root/checkmk_setup/check_metrics4_rvs5.py openvpn_users | grep openvpn) IFS=' ' read -ra vpn_array <<< "$STRING" LEN=${#vpn_array[@]} printf "0 \"OPENVPN Users\" " for (( i=5; i<$LEN; i++)) do       IFS=' ' read -ra part <<< ${vpn_array[$i]}       printf "VPNCONF-${part[0]}"       if [ $i -lt $(expr $LEN - 1) ]           then               printf "|"       fi done printf "\n" 

 

 #echo "0 \"OpenVPN Users\" metric=10|metric1=20|metric3=40" 

 

 

 

 

 Endian RVS6 

 #!/bin/bash 

 STRING=$(python /root/checkmk_setup/check_metrics4.py openvpn_users | grep openvpn) IFS=' ' read -ra vpn_array <<< "$STRING" LEN=${#vpn_array[@]} printf "0 \"OPENVPN Users\" " for (( i=5; i<$LEN; i++)) do       IFS='=' read -ra part <<< ${vpn_array[$i]}       printf "VPNCONF-${part[0]}=${part[1]}"       if [ $i -lt $(expr $LEN - 1) ]           then               printf "|"       fi done printf "\n" 

 

 #echo "0 \"OpenVPN Users\" metric=10|metric1=20|metric3=40" 

 

 

 Es ruft 

 python /root/checkmk_setup/check_metrics4.py openvpn_users | grep openvpn 

 Ausgabe: 

 openvpn_users_total: 7 users (OK) | openvpn.2.conf_rvs6test_UDP_tecmata=6 openvpn.1.conf_rvs6test_TCP_tecmata=1 total_vpn_users=7 

 Diese Ausgabe muss dann nur noch in das Checkmk Format gebracht werden. Das macht das Script. Die Ausgabe vom Script sieht dann so aus. Befehl 

 . /usr/lib/check_mk_agent/local/vpn

Ausgabe:

0 "OPENVPN Users" VPNCONF-openvpn.2.conf_rvs6test_UDP_tecmata=6|VPNCONF-openvpn.1.conf_rvs6test_TCP_tecmata=1|VPNCONF-total_vpn_users=7

 

 

 Überarbeitet Script mit Metriken für Schwellwerte. Der Doppelpunkt hinter einem Wert heißt darunter und nicht darüber. 

 

 Endian RVS5 

 #!/bin/bash WARN=8 CRIT=1 STRING=$(python /root/checkmk_setup/check_metrics4_rvs5.py openvpn_users | grep openvpn) IFS=' ' read -ra vpn_array <<< "$STRING" LEN=${#vpn_array[@]} printf "P \"OPENVPN Users Metrik\" " for (( i=5; i<$LEN; i++)) do           IFS=' ' read -ra part <<< ${vpn_array[$i]}           printf "VPNCONF-${part[0]}"           if [ $i -lt $(expr $LEN - 1) ]           then                   printf "|"           else                   printf ";$WARN:;$CRIT:"           fi done printf "\n" 

 

 #echo "0 \"OpenVPN Users\" metric=10|metric1=20|metric3=40;8:;1:" 

 

 

 

 Endian RVS6 

 #!/bin/bash WARN=8 CRIT=1 STRING=$(python /root/checkmk_setup/check_metrics4.py openvpn_users | grep openvpn) IFS=' ' read -ra vpn_array <<< "$STRING" LEN=${#vpn_array[@]} printf "P \"OPENVPN Users Metrik\" " for (( i=5; i<$LEN; i++)) do           IFS='=' read -ra part <<< ${vpn_array[$i]}           printf "VPNCONF-${part[0]}=${part[1]}"           if [ $i -lt $(expr $LEN - 1) ]           then                   printf "|"           else                   printf ";$WARN:;$CRIT:"           fi done printf "\n" 

 

 #echo "0 \"OpenVPN Users\" metric=10|metric1=20|metric3=40;8:;1:" 

 

 Installation des VPN Python Script im System 

 In endian RVS5 

 Der unterschied in RVS5 zu 6 sind die Pfade für die OPENVPN Log 

 In RVS5 liegen diese unter os.chdir("/var/volatile/tmp") Somit muss im Script der Pfad angepasst werden. 

 Nach os.chdir im Abschnitt openvpnuser suchen und anpassen nach os.chdir("/var/volatile/tmp") Wurde aber schon gemacht in der Datei : check_metrics4_rvs5.py 

 Die check_metrics4_rvs5.py auf den RVS kopieren. Zum Beispiel nach  ~/checkmk_setup/ 

 Das Script erstellen mit 

 nano /usr/lib/check_mk_agent/local/vpn 

 Das das Script rein, mit oder Ohne Metrik. Halt was gewünscht ist. Wenn mit Metrik, nicht vergessen die Metrik Werte anzupassen. Und den Pfad zur Checkmetric4 Python File anpassen, da es ja RVS5 oder 6 sein kann 

 nun das Script noch ausführbar machen 

 chmod +x /usr/lib/check_mk_agent/local/vpn 

 Nun erscheint der Service in den Services vom Host 

   

 In endian RVS6 

 Der unterschied in RVS5 zu 6 sind die Pfade für die OPENVPN Log 

 In RVS6 liegen diese unter os.chdir("/run/openvpn") Somit muss im Script der Pfad angepasst werden. Nach os.chdir im Abschnitt openvpn suchen und anpassen nach os.chdir("/run/openvpn") Wurde aber schon gemacht in der Datei : check_metrics4.py 

 Die check_metrics4.py auf den RVS kopieren. Zum Beispiel nach ~/checkmk_setup/ 

 Das Script erstellen mit 

 nano /usr/lib/check_mk_agent/local/vpn 

 Das das Script rein, mit oder Ohne Metrik. Halt was gewünscht ist. Wenn mit Metrik, nicht vergessen die Metrik Werte anzupassen. Und den Pfad zur Checkmetric4 Python File anpassen, da es ja RVS5 oder 6 sein kann 

 nun das Script noch ausführbar machen 

 chmod +x /usr/lib/check_mk_agent/local/vpn 

 Nun erscheint der Service in den Services vom Host

MongoDB Größen überwachung
Beschreibung: 

 Ein lokal check, der alle collections durchgeht und ausgibt. Der Check muss auf dem MongoDB Server eingefügt werden, da er eijne Localhostverbindung zum MongoDB Server aufbaut. 

 Das Script 

 #!/usr/bin/python3

from pymongo import MongoClient

# Konstanten für Schwellwerte

WARNUNGSGROESSE_GB = 0.5

KRITISCHGROESSE_GB = 1.0

# Verbindung zur MongoDB herstellen

client = MongoClient('mongodb://localhost:27017/')

# Alle Datenbanknamen abrufen

db_names = client.list_database_names()

# Durch jede Datenbank iterieren und die Statistiken abrufen

for db_name in db_names:

 db = client[db_name]

 stats = db.command('dbstats')

 # Größe in Gigabytes umrechnen

 groesse_gb = stats['dataSize'] / (1024**3)

 # Prüfe die Größe gegen Schwellwerte und gebe entsprechenden Status aus

 if groesse_gb > KRITISCHGROESSE_GB:

 status = 2 # Kritisch

 status_message = "CRITICAL"

 elif groesse_gb > WARNUNGSGROESSE_GB:

 status = 1 # Warnung

 status_message = "WARNING"

 else:

 status = 0 # OK

 status_message = "OK"

 #Zeile um den Status ausgeben, wenn checkmk nicht benutzt wird, hier auskommentiert da es ja ein checkmk Check wird

 #print(f"{status} MongoDB_{db_name}_Groesse - {status_message} - Groesse: {groesse_gb:.2f} GB")

 #Zeile die Augegeben wird für Check_MK

 print(f"P \"MongoDB_{db_name}_Groesse\" size={groesse_gb:.2f};{WARNUNGSGROESSE_GB};{KRITISCHGROESSE_GB}")

# MongoDB-Verbindung schließen

client.close()

 

 Hier auchnochmals als download: mongodbsizes.py 

 Installation: Das script in folgendem Pfad anlegen bzw. hin kopieren 

 /usr/lib/check_mk_agent/local/mongodbsizes.py 

 Nun noch ausführbar machen. 

 chmod +x /usr/lib/check_mk_agent/local/mongodbsizes.py 

 Fertig

Process Speicherüberwachung
Beschreibung: 

 Ein lokal check der alle Prozesses nach Speichergröße sortiert. Auf Grund der Prozessmenge auf 20 Stück Limitiert. Bei diesem Check gehts auch nur darum die Speicherfresser zu finden. Die Schwellwerte WARN und CRIT können über die Variablen WARN und CRIT gesetzt werden. Die Einheit ist MB 

 Das Script 

 Einmal als Einzelauflistung: 

 #!/usr/bin/python3

import subprocess

import re

# Schwellenwerte in Megabyte

WARN = 1000 # Beispiel: 1000 MB

CRIT = 2000 # Beispiel: 2000 MB

COUNT_PROC = 20 # Anzahl der Prozesse, die ausgeben werden sollen - maximal 20

# Programmvariablen, bitte nicht verändern

output = "P \"Speicherverbrauch der Prozesse in MB\" "

# Führe den `ps`-Befehl aus, um Prozessname und Speicherverbrauch (RSS) zu bekommen

process = subprocess.Popen(['ps', '-eo', 'rss,comm', '--sort=-rss'], stdout=subprocess.PIPE)

stdout = process.communicate()[0]

# Verarbeite jede Zeile der Ausgabe

for i, line in enumerate(stdout.decode('utf-8').strip().split('\n')[1:]): # Überspringe die Kopfzeile

 if i >= COUNT_PROC: # Limit auf COUNT_PROC Prozesse

 break

 

 parts = line.split(None, 1)

 memory = int(parts[0]) // 1000 # Konvertiere RSS von KB zu MB

 process = re.sub('[^a-zA-Z0-9]', '_', parts[1]) # Ersetze alle nicht alphanumerischen Zeichen durch Unterstriche

 # Hinzufügen der Performance-Daten für jeden Prozess zum Output

 output += f"NR-{i:02d}-{process}={memory};{WARN};{CRIT}|"

# Entferne das letzte Semikolon

output = output.rstrip('|')

# Entferne Kommas und Unterstriche (wenn nötig)

output = output.replace(',', '').replace('_', '')

# Ausgabe des gesammelten Outputs

print(output)

 

 Ausgabe: 

 P "Speicherverbrauch der Prozesse in MB" NR-00-kvm=67338;1000;2000|NR-01-kvm=4382;1000;2000|NR-02-kvm=4307;1000;2000|NR-03-cephosd=3305;1000;2000|NR-04-cephosd=3099;1000;2000|NR-05-cephosd=2875;1000;2000|NR-06-cephosd=2679;1000;2000|NR-07-kvm=1879;1000;2000|NR-08-kvm=1264;1000;2000|NR-09-kvm=916;1000;2000|NR-10-java=576;1000;2000|NR-11-cephmon=491;1000;2000|NR-12-kvm=436;1000;2000|NR-13-kvm=420;1000;2000|NR-14-cephmgr=325;1000;2000|NR-15-mongod=167;1000;2000|NR-16-corosync=165;1000;2000|NR-17-pveproxy=157;1000;2000|NR-18-launcher=154;1000;2000|NR-19-pveproxy=144;1000;2000 

 Als Gesamtspeicherzusammenfassung: 

 #!/usr/bin/python3

import subprocess

import re

# Schwellenwerte in Megabyte

WARN = 1000 # Beispiel: 1000 MB

CRIT = 2000 # Beispiel: 2000 MB

COUNT_PROC = 20 # Anzahl der Prozesse, die ausgegeben werden sollen - maximal 20

# Programmvariablen, bitte nicht verändern

output = "P \"Speicherverbrauch der Prozesse in MB\" "

# Führe den `ps`-Befehl aus, um Prozessname und Speicherverbrauch (RSS) zu bekommen

process = subprocess.Popen(['ps', '-eo', 'rss,comm', '--sort=-rss'], stdout=subprocess.PIPE)

stdout = process.communicate()[0]

# Speichere Speicherverbrauch pro Prozessname in einem Wörterbuch

memory_usage = {}

# Verarbeite jede Zeile der Ausgabe

for line in stdout.decode('utf-8').strip().split('\n')[1:]: # Überspringe die Kopfzeile

 parts = line.split(None, 1)

 memory = int(parts[0]) // 1000 # Konvertiere RSS von KB zu MB

 process_name = re.sub('[^a-zA-Z0-9]', '_', parts[1]) # Ersetze alle nicht alphanumerischen Zeichen durch Unterstriche

 # Addiere den Speicherverbrauch für gleiche Prozessnamen

 if process_name in memory_usage:

 memory_usage[process_name] += memory

 else:

 memory_usage[process_name] = memory

# Sortiere Prozesse nach Speicherverbrauch, beschränke auf COUNT_PROC Einträge

sorted_processes = sorted(memory_usage.items(), key=lambda x: x[1], reverse=True)[:COUNT_PROC]

# Generiere die Ausgabezeile für die Prozesse

for i, (process, mem) in enumerate(sorted_processes):

 output += f"{process}={mem};{WARN};{CRIT}|"

# Entferne das letzte Semikolon

output = output.rstrip('|')

# Ausgabe des gesammelten Outputs

print(output)

 

 Ausgabe: 

 P "Speicherverbrauch der Prozesse in MB" kvm=80987;1000;2000|ceph_osd=12535;1000;2000|java=588;1000;2000|ceph_mon=485;1000;2000|pvedaemon_worke=423;1000;2000|pveproxy_worker=423;1000;2000|ceph_mgr=325;1000;2000|corosync=165;1000;2000|mongod=165;1000;2000|pveproxy=157;1000;2000|launcher=154;1000;2000|pvedaemon=136;1000;2000|pvescheduler=113;1000;2000|pve_ha_crm=111;1000;2000 

   

 Installation 

 Auf dem zu überwachenden Server nach 

 nano /usr/lib/check_mk_agent/local/process.py

chmod +x /usr/lib/check_mk_agent/local/process.py 

 kopieren oder editieren über einfügen