OpenNMS überwacht NTP

NTP zu überwachen ist relativ komplex. Dabei ist die Überwachung der Zeitdifferenz zu einer NTP Quelle relativ einfach. Was das ganze komplex macht ist NTP selbst. D.h. die beste NTP Überwachung nützt nichts, wenn man NTP nicht verstanden hat und NTP auf den jeweiligen Servern nicht richtig konfiguriert hat. Hier geht’s aber nur um die Basisüberwachung von NTP per OpenNMS.

Bei der NTP-Überwachung nehme ich ntpq. Dabei nutze ich, dass das Tool den aktuell besten peer mit einem Stern „*“ markiert. Das ganze packe ich in ein kleines Skript /usr/local/bin/ntp-time.sh :

#!/bin/sh
ntpq -pn localhost | /usr/bin/awk 'BEGIN { delay=1000; offset=1000; jitter=1000; stratum=16 } $1 ~ /\*/ { delay=$8; offset=$9; jitter=$10; stratum=$3 } END { print int(delay)"\n"int(offset)"\n"int(jitter)"\n"stratum }'

Dieses Skript wiederum integriere ich in den snmp daemon (snmpd.conf):

extend ntp-time /usr/local/bin/ntp-tim.sh 

Kurzer lokaler Test nach dem „/etc/init.d/snmpd reload“ ob es funktioniert:

snmpwalk -v2c -cpublic localhost -On .1.3.6.1.4.1.8072.1.3.2.4.1.2.8.110.116.112.45.116.105.109.101
.1.3.6.1.4.1.8072.1.3.2.4.1.2.8.110.116.112.45.116.105.109.101.1 = STRING: 14
.1.3.6.1.4.1.8072.1.3.2.4.1.2.8.110.116.112.45.116.105.109.101.2 = STRING: 0
.1.3.6.1.4.1.8072.1.3.2.4.1.2.8.110.116.112.45.116.105.109.101.3 = STRING: 0
.1.3.6.1.4.1.8072.1.3.2.4.1.2.8.110.116.112.45.116.105.109.101.4 = STRING: 2

Funktioniert das, dann kann es in OpenNMS eingebaut werden:
datacollection-config.xml

            
                
                
                
                
            

snmp-graph.properties

reports=ntp.overview, ntp.stratum \

report.ntp.overview.name=NTP Overview
report.ntp.overview.columns=NTPdelay, NTPoffset, NTPjitter
report.ntp.overview.type=nodeSnmp
report.ntp.overview.command=--title="NTP Overview" --units-exponent=0 \
 --vertical-label="miliseconds" \
 DEF:delay={rrd1}:NTPdelay:AVERAGE \
 DEF:mindelay={rrd1}:NTPdelay:MIN \
 DEF:maxdelay={rrd1}:NTPdelay:MAX \
 DEF:offset={rrd2}:NTPoffset:AVERAGE \
 DEF:minoffset={rrd2}:NTPoffset:MIN \
 DEF:maxoffset={rrd2}:NTPoffset:MAX \
 DEF:jitter={rrd3}:NTPjitter:AVERAGE \
 DEF:minjitter={rrd3}:NTPjitter:MIN \
 DEF:maxjitter={rrd3}:NTPjitter:MAX \
 LINE2:delay#0000ff:"Delay " \
 GPRINT:delay:AVERAGE:"Avg \\: %10.2lf" \
 GPRINT:delay:MIN:"Min \\: %10.2lf" \
 GPRINT:delay:MAX:"Max \\: %10.2lf\\n" \
 LINE2:offset#00ff00:"Offset" \
 GPRINT:offset:AVERAGE:"Avg \\: %10.2lf" \
 GPRINT:offset:MIN:"Min \\: %10.2lf" \
 GPRINT:offset:MAX:"Max \\: %10.2lf\\n" \
 LINE2:jitter#ff0000:"Jitter" \
 GPRINT:jitter:AVERAGE:"Avg \\: %10.2lf" \
 GPRINT:jitter:MIN:"Min \\: %10.2lf" \
 GPRINT:jitter:MAX:"Max \\: %10.2lf\\n" 

report.ntp.stratum.name=NTP Stratum
report.ntp.stratum.columns=NTPstratum
report.ntp.stratum.type=nodeSnmp
report.ntp.stratum.command=--title="NTP Stratum" --units-exponent=0 \
 --vertical-label="stratum" \
 DEF:stratum={rrd1}:NTPstratum:AVERAGE \
 DEF:minstratum={rrd1}:NTPstratum:MIN \
 DEF:maxstratum={rrd1}:NTPstratum:MAX \
 LINE2:stratum#0000ff:"Stratum" \
 GPRINT:stratum:AVERAGE:"Avg \\: %10.2lf" \
 GPRINT:stratum:MIN:"Min \\: %10.2lf" \
 GPRINT:stratum:MAX:"Max \\: %10.2lf\\n" 

Fertig!

Ein paar Bemerkungen dazu:

  1. Ich bin mittlerweile ein Fan von SNMP. Ruckzuck ist der lokale snmp daemon erweitert und dank extend muss man sich nicht um OIDs sorgen. Die OID für „extend ntp-time“ bekommt man mit
    snmptranslate NET-SNMP-EXTEND-MIB::nsExtendOutLine."ntp-time"
    
  2. Thresholds und damit die Alarme muss man natürlich wie gewohnt in OpenNMS anlegen
  3. Mit dem Skript überwache ich nur auf Milisekunden genau. Das Reicht mir