Setup Host Metrics with OpenTelemetry

SigNoz Cloud - This page applies to SigNoz Cloud editions.
Self-Host - This page applies to self-hosted SigNoz editions.

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:

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:

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.

config.yaml
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.

config.yaml
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:

config.yaml
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:

config.yaml
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 gcp in your detectors.

  • Amazon EKS: disabled by default; enable it explicitly (requires the EC2:DescribeInstances IAM permission):

    config.yaml
    processors:
      resourcedetection:
        detectors: [env, eks, system]
        eks:
          resource_attributes:
            k8s.cluster.name:
              enabled: true
  • Azure AKS: disabled by default; enable it the same way:

    config.yaml
    processors:
      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:

config.yaml
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:

config.yaml
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.yaml

For 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).

config.yaml
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 exporters

Validate

Once configured, verify that metrics are flowing to SigNoz.

  1. Go to the Infrastructure Monitoring section in SigNoz (Hosts tab).
  2. You should see your host listed with metrics like CPU and Memory usage.
List of Hosts in SigNoz Infrastructure Tab
List of Hosts in SigNoz Infrastructure Tab
Detailed View of a Host
Detailed View of a Host

Troubleshooting

No metrics appearing in SigNoz

Symptoms: Host not visible in Infrastructure Monitoring > Hosts tab.

Resolution:

  1. Check the collector logs. Refer to the troubleshooting section of your environment's collector guide (VM / Docker / k8s-infra) for the exact command.
  2. Verify the hostmetrics receiver is enabled in your config and listed in the metrics pipeline under service > pipelines.
  3. Ensure the collector can reach the SigNoz endpoint (port 443 for Cloud, 4317 for 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 resourcedetection processor is not added to the processors section of your collector config, or
  • The processor is defined but not enabled in your metrics pipeline (the processors list under service > pipelines > metrics).

Resolution:

  1. Verify that the resourcedetection processor is in your processors section:
config.yaml
processors:
  resourcedetection:
    detectors: [env, system, docker]
  batch:
  1. Verify that resourcedetection is listed in your metrics pipeline before batch:
config.yaml
service:
  pipelines:
    metrics:
      receivers: [hostmetrics]
      processors: [resourcedetection, batch]
      exporters: [otlp]
  1. 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

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.

Last updated: August 03, 2026

Edit on GitHub

Was this page helpful?

Your response helps us improve this page.