mirror of
https://github.com/prometheus-community/windows_exporter.git
synced 2026-10-17 18:19:04 +02:00
354 lines
12 KiB
Markdown
354 lines
12 KiB
Markdown
# wmi collector
|
|
|
|
The wmi collector runs user-defined WMI queries and exposes numeric properties of
|
|
the returned instances as named metrics.
|
|
|
|
Like the [performancecounter](collector.performancecounter.md) and
|
|
[registry](collector.registry.md) collectors, each property is mapped to its own
|
|
metric: the query is a grouping container, and every property under it declares
|
|
the metric name, type, and labels it is exported as. Unlike those collectors, a
|
|
query usually returns several instances, so properties can also be turned into
|
|
labels that tell the instances apart.
|
|
|
|
> [!NOTE]
|
|
> Prefer the [performancecounter](collector.performancecounter.md) collector when
|
|
> the data is also available as a performance counter. WMI queries are
|
|
> considerably more expensive, and some WMI providers take hundreds of
|
|
> milliseconds per query.
|
|
|
|
| | |
|
|
|---------------------|----------|
|
|
| Metric name prefix | `wmi` |
|
|
| Data source | WMI (MI) |
|
|
| Enabled by default? | No |
|
|
|
|
## Flags
|
|
|
|
### `--collector.wmi.queries`
|
|
|
|
Queries is a list of WMI queries to run. The value takes the form of a JSON array
|
|
of objects. YAML is supported.
|
|
|
|
> [!CAUTION]
|
|
> If you are using a configuration file, the value must be kept as a string.
|
|
>
|
|
> Use a `|-` to keep the value as a string.
|
|
|
|
#### Example
|
|
|
|
```yaml
|
|
collector:
|
|
wmi:
|
|
queries: |-
|
|
- name: logical_disk
|
|
class: Win32_LogicalDisk
|
|
where: DriveType = 3
|
|
label_properties:
|
|
- name: DeviceID
|
|
label: volume
|
|
properties:
|
|
- name: FreeSpace
|
|
metric: windows_wmi_logical_disk_free_bytes
|
|
help: Free space on the logical disk in bytes.
|
|
- name: Size
|
|
metric: windows_wmi_logical_disk_size_bytes
|
|
help: Size of the logical disk in bytes.
|
|
- name: os
|
|
class: Win32_OperatingSystem
|
|
properties:
|
|
- name: LastBootUpTime
|
|
metric: windows_wmi_os_last_boot_timestamp_seconds
|
|
help: Time of the last boot as a Unix timestamp.
|
|
- name: NumberOfProcesses
|
|
```
|
|
|
|
#### Schema
|
|
|
|
YAML:
|
|
|
|
```yaml
|
|
- name: logical_disk # required, unique ID for the query
|
|
namespace: root/CIMv2 # optional
|
|
class: Win32_LogicalDisk # required
|
|
where: DriveType = 3 # optional
|
|
label_properties: # optional
|
|
- name: DeviceID # WMI property name
|
|
label: volume # optional
|
|
properties:
|
|
- name: FreeSpace # WMI property name
|
|
metric: windows_wmi_logical_disk_free_bytes # optional
|
|
help: Free space on the logical disk in bytes. # optional
|
|
type: gauge # optional
|
|
labels: # optional
|
|
source: wmi
|
|
```
|
|
|
|
JSON:
|
|
|
|
```json
|
|
[
|
|
{
|
|
"name": "logical_disk",
|
|
"namespace": "root/CIMv2",
|
|
"class": "Win32_LogicalDisk",
|
|
"where": "DriveType = 3",
|
|
"label_properties": [
|
|
{ "name": "DeviceID", "label": "volume" }
|
|
],
|
|
"properties": [
|
|
{
|
|
"name": "FreeSpace",
|
|
"metric": "windows_wmi_logical_disk_free_bytes",
|
|
"help": "Free space on the logical disk in bytes.",
|
|
"type": "gauge",
|
|
"labels": { "source": "wmi" }
|
|
}
|
|
]
|
|
}
|
|
]
|
|
```
|
|
|
|
The collector builds the WQL statement from the configuration:
|
|
|
|
```
|
|
SELECT <label_properties>, <properties> FROM <class> [WHERE <where>]
|
|
```
|
|
|
|
#### name
|
|
|
|
Required, unique ID for the query. It is used as the `query` label on
|
|
`windows_wmi_query_success` and `windows_wmi_query_duration_seconds`, to identify
|
|
the query in logs, and to seed auto-generated metric names (see
|
|
[Metric naming](#metric-naming)). Duplicates are rejected at build time, and so
|
|
are names that only differ in case or special characters (`os` and `OS`, or
|
|
`my_disk` and `my-disk`), because they produce the same metric names.
|
|
|
|
#### namespace
|
|
|
|
The WMI namespace of the class. Optional — defaults to `root/CIMv2`. Backslashes
|
|
are accepted as well, for example `root\Microsoft\Windows\Storage`.
|
|
|
|
#### class
|
|
|
|
The WMI class to query, for example `Win32_LogicalDisk`. Required. Only letters,
|
|
digits and `_` are allowed.
|
|
|
|
#### where
|
|
|
|
An optional WQL condition appended as the `WHERE` clause, for example
|
|
`DriveType = 3` or `Name LIKE 'sql%'`. It is passed to WMI verbatim.
|
|
|
|
#### label_properties
|
|
|
|
The list of properties exported as labels on every metric of the query. Use them
|
|
to tell the returned instances apart, typically with the key property of the
|
|
class (`DeviceID`, `Name`, …). Optional.
|
|
|
|
String, boolean and integer properties are supported. A property without a value
|
|
(`null`) becomes an empty label value. A label property of any other type, for
|
|
example a datetime, fails the whole query at scrape time, and none of its
|
|
metrics are exported.
|
|
|
|
The label properties must uniquely identify every returned instance. Two
|
|
instances with identical label values produce duplicate series, which are
|
|
dropped and logged at scrape time.
|
|
|
|
#### label_properties Sub-Schema
|
|
|
|
##### name
|
|
|
|
The name of the WMI property. Required.
|
|
|
|
##### label
|
|
|
|
The name of the label. Optional — defaults to the property name, lowercased, with
|
|
every character that is not a letter or digit replaced by `_` and leading and
|
|
trailing `_` trimmed. Each label must be unique within a query.
|
|
|
|
#### properties
|
|
|
|
The list of WMI properties to export as metrics. At least one property must be
|
|
listed. Property names are matched case-insensitively, and a property listed more
|
|
than once under one query is rejected as a duplicate.
|
|
|
|
The following property types are supported:
|
|
|
|
| WMI type | Exported value |
|
|
| --- | --- |
|
|
| `boolean` | `1` for true, `0` for false |
|
|
| `uint8`/`sint8` … `uint64`/`sint64` | the number |
|
|
| `real32`, `real64` | the number |
|
|
| `datetime` (timestamp) | seconds since the Unix epoch |
|
|
| `datetime` (interval) | seconds |
|
|
|
|
A property without a value (`null`) is skipped for that instance rather than
|
|
exported as `0`. A property of any other type, for example a string or an array,
|
|
fails the query at scrape time (see `windows_wmi_query_success`).
|
|
|
|
#### properties Sub-Schema
|
|
|
|
##### name
|
|
|
|
The name of the WMI property. Required.
|
|
|
|
##### metric
|
|
|
|
The name of the metric to expose. Optional — if omitted, a name is generated
|
|
automatically. See [Metric naming](#metric-naming) for the exact rules and
|
|
examples.
|
|
|
|
Properties may deliberately share a `metric` name, also across queries, as long
|
|
as they agree on help text, type and label names, and their labels keep the
|
|
series apart. Build rejects identical series within a query, and across queries
|
|
without label properties. For queries with label properties, the series depend
|
|
on the instances returned at runtime; duplicates are dropped and logged at scrape
|
|
time.
|
|
|
|
The names `windows_wmi_query_success` and `windows_wmi_query_duration_seconds`
|
|
are reserved for the collector's own metrics.
|
|
|
|
##### help
|
|
|
|
The metric `# HELP` text. Optional — if omitted, it defaults to
|
|
`windows_exporter: custom WMI metric`.
|
|
|
|
##### type
|
|
|
|
The metric type. The value can be `gauge` or `counter`. If not specified, it
|
|
defaults to `gauge`.
|
|
|
|
This key is optional.
|
|
|
|
##### labels
|
|
|
|
Labels is a map of key-value pairs that will be added as constant labels to the
|
|
metric. A constant label may not use the name of a label property.
|
|
|
|
This key is optional.
|
|
|
|
## Metrics
|
|
|
|
The wmi collector returns one metric per configured property and returned
|
|
instance, named and typed according to the configuration, plus a success and a
|
|
duration metric per query.
|
|
|
|
| Name | Description | Type | Labels |
|
|
| --- | --- | --- | --- |
|
|
| *user defined* | Numeric value of a configured WMI property | gauge / counter | *label properties*, *user defined* |
|
|
| `windows_wmi_query_success` | Whether the query ran and all of its configured properties could be read (0, 1) | gauge | `query` |
|
|
| `windows_wmi_query_duration_seconds` | Duration of the query | gauge | `query` |
|
|
|
|
A `windows_wmi_query_success` value of `0` means one of:
|
|
|
|
- The query failed, for example because the namespace, class or a property does
|
|
not exist, the `where` clause is invalid, or a label property has an
|
|
unsupported type. Nothing is exported for the query.
|
|
- The scrape timeout ran out (see [Notes](#notes)). Instances read before that are
|
|
exported.
|
|
- At least one configured property could not be converted to a number. All other
|
|
properties are still exported.
|
|
|
|
Failing queries are logged as warnings, but do not mark the whole collector as
|
|
failed: `windows_exporter_collector_success{collector="wmi"}` stays `1`, like for
|
|
the [registry](collector.registry.md) collector. Alert on
|
|
`windows_wmi_query_success` instead.
|
|
|
|
Build only validates the configuration; it does not run the queries. A class that
|
|
is missing on a host is therefore reported via `windows_wmi_query_success` rather
|
|
than preventing the exporter from starting.
|
|
|
|
### Metric naming
|
|
|
|
Each property is exported under its own metric name. You can set it explicitly
|
|
with the `metric` field, or let the collector generate one.
|
|
|
|
**Explicit name.** When `metric` is set, it is used verbatim. You are responsible
|
|
for following the Prometheus
|
|
[naming conventions](https://prometheus.io/docs/practices/naming/) (a `windows_`
|
|
prefix, and a unit suffix such as `_bytes`, `_seconds` or `_timestamp_seconds`
|
|
where applicable).
|
|
|
|
**Auto-generated name.** When `metric` is omitted, the name is assembled as:
|
|
|
|
```
|
|
windows_wmi_<query>_<property>
|
|
```
|
|
|
|
where `<query>` is the query [`name`](#name) and `<property>` is the WMI
|
|
property name. The whole string is then lowercased, every character that is not a
|
|
letter or digit is replaced with `_`, and leading/trailing `_` are trimmed.
|
|
|
|
Example:
|
|
|
|
```yaml
|
|
- name: os
|
|
class: Win32_OperatingSystem
|
|
properties:
|
|
- name: NumberOfProcesses
|
|
```
|
|
|
|
→ `windows_wmi_os_numberofprocesses`
|
|
|
|
### Example metric
|
|
|
|
For the example configuration above:
|
|
|
|
```
|
|
# HELP windows_wmi_logical_disk_free_bytes Free space on the logical disk in bytes.
|
|
# TYPE windows_wmi_logical_disk_free_bytes gauge
|
|
windows_wmi_logical_disk_free_bytes{volume="C:"} 4.20703092736e+11
|
|
windows_wmi_logical_disk_free_bytes{volume="D:"} 2.9705715712e+10
|
|
# HELP windows_wmi_logical_disk_size_bytes Size of the logical disk in bytes.
|
|
# TYPE windows_wmi_logical_disk_size_bytes gauge
|
|
windows_wmi_logical_disk_size_bytes{volume="C:"} 9.99132491776e+11
|
|
windows_wmi_logical_disk_size_bytes{volume="D:"} 4.60898430976e+11
|
|
# HELP windows_wmi_os_last_boot_timestamp_seconds Time of the last boot as a Unix timestamp.
|
|
# TYPE windows_wmi_os_last_boot_timestamp_seconds gauge
|
|
windows_wmi_os_last_boot_timestamp_seconds 1.791272732355078e+09
|
|
# HELP windows_wmi_os_numberofprocesses windows_exporter: custom WMI metric
|
|
# TYPE windows_wmi_os_numberofprocesses gauge
|
|
windows_wmi_os_numberofprocesses 478
|
|
# HELP windows_wmi_query_duration_seconds Duration of the WMI query.
|
|
# TYPE windows_wmi_query_duration_seconds gauge
|
|
windows_wmi_query_duration_seconds{query="logical_disk"} 0.0375302
|
|
windows_wmi_query_duration_seconds{query="os"} 0.1690887
|
|
# HELP windows_wmi_query_success Whether the WMI query and all of its configured properties could be read successfully.
|
|
# TYPE windows_wmi_query_success gauge
|
|
windows_wmi_query_success{query="logical_disk"} 1
|
|
windows_wmi_query_success{query="os"} 1
|
|
```
|
|
|
|
### Notes
|
|
|
|
- The queries run one after another and share the scrape timeout. A query that
|
|
is still running when it runs out is cancelled, and the remaining queries are
|
|
skipped; all of them report `windows_wmi_query_success` `0`. Keep queries
|
|
narrow with `where`, avoid slow providers, and check
|
|
`windows_wmi_query_duration_seconds`.
|
|
- `uint64` and `sint64` values larger than 2^53 lose precision when converted to
|
|
the 64-bit float used by Prometheus.
|
|
- WQL `ASSOCIATORS OF` and `REFERENCES OF` queries are not supported.
|
|
|
|
## Useful queries
|
|
|
|
Free space ratio per volume:
|
|
|
|
```
|
|
windows_wmi_logical_disk_free_bytes / windows_wmi_logical_disk_size_bytes
|
|
```
|
|
|
|
## Alerting examples
|
|
|
|
**prometheus.rules**
|
|
|
|
```yaml
|
|
- alert: WMIQueryFailure
|
|
expr: windows_wmi_query_success == 0
|
|
for: 15m
|
|
labels:
|
|
severity: warning
|
|
annotations:
|
|
summary: "WMI query failed (instance {{ $labels.instance }})"
|
|
description: "The WMI query {{ $labels.query }} failed for 15 minutes."
|
|
```
|