Send KEDA Autoscaler Metrics to SigNoz with OpenTelemetry

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

KEDA (Kubernetes Event-Driven Autoscaling) is a CNCF graduated project that extends Kubernetes' Horizontal Pod Autoscaler (HPA) to support event-driven scaling with 70+ built-in scalers. Since v2.12, KEDA can emit its own operational metrics via OpenTelemetry — scaling loop latency, scaler errors, active triggers, and more.

KEDA's OpenTelemetry metrics integration is marked as Experimental. It is stable enough for production monitoring but the metric names or behavior may change in future KEDA releases.

Prerequisites

  • KEDA v2.12 or later installed on your Kubernetes cluster (v2.16+ recommended)
  • An instance of SigNoz (either Cloud or Self-Hosted)

How KEDA exposes metrics

The keda-operator Deployment runs an OpenTelemetry SDK in-process and pushes metrics to an OTLP endpoint directly, skipping Prometheus scrape jobs and sidecars.

KEDA emits metrics for scaler activity, scale-loop latency, errors, registered resources and triggers, and optional CloudEventSource queue stats. For the full list, see the KEDA OpenTelemetry Integration docs.

Send KEDA Metrics to SigNoz

Step 1. Enable OpenTelemetry metrics on the operator

Configure keda-operator to push metrics to SigNoz.

New installation:

helm repo add kedacore https://kedacore.github.io/charts
helm repo update
helm install keda kedacore/keda \
  --namespace keda \
  --create-namespace \
  --set "opentelemetry.operator.enabled=true" \
  --set "opentelemetry.collector.uri=https://ingest.<region>.signoz.cloud:443" \
  --set "env[0].name=OTEL_EXPORTER_OTLP_HEADERS" \
  --set "env[0].value=signoz-ingestion-key=<your-ingestion-key>"

Existing installation:

helm upgrade keda kedacore/keda \
  --namespace keda \
  --set "opentelemetry.operator.enabled=true" \
  --set "opentelemetry.collector.uri=https://ingest.<region>.signoz.cloud:443" \
  --set "env[0].name=OTEL_EXPORTER_OTLP_HEADERS" \
  --set "env[0].value=signoz-ingestion-key=<your-ingestion-key>"

Verify these values:

Step 2. Verify the operator restarts

kubectl get pods -n keda

You should see keda-operator, keda-operator-metrics-apiserver, and keda-admission-webhooks pods in Running state.

Step 3. Validate metrics in SigNoz

After a minute or two, confirm data is flowing in SigNoz:

  1. Navigate to the Metrics Explorer in SigNoz
  2. Search for metric_name contains 'keda.build.info'
  3. You should see a keda.build.info metric with attributes like version and git_commit, etc.
Sample KEDA metrics in SigNoz Metrics Explorer
Sample KEDA metrics in SigNoz Metrics Explorer

Visualize with the prebuilt dashboard

SigNoz publishes a prebuilt KEDA dashboard that uses the same metrics this guide validates. It groups scaler activity, scaling loop latency, ScaledObject errors, registered resources and triggers, and CloudEvent metrics into one view, with namespace and ScaledObject filters.

To use it, open Dashboards in SigNoz, click New Dashboard, choose Import JSON, and paste the JSON from the link above.

Troubleshooting

No metrics appearing in SigNoz

  • Check KEDA version: OpenTelemetry metrics require KEDA v2.12+. Run kubectl get deployment keda-operator -n keda -o jsonpath='{.spec.template.spec.containers[0].image}' to verify.
  • Verify OTel is enabled: Check that the operator has the flag and env var set:
    kubectl get deployment keda-operator -n keda -o yaml | grep -A 2 'enable-opentelemetry\|OTEL_EXPORTER'
    
  • Check endpoint reachability: Ensure the cluster can reach ingest.<region>.signoz.cloud:443 over HTTPS.
  • Verify ingestion key: Confirm OTEL_EXPORTER_OTLP_HEADERS contains a valid signoz-ingestion-key value.

Only seeing build.info and registered.count metrics

Scaler-specific metrics (keda.scaler.active, keda.scaler.metrics.value, etc.) only appear when you have at least one active ScaledObject or ScaledJob.

Deprecated metric warnings

KEDA v2.12-v2.15 emits deprecated metrics (keda.scaler.metrics.latency, keda.internal.scale.loop.latency, keda.resource.totals, keda.trigger.totals) alongside their replacements. These were removed in v2.16+. Use the .seconds and .registered.count variants documented in the KEDA OpenTelemetry Integration docs.

Setup OpenTelemetry Collector (Optional)

What is the OpenTelemetry Collector?

The OTel Collector acts as a middleman between KEDA and SigNoz. Instead of sending data directly, KEDA sends metrics to the Collector first, which then forwards them along.

Why use it?

  • Cleaning up data — Filter out metrics you don't care about before they leave your cluster.
  • Keeping KEDA lightweight — Let the Collector handle batching, retries, and compression instead of the KEDA operator.
  • Adding context automatically — The Collector can tag your data with Kubernetes metadata like pod name and namespace.
  • Future flexibility — Want to send data to multiple backends later? The Collector makes that easy without changing your KEDA config.

To use a Collector, set OTEL_EXPORTER_OTLP_ENDPOINT to point at your Collector's OTLP HTTP receiver (e.g., http://otel-collector.keda.svc:4318) instead of the SigNoz Cloud endpoint, and remove the OTEL_EXPORTER_OTLP_HEADERS variable.

See Switch from direct export to Collector for step-by-step instructions.

For more details, see Why use the OpenTelemetry Collector? and the Collector configuration guide.

Next Steps

  • Set Alerts: Configure alerts to get notified when scaler errors spike or scaling latency increases. Learn more.
  • Create Dashboards: Build dashboards to visualize scaling loop latency, active scalers, and error rates across your ScaledObjects.
  • Learn more about KEDA: Visit the KEDA OpenTelemetry Integration docs for additional configuration options.

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: June 2, 2026

Edit on GitHub

Was this page helpful?

Your response helps us improve this page.