diff --git a/README.md b/README.md index 827db57b..0f73b644 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,7 @@ Name | Description | Enabled by default [service](docs/collector.service.md) | Service state metrics | ✓ [system](docs/collector.system.md) | System calls | ✓ [tcp](docs/collector.tcp.md) | TCP connections | +[thermalzone](docs/collector.thermalzone.md) | Thermal information [textfile](docs/collector.textfile.md) | Read prometheus metrics from a text file | ✓ [vmware](docs/collector.vmware.md) | Performance counters installed by the Vmware Guest agent | diff --git a/collector/thermalzone.go b/collector/thermalzone.go new file mode 100644 index 00000000..bb90a940 --- /dev/null +++ b/collector/thermalzone.go @@ -0,0 +1,105 @@ +package collector + +import ( + "github.com/StackExchange/wmi" + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/common/log" +) + +func init() { + Factories["thermalzone"] = NewThermalZoneCollector +} + +// A ThermalZoneCollector is a Prometheus collector for WMI Win32_PerfRawData_Counters_ThermalZoneInformation metrics +type ThermalZoneCollector struct { + HighPrecisionTemperature *prometheus.Desc + PercentPassiveLimit *prometheus.Desc + Temperature *prometheus.Desc + ThrottleReasons *prometheus.Desc +} + +// NewThermalZoneCollector ... +func NewThermalZoneCollector() (Collector, error) { + const subsystem = "thermalzone" + return &ThermalZoneCollector{ + HighPrecisionTemperature: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "high_precision_temperature"), + "(HighPrecisionTemperature)", + nil, + nil, + ), + PercentPassiveLimit: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "percent_passive_limit"), + "(PercentPassiveLimit)", + nil, + nil, + ), + Temperature: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "temperature"), + "(Temperature)", + nil, + nil, + ), + ThrottleReasons: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "throttle_reasons"), + "(ThrottleReasons)", + nil, + nil, + ), + }, nil +} + +// Collect sends the metric values for each metric +// to the provided prometheus Metric channel. +func (c *ThermalZoneCollector) Collect(ch chan<- prometheus.Metric) error { + if desc, err := c.collect(ch); err != nil { + log.Error("failed collecting thermalzone metrics:", desc, err) + return err + } + return nil +} + +// Win32_PerfRawData_Counters_ThermalZoneInformation docs: +// - +type Win32_PerfRawData_Counters_ThermalZoneInformation struct { + Name string + + HighPrecisionTemperature uint32 + PercentPassiveLimit uint32 + Temperature uint32 + ThrottleReasons uint32 +} + +func (c *ThermalZoneCollector) collect(ch chan<- prometheus.Metric) (*prometheus.Desc, error) { + var dst []Win32_PerfRawData_Counters_ThermalZoneInformation + q := queryAll(&dst) + if err := wmi.Query(q, &dst); err != nil { + return nil, err + } + + ch <- prometheus.MustNewConstMetric( + c.HighPrecisionTemperature, + prometheus.GaugeValue, + float64(dst[0].HighPrecisionTemperature), + ) + + ch <- prometheus.MustNewConstMetric( + c.PercentPassiveLimit, + prometheus.GaugeValue, + float64(dst[0].PercentPassiveLimit), + ) + + ch <- prometheus.MustNewConstMetric( + c.Temperature, + prometheus.GaugeValue, + float64(dst[0].Temperature), + ) + + ch <- prometheus.MustNewConstMetric( + c.ThrottleReasons, + prometheus.GaugeValue, + float64(dst[0].ThrottleReasons), + ) + + return nil, nil +} diff --git a/docs/collector.thermalzone.md b/docs/collector.thermalzone.md new file mode 100644 index 00000000..5a054ffd --- /dev/null +++ b/docs/collector.thermalzone.md @@ -0,0 +1,31 @@ +# tcp collector + +The thermalzone collector exposes metrics about system temps. Note that temperature is given in Kelvin + +||| +-|- +Metric name prefix | `thermalzone` +Classes | [`Win32_PerfRawData_Counters_ThermalZoneInformation`](https://msdn.microsoft.com/en-us/library/aa394341(v=vs.85).aspx) +Enabled by default? | No + +## Flags + +None + +## Metrics + +Name | Description | Type | Labels +-----|-------------|------|------- +`wmi_thermalzone_high_precision_temperature` | _Not yet documented_ | gauge | None +`wmi_thermalzone_percent_passive_limit` | _Not yet documented_ | gauge | None +`wmi_thermalzone_temperature ` | _Not yet documented_ | gauge | None +`wmi_thermalzone_throttle_reasons ` | _Not yet documented_ | gauge | None + +### Example metric +_This collector does not yet have explained examples, we would appreciate your help adding them!_ + +## Useful queries +_This collector does not yet have any useful queries added, we would appreciate your help adding them!_ + +## Alerting examples +_This collector does not yet have alerting examples, we would appreciate your help adding them!_