Auch wenn in der letzten Zeit sehr viel Bewegung in die Monitoring-Szene gekommen ist (#monitoringsucks etc.), werden die Platzhirsche Nagios/Icinga und ihre Standards auf absehbare Zeit nicht verschwinden. Das Nagios-Plugin-API stellt eine sehr weit verbreitete Schnittstelle zur Anbindung einzelner Checks an Monitoring-Systeme dar. Obwohl das API in den Grundzügen sehr einfach ist, ist der Programmieraufwand für vollständig konforme Plugins erstaunlich hoch.
Die nagiosplugin-Bibliothek nimmt dem Entwickler viele Details ab, so dass er sich auf den Inhalt seiner Checks konzentrieren kann. Der Vortrag führt in das Schreiben von Nagios-kompatiblen Plugins ein, zeigt den typischen Aufbau von Nagios-Plugins und das Grundprinzip eigener Plugins. Die Konfiguration und der Betrieb von Monitoring-Systemen im Großen sollen nicht thematisiert werden.
Video: http://pyvideo.org/video/1460/nagiosplugin-eine-python-bibliothek-fur-monitor
Konferenzseite: https://2012.de.pycon.org/programm/schedule/sessions/45/
Projekt-Homepage: https://projects.gocept.com/projects/nagiosplugin/wiki
5. BEIPACKZETTEL
DIESER VORTRAG ENTHÄLT
Einführung in n g o p u i
aislgn
viele Code-Beispiele
Live-Demos
DIESER VORTRAG ENTHÄLT NICHT
die gesamte n g o p u i -API
aislgn
Konfiguration von Nagios/Icinga-Servern
6. INTRO
Plugins sind primäre Methode der
Informationsgewinnung bei Nagios/Icinga
Input: Kommandozeile
Output: Text auf stdout, Exit-Code
Plugin API:
http://nagios.sourceforge.net/docs/3_0/pluginapi.html
Plugin Development Guidelines:
http://nagiosplug.sourceforge.net/developer-
guidelines.html
7. PLUGIN SCHREIBEN? IST DOCH EASY!
#/i/h
!bns
#311ds pui cdz
13 ik lgn oe
#()19,0420,01b wrzu
C 9920-0621 y AEGY
#i yudntudrtn ti g aa
f o o' nesad hs o wy
eh "AEGYskw ds pui i rnig!"
co wrzu' el ik lgn s unn!!
d /r/p0/aa|ge '/ |ak' pit$ } |
f svap1dt rp ^' w { rn 3 '
ge '15... | {
rp [-]..' |
eh "M!!**ds i srwd!" ei 2
co OG! * ik s cee!!; xt
}
eh "iki o"
co ds s k
ei 0
xt
#XXsol nvrrahti
X hud ee ec hs
8. NAGIOS PLUGIN API
timeout standard options output spec
exit codes range syntax
performance data multi-threshold status line
long output
11. NAGIOSPLUGIN IST...
Python-Klassenbibliothek
Open Source (ZPL-Lizenz)
entstanden aus gocept -Eigenbedarf
seit 2010 kontinuierlich weiterentwickelt
Python 3-kompatibel
Release-Stand:
alte 0.4.x API wird nicht mehr weiterentwickelt
Inhalt des Vortrags neue 1.0 API
16. RESOURCE
Domain Model
Subklasse von R s u c
eore
p o e )erzeugt Metriken
rb(
casRsuc:
ls eore
@rpry
poet
dfnm(ef:
e aesl)
rtr sl._ls_._ae_
eun ef_cas__nm_
dfpoesl)
e rb(ef:
rtr [
eun ]
17. BEISPIEL: CHECK_WORLD
ipr ngopui
mot aislgn
casWrdngopui.eore:
ls ol(aislgnRsuc)
dfpoesl)
e rb(ef:
rtr [
eun
ngopui.erc'ol' Tu,cnet'ul)
aislgnMti(wrd, re otx=nl'
]
dfmi(:
e an)
cek=ngopui.hc(ol()
hc aislgnCekWrd)
cekmi(
hc.an)
i _nm_ = '_an_:
f _ae_ = _mi_'
mi(
an)
18. METRIC
Strukturiertes Value-Objekt für einzelnen Datenpunkt
casMti:
ls erc
df_ii_(ef nm,vle umNn,mnNn,mxNn,
e _nt_sl, ae au, o=oe i=oe a=oe
cnetNn)
otx=oe:
..
.
19. BEISPIEL: CHECK_LOAD
casLa(aislgnRsuc)
ls odngopui.eore:
df_ii_(ef prp=as)
e _nt_sl, ecuFle:
sl.ecu=prp
efprp ecu
dfcu(ef:
e pssl)
rtr itsbrcs.hc_upt[nrc])
eun n(upoescekotu('po')
dfpoesl)
e rb(ef:
wt oe(/rclaag)a laag
ih pn'po/odv' s odv:
la =laagraln(.pi([:]
od odv.edie)slt)03
cu =sl.ps)i sl.ecues 1
ps efcu( f efprp le
la =[la()/cu frli la]
od fotl ps o n od
fri pro i eueae[,5 1]:
o , eid n nmrt(1 , 5)
yedngopui.erc'odd %pro,la[]
il aislgnMti(la%' eid odi,
mn0 cnet'eal'
i=, otx=dfut)
21. CONTEXT
erzeugt R s l aus M t i und R s u c
eut erc eore
erzeugt Performance Data
erzeugt Klartext-Beschreibung
casCnet
ls otx:
df_ii_(ef nm,..:
e _nt_sl, ae .)
..
.
dfeaut(ef mti,rsuc)
e vlaesl, erc eore:
rtr Rsl(.)
eun eut..
dfpromnesl,mti,rsuc)
e efrac(ef erc eore:
rtr Promne..
eun efrac(.)
dfdsrb(ef mti)
e eciesl, erc:
rtr '.'
eun ..
22. SCALARCONTEXT
Häufig gebrauchter Spezialfall
warning und critical Ranges
casSaaCnetCnet:
ls clrotx(otx)
df_ii_(ef nm,wrig ciia,..:
e _nt_sl, ae ann, rtcl .)
..
.
Verwendung direkt in Check-Initialisierung:
cek=ngopui.hc(
hc aislgnCek
ngopui.clrotx(la' ag.ann,
aislgnSaaCnet'od, rswrig
ag.rtcl,..
rsciia) .)
23. ZUORDNUNG METRIC/CONTEXT
Jede M t i benennt den zuständigen C n e t
erc otx
#La.rb(
odpoe)
frpro,ii zp[,5 1] ietoscut):
o eid n i(1 , 5, trol.on()
yedngopui.erc'odd %pro,la[]
il aislgnMti(la%' eid odi,
mn0 cnet'od)
i=, otx=la'
#mi(
an)
cek=ngopui.hc(
hc aislgnCek
La(,
od)
ngopui.clrotx(la' ag.ann,
aislgnSaaCnet'od, rswrig
ag.rtcl,..
rsciia) .)
Standard-Contexts:
n l - tut gar nichts
ul
d f u t- gibt Performance-Daten aus
eal
25. SUMMARY
Statuszeile ist wichtig!
erscheint in Mails, in SMS, auf Pager
in 80-140 Zeichen die „Message“ herüberbringen
muss nachts 3:30 Uhr verständlich sein
27. SUMMARY – STANDARDIMPLEMENTIERUNG
casSmay
ls umr:
dfo(ef rsls:
e ksl, eut)
rtr srrsls0)
eun t(eut[]
dfpolmsl,rsls:
e rbe(ef eut)
ty
r:
rtr srrslsfrtsgiiat
eun t(eut.is_infcn)
ecp Idxro:
xet neErr
rtr 'ocekrsls
eun n hc eut'
dfvroesl,rsls:
e ebs(ef eut)
mg =[
ss ]
frrsl i rsls
o eut n eut:
i rsl.tt = O:
f eutsae = k
cniu
otne
mg.ped'} {'fra(eutsae rsl)
ssapn({: }.omtrsl.tt, eut)
rtr mg
eun ss
28. BEISPIEL: CHECK_LOAD
casLaSmayngopui.umr)
ls odumr(aislgnSmay:
df_ii_(ef prp)
e _nt_sl, ecu:
sl.ecu=prp
efprp ecu
dfo(ef rsls:
e ksl, eut)
i sl.ecu
f efprp:
wa ='odv prcu
ht laag e p'
es:
le
wa ='odv'
ht laag
rtr '}i {'fra(ht ' 'ji(
eun { s }.omtwa, , .on
srrslsr.erc
t(eut[]mti)
frri [la1,'od' 'od5])
o n 'od' la5, la1')
29. ADVANCED #1: LOGGING & OUTPUT
Setup:
dfmi(:
e an)
..
.
ag.d_ruet'v,'-ebs' ato=cut,
rpadagmn(-' -vroe, cin'on'
dfut0 hl=ices vroiy)
eal=, ep'nrae ebst'
..
.
cekmi(ebs=rsvroe
hc.anvroeag.ebs)
Logging:
dfls_sr(ef:
e ituessl)
lgigif(qeyn ueswt "s cmad,
ogn.no'urig sr ih %" omn'
sl.h_m)
efwocd
ues=[
sr ]
..
.
30. VERBOSE=0
Status und Perfdata auf einer Zeile
Loglevel warning und höher
Summary.verbose() wird nicht angezeigt
$cekues
hc_sr
UESO -4ueslge i |ttl4;0uiu=;;
SR K sr ogd n oa=;; nqe1;0
31. VERBOSE=1
mehrzeilige Ausgabe
sollte Standard sein für Server, die long output
verarbeiten
Loglevel warning und höher
Summary.verbose() wird angezeigt
$cekues-
hc_sr v
UESO -4ueslge i
SR K sr ogd n
ues cahu,cahu,cahu,cahu
sr: kuas kuas kuas kuas
|ttl4;0uiu=;;
oa=;; nqe1;0
32. VERBOSE=2
Konfigurationsinformationen zum Plugin
z.B. Commandlines externer Aufrufe
Loglevel info und höher
$cekuesp -v
hc_sr.y v
UESO -4ueslge i
SR K sr ogd n
ues cahu,cahu,cahu,cahu
sr: kuas kuas kuas kuas
qeyn ueswt "h"cmad(hc_sr.y3)
urig sr ih wo omn cekuesp:4
|ttl4;0uiu=;;
oa=;; nqe1;0
33. VERBOSE=3
Debugging-Informationen
z.B. Zwischenergebnisse
Loglevel debug und höher
$cekuesp -v
hc_sr.y vv
UESO -4ueslge i
SR K sr ogd n
ues cahu,cahu,cahu,cahu
sr: kuas kuas kuas kuas
qeyn ueswt "h"cmad(hc_sr.y3)
urig sr ih wo omn cekuesp:4
wootu:bcahu ty 21-02 1:6 (hc_sr.y3)
h upt 'kuas t1 021-9 23' cekuesp:8
..
.
|ttl4;0uiu=;;
oa=;; nqe1;0
34. FORMATIERUNG VON METRIKEN
C n e tist für „seine“ Metriken zuständig
otx
Variante 1: String-Template
Cnet.. ftmti={ae i {auui})
otx(., m_erc'nm} s vlent'
Variante 2: Callable
dffra_sron(erc cnet:
e omtuecutmti, otx)
rtr '.'
eun ..
Cnet.. ftmti=omtuecut
otx(., m_ercfra_sron)
36. COOKIE
persistentes d c
it
Serialisierung mit JSON
Locking
wt ngopui.okesl.ttfl)a coi:
ih aislgnCoi(efsaeie s oke
sl.ietm =coi.e(ls_en,')
eftmsap okegt'atse' '
mtis=sl.osmtig)
erc efd_oehn(
coi[ls_en]=sl.ietm
oke'atse' eftmsap
Inhalt von statefile:
{
"atse" "021-81:82"
ls_en: 21-02 20:5
}
37. LOGTAIL
Inkrementelles Lesen von wachsenden Logfiles
baut auf C o i auf
oke
erkennt Log-Rotation
Wiederaufsetzen nach Exceptions
dfprelgsl)
e as_o(ef:
coi =ngopui.okesl.ttfl)
oke aislgnCoi(efsaeie
wt ngopui.oTi(eflgie coi)a l:
ih aislgnLgalsl.ofl, oke s f
frln i l:
o ie n f
..
.
38. ADVANCED #3: FEHLERBEHANDLUNG
Was ist, wenn es nicht so läuft wie geplant?
Wichtige Fehlerklassen:
Resource nicht da/nicht abfragbar
Fehlerhafte Kommandozeilen-Parameter
Umgebungsfehler
Programmierfehler
39. @NAGIOSPLUGIN.GUARDED
Schützt die main()-Funktion bei Exceptions:
Exit-Status 3
API-konforme Ausgabe
Traceback bei verbose ≥ 1
@aislgngadd
ngopui.ure
dfmi(:
e an)
ag =agas.ruetasr)
rp rpreAgmnPre(
ag.d_ruet..
rpadagmn(.)
ag =ag.as_rs)
rs rppreag(
cek=ngopui.hc(odag.ecu,..
hc aislgnCekLa(rsprp) .)
cekmi(
hc.an)
40. BEISPIEL: EXCEPTION IN PROBE()
casFi(aislgnRsuc)
ls alngopui.eore:
dfpoesl)
e rb(ef:
rieRniero(Imfeigbd)
as utmErr"' eln a"
@aislgngadd
ngopui.ure
dfmi(:
e an)
ag =agas.ruetasr)
rp rpreAgmnPre(
ag.d_ruet'v,ato=cut,dfut0
rpadagmn(-' cin'on' eal=)
ag =ag.as_rs)
rs rppreag(
cek=ngopui.hc(al)
hc aislgnCekFi()
cekmi(rsvroe
hc.anag.ebs)
Ausgabe (verbose=0):
$cekfi.y
hc_alp
FI UKON Rniero:Imfeigbd
AL NNW: utmErr ' eln a
#ei 3
xt
41. FAZIT
Mit n g o p u i macht das
aislgn
Schreiben von Plugins beinahe Spaß. ;-)
Trennung der Verantwortlichkeiten
wartbarer, objekt-orientierter Code
volle Unterstützung der Plugin-API
kleine Helfer
robustes Verhalten im Fehlerfall
42. USE THE SOURCE, LUKE
Download:
http://pypi.python.org/pypi/nagiosplugin
Code:
https://bitbucket.org/gocept/nagiosplugin
Wiki/Tracker/Forum:
https://projects.gocept.com/projects/nagiosplugin/wiki