Files
ucs-exporter/internal/exporters/exporters.go
Nathan Coad 88c8109391
All checks were successful
continuous-integration/drone/push Build is passing
include vnic stats
2023-09-29 14:09:39 +10:00

142 lines
5.7 KiB
Go

package exporters
import (
"context"
"log"
"github.com/dnaeon/go-ucs/api"
"github.com/prometheus/client_golang/prometheus"
"golang.org/x/sync/errgroup"
)
type UcsExporters struct {
// Define each type of metric here
UcsmTemperatures *prometheus.Desc
UcsmVnicStatsRxTotalPkts *prometheus.Desc
UcsmVnicStatsTxTotalPkts *prometheus.Desc
UcsmVnicStatsRxTotalBytes *prometheus.Desc
UcsmVnicStatsTxTotalBytes *prometheus.Desc
UcsmVnicStatsRxDropped *prometheus.Desc
UcsmVnicStatsTxDropped *prometheus.Desc
UcsmVnicStatsRxError *prometheus.Desc
UcsmVnicStatsTxError *prometheus.Desc
// Additional properties required
ucsClient *api.Client
ctx context.Context
}
func NewUcsmExporters(client *api.Client, ctx context.Context) *UcsExporters {
return &UcsExporters{
ucsClient: client,
ctx: ctx,
// UCS Temperatures
UcsmTemperatures: prometheus.NewDesc("ucsm_temperature_sensor",
"UCSM temperature sensor for motherboard/cpu/psu",
[]string{"server", "component", "description"}, nil,
),
// UCS Network statistics
UcsmVnicStatsRxTotalPkts: prometheus.NewDesc("ucsm_vnic_rx_total_packets",
"UCSM Ethernet RX counter: total_packets",
[]string{"server", "component", "description"}, nil,
),
UcsmVnicStatsTxTotalPkts: prometheus.NewDesc("ucsm_vnic_tx_total_packets",
"UCSM Ethernet TX counter: total_packets",
[]string{"server", "component", "description"}, nil,
),
UcsmVnicStatsRxTotalBytes: prometheus.NewDesc("ucsm_vnic_rx_total_bytes",
"UCSM Ethernet RX counter: total_bytes",
[]string{"server", "component", "description"}, nil,
),
UcsmVnicStatsTxTotalBytes: prometheus.NewDesc("ucsm_vnic_tx_total_bytes",
"UCSM Ethernet TX counter: total_bytes",
[]string{"server", "component", "description"}, nil,
),
UcsmVnicStatsRxDropped: prometheus.NewDesc("ucsm_vnic_rx_dropped",
"UCSM Ethernet Rx Dropped counter: total_count",
[]string{"server", "component", "description"}, nil,
),
UcsmVnicStatsTxDropped: prometheus.NewDesc("ucsm_vnic_tx_dropped",
"UCSM Ethernet Tx Dropped counter: total_count",
[]string{"server", "component", "description"}, nil,
),
UcsmVnicStatsRxError: prometheus.NewDesc("ucsm_vnic_rx_error",
"UCSM Ethernet Rx Error counter: total_count",
[]string{"server", "component", "description"}, nil,
),
UcsmVnicStatsTxError: prometheus.NewDesc("ucsm_vnic_tx_error",
"UCSM Ethernet Tx Error counter: total_count",
[]string{"server", "component", "description"}, nil,
),
}
}
// Describe prometheus describe
func (u *UcsExporters) Describe(ch chan<- *prometheus.Desc) {
log.Printf("Running Describe for UcsExporters\n")
// UCS Temperatures
ch <- u.UcsmTemperatures
// UCS Network statistics
ch <- u.UcsmVnicStatsRxTotalPkts
ch <- u.UcsmVnicStatsTxTotalPkts
ch <- u.UcsmVnicStatsRxTotalBytes
ch <- u.UcsmVnicStatsTxTotalBytes
ch <- u.UcsmVnicStatsRxDropped
ch <- u.UcsmVnicStatsTxDropped
ch <- u.UcsmVnicStatsRxError
ch <- u.UcsmVnicStatsTxError
}
// Collect prometheus collect
func (u *UcsExporters) Collect(ch chan<- prometheus.Metric) {
// TODO - refresh UCS Manager login session
//var wg = sync.WaitGroup{}
g, gCtx := errgroup.WithContext(u.ctx)
// Create channels to receive values
ucsmTempsChannel := make(chan []UcsmTemperatures)
ucsmPortStatsChannel := make(chan []UcsmVnicPortStats)
log.Printf("Running Collect for UCS Temperatures\n")
g.Go(func() error {
u.GetUcsmTemperatures(gCtx, ucsmTempsChannel)
return nil
})
log.Printf("Running Collect for UCS Network Statistics\n")
g.Go(func() error {
u.GetUcsmPortStats(gCtx, ucsmPortStatsChannel)
return nil
})
// Receive results from exporter channels
ucsmTempResults := <-ucsmTempsChannel
ucsmVnicStatsResults := <-ucsmPortStatsChannel
//wg.Wait()
// Send results back to prometheus channel
for _, blade := range ucsmTempResults {
log.Printf("Generating constant metric for component %s with value %f\n", blade.Component, blade.Value)
ch <- prometheus.MustNewConstMetric(u.UcsmTemperatures, prometheus.GaugeValue, blade.Value, blade.Server, blade.Component, blade.Description)
}
for _, vnic := range ucsmVnicStatsResults {
log.Printf("Generating constant metric for component %s\n", vnic.Component)
ch <- prometheus.MustNewConstMetric(u.UcsmVnicStatsRxTotalPkts, prometheus.GaugeValue, float64(vnic.Metrics["ucsm_vnic_rx_total_packets"]), vnic.Server, vnic.Component, "ucsm_vnic_rx_total_packets")
ch <- prometheus.MustNewConstMetric(u.UcsmVnicStatsTxTotalPkts, prometheus.GaugeValue, float64(vnic.Metrics["ucsm_vnic_tx_total_packets"]), vnic.Server, vnic.Component, "ucsm_vnic_tx_total_packets")
ch <- prometheus.MustNewConstMetric(u.UcsmVnicStatsRxTotalBytes, prometheus.GaugeValue, float64(vnic.Metrics["ucsm_vnic_rx_total_bytes"]), vnic.Server, vnic.Component, "ucsm_vnic_rx_total_bytes")
ch <- prometheus.MustNewConstMetric(u.UcsmVnicStatsTxTotalBytes, prometheus.GaugeValue, float64(vnic.Metrics["ucsm_vnic_tx_total_bytes"]), vnic.Server, vnic.Component, "ucsm_vnic_tx_total_bytes")
ch <- prometheus.MustNewConstMetric(u.UcsmVnicStatsRxDropped, prometheus.GaugeValue, float64(vnic.Metrics["ucsm_vnic_rx_dropped"]), vnic.Server, vnic.Component, "ucsm_vnic_rx_dropped")
ch <- prometheus.MustNewConstMetric(u.UcsmVnicStatsTxDropped, prometheus.GaugeValue, float64(vnic.Metrics["ucsm_vnic_tx_dropped"]), vnic.Server, vnic.Component, "ucsm_vnic_tx_dropped")
ch <- prometheus.MustNewConstMetric(u.UcsmVnicStatsRxError, prometheus.GaugeValue, float64(vnic.Metrics["ucsm_vnic_rx_error"]), vnic.Server, vnic.Component, "ucsm_vnic_rx_error")
ch <- prometheus.MustNewConstMetric(u.UcsmVnicStatsTxError, prometheus.GaugeValue, float64(vnic.Metrics["ucsm_vnic_tx_error"]), vnic.Server, vnic.Component, "ucsm_vnic_tx_error")
}
}