Admin Monitoring Components
Monitoring-Components fuer Queue-Status, Collector-Jobs, YouTube Update Status, Google API Quota und Server-Gesundheit.
Admin/LogQueue/Index
Zentrale Queue- und Collector-Job-Verwaltung mit Suche, Filtern und Detail-Modals.
Route: /admin/log-queue
View: resources/views/livewire/admin/log-queue/index.blade.php
Location: app/Livewire/Admin/LogQueue/Index.php
Public Properties
| Property | Typ | Default | Beschreibung |
|---|---|---|---|
$queueFilter | string | '' | Queue-Name Filter |
$queuePerPage | int | 25 | Eintraege pro Seite (Queue) |
$queueSearch | string | '' | Suche in Queue-Payload/Queue-Name |
$queueStatus | string | 'queued' | 'queued' oder 'failed' |
$collectorStatus | string | 'all' | Collector-Job Status Filter |
$collectorSource | string | 'all' | Plattform-Filter ('all', 'youtube', 'instagram') |
$collectorErrorCode | string | 'all' | Error-Code Filter (mit Detail-Varianten) |
$collectorPerPage | int | 25 | Eintraege pro Seite (Collector) |
$collectorSearch | string | '' | Suche in Collector-Jobs |
$showLogModal | bool | false | Collector-Log-Detail Modal |
$showFailedJobModal | bool | false | Failed-Job-Detail Modal |
$showDeleteQueueModal | bool | false | Queue-Job-Loeschen Modal |
$showDeleteCollectorModal | bool | false | Collector-Job-Loeschen Modal |
$selectedLogJobId | string|null | null | Ausgewaehlter Collector-Job |
$selectedFailedJobId | int|null | null | Ausgewaehlter Failed-Job |
$deleteQueueJobId | int|null | null | Queue-Job zum Loeschen |
$deleteCollectorJobId | string|null | null | Collector-Job zum Loeschen |
Queue Actions
| Method | Beschreibung |
|---|---|
confirmDeleteQueueJob(int $id) | Queue-Job-Loeschung vorbereiten |
deleteQueueJob() | Queue-Job aus jobs-Tabelle loeschen |
retryFailedQueueJob(int $id) | Failed Job via queue:retry erneut einreihen |
showFailedQueueJobDetails(int $id) | Exception + Payload Modal oeffnen |
closeFailedJobModal() | Failed-Job Modal schliessen |
Collector Actions
| Method | Beschreibung |
|---|---|
showLogDetails(string $id) | Collector-Job Detail Modal oeffnen |
closeLogModal() | Log-Modal schliessen |
confirmDeleteCollectorJob(string $id) | Collector-Job-Loeschung vorbereiten |
deleteCollectorJob() | Queued Collector-Job loeschen |
cancelCollectorJob(string $id) | Collector-Job als failed markieren |
prioritizeCollectorJob(string $id) | Priority auf max+1 setzen |
retryCollectorJob(string $id) | Failed Job zurueck auf queued setzen |
Plattform-Filter für Collector-Jobs
Die collectorSource-Property ermoeglicht das Filtern von Collector-Jobs nach Plattform. Der Filter wird über ein Dropdown-Menu ("Plattform") in der UI angesteuert:
- 'all' (Standard) — Zeigt alle Collector-Jobs unabhängig von der Plattform
- 'youtube' — Zeigt nur YouTube Collector-Jobs
- 'instagram' — Zeigt nur Instagram Collector-Jobs
Die verfuegbaren Plattform-Optionen werden dynamisch aus der Datenbank geladen (collectorSourceOptions) und in der render()-Methode an die View uebergeben.
Verhalten beim Filter-Wechsel: Wenn der Plattform-Filter aendert wird (via updatingCollectorSource()), wird die Error-Code-Filterung automatisch auf 'all' zurückgesetzt, um veraltete Filter-Kombinationen zu vermeiden.
YouTube Link Support für fehlgeschlagene Collector-Jobs
Für fehlgeschlagene Collector-Jobs (Status: 'failed') werden Plattform-spezifische Links angezeigt:
- Instagram-Jobs: Der extrahierte Handle wird als Link zu
https://www.instagram.com/{handle}formatiert - YouTube-Jobs: Der extrahierte Handle wird als Link zu
https://www.youtube.com/@{handle}formatiert
Für aktive oder abgeschlossene Jobs wird der Handle nur als Text angezeigt (ohne Link). Die Link-Generierung erfolgt in der index.blade.php basierend auf dem Job-Status und der Plattform-Source.
Location: app/Livewire/Admin/LogQueue/Index.php (PHP-Logik), resources/views/livewire/admin/log-queue/index.blade.php (Blade-Template, Zeilen 84–101)
Mail Flood Guard
| Method | Beschreibung |
|---|---|
toggleMailPause() | Mailversand pausieren/fortsetzen |
mailStatus (Computed) | per_minute, per_hour, paused, Schwellenwerte, 24h-Stats |
Queue-Filter-Optionen
Feste Liste von bekannten Queues (immer sichtbar):
ai-detection, default, emails, imports-instagram,
imports-youtube, imports-youtube-priority,
imports-youtube-video, imports-youtube-video-priority,
instagram-related-profiles, youtube-related-channels
Error-Code-Filter (Collector)
Error-Codes werden dynamisch aus der DB geladen. Fuer parse_error und scrape_error werden zusaetzliche Detail-Varianten angeboten:
parse_error|not_found-- Profil nicht gefundenscrape_error|status_520-- Cloudflare Error 520scrape_error|status_522-- Cloudflare Error 522scrape_error|tab_edited-- Tab-Edit Fehler
Admin/LogQueue/QueueMetricsChart
Eigenstaendige Chart-Komponente fuer Collector-Job-Metriken in 15-Minuten-Intervallen.
View: resources/views/livewire/admin/log-queue/queue-metrics-chart.blade.php
Location: app/Livewire/Admin/LogQueue/QueueMetricsChart.php
Public Properties
| Property | Typ | Default | Beschreibung |
|---|---|---|---|
$platform | string | 'all' | Plattform-Filter (all, youtube, instagram) |
$range | string | '1d' | Zeitraum (1d, 7d, 1m, 1q, 1y) |
$status | string | 'all' | Status-Filter (all, total, queued, completed, error) |
$rangeEndDate | string|null | null | End-Datum fuer Navigation |
$chartData | array | [] | Berechnete Chart-Daten |
$chartMax | int | 0 | Maximum Y-Achse |
$canGoPrevious | bool | false | Vorheriger Zeitraum verfuegbar |
$canGoNext | bool | false | Naechster Zeitraum verfuegbar |
Zeigt Collector-Job-Zaehler aggregiert in 15-Minuten-Buckets. Farbcodierte Serien: Total (blau), Queued (lila), Completed (gruen), Error (rot).
Queued-Breakdown nach Plattform
Bei Filter platform=all und status=all oder status=queued werden zusaetzliche Breakdown-Linien angezeigt:
| Linie | Farbe | Bedingung |
|---|---|---|
| YouTube Total | Rose | platform=all + status=all |
| Queued YouTube | Sky-Blue | platform=all + status=all oder queued |
| Queued Instagram | Amber | platform=all + status=all oder queued |
Die Breakdown-Daten werden per separater Query aus der queue_metrics-Tabelle geladen (platform=youtube/instagram, status=queued). Ermoeglicht Diagnose von Imbalancen zwischen YouTube- und Instagram-Queue-Last.
Zeitraum-Navigation
Der Chart unterstuetzt Vor-/Zurueck-Navigation ueber Pfeiltasten. Bucket-Groessen passen sich dem Zeitraum an:
| Zeitraum | Bucket-Groesse |
|---|---|
| 1 Tag | 15 Minuten |
| 7 Tage | 15 Minuten |
| 1 Monat | 60 Minuten |
| 1 Quartal | 6 Stunden |
| 1 Jahr | 12 Stunden |
Admin/UpdateStatus/Index
Container-Component fuer YouTube + Instagram Update-Status + Daily Pipeline Monitor.
Route: /admin/update-status
Location: app/Livewire/Admin/UpdateStatus/Index.php
Einbettung der plattformspezifischen Sub-Components + Pipeline Monitor:
Admin/UpdateStatus/DailyPipelineStatus
Tages-Pipeline-Monitor: Zeigt den Fortschritt aller 16 Pipeline-Schritte als uebersichtliches Dashboard.
View: resources/views/livewire/admin/update-status/daily-pipeline-status.blade.php
Location: app/Livewire/Admin/UpdateStatus/DailyPipelineStatus.php
Public Properties
| Property | Typ | Default | Beschreibung |
|---|---|---|---|
$date | string | today | Aktuelles Datum (YYYY-MM-DD, UTC) |
$showComparison | bool | false | 7-Tage-Vergleich anzeigen |
$showDependencies | bool | false | Dependency-Chain anzeigen |
$retryingStep | string|null | null | Step der gerade retried wird (Loading-State) |
Computed Properties
| Property | Cache | Beschreibung |
|---|---|---|
groupedSteps | 5 Min (Service-Cache) | Pipeline-Schritte gruppiert nach collection/data_quality/processing/maintenance |
overallProgress | 5 Min | {total, completed, running, failed, percentage} |
comparisonData | 5 Min | 7-Tage-Vergleich (nur wenn showComparison = true) |
stepDefinitions | — | Step-Definitionen fuer Dependency-Visualisierung |
isToday | — | Ob das ausgewaehlte Datum heute ist |
Actions
| Method | Beschreibung |
|---|---|
previousDay() | Zum vorherigen Tag navigieren |
nextDay() | Zum naechsten Tag (max. heute) |
goToToday() | Zurueck auf heute springen |
refresh() | Cache leeren und neu laden |
toggleComparison() | 7-Tage-Vergleich ein/ausblenden |
toggleDependencies() | Dependency-Chain ein/ausblenden |
retryStep(string $stepKey) | Pipeline-Schritt via Artisan::queue() erneut ausfuehren |
canRetry(string $stepKey) | Pruefen ob Retry fuer diesen Step moeglich ist |
Pipeline-Schritte (16 Steps, 4 Gruppen)
| Gruppe | Step Key | Label | Schedule | Depends On |
|---|---|---|---|---|
| Collection | youtube_scrape | YouTube Scrape | 09:00 | — |
| Collection | instagram_scrape | Instagram Scrape | 00:00 | — |
| Collection | video_sync | Video Sync | 14:00 | — |
| Data Quality | metrics_completeness | Metrics Coverage | 03:00 | youtube_scrape, instagram_scrape |
| Processing | dashboard_rollup | Dashboard Rollup | 03:00 | — |
| Processing | leaderboard_rollup | Leaderboards | 03:00 | dashboard_rollup |
| Processing | global_leaderboard_rollup | Global Leaderboards | 03:00 | dashboard_rollup |
| Processing | scores_calculate | Postbox Scores | 03:00 | — |
| Processing | explore_metrics | Explore Metrics | 03:00 | — |
| Processing | tag_cache | Tag Cache | 03:00 | scores_calculate, explore_metrics |
| Processing | public_explorer_refresh | Explorer Refresh | 03:00 | tag_cache |
| Processing | sitemap_generate | Sitemap | 07:30 | public_explorer_refresh |
| Processing | trending_videos | Trending Videos | 03:00 | video_sync |
| Processing | youtube_video_scores | Video Scores | 21:00 | video_sync |
| Maintenance | profile_retry | Profile Retry | 22:00 | — |
| Maintenance | profile_sanitize | Profile Sanitizer | 03:30 | — |
Datenfluss
graph TD
A["PipelineStatusService"] -->|"getStatusForDate()"| B["Cache 5min/1h"]
B --> C["DailyPipelineStatus Component"]
C --> D["Grouped Cards 4 Gruppen"]
C --> E["7-Tage-Vergleich"]
C --> F["Dependency-Chain"]
G["PipelineStepCompleted Event"] -->|"Reverb Admin-Channel"| C
C -->|"retryStep()"| H["Artisan::queue()"]
A -->|"persistRuns()"| I["pipeline_runs Tabelle"]
Status-Logik
| Status | Icon | Farbe | Bedingung |
|---|---|---|---|
completed | ✅ | Gruen | Heartbeat frisch ODER pipeline_runs completed ODER Model-Daten vorhanden |
running | 🔄 | Blau | Fortschritt < 100% |
stalled | ⚠️ | Amber | Collection >2h ohne Fortschritt ODER Metrics-Coverage unter Schwellwert |
scheduled | ⏳ | Grau | Aktuelle Uhrzeit < geplante Zeit |
overdue | ⚠️ | Amber | >30min ueberfaellig, kein Heartbeat, kein pipeline_run |
failed | ❌ | Rot | Historisch: nicht ausgefuehrt |
waiting | ⏸️ | Grau | Vorgaenger-Step nicht fertig |
Deployment-Resilienz
Die Pipeline-Status-Erkennung ist resilient gegenueber Cache-Clears (z.B. php artisan cache:clear bei Deployments):
- Heartbeat-Fallback: Wenn
cron:heartbeat:{key}fehlt, wirdpipeline_runs-Tabelle als Fallback geprueft — auch fuer den heutigen Tag - Model-Daten als Beweis:
scores_calculate,explore_metricsundvideo_syncpruefen direkt Model-Daten (z.B.SocialProfileScore,ExploreProfileMetric,YouTubeVideoSync) als Ausfuehrungs-Beweis - Downgrade-Schutz:
PipelineRun::recordStep()verhindert, dass ein "completed"-Record mit einem schlechteren Status (z.B. "overdue") ueberschrieben wird
Retry-Mechanismus
Retry nutzt Artisan::queue() statt Artisan::call(), um HTTP-Timeouts bei langlaeufeigen Commands zu vermeiden. Alle Pipeline-Schritte ausser metrics_completeness (Soft-Check) sind retryable (Mapping in RETRY_COMMANDS). Retry nur fuer das aktuelle Datum moeglich.
WebSocket-Integration
Lauscht auf PipelineStepCompleted-Events ueber den admin-Channel (Reverb). Bei Event-Empfang: Cache invalidieren + Component neu rendern. Alpine.js-Subscription nur wenn isToday = true.
Phase 3 Sub-Step Isolation
Phase 3 von pipeline:run (Trending Flags, Trending Videos, Categories, Tag Cache, Explorer Refresh) fuehrt jeden Sub-Step in einem eigenen try/catch aus. Dadurch blockiert ein Fehler in z.B. calculateTrendingVideos() nicht mehr die nachfolgenden Steps (Tag Cache, Explorer Refresh). Dies ist kritisch, weil sitemap:generate von einem frischen public_explorer_refresh Heartbeat abhaengt.
Bei Fehlern werden alle Failures gesammelt und als Warning geloggt ("Phase 3 completed with failures"). Heartbeats werden pro Sub-Step individuell geschrieben.
Datenquellen (Fallback-Hierarchie)
Pro Step wird in folgender Reihenfolge geprueft:
- Cache Heartbeats:
cron:heartbeat:{key}— primaere Quelle, gesetzt nach Command-Ausfuehrung - Model-Daten (step-spezifisch):
DailySyncRun(YouTube),CollectorJob(Instagram),YouTubeVideoSync,SocialProfileScore,ExploreProfileMetric pipeline_runs-Tabelle: Persistierter Status — Fallback bei Cache-Clear (fuer heute UND historisch)- Schedule-Logik:
buildScheduledOrOverdue()— letzte Stufe wenn keine Daten vorhanden
Location: app/Livewire/Admin/UpdateStatus/DailyPipelineStatus.php, app/Services/Pipeline/PipelineStatusService.php
Admin/LogQueue/YoutubeUpdateStatus
YouTube Update-Status: Zeigt wie viele Profile heute noch aktualisiert werden muessen, Quota-Status, Rotations-Breakdown und Queue-Button mit 4h-Cooldown.
Bereiche:
- Profil-Breakdown: PRO, Leaders, Candidates, Favoriten, Neue, Catch-Up, Rotation, Low-Priority
- Quota-Status: Verbrauch, Limit, Fortschrittsbalken (gruen/gelb/rot)
- Action-Button: Profile in Queue einreihen (mit Cooldown)
- YouTube Research Import: Aggregierte Statistiken der letzten 30 Tage fuer Admin-Workspace-Imports (Runs, Queries, Dispatcht, Hinzugefuegt, Duplikate, Fehlgeschlagen). Bei Failures Recovery-Hinweis mit
imports:retry-failed --source=researchCommand.
Location: app/Livewire/Admin/LogQueue/YoutubeUpdateStatus.php
Admin/UpdateStatus/InstagramUpdateStatus
Instagram Scrape-Status: Letzter Lauf, Queue-Tiefe, Error-Rate.
Location: app/Livewire/Admin/UpdateStatus/InstagramUpdateStatus.php
Admin/GoogleApiUsage/Index
Google API Quota Dashboard fuer konfigurierte Cloud-Projekte.
Route: /admin/google-api-usage
View: resources/views/livewire/admin/google-api-usage/index.blade.php
Location: app/Livewire/Admin/GoogleApiUsage/Index.php
Autorisierung: Gate::allows('admin') in mount()
Public Properties
| Property | Typ | Default | Beschreibung |
|---|---|---|---|
$isRefreshing | bool | false | Refresh in progress |
Actions
| Method | Beschreibung |
|---|---|
refreshData() | google:sync-api-usage Command synchron ausfuehren |
Datenquellen
GoogleApiQuotaLimit: Quota-Limits pro Projekt/Service/MetrikGoogleApiQuotaUsage: Heutige Nutzung (Pacific Time-Tag) pro Quota-MetrikYouTubeQuotaGuard: Circuit Breaker Status + QuotaGuard-Metriken (cache-basiert)- Config:
config('google_api_usage.service'),config('google_api_usage.projects')
Quota-Cards zeigen: Metrik-Name, Einheit (daily/per-minute), Verbrauch, Limit, Remaining, Prozent. Sortierung: Daily-Limits zuerst, dann Per-Minute, dann Per-Minute-Per-User.