OSMC 2017 | Hochautomatisiertes Warenlogistik - Monitoring bei Europas größte...
Monitoring Workshop 2017 - Philip Griesbacher - Iapetos
1. Iapetos - ein Nagios / Naemon -
Exporter für Prometheus
Philip Griesbacher
Düsseldorf, 12.09.2017
Monitoring
Workshop
2017
2. Seite
Inhalt
• Ziel
• Vorstellung von
– Nagios
– Prometheus
• Realisierung
• Demo
• Fazit
12.09.2017 Philip Griesbacher - www.consol.de2
3. Seite
Ziel
• Nagios / Naemon in Prometheus integrieren
• Überwachung von Nagios / Naemon
• Monitoring-Administratoren die Möglichkeit zum Testen von Prometheus geben
12.09.2017 Philip Griesbacher - www.consol.de3
9. Seite
Realisierung – Go NEB Wrapper
• Warum Go?
• Alternativen:
– C
– C++
• → CGo Bibliothek
• NEB C Schnittstelle ↔ Go Interface
12.09.2017 Philip Griesbacher - www.consol.de9
10. Seite
Realisierung – Go NEB Wrapper
• Abbildung von Konstanten
• Aufrufen von C Methoden aus Go und umgekehrt
• Eigenes Callback-Handling
• Konvertieren von C void Pointer in Go Objekte
12.09.2017 Philip Griesbacher - www.consol.de10
12. Seite
Fazit
• Bestehende Monitoring Umgebungen können nahtlos in Prometheus zu
integrieren, ohne sie in ihrer bisherigen Funktionsweise einzuschränken.
• Der Exporter wird nun offiziell von Prometheus unterstützt, indem er auf ihrer
Webseite Prometheus.io hinterlegt wurde.
• Unterstützte Cores:
– Nagios 3 / Icinga ohne Daemon-Mode
– Nagios 4
– Naemon
• Projekt: https://github.com/Griesbacher/Iapetos
12.09.2017 Philip Griesbacher - www.consol.de16
16. 20Seite Philip Griesbacher - www.consol.de
ConSol* Software GmbH
Franziskanerstraße 38
D-81669 München
Tel: +49-89-45841-100
Fax: +49-89-45841-111
info@consol.de
www.consol.de
12.09.2017
17. Seite
Realisierung - Abbildung von Konstanten
import "C"
const (
ProcessData = C.NEBCALLBACK_PROCESS_DATA
...
)
var callbackTypeMapping = map[int]string{
ProcessData: "ProcessData",
…
}
func CallbackTypeToString(callbackType int) string {…}
12.09.2017 Philip Griesbacher - www.consol.de21
18. Seite
Realisierung - Abbildung von Konstanten
switch neb.GetCoreType() {
case neb.CoreNagios3:
Active = C.SERVICE_CHECK_ACTIVE
Passive = C.SERVICE_CHECK_PASSIVE
...
case neb.CoreNaemon, neb.CoreNagios4:
Active = 0
Passive = 1
...
}
12.09.2017 Philip Griesbacher - www.consol.de22
19. Seite
Realisierung - Abbildung von Konstanten
• neb.CoreNaemon, neb.CoreNagios3, neb.CoreNagios4 ???
• go build -tags nagios3
• #cgo nagios3 CFLAGS: -DNAGIOS3 -I. -I${SRCDIR}/../libs
int nebmodule_init( int flags, char *args, nebmodule *handle ) {
//This is used to tell the Go code for which core its been compiled
#if defined(NAGIOS3)
CORE_TYPE = CORE_NAGIOS3;
…
12.09.2017 Philip Griesbacher - www.consol.de23
20. Seite
Realisierung - Aufruf von C Methoden aus Go
/*
#if defined(NAGIOS3)
void Log(int lvl, char* data) { write_to_all_logs(data, lvl); }
#elif defined(NAGIOS4)
void Log(int lvl, char* data) { write_to_all_logs(data, lvl); }
#elif defined(NAEMON)
void Log(int lvl, char* data) { nm_log(lvl, data); }
#endif
*/
import "C"
func log(lvl int64, data string) {
cs := C.CString(data)
defer C.free(unsafe.Pointer(cs))
C.Log(C.int(lvl), cs)
}
12.09.2017 Philip Griesbacher - www.consol.de24
21. Seite
Realisierung - Aufruf von Go Methoden aus C
//export GoNebModuleInit
func GoNebModuleInit(flags int, args *C.char) C.int {
...
}
int nebmodule_init( int flags, char *args, nebmodule *handle ) {
...
return(GoNebModuleInit(flags, args));
}
12.09.2017 Philip Griesbacher - www.consol.de25
22. Seite
Realisierung - Callback-Handling
• User soll keinen C Kontakt haben
• Laufzeitfehler abfangen
• Laufzeitmessung
• Laufzeitüberschreitung erkennen
12.09.2017 Philip Griesbacher - www.consol.de26
23. Seite
Realisierung - Konvertieren von C void Pointer in
Go Objekte
C void Pointer - 😓 → Go Objekte - 😀
12.09.2017 Philip Griesbacher - www.consol.de27