Irgendwie kommen Freitags regelmäßig die Kuriositäten des Monitorings bei mir auf den Tisch. Heute zum Thema NTP: Der check_ntp_time aus den nagios-plugins wirft einen Offset unknown Fehler. Obwohl die Uhrzeit richtig wäre. Also mal nachgeschaut was da los ist.

Analyse

Ein Start des Plugins mit -v auf meinem Ubuntu Rechner brachte folgendes Ergebnis:

root@gmn:~# /usr/lib/nagios/plugins/check_ntp_time -H time.gmn -v
sending request to peer 0
response from peer 0: offset -8.09431076e-05
sending request to peer 0
sending request to peer 1
response from peer 1: offset -8.141994476e-05
sending request to peer 1
re-sending request to peer 0
re-sending request to peer 1
re-sending request to peer 0
re-sending request to peer 1
re-sending request to peer 0
re-sending request to peer 1
re-sending request to peer 0
re-sending request to peer 1
re-sending request to peer 0
re-sending request to peer 1
re-sending request to peer 0
discarding peer 0: stratum=0
discarding peer 1: stratum=0
overall average offset: 0
NTP CRITICAL: Offset unknown|

Aha… time.gmn löst hier im Netz auf zwei Server auf. Die ersten Anfragen werden beantwortet, die weiteren in die jeweilige Richtung nicht. Ein tcpdump bestätigt das Bild. Auf der Suche nach der Ursache habe ich eine bereits dazu gemeldete Issue gefunden. Jedoch ohne Lösung.

Lösung

Vom Ablauf her scheinen die Anfragen an den NTP Server schlicht weg zu schnell laufen. Folgende private Situation zur Veranschaulichung: Frage an das Kind: „Wie war es in der Schule?“. Antwort: „Gut“. Frage ans Kind: „Wie war es in der Schule?“. Antwort: „Gut“, aber bereits sichtlich genervt. Frage ans Kind: „Wie war es in der Schule?“. Spätestens jetzt fliegt was in die Richtung des Vaters 😉

Was kann man tun? Laut obiger Ausgabe frägt der Check 4 mal an. Das wird er wohl tun um einen einigermaßen verlässlichen Durchschnitt zu bekommen. Klingt sinnvoll, eine Anpassung des Wertes auf eins macht wohl wenig Sinn. Dann eher den Abstand zwischen den Durchläufen erhöhen. Und in der Tat, das hat funktioniert. Jedoch bin ich dann recht schnell mit dem Default-Timeout des Checks kollidiert. Den kann man mit -t übergeben oder, da der Quellcode eh schon offen ist, dort ebenfalls noch fix anpassen.

Und das habe ich gemacht:

  1. Quellcode von https://github.com/nagios-plugins/nagios-plugins via git geklont
  2. Unter plugins/check_ntp_time.c folgende Änderung eingefügt:
    /* read from any sockets with pending data */
    for(i=0; servers_readable && i<num_hosts; i++){
        sleep(1);    // <<-- INSERT THIS LINE
        if(ufds[i].revents&POLLIN && servers[i].num_responses < AVG_NUM){
            if(verbose) {

    Eingefügt habe ich die 3. Zeile, also den sleep Befehl.

  3. Keine Lust den timeout mit -t zu übergeben? Dann einfach in der plugins/common.h nach DEFAULT_SOCKET_TIMEOUT suchen. Ich habe den Wert bei mir von 10 auf 60 erhöht. Tut es für mich.
  4. Dann gemäß Doku die Plugins übersetzt und den check_ntp_time von Hand ans Ziel kopiert. Fertig.

Die Lösung funktioniert. Ob das der richtige Lösungsweg war sei jetzt mal dahin gestellt. Aber wieder mal Freitag und wieder mal zeigt sich warum ich Open Source mag: Hilf Dir halt selbst. Schönes Wochenende 😉

Der Link zu der oben genannten Issue: https://github.com/nagios-plugins/nagios-plugins/issues/329

 

Nachtrag: Wie in der oben verlinkten Issue zu sehen ist wurde die Grundidee inzwischen in dem Plugin sinngemäß umgesetzt.