SNMP Check für Nokia DSLAMs

Hallo zusammen,

es geht um eigene SNMP Plugins welche Temperaturwerte abfragen.

Unter ~/local/lib/check_mk/base/plugins/agent_based/ liegt nokia_isam_temeprature.py welches

rom .agent_based_api.v1 import *

def parse_nokia_isam_temperature(string_table):
    return {
        'temperature': int(string_table[0][0]),
    }


register.snmp_section(
    name = 'nokia_isam_temperature',
    detect = matches('.1.3.6.1.2.1.1.1.0', '.*ISAM.*|ASAM'),
    fetch = SNMPTree(
        base = '.1.3.6.1.4.1.637.61.1.23.10.1.2.4353', # Board Temperature of Controller A
        oids = [
            '1', # Temperature Controller
        ],
    ),
    parse_function=parse_nokia_isam_temperature,
)


def discover_nokia_isam_temperature(section):
    if section:
        yield Service()


def check_nokia_isam_temperature(params, section):
    yield from check_levels(
        section['temperature'],
        levels_upper=params.get('temperature', None),
        label='Current Temperature',
        metric_name='temperature',
        render_func=lambda v: "%d" % v
    )



register.check_plugin(
    name = 'nokia_isam_temperature',
    service_name = 'Nokia ISAM Controller Temperature',
    discovery_function = discover_nokia_isam_temperature,
    check_function = check_nokia_isam_temperature,
    check_ruleset_name = 'temperature',
    check_default_parameters = {},
)

beinhaltet. Passt soweit auch auf dem passenden Host.

Nur was dann passiert ist, alle Cisco Hosts welche mit SNMP auch Temperaturwerte liefern geben diese Services nur noch als UNKN mit dem Hinweis Unimplemented check cisco_temperature / SW 1 Sensor 1 bzw. Check plugin not implemented zurück.

Ziel ist es das der SNMP Check natürlich nur auf Hosts (Nokia DSLAMs) in einem bestimmten Ordner wirkt und nicht über alle Hosts in der Instanz.

Kann sich das jemand erklären?

CheckMK Version: 2.0.0p5 (CEE)
Das Check Script kommt von mir, und ist mal der erste Versuch.

Grüße
Michael

Einen potentiellen Fehler würde ich hier bei der Verwendung des “temperature” Rulesets sehen.
Wenn ich mich recht erinnere braucht dieses Ruleset ein Item. Dein Check hat keines was dazu führt, dass die anderen “alten” Checks wie Cisco Temperature welche noch nicht portiert sind nun nicht mehr funktionieren da dein “neuer” Check scheinbar definiert Ruleset “temperature” hat keine Items mehr.

Kling wie sehr schöner Fehler welcher nicht mal so einfach zu sehen ist.
Ein “cmk --debug -vv hostname” egal ob Cisco oder Nokia sollten einen Fehler bringen wegen des Items.

ein cmk --debug -vv CiscoSwitch gibt ein

ValueError: Check ruleset temperature has checks with and without item! At least one of the checks in this group needs to be changed (offending plugin: liebert_temp_air, present_plugins: nokia_isam_temperature).

zurück.

Letztendlich bedeutet das aber ich muss mir eigene Rulesets schreiben?

Eigentlich sollte das nicht gleich ausarten nur weil ich per SNMP Temperaturen überwachen möchte.

Dann schau ich mir das mit den Rulesets mal an.

Nö, einfach deinen Check ein Pseudo Item generieren lassen. Auch wenn nur ein Temperatur Wert ausgewertet wird.

Nö, einfach deinen Check ein Pseudo Item generieren lassen. Auch wenn nur ein Temperatur Wert ausgewertet wird.

Klingt natürlich gut, nur zum Tema Pseudo Item finde ich nichts in der Doku. Ich denke das wird etwas Phyton spezifisches sein.

Ich habe das Gefühl, weder arbeite ich mich tiefer in Phyton ein, oder muss die Entwicklung des Plugins an extern vergeben.

Kannst Du mir da irgendein Gerüst geben?

Dein Discovery darf nicht nur einen Service zurück geben sondern einen Service mit Item.

wird zu

def discover_nokia_isam_temperature(section):
    if section:
        yield Service(item="Temperature")

Und im register des Plugins wird dies dann so aussehen

wird zu

register.check_plugin(
    name = 'nokia_isam_temperature',
    service_name = 'Nokia ISAM Controller %s',
    discovery_function = discover_nokia_isam_temperature,
    check_function = check_nokia_isam_temperature,
    check_ruleset_name = 'temperature',
    check_default_parameters = {},
)

Pseudo Item hab ich das nur genannt weil es hart codiert wird und sich nicht ändern kann.

Aus dem hier

wird dann noch

def check_nokia_isam_temperature(item, params, section):
    yield from check_levels(
        section['temperature'],
        levels_upper=params.get('temperature', None),
        label='Current Temperature',
        metric_name='temperature',
        render_func=lambda v: "%d" % v
    )

Okay super Danke, dass passt jetzt schon mal. Jetzt muss ich das mit den Rulesets noch rudimentär umsetzen, und dann habe ich mal ein guten Anfang.

Jetzt habe ich das mit den Rulesets fast fertig. Aber meine Instanz will nicht mehr korrekt starten.
ein OMD Stop und dann wieder OMD Start sagt mir:

OMD[internet]:~/local/lib/check_mk/base/plugins/agent_based$ omd start
Temporary filesystem already mounted
Starting mkeventd...Already running.
Starting liveproxyd...Already running.
Starting mknotifyd...OK
Starting rrdcached...Already running.
Starting cmc...Failed (Config /omd/sites/internet/var/check_mk/core/config missing, run "cmk -U" and try again)
Starting apache...(already running: 26611)...OK
Starting dcd...Already running.
Starting redis...Already running.
Initializing Crontab...OK
OMD[internet]:~/local/lib/check_mk/base/plugins/agent_based$ cmk -U
Generating configuration for core (type cmc)...Creating helper config...OK
Process Process-3:
Traceback (most recent call last):
  File "/omd/sites/internet/lib/python3.8/multiprocessing/process.py", line 315, in _bootstrap
    self.run()
  File "/omd/sites/internet/lib/python3.8/multiprocessing/process.py", line 108, in run
    self._target(*self._args, **self._kwargs)
  File "/omd/sites/internet/lib/python3/cmk/base/cee/core_cmc.py", line 772, in get_host_configurations
    fetcher_config.write_local(serial, hostname)
  File "/omd/sites/internet/lib/python3/cmk/base/cee/fetcher_config.py", line 27, in write_local
    f.write(fetcher_configuration.dumps(hostname, ipaddress))
  File "/omd/sites/internet/lib/python3/cmk/base/checkers/fetcher_configuration.py", line 27, in dumps
    return json.dumps(_make(hostname, ipaddress))
  File "/omd/sites/internet/lib/python3/cmk/base/checkers/fetcher_configuration.py", line 35, in _make
    "fetchers": [{
  File "/omd/sites/internet/lib/python3/cmk/base/checkers/fetcher_configuration.py", line 37, in <listcomp>
    "fetcher_params": c.fetcher_configuration,
  File "/omd/sites/internet/lib/python3/cmk/base/checkers/_abstract.py", line 157, in fetcher_configuration
    return self._make_fetcher().to_json()
  File "/omd/sites/internet/lib/python3/cmk/base/checkers/snmp.py", line 170, in _make_fetcher
    sections=self._make_sections(),
  File "/omd/sites/internet/lib/python3/cmk/base/checkers/snmp.py", line 182, in _make_sections
    checking_sections = self._make_checking_sections()
  File "/omd/sites/internet/lib/python3/cmk/base/checkers/snmp.py", line 216, in _make_checking_sections
    check_plugin_names=check_table.get_needed_check_names(
  File "/omd/sites/internet/lib/python3/cmk/base/check_table.py", line 207, in get_needed_check_names
    s.check_plugin_name for s in get_check_table(
  File "/omd/sites/internet/lib/python3/cmk/base/check_table.py", line 187, in get_check_table
    host_check_table = HostCheckTable(
  File "/omd/sites/internet/lib/python3/cmk/base/check_table.py", line 53, in __init__
    for service in self._get_static_check_entries(host_config)
  File "/omd/sites/internet/lib/python3/cmk/base/check_table.py", line 91, in _get_static_check_entries
    descr = config.service_description(host_config.hostname, check_plugin_name, item)
  File "/omd/sites/internet/lib/python3/cmk/base/config.py", line 1072, in service_description
    raise MKGeneralException(
cmk.utils.exceptions.MKGeneralException: Found '%s' in service description (Host: ZWI-ISAM-FRIEDHOF, Check plugin: nokia_isam_temperature, Item: None). Please try to rediscover the service to fix this issue.

nur ich kann quasi nix mehr machen.

Ich hatte per Regel dem Host ZWI-ISAM-FRIEDHOF dazu bringen wollen den Check als erzwungene Services zu nutzen.

Nachdem die Aktivierung aber nichts gemacht hat und ein löschen der Regel auch nicht aktiviert wurde, wollte ich die Instanz neu starten.

Ergebnis war das
Starting cmc...Failed (Config /omd/sites/internet/var/check_mk/core/config missing, run "cmk -U" and try again)

Eine Serviceerkennung auf dem passendenHost gibt nur ein
Error running automation call try-inventory (exit code 2), error: Found '%s' in service description (Host: ZWI-ISAM-FRIEDHOF, Check plugin: nokia_isam_temperature, Item: None). Please try to rediscover the service to fix this issue. zurück.

Vielleicht jemand ne Idee?

Die Fehlermeldung besagt, dass versucht wurde einen Check welcher ein Item erfordert ohne Item anzulegen.

Warum erzwungen? Der Check muss doch ordentlich gefunden werden automatisch falls die Discovery Funktion korrekt ist.

Was bringt den ein “cmk --debug -vvII ZWI-ISAM-FRIEDHOF”?

Warum erzwungen? Der Check muss doch ordentlich gefunden werden automatisch falls die Discovery Funktion korrekt ist.

Ich möchte das alle Hosts im Ordner DSLAMs per Regel diesen Check direkt beim Anlegen des Hosts mit auf denWeg bekommen. Oder gibts da ne bessere Methode?

Bei einer Servicesuche wird der Check gefunden, aber man muss ihn ja manuell auswählen und zu den überwachten Servicen hinzufügen.

Ein cmk --debug -vvII ZWI-ISAM-FRIEDHOF gibt folgendes zurück:

OMD[internet]:~/local/share/check_mk/web/plugins/wato$ cmk --debug -vvII ZWI-ISAM-FRIEDHOF
Discovering services and host labels on: ZWI-ISAM-FRIEDHOF
ZWI-ISAM-FRIEDHOF:
+ FETCHING DATA
  Source: SourceType.HOST/FetcherType.SNMP
[cpu_tracking] Start [7ffaea1525e0]
[cpu_tracking] Stop [7ffaea1525e0 - Snapshot(process=posix.times_result(user=0.020000000000000018, system=0.0, children_user=0.0, children_system=0.0, elapsed=0.010000001639127731))]
Found '%s' in service description (Host: ZWI-ISAM-FRIEDHOF, Check plugin: nokia_isam_temperature, Item: None). Please try to rediscover the service to fix this issue.
Traceback (most recent call last):
  File "/omd/sites/internet/bin/cmk", line 92, in <module>
    exit_status = modes.call(mode_name, mode_args, opts, args)
  File "/omd/sites/internet/lib/python3/cmk/base/modes/__init__.py", line 69, in call
    return handler(*handler_args)
  File "/omd/sites/internet/lib/python3/cmk/base/modes/check_mk.py", line 1531, in mode_discover
    discovery.do_discovery(
  File "/omd/sites/internet/lib/python3/cmk/base/discovery.py", line 370, in do_discovery
    fetcher_messages=list(
  File "/omd/sites/internet/lib/python3/cmk/base/checkers/_checkers.py", line 246, in fetch_all
    raw_data = source.fetch()
  File "/omd/sites/internet/lib/python3/cmk/base/checkers/_abstract.py", line 162, in fetch
    with self._make_fetcher() as fetcher:
  File "/omd/sites/internet/lib/python3/cmk/base/checkers/snmp.py", line 170, in _make_fetcher
    sections=self._make_sections(),
  File "/omd/sites/internet/lib/python3/cmk/base/checkers/snmp.py", line 182, in _make_sections
    checking_sections = self._make_checking_sections()
  File "/omd/sites/internet/lib/python3/cmk/base/checkers/snmp.py", line 216, in _make_checking_sections
    check_plugin_names=check_table.get_needed_check_names(
  File "/omd/sites/internet/lib/python3/cmk/base/check_table.py", line 207, in get_needed_check_names
    s.check_plugin_name for s in get_check_table(
  File "/omd/sites/internet/lib/python3/cmk/base/check_table.py", line 187, in get_check_table
    host_check_table = HostCheckTable(
  File "/omd/sites/internet/lib/python3/cmk/base/check_table.py", line 53, in __init__
    for service in self._get_static_check_entries(host_config)
  File "/omd/sites/internet/lib/python3/cmk/base/check_table.py", line 91, in _get_static_check_entries
    descr = config.service_description(host_config.hostname, check_plugin_name, item)
  File "/omd/sites/internet/lib/python3/cmk/base/config.py", line 1072, in service_description
    raise MKGeneralException(
cmk.utils.exceptions.MKGeneralException: Found '%s' in service description (Host: ZWI-ISAM-FRIEDHOF, Check plugin: nokia_isam_temperature, Item: None). Please try to rediscover the service to fix this issue.

Kann gut sein das sich da etwas beim Anlegen überschnitten hat. Denn bei Tests mit dem Check hatte es funktioniert.

Wie kann ich den das Rediscover auf der Kosole ausführen oder von mir aus den Host löschen.

Ich habe die eigenen Checks entfernt (Dateien im Dateisystem gelöscht) und dann ein cmk -U gab OK zurück. Daraufhin die Instanz neu gestartet und fertig.

Zukünftig sollte ich das mal auf einem Testsystem prüfen.

Mal schauen ob die Instanz noch irgendwo etwas abbekommen hat.