--- name: cache-observability description: "Track cache hit rates, latency, and detect cache-related issues" triggers: - "cache metrics" - "Redis monitoring" - "cache hit rate" - "cache performance" priority: 2 --- # 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`