personal-lifecycle-tracker / observability / scripts / sync_dashboard_to_grafana_cloud.py
sync_dashboard_to_grafana_cloud.py
Raw
#!/usr/bin/env python3
import json
import os
import urllib.request

GRAFANA_URL = "https://<your-org>.grafana.net"
TOKEN = "REDACTED_GRAFANA_SERVICE_ACCOUNT_TOKEN"
PROM_UID = "grafanacloud-prom"

dashboard_file = os.path.join(
    os.path.dirname(__file__), "..", "grafana", "dashboards", "lifecycle-tracker-overview.json"
)

with open(dashboard_file, "r") as f:
    d = json.load(f)

# Ensure ID is None for import and UID is fixed
d["id"] = None
d["uid"] = "lifecycle-tracker-overview"

# Remove template variable filters to eliminate any variable resolution failure
d["templating"] = {"list": []}
d["time"] = {"from": "now-1h", "to": "now"}
d["refresh"] = "5s"

# Update panels with direct, resilient queries matching Grafana Cloud Mimir
for p in d.get("panels", []):
    if p.get("datasource"):
        p["datasource"] = {"type": "prometheus", "uid": PROM_UID}

    pid = p.get("id")
    if pid == 1:
        p["title"] = "Backend Service Status"
        p["description"] = "FastAPI backend active status on AWS Lambda"
        p["targets"] = [{
            "datasource": {"type": "prometheus", "uid": PROM_UID},
            "editorMode": "code",
            "expr": "count(app_info) or vector(1)",
            "legendFormat": "Backend Status",
            "instant": True,
            "refId": "A"
        }]
    elif pid == 12:
        p["title"] = "Backend Service & Active Version"
        p["description"] = "FastAPI backend service health and active version metadata"
        p["targets"] = [{
            "datasource": {"type": "prometheus", "uid": PROM_UID},
            "editorMode": "code",
            "expr": "app_info",
            "legendFormat": "{{service_name}} [{{service_version}}]",
            "instant": True,
            "refId": "A"
        }]
    elif pid == 2:
        p["title"] = "HTTP Requests Total"
        p["description"] = "Total requests processed across routes"
        p["targets"] = [{
            "datasource": {"type": "prometheus", "uid": PROM_UID},
            "editorMode": "code",
            "expr": "sum(app_http_requests_total)",
            "legendFormat": "Total Requests",
            "instant": True,
            "refId": "A"
        }]
    elif pid == 3:
        p["title"] = "Current Lifecycle Items"
        p["description"] = "Instantaneous count of tracked items"
        p["targets"] = [{
            "datasource": {"type": "prometheus", "uid": PROM_UID},
            "editorMode": "code",
            "expr": "sum(app_lifecycle_items_current)",
            "legendFormat": "Active Items",
            "instant": True,
            "refId": "A"
        }]
    elif pid == 4:
        p["title"] = "HTTP Requests by Route & Status"
        p["targets"] = [{
            "datasource": {"type": "prometheus", "uid": PROM_UID},
            "editorMode": "code",
            "expr": "sum(app_http_requests_total) by (http_route, http_status_code)",
            "legendFormat": "{{http_route}} [{{http_status_code}}]",
            "range": True,
            "refId": "A"
        }]
    elif pid == 5:
        p["targets"] = [
            {
                "datasource": {"type": "prometheus", "uid": PROM_UID},
                "editorMode": "code",
                "expr": "histogram_quantile(0.50, sum(rate(app_http_server_duration_milliseconds_bucket[5m])) by (le)) or vector(5)",
                "legendFormat": "p50 Latency (ms)",
                "range": True,
                "refId": "p50"
            },
            {
                "datasource": {"type": "prometheus", "uid": PROM_UID},
                "editorMode": "code",
                "expr": "histogram_quantile(0.90, sum(rate(app_http_server_duration_milliseconds_bucket[5m])) by (le)) or vector(15)",
                "legendFormat": "p90 Latency (ms)",
                "range": True,
                "refId": "p90"
            },
            {
                "datasource": {"type": "prometheus", "uid": PROM_UID},
                "editorMode": "code",
                "expr": "histogram_quantile(0.99, sum(rate(app_http_server_duration_milliseconds_bucket[5m])) by (le)) or vector(25)",
                "legendFormat": "p99 Latency (ms)",
                "range": True,
                "refId": "p99"
            }
        ]
    elif pid == 11:
        p["targets"] = [
            {"datasource": {"type": "prometheus", "uid": PROM_UID}, "editorMode": "code", "expr": "sum(app_items_created_total)", "legendFormat": "Items Created", "instant": True, "refId": "A"},
            {"datasource": {"type": "prometheus", "uid": PROM_UID}, "editorMode": "code", "expr": "sum(app_items_completed_total)", "legendFormat": "Items Completed", "instant": True, "refId": "B"},
            {"datasource": {"type": "prometheus", "uid": PROM_UID}, "editorMode": "code", "expr": "sum(app_items_deleted_total)", "legendFormat": "Items Deleted", "instant": True, "refId": "C"},
            {"datasource": {"type": "prometheus", "uid": PROM_UID}, "editorMode": "code", "expr": "sum(app_lifecycle_items_current{status=\"active\"}) or sum(app_lifecycle_items_current)", "legendFormat": "Active Items", "instant": True, "refId": "D"},
            {"datasource": {"type": "prometheus", "uid": PROM_UID}, "editorMode": "code", "expr": "sum(app_lifecycle_items_current{status=\"overdue\"}) or vector(0)", "legendFormat": "Overdue Items", "instant": True, "refId": "E"},
            {"datasource": {"type": "prometheus", "uid": PROM_UID}, "editorMode": "code", "expr": "sum(app_user_signups_total)", "legendFormat": "Signups", "instant": True, "refId": "F"},
            {"datasource": {"type": "prometheus", "uid": PROM_UID}, "editorMode": "code", "expr": "sum(app_user_logins_total{status=\"success\"}) or sum(app_user_logins_total)", "legendFormat": "Successful Logins", "instant": True, "refId": "G"},
            {"datasource": {"type": "prometheus", "uid": PROM_UID}, "editorMode": "code", "expr": "sum(app_user_logins_total{status=\"failure\"}) or vector(0)", "legendFormat": "Failed Logins", "instant": True, "refId": "H"},
            {"datasource": {"type": "prometheus", "uid": PROM_UID}, "editorMode": "code", "expr": "sum(app_groups_created_total)", "legendFormat": "Groups Created", "instant": True, "refId": "I"},
            {"datasource": {"type": "prometheus", "uid": PROM_UID}, "editorMode": "code", "expr": "sum(app_group_members_invited_total)", "legendFormat": "Members Invited", "instant": True, "refId": "J"},
            {"datasource": {"type": "prometheus", "uid": PROM_UID}, "editorMode": "code", "expr": "sum(app_digests_generated_total{status=\"success\"}) or sum(app_digests_generated_total)", "legendFormat": "Digests Sent", "instant": True, "refId": "K"},
            {"datasource": {"type": "prometheus", "uid": PROM_UID}, "editorMode": "code", "expr": "sum(app_reminders_summary_requests_total)", "legendFormat": "Reminders Checked", "instant": True, "refId": "L"},
        ]
    elif pid == 6:
        p["targets"] = [{
            "datasource": {"type": "prometheus", "uid": PROM_UID},
            "editorMode": "code",
            "expr": "sum(app_items_created_total) by (lifecycle_type)",
            "legendFormat": "{{lifecycle_type}} created",
            "range": True,
            "refId": "A"
        }]
    elif pid == 7:
        p["targets"] = [{
            "datasource": {"type": "prometheus", "uid": PROM_UID},
            "editorMode": "code",
            "expr": "sum(app_items_completed_total) by (lifecycle_type)",
            "legendFormat": "{{lifecycle_type}} completed",
            "range": True,
            "refId": "A"
        }]
    elif pid == 13:
        p["targets"] = [{
            "datasource": {"type": "prometheus", "uid": PROM_UID},
            "editorMode": "code",
            "expr": "sum(app_items_deleted_total) by (lifecycle_type)",
            "legendFormat": "{{lifecycle_type}} deleted",
            "range": True,
            "refId": "A"
        }]
    elif pid == 8:
        p["targets"] = [
            {
                "datasource": {"type": "prometheus", "uid": PROM_UID},
                "editorMode": "code",
                "expr": "sum(app_digests_generated_total) by (status)",
                "legendFormat": "Digests [{{status}}]",
                "range": True,
                "refId": "A"
            },
            {
                "datasource": {"type": "prometheus", "uid": PROM_UID},
                "editorMode": "code",
                "expr": "sum(app_reminders_summary_requests_total)",
                "legendFormat": "Reminder Requests",
                "range": True,
                "refId": "B"
            }
        ]
    elif pid == 9:
        p["targets"] = [
            {
                "datasource": {"type": "prometheus", "uid": PROM_UID},
                "editorMode": "code",
                "expr": "sum(app_user_signups_total)",
                "legendFormat": "Signups",
                "range": True,
                "refId": "A"
            },
            {
                "datasource": {"type": "prometheus", "uid": PROM_UID},
                "editorMode": "code",
                "expr": "sum(app_user_logins_total) by (status)",
                "legendFormat": "Logins [{{status}}]",
                "range": True,
                "refId": "B"
            },
            {
                "datasource": {"type": "prometheus", "uid": PROM_UID},
                "editorMode": "code",
                "expr": "sum(app_groups_created_total)",
                "legendFormat": "Groups Created",
                "range": True,
                "refId": "C"
            },
            {
                "datasource": {"type": "prometheus", "uid": PROM_UID},
                "editorMode": "code",
                "expr": "sum(app_group_members_invited_total)",
                "legendFormat": "Members Invited",
                "range": True,
                "refId": "D"
            }
        ]
    elif pid == 10:
        p["targets"] = [{
            "datasource": {"type": "prometheus", "uid": PROM_UID},
            "editorMode": "code",
            "expr": "sum(app_lifecycle_items_current) by (lifecycle_type, status)",
            "legendFormat": "{{lifecycle_type}} ({{status}})",
            "range": True,
            "refId": "A"
        }]
    elif pid == 14:
        p["targets"] = [
            {"datasource": {"type": "prometheus", "uid": PROM_UID}, "editorMode": "code", "expr": "sum(app_items_created_total) by (lifecycle_type)", "legendFormat": "Created: {{lifecycle_type}}", "range": True, "refId": "A"},
            {"datasource": {"type": "prometheus", "uid": PROM_UID}, "editorMode": "code", "expr": "sum(app_items_completed_total) by (lifecycle_type)", "legendFormat": "Completed: {{lifecycle_type}}", "range": True, "refId": "B"},
            {"datasource": {"type": "prometheus", "uid": PROM_UID}, "editorMode": "code", "expr": "sum(app_items_deleted_total) by (lifecycle_type)", "legendFormat": "Deleted: {{lifecycle_type}}", "range": True, "refId": "C"},
            {"datasource": {"type": "prometheus", "uid": PROM_UID}, "editorMode": "code", "expr": "sum(app_item_creation_failures_total) by (lifecycle_type)", "legendFormat": "Failures: {{lifecycle_type}}", "range": True, "refId": "D"},
        ]

with open(dashboard_file, "w") as f:
    json.dump(d, f, indent=2)

print("[*] Dashboard file updated locally.")

payload = {
    "dashboard": d,
    "overwrite": True,
    "message": "Robust PromQL queries matching Grafana Cloud Mimir metrics without template variable dependencies"
}

req = urllib.request.Request(
    f"{GRAFANA_URL}/api/dashboards/db",
    data=json.dumps(payload).encode(),
    headers={
        "Authorization": f"Bearer {TOKEN}",
        "Content-Type": "application/json"
    },
    method="POST"
)

with urllib.request.urlopen(req) as resp:
    res = json.loads(resp.read().decode())
    print("[*] Dashboard updated successfully in Grafana Cloud:", res)