Monitoring shows you "how is my app actually performing in production across millions of devices?" Learn to track app performance, resource usage, network behavior, and build SLOs that ensure reliability.
Why App Monitoring Matters
Performance directly impacts user retention. Studies show:
- • 100ms delay reduces conversion by 1%
- • Apps that feel slow get uninstalled quickly
- • Battery drain causes negative reviews
- • High memory usage leads to crashes
- • Poor network performance frustrates users
Key Performance Metrics
Launch Performance
- • Cold start: Time from tap to first frame (<2 sec target)
- • Warm start: Time from background to active (<1 sec target)
Frame Rate & Jank
- • Target 60 FPS for smooth scrolling
- • Monitor jank frames (below 60 FPS)
- • 99th percentile matters more than average
Resource Usage
- • Memory: Target <500MB p95 usage
- • Battery: <5% drain per hour (app only)
- • CPU: Monitor thermal throttling
- • Disk: Track cache and database size
Network Performance
Monitor Network Health
- • Request latency: Target <3 seconds p95
- • Error rate: Track API failures
- • Retry rate: Indicates connection issues
- • Bandwidth usage: Respect user data plans
- • Offline handling: Test graceful degradation
Service-Level Objectives (SLOs)
Define Success Metrics
Example SLOs:
• App availability: 99.9% uptime
• Crash-free sessions: 99.0%
• Launch time p99: <2 seconds
• API response p95: <3 seconds
• Memory p95: <500MB
SLOs help teams prioritize reliability work and measure progress.
Alerting Strategy
Best Practices for Alerts
- Alert on symptoms, not causes: Alert on high error rate, not on specific error types
- Include context: Provide dashboard links and runbooks in alerts
- Tune thresholds: Too strict = alert fatigue, too loose = missed issues
- Route appropriately: Critical issues to on-call, non-critical to Slack
- Review regularly: Remove alerts that never fire or always fire
Incident Response
On-Call Workflow
- 1. Detect issue through alert or user reports
- 2. Page on-call engineer
- 3. Acknowledge incident
- 4. Gather information (logs, metrics, crash reports)
- 5. Identify root cause
- 6. Implement hotfix or rollback
- 7. Monitor metrics return to normal
- 8. Post-mortem and prevention plan
App Launch Performance
Cold Start vs Warm Start:
Cold Start (app not in memory): 700-2000ms typical
├─ Process creation: 100-200ms
├─ System framework init: 300-500ms
├─ App initialization: 200-800ms
└─ First screen render: 100-500ms
Target: Cold start <2 seconds, Warm start <500ms. Monitor both p50 and p99 latencies.
Network Performance Monitoring
Key Network Metrics:
- • DNS lookup: <100ms target
- • TCP connection: <200ms target
- • TLS handshake: <200ms target
- • Server processing: <1s target
- • Total request: <2s target (p95)
Handling Various Networks: Adapt your app to WiFi, cellular 4G/5G, and offline conditions. Implement timeout increases for slow networks.
Rendering and UI Performance
Frame Rate Monitoring: Target 60 FPS for smooth experience. Track dropped frames and jank.
// iOS - Monitor frame rate
class FrameRateMonitor {
func startMonitoring() {
displayLink = CADisplayLink(
target: self,
selector: #selector(update)
)
displayLink?.preferredFramesPerSecond = 60
displayLink?.add(to: .main, forMode: .common)
}
}
Monitor list/scroll performance with virtualization and efficient rendering strategies.
Memory and Battery Monitoring
Memory Usage Targets:
- • Memory p95: <500MB
- • Detect memory leaks with baseline comparison
- • Monitor heap pressure and GC events
Battery Impact Analysis: Track battery drain percentage per hour. Identify features that consume excessive power (GPS, Bluetooth, continuous networking).
Building Observable Apps
Observable apps capture rich context at every layer:
// Add automatic context to all logs
enrichedProperties["session_id"] = SessionManager.current.id
enrichedProperties["user_id"] = AuthManager.current.userId
enrichedProperties["app_version"] = Bundle.main.appVersion
enrichedProperties["device_model"] = UIDevice.current.model
enrichedProperties["os_version"] = UIDevice.current.systemVersion
enrichedProperties["network_type"] = NetworkMonitor.current.type
enrichedProperties["battery_percent"] = UIDevice.current.batteryLevel
Log with correlation IDs to trace requests across client and server boundaries.
Debugging with Observability
When users report issues, observability helps diagnose quickly:
Example: App crashes during payment
Step 1: Find crashes in dashboard (245 affected users)
Step 2: Get metrics context (90% on iPhone 12, iOS 17.2, 5x increase)
Step 3: Get logs (network timeout, state error, user action)
Step 4: Get trace context (App → API → Payment Service timeout)
Root Cause: API timeout doesn't clear payment state
Fix: Clear payment state on timeout, show retry UI
Best Practices
- Monitor in production: Lab tests don't catch real-world issues
- Watch percentiles: p95/p99 matter more than averages
- Track regressions: Compare against baseline metrics
- Correlate metrics: High memory often causes crashes
- Build dashboards: Make metrics visible to the team
- On-call rotation: Fair distribution of incident response
- Performance budgets: Enforce guardrails in CI/CD
- Regular reviews: Monthly analysis of trends and patterns
Getting Started
- 1. Choose a monitoring platform (Logtrics, Firebase, DataDog, New Relic)
- 2. Define your target SLOs
- 3. Instrument critical user flows
- 4. Set up dashboards for key metrics
- 5. Create alerts for SLO violations
- 6. Build on-call runbooks
- 7. Train team on monitoring and alerting
Conclusion
Mobile app monitoring is essential for building reliable products. By tracking performance metrics, setting SLOs, implementing intelligent alerting, and practicing incident response, you ensure your app runs smoothly for millions of users in production.