added syspatch exporter
This commit is contained in:
parent
9afe51eaf4
commit
632c8e13c1
2 changed files with 87 additions and 2 deletions
17
main.go
17
main.go
|
|
@ -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
72
syspatch/syspatch.go
Normal 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
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue