SNMP Inventory Plugin erhöht Checklaufzeit

Hallo,
ich habe ein kleines SNMP-Plugin für die neue Check-API geschrieben. Das Plugin soll nur Inventory-Daten sammeln. Dies funktioniert soweit auch ganz gut. Jedoch sieht es so aus, als würden bei jedem normalen Check (alle 60 Sekunden und nicht alle 24 Stunden) alle OIDs geholt werden. Also auch die OIDs, die nur für das Inventory notwendig sind.

Kann man der „register“ Funktion mitgeben, dass sie nur Inventory Daten holt und somit nicht bei jedem Check die Inventory-OIDs abfragt oder gibt es hier einen anderen Weg?

Vielen Dank.

Fürs Verständnis hier mal das Plugin (ich habe dieses der Übersicht halber etwas gekürzt)

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from .agent_based_api.v1 import (
    Attributes,
    register,
    SNMPTree,
    contains,
    TableRow,
    OIDEnd,
)
 
from .agent_based_api.v1.type_defs import (
    InventoryResult,
)

register.snmp_section(
    name="sicam_info_module",
    fetch=[
        SNMPTree(
            base=".1.3.6.1.4.1.22638.11.1.2.1.1",
            oids=[
                OIDEnd(),
                "2",    #dgpiProdCompContainedIn    > .1.3.6.1.4.1.22638.11.1.2.1.1.2.1 0
                "4",    #dgpiProdCompName           > .1.3.6.1.4.1.22638.11.1.2.1.1.4.1 CP-8050
                "5",    #dgpiProdCompDescription    > .1.3.6.1.4.1.22638.11.1.2.1.1.5.1 CP-8050
                "6",    #dgpiProdCompOrderNumber    > .1.3.6.1.4.1.22638.11.1.2.1.1.6.1 6MF28050AA00
            ],
        ),
    ],
    detect=contains(".1.3.6.1.2.1.1.1.0", "Siemens AG, SICAM"),
)
 
def inventory_sicam_info_module(section) -> InventoryResult:
    for id, dgpiProdCompContainedIn, dgpiProdCompName, dgpiProdCompDescription, dgpiProdCompOrderNumber in section[0]:

        yield TableRow(
            path=["hardware", "components", "modules"],
            key_columns={
                "index" : id,
                "name" : dgpiProdCompName,
                "description" : dgpiProdCompDescription,
                "model" : dgpiProdCompOrderNumber,
                "dgpiProdCompContainedIn": dgpiProdCompContainedIn,
            },
        )

register.inventory_plugin(
    name='sicam_info_module',
    inventory_function=inventory_sicam_info_module,
)

Wenn die snmp_section Daten enthält welche vom Check sowie dem Inventory verwendet werden dann wüsste ich keine Methode dies zu trennen. Wenn ich mir die anderen vorhandenen Inventory Plugins anschaue welche schon nach der neuen API gebaut sind dann muss man entscheiden - eigene snmp_section für das Inventory Plugin oder kombinierte Section.
Schau mal in deinen HW/SW Inventory Regeln ob das Verhalten sich ändert bei aktivieren/deaktivieren von “Status data inventory”.

Ich habe die HW/SW Inventory Regel mal deaktiviert, damit ist die Checkdauer wieder kurz. Somit scheint checkmk schon zu verstehen, dass die Daten nur fürs Inventory benötigt werden.

In diesem Plugin generiere ich keine Daten für einen normalen Service, sondern nur Inventory Daten. Du schreibst man müsste sich entscheiden, wie und wo kann ich das hinterlegen?

Wenn das nur Inventory Daten sind würde ich halt nochmal schauen ob es sich verändert wenn man in der Inventory Regel “Status Data” an und aus schaltet.

Wenn ich in der Regel „Do hardware/software inventory“ keine Attribute setzte, wird zwar der Service fürs Inventory erzeugt, dieser findet aber nur fünf Inventory Einträge (SNMP-Info). Die werden wohl standardmäßig bei jedem SNMP-Check abgefragt. Erst wenn ich das Attribut „Status data inventory“ auf „do“ setzte bekomme ich Inventory Daten als auch Status Inventory Daten. Wenn ich es auf „do not“ setzte, ist das Verhalten so vorher beschrieben (nur fünf Einträge). Dies gilt auch für die integrierten Plugins. Getestet habe ich das mit der Version 2.0.0p5. In der Version 1.6.0p22 funktioniert das Attribut „Status data inventory“ noch so wie gewünscht.

Wenn ich es richtig verstanden habe, dann werden bei aktiviertem “Status data inventory” die Daten jedes Mal durch den normalen Check geholt. Das Inventory benutzt standardmäßig seit einigen Jahren den Cache des normalen Checks, damit dieser nicht erneut beim Gerät anfragen muss. Denn dort gab es dann Probleme mit den Log-Dateien, die von den Agents abgeholt wurden, aber nicht vom Inventory verarbeitet wurden. Ich würde davon ausgehen, dass die Inventory-Funktion bei SNMP die Daten abholen, wenn sie im Cache fehlen oder sehe ich das falsch? Genau diese scheint die Version 2.0.0p5 aber nicht zu tun.

Also vermute ich einen Fehler in der Version 2.0.0p5?

Mit der Regel „Fetch intervals for SNMP sections“ könnte man einen Workaround schaffen. Die Daten werden zwar von dem normalen Check geholt, allerdings nur alle x Minuten. Der Inventory Check greift nur auf die Daten zurück, die der normale Check holt, das heißt auch wenn man ein refresh vom Inventory macht, werden die Daten nicht aktualisiert. Schade ist, dass man nicht sieht wie alt die Daten sind.

Alternativ habe ich noch die Funktion „OIDCached(str)“ gefunden, mit der die Daten direkt von dem Plugin Zwischengespeichert werden. Leider habe ich nicht gefunden, wie lange sie Zwischengespeichert werden und auch nicht wie ich über die GUI die Daten neu vom Gerät holen kann.

Das solltest sogar sehen bei der Ausführung von “cmk” und dem “–debug” sowie “-vv”.

Denn Rest müsste ich mir auch erstmal anschauen.

In der CLI Ausgabe sehe ich weder ein Timestamp noch eine relative Zeit für die Sections, aber auf Dateiebene sieht man es natürlich. Ich hätte mir nur gewünscht, dass der User es in der GUI auch sieht.

Vielen Dank schonmal für die Hilfe.