🎉 Initial version
This commit is contained in:
79
PrometheusCollector/Collector.go
Normal file
79
PrometheusCollector/Collector.go
Normal file
@ -0,0 +1,79 @@
|
||||
package PrometheusCollector
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
"minie4.de/tplinkswitchexporter/TPLinkClient"
|
||||
)
|
||||
|
||||
type TPLinkCollector struct {
|
||||
client *TPLinkClient.TPLinkClient
|
||||
portMetrics map[string](*prometheus.GaugeVec)
|
||||
}
|
||||
|
||||
var portFields = []string{
|
||||
"Enabled",
|
||||
"LinkStatus",
|
||||
"TxGoodPkt",
|
||||
"TxBadPkt",
|
||||
"RxGoodPkt",
|
||||
"RxBadPkt",
|
||||
}
|
||||
|
||||
func NewPrometheusCollector(client *TPLinkClient.TPLinkClient) *TPLinkCollector {
|
||||
portMetrics := make(map[string](*prometheus.GaugeVec))
|
||||
|
||||
for _, field := range portFields {
|
||||
portMetrics[field] = prometheus.NewGaugeVec(
|
||||
prometheus.GaugeOpts{
|
||||
Name: strings.ToLower(field),
|
||||
Namespace: "tplinkexporter",
|
||||
Subsystem: "portstats",
|
||||
Help: fmt.Sprintf("Value of the '%s' metric from the TP-Link switch", field),
|
||||
},
|
||||
[]string{"portnum", "host", "mac", "name", "type"},
|
||||
)
|
||||
}
|
||||
|
||||
return &TPLinkCollector{
|
||||
client: client,
|
||||
portMetrics: portMetrics,
|
||||
}
|
||||
}
|
||||
|
||||
func (collector *TPLinkCollector) Collect(ch chan<- prometheus.Metric) {
|
||||
info := collector.client.QueryInfo()
|
||||
stats := collector.client.QueryStats()
|
||||
|
||||
addLabels := func(g *prometheus.GaugeVec, port TPLinkClient.StatsData) prometheus.Gauge {
|
||||
return g.With(prometheus.Labels{
|
||||
"portnum": strconv.Itoa(int(port.Port)),
|
||||
"host": info.IPAddr,
|
||||
"mac": info.Mac,
|
||||
"name": info.Hostname,
|
||||
"type": info.Type,
|
||||
})
|
||||
}
|
||||
|
||||
for _, port := range stats {
|
||||
addLabels(collector.portMetrics["Enabled"], port).Set(map[bool]float64{true: 1, false: 0}[port.Enabled])
|
||||
addLabels(collector.portMetrics["LinkStatus"], port).Set(float64(port.LinkStatus))
|
||||
addLabels(collector.portMetrics["TxGoodPkt"], port).Set(float64(port.TxGoodPkt))
|
||||
addLabels(collector.portMetrics["TxBadPkt"], port).Set(float64(port.TxBadPkt))
|
||||
addLabels(collector.portMetrics["RxGoodPkt"], port).Set(float64(port.RxGoodPkt))
|
||||
addLabels(collector.portMetrics["RxBadPkt"], port).Set(float64(port.RxBadPkt))
|
||||
}
|
||||
|
||||
for _, metric := range collector.portMetrics {
|
||||
metric.Collect(ch)
|
||||
}
|
||||
}
|
||||
|
||||
func (collector *TPLinkCollector) Describe(ch chan<- *prometheus.Desc) {
|
||||
for _, field := range collector.portMetrics {
|
||||
field.Describe(ch)
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user