Compare commits

..

20 Commits

Author SHA1 Message Date
Calle Pettersson
cb9da1ae22 Merge pull request #256 from martinlindhe/mssql-clean-instance-names
Strip special chars from instance names
2018-08-31 18:16:43 +02:00
Calle Pettersson
7de316af9f Strip special chars from instance names 2018-08-31 17:21:32 +02:00
Calle Pettersson
263ab8c444 Merge pull request #253 from kafecho/wildcard_query_escape
Clarified that the % character has to be escaped
2018-08-28 12:19:36 +02:00
Guillaume Belrose
57449c4768 Clarified that the % character has to be escaped when using the wmi_exporter from the command prompt or batch files. 2018-08-28 08:58:08 +02:00
Calle Pettersson
fe7e5cb4d8 Merge pull request #241 from szook/protect-against-empty-result-set
protect against empty wmi query result sets
2018-08-08 09:14:27 +02:00
Steve Zook
c156f2bcbe protect against emtpy wmi query result sets
If an WMI query were to return an empty result set, trying to access the
first element in the result set would result in a `panic: runtime error:
index out of range` error.

add logic to explicitly check if the result set size is 0 and return an
error rather.

Fixes https://github.com/martinlindhe/wmi_exporter/issues/240
2018-08-07 15:47:39 -04:00
Calle Pettersson
832771b4a2 Merge pull request #238 from bbigras/patch-1
fix typo in exporter.go
2018-08-06 11:41:43 +02:00
Bruno Bigras
16fecfbc67 fix typo in exporter.go 2018-08-05 21:39:43 -04:00
Calle Pettersson
bad1e7f7b0 Merge pull request #237 from szook/fix-mssql-for-non-default-instances
fix mssql for non-default sql instances
2018-08-04 08:33:23 +02:00
Steve Zook
c868c00e89 fix mssql for non-default sql instances
the only sql servers I have access to are using the default
`MSSQLSERVER` instance names.  I was contacted by someone using a
different instance name and it was failing.

Found 2 bugs in the code:

1) I was returning the default `MSSQLSERVER` as an instance even if it wasn't found in the registry

2) learned that the WMI class naming scheme for non-default instances
was not what I had coded. Changed to incorproate new knowledge.
2018-08-03 16:31:19 -04:00
Calle Pettersson
5035e97369 Merge pull request #236 from szook/add-mssql-accessmethod-class
add mssql accessmethod class
2018-08-03 22:16:08 +02:00
Steve Zook
144715e3d2 remove persec from variable names
removed persec from variable names

but when I did that, there was some variable name collisions, so I went
through and name-spaced the class variables.
1
2018-08-03 15:39:26 -04:00
Steve Zook
a20cf1274a add mssql accessmethod class
in the process of trying to build a grafana dashboard with "useful"
mssql metrics, I was looking around for what metrics might be useful and
came across an article of [15 SQL Server Performace Counters to Monitor](https://blogs.sentryone.com/allenwhite/sql-server-performance-counters-to-monitor/)

two of the suggested metrics are provided by the AccessMethod
class, which I was not yet capturing.

So I added metrics for the
Win32_PerfRawData_MSSQLSERVER_SQLServerAccessMethods class.
2018-08-03 13:45:51 -04:00
Calle Pettersson
626a25cd00 Merge pull request #235 from szook/reorder-functions
reorder functions
2018-08-03 16:42:32 +02:00
Calle Pettersson
96dd456bb1 Merge pull request #234 from szook/fix-mssql-metric-name-typo
fix mssql metric name type
2018-08-03 16:27:40 +02:00
Steve Zook
af1b8bf4d0 fix mssql metric name type
found that I had one metric with an extra `s` in `_genstatss_`, making it
inconsistent with it's siblings.
2018-08-03 09:52:15 -04:00
Steve Zook
d83615a818 reorder functions
so that the two functions that list available child collectors are next
to each other - should make less likely to not miss editing one of those
when adding additional wmi classes

also removed the 'filter' from the `mssqlFilterAvailableClassCollectors`
function as it's not filtering anyting.
2018-08-03 09:48:32 -04:00
szook
fe4c61a70e Add mssql collector (#230)
add mssql collector
2018-08-02 08:42:02 +02:00
Calle Pettersson
143705bbf6 Merge pull request #227 from szook/add-worker-process-name-to-w3wp-processes
append IIS worker process name to corresponding w3wp processes
2018-07-23 16:20:07 +02:00
Steve Zook
e8ffb736d0 add worker process name to w3wp processes
modify the `process` collector so that the IIS worker process name is
appended to the corresponding `w3wp` process.

before:
```
wmi_process_private_bytes{creating_process_id="2068",process="w3wp",process_id="12308"} 7.18204928e+08
```

after:
```
wmi_process_private_bytes{creating_process_id="2068",process="w3wp_our.website.com",process_id="12308"} 7.18204928e+08
```

reason:
We have some IIS servers hosting many .NET applications. When there is
resource contention on one of those servers, it's nice to know which IIS
application pool is the culprit.  Having only the process_id to
differentiate between w3wp processes requires additional work to figure
out which is which.  Also it does not allow for historial trending as
the process_id can change across restarts.
2018-07-23 07:53:50 -04:00
12 changed files with 3827 additions and 214 deletions

View File

@@ -9,15 +9,16 @@ Prometheus exporter for Windows machines, using the WMI (Windows Management Inst
Name | Description | Enabled by default
---------|-------------|--------------------
ad | [Win32_PerfRawData_DirectoryServices_DirectoryServices](https://msdn.microsoft.com/en-us/library/ms803980.aspx) Active Directory |
ad | [Win32_PerfRawData_DirectoryServices_DirectoryServices](https://msdn.microsoft.com/en-us/library/ms803980.aspx) Active Directory |
cpu | [Win32_PerfRawData_PerfOS_Processor](https://msdn.microsoft.com/en-us/library/aa394317(v=vs.90).aspx) metrics (cpu usage) | ✓
cs | [Win32_ComputerSystem](https://msdn.microsoft.com/en-us/library/aa394102) metrics (system properties, num cpus/total memory) | ✓
dns | [Win32_PerfRawData_DNS_DNS](https://technet.microsoft.com/en-us/library/cc977686.aspx) metrics (DNS Server) |
hyperv | Performance counters for Hyper-V hosts |
hyperv | Performance counters for Hyper-V hosts |
iis | [Win32_PerfRawData_W3SVC_WebService](https://msdn.microsoft.com/en-us/library/aa394345) IIS metrics |
logical_disk | [Win32_PerfRawData_PerfDisk_LogicalDisk](https://msdn.microsoft.com/en-us/windows/hardware/aa394307(v=vs.71)) metrics (disk I/O) | ✓
net | [Win32_PerfRawData_Tcpip_NetworkInterface](https://technet.microsoft.com/en-us/security/aa394340(v=vs.80)) metrics (network interface I/O) | ✓
msmq | [Win32_PerfRawData_MSMQ_MSMQQueue](http://wutils.com/wmi/root/cimv2/win32_perfrawdata_msmq_msmqqueue/) metrics (MSMQ/journal count) |
msmq | [Win32_PerfRawData_MSMQ_MSMQQueue](http://wutils.com/wmi/root/cimv2/win32_perfrawdata_msmq_msmqqueue/) metrics (MSMQ/journal count) |
mssql | various [SQL Server Performance Objects](https://docs.microsoft.com/en-us/sql/relational-databases/performance-monitor/use-sql-server-objects#SQLServerPOs) metrics |
os | [Win32_OperatingSystem](https://msdn.microsoft.com/en-us/library/aa394239) metrics (memory, processes, users) | ✓
process | [Win32_PerfRawData_PerfProc_Process](https://msdn.microsoft.com/en-us/library/aa394323(v=vs.85).aspx) metrics (per-process stats) |
service | [Win32_Service](https://msdn.microsoft.com/en-us/library/aa394418(v=vs.85).aspx) metrics (service states) | ✓
@@ -75,7 +76,10 @@ The prometheus metrics will be exposed on [localhost:9182](http://localhost:9182
.\wmi_exporter.exe --collectors.enabled "process" --collector.process.processes-where "Name LIKE 'firefox%'"
When there are multiple processes with the same name, WMI represents those after the first instance as `process-name#index`. So to get them all, rather than just the first one, the query needs to be a wildcard search.
When there are multiple processes with the same name, WMI represents those after the first instance as `process-name#index`. So to get them all, rather than just the first one, the query needs to be a wildcard search using a `%` character.
Please note that in Windows batch scripts (and when using the `cmd` command prompt), the `%` character is reserved, so it has to be escaped with another `%`. For example, the wildcard syntax for searching for all firefox processes is `firefox%%`.
## License

View File

@@ -3,6 +3,8 @@
package collector
import (
"errors"
"github.com/StackExchange/wmi"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/common/log"
@@ -616,6 +618,9 @@ func (c *ADCollector) collect(ch chan<- prometheus.Metric) (*prometheus.Desc, er
if err := wmi.Query(q, &dst); err != nil {
return nil, err
}
if len(dst) == 0 {
return nil, errors.New("WMI query returned empty result set")
}
ch <- prometheus.MustNewConstMetric(
c.AddressBookOperationsTotal,

View File

@@ -4,6 +4,8 @@
package collector
import (
"errors"
"github.com/StackExchange/wmi"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/common/log"
@@ -60,6 +62,9 @@ func (c *CSCollector) collect(ch chan<- prometheus.Metric) (*prometheus.Desc, er
if err := wmi.Query(q, &dst); err != nil {
return nil, err
}
if len(dst) == 0 {
return nil, errors.New("WMI query returned empty result set")
}
ch <- prometheus.MustNewConstMetric(
c.LogicalProcessors,

View File

@@ -4,6 +4,8 @@
package collector
import (
"errors"
"github.com/StackExchange/wmi"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/common/log"
@@ -237,6 +239,9 @@ func (c *DNSCollector) collect(ch chan<- prometheus.Metric) (*prometheus.Desc, e
if err := wmi.Query(q, &dst); err != nil {
return nil, err
}
if len(dst) == 0 {
return nil, errors.New("WMI query returned empty result set")
}
ch <- prometheus.MustNewConstMetric(
c.ZoneTransferRequestsReceived,

View File

@@ -7,6 +7,7 @@
package collector
import (
"errors"
"fmt"
"regexp"
@@ -1738,216 +1739,218 @@ func (c *IISCollector) collect(ch chan<- prometheus.Metric) (*prometheus.Desc, e
return nil, err
}
if len(dst_cache) > 0 {
ch <- prometheus.MustNewConstMetric(
c.ServiceCache_ActiveFlushedEntries,
prometheus.GaugeValue,
float64(dst_cache[0].ActiveFlushedEntries),
)
ch <- prometheus.MustNewConstMetric(
c.ServiceCache_FileCacheMemoryUsage,
prometheus.GaugeValue,
float64(dst_cache[0].CurrentFileCacheMemoryUsage),
)
ch <- prometheus.MustNewConstMetric(
c.ServiceCache_MaximumFileCacheMemoryUsage,
prometheus.CounterValue,
float64(dst_cache[0].MaximumFileCacheMemoryUsage),
)
ch <- prometheus.MustNewConstMetric(
c.ServiceCache_FileCacheFlushesTotal,
prometheus.CounterValue,
float64(dst_cache[0].TotalFlushedFiles),
)
ch <- prometheus.MustNewConstMetric(
c.ServiceCache_FileCacheQueriesTotal,
prometheus.CounterValue,
float64(dst_cache[0].FileCacheHits+dst_cache[0].FileCacheMisses),
)
ch <- prometheus.MustNewConstMetric(
c.ServiceCache_FileCacheHitsTotal,
prometheus.CounterValue,
float64(dst_cache[0].FileCacheHits),
)
ch <- prometheus.MustNewConstMetric(
c.ServiceCache_FilesCached,
prometheus.GaugeValue,
float64(dst_cache[0].CurrentFilesCached),
)
ch <- prometheus.MustNewConstMetric(
c.ServiceCache_FilesCachedTotal,
prometheus.CounterValue,
float64(dst_cache[0].TotalFilesCached),
)
ch <- prometheus.MustNewConstMetric(
c.ServiceCache_FilesFlushedTotal,
prometheus.CounterValue,
float64(dst_cache[0].TotalFlushedFiles),
)
ch <- prometheus.MustNewConstMetric(
c.ServiceCache_URICacheFlushesTotal,
prometheus.CounterValue,
float64(dst_cache[0].TotalFlushedURIs),
"user",
)
ch <- prometheus.MustNewConstMetric(
c.ServiceCache_URICacheFlushesTotal,
prometheus.CounterValue,
float64(dst_cache[0].KernelTotalFlushedURIs),
"kernel",
)
ch <- prometheus.MustNewConstMetric(
c.ServiceCache_URICacheQueriesTotal,
prometheus.CounterValue,
float64(dst_cache[0].URICacheHits+dst_cache[0].URICacheMisses),
"user",
)
ch <- prometheus.MustNewConstMetric(
c.ServiceCache_URICacheQueriesTotal,
prometheus.CounterValue,
float64(dst_cache[0].KernelURICacheHits+dst_cache[0].KernelURICacheMisses),
"kernel",
)
ch <- prometheus.MustNewConstMetric(
c.ServiceCache_URICacheHitsTotal,
prometheus.CounterValue,
float64(dst_cache[0].URICacheHits),
"user",
)
ch <- prometheus.MustNewConstMetric(
c.ServiceCache_URICacheHitsTotal,
prometheus.CounterValue,
float64(dst_cache[0].KernelURICacheHits),
"kernel",
)
ch <- prometheus.MustNewConstMetric(
c.ServiceCache_URIsCached,
prometheus.GaugeValue,
float64(dst_cache[0].CurrentURIsCached),
"user",
)
ch <- prometheus.MustNewConstMetric(
c.ServiceCache_URIsCached,
prometheus.GaugeValue,
float64(dst_cache[0].KernelCurrentURIsCached),
"kernel",
)
ch <- prometheus.MustNewConstMetric(
c.ServiceCache_URIsCachedTotal,
prometheus.CounterValue,
float64(dst_cache[0].TotalURIsCached),
"user",
)
ch <- prometheus.MustNewConstMetric(
c.ServiceCache_URIsCachedTotal,
prometheus.CounterValue,
float64(dst_cache[0].KernelTotalURIsCached),
"kernel",
)
ch <- prometheus.MustNewConstMetric(
c.ServiceCache_URIsFlushedTotal,
prometheus.CounterValue,
float64(dst_cache[0].TotalFlushedURIs),
"user",
)
ch <- prometheus.MustNewConstMetric(
c.ServiceCache_URIsFlushedTotal,
prometheus.CounterValue,
float64(dst_cache[0].KernelTotalFlushedURIs),
"kernel",
)
ch <- prometheus.MustNewConstMetric(
c.ServiceCache_MetadataCached,
prometheus.GaugeValue,
float64(dst_cache[0].CurrentMetadataCached),
)
ch <- prometheus.MustNewConstMetric(
c.ServiceCache_MetadataCacheFlushes,
prometheus.CounterValue,
float64(dst_cache[0].TotalFlushedMetadata),
)
ch <- prometheus.MustNewConstMetric(
c.ServiceCache_MetadataCacheQueriesTotal,
prometheus.CounterValue,
float64(dst_cache[0].MetadataCacheHits+dst_cache[0].MetadataCacheMisses),
)
ch <- prometheus.MustNewConstMetric(
c.ServiceCache_MetadataCacheHitsTotal,
prometheus.CounterValue,
float64(dst_cache[0].MetadataCacheHits),
)
ch <- prometheus.MustNewConstMetric(
c.ServiceCache_MetadataCachedTotal,
prometheus.CounterValue,
float64(dst_cache[0].TotalMetadataCached),
)
ch <- prometheus.MustNewConstMetric(
c.ServiceCache_MetadataFlushedTotal,
prometheus.CounterValue,
float64(dst_cache[0].TotalFlushedMetadata),
)
ch <- prometheus.MustNewConstMetric(
c.ServiceCache_OutputCacheActiveFlushedItems,
prometheus.CounterValue,
float64(dst_cache[0].OutputCacheCurrentFlushedItems),
)
ch <- prometheus.MustNewConstMetric(
c.ServiceCache_OutputCacheItems,
prometheus.CounterValue,
float64(dst_cache[0].OutputCacheCurrentItems),
)
ch <- prometheus.MustNewConstMetric(
c.ServiceCache_OutputCacheMemoryUsage,
prometheus.CounterValue,
float64(dst_cache[0].OutputCacheCurrentMemoryUsage),
)
ch <- prometheus.MustNewConstMetric(
c.ServiceCache_OutputCacheQueriesTotal,
prometheus.CounterValue,
float64(dst_cache[0].OutputCacheTotalHits+dst_cache[0].OutputCacheTotalMisses),
)
ch <- prometheus.MustNewConstMetric(
c.ServiceCache_OutputCacheHitsTotal,
prometheus.CounterValue,
float64(dst_cache[0].OutputCacheTotalHits),
)
ch <- prometheus.MustNewConstMetric(
c.ServiceCache_OutputCacheFlushedItemsTotal,
prometheus.CounterValue,
float64(dst_cache[0].OutputCacheTotalFlushedItems),
)
ch <- prometheus.MustNewConstMetric(
c.ServiceCache_OutputCacheFlushesTotal,
prometheus.CounterValue,
float64(dst_cache[0].OutputCacheTotalFlushes),
)
if len(dst_cache) == 0 {
return nil, errors.New("WMI query returned empty result set")
}
ch <- prometheus.MustNewConstMetric(
c.ServiceCache_ActiveFlushedEntries,
prometheus.GaugeValue,
float64(dst_cache[0].ActiveFlushedEntries),
)
ch <- prometheus.MustNewConstMetric(
c.ServiceCache_FileCacheMemoryUsage,
prometheus.GaugeValue,
float64(dst_cache[0].CurrentFileCacheMemoryUsage),
)
ch <- prometheus.MustNewConstMetric(
c.ServiceCache_MaximumFileCacheMemoryUsage,
prometheus.CounterValue,
float64(dst_cache[0].MaximumFileCacheMemoryUsage),
)
ch <- prometheus.MustNewConstMetric(
c.ServiceCache_FileCacheFlushesTotal,
prometheus.CounterValue,
float64(dst_cache[0].TotalFlushedFiles),
)
ch <- prometheus.MustNewConstMetric(
c.ServiceCache_FileCacheQueriesTotal,
prometheus.CounterValue,
float64(dst_cache[0].FileCacheHits+dst_cache[0].FileCacheMisses),
)
ch <- prometheus.MustNewConstMetric(
c.ServiceCache_FileCacheHitsTotal,
prometheus.CounterValue,
float64(dst_cache[0].FileCacheHits),
)
ch <- prometheus.MustNewConstMetric(
c.ServiceCache_FilesCached,
prometheus.GaugeValue,
float64(dst_cache[0].CurrentFilesCached),
)
ch <- prometheus.MustNewConstMetric(
c.ServiceCache_FilesCachedTotal,
prometheus.CounterValue,
float64(dst_cache[0].TotalFilesCached),
)
ch <- prometheus.MustNewConstMetric(
c.ServiceCache_FilesFlushedTotal,
prometheus.CounterValue,
float64(dst_cache[0].TotalFlushedFiles),
)
ch <- prometheus.MustNewConstMetric(
c.ServiceCache_URICacheFlushesTotal,
prometheus.CounterValue,
float64(dst_cache[0].TotalFlushedURIs),
"user",
)
ch <- prometheus.MustNewConstMetric(
c.ServiceCache_URICacheFlushesTotal,
prometheus.CounterValue,
float64(dst_cache[0].KernelTotalFlushedURIs),
"kernel",
)
ch <- prometheus.MustNewConstMetric(
c.ServiceCache_URICacheQueriesTotal,
prometheus.CounterValue,
float64(dst_cache[0].URICacheHits+dst_cache[0].URICacheMisses),
"user",
)
ch <- prometheus.MustNewConstMetric(
c.ServiceCache_URICacheQueriesTotal,
prometheus.CounterValue,
float64(dst_cache[0].KernelURICacheHits+dst_cache[0].KernelURICacheMisses),
"kernel",
)
ch <- prometheus.MustNewConstMetric(
c.ServiceCache_URICacheHitsTotal,
prometheus.CounterValue,
float64(dst_cache[0].URICacheHits),
"user",
)
ch <- prometheus.MustNewConstMetric(
c.ServiceCache_URICacheHitsTotal,
prometheus.CounterValue,
float64(dst_cache[0].KernelURICacheHits),
"kernel",
)
ch <- prometheus.MustNewConstMetric(
c.ServiceCache_URIsCached,
prometheus.GaugeValue,
float64(dst_cache[0].CurrentURIsCached),
"user",
)
ch <- prometheus.MustNewConstMetric(
c.ServiceCache_URIsCached,
prometheus.GaugeValue,
float64(dst_cache[0].KernelCurrentURIsCached),
"kernel",
)
ch <- prometheus.MustNewConstMetric(
c.ServiceCache_URIsCachedTotal,
prometheus.CounterValue,
float64(dst_cache[0].TotalURIsCached),
"user",
)
ch <- prometheus.MustNewConstMetric(
c.ServiceCache_URIsCachedTotal,
prometheus.CounterValue,
float64(dst_cache[0].KernelTotalURIsCached),
"kernel",
)
ch <- prometheus.MustNewConstMetric(
c.ServiceCache_URIsFlushedTotal,
prometheus.CounterValue,
float64(dst_cache[0].TotalFlushedURIs),
"user",
)
ch <- prometheus.MustNewConstMetric(
c.ServiceCache_URIsFlushedTotal,
prometheus.CounterValue,
float64(dst_cache[0].KernelTotalFlushedURIs),
"kernel",
)
ch <- prometheus.MustNewConstMetric(
c.ServiceCache_MetadataCached,
prometheus.GaugeValue,
float64(dst_cache[0].CurrentMetadataCached),
)
ch <- prometheus.MustNewConstMetric(
c.ServiceCache_MetadataCacheFlushes,
prometheus.CounterValue,
float64(dst_cache[0].TotalFlushedMetadata),
)
ch <- prometheus.MustNewConstMetric(
c.ServiceCache_MetadataCacheQueriesTotal,
prometheus.CounterValue,
float64(dst_cache[0].MetadataCacheHits+dst_cache[0].MetadataCacheMisses),
)
ch <- prometheus.MustNewConstMetric(
c.ServiceCache_MetadataCacheHitsTotal,
prometheus.CounterValue,
float64(dst_cache[0].MetadataCacheHits),
)
ch <- prometheus.MustNewConstMetric(
c.ServiceCache_MetadataCachedTotal,
prometheus.CounterValue,
float64(dst_cache[0].TotalMetadataCached),
)
ch <- prometheus.MustNewConstMetric(
c.ServiceCache_MetadataFlushedTotal,
prometheus.CounterValue,
float64(dst_cache[0].TotalFlushedMetadata),
)
ch <- prometheus.MustNewConstMetric(
c.ServiceCache_OutputCacheActiveFlushedItems,
prometheus.CounterValue,
float64(dst_cache[0].OutputCacheCurrentFlushedItems),
)
ch <- prometheus.MustNewConstMetric(
c.ServiceCache_OutputCacheItems,
prometheus.CounterValue,
float64(dst_cache[0].OutputCacheCurrentItems),
)
ch <- prometheus.MustNewConstMetric(
c.ServiceCache_OutputCacheMemoryUsage,
prometheus.CounterValue,
float64(dst_cache[0].OutputCacheCurrentMemoryUsage),
)
ch <- prometheus.MustNewConstMetric(
c.ServiceCache_OutputCacheQueriesTotal,
prometheus.CounterValue,
float64(dst_cache[0].OutputCacheTotalHits+dst_cache[0].OutputCacheTotalMisses),
)
ch <- prometheus.MustNewConstMetric(
c.ServiceCache_OutputCacheHitsTotal,
prometheus.CounterValue,
float64(dst_cache[0].OutputCacheTotalHits),
)
ch <- prometheus.MustNewConstMetric(
c.ServiceCache_OutputCacheFlushedItemsTotal,
prometheus.CounterValue,
float64(dst_cache[0].OutputCacheTotalFlushedItems),
)
ch <- prometheus.MustNewConstMetric(
c.ServiceCache_OutputCacheFlushesTotal,
prometheus.CounterValue,
float64(dst_cache[0].OutputCacheTotalFlushes),
)
return nil, nil
}

3554
collector/mssql.go Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -4,6 +4,7 @@
package collector
import (
"errors"
"time"
"github.com/StackExchange/wmi"
@@ -142,6 +143,10 @@ func (c *OSCollector) collect(ch chan<- prometheus.Metric) (*prometheus.Desc, er
return nil, err
}
if len(dst) == 0 {
return nil, errors.New("WMI query returned empty result set")
}
ch <- prometheus.MustNewConstMetric(
c.PhysicalMemoryFreeBytes,
prometheus.GaugeValue,

View File

@@ -177,6 +177,11 @@ type Win32_PerfRawData_PerfProc_Process struct {
WorkingSetPrivate uint64
}
type WorkerProcess struct {
AppPoolName string
ProcessId uint32
}
func (c *ProcessCollector) collect(ch chan<- prometheus.Metric) (*prometheus.Desc, error) {
var dst []Win32_PerfRawData_PerfProc_Process
q := queryAllWhere(&dst, c.queryWhereClause)
@@ -184,6 +189,10 @@ func (c *ProcessCollector) collect(ch chan<- prometheus.Metric) (*prometheus.Des
return nil, err
}
var dst_wp []WorkerProcess
q_wp := queryAll(&dst_wp)
wmi.QueryNamespace(q_wp, &dst_wp, "root\\WebAdministration")
for _, process := range dst {
if process.Name == "_Total" {
@@ -194,6 +203,13 @@ func (c *ProcessCollector) collect(ch chan<- prometheus.Metric) (*prometheus.Des
pid := strconv.FormatUint(uint64(process.IDProcess), 10)
cpid := strconv.FormatUint(uint64(process.CreatingProcessID), 10)
for _, wp := range dst_wp {
if wp.ProcessId == process.IDProcess {
processName = strings.Join([]string{processName, wp.AppPoolName}, "_")
break
}
}
ch <- prometheus.MustNewConstMetric(
c.StartTime,
prometheus.GaugeValue,

View File

@@ -4,6 +4,7 @@
package collector
import (
"errors"
"github.com/StackExchange/wmi"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/common/log"
@@ -94,6 +95,9 @@ func (c *SystemCollector) collect(ch chan<- prometheus.Metric) (*prometheus.Desc
if err := wmi.Query(q, &dst); err != nil {
return nil, err
}
if len(dst) == 0 {
return nil, errors.New("WMI query returned empty result set")
}
ch <- prometheus.MustNewConstMetric(
c.ContextSwitchesTotal,

View File

@@ -5,6 +5,7 @@
package collector
import (
"errors"
"github.com/StackExchange/wmi"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/common/log"
@@ -118,6 +119,9 @@ func (c *TCPCollector) collect(ch chan<- prometheus.Metric) (*prometheus.Desc, e
if err := wmi.Query(q, &dst); err != nil {
return nil, err
}
if len(dst) == 0 {
return nil, errors.New("WMI query returned empty result set")
}
// Counters
ch <- prometheus.MustNewConstMetric(

View File

@@ -2,6 +2,8 @@
package collector
import (
"errors"
"github.com/StackExchange/wmi"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/common/log"
@@ -201,6 +203,9 @@ func (c *VmwareCollector) collectMem(ch chan<- prometheus.Metric) (*prometheus.D
if err := wmi.Query(q, &dst); err != nil {
return nil, err
}
if len(dst) == 0 {
return nil, errors.New("WMI query returned empty result set")
}
ch <- prometheus.MustNewConstMetric(
c.MemActive,
@@ -287,6 +292,9 @@ func (c *VmwareCollector) collectCpu(ch chan<- prometheus.Metric) (*prometheus.D
if err := wmi.Query(q, &dst); err != nil {
return nil, err
}
if len(dst) == 0 {
return nil, errors.New("WMI query returned empty result set")
}
ch <- prometheus.MustNewConstMetric(
c.CpuLimitMHz,

View File

@@ -185,7 +185,7 @@ func main() {
).Default("/metrics").String()
enabledCollectors = kingpin.Flag(
"collectors.enabled",
"Comma-separated list of collectors to use. Use '[default]' as a placeholder for all the collectors enabled by default.").
"Comma-separated list of collectors to use. Use '[defaults]' as a placeholder for all the collectors enabled by default.").
Default(filterAvailableCollectors(defaultCollectors)).String()
printCollectors = kingpin.Flag(
"collectors.print",