Skip to content

Insights recommendations are missing or unexpected

Missing, stale or unexpected recommendations require a collection and evidence check before a resource change.

Insights UI requires Agent v0.7.0 or later. Set NS to the workload namespace and AGENT_NS to the Agent installation namespace:

Terminal window
NS=my-app
AGENT_NS=keda
kubectl get pods -n "$AGENT_NS" -l control-plane=kedify-agent \
-o jsonpath='{range .items[*]}{.metadata.name}{" "}{.status.phase}{" "}{.spec.containers[*].image}{"\n"}{end}'
kubectl get namespace "$NS" -L insights.kedify.io/scrape
kubectl get --raw "/apis/metrics.k8s.io/v1beta1/namespaces/$NS/pods"

Expect running Agent pods using a supported image, an enabled namespace selection and PodMetrics with recent timestamp values for the workload’s containers. NotFound for the Metrics API requires a working metrics-server installation; Forbidden means the caller lacks access. Success with your credentials does not establish that the Agent service account can read metrics.

Follow Insights settings to verify Metrics API access and namespace selection; wait for fresh evidence rather than repeatedly toggling monitoring.

Namespace appears paused but samples continue

Section titled “Namespace appears paused but samples continue”

Read the running Agent’s collection settings without exporting its credential environment:

Terminal window
kubectl get pods -n "$AGENT_NS" -l control-plane=kedify-agent -o json | \
jq '.items[].spec.containers[].env[]? | select(.name == "METRICS_WATCH_NAMESPACE" or .name == "METRICS_FOR_LABELED_NAMESPACES_ENABLED")'

An explicit METRICS_WATCH_NAMESPACE entry adds that namespace even when its label is false, disabled or paused. Label gating defaults to enabled when the environment setting is absent. Disabling it with an empty explicit list selects all namespaces.

Change scope through the owning values/source; recheck the effective namespace set and timestamps.

Compare the observation interval with workload peaks, recent releases, requests/limits and CPU/memory units. Confidence is not a probability of safe resizing.

Use recommendation semantics; retain safe resources until representative demand is observed.

For a Deployment, compare the template with the selected recommendation:

Terminal window
WORKLOAD=my-app
kubectl get deployment "$WORKLOAD" -n "$NS" \
-o jsonpath='{range .spec.template.spec.containers[*]}{.name}{" "}{.resources}{"\n"}{end}'
kubectl rollout status deployment/"$WORKLOAD" -n "$NS" --timeout=120s

Expect the intended container’s requests/limits and a completed rollout. If the template reverts, inspect the Helm/GitOps source and reconciliation before reapplying.

Apply through the source owner and inspect rollout/events; do not retry a dashboard mutation against GitOps reconciliation.

Resource requests, node removal and price coverage are different measures.

Use FinOps missing/partial data, then validate the resource change.

Confirm new recommendations show the expected namespace, workload and observation window. After applying a change, check the rollout and resource values against the selected recommendation.

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

Related: Insights settings · Apply or revert through Helm/GitOps.