Send NGINX Ingress Controller Metrics to SigNoz

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

Configure the OpenTelemetry Collector to scrape the NGINX Ingress Controller's Prometheus endpoint and send metrics to SigNoz.

Prerequisites

How NGINX Ingress Controller exposes metrics

The ingress-nginx controller exposes Prometheus metrics on port 10254 at /metrics on each controller pod.

For a new ingress-nginx release, enable the metrics service during install:

helm install ingress-nginx ingress-nginx/ingress-nginx \
  --namespace ingress-nginx --create-namespace \
  --set controller.metrics.enabled=true \
  --set controller.metrics.service.servicePort=10254

For an existing release, preserve your current Helm values while enabling metrics:

helm upgrade ingress-nginx ingress-nginx/ingress-nginx \
  --namespace ingress-nginx \
  --reuse-values \
  --set controller.metrics.enabled=true \
  --set controller.metrics.service.servicePort=10254

If you manage ingress-nginx with a values file, pass that same file during the upgrade so your existing controller settings are retained.

For metric names and labels, see the ingress-nginx monitoring reference.

Send Metrics to SigNoz

Step 1. Configure the OpenTelemetry Collector

Merge the following into your existing Collector config. It adds a Prometheus scrape job that uses pod discovery to find ingress-nginx controller pods and scrape port 10254.

otel-collector-config.yaml
receivers:
  prometheus:
    config:
      scrape_configs:
        - job_name: ingress-nginx
          scrape_interval: 30s
          scrape_timeout: 10s
          metrics_path: /metrics
          kubernetes_sd_configs:
            - role: pod
              namespaces:
                names: [ingress-nginx]
          relabel_configs:
            - source_labels: [__meta_kubernetes_pod_label_app_kubernetes_io_name]
              action: keep
              regex: ingress-nginx
            - source_labels: [__meta_kubernetes_pod_label_app_kubernetes_io_component]
              action: keep
              regex: controller
            - source_labels: [__meta_kubernetes_pod_container_port_number]
              action: keep
              regex: "10254"
            - source_labels: [__meta_kubernetes_namespace]
              target_label: namespace
            - source_labels: [__meta_kubernetes_pod_name]
              target_label: pod
            - source_labels: [__meta_kubernetes_pod_node_name]
              target_label: node

processors:
  resource:
    attributes:
      - key: service.name
        value: ingress-nginx
        action: upsert
  batch: {}

exporters:
  otlphttp:
    endpoint: 'https://ingest.<region>.signoz.cloud:443'
    headers:
      signoz-ingestion-key: '<your-ingestion-key>'

service:
  pipelines:
    metrics:
      receivers: [prometheus]
      processors: [resource, batch]
      exporters: [otlphttp]

Verify these values:

The Collector needs ClusterRole permissions for Kubernetes pod discovery. The OpenTelemetry Collector on Kubernetes guide covers the required RBAC setup.

Step 2. Restart the Collector

kubectl rollout restart deployment/otel-collector -n <collector-namespace>

Step 3. Validate

After the Collector restarts:

  1. In SigNoz, go to Metrics > Metrics Explorer.
  2. Search for nginx_ingress_controller_requests to verify metrics are flowing.

SigNoz shows metrics within the first scrape interval (default: 30 seconds).

nginx-ingress-controller metrics in SigNoz Metrics Explorer
nginx_ingress_controller_* metrics in SigNoz Metrics Explorer

Troubleshooting

No metrics appearing

Verify the Collector pod has RBAC permissions to discover Kubernetes pods. Run:

kubectl logs deployment/otel-collector -n <collector-namespace>

Look for scrape errors or permission-denied messages.

Metrics present but no ingress label on panels

Verify the controller pod has the labels app.kubernetes.io/name=ingress-nginx and app.kubernetes.io/component=controller. Check with:

kubectl get pods -n ingress-nginx --show-labels

Metrics delayed

The scrape interval is set to 30 seconds. Reduce it in the scrape_configs section for faster feedback during testing.

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: May 30, 2026

Edit on GitHub

Was this page helpful?

Your response helps us improve this page.