feat(monitoring): add Redis exporter + Sentry docs to deployment guide
Some checks failed
Some checks failed
- Add redis-exporter container to docker-compose (oliver006/redis_exporter, 32MB) - Add Redis scrape target to Prometheus config - Add 4 Redis alert rules: RedisDown, HighMemory, HighConnections, RejectedConnections - Document Step 19b (Sentry Error Tracking) in Hetzner deployment guide - Document Step 19c (Redis Monitoring) in Hetzner deployment guide - Update resource budget and port reference tables Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -191,15 +191,15 @@ Component Structure:
|
||||
return {
|
||||
// ✅ CRITICAL: Inherit base layout state
|
||||
...data(),
|
||||
|
||||
|
||||
// ✅ CRITICAL: Set page identifier
|
||||
currentPage: 'dashboard',
|
||||
|
||||
|
||||
// Page-specific state
|
||||
loading: false,
|
||||
error: null,
|
||||
stats: [],
|
||||
|
||||
|
||||
// Initialization
|
||||
async init() {
|
||||
// Guard against multiple initialization
|
||||
@@ -208,10 +208,10 @@ Component Structure:
|
||||
return;
|
||||
}
|
||||
window._dashboardInitialized = true;
|
||||
|
||||
|
||||
await this.loadStats();
|
||||
},
|
||||
|
||||
|
||||
// Data loading
|
||||
async loadStats() {
|
||||
this.loading = true;
|
||||
@@ -294,22 +294,22 @@ init-alpine.js provides:
|
||||
// Theme state
|
||||
dark: localStorage.getItem('theme') === 'dark',
|
||||
toggleTheme() { /* ... */ },
|
||||
|
||||
|
||||
// Side menu state
|
||||
isSideMenuOpen: false,
|
||||
toggleSideMenu() { /* ... */ },
|
||||
closeSideMenu() { /* ... */ },
|
||||
|
||||
|
||||
// Profile menu state
|
||||
isProfileMenuOpen: false,
|
||||
toggleProfileMenu() { /* ... */ },
|
||||
closeProfileMenu() { /* ... */ },
|
||||
|
||||
|
||||
// Notifications menu state
|
||||
isNotificationsMenuOpen: false,
|
||||
toggleNotificationsMenu() { /* ... */ },
|
||||
closeNotificationsMenu() { /* ... */ },
|
||||
|
||||
|
||||
// Page identifier (override in each page)
|
||||
currentPage: ''
|
||||
};
|
||||
@@ -320,7 +320,7 @@ Your page inherits ALL of this:
|
||||
return {
|
||||
...data(), // ← Spreads all base functionality
|
||||
currentPage: 'stores', // ← Override page identifier
|
||||
|
||||
|
||||
// Your page-specific state
|
||||
stores: [],
|
||||
loading: false
|
||||
@@ -446,10 +446,10 @@ Pattern:
|
||||
dashLog.warn('Already initialized, skipping...');
|
||||
return; // Exit early
|
||||
}
|
||||
|
||||
|
||||
// Set flag BEFORE async operations
|
||||
window._dashboardInitialized = true;
|
||||
|
||||
|
||||
// Safe to proceed
|
||||
await this.loadData();
|
||||
}
|
||||
@@ -485,7 +485,7 @@ Pre-configured Loggers:
|
||||
Usage:
|
||||
// Use pre-configured logger
|
||||
const dashLog = window.LogConfig.loggers.dashboard;
|
||||
|
||||
|
||||
dashLog.info('Dashboard loading...');
|
||||
dashLog.error('Failed to load stats', error);
|
||||
dashLog.debug('Stats data:', statsData);
|
||||
@@ -497,13 +497,13 @@ Advanced Features:
|
||||
dashLog.info('Fetching stats...');
|
||||
dashLog.info('Fetching activity...');
|
||||
dashLog.groupEnd();
|
||||
|
||||
|
||||
// API call logging
|
||||
window.LogConfig.logApiCall('GET', url, data, 'response');
|
||||
|
||||
|
||||
// Performance logging
|
||||
window.LogConfig.logPerformance('Load Stats', duration);
|
||||
|
||||
|
||||
// Error logging
|
||||
window.LogConfig.logError(error, 'Load Stats');
|
||||
|
||||
@@ -527,16 +527,16 @@ CRITICAL: Always use lowercase 'apiClient'
|
||||
|
||||
Usage:
|
||||
const data = await apiClient.get('/api/v1/admin/stores');
|
||||
|
||||
|
||||
await apiClient.post('/api/v1/admin/stores', {
|
||||
name: 'New Store',
|
||||
code: 'NEWSTORE'
|
||||
});
|
||||
|
||||
|
||||
await apiClient.put('/api/v1/admin/stores/123', {
|
||||
name: 'Updated Name'
|
||||
});
|
||||
|
||||
|
||||
await apiClient.delete('/api/v1/admin/stores/123');
|
||||
|
||||
Features:
|
||||
|
||||
Reference in New Issue
Block a user