Skip to content

Forecasts are missing or inaccurate

Diagnose forecasting separately from live autoscaling. Keep a working live-demand path while testing prediction quality.

Set NS and PREDICTOR to the MetricPredictor’s namespace and name:

Terminal window
NS=my-app
PREDICTOR=my-predictor
kubectl get metricpredictor.keda.kedify.io "$PREDICTOR" -n "$NS" -o json | \
jq '{spec: .spec, source: .status.source, modelName: .status.modelName, conditions: .status.conditions}'
kubectl describe metricpredictor.keda.kedify.io "$PREDICTOR" -n "$NS"

Check status.source against the configured KEDA, OTel, CSV or Prometheus input. Read condition reason/message for input errors. A populated modelName alone does not establish recent ingestion or forecast quality; inspect timestamped data in model exploration.

Follow predictor enablement and OTLP ingestion; verify timestamped samples before retraining.

For job-based training, locate the failing Job and storage in the Predictor installation namespace:

Terminal window
PREDICTOR_NS=keda
kubectl get jobs,pods,pvc -n "$PREDICTOR_NS"
kubectl get events -n "$PREDICTOR_NS" --sort-by=.metadata.creationTimestamp
# Set this to the training Job reported above.
TRAINING_JOB=my-training-job
kubectl logs -n "$PREDICTOR_NS" job/"$TRAINING_JOB" --all-containers=true --tail=100

Expect bound PVCs, schedulable training pods and a completed training Job. FailedMount, Pending pods or training errors require correcting storage, placement or input data. If training runs in-process, inspect the Predictor pod’s logs instead. See storage requirements.

Correct the reported input/storage failure; recheck model status without deleting history as a first remedy.

Compare forecast and actual values for equivalent units, horizon and held-out periods. Look for missing samples, one-off incidents or changed seasonality.

Use model exploration to inspect quality. Preserve live scaling and reject the forecast if it adds no useful lead time.

Inspect the workload’s ScaledObject and generated HPA (for the HPA path):

Terminal window
SCALEDOBJECT=my-app
kubectl get scaledobject "$SCALEDOBJECT" -n "$NS" -o yaml
kubectl get hpa -n "$NS" -l "scaledobject.keda.sh/name=$SCALEDOBJECT"

The predictive trigger’s model binding must match the trained model. Compare current/target metrics and desired replicas with the trigger threshold, forecast offset and maxReplicaCount. If HPA shows unknown metrics, use workload diagnostics. For KPA-owned workloads, inspect KPA status instead of expecting a live HPA control loop.

Compare trigger metadata with MetricPredictor fields; verify desired and ready capacity separately.

Measure image/model startup and node provisioning time against forecast lead time.

Use predictable-demand choices and node capacity preparation only when readiness is the bottleneck.

Confirm history has recent timestamps, the model trains successfully, and the selected forecast reaches the ScaledObject. Compare predicted versus observed demand before relying on forecast-driven replicas.

For unresolved failures, Collect diagnostics for support with versions, namespace/target, timestamps, relevant conditions and a redacted configuration.

Related: Enable predictive scaling · Forecast and scale a sample workload · Explore and tune forecast models · Predictive scaler trigger configuration · MetricPredictor API reference.