Files
ucs-exporter/internal/exporters/UcsmTemperatures.go
Nathan Coad 95a48a89a6
All checks were successful
continuous-integration/drone/push Build is passing
test build
2023-09-28 11:55:15 +10:00

152 lines
4.8 KiB
Go

package exporters
import (
"context"
"encoding/xml"
"log"
"github.com/dnaeon/go-ucs/api"
"github.com/dnaeon/go-ucs/mo"
"github.com/prometheus/client_golang/prometheus"
)
type UcsmTemperaturesCollector struct {
ucsClient *api.Client
ctx context.Context
}
/*
type ComputeMbTempStats struct {
XMLName xml.Name `xml:"computeMbTempStats"`
Dn string `xml:"dn,attr,omitempty"`
FmTempSenIo string `xml:"fmTempSenIo,attr,omitempty"`
FmTempSenRear string `xml:"fmTempSenRear,attr,omitempty"`
}
*/
func NewUcsmTemperatureCollector(client *api.Client, ctx context.Context) *UcsmTemperaturesCollector {
return &UcsmTemperaturesCollector{
ucsClient: client,
ctx: ctx,
}
}
// Describe prometheus describe
func (u *UcsmTemperaturesCollector) Describe(ch chan<- *prometheus.Desc) {
log.Printf("Running Describe for UcsmTemperaturesCollector\n")
ch <- prometheus.NewDesc("ucsm_temperature_sensor",
"UCSM temperature sensor for motherboard/cpu/psu",
[]string{"server", "component", "description"}, nil,
)
ch <- prometheus.NewDesc("ucsm_temperature_sensor",
"UCSM temperature sensor for motherboard/cpu/psu",
[]string{"server", "component", "description"}, nil,
)
}
// Collect prometheus collect
func (u *UcsmTemperaturesCollector) Collect(ch chan<- prometheus.Metric) {
// The type into which we unmarshal the result data
type blades struct {
XMLName xml.Name
Blades []mo.ComputeBlade `xml:"computeBlade"`
}
type temps struct {
XMLName xml.Name
Temperatures []mo.ComputeMbTempStats `xml:"computeMbTempStats"`
}
bladeRequest := api.ConfigResolveClassRequest{
Cookie: u.ucsClient.Cookie,
ClassId: "computeBlade",
InHierarchical: "false",
}
var bladeList blades
log.Println("Retrieving managed objects with class `computeBlade`")
if err := u.ucsClient.ConfigResolveClass(u.ctx, bladeRequest, &bladeList); err != nil {
log.Fatalf("Unable to retrieve `computeBlade` managed object: %s", err)
}
log.Printf("Retrieved %d compute blades\n", len(bladeList.Blades))
for _, blade := range bladeList.Blades {
log.Printf("%s:\n", blade.Dn)
boardDn := "^" + blade.Dn + "/board/"
//boardDn := blade.Dn + "/board/"
log.Printf("%s:\n", boardDn)
log.Printf("\tNumber of CPUs: %d\n", blade.NumOfCpus)
log.Printf("\tTotal Memory: %d\n", blade.TotalMemory)
log.Printf("\tModel: %s\n", blade.Model)
log.Printf("\tVendor: %s\n", blade.Vendor)
//log.Printf("\tThermal: %v\n", blade.ComputeBoard.Thermal)
filter := api.FilterWildcard{
FilterProperty: api.FilterProperty{
Class: "computeMbTempStats",
Property: "dn",
Value: boardDn,
},
}
log.Printf("Filter: %v\n", filter)
tempReq := api.ConfigResolveClassRequest{
Cookie: u.ucsClient.Cookie,
ClassId: "computeMbTempStats",
InHierarchical: "false",
InFilter: filter,
}
var tempList temps
log.Printf("Retrieving temperatures for this blade\n")
/*
if err := u.ucsClient.ConfigResolveClass(u.ctx, tempReq, &tempList); err != nil {
log.Fatalf("Unable to retrieve `computeMbTempStats` managed object: %s", err)
}
*/
u.ucsClient.ConfigResolveClass(u.ctx, tempReq, &tempList)
log.Printf("Front Temperature: %v\n", tempList)
}
}
/*
logger = logging.getLogger("UcsmTemperatureSensorCollector")
class UcsmTemperatureSensorCollector(BaseCollector):
def get_metrics(self):
return {
"sensor": GaugeMetricFamily("ucsm_temperature_sensor",
"UCSM temperature sensor for motherboard/cpu/psu",
labels=['server', 'component',
'description'])
}
def collect_metrics(self, server, handle):
logger.debug("Collecting Metrics ")
g = self.get_metrics()['sensor']
mb_temp = handle.query_classid(NamingId.COMPUTE_MB_TEMP_STATS)
for temp in mb_temp:
value_rear = math.nan if temp.fm_temp_sen_rear == 'not-applicable' else temp.fm_temp_sen_rear
g.add_metric(labels=[server, temp.dn, "motherboard_rear_temperature"],
value=value_rear)
value_io = math.nan if temp.fm_temp_sen_io == 'not-applicable' else temp.fm_temp_sen_io
g.add_metric(labels=[server, temp.dn, "motherboard_front_temperature"],
value=value_io)
cpu_temp = handle.query_classid(NamingId.PROCESSOR_ENV_STATS)
for temp in cpu_temp:
g.add_metric(labels=[server, temp.dn, "cpu_temperature"],
value=temp.temperature)
psu_temp = handle.query_classid(NamingId.EQUIPMENT_PSU_STATS)
for temp in psu_temp:
g.add_metric(labels=[server, temp.dn, "psu_temperature"],
value=temp.ambient_temp)
yield g
*/