Files
windows_exporter/internal/pdh/AGENTS.md
T

39 lines
1.8 KiB
Markdown

# PDH package
`internal/pdh` wraps the Performance Data Helper API for the typed collectors
(`NewCollector`, `NewQueryCollector`) and the configurable `performancecounter`
collector (`NewDynamicCollector`).
## Ownership
- Constructors return either a value and a nil error, or nil and an error.
`NewCollector` and `NewDynamicCollector` close the query they opened, and
`NewQueryCollector` removes the counters it added to the shared query,
before they return an error. Callers never close a value they did not
receive; `Collector.Close` and `Query.Close` accept nil receivers.
- Collectors usually assign the result to a field before checking the error,
so after an error the field is nil. A `Build` that tolerates the error must
check the field for nil in `Collect`; the parent `Close` can close the field
unconditionally.
- `newCollector` holds the lock of a shared query while it adds counters, so
its error paths use `Collector.release`, which expects the caller to hold
the locks or be the only user. `Close` takes the locks and calls it.
- Close collectors of a `Query` before the query itself.
## Struct tags
- `perfdata:"Counter"` marks a `float64` field; `perfdata:"Counter,secondvalue"`
receives the second raw value (the base of a ratio or average).
- `perfdata_min_build:"<build>"` skips a counter that is missing on an older
Windows build. The value must be a decimal build number that fits a
`uint16`; anything else is a constructor error, so a typo cannot silently
disable the check.
## Native calls
- The wrappers return PDH status codes. A path that cannot be converted to
UTF-16 (it contains a NUL character) returns `CstatusBadCountername`
instead of passing a NULL path to PDH.
- Build a `pdh.Error` with `NewPdhError` only for a status that is reported as
an error: it formats the message text with `FormatMessage`.