Vlastní exportér pro Prometheus

Další nadšenecký článek od admina pro adminy. To, že používám Golang jako hlavní programovací jazyk asi netřeba představovat. Nedávno jsme nasazovali Prometheus jako monitorovací nástroj a chci tady popsat jeho výhody.

Programy v goučku se snadno ladí pomocí knihovny runtime.pprof. Pprof si vytvoří http socket, kde se lze dozvědět spousta věcí o výkonu a také exportuje textové metriky, které si lze dát do různých grafů, nebo takto program monitorovat.

Tohoto principu využívá i Prometheus, který se připojí na tyto metriky a ukládá je do vlastní time-series databáze.

Do těchto metrik si můžete přidat zajímavá data z vlastního programu a tak exportovat data ve standardní podobě, kterým rozumí spousta nástrojů, ne jen Prometheus, ukládat je pomocí standardního nástroje do vlastní databáze nebo posílat emailem, pokud služba v nějaké úloze selže.

Rozšířil jsem si svůj program pro zjištění vypršení certifikátů na webu a přidal export pro Prometheus.

Je to snadné, nejdříve definujeme proměnnou, kam budeme zapisovat stáří certifikátu (dny do jeho vypršení) a potom stačí volat kontrolu tak často, jak potřebujeme (zde každých deset sekund pro ukázku při sledování metriky pomocí curl):

var (
	crtDays = promauto.NewGauge(prometheus.GaugeOpts{
		Name: "Certificate days",
		Help: "The number of days before expiration",
	})
)

func main() {
    go func() {
        for {
            time.Sleep(10 * time.Second)
            crtDays.Set(float64(checkCerts(addr)))
        }
    }()
    http.Handle("/metrics", promhttp.Handler())
    http.ListenAndServe(":2112", nil)
}

A na portu v 2112 potom sledovat metriku “Certificate days”:

curl -s http://localhost:2112/metrics | grep Certifi
# HELP Certificate_days The number of days before expiration
# TYPE Certificate_days gauge
Certificate_days 79

, ,