added syspatch exporter

This commit is contained in:
ston1th 2020-08-31 17:49:38 +02:00
commit 632c8e13c1
2 changed files with 87 additions and 2 deletions

17
main.go
View file

@ -8,6 +8,7 @@ import (
"os" "os"
"git.giftfish.de/ston1th/rcctl_exporter/rcctl" "git.giftfish.de/ston1th/rcctl_exporter/rcctl"
"git.giftfish.de/ston1th/rcctl_exporter/syspatch"
"github.com/go-kit/kit/log/level" "github.com/go-kit/kit/log/level"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp" "github.com/prometheus/client_golang/prometheus/promhttp"
@ -56,18 +57,30 @@ func main() {
r := prometheus.NewRegistry() r := prometheus.NewRegistry()
r.MustRegister(version.NewCollector("rcctl_exporter")) r.MustRegister(version.NewCollector("rcctl_exporter"))
r.MustRegister(version.NewCollector("syspatch_exporter"))
collector, err := rcctl.NewCollector(logger) rcctlCollector, err := rcctl.NewCollector(logger)
if err != nil { if err != nil {
level.Error(logger).Log("msg", "couldn't create collector", "err", err) level.Error(logger).Log("msg", "couldn't create collector", "err", err)
os.Exit(1) os.Exit(1)
} }
if err := r.Register(collector); err != nil { if err := r.Register(rcctlCollector); err != nil {
level.Error(logger).Log("msg", "couldn't register rcctl collector", "err", err) level.Error(logger).Log("msg", "couldn't register rcctl collector", "err", err)
os.Exit(1) os.Exit(1)
} }
syspatchCollector, err := syspatch.NewCollector(logger)
if err != nil {
level.Error(logger).Log("msg", "couldn't create collector", "err", err)
os.Exit(1)
}
if err := r.Register(syspatchCollector); err != nil {
level.Error(logger).Log("msg", "couldn't register syspatch collector", "err", err)
os.Exit(1)
}
handler := promhttp.HandlerFor( handler := promhttp.HandlerFor(
prometheus.Gatherers{exporterMetricsRegistry, r}, prometheus.Gatherers{exporterMetricsRegistry, r},
promhttp.HandlerOpts{ promhttp.HandlerOpts{

72
syspatch/syspatch.go Normal file
View file

@ -0,0 +1,72 @@
// Copyright (C) 2020 Marius Schellenberger
package syspatch
import (
"bytes"
"github.com/go-kit/kit/log"
"github.com/go-kit/kit/log/level"
"github.com/prometheus/client_golang/prometheus"
"os/exec"
"sync"
"time"
)
const (
namespace = "syspatch"
syspatch = "/usr/sbin/syspatch"
errUpdateInterval = time.Second * 30
updateInterval = time.Hour * 2
)
type Collector struct {
sync.RWMutex
patches *prometheus.Desc
logger log.Logger
num float64
}
// NewCollector returns a new Collector exposing rcctl statistics.
func NewCollector(logger log.Logger) (*Collector, error) {
c := &Collector{
patches: prometheus.NewDesc(
prometheus.BuildFQName(namespace, "", "patches_available"),
"Number of syspatch patches available.",
nil, nil,
),
logger: logger,
}
go c.getPatches()
return c, nil
}
func (c *Collector) getPatches() {
for {
cmd := exec.Command(syspatch, "-c")
out, err := cmd.Output()
if err != nil {
level.Debug(c.logger).Log("msg", "syspatch list patches", "error", err)
time.Sleep(errUpdateInterval)
continue
}
num := float64(bytes.Count(out, []byte("\n")))
c.Lock()
c.num = num
c.Unlock()
time.Sleep(updateInterval)
}
}
func (c *Collector) Collect(ch chan<- prometheus.Metric) {
c.RLock()
num := c.num
c.RUnlock()
ch <- prometheus.MustNewConstMetric(
c.patches, prometheus.GaugeValue, num)
}
func (c *Collector) Describe(desc chan<- *prometheus.Desc) {
desc <- c.patches
}