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 */