When monitoring Kubernetes workloads using AppDynamics' Cluster Agent, users often observe a mismatch or confusion between the Memory (MB) values in the table and the Usage% shown in pod detail graphs. This article explains how CPU and memory metrics are computed, displayed, and what to expect when resource limits are or are not defined.
AppDynamics uses the following logic:
If CPU limits are defined in the pod spec, the CPU%Busy is calculated relative to the defined limit.
If limits are not set, AppDynamics falls back to node-level CPU usage, and percentage values may not reflect actual pod utilization.
Not exactly.
Memory (MB) is always collected as the raw value used by the container.
Memory usage % (Usage%) is only calculated and displayed if a memory limit is defined.
If no memory limit is set, AppDynamics may still show MB used in the table view, but the Usage% will remain at 0%, as no denominator is available for calculation.
This behavior is expected when no resource limits are set. AppDynamics cannot calculate a percentage of memory used if there's no defined upper limit to compare against.
Screenshot 1: Pod list view
Shows the AppDynamics Operator pod using 11.84 MB memory with 1% CPU.
2. Screenshot 2: Pod container view (with limits defined)
Graph shows 11.91% memory usage out of 100Mi defined.
3. Screenshot 3: Pod container view (without limits)
NodeJS pod consuming 33 MB memory but graph shows 0% usage.
Verifying Pod Resource Limits:
To check if a pod has limits defined:
kubectl get pod <pod-name> -n <namespace> -o jsonpath="{.spec.containers[*].resources.limits}"
If output is empty ({}), no limits are set, and usage% will show 0%.
Always refer to the table for actual memory used (MB).
Usage% depends on resource limits being set.
No bug here – this is by design, and understanding this helps interpret the UI accurately.
Set CPU and memory limits in pod specs for better visibility and scaling insights.
Use kubectl top pod to cross-verify values if needed.