From b2109861819f797c6df0e6483d09c8f608fa4145 Mon Sep 17 00:00:00 2001 From: Ben Reedy Date: Thu, 19 Sep 2019 22:49:33 +1000 Subject: [PATCH 1/3] Use perflib for logical_disk collector --- collector/logical_disk.go | 70 +++++++++++++++++++-------------------- 1 file changed, 34 insertions(+), 36 deletions(-) diff --git a/collector/logical_disk.go b/collector/logical_disk.go index 5f77baa4..2a5c9628 100644 --- a/collector/logical_disk.go +++ b/collector/logical_disk.go @@ -6,7 +6,6 @@ import ( "fmt" "regexp" - "github.com/StackExchange/wmi" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/common/log" "gopkg.in/alecthomas/kingpin.v2" @@ -27,7 +26,7 @@ var ( ).Default("").String() ) -// A LogicalDiskCollector is a Prometheus collector for WMI Win32_PerfRawData_PerfDisk_LogicalDisk metrics +// A LogicalDiskCollector is a Prometheus collector for perflib logicalDisk metrics type LogicalDiskCollector struct { RequestsQueued *prometheus.Desc ReadBytesTotal *prometheus.Desc @@ -159,7 +158,7 @@ func NewLogicalDiskCollector() (Collector, error) { // Collect sends the metric values for each metric // to the provided prometheus Metric channel. func (c *LogicalDiskCollector) Collect(ctx *ScrapeContext, ch chan<- prometheus.Metric) error { - if desc, err := c.collect(ch); err != nil { + if desc, err := c.collect(ctx, ch); err != nil { log.Error("failed collecting logical_disk metrics:", desc, err) return err } @@ -169,28 +168,27 @@ func (c *LogicalDiskCollector) Collect(ctx *ScrapeContext, ch chan<- prometheus. // Win32_PerfRawData_PerfDisk_LogicalDisk docs: // - https://msdn.microsoft.com/en-us/windows/hardware/aa394307(v=vs.71) - Win32_PerfRawData_PerfDisk_LogicalDisk class // - https://msdn.microsoft.com/en-us/library/ms803973.aspx - LogicalDisk object reference -type Win32_PerfRawData_PerfDisk_LogicalDisk struct { +type logicalDisk struct { Name string - CurrentDiskQueueLength uint32 - DiskReadBytesPerSec uint64 - DiskReadsPerSec uint32 - DiskWriteBytesPerSec uint64 - DiskWritesPerSec uint32 - PercentDiskReadTime uint64 - PercentDiskWriteTime uint64 - PercentFreeSpace uint32 - PercentFreeSpace_Base uint32 - PercentIdleTime uint64 - SplitIOPerSec uint32 - AvgDiskSecPerRead uint64 - AvgDiskSecPerWrite uint64 - AvgDiskSecPerTransfer uint64 + CurrentDiskQueueLength float64 `perflib:"Current Disk Queue Length"` + DiskReadBytesPerSec float64 `perflib:"Disk Read Bytes/sec"` + DiskReadsPerSec float64 `perflib:"Disk Reads/sec"` + DiskWriteBytesPerSec float64 `perflib:"Disk Write Bytes/sec"` + DiskWritesPerSec float64 `perflib:"Disk Writes/sec"` + PercentDiskReadTime float64 `perflib:"% Disk Read Time"` + PercentDiskWriteTime float64 `perflib:"% Disk Write Time"` + PercentFreeSpace float64 `perflib:"% Free Space_Base"` + PercentFreeSpace_Base float64 `perflib:"Free Megabytes"` + PercentIdleTime float64 `perflib:"% Idle Time"` + SplitIOPerSec float64 `perflib:"Split IO/Sec"` + AvgDiskSecPerRead float64 `perflib:"Avg. Disk sec/Read"` + AvgDiskSecPerWrite float64 `perflib:"Avg. Disk sec/Write"` + AvgDiskSecPerTransfer float64 `perflib:"Avg. Disk sec/Transfer"` } -func (c *LogicalDiskCollector) collect(ch chan<- prometheus.Metric) (*prometheus.Desc, error) { - var dst []Win32_PerfRawData_PerfDisk_LogicalDisk - q := queryAll(&dst) - if err := wmi.Query(q, &dst); err != nil { +func (c *LogicalDiskCollector) collect(ctx *ScrapeContext, ch chan<- prometheus.Metric) (*prometheus.Desc, error) { + var dst []logicalDisk + if err := unmarshalObject(ctx.perfObjects["LogicalDisk"], &dst); err != nil { return nil, err } @@ -204,98 +202,98 @@ func (c *LogicalDiskCollector) collect(ch chan<- prometheus.Metric) (*prometheus ch <- prometheus.MustNewConstMetric( c.RequestsQueued, prometheus.GaugeValue, - float64(volume.CurrentDiskQueueLength), + volume.CurrentDiskQueueLength, volume.Name, ) ch <- prometheus.MustNewConstMetric( c.ReadBytesTotal, prometheus.CounterValue, - float64(volume.DiskReadBytesPerSec), + volume.DiskReadBytesPerSec, volume.Name, ) ch <- prometheus.MustNewConstMetric( c.ReadsTotal, prometheus.CounterValue, - float64(volume.DiskReadsPerSec), + volume.DiskReadsPerSec, volume.Name, ) ch <- prometheus.MustNewConstMetric( c.WriteBytesTotal, prometheus.CounterValue, - float64(volume.DiskWriteBytesPerSec), + volume.DiskWriteBytesPerSec, volume.Name, ) ch <- prometheus.MustNewConstMetric( c.WritesTotal, prometheus.CounterValue, - float64(volume.DiskWritesPerSec), + volume.DiskWritesPerSec, volume.Name, ) ch <- prometheus.MustNewConstMetric( c.ReadTime, prometheus.CounterValue, - float64(volume.PercentDiskReadTime)*ticksToSecondsScaleFactor, + volume.PercentDiskReadTime, volume.Name, ) ch <- prometheus.MustNewConstMetric( c.WriteTime, prometheus.CounterValue, - float64(volume.PercentDiskWriteTime)*ticksToSecondsScaleFactor, + volume.PercentDiskWriteTime, volume.Name, ) ch <- prometheus.MustNewConstMetric( c.FreeSpace, prometheus.GaugeValue, - float64(volume.PercentFreeSpace)*1024*1024, + volume.PercentFreeSpace_Base*1024*1024, volume.Name, ) ch <- prometheus.MustNewConstMetric( c.TotalSpace, prometheus.GaugeValue, - float64(volume.PercentFreeSpace_Base)*1024*1024, + volume.PercentFreeSpace*1024*1024, volume.Name, ) ch <- prometheus.MustNewConstMetric( c.IdleTime, prometheus.CounterValue, - float64(volume.PercentIdleTime)*ticksToSecondsScaleFactor, + volume.PercentIdleTime, volume.Name, ) ch <- prometheus.MustNewConstMetric( c.SplitIOs, prometheus.CounterValue, - float64(volume.SplitIOPerSec), + volume.SplitIOPerSec, volume.Name, ) ch <- prometheus.MustNewConstMetric( c.ReadLatency, prometheus.CounterValue, - float64(volume.AvgDiskSecPerRead), + volume.AvgDiskSecPerRead, volume.Name, ) ch <- prometheus.MustNewConstMetric( c.WriteLatency, prometheus.CounterValue, - float64(volume.AvgDiskSecPerWrite), + volume.AvgDiskSecPerWrite, volume.Name, ) ch <- prometheus.MustNewConstMetric( c.ReadWriteLatency, prometheus.CounterValue, - float64(volume.AvgDiskSecPerTransfer), + volume.AvgDiskSecPerTransfer, volume.Name, ) } From 2cd630fb2f0a2768e68d0afa081ae1c0912bfb3a Mon Sep 17 00:00:00 2001 From: Ben Reedy Date: Sun, 22 Sep 2019 16:38:40 +1000 Subject: [PATCH 2/3] Use ticks to seconds scale for latency metrics Latency metrics were previously exposing as ticks --- collector/logical_disk.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/collector/logical_disk.go b/collector/logical_disk.go index 2a5c9628..a1378462 100644 --- a/collector/logical_disk.go +++ b/collector/logical_disk.go @@ -279,21 +279,21 @@ func (c *LogicalDiskCollector) collect(ctx *ScrapeContext, ch chan<- prometheus. ch <- prometheus.MustNewConstMetric( c.ReadLatency, prometheus.CounterValue, - volume.AvgDiskSecPerRead, + volume.AvgDiskSecPerRead*ticksToSecondsScaleFactor, volume.Name, ) ch <- prometheus.MustNewConstMetric( c.WriteLatency, prometheus.CounterValue, - volume.AvgDiskSecPerWrite, + volume.AvgDiskSecPerWrite*ticksToSecondsScaleFactor, volume.Name, ) ch <- prometheus.MustNewConstMetric( c.ReadWriteLatency, prometheus.CounterValue, - volume.AvgDiskSecPerTransfer, + volume.AvgDiskSecPerTransfer*ticksToSecondsScaleFactor, volume.Name, ) } From d0877d0dc0e79aa2a1d08df2e282806154e1a4fd Mon Sep 17 00:00:00 2001 From: Ben Reedy Date: Mon, 23 Sep 2019 18:55:01 +1000 Subject: [PATCH 3/3] Update logical_disk docs to Perflib counter --- docs/collector.logical_disk.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/collector.logical_disk.md b/docs/collector.logical_disk.md index 28da0606..1b61d3d3 100644 --- a/docs/collector.logical_disk.md +++ b/docs/collector.logical_disk.md @@ -5,7 +5,8 @@ The logical_disk collector exposes metrics about logical disks (in contrast to p ||| -|- Metric name prefix | `logical_disk` -Classes | [`Win32_PerfRawData_PerfDisk_LogicalDisk`](https://msdn.microsoft.com/en-us/windows/hardware/aa394307(v=vs.71)) +Data source | Perflib +Counters | `LogicalDisk` ([`Win32_PerfRawData_PerfDisk_LogicalDisk`](https://msdn.microsoft.com/en-us/windows/hardware/aa394307(v=vs.71))) Enabled by default? | Yes ## Flags