Monitoring & Fehlerüberwachung¶
Errors-Seite¶
Seite:
app/errors/page.tsx(143 Zeilen) API:app/api/errors/route.ts(74 Zeilen) Pfad:/errors
Übersicht¶
Zeigt fehlgeschlagene Buy Intents und User-Error-Logs mit Error-Aggregation der letzten 7 Tage.
Error-Aggregation (Top 20)¶
SELECT error_code, COUNT(*) as count,
MAX(COALESCE(failed_at, created_at)) as last_occurrence
FROM buy_intents
WHERE status = 'FAILED'
AND created_at > now() - interval '7 days'
GROUP BY error_code
ORDER BY count DESC
LIMIT 20
Failed Buy Intents¶
SELECT intent_id, buyer, pool_id, tip_count, total_cost,
error_code, error_message, tx_hash, relayer_tx_hash,
created_at, failed_at
FROM buy_intents
WHERE status = 'FAILED'
ORDER BY COALESCE(failed_at, created_at) DESC
LIMIT $1 OFFSET $2
User Error Logs¶
SELECT id, wallet_address, error_code, error_message, action,
intent_id, tx_hash, created_at, resolved
FROM user_error_logs
ORDER BY created_at DESC
LIMIT $1 OFFSET $2
Watchdog¶
Seite:
app/watchdog/page.tsx(615 Zeilen) API:app/api/watchdog/route.ts(82 Zeilen) Pfad:/watchdog
Übersicht¶
Echtzeit-System-Health-Monitoring mit Alerts und Check-Historie. Auto-Refresh alle 30 Sekunden.
System-Checks¶
| Check-ID | Name | Kategorie |
|---|---|---|
| S2 | RPC Provider | On-Chain |
| C1 | Settlement Status | On-Chain |
| C4 | Relayer ETH | On-Chain |
| C5 | VRF Seed | On-Chain |
| D5 | DB Connection | Database |
| D1 | Stuck Intents | Database |
| D4 | Settlement Pipeline | Database |
| D6 | Stats Freshness | Database |
| S1 | App Health | Service |
Watchdog-Queries¶
-- Letzte 20 Runs
SELECT id, started_at, finished_at, checks_total,
checks_ok, checks_warn, checks_fail, duration_ms
FROM watchdog_runs
ORDER BY started_at DESC
LIMIT 20
-- Offene Alerts
SELECT id, check_id, level, message, details, alerted_at, notified
FROM watchdog_alerts
WHERE resolved_at IS NULL
ORDER BY alerted_at DESC
-- Letzte 50 Alerts
SELECT id, check_id, level, message, alerted_at, resolved_at, notified
FROM watchdog_alerts
ORDER BY alerted_at DESC
LIMIT 50
Status-Level¶
| Level | Farbe | Hex |
|---|---|---|
| CRITICAL | Rot | #ef4444 |
| HIGH | Amber | #f59e0b |
| MEDIUM | Blau | #3b82f6 |
| LOW/INFO | Grau | #6b7280 |
| OK | Grün | #22c55e |
Aufbau¶
┌──────────────────────────────────────────────┐
│ Status-Karten │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ Overall │ │Last Run │ │ Open │ │
│ │ HEALTHY │ │ 30s ago │ │ Alerts:2│ │
│ └─────────┘ └─────────┘ └─────────┘ │
├──────────────────────────────────────────────┤
│ System Checks Grid │
│ [S2 ✅] [C1 ✅] [C4 ⚠️] [C5 ✅] [D5 ✅] │
│ [D1 ✅] [D4 ✅] [D6 ✅] [S1 ✅] │
├──────────────────────────────────────────────┤
│ Open Alerts │
│ Check | Level | Message | Since │
├──────────────────────────────────────────────┤
│ Recent Alerts │
│ Check | Level | Message | Alerted | Resolved │
├──────────────────────────────────────────────┤
│ Run History │
│ ID | Started | Duration | OK | Warn | Fail │
└──────────────────────────────────────────────┘
Workers & Cron-Jobs¶
Seite:
app/workers/page.tsx(389 Zeilen) API:app/api/workers/route.ts(130 Zeilen) Pfad:/workers
Übersicht¶
Monitor für Cron-Jobs, RPC-Verbindungen und Maintenance-Mode. RPC-Status Auto-Refresh alle 15 Sekunden.
Registrierte Worker¶
| Worker | Schedule | Beschreibung | Log-Pfad |
|---|---|---|---|
| updatePotSizes | */15 * * * * |
Pot-Größen von On-Chain aktualisieren | /var/log/update-pot-sizes.log |
| cron-settle | 0 0 * * * |
Täglicher Settlement-Prozessor | bo-engine/logs/settlement/ |
| awardAffiliateBonus (12:00) | 0 12 * * * |
Affiliate-Bonus Mittag | /var/log/affiliate-bonus.log |
| awardAffiliateBonus (00:30) | 30 0 * * * |
Affiliate-Bonus nach Settlement | /var/log/affiliate-bonus.log |
| awardLeaderboardBonus | 0 1 1 * * |
Monatlicher Leaderboard-Bonus | /var/log/leaderboard-bonus.log |
Worker-Status-Erkennung¶
- Log-Dateien: Letzte 30 Zeilen für Vorschau, 100 für Detailansicht
- Settlement-Logs: Verzeichnis-Scan für neueste
settle-*.log - Health-Indikatoren:
- Grün: Letzte Änderung < 24h
- Amber: Letzte Änderung > 24h
- Rot: Nie ausgeführt
Maintenance-Mode¶
-- Status abfragen
SELECT stat_value FROM chain_stats WHERE stat_key = 'maintenance_mode'
-- Umschalten
UPDATE chain_stats SET stat_value = $1, updated_at = NOW()
WHERE stat_key = 'maintenance_mode'
- Werte:
1= aktiv (Käufe blockiert),0= inaktiv - Toggle mit Bestätigungsdialog auf der Workers-Seite
RPC-Verbindungen¶
- Monitoring via
hostundssShell-Befehle - Anzeige aktiver Verbindungen zum RPC-Provider
Seeds / VRF-Monitor¶
Seite:
app/seeds/page.tsx(294 Zeilen) API:app/api/seeds/route.ts(112 Zeilen) Pfad:/seeds
Übersicht¶
Monitor für VRF- und Drand-Seed-Status, Ticket-Counter und Seed-Update-Historie. Auto-Refresh alle 30 Sekunden.
On-Chain-Abfragen¶
GameManager-Contract:
| Funktion | Rückgabe | Beschreibung |
|---|---|---|
vrfSeed() |
uint256 | Aktueller VRF-Seed |
drandSeed() |
uint256 | Aktueller Drand-Seed |
vrfTicketCounter() |
uint256 | Ticket-Zähler seit letztem Seed |
vrfTicketSoftThreshold() |
uint256 | Schwellwert für Seed-Rotation |
VRFReceiver-Contract:
| Funktion | Rückgabe | Beschreibung |
|---|---|---|
lastVrfSeed() |
uint256 | Letzter empfangener VRF-Seed |
fulfilledTimestamp() |
uint256 | Zeitpunkt der Chainlink-Lieferung |
Seed-Update-Historie¶
SELECT id, seed_type, seed_value, trigger_info, tx_hash, created_at
FROM seed_updates
ORDER BY created_at DESC
LIMIT 20
Seed-Alter-Indikatoren¶
| Alter | Farbe | Bedeutung |
|---|---|---|
| < 30 Min | Grün | Aktuell |
| 30-90 Min | Amber | Warnung |
| ≥ 90 Min | Rot | Veraltet |
Worker-Status¶
- Prüfung ob
refreshSeeds-Daemon läuft (PID-Check) - TX-Links zum Explorer (Arbiscan)
Test Players¶
Seite:
app/testplayers/page.tsx(133 Zeilen) API:app/api/testplayers/route.ts(57 Zeilen) Pfad:/testplayers
Übersicht¶
Monitor für den Test-Player Bulk-Buy-Cron-Job (stündlich 02:00-22:00 UTC, 1 Ticket pro Spieler pro Lauf).
Log-Dateien¶
| Log | Pfad | Inhalt |
|---|---|---|
| Balance Alerts | bo-engine/logs/bulk-buy/alerts.log |
Balance-Warnungen |
| Run Log | bo-engine/logs/bulk-buy/bulk-buy-*.log |
Tägliche Ausführungslogs |
Aufbau¶
- Zwei Tabs: "Balance Alerts" und "Run Log (today)"
- Scrollbare Log-Anzeige (500px max. Höhe)
- Letzte Änderungszeitstempel
- Refresh-Button pro Tab