- Add .env.backup with full application configuration template - Create RequestIDMiddleware for trace ID injection in logs - Implement ARQ fallback pool for Redis unavailability - Add Dead Letter Queue module for failed job handling - Include project ROADMAP with audit and 27 applied corrections - Add Grafana monitoring dashboard with 10 panels
201 lines
5.2 KiB
JSON
201 lines
5.2 KiB
JSON
{
|
|
"dashboard": {
|
|
"title": "Imago — Monitoring",
|
|
"uid": "imago",
|
|
"tags": ["imago", "fastapi"],
|
|
"timezone": "browser",
|
|
"schemaVersion": 38,
|
|
"refresh": "30s",
|
|
"panels": [
|
|
{
|
|
"id": 1,
|
|
"title": "Images Uploaded (rate)",
|
|
"type": "stat",
|
|
"gridPos": {"x": 0, "y": 0, "w": 6, "h": 4},
|
|
"targets": [
|
|
{
|
|
"expr": "rate(hub_images_uploaded_total[5m]) * 60",
|
|
"legendFormat": "uploads/min"
|
|
}
|
|
],
|
|
"fieldConfig": {
|
|
"defaults": {
|
|
"unit": "short",
|
|
"color": {"mode": "palette-classic"},
|
|
"thresholds": {"steps": [{"color": "green", "value": null}]}
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"id": 2,
|
|
"title": "AI Tokens Consumed (rate)",
|
|
"type": "stat",
|
|
"gridPos": {"x": 6, "y": 0, "w": 6, "h": 4},
|
|
"targets": [
|
|
{
|
|
"expr": "rate(hub_ai_tokens_consumed_total[5m]) * 60",
|
|
"legendFormat": "tokens/min"
|
|
}
|
|
],
|
|
"fieldConfig": {
|
|
"defaults": {
|
|
"unit": "short",
|
|
"color": {"mode": "palette-classic"},
|
|
"thresholds": {"steps": [{"color": "blue", "value": null}]}
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"id": 3,
|
|
"title": "Active WebSockets",
|
|
"type": "stat",
|
|
"gridPos": {"x": 12, "y": 0, "w": 6, "h": 4},
|
|
"targets": [
|
|
{
|
|
"expr": "hub_active_websockets",
|
|
"legendFormat": "connections"
|
|
}
|
|
],
|
|
"fieldConfig": {
|
|
"defaults": {
|
|
"unit": "short",
|
|
"color": {"mode": "palette-classic"},
|
|
"thresholds": {"steps": [{"color": "purple", "value": null}]}
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"id": 4,
|
|
"title": "ARQ Jobs",
|
|
"type": "stat",
|
|
"gridPos": {"x": 18, "y": 0, "w": 6, "h": 4},
|
|
"targets": [
|
|
{
|
|
"expr": "rate(hub_arq_jobs_enqueued_total[5m]) * 60",
|
|
"legendFormat": "jobs/min"
|
|
}
|
|
],
|
|
"fieldConfig": {
|
|
"defaults": {
|
|
"unit": "short",
|
|
"color": {"mode": "palette-classic"},
|
|
"thresholds": {"steps": [{"color": "orange", "value": null}]}
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"id": 5,
|
|
"title": "Pipeline Duration",
|
|
"type": "heatmap",
|
|
"gridPos": {"x": 0, "y": 4, "w": 12, "h": 8},
|
|
"targets": [
|
|
{
|
|
"expr": "rate(hub_pipeline_duration_seconds_bucket[5m])",
|
|
"legendFormat": "{{le}}s"
|
|
}
|
|
],
|
|
"fieldConfig": {
|
|
"defaults": {
|
|
"unit": "s",
|
|
"color": {"mode": "scheme-classic"}
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"id": 6,
|
|
"title": "Pipeline Step Duration",
|
|
"type": "bargauge",
|
|
"gridPos": {"x": 12, "y": 4, "w": 12, "h": 8},
|
|
"targets": [
|
|
{
|
|
"expr": "avg(rate(hub_pipeline_step_duration_seconds_sum[5m]) / rate(hub_pipeline_step_duration_seconds_count[5m])) by (step)",
|
|
"legendFormat": "{{step}} avg"
|
|
}
|
|
],
|
|
"fieldConfig": {
|
|
"defaults": {
|
|
"unit": "s",
|
|
"color": {"mode": "palette-classic"}
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"id": 7,
|
|
"title": "Images Uploaded (total)",
|
|
"type": "timeseries",
|
|
"gridPos": {"x": 0, "y": 12, "w": 12, "h": 8},
|
|
"targets": [
|
|
{
|
|
"expr": "rate(hub_images_uploaded_total[30s])",
|
|
"legendFormat": "uploaded"
|
|
},
|
|
{
|
|
"expr": "rate(hub_images_deleted_total[30s])",
|
|
"legendFormat": "deleted"
|
|
}
|
|
],
|
|
"fieldConfig": {
|
|
"defaults": {
|
|
"unit": "short",
|
|
"color": {"mode": "palette-classic"}
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"id": 8,
|
|
"title": "Pipeline Errors",
|
|
"type": "timeseries",
|
|
"gridPos": {"x": 12, "y": 12, "w": 12, "h": 8},
|
|
"targets": [
|
|
{
|
|
"expr": "rate(hub_pipeline_errors_total[30s])",
|
|
"legendFormat": "{{step}}"
|
|
}
|
|
],
|
|
"fieldConfig": {
|
|
"defaults": {
|
|
"unit": "short",
|
|
"color": {"mode": "palette-classic"}
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"id": 9,
|
|
"title": "Storage Used by Client",
|
|
"type": "bargauge",
|
|
"gridPos": {"x": 0, "y": 20, "w": 12, "h": 8},
|
|
"targets": [
|
|
{
|
|
"expr": "hub_storage_used_bytes",
|
|
"legendFormat": "{{client_id}}"
|
|
}
|
|
],
|
|
"fieldConfig": {
|
|
"defaults": {
|
|
"unit": "decbytes",
|
|
"color": {"mode": "palette-classic"}
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"id": 10,
|
|
"title": "AI Tokens by Client & Model",
|
|
"type": "bargauge",
|
|
"gridPos": {"x": 12, "y": 20, "w": 12, "h": 8},
|
|
"targets": [
|
|
{
|
|
"expr": "rate(hub_ai_tokens_consumed_total[5m]) * 300",
|
|
"legendFormat": "{{client_id}}/{{model}}"
|
|
}
|
|
],
|
|
"fieldConfig": {
|
|
"defaults": {
|
|
"unit": "short",
|
|
"color": {"mode": "palette-classic"}
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|