Host metrics are fundamental performance indicators collected directly from a system's operating system. These metrics provide granular visibility into a host's resource utilization and health.
The OpenTelemetry hostmetrics receiver collects metrics for CPU, memory, disk, network, paging, load average, and processes. This guide explains how to configure the receiver on top of an OpenTelemetry Collector that's already running on your host.
Prerequisites
- An instance of SigNoz (either Cloud or Self-Hosted)
- An OpenTelemetry Collector installed and running on each host you want to monitor
Before you start: install the OpenTelemetry Collector
Make sure an OpenTelemetry Collector is installed and running on each host you want to monitor. Pick the install guide that matches your environment:
- VM (Linux, macOS, Windows) → VM Collection Agent: covers DEB / RPM / tarball on Linux, tarball on macOS, MSI on Windows.
- Docker host → Docker Collection Agent: Docker Compose /
docker runinstall. - Kubernetes (node-level host metrics) → k8s-infra Collection Agent: Helm chart that already wires
hostmetricsper node. - AWS ECS → ECS Collection Agent.
Every Collection Agent guide ships a complete config.yaml that already includes the hostmetrics receiver. The sections below explain its options so you can adjust the shipped config for your needs.
Configure the hostmetrics receiver
Add (or adjust) the hostmetrics receiver in your collector's config.yaml:
receivers:
hostmetrics:
collection_interval: 60s
scrapers:
cpu: {}
disk: {}
load: {}
filesystem: {}
memory: {}
network: {}
nfs: {} # Linux only, remove on Windows / macOS
paging: {}
process:
mute_process_name_error: true
mute_process_exe_error: true
mute_process_io_error: true
processes: {}
system: {}Each entry under scrapers: enables a metric category. collection_interval controls how often metrics refresh; 60s is a sensible default. For finer-grained data, drop it to 10s (see Advanced Configuration for mixed cadences).
Platform-specific receiver tweaks
Docker / container-based collectors: set root_path: /hostfs and bind-mount the host root filesystem into the container. Without this the receiver reads container-internal stats, not host stats.
receivers:
hostmetrics:
root_path: /hostfs
collection_interval: 60s
scrapers: ...And the collector container must run with the bind mount:
docker run -v /:/hostfs:ro ...See Minimal Docker example below for a complete config.
Windows: omit the nfs: scraper (Linux-only) and add mute_process_user_error: true to the process: scraper to suppress access-denied warnings on the Windows process table.
scrapers:
cpu: {}
disk: {}
load: {}
filesystem: {}
memory: {}
network: {}
paging: {}
process:
mute_process_name_error: true
mute_process_exe_error: true
mute_process_io_error: true
mute_process_user_error: true # Windows
system: {}macOS: omit the nfs: scraper (Linux-only); other scrapers behave the same as on Linux.
Configure the resourcedetection processor
Add the resourcedetection processor in the processors section:
processors:
batch:
resourcedetection:
detectors: [env, system]Set the Kubernetes cluster name (k8s.cluster.name)
If you run the collector inside Kubernetes, set k8s.cluster.name so SigNoz can group and disambiguate infrastructure entities (pods, nodes, namespaces, and workloads), especially when you monitor more than one cluster. Unlike namespace and workload names (which the k8sattributes processor reads from the Kubernetes API), a cluster has no canonical name of its own, so it must be set explicitly.
Recommended: set it via the env detector (works on every platform, including self-managed and on-prem). Pass the name through OTEL_RESOURCE_ATTRIBUTES and keep env in your detector list:
processors:
resourcedetection:
detectors: [env, system]export OTEL_RESOURCE_ATTRIBUTES="k8s.cluster.name=<your-cluster-name>"On managed Kubernetes, the cloud detectors can populate it for you:
-
GKE: detected automatically; include
gcpin your detectors. -
Amazon EKS: disabled by default; enable it explicitly (requires the
EC2:DescribeInstancesIAM permission):config.yamlprocessors: resourcedetection: detectors: [env, eks, system] eks: resource_attributes: k8s.cluster.name: enabled: true -
Azure AKS: disabled by default; enable it the same way:
config.yamlprocessors: resourcedetection: detectors: [env, aks, system] aks: resource_attributes: k8s.cluster.name: enabled: true
For all detectors and options, see the OpenTelemetry resourcedetection processor documentation, specifically the Environment Variable, Amazon EKS, GCP Metadata, and Azure AKS detector sections.
Add the receiver and processor to the service pipeline
Wire both the receiver and the processor into the metrics pipeline:
service:
pipelines:
metrics:
receivers: [hostmetrics]
processors: [resourcedetection, batch]
exporters: [otlp]Restart the collector to apply changes.
Minimal Docker example: host metrics only
If you only want host metrics from a Docker host (no container metrics, no log shipping), use this trimmed config:
receivers:
hostmetrics:
root_path: /hostfs
collection_interval: 60s
scrapers:
cpu: {}
disk: {}
load: {}
filesystem: {}
memory: {}
network: {}
paging: {}
process:
mute_process_name_error: true
mute_process_exe_error: true
mute_process_io_error: true
mute_process_user_error: true
processes: {}
system: {}
processors:
batch:
resourcedetection:
detectors: [env, system, docker]
exporters:
otlp:
endpoint: "ingest.<region>.signoz.cloud:443"
tls:
insecure: false
headers:
"signoz-ingestion-key": "<your-ingestion-key>"
service:
pipelines:
metrics:
receivers: [hostmetrics]
processors: [resourcedetection, batch]
exporters: [otlp]Then run:
docker run -d \
--name otelcol-hostmetrics \
--volume /:/hostfs:ro \
--volume $(pwd)/config.yaml:/etc/otelcol-contrib/config.yaml \
otel/opentelemetry-collector-contrib:latest \
--config=/etc/otelcol-contrib/config.yamlFor a fuller collector that also captures container metrics and logs, use the Docker Collection Agent install guide.
Advanced Configuration
Configure Different Frequencies
You can configure different collection intervals for different metrics by defining multiple hostmetrics receivers. This is useful if you want frequently changing metrics (like CPU/Memory) to be collected more often than stable ones (like Filesystem).
receivers:
# Receiver for high-frequency metrics (e.g., every 10s)
hostmetrics/fast:
collection_interval: 10s
scrapers:
cpu: {}
memory: {}
# Receiver for low-frequency metrics (e.g., every 1m)
hostmetrics/slow:
collection_interval: 60s
scrapers:
filesystem: {}
disk: {}
network: {}
service:
pipelines:
metrics:
receivers: [hostmetrics/fast, hostmetrics/slow]
# ... other processors and exportersValidate
Once configured, verify that metrics are flowing to SigNoz.
- Go to the Infrastructure Monitoring section in SigNoz (Hosts tab).
- You should see your host listed with metrics like CPU and Memory usage.


Troubleshooting
No metrics appearing in SigNoz
Symptoms: Host not visible in Infrastructure Monitoring > Hosts tab.
Resolution:
- Check the collector logs. Refer to the troubleshooting section of your environment's collector guide (VM / Docker / k8s-infra) for the exact command.
- Verify the
hostmetricsreceiver is enabled in your config and listed in themetricspipeline underservice > pipelines. - Ensure the collector can reach the SigNoz endpoint (port
443for Cloud,4317for Self-Hosted).
Host Name is blank/empty
Symptoms: Host name appears blank or empty in Infrastructure Monitoring > Hosts tab.
Cause: Metrics are missing the host.name resource attribute (metadata the collector attaches to every metric to identify which host it came from). This typically happens when:
- The
resourcedetectionprocessor is not added to theprocessorssection of your collector config, or - The processor is defined but not enabled in your metrics pipeline (the
processorslist underservice > pipelines > metrics).
Resolution:
- Verify that the
resourcedetectionprocessor is in yourprocessorssection:
processors:
resourcedetection:
detectors: [env, system, docker]
batch:- Verify that
resourcedetectionis listed in your metrics pipeline beforebatch:
service:
pipelines:
metrics:
receivers: [hostmetrics]
processors: [resourcedetection, batch]
exporters: [otlp]- Restart the collector to apply changes.
Verification: After restarting, go to Infrastructure Monitoring > Hosts. Your host should now appear with its hostname populated.
Connection Refused
Symptoms: Logs show connection refused errors.
Resolution:
- Ensure the OTLP endpoint is reachable.
- Verify the correct port is being used.
- Check firewall settings.
Invalid Key (Cloud)
Symptoms: HTTP 401 Unauthorized errors in logs.
Resolution:
- Double-check your ingestion key in
config.yaml. - Ensure it matches the key in SigNoz (Settings > Ingestion Settings).
Next Steps
- Visualize Host Metrics using Dashboard Templates
- Set up Alerts for Host Metrics
- Learn more about Infrastructure Monitoring
Get Help
If you need help with the steps in this topic, please reach out to us on SigNoz Community Slack. If you are a SigNoz Cloud user, please use in product chat support located at the bottom right corner of your SigNoz instance or contact us at cloud-support@signoz.io.