Windows host monitoring with OpenTelemetry
The OpenTelemetry Collector’s hostmetrics receiver reads CPU, memory, disk, filesystem, network, and load statistics from a Windows host. The windowsperfcounters receiver adds Windows-native performance counters that hostmetrics does not expose. You run the Collector as a Windows service so it starts with the machine.
Prerequisites
Section titled “Prerequisites”- Windows Server 2016+ or Windows 10/11.
- An elevated (Administrator) PowerShell session.
- Your Osuite ingest endpoint and token.
Set up the Collector
Section titled “Set up the Collector”-
Install the Collector as a service. The
contribMSI installs thehostmetricsandwindowsperfcountersreceivers and registers a Windows service namedotelcol-contrib. Run in an elevated PowerShell:Terminal window $OtelcolVersion = "0.156.0"Invoke-WebRequest -Uri "https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v$OtelcolVersion/otelcol-contrib_${OtelcolVersion}_windows_x64.msi" -OutFile "$env:TEMP\otelcol-contrib.msi"msiexec /i "$env:TEMP\otelcol-contrib.msi" /quiet -
Configure the receivers, processor, and exporter. Replace the contents of
C:\Program Files\OpenTelemetry Collector Contrib\config.yamlwith the following. Both receivers are wired into themetricspipeline.receivers:hostmetrics:collection_interval: 30sscrapers:cpu:memory:disk:filesystem:network:load:windowsperfcounters:collection_interval: 30smetrics:system.processes.count:description: Number of processes on the host.unit: "{processes}"gauge:perfcounters:- object: Systemcounters:- name: Processesmetric: system.processes.countprocessors:resourcedetection:detectors: [env, system]system:hostname_sources: [os]batch:exporters:otlp/osuite:endpoint: ingest.<region>.osuite.io:443headers:x-osuite-ingest-token: <your-ingest-token>service:pipelines:metrics:receivers: [hostmetrics, windowsperfcounters]processors: [resourcedetection, batch]exporters: [otlp/osuite] -
Restart the service.
Terminal window Restart-Service otelcol-contribGet-Service otelcol-contrib
Validate
Section titled “Validate”Confirm the service is running:
Get-Service otelcol-contribThe Collector logs to the Windows Event Log under the otelcol-contrib source. Open Event Viewer → Windows Logs → Application to check for startup and OTLP export errors.
Verify in Osuite
Section titled “Verify in Osuite”What you should see
Host metrics arrive within a minute — check Dashboards → Explore metrics for CPU, memory, disk, filesystem, network, and load metrics alongside the Windows process count. Build a host dashboard to plot utilization per host.
Data collected
Section titled “Data collected”The hostmetrics receiver emits standard system.* metrics; the windowsperfcounters block above adds system.processes.count.
| Metric | Description |
|---|---|
system.cpu.time | CPU time by state (user, system, idle). |
system.cpu.utilization | Fraction of CPU time by state. |
system.memory.usage | Memory used, by state. |
system.memory.utilization | Fraction of memory used, by state. |
system.disk.io | Bytes read from and written to each disk. |
system.disk.operations | Read and write operations per disk. |
system.filesystem.usage | Bytes used and available per volume. |
system.filesystem.utilization | Fraction of each volume used. |
system.network.io | Bytes received and transmitted per interface. |
system.cpu.load_average.1m | One-minute load average. |
system.processes.count | Number of processes on the host (from windowsperfcounters). |
Troubleshooting
Section titled “Troubleshooting”If the install or service commands fail with an access error, confirm the PowerShell session is elevated (Run as Administrator). If a performance counter reports no data, verify the object and counter names against typeperf -q on the host — Windows counter names are localized and must match exactly.
No data in Osuite after a few minutes? Work through these checks.
- Endpoint — confirm the exporter targets exactly
ingest.<region>.osuite.io:443for your region, over TLS. - Token — confirm the ingest header carries a valid
<your-ingest-token>and has not been rotated. - Pipeline — confirm the signal you expect (traces, logs, or metrics) is wired into an active pipeline with the
otlp/osuiteexporter attached. - Export errors — check the application or Collector logs for OTLP export failures (auth, DNS, TLS, connection refused).
- Network — confirm the host has outbound access to the ingest endpoint on port
443. - Timing — allow up to a minute for the first data to appear before assuming a failure.
Still stuck? Ask the Investigation Agent or contact support.
Next steps
Section titled “Next steps”- Linux host monitoring — the same recipe for Linux hosts
- Docker container metrics — per-container metrics
- Dashboards — build host dashboards from the collected metrics
- Alerts — alert on host CPU, memory, and disk thresholds