Cache Observability
Cache is performance-critical. Track hit rate, latency, and evictions.
Key Metrics
| Metric | Type | Description |
|--------|------|-------------|
| cache.hits | Counter | Successful reads |
| cache.misses | Counter | Reads that missed |
| cache.gets.duration | Histogram | GET latency |
| cache.evictions | Counter | Keys evicted |
| cache.memory.used | Gauge | Memory consumption |
Span Attributes
| Attribute | Example | Required |
|-----------|---------|----------|
| cache.system | redis, memcached | Yes |
| cache.operation | GET, SET | Yes |
| cache.hit | true/false | Yes |
| cache.key_prefix | user:* | Recommended (not full key!) |
Hit Rate
hit_rate = cache.hits / (cache.hits + cache.misses)
- Good: >90%
- Concerning: <80% → Check TTL, warming strategy
Issues to Detect
| Issue | Detection | Fix | |-------|-----------|-----| | Low hit rate | <80% | Tune TTL, warm cache | | Cache stampede | Many misses for same key | Distributed locks | | High latency | p99 >10ms | Check network, value size | | Memory pressure | memory >90% of max | Eviction policy, sizing |
Cache Wrapper Pattern
Before GET: Start timer
After GET: Record duration, increment hits or misses, set cache.hit on span
Anti-Patterns
- Full keys in metrics → High cardinality, use prefix only
- No eviction monitoring → Can't detect memory pressure
- Ignoring serialization time → Track total time including marshal
References
references/platforms/{platform}/cache.md