NAGIOSPLUGIN
EINE PYTHON-KLASSENBIBLIOTHEK FÜR NAGIOS/ICINGA-
                    PLUGINS
                   Christian Kauhaus
                    kc@gocept.com
“ The most important figures that one
needs for management are unknown or
             unknowable. ”
             (Lloyd S. Nelson)
CHRISTIAN KAUHAUS
  seit 2008 bei gocept
  Sysadmin
  Hosting/Data Center
  FlyingCircus.io
ÜBERBLICK
Intro
Konzepte
Basics
   Datenerhebung
   Datenbewertung
   Präsentation
Advanced
   Logging & Output
   Persistente Daten
   Fehlerbehandlung
Fazit
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
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
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
NAGIOS PLUGIN API

timeout      standard options      output spec
          exit codes           range syntax
    performance data      multi-threshold   status line
                       long output
BEISPIEL: OUTPUT SPEC
CEK-sau ln |pr1pr2
 HC   tts ie ef ef
ln otu
 og upt
ln otu
 og upt
|pr3pr4
  ef ef
pr5pr6
 ef ef
BEISPIEL: RANGE-SYNTAX

         9
         -6:8
         ~:3
         -2.25:
         @5:7.5
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
KONZEPTE
Terminlogie bei #monitoringsucks –
      watch your language


             Resource
             Metric
             Context
             Event
             Action
KONZEPTE IM NAGIOS-KONTEXT
ZENTRALE KLASSEN
BASICS #1: DATENERHEBUNG
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 ]
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)
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:
    ..
    .
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)
BASICS #2: DATENBEWERTUNG
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 ..
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) .)
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
BASICS #3: PRÄSENTATION
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
NICHT HILFREICH
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
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')
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   ]
  ..
  .
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
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
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
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
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)
ADVANCED #2: PERSISTENTE DATEN
 Zustand zwischen Plugin-Aufrufen behalten


                   Cookie
                   LogTail
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
}
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
       ..
        .
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
@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)
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
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
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
DANKE!
 FRAGEN?

Weitere ähnliche Inhalte

PDF
PDF
Nagios Conference 2007 | Monitoring von Logfiles mit check_logfiles by Gerhar...
PDF
Java Script Ist Anders
PDF
Vermisste Sprachfeatures in Java (german)
PDF
Web Entwicklung mit PHP - Teil 1
PDF
OSMC 2012 | Automatische Konfiguration von Nagios/Icinga mit Agordamon by Chr...
PDF
PostgreSQL: Eigene Aggregate schreiben
PPT
SQL-Updates mit der JDBC-API
Nagios Conference 2007 | Monitoring von Logfiles mit check_logfiles by Gerhar...
Java Script Ist Anders
Vermisste Sprachfeatures in Java (german)
Web Entwicklung mit PHP - Teil 1
OSMC 2012 | Automatische Konfiguration von Nagios/Icinga mit Agordamon by Chr...
PostgreSQL: Eigene Aggregate schreiben
SQL-Updates mit der JDBC-API

Andere mochten auch (6)

PPTX
Tipps für schlanke Frauen Beine Ernährung bei Cellulite
PDF
Psychologies medewerkers van de maand: Annemieke Dubois & Genevieve Heintz
PPTX
Richard ESCADAFAL "Land and soils task force"
PDF
презентация высокого полета Slideshare
PPTX
Erikson’s stages of psychosocial development
PDF
Gis mobile
Tipps für schlanke Frauen Beine Ernährung bei Cellulite
Psychologies medewerkers van de maand: Annemieke Dubois & Genevieve Heintz
Richard ESCADAFAL "Land and soils task force"
презентация высокого полета Slideshare
Erikson’s stages of psychosocial development
Gis mobile
Anzeige

nagiosplugin - eine Python-Biblioth­ek für Monitoring-Plug­ins

  • 1. NAGIOSPLUGIN EINE PYTHON-KLASSENBIBLIOTHEK FÜR NAGIOS/ICINGA- PLUGINS Christian Kauhaus kc@gocept.com
  • 2. “ The most important figures that one needs for management are unknown or unknowable. ” (Lloyd S. Nelson)
  • 3. CHRISTIAN KAUHAUS seit 2008 bei gocept Sysadmin Hosting/Data Center FlyingCircus.io
  • 4. ÜBERBLICK Intro Konzepte Basics Datenerhebung Datenbewertung Präsentation Advanced Logging & Output Persistente Daten Fehlerbehandlung Fazit
  • 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
  • 9. BEISPIEL: OUTPUT SPEC CEK-sau ln |pr1pr2 HC tts ie ef ef ln otu og upt ln otu og upt |pr3pr4 ef ef pr5pr6 ef ef
  • 10. BEISPIEL: RANGE-SYNTAX 9 -6:8 ~:3 -2.25: @5:7.5
  • 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
  • 12. KONZEPTE Terminlogie bei #monitoringsucks – watch your language Resource Metric Context Event Action
  • 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)
  • 35. ADVANCED #2: PERSISTENTE DATEN Zustand zwischen Plugin-Aufrufen behalten Cookie LogTail
  • 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