Problem mit Hyper_host_csv_io.ps1 Deutsch/Englisch

Guten Tag,
habe seit etwas über einer Woche die Aufgabe bekommen mich in checkmk rein zu fuchsen.

Unsere Hosts sind alle auf Deutsch und das Skript welches die HyperV IO abfragt, macht etwas
Probleme… Zu erst habe ich die ganzen englischen Parameter durch deutsche Parameter ersetzt,
so spuckt das Skript Hyper_host_csv_io.ps1 wenigstens was aus wenn man es in PowerShell startet.

Es kommen aber leider keine Metriken in checkmk an…

Wenn das Skript in PS ausgeführt wird kommen diese Fehler…

Fehler beim Indexvorgang. Der Arrayindex wurde als NULL ausgewertet.
In C:\ProgramData\checkmk\agent\plugins\hyperv_host_csv_io.ps1:52 Zeichen:9
+         $idtolun[$diskid] = $lunid
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : NullArrayIndex
 
Fehler beim Indexvorgang. Der Arrayindex wurde als NULL ausgewertet.
In C:\ProgramData\checkmk\agent\plugins\hyperv_host_csv_io.ps1:52 Zeichen:9
+         $idtolun[$diskid] = $lunid
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : NullArrayIndex

Ich kann keinen Fehler in Zeile 52 erkennen, mir fehlt warscheinlich auch das nötige Know-How dazu.

Hatte schon mal jemand den gleichen Fehler und weiß wie man ihn beheben kann?

Danke im Voraus :wink:

HyperV Host auf Deutsch installieren ist erstmal ne ganz schlechte Idee :wink:
Aber Spaß beiseite das Script gehört nicht zum “Lieferumfang” von CMK das hab ich “verbrochen” oder besser gesagt mir im Internet zusammen gesucht. Ohne den kompletten Code und etwas Debug Output wird das ganz schwer mit der Fehlersuche.
Was musste den nach Deutsch übersetzt werden?

In der Fehlermeldung beschwert es sich ja, dass er ein “NullArray” hat und damit auch keine Daten daraus ziehen kann. Einfach mal nach dem Start der “foreach” Schleife ein write-host mit den Daten einfügen und schauen was überhaupt da ist.

Die Hosts benutzen auch Cluster Shared Volumes oder?

Guten Morgen… da haben wir ja den Übeltäter :joy:

Das Ausmaß der Probleme war man sich anfangs nicht bewusst und jetzt laufen so viele VM’s drauf das es ein Totalschaden wäre den Host neu aufzusetzen.

Da die folgenden Leistungsindikatoren nicht auf dem deutschen System zu finden waren, habe ich die kurzerhand im Skript ausgetauscht…

$Counters = @('\Physikalischer Datenträger(*)\Aktuelle Warteschlangenlänge', '\Physikalischer Datenträger(*)\Zeit (%)','\Physikalischer Datenträger(*)\Durchschnittl. Warteschlangenlänge des Datenträgers', '\Physikalischer Datenträger(*)\Lesezeit (%)', 
'\Physikalischer Datenträger(*)\Durchschnittl. Warteschlangenlänge der Datenträger-Lesevorgänge', '\Physikalischer Datenträger(*)\Schreibzeit (%)', 
'\Physikalischer Datenträger(*)\Durchschnittl. Warteschlangenlänge der Datenträger-Schreibvorgänge', '\Physikalischer Datenträger(*)\Mittlere Sek./Übertragung', 
'\Physikalischer Datenträger(*)\Mittlere Sek./Lesevorgänge', '\Physikalischer Datenträger(*)\Mittlere Sek./Schreibvorgänge', 
'\Physikalischer Datenträger(*)\Übertragungen/s', '\Physikalischer Datenträger(*)\Lesevorgänge/s', 
'\Physikalischer Datenträger(*)\Schreibvorgänge/s', '\Physikalischer Datenträger(*)\Bytes/s', 
'\Physikalischer Datenträger(*)\Bytes gelesen/s', '\Physikalischer Datenträger(*)\Bytes geschrieben/s', 
'\Physikalischer Datenträger(*)\Mittlere Bytes/Übertragung', '\Physikalischer Datenträger(*)\Mittlere Bytes/Lesevorgang', 
'\Physikalischer Datenträger(*)\Mittlere Bytes/Schreibvorgang', '\Physikalischer Datenträger(*)\Leerlaufzeit (%)', '\Physikalischer Datenträger(*)\Teil-E/A/s')

Wenn ich jetzt das Skript in PowerShell laufen lasse, bringt er mir eine Ausgabe zu den Indikatoren.

Fehler beim Indexvorgang. Der Arrayindex wurde als NULL ausgewertet.
In C:\ProgramData\checkmk\agent\plugins\hyperv_host_csv_io.ps1:52 Zeichen:9
+         $idtolun[$diskid] = $lunid
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : NullArrayIndex
 
Fehler beim Indexvorgang. Der Arrayindex wurde als NULL ausgewertet.
In C:\ProgramData\checkmk\agent\plugins\hyperv_host_csv_io.ps1:52 Zeichen:9
+         $idtolun[$diskid] = $lunid
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : NullArrayIndex



\\is1msphc01\physikalischer datenträger(17)\aktuelle warteschlangenlänge                                                          0
\\is1msphc01\physikalischer datenträger(17)\zeit (%)                                                               48,6633968172084
\\is1msphc01\physikalischer datenträger(17)\durchschnittl. warteschlangenlänge des datenträgers                   0,486633968172084
\\is1msphc01\physikalischer datenträger(17)\lesezeit (%)                                                           1,81683213288171
\\is1msphc01\physikalischer datenträger(17)\durchschnittl. warteschlangenlänge der datenträger-lesevorgänge      0,0181683213288171
\\is1msphc01\physikalischer datenträger(17)\schreibzeit (%)                                                        46,8465646843267
\\is1msphc01\physikalischer datenträger(17)\durchschnittl. warteschlangenlänge der datenträger-schreibvorgänge    0,468465646843267
\\is1msphc01\physikalischer datenträger(17)\mittlere sek./übertragung                                          0,000983726144372808
\\is1msphc01\physikalischer datenträger(17)\mittlere sek./lesevorgänge                                          0,00113624782643041
\\is1msphc01\physikalischer datenträger(17)\mittlere sek./schreibvorgänge                                      0,000978631474408462
\\is1msphc01\physikalischer datenträger(17)\übertragungen/s                                                        494,551454375208
\\is1msphc01\physikalischer datenträger(17)\lesevorgänge/s                                                         15,9855015555623
\\is1msphc01\physikalischer datenträger(17)\schreibvorgänge/s                                                      478,565952819645
\\is1msphc01\physikalischer datenträger(17)\bytes/s                                                                4468778,93086054
\\is1msphc01\physikalischer datenträger(17)\bytes gelesen/s                                                        1415931,78578548
\\is1msphc01\physikalischer datenträger(17)\bytes geschrieben/s                                                    3052847,14507506
\\is1msphc01\physikalischer datenträger(17)\mittlere bytes/übertragung                                             9036,02424242424
\\is1msphc01\physikalischer datenträger(17)\mittlere bytes/lesevorgang                                                        88576
\\is1msphc01\physikalischer datenträger(17)\mittlere bytes/schreibvorgang                                          6379,15657620042
\\is1msphc01\physikalischer datenträger(17)\leerlaufzeit (%)                                                       58,3075306107418
\\is1msphc01\physikalischer datenträger(17)\teil-e/a/s                                                             83,9238831667019
\\is1msphc01\physikalischer datenträger(18)\aktuelle warteschlangenlänge                                                          0
\\is1msphc01\physikalischer datenträger(18)\zeit (%)                                                                  322,358321042
\\is1msphc01\physikalischer datenträger(18)\durchschnittl. warteschlangenlänge des datenträgers                       3,22358321042
\\is1msphc01\physikalischer datenträger(18)\lesezeit (%)                                                           132,117911255157
\\is1msphc01\physikalischer datenträger(18)\durchschnittl. warteschlangenlänge der datenträger-lesevorgänge        1,32117911255157
\\is1msphc01\physikalischer datenträger(18)\schreibzeit (%)                                                        190,240409786843
\\is1msphc01\physikalischer datenträger(18)\durchschnittl. warteschlangenlänge der datenträger-schreibvorgänge     1,90240409786843
\\is1msphc01\physikalischer datenträger(18)\mittlere sek./übertragung                                           0,00147626440953134
\\is1msphc01\physikalischer datenträger(18)\mittlere sek./lesevorgänge                                           0,0114958377750992
\\is1msphc01\physikalischer datenträger(18)\mittlere sek./schreibvorgänge                                      0,000919621680343157
\\is1msphc01\physikalischer datenträger(18)\übertragungen/s                                                        2183,02005618147
\\is1msphc01\physikalischer datenträger(18)\lesevorgänge/s                                                         114,895792430604
\\is1msphc01\physikalischer datenträger(18)\schreibvorgänge/s                                                      2068,12426375087
\\is1msphc01\physikalischer datenträger(18)\bytes/s                                                                20670148,6994291
\\is1msphc01\physikalischer datenträger(18)\bytes gelesen/s                                                        773442,507264325
\\is1msphc01\physikalischer datenträger(18)\bytes geschrieben/s                                                    19896706,1921648
\\is1msphc01\physikalischer datenträger(18)\mittlere bytes/übertragung                                             9468,60228832952
\\is1msphc01\physikalischer datenträger(18)\mittlere bytes/lesevorgang                                             6731,68695652174
\\is1msphc01\physikalischer datenträger(18)\mittlere bytes/schreibvorgang                                          9620,65314009662
\\is1msphc01\physikalischer datenträger(18)\leerlaufzeit (%)                                                       23,5656715974909
\\is1msphc01\physikalischer datenträger(18)\teil-e/a/s                                                             537,512489805781

So weit so gut… nur leider auch die Fehler, das Skript geht mit einer 1 raus und checkmk zeigt mir check failed an

Das hier ist die foreach Schleife und ich weiss nicht wo ich dort write-host eintragen soll, die Zeile 52 habe ich mit einem #52 markiert


$counts = @()
$remotecounts = @()
$idtolun = @{}

$csvs = Get-ClusterSharedVolume
foreach ( $csv in $csvs ) {
    if ($csv | Where-Object { $_.OwnerNode -match $env:COMPUTERNAME }) {
        $diskguid = ($csv | Get-ClusterParameter DiskIdGuid).Value
        $lunid = $csv.Name
        $disk = get-disk | Where-Object { $_.guid -match $diskguid }
        $diskid = $disk.DiskNumber
        $idtolun[$diskid] = $lunid
        $counts += $disk
    }
    else {
        $diskguid = ($csv | Get-ClusterParameter DiskIdGuid).Value
        $lunid = $csv.Name
        $disk = get-disk | Where-Object { $_.guid -match $diskguid }
        $diskid = $disk.DiskNumber
#52  $idtolun[$diskid] = $lunid
        $remotecounts += $disk
    }
}

$resultlist = @()

Kann ich den Zustand des Hyper-V Hosts auch anders monitoren? Die VM’s selbst werden nicht
zum monitoring gebraucht. Gibt es dafür ein Plugin das ich nur zum msi File hinzufügen muss?

Vielen Dank für deine investierte Zeit.

Grüße Dennis

Hallo nochmal… habe eben noch etwas Unterstützung bekommen…

Die DiskNumber ist beim else Zweig immer leer. Die Disk exisitiert und der Parameter auch aber er hat keinen Wert.

Wenn sich die Disk jedoch auf dem selben Host befindet, sind die DiskNumber Parameter schön gefüllt.

Da jeder Host des Clusters überwacht wird, stellt sich mir die Frage, ob wir überhaupt den Else Zweig brauchen ?

Grüße

Ja die Unterscheidung wird gebraucht um festzustellen ob die Volumes local oder remote sind.
Der Crash erfolgt im Zweig welcher feststellt ob die LUN remote ist.
Wenn Ihr diesen Zweig raus nehmt dann bitte auch weiter unten den Teil raus nehmen welcher die remote LUNs ausgibt.

Hallo Andreas,

danke für die Info mit den luns… wir hab jetzt sowohl den else Inhalt als auch die foreach Schleife aus kommentiert. Das Skript liefert in PowerShell alle gewünschten Daten, leider zeigt checkmk immer noch check failed an.

Die Log-File hat ein UTF-8 Fehler gebracht… also habe ich das Skript convertiert in UTF8 und laufen lassen.

Nun bringte er mir im Crash Report einen “KeyError (avg. disk read queue length)” und der
Agent output lautet…

Hier nur der Anfang vom Output…

Internal error: ('utf-8', b'<<<check_mk>>>\nVersion: 2.0.0p11\nBuildDate: Sep 16 2021\nAgentOS: windows\nHostname: IS1MSPHC01\nArchitecture: 64bit\nWorkingDirectory: C:\\Windows\\system32\nConfigFile: C:\\Program Files (x86)\\checkmk\\service\\check_mk.yml\nLocalConfigFile: C:\\ProgramData\\checkmk\\agent\\check_mk.user.yml\nAgentDirectory: C:\\Program Files (x86)\\checkmk\\service\nPluginsDirectory: C:\\ProgramData\\checkmk\\agent\\plugins\nStateDirectory: C:\\ProgramData\\checkmk\\agent\\state\nConfigDirectory: C:\\ProgramData\\checkmk\\agent\\config\nTempDirectory: C:\\ProgramData\\checkmk\\agent\\tmp\nLogDirectory: C:\\ProgramData\\checkmk\\agent\\log\nSpoolDirectory: C:\\ProgramData\\checkmk\\agent\\spool\nLocalDirectory: C:\\ProgramData\\checkmk\\agent\\local\nOnlyFrom:

das File ist ja jetzt UTF-8 :triumph:

Hat jemand diesen Fehler schon gehabt?

greetz

Der Fehler lautet “deutsches Windows” :smiley:
Du wirst in deiner deutschen Version alle Namen am Ende auf Englisch wieder umschreiben müssen damit die Checks damit umgehen können.

Hab ich das jetzt richtig verstanden? checkmk funktioniert nicht mit einem deutschen BS?
Zumindest nicht die PS Skripte.

Nein - ich habe meine Sachen halt für Englisches Windows erstellt und das Problem sind halt die unterschiedlichen Namen zwischen Englisch und Deutsch.

Generell gilt sobald Ausgaben Sprachspezifisch sind wird es kompliziert da die Checks dann auch diese verschiedenen Sprachen interpretieren müssen. Die Checks welche zu dem Powershell Script gehören habe ich ja auch selbst erstellt und wenn ich nur Englisches Windows benutz dann gibts meine Checks halt auch nur für englische Ausgaben.

Danke Andreas…

Wo in checkmk kann ich das auf deutsch umkonvertieren?

Naja es sollte innerhalb der Lokal Struktur in der Monitoring Instanz die installierten Checks geben. Diese müssten halt für Deutsch relativ aufwendig umgeschrieben werden. Die entsprechenden Dateien sind “hyperv_host_io_local” und “hyperv_host_io_remote”.

ok danke ich werde sie mir anschauen und hoffe das ich sie bearbeiten kann.

wie kann ich mir das skript runterladen? hab es zwar in plugins gefunden aber
sehe nichts zum bearbeiten oder downloaden.

vielen dank für deine Hilfe :gift_heart:

Hallo,

muss das skript hyperv_host_io_remote“ überhaupt angefasst werden?

grüße

Wenn ihr keine remote LUNs mit in der Überwachung habt nach dem bearbeiten des Powershell Scriptes dann braucht ihr nur io_local anpassen.