Compare commits

..

3 Commits

Author SHA1 Message Date
Martin Lindhe
47dc455dc2 Merge pull request #56 from martinlindhe/service-collector
Add Win32_Service collector
2017-03-03 17:01:13 +01:00
Calle Pettersson
9ea0c95ca5 Add support for generating collectors from remote systems 2017-03-03 14:55:11 +01:00
Calle Pettersson
91374a75f2 Add Win32_Service collector 2017-03-03 14:51:24 +01:00
4 changed files with 100 additions and 3 deletions

View File

@@ -16,6 +16,7 @@ iis | [Win32_PerfRawData_W3SVC_WebService](https://msdn.microsoft.com/en-us/libr
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) | ✓
os | [Win32_OperatingSystem](https://msdn.microsoft.com/en-us/library/aa394239) metrics (memory, processes, users) | ✓
service | [Win32_Service](https://msdn.microsoft.com/en-us/library/aa394418(v=vs.85).aspx) metrics (service states) | ✓
system | Win32_PerfRawData_PerfOS_System metrics (system calls) | ✓
The HELP texts shows the WMI data source, please see MSDN documentation for details.

83
collector/service.go Normal file
View File

@@ -0,0 +1,83 @@
// returns data points from Win32_Service
// https://msdn.microsoft.com/en-us/library/aa394418(v=vs.85).aspx - Win32_Service class
package collector
import (
"log"
"strings"
"github.com/StackExchange/wmi"
"github.com/prometheus/client_golang/prometheus"
)
func init() {
Factories["service"] = NewserviceCollector
}
// A serviceCollector is a Prometheus collector for WMI Win32_Service metrics
type serviceCollector struct {
State *prometheus.Desc
StartMode *prometheus.Desc
}
// NewserviceCollector ...
func NewserviceCollector() (Collector, error) {
const subsystem = "service"
return &serviceCollector{
State: prometheus.NewDesc(
prometheus.BuildFQName(Namespace, subsystem, "state"),
"The state of the service (State)",
[]string{"name", "state"},
nil,
),
StartMode: prometheus.NewDesc(
prometheus.BuildFQName(Namespace, subsystem, "start_mode"),
"The start mode of the service (StartMode)",
[]string{"name", "start_mode"},
nil,
),
}, nil
}
// Collect sends the metric values for each metric
// to the provided prometheus Metric channel.
func (c *serviceCollector) Collect(ch chan<- prometheus.Metric) error {
if desc, err := c.collect(ch); err != nil {
log.Println("[ERROR] failed collecting service metrics:", desc, err)
return err
}
return nil
}
type Win32_Service struct {
Name string
State string
StartMode string
}
func (c *serviceCollector) collect(ch chan<- prometheus.Metric) (*prometheus.Desc, error) {
var dst []Win32_Service
q := wmi.CreateQuery(&dst, "")
if err := wmi.Query(q, &dst); err != nil {
return nil, err
}
for _, service := range dst {
ch <- prometheus.MustNewConstMetric(
c.State,
prometheus.GaugeValue,
1.0,
strings.ToLower(service.Name),
strings.ToLower(service.State),
)
ch <- prometheus.MustNewConstMetric(
c.StartMode,
prometheus.GaugeValue,
1.0,
strings.ToLower(service.Name),
strings.ToLower(service.StartMode),
)
}
return nil, nil
}

View File

@@ -25,7 +25,7 @@ type WmiCollector struct {
}
const (
defaultCollectors = "cpu,cs,logical_disk,net,os,system"
defaultCollectors = "cpu,cs,logical_disk,net,os,service,system"
serviceName = "wmi_exporter"
)

View File

@@ -2,9 +2,22 @@ Param(
[Parameter(Mandatory=$true)]
$Class,
[Parameter(Mandatory=$false)]
$CollectorName = ($Class -replace 'Win32_PerfRawData_Perf','')
$CollectorName = ($Class -replace 'Win32_PerfRawData_Perf',''),
[Parameter(Mandatory=$false)]
$ComputerName = "localhost",
[Parameter(Mandatory=$false)]
$Credential
)
$members = Get-WMIObject $Class `
$ErrorActionPreference = "Stop"
if($Credential -ne $null) {
$wmiObject = Get-WMIObject -ComputerName $ComputerName -Credential $Credential -Class $Class
}
else {
$wmiObject = Get-WMIObject -ComputerName $ComputerName -Class $Class
}
$members = $wmiObject `
| Get-Member -MemberType Properties `
| Where-Object { $_.Definition -Match '^u?int' -and $_.Name -NotMatch '_' } `
| Select-Object Name, @{Name="Type";Expression={$_.Definition.Split(" ")[0]}}