From b3d6a05c55a233ef455d0e93db03dffbdea11137 Mon Sep 17 00:00:00 2001 From: Nathan Coad Date: Thu, 28 Sep 2023 10:31:48 +1000 Subject: [PATCH] query ucs for temperatures --- cmd/server/main.go | 2 +- internal/exporters/UcsmTemperatures.go | 48 ++++++++++++++++++++++---- 2 files changed, 43 insertions(+), 7 deletions(-) diff --git a/cmd/server/main.go b/cmd/server/main.go index 4869be9..cff2762 100644 --- a/cmd/server/main.go +++ b/cmd/server/main.go @@ -20,7 +20,7 @@ func main() { vURL := flag.String("url", "", "The URL of a UCS Manager, eg https://server.domain.example/nuova") vUser := flag.String("user", "ucspe", "The username to use when connecting to UCS Manager") vPass := flag.String("password", "ucspe", "The password to use when connecting to UCS Manager") - listenPort := flag.String("listen-port", "9101", "The port to listen on for telemetry") + listenPort := flag.String("listen-port", ":9101", "The port to listen on for telemetry") flag.Parse() // The following example shows how to retrieve all compute blades. diff --git a/internal/exporters/UcsmTemperatures.go b/internal/exporters/UcsmTemperatures.go index 88b3950..24738be 100644 --- a/internal/exporters/UcsmTemperatures.go +++ b/internal/exporters/UcsmTemperatures.go @@ -15,6 +15,13 @@ type UcsmTemperaturesCollector struct { 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, @@ -43,27 +50,56 @@ func (u *UcsmTemperaturesCollector) Collect(ch chan<- prometheus.Metric) { Blades []mo.ComputeBlade `xml:"computeBlade"` } - req := api.ConfigResolveClassRequest{ + type temps struct { + XMLName xml.Name + Temperatures []ComputeMbTempStats `xml:"computeMbTempStats"` + } + + bladeRequest := api.ConfigResolveClassRequest{ Cookie: u.ucsClient.Cookie, ClassId: "computeBlade", InHierarchical: "false", } - var out blades + var bladeList blades log.Println("Retrieving managed objects with class `computeBlade`") - if err := u.ucsClient.ConfigResolveClass(u.ctx, req, &out); err != nil { + + 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(out.Blades)) - for _, blade := range out.Blades { + log.Printf("Retrieved %d compute blades\n", len(bladeList.Blades)) + for _, blade := range bladeList.Blades { log.Printf("%s:\n", blade.Dn) + log.Printf("%s:\n", blade.ComputeBoard.Dn) 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: %s\n", blade.ComputeBoard.Thermal) + log.Printf("\tThermal: %v\n", blade.ComputeBoard.Thermal) + + filter := api.FilterEq{ + FilterProperty: api.FilterProperty{ + Class: "computeMbTempStats", + Property: "dn", + Value: blade.ComputeBoard.Dn, + }, + } + 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) + } + + log.Printf("Front Temperature: %v\n", tempList.Temperatures[0].FmTempSenIo) } }