Implement comprehensive logging, metrics collection, error tracking, and a debug panel for Obsidian plugins.
| Metric | Type | Purpose |
|---|---|---|
| Command execution time | Timer | Performance tracking |
| File operations count | Counter | Usage patterns |
| Error rate | Counter | Reliability |
| Cache hit ratio | Gauge | Efficiency |
| Memory usage | Gauge | Resource health |
Create a Logger class with levels (debug/info/warn/error), history buffer, formatted output, and timing helpers.
Build MetricsCollector with counters, gauges, and timers. Add timeAsync() wrapper for measuring function duration with percentile stats (p95).
Create ErrorTracker that deduplicates errors by name+message, counts occurrences, and provides wrapAsync() for safe error capture.
Register a sidebar view (dev mode only) that auto-refreshes every 5 seconds showing counters, timer stats, recent errors, and log history. Add export button for downloadable JSON debug bundle.
Initialize logger, metrics, and error tracker in onload(). Wrap commands with metrics timing. Track command usage with counters.
See detailed implementation for complete Logger, MetricsCollector, ErrorTracker, DebugView classes and CSS styles.
| Issue | Cause | Solution |
|---|---|---|
| Too much logging | Debug level in prod | Set level to 'error' in production |
| Memory growth | Unbounded history | Limit history to 100 entries |
| Performance impact | Sync logging | Use async patterns for file logging |
| Missing context | No error tracking | Wrap async calls with errorTracker |
const endTimer = logger.time('my-operation');
await doExpensiveWork();
endTimer(); // Logs: [plugin-id] my-operation (245.32ms)
For incident response, see obsidian-incident-runbook.