mikrotik-exporter/collector/health_collector.go

86 lines
2.0 KiB
Go
Raw Normal View History

package collector
import (
"github.com/prometheus/client_golang/prometheus"
log "github.com/sirupsen/logrus"
"gopkg.in/routeros.v2/proto"
2022-06-03 23:32:20 +02:00
"strconv"
)
type healthCollector struct {
props []string
descriptions map[string]*prometheus.Desc
}
func newhealthCollector() routerOSCollector {
c := &healthCollector{}
c.init()
return c
}
func (c *healthCollector) init() {
c.props = []string{"voltage", "temperature", "cpu-temperature"}
labelNames := []string{"name", "address"}
helpText := []string{"Input voltage to the RouterOS board, in volts", "Temperature of RouterOS board, in degrees Celsius", "Temperature of RouterOS CPU, in degrees Celsius"}
c.descriptions = make(map[string]*prometheus.Desc)
for i, p := range c.props {
c.descriptions[p] = descriptionForPropertyNameHelpText("health", p, labelNames, helpText[i])
}
}
func (c *healthCollector) describe(ch chan<- *prometheus.Desc) {
for _, d := range c.descriptions {
ch <- d
}
}
func (c *healthCollector) collect(ctx *collectorContext) error {
stats, err := c.fetch(ctx)
if err != nil {
return err
}
for _, re := range stats {
c.collectForStat(re, ctx)
}
return nil
}
func (c *healthCollector) fetch(ctx *collectorContext) ([]*proto.Sentence, error) {
2022-06-03 23:32:20 +02:00
reply, err := ctx.client.Run("/system/health/print")
if err != nil {
log.WithFields(log.Fields{
"device": ctx.device.Name,
"error": err,
}).Error("error fetching system health metrics")
return nil, err
}
return reply.Re, nil
}
func (c *healthCollector) collectForStat(re *proto.Sentence, ctx *collectorContext) {
var v float64
var err error
2022-06-03 23:32:20 +02:00
if re.Map["value"] == "" {
return
}
2022-06-03 23:32:20 +02:00
v, err = strconv.ParseFloat(re.Map["value"], 64)
if err != nil {
log.WithFields(log.Fields{
"device": ctx.device.Name,
2022-06-03 23:32:20 +02:00
"property": re.Map["name"],
"value": re.Map["value"],
"error": err,
}).Error("error parsing system health metric value")
return
}
2022-06-03 23:32:20 +02:00
desc := c.descriptions[re.Map["name"]]
ctx.ch <- prometheus.MustNewConstMetric(desc, prometheus.GaugeValue, v, ctx.device.Name, ctx.device.Address)
}