Checkmk
to checkmk.com

1. Einleitung

Wir setzen an dieser Stelle voraus, dass Sie sich schon mit den Grundlagen von Datenquellenprogrammen und Spezialagenten auseinandergesetzt haben und die prinzipiellen Mechanismen verstehen. Spezialagenten erweitern ein Datenquellenprogramm um die einfache Konfigurierbarkeit. Dafür werden Regeln im Setup genutzt. Die Konfigurierbarkeit kann hierbei sowohl Umfang und Art der eingeholten Daten betreffen als auch deren Vorverarbeitung, bevor diese als Agentenausgabe in die weitere Verarbeitungskette übergeben werden.

Jeder Spezialagent ist ein selbstständig lauffähiges Programm ohne Abhängigkeiten zu Programmierschnittstellen von Checkmk. Wie bei Datenquellenprogrammen erfolgt auch bei Spezialagenten der Aufruf im üblichen Check-Intervall (standardmäßig ist dies meist eine Minute). Ein Prozess wird durch den Spezialagenten gestartet und eine Agentenausgabe auf der Standardausgabe übergeben. Danach beendet sich der Spezialagent. Dies erlaubt es Ihnen, Spezialagenten in beliebigen Programmiersprachen zu implementieren. Allerdings bedeuten kurz laufende Prozesse, dass Just-in-time-kompilierte Sprachen wie Java eher weniger geeignet sind als kompilierte Sprachen oder schnell startende interpretierte Sprachen.

Die Konfiguration der gestarteten Prozesse erfolgt über Kommandozeilenparameter beim Aufruf des Spezialagenten. Hierfür bestimmen Sie, in welcher Weise GUI-Elemente wie Texteingabefelder oder Checkboxen auf bestimmte Parameter abgebildet werden.

Die Code-Beispiele dieses Artikels finden Sie in unserem GitHub-Repository und den fertig gebauten Open-Meteo-Spezialagenten zudem als MKP in der Checkmk-Exchange.

2. Einen „minimalen“ Spezialagenten erstellen

Tip

Auch im Zusammenhang mit der Entwicklung von Spezialagenten müssen Sie darauf achten, jeweils den Instanzbenutzer für die Dateierstellung zu verwenden. Sind Eigentümer oder Berechtigungen nicht korrekt gesetzt, kann es zu Problemen und Inkompatibilitäten kommen.

Im Gegensatz zum Datenquellenprogramm kann ein Spezialagent nicht an einer beliebigen Stelle im Dateisystem liegen. Er hat seinen Platz in der Verzeichnishierarchie von Checkmk. Zudem muss der Dateiname mit agent_ beginnen. Des weiteren müssen Spezialagenten immer der Checkmk-Instanz bekannt gemacht werden. Ein minimaler, lauffähiger Spezialagent benötigt also wenigstens drei Dateien: den Spezialagenten, die Regelkonfiguration und die Aufrufkonfiguration.

2.1. Vorbereitung der Umgebung

Vorbereitend sollten Sie daher drei Dateiverzeichnisse anlegen, die sich alle unterhalb von ~/local/lib/python3/cmk_addons/plugins/<plug-in_family> befinden. Das im Beispiel gezeigte vierte ist optional, er wird gegebenenfalls für einen agentenbasierten Check verwendet.

OMD[mysite]:~$ mkdir -p local/lib/python3/cmk_addons/plugins/hellospecial/libexec
OMD[mysite]:~$ mkdir -p local/lib/python3/cmk_addons/plugins/hellospecial/rulesets
OMD[mysite]:~$ mkdir -p local/lib/python3/cmk_addons/plugins/hellospecial/server_side_calls
OMD[mysite]:~$ mkdir -p local/lib/python3/cmk_addons/plugins/hellospecial/agent_based

2.2. Der Spezialagent

Was wäre für einen minimalen Spezialagenten besser geeignet als ein lokaler Check, der einen „Hallo Welt!“ Dienst bereitstellt? Das gelingt bereits einem simplen Shell-Skript, welches zwei Zeilen Ausgabe erzeugt:

~/local/lib/python3/cmk_addons/plugins/hellospecial/libexec/agent_hellospecial
#!/bin/bash
echo '<<<local>>>'
echo '0 "Hello special" - This static service is always OK'
Tip

Dieses Skript darf keine Dateiendung haben.

Nicht vergessen: Die Datei muss ausführbar gemacht werden:

OMD[mysite]:~$ chmod 755 local/lib/python3/cmk_addons/plugins/hellospecial/libexec/agent_hellospecial

Damit vergeben Sie die notwendigen Berechtigungen:

  • für den Eigentümer der Datei (Lesen, Schreiben, Ausführen)

  • für die mit einer Datei verknüpfte Gruppe (Lesen, Ausführen)

  • für andere Benutzer (Lesen, Ausführen).

2.3. Die Regelkonfiguration

Erstellt wird jetzt das absolute Minimum:

  • Titel und Kategorie werden gesetzt.

  • Das GUI-Formular zur Konfiguration bleibt leer.

~/local/lib/python3/cmk_addons/plugins/hellospecial/rulesets/special_agent.py
#!/usr/bin/env python3
# Shebang needed only for editors

from cmk.rulesets.v1.form_specs import Dictionary
from cmk.rulesets.v1.rule_specs import SpecialAgent, Topic, Help, Title

def _formspec():
    return Dictionary(
        title=Title("Hello special!"),
        help_text=Help("This rule is to demonstrate the minimum special agent."),
        elements={}
    )

rule_spec_hellospecial = SpecialAgent(
    topic=Topic.GENERAL,
    name="hellospecial",
    title=Title("Hello special!"),
    parameter_form=_formspec
)

Der name verweist auf den Namen des Spezialagenten, der das Präfix agent_ bekommt. Der so konfigurierte Agent wird in Other integrations verfügbar sein. Sein Konfigurationsformular enthält dank der leeren elements={} aber keine Einträge.

2.4. Die Aufrufkonfiguration

Diese Konfiguration führt den auszuführenden Spezialagenten mit den Einstellungen zusammen, die aus GUI und Standardeinstellungen bezogen werden. Aus diesen Einstellungen werden nun Aufrufparameter. Der name verweist auch hier wieder auf den Namen des Spezialagenten, der das Präfix agent_ bekommt.

~/local/lib/python3/cmk_addons/plugins/hellospecial/server_side_calls/special_agent.py
#!/usr/bin/env python3
# Shebang needed only for editors

from cmk.server_side_calls.v1 import noop_parser, SpecialAgentConfig, SpecialAgentCommand

def _agent_arguments(params, host_config):
    yield SpecialAgentCommand(command_arguments=[])

special_agent_hellospecial = SpecialAgentConfig(
    name="hellospecial",
    parameter_parser=noop_parser,
    commands_function=_agent_arguments
)

Damit sind die grundlegenden Voraussetzungen für den Spezialagenten vorhanden. Sie können diese selbstverständlich jederzeit mit weiteren Angaben erweitern.

2.5. Der erste Test

Sind die Dateien angelegt, starten Sie den Webserver der Instanz neu:

OMD[mysite]:~$ omd restart apache

Wenn Sie jetzt Setup > Agents > Other integrations öffnen, sollten Sie in der Rubrik Custom integrations den neuen Eintrag Hello special! sehen.

Fehlt dieser, prüfen Sie zuerst, ob Sie alle Dateien am dafür vorgesehenen Ort abgelegt haben. Falls Sie nach weiteren möglichen Fehlerquellen suchen, können Sie dies in den kommerziellen Editionen bequem über die Verwaltung von Checkmk-Erweiterungspaketen machen. Alternativ haben wir Ihnen im Kapitel Fehler beheben die wichtigsten Fehlerquellen und mögliche Lösungsansätze aufgelistet.

3. Ein komplexeres Beispiel: Ein vollständiger Wetter-Service

Ein Check, der nie seinen Zustand ändert, ist – nun ja – ziemlich vorhersagbar. Wir wagen also den Schritt hin zu einem „echten“ Spezialagenten, der eine Web- oder REST-API abfragt und als Antwort ein Objekt als JSON- oder XML-Struktur erhält. Das sind typische Datenformate auch beim Zugriff auf die APIs von Netzwerkgeräten wie SAN-Devices.

Damit Sie für diese Übung keine spezifische Hardware benötigen, greifen wir auf die freie API von Open-Meteo.com zu. Unser Ziel ist es, einen kompletten Spezialagenten zu schreiben, der mit Längen- und Breitengrad konfiguriert wird. Um das Beispiel einfach zu halten, übernimmt der Spezialagent auch direkt die Interpretation der Daten. So soll der Spezialagent bei Temperaturen unter 5 Grad Celsius den Zustand WARN und bei unter 0 Grad den Zustand CRIT annehmen. Unseren Check nennen wir abgekürzt ometemp, den Spezialagenten entsprechend agent_ometemp und so weiter.

Tip

Open-Meteo erlaubt die kostenlose Nutzung für nicht-kommerzielle Zwecke und behält sich vor, bei zu vielen Anfragen IP-Adressen zu blocken. Die minütliche Abfrage der API ist dabei noch im tolerierten Rahmen. Dennoch sollten Sie den Dienst nicht überstrapazieren und Spezialagentenregeln, die diesen Dienst nutzen, nach erfolgreichen Tests wieder löschen. Achten Sie besonders darauf, dass zum Test angelegte Regeln für die Zuordnung des Spezialagenten nur für einen Host greifen und nicht für Dutzende oder Hunderte!

3.1. Vorbereitung der Umgebung

Wie im vorherigen Beispiel legen Sie als erstes die benötigten Dateiverzeichnisse an - diesmal mit der Benennung ometemp anstelle von hellospecial.

3.2. Der Spezialagent

Jetzt, wo echte Daten verarbeitet werden sollen, müssen Sie sich zudem einige Gedanken machen, beispielsweise zur Programmiersprache und der Vorverarbeitung. Unser Beispiel fragt eine öffentliche API ab und erhält JSON-Daten. Das könnte man in der Shell mit einem curl-Kommando erledigen. Da aber Checkmk ein gut ausgestattetes Python mitbringt, liegt es nahe, dieses zu verwenden.

Die nächste Entscheidung betrifft die Aufarbeitung der Daten. Sie können beispielsweise JSON-Daten einfach in die Agentenausgabe durchreichen oder aber im Spezialagenten bereits in ein Tabellenformat konvertieren. In der Praxis entscheiden Sie dies meist abhängig von Ihrer Arbeitsumgebung: Wie arbeitsteilig ist Ihre Check-Entwicklung gestaltet? Vereinfachen aufbereitete Daten die Entwicklung des zugehörigen agentenbasierten Check-Plugins? Oder machen sie diese sogar überflüssig? Letzteres ist dann der Fall, wenn Daten so aufbereitet werden können, dass sie mit einem vorhandenen Check-Plugin geparst werden können.

Unser Beispiel reicht die JSON-Antwort einfach durch. Das Parsen findet dann im agentenbasierten Check-Plugin statt. Die Übergabe von Längen- und Breitengrad erfolgt durch die Kommandozeilenargumente --latitude und --longitude. Um Kommandozeilenargumente besser einlesen zu können, verwenden wir die Bibliothek argparse. Da Open-Meteo den Längen- und Breitengrad in die URL kodiert unterstützt, genügt eine URL mit Platzhaltern. Probieren Sie diese URL mit Ihrem aktuellen Längen- und Breitengrad ruhig einmal im Browser aus.

~/local/lib/python3/cmk_addons/plugins/ometemp/libexec/agent_ometemp
#!/usr/bin/env python3
# Shebang needed this time to find the interpreter!

import requests
import argparse

url = "https://api.open-meteo.com/v1/forecast?latitude={lat:.4f}&longitude={long:.4f}&current=temperature_2m"

parser = argparse.ArgumentParser("agent_ometemp")
parser.add_argument(
    "--latitude",
    help="Specify the latitude in degrees (decimal notation).",
    type=float,
    default=0.0)
parser.add_argument(
    "--longitude",
    help="Specify the longitude in degrees (decimal notation).",
    type=float,
    default=0.0)
args = parser.parse_args()

# print(url.format(lat=args.latitude, long=args.longitude))
response = requests.get(url.format(lat=args.latitude, long=args.longitude))
print('<<<ometemp:sep(0)>>>')
print(response.json())
Tip

Zur Erinnerung: Dieses Skript darf keine Dateiendung haben.

Die Agentensektion ometemp enthält schlussendlich nur das empfangene JSON-Objekt. Testen Sie den Spezialagenten, indem Sie ihn auf der Kommandozeile aufrufen.

OMD[mysite]:~$ ~/local/lib/python3/cmk_addons/plugins/ometemp/libexec/agent_ometemp --latitude 48.1305 --longitude 11.5953

Ihre Ausgabe auf der Kommandozeile sollte nun in etwa so aussehen:

<<<ometemp:sep(0)>>>
{'latitude': 48.14, 'longitude': 11.6, 'generationtime_ms': 0.01728534698486328, 'utc_offset_seconds': 0, 'timezone': 'GMT', 'timezone_abbreviation': 'GMT', 'elevation': 536.0, 'current_units': {'time': 'iso8601', 'interval': 'seconds', 'temperature_2m': '°C'}, 'current': {'time': '2025-01-09T12:45', 'interval': 900, 'temperature_2m': 9.8}}

3.3. Die Regelkonfiguration

Als nächstes folgt nun die Regelkonfiguration für den Agenten. Diese Regel wird, wenn sie fertig ist, in Setup > Agents > Other integrations in der Gruppierung Environmental angezeigt.

Tip

Die Überschriften für die Gruppierung in Setup > Agents > Other integrations werden dynamisch sichtbar gemacht. D.h. Sie sehen die Gruppierung Environmental erst ab dem Zeitpunkt, wenn der erste darin einsortierte Spezialagent vorhanden ist. Eine – nicht abschließende – Übersicht nutzbarer Gruppierungen finden Sie unter Dateien und Verzeichnisse am Ende dieses Artikels.

~/local/lib/python3/cmk_addons/plugins/ometemp/rulesets/special_agent.py
#!/usr/bin/env python3
# Shebang needed only for editors

from cmk.rulesets.v1.form_specs import Dictionary, DictElement, Float
from cmk.rulesets.v1.rule_specs import SpecialAgent, Topic, Help, Title

def _formspec():
    return Dictionary(
        title=Title("Open-Meteo temperature"),
        help_text=Help("This rule is used to showcase a special agent with configuration."),
        elements={
            "latitude": DictElement(
                required=True,
                parameter_form=Float(
                    title=Title("Latitude in degrees (decimal notation)"),
                ),
            ),
            "longitude": DictElement(
                required=True,
                parameter_form=Float(
                    title=Title("Longitude in degrees (decimal notation)"),
                ),
            ),
        }
    )

rule_spec_ometemp = SpecialAgent(
    topic=Topic.ENVIRONMENTAL,
    name="ometemp",
    title=Title("Open-Meteo temperature"),
    parameter_form=_formspec
)

Damit haben Sie auch diesen Spezialagenten geschaffen. Nun starten Sie den Webserver der Instanz neu:

OMD[mysite]:~$ omd restart apache

Auf Basis dieses Spezialagenten könnten Sie jetzt bereits eine Regel anlegen Add rule: Open-Meteo temperature. Viel macht diese Regel allerdings noch nicht. Sie enthält aktuell nur die beiden Felder für die Eingabe von Längen- und Breitengrad.

Erweiterung: Passwörter verwenden

In vielen Fällen sind Benutzername und Passwort oder ein API-Schlüssel zum Zugriff auf Daten notwendig. Für die Verwaltung von Passwörtern stehen eigene formspec-Elemente zur Verfügung. Diese erlauben es, entweder Passwörter ad hoc zu definieren, oder auf den Passwortspeicher zuzugreifen. Dazu können Sie in diesem Beispiel folgende Erweiterung des oben erstellten Skripts nutzen. Erweitern Sie die erste Zeile um die zusätzlichen Variablen und fügen Sie die neuen Programmabschnitte ein:

from cmk.rulesets.v1.form_specs import Dictionary, DictElement, Float, String, Password, migrate_to_password

def _formspec():
    return Dictionary(
        # ...
        elements={
            # ...
            "user": DictElement(
                required=True,
                parameter_form=String(
                    title=Title("User ID for login"),
                    prefill=DefaultValue("monitoring"),
                ),
            ),
            "password": DictElement(
                required=True,
                parameter_form=Password(
                    title=Title("Password for this user"),
                    migrate=migrate_to_password,
                ),
            ),
        }
    )

Vergessen Sie nicht, nach der Erweiterung den Webserver der Instanz erneut zu starten.

Da beim Beispiel mit Open-Meteo kein Passwort erforderlich ist, zeigen wir hier zwar den prinzipiellen Umgang mit Passwörtern, übernehmen diese aber nicht in den API-Aufruf.

3.4. Die Aufrufkonfiguration

Als nächstes erweitern wir den neuen Spezialagenten so, dass er nicht nur den Längen- und Breitengrad enthält, sondern diesen auch weiterverarbeitet. Unser Ziel ist ja letztlich eine Auswertung der aktuellen Temperaturwerte für unseren Standort. Die folgende Konfiguration führt daher den auszuführenden Spezialagenten mit den aus der GUI – also aus unserem bislang bestehenden Regelteil – und aus den Standards bezogenen Einstellungen zusammen.

Die Werte für Längen- und Breitengrad, die Sie in der Regel angeben können, werden nun in das params benannte Dictionary übertragen. Gleichzeitig enthält das Objekt host_config alle Host-spezifischen Einstellungen, die hier genutzt werden sollen. So haben Sie zum Beispiel mit host_config.primary_ip_config.address den Zugriff auf die primäre IP-Adresse, host_config.name enthält den Host-Namen.

Beachten Sie bei der Übergabe an den Spezialagenten, dass der Aufruf über eine Shell erfolgt. Die Liste der Aufrufparameter darf daher nur Strings enthalten. Aus den Einstellungen werden hierbei Aufrufparameter, die in der Liste command_arguments landen.

~/local/lib/python3/cmk_addons/plugins/ometemp/server_side_calls/special_agent.py
#!/usr/bin/env python3
# Shebang needed only for editors

from cmk.server_side_calls.v1 import noop_parser, SpecialAgentConfig, SpecialAgentCommand

def _agent_arguments(params, host_config):
    args = [ "--latitude", str(params['latitude']), "--longitude", str(params['longitude']) ]
    yield SpecialAgentCommand(command_arguments=args)

special_agent_ometemp = SpecialAgentConfig(
    name="ometemp",
    parameter_parser=noop_parser,
    commands_function=_agent_arguments
)

Passwörter verwenden

Important

Das hier gezeigte Beispiel übergibt Passwörter im Klartext als Kommandozeilenargumente. Ohne weitere Maßnahmen sind diese Passwörter beispielsweise aus der Prozesstabelle auslesbar. Sie können die Angriffsfläche minimieren, indem Sie den Eintrag in der Prozesstabelle gleich beim Programmstart ändern. Unter Python geht dies zum Beispiel mit dem Modul setproctitle. Einen noch sichereren Weg, auf dem das gestartete Programm das Passwort direkt aus dem Passwortspeicher ausliest, bereiten wir gerade vor.

Da Passwörter als Objekt gespeichert werden, erfolgt der Zugriff über die Funktion unsafe() dieses Objektes:

def _agent_arguments(params, host_config):
    args = [
        "--latitude", str(params['latitude']),
        "--longitude", str(params['longitude']),
        "--user", params['user'],
        "--password", params['password'].unsafe()
    ]
    yield SpecialAgentCommand(command_arguments=args)

3.5. Das Check-Plugin

Der Vollständigkeit halber zeigen wir hier noch das agentenbasierte Check-Plugin. Die Entwicklung dieser Plugins beschreibt der Artikel zu agentenbasierte Check-Plugins ausführlich.

Ein Unterschied zum dort erwähnten Beispiel ist hier die Übergabe der JSON-Rückgabe der REST-API: Das Check-Plugin erhält die Agentensektion immer als zweidimensionale Liste („Liste von Listen“) von Strings. Wir verwenden zuerst die itertools, um aus dieser zweidimensionalen Liste eine eindimensionale zu machen. Anschließend konkatenieren wir dieses resultierende Array mit Leerzeichen. Dies konvertiert die gesamte Agentensektion in einen einzigen String. Schließlich stellen wir sicher, dass einfache Anführungszeichen durch doppelte ersetzt werden, um mit json.loads() den String direkt als Objekt laden zu können.

~/local/lib/python3/cmk_addons/plugins/ometemp/agent_based/ometemp.py
#!/usr/bin/env python3

from cmk.agent_based.v2 import AgentSection, CheckPlugin, Service, Result, State, Metric, check_levels
import itertools
import json

def parse_ometemp(string_table):
    flatlist = list(itertools.chain.from_iterable(string_table))
    parsed = json.loads(" ".join(flatlist).replace("'", "\""))
    return parsed

def discover_ometemp(section):
    yield Service()

def check_ometemp(section):
    t = section['current']['temperature_2m']
    if t < 0.0:
        yield Result(state=State.CRIT, summary="Brrrrrr!")
    elif t < 5.0:
        yield Result(state=State.WARN, summary="It's getting cold...")
    else:
        yield Result(state=State.OK, summary="Nice here.")
    return

agent_section_ometemp = AgentSection(
    name = "ometemp",
    parse_function = parse_ometemp,
)

check_plugin_ometemp = CheckPlugin(
    name = "ometemp",
    service_name = "Open Meteo temperature (2m)",
    discovery_function = discover_ometemp,
    check_function = check_ometemp,
)

Die in diesem Artikel beschriebenen Skripte für Spezialagent, Regelkonfiguration und Aufrufkonfiguration in Kombination mit diesem Check-Plugin sollten Ihnen nun einen funktionierenden Service in Checkmk liefern:

Ansicht der Services inklusive ometemp.

4. Fehler beheben

Auch bei der Entwicklung eigener Spezialagenten kann es (leider) zu Fehlern und Problemen kommen. Deren Ursachen zu lokalisieren ist dann ebenso wichtig wie die eigentliche Behebung.

4.1. Warnhinweise in der Service-Übersicht des Hosts

Wenn der Service Check_MK nach der Aktivierung des Spezialagenten plötzlich seinen Zustand auf WARN oder CRIT wechselt, sehen Sie sich die zugehörige Summary an.

Fehlermeldung des Services Check_MK wegen des Spezialagenten.

Lässt die Summary auf einen Zusammenhang mit dem neuen Spezialagenten schließen, so prüfen Sie die Eigenschaften des Hosts. Für den Parameter Checkmk agent / API integrations muss der Wert Configured API integrations and Checkmk agent gewählt sein.

Auswahl von

4.2. Die Regel ist verschwunden oder ein Warnhinweis ist sichtbar

Wenn Ihr Spezialagent nicht (mehr) in Checkmk unter Setup > Agents > Other integrations angezeigt wird, liegt möglicherweise ein Fehler in der Regelkonfiguration (rulesets/special_agent.py) vor.

CEE Bei Nutzung einer der kommerziellen Editionen sehen Sie möglicherweise stattdessen einen roten Warnhinweis beim Versuch die Regel zu bearbeiten oder eine neue zu erstellen. Folgen Sie dem darin befindlichen Link zur Seite für den Absturzbericht. Dort wird Ihnen die mögliche Problemursache anzeigt.

Lassen Sie sich dann die Fehlerbeschreibungen anzeigen:

OMD[mysite]:~$ tail -f var/log/web.log

Sie erhalten zum Beispiel eine Ausgabe wie diese:

2024-12-17 10:15:51,742 [40] [cmk.web 2669118] Error converting to legacy rulespec 'ometemp' : name 'migrate_to_password' is not defined

Überprüfen Sie die Syntax Ihrer Datei rulesets/special_agent.py. Kontrollieren Sie, ob Sie alle benötigten Bibliotheken berücksichtigt und alle Variablen importiert haben. Schauen Sie nach, ob alle Einrückungen korrekt sind und überprüfen Sie die gesamte Syntax.

Tip

War Ihre Regel vorher in Checkmk sichtbar und ist nun - nach einer Änderung an der Regelkonfiguration - plötzlich verschwunden, so bemerken Sie dies nur, wenn Sie bestehende Regeln anpassen oder neue Regeln erstellen wollen. Im Monitoring bestehender Services wird sich das Problem nicht auswirken.

4.3. Fehlermeldung bei der Aktivierung von Änderungen

Möglicherweise gibt es auch ein Problem in der Aufrufkonfiguration oder am eigentlichen Spezialagenten. Dies wird zum Beispiel sichtbar, weil beim Activate changes ein gelber Warnhinweis angezeigt wird.

Überprüfen Sie dann die Datei server_side_calls/special_agent.py entsprechend der Angaben aus der Fehlermeldung. Behebt das den Fehler nicht, so können Sie wieder auf der Kommandozeile nach Fehlermeldungen suchen:

OMD[mysite]:~$ cmk -d localhost --debug | less

Sie bekommen - nach einem Augenblick Geduld - eine Ausgabe ähnlich der folgenden (gekürzte Fassung):

Traceback (most recent call last):
  File "/omd/sites/devtest/bin/cmk", line 118, in <module>
    exit_status = modes.call(mode_name, mode_args, opts, args)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/omd/sites/devtest/lib/python3/cmk/base/modes/__init__.py", line 70, in call
    return handler(*handler_args)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/omd/sites/devtest/lib/python3/cmk/base/modes/check_mk.py", line 562, in mode_dump_agent
    for source in sources.make_sources(
                  ^^^^^^^^^^^^^^^^^^^^^
  File "/omd/sites/devtest/lib/python3/cmk/base/sources/_builder.py", line 407, in make_sources
    return _Builder(
           ^^^^^^^^^
  File "/omd/sites/devtest/lib/python3/cmk/base/sources/_builder.py", line 140, in __init__
    self._initialize_agent_based()
  File "/omd/sites/devtest/lib/python3/cmk/base/sources/_builder.py", line 198, in _initialize_agent_based
    special_agents = tuple(make_special_agents())
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/omd/sites/devtest/lib/python3/cmk/base/sources/_builder.py", line 187, in make_special_agents
    for agent_data in special_agent.iter_special_agent_commands(agentname, params):
  File "/omd/sites/devtest/lib/python3/cmk/base/server_side_calls/_special_agents.py", line 139, in iter_special_agent_commands
    yield from self._iter_commands(special_agent, params)
  File "/omd/sites/devtest/lib/python3/cmk/base/server_side_calls/_special_agents.py", line 115, in _iter_commands
    for command in special_agent(processed.value, self.host_config):
  File "/omd/sites/devtest/local/lib/python3/cmk_addons/plugins/ometemp/server_side_calls/special_agent.py", line 13, in _agent_arguments
    "--user", params['bulla'],
              ~~~~~~^^^^^^^^^
KeyError: 'bulla'

Interessant sind nun vor allem die letzten Zeilen der Ausgabe: In der Datei server_side_calls/special_agent.py wird wohl versucht, auf ein Element des Dictionaries params zuzugreifen, das nicht existiert.

4.4. Agentenausgabe überprüfen

Eine weitere Fehlerquelle kann es sein, dass Ihr Check-Plugin keine Daten ausgibt. Auch dies können Sie auf der Kommandozeile überprüfen:

OMD[mysite]:~$ cmk -d localhost --debug | less

Erhalten Sie hier statt eines Strings mit den aktuellen Messdaten eine Fehlermeldung, so nutzen Sie diese zur Korrektur.

5. Dateien und Verzeichnisse

5.1. Verzeichnisse

Pfad Bedeutung

~/local/lib/python3/cmk_addons/plugins/

Basisverzeichnis zur Ablage von Plugin-Dateien.

~/local/lib/python3/cmk_addons/plugins/<plug-in_family>/libexec/

Ablageort für ausführbare Dateien.

~/local/lib/python3/cmk_addons/plugins/<plug-in_family>/rulesets/

Ablageort für Regelsatzdateien.

~/local/lib/python3/cmk_addons/plugins/<plug-in_family>/server_side_calls/

Ablageort für Dateien zur Aufrufkonfiguration.

~/local/lib/python3/cmk_addons/plugins/<plug-in_family>/agent_based/

Ablageort für agentenbasierte Check-Plugins.

~/share/check_mk/agents/special/

Hier sind die mitgelieferten Spezialagenten installiert.

~/local/share/check_mk/agents/special/

Ablage der von Ihnen modifizierten Spezialagenten.

~/local/bin/

Ablage von eigenen Programmen oder Skripten, die im Suchpfad sein sollen und ohne Pfadangabe direkt ausgeführt werden können. Ist ein Programm sowohl in ~/bin/ als auch in ~/local/bin/, hat letzteres Vorrang.

5.2. Verfügbare Gruppierungen in Other integrations

Name Bedeutung

APPLICATIONS

Anwendungs-Monitoring

CLOUD

Cloud-Monitoring

CONFIGURATION_DEPLOYMENT

Monitoring von Konfigurationsmanagementsystemen

DATABASES

Monitoring von Datenbanken

GENERAL

Alles, was nicht irgendwo anders reinpasst

ENVIRONMENTAL

Monitoring von Umwelt und Umgebung

LINUX

Monitoring des Linux-Betriebssystems

NETWORKING

Netzwerk-Monitoring

MIDDLEWARE

Monitoring von Middleware

NOTIFICATIONS

Monitoring von Benachrichtigungssystemen

OPERATING_SYSTEM

Betriebssystem-Monitoring allgemein

PERIPHERALS

Monitoring von Peripheriegeräten

POWER

Monitoring der Stromversorgung

SERVER_HARDWARE

Monitoring von Serverhardware

STORAGE

Monitoring von Speichersystemen

SYNTHETIC_MONITORING

Synthetic Monitoring

VIRTUALIZATION

Monitoring von Virtualisierungsumgebungen

WINDOWS

Monitoring des Windows-Betriebssystems

Auf dieser Seite