2.0 - plugins/agent_based - item - TypeError: unexpected type of item discovered: <class 'str'> / check_function: missing 'item' argument

Hallo Zusammen,

ich habe heute Vormittag auf Check_MK 2.0 geupdated. Seid diesem Update funktionieren einige von mir geschriebene Checks nicht mehr. Dies wollte ich zum Anstoss nehmen, diese Checks auf die neuen plugins/agent_based API umzuschreiben.

Ich bin stupide nach dieser Dokumentation vorgegangen. Laufe allerdings immer wieder in einen Fehler beim Discovery.

...
  File "/omd/sites/mon/lib/python3/cmk/base/api/agent_based/register/check_plugins.py", line 76, in filtered_generator
    raise TypeError("unexpected type of item discovered: %r" % type(element.item))
TypeError: unexpected type of item discovered: <class 'str'>

Zusammenfassung

OMD[mon]:~$ cmk -d frida.local | grep -A5 '^<<<hdd_standby_check'
<<<hdd_standby_check>>>
/dev/sda	active
/dev/sdb	standby
/dev/sdc	standby
/dev/sdd	standby
<<<lmsensors>>>

hdd_standby_check.py

cat local/lib/check_mk/base/plugins/agent_based/hdd_standby_check.py
from .agent_based_api.v1 import *

def discovery_hdd_standby_check(section):
    for device, _status in section:
        yield Service(item=device)

def check_hdd_standby_check(section):
    for line in section:
        if line[0] == item:
            device = line[0]
            status = line[1]
    yield Result(state=State.OK, summary="No USB stick found")

register.check_plugin(
    name="hdd_standby_check",
    service_name="HDD Drive State",
    discovery_function=discovery_hdd_standby_check,
    check_function=check_hdd_standby_check,
)

check_hdd_standby_check nicht beachten, ist da das Discovery schon nicht funktioniert, noch Standard wie in der Doku.
Ich weiß, es liegt an item=device aber das brauche ich um dann mit service_name="HDD Drive State %s", weitermachen zu können.

Kann mir jemand helfen? Habe ich nur einen Denkfehler?

Gruß & Danke
Marcel

Hi Marcel,
ich kann dir dort konkret nicht weiterhelfen, aber wir haben einen detaillierten Artikel für die Migration geschrieben: Migration von Checkplugins auf Checkmk 2.0
VG, Martin

Einen kleine Tip hab ich - dein Discovery gibt ein Item zurück aber dein “register.check_plugin” kennt kein Item dort gibt es als “service_name” einfach nur “HDD Drive State” dies müsste mindestens “HDD Drive State %s” lauten.

1 Like

@martin.hirschvogel Danke für den Link, hilft mir aber bei den neuen agent_based_plugins nicht.

@andreas-doehler Dank dir. Korrekt. Wenn ich aber “service_name” von “HDD Drive State” in “HDD Drive State %s” ändere. Bekomme ich bei check_mk --debug -vv -II frida.local

...
  File "<frozen importlib._bootstrap_external>", line 783, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "/omd/sites/mon/local/lib/python3/cmk/base/plugins/agent_based/hdd_standby_check.py", line 33, in <module>
    register.check_plugin(
  File "/omd/sites/mon/lib/python3/cmk/base/api/agent_based/register/export.py", line 309, in check_plugin
    plugin = create_check_plugin(
  File "/omd/sites/mon/lib/python3/cmk/base/api/agent_based/register/check_plugins.py", line 229, in create_check_plugin
    _validate_kwargs(
  File "/omd/sites/mon/lib/python3/cmk/base/api/agent_based/register/check_plugins.py", line 166, in _validate_kwargs
    validate_function_arguments(
  File "/omd/sites/mon/lib/python3/cmk/base/api/agent_based/register/utils.py", line 137, in validate_function_arguments
    raise TypeError(f"{type_label}_function: {missing_or_unexpected} 'item' argument")
TypeError: check_function: missing 'item' argument

Deshalb denke ich, dass bereits das yield Service(item=device) nicht korrekt ist.
Ich hoffe du kannst mir noch einen Tipp geben. :slight_smile:

Bildschirmfoto 2021-03-09 um 14.00.53

Seh da eigentlich kein problem drin, hab ich fast genau so am laufen.

   def discover_foo(section):
    for line in section:
        service_identify = "%s" %(line[0])
        yield Service(item=service_identify)

Kann es sein dass dein Agent Output an einer stelle device = None hat?

das %s hab ich da auf jedenfall auch stehen und muss auch dahin.

Wo genau liegt dein check?
Schieb den mal in /omd/sites/<site>/lib/python3/cmk/base/plugins/agent_based/foobar.pyund schau mal obs dann läuft - habe festgestellt, dass in manchen Pfaden den Import nicht sauber läuft.

Mach mal cmk -L | grep <plugin-name> da findet man manchmal ne python exception drin - ansonsten müsste dort das Plugin drinne stehen.

LG

@rdago

Danke für deine Antwort. War mir wichtig, dass es kein grundsätzliches Problem in 2.0 ist.

Habe dem Check selbst nun einen anderen Dateinamen als das alte Plugin gegeben, der discovery_function und check_function auch - vermutlich irgendwelche alten Einträge in den *.mk Files. Läuft jetzt!

DANKE :kissing_heart:

If your discovery_ function issues a yield Service(item=), then your check_ function signature needs to be check_hdd_standby_check(item, section) not check_hdd_standby_check(section)

1 Like