Most teams can name the metrics they track. Few can name the ones that actually matter. Your APM dashboard probably displays forty metrics — response time, throughput, error rate, saturation, memory, CPU, disk I/O, database connection pool usage, cache hit rate, and so on. But when something breaks at 3 a.m., you look at five of them. APM metrics that matter are the ones that directly tell you if your system is working, where it's failing, and what to fix. Everything else is noise.
This guide cuts through the noise. You'll learn which metrics drive decisions, how to compute them correctly, and which ones deserve alerts. You'll also learn the arithmetic traps that catch every team: why you cannot average percentiles across instances, why low-traffic endpoints make latency metrics lie, and why measuring performance wrong is often worse than not measuring at all.
The metrics that actually matter
Pick five. Pick five metrics and know them better than you know your app. These are the ones that correlate with user experience and infrastructure capacity. Everything else can wait.
Throughput — requests per minute (RPM) or requests per second (RPS). This is the load on your system. It answers one question: how many requests is your system handling right now? A service doing 100 RPS at 100ms latency might serve 200 RPS at 500ms latency — or start timing out. Throughput and latency are intertwined. You must track both.
Latency percentiles — P50, P75, P95, P99. Not averages. Percentiles. If your average response time is 200ms but your P99 is 2 seconds, you have a problem: 1% of your users wait 10x longer than the median. Percentiles reveal the tail of your distribution — the frustrated users, the queries that hit a cold cache, the requests that land during peak load. P50 tells you the typical experience. P95 and P99 tell you what your slowest users actually see.
Never average percentiles across multiple instances or time windows. Averaging percentiles is mathematically invalid and produces meaningless numbers. If Instance A has P95=500ms and Instance B has P95=600ms, the system-wide P95 is NOT 550ms. You must preserve the raw distribution and compute percentiles across all requests.
Error rate — errors per minute, or errors as a percentage of requests. Not error count. Rate. A service that handles 10,000 requests per minute with 100 errors per minute has a 1% error rate. During peak load, the same 100 errors becomes a problem. During quiet periods, the same error count might be acceptable. Error rate accounts for scale. Error rate matters more than error count because you can't set a static threshold for count.
Apdex score — application performance index. A single number from 0 to 1 that buckets responses into three categories: satisfied (under a threshold), tolerating (under a higher threshold), and frustrated (everything else). If you define satisfied as under 500ms and tolerating as under 2 seconds, then:
- Satisfied: responses under 500ms
- Tolerating: responses 500ms to 2s
- Frustrated: responses over 2s
- Apdex = (satisfied + tolerating/2) / total
An Apdex of 1.0 means all requests are satisfied. 0.5 means half are satisfied, half are frustrated. Apdex distills performance into one number — useful for dashboards and alerts, though it hides the percentile details.
Saturation and resource use — what percentage of your system's capacity is in use? This answers the second half of the reliability equation. Your API might respond in 100ms, but if your database connection pool is 95% full, the next burst of traffic will exhaust it and every new request will timeout. Saturation includes CPU, memory, disk I/O, database connections, thread pools, and any other resource that can become the bottleneck. Track it not because you need to alert on 95% usage, but because 95% usage predicts what will happen at 105% usage — a crash.
Transaction breakdown — where does the time go? In your average 500ms request, is 400ms spent waiting for the database, 50ms waiting for an external API, and 50ms in your app code? Or the reverse? A transaction waterfall shows the composition of latency. Without it, you optimize the wrong thing. You might add cache to reduce database queries from 10ms to 5ms when the real problem is a 400ms call to a third-party service that you could parallelize or timeout aggressively.
The metrics to dashboard (not necessarily alert)
These are important but usually don't need hard alerts. They're for dashboards, for on-call engineers to understand context.
Slow transaction volume — how many requests hit your slow threshold? If you define slow as over 1 second, track how many requests cross that line each minute. This is a leading indicator — before error rate spikes, slow transaction volume rises.
External call timing — time spent in third-party services. If 40% of your latency is waiting for a payment processor, you have a different problem than 40% database latency. Parallelization vs. optimization vs. timeout tuning are all different strategies.
Cache hit rate — what percentage of cache requests hit? A cache hit rate below 60% means you're either not caching the right things, or your cache is too small. Below 30% and you're probably wasting CPU and adding latency by checking the cache when it never hits.
The metrics to ignore (unless context demands otherwise)
These feel important but usually aren't. They're often symptoms of problems, not causes.
Response time averages — already covered above. Percentiles. Always percentiles.
Request count — total requests served, without context. 10,000 requests at 100ms latency is healthy; 10,000 requests at 5 seconds is a crisis. Count is noise without latency.
Raw CPU and memory usage — these matter for capacity planning, not for performance diagnosis. A service running at 80% memory with 50ms latency is fine. The same service at 20% memory with 2 second latency is broken. Use saturation percentage instead.
Critical arithmetic and measurement traps
You cannot average percentiles. This is the most common mistake. If your system has three instances and each reports P95=500ms, the system-wide P95 is not 500ms. It might be 800ms or 1200ms. Percentile aggregation requires the raw latency data, not the percentiles themselves.
Low-traffic endpoints make percentiles unreliable. If an endpoint gets 1 request per minute, its P95 latency is meaningless — you don't have 20 requests to compute a meaningful 95th percentile. A single slow request from a warm cache miss becomes your P95. For low-traffic endpoints, use raw response times or track them separately.
A P99 over a 1-minute window is not comparable to a P99 over a 1-hour window. A 1-minute window captures 6000 requests for a 100 RPS service. A 1-hour window captures 360,000 requests. The 1-hour P99 is almost always slower because you have more samples to find the rare catastrophic outlier. Always specify the window when quoting percentiles.
Percentiles computed from averages are wrong. Some tools compute percentiles like this: aggregate data into 1-minute buckets, compute the average for each bucket, then compute percentiles of those averages. This is invalid. You must compute percentiles from raw request timings, not from aggregated averages.
Saturation is relative to your threshold, not your current load. If your database can handle 1000 connections and you have 800 open, you're at 80% saturation — close to the wall. If your threshold is 10,000 connections and you have 8000 open, that's also 80%. The number that matters is the distance to failure.
Relating to frameworks: RED, USE, and golden signals
The RED method — Rate, Errors, Duration — maps cleanly to your core metrics: throughput (rate), error rate (errors), and latency percentiles (duration). RED is excellent for services. The USE method — Utilization, Saturation, Errors — emphasizes saturation and resource use, which is essential for infrastructure. Golden signals — latency, traffic, errors, and saturation — are the four things that matter across every system. These frameworks don't conflict; they're lenses. Use RED for your API, USE for your database, and golden signals to tie them together.
Metering with confidence: the decision table
Here's a decision table for each metric. Track all of them. Alert on some. Ignore most.
| Metric | What it answers | Alert? | Track via |
|---|---|---|---|
| Throughput | Is traffic normal? | Yes, if it drops suddenly (deploy side effect) | RPS / RPM |
| P95 latency | Do users experience acceptable speed? | Yes, if it exceeds threshold | Percentile computation |
| P99 latency | Do edge cases (worst users) have usable speed? | Usually not alone; dashboard context | Percentile computation |
| Error rate | Is the system correct? | Yes, if it spikes | Errors per minute / % of requests |
| Apdex | Is the service healthy (one number)? | Yes, if it drops below threshold | Formula above |
| Saturation | How close to breaking? | Yes, if over 80% | CPU, memory, connections, queue |
| Slow transaction % | Are more requests hitting latency ceiling? | Yes, if trending up | Transactions over threshold / total |
| External API latency | Are third-party services slowing us? | Sometimes; depends on criticality | Span timing data |
| Cache hit rate | Is caching effective? | Rarely; use for diagnostics | Hits / (hits + misses) |
LightTrace and these metrics
LightTrace captures transaction-level APM metrics that matter: throughput (requests per second), latency percentiles (P50, P75, P95, P99), and error rate. You see transaction breakdowns in span waterfalls — exactly where your request spends time. Set alert rules on latency thresholds or error rate spikes; dashboards show you the percentiles so you can diagnose the tail.
LightTrace does not capture RUM (Real User Monitoring), Core Web Vitals, or synthetic monitoring. Those require JavaScript instrumentation in the browser, which is a different product category. For backend performance — the metrics that matter for on-call engineers — LightTrace shows you the exact data you need to diagnosis and fix slowdowns in production.
| Metric | LightTrace | Status |
|---|---|---|
| Throughput (RPS/RPM) | ✓ | Captured from all transactions |
| Latency percentiles (P50/P75/P95/P99) | ✓ | Computed per transaction type |
| Error rate | ✓ | Errors per minute, grouped by endpoint |
| Apdex | — | Manual calculation from percentiles |
| Saturation | — | Requires infrastructure monitoring |
| Slow transaction count | ✓ | Flagged in transaction list |
| Transaction breakdown | ✓ | Span waterfall timing |
The ones you'll use most: throughput, latency percentiles, error rate, and transaction breakdown. These four answer 90% of performance questions at 3 a.m. The rest are context.
Start with P95 latency. It's the sweet spot between capturing the typical experience (P50 is too forgiving) and chasing noise (P99 can be a single fluke). If your P95 is healthy, your users are happy. When it isn't, span waterfalls show you why.
Start tracking errors in minutes
Start tracking the metrics that matter — set up APM in LightTrace and get percentile-based latency, throughput, and error rate with transaction breakdowns in minutes.
The difference between a fast app and a slow one isn't usually code quality — it's clarity about what you're measuring. Pick the right metrics, compute them correctly, and alert on the right thresholds. Everything else is noise.