{
  "annotations": { "list": [] },
  "editable": true,
  "fiscalYearStartMonth": 0,
  "graphTooltip": 1,
  "links": [],
  "panels": [
    {
      "title": "Core Web Vitals — Overview",
      "type": "row",
      "gridPos": { "h": 1, "w": 24, "x": 0, "y": 0 },
      "collapsed": false
    },
    {
      "title": "LCP (Largest Contentful Paint)",
      "description": "Target: < 2.5s (good), < 4.0s (needs improvement)",
      "type": "gauge",
      "gridPos": { "h": 6, "w": 6, "x": 0, "y": 1 },
      "targets": [
        {
          "expr": "histogram_quantile(0.75, sum(rate(goodgo_web_vitals_lcp_seconds_bucket[5m])) by (le))",
          "legendFormat": "p75 LCP",
          "refId": "A"
        }
      ],
      "fieldConfig": {
        "defaults": {
          "unit": "s",
          "min": 0,
          "max": 10,
          "thresholds": {
            "mode": "absolute",
            "steps": [
              { "color": "green", "value": null },
              { "color": "yellow", "value": 2.5 },
              { "color": "red", "value": 4.0 }
            ]
          }
        }
      }
    },
    {
      "title": "FCP (First Contentful Paint)",
      "description": "Target: < 1.8s (good), < 3.0s (needs improvement)",
      "type": "gauge",
      "gridPos": { "h": 6, "w": 6, "x": 6, "y": 1 },
      "targets": [
        {
          "expr": "histogram_quantile(0.75, sum(rate(goodgo_web_vitals_fcp_seconds_bucket[5m])) by (le))",
          "legendFormat": "p75 FCP",
          "refId": "A"
        }
      ],
      "fieldConfig": {
        "defaults": {
          "unit": "s",
          "min": 0,
          "max": 5,
          "thresholds": {
            "mode": "absolute",
            "steps": [
              { "color": "green", "value": null },
              { "color": "yellow", "value": 1.8 },
              { "color": "red", "value": 3.0 }
            ]
          }
        }
      }
    },
    {
      "title": "CLS (Cumulative Layout Shift)",
      "description": "Target: < 0.1 (good), < 0.25 (needs improvement)",
      "type": "gauge",
      "gridPos": { "h": 6, "w": 6, "x": 12, "y": 1 },
      "targets": [
        {
          "expr": "histogram_quantile(0.75, sum(rate(goodgo_web_vitals_cls_bucket[5m])) by (le))",
          "legendFormat": "p75 CLS",
          "refId": "A"
        }
      ],
      "fieldConfig": {
        "defaults": {
          "unit": "none",
          "min": 0,
          "max": 1,
          "thresholds": {
            "mode": "absolute",
            "steps": [
              { "color": "green", "value": null },
              { "color": "yellow", "value": 0.1 },
              { "color": "red", "value": 0.25 }
            ]
          }
        }
      }
    },
    {
      "title": "TTFB (Time to First Byte)",
      "description": "Target: < 800ms (good)",
      "type": "gauge",
      "gridPos": { "h": 6, "w": 6, "x": 18, "y": 1 },
      "targets": [
        {
          "expr": "histogram_quantile(0.75, sum(rate(goodgo_web_vitals_ttfb_seconds_bucket[5m])) by (le))",
          "legendFormat": "p75 TTFB",
          "refId": "A"
        }
      ],
      "fieldConfig": {
        "defaults": {
          "unit": "s",
          "min": 0,
          "max": 5,
          "thresholds": {
            "mode": "absolute",
            "steps": [
              { "color": "green", "value": null },
              { "color": "yellow", "value": 0.8 },
              { "color": "red", "value": 1.8 }
            ]
          }
        }
      }
    },
    {
      "title": "Rating Distribution",
      "type": "row",
      "gridPos": { "h": 1, "w": 24, "x": 0, "y": 7 },
      "collapsed": false
    },
    {
      "title": "Web Vital Ratings (Good / Needs Improvement / Poor)",
      "type": "piechart",
      "gridPos": { "h": 8, "w": 8, "x": 0, "y": 8 },
      "targets": [
        {
          "expr": "sum(goodgo_web_vitals_total) by (rating)",
          "legendFormat": "{{rating}}",
          "refId": "A"
        }
      ],
      "fieldConfig": {
        "defaults": {},
        "overrides": [
          { "matcher": { "id": "byName", "options": "good" }, "properties": [{ "id": "color", "value": { "fixedColor": "green", "mode": "fixed" } }] },
          { "matcher": { "id": "byName", "options": "needs-improvement" }, "properties": [{ "id": "color", "value": { "fixedColor": "yellow", "mode": "fixed" } }] },
          { "matcher": { "id": "byName", "options": "poor" }, "properties": [{ "id": "color", "value": { "fixedColor": "red", "mode": "fixed" } }] }
        ]
      }
    },
    {
      "title": "Events by Vital Type",
      "type": "barchart",
      "gridPos": { "h": 8, "w": 8, "x": 8, "y": 8 },
      "targets": [
        {
          "expr": "sum(goodgo_web_vitals_total) by (name)",
          "legendFormat": "{{name}}",
          "refId": "A"
        }
      ],
      "fieldConfig": {
        "defaults": { "unit": "short" }
      }
    },
    {
      "title": "INP (Interaction to Next Paint)",
      "description": "Target: < 200ms (good), < 500ms (needs improvement)",
      "type": "gauge",
      "gridPos": { "h": 8, "w": 8, "x": 16, "y": 8 },
      "targets": [
        {
          "expr": "histogram_quantile(0.75, sum(rate(goodgo_web_vitals_inp_seconds_bucket[5m])) by (le))",
          "legendFormat": "p75 INP",
          "refId": "A"
        }
      ],
      "fieldConfig": {
        "defaults": {
          "unit": "s",
          "min": 0,
          "max": 1,
          "thresholds": {
            "mode": "absolute",
            "steps": [
              { "color": "green", "value": null },
              { "color": "yellow", "value": 0.2 },
              { "color": "red", "value": 0.5 }
            ]
          }
        }
      }
    },
    {
      "title": "Trends Over Time",
      "type": "row",
      "gridPos": { "h": 1, "w": 24, "x": 0, "y": 16 },
      "collapsed": false
    },
    {
      "title": "LCP Trend (p50 / p75 / p95)",
      "type": "timeseries",
      "gridPos": { "h": 8, "w": 12, "x": 0, "y": 17 },
      "targets": [
        {
          "expr": "histogram_quantile(0.50, sum(rate(goodgo_web_vitals_lcp_seconds_bucket[15m])) by (le))",
          "legendFormat": "p50",
          "refId": "A"
        },
        {
          "expr": "histogram_quantile(0.75, sum(rate(goodgo_web_vitals_lcp_seconds_bucket[15m])) by (le))",
          "legendFormat": "p75",
          "refId": "B"
        },
        {
          "expr": "histogram_quantile(0.95, sum(rate(goodgo_web_vitals_lcp_seconds_bucket[15m])) by (le))",
          "legendFormat": "p95",
          "refId": "C"
        }
      ],
      "fieldConfig": {
        "defaults": {
          "unit": "s",
          "custom": { "drawStyle": "line", "fillOpacity": 10, "pointSize": 5 },
          "thresholds": {
            "mode": "absolute",
            "steps": [
              { "color": "green", "value": null },
              { "color": "yellow", "value": 2.5 },
              { "color": "red", "value": 4.0 }
            ]
          }
        }
      }
    },
    {
      "title": "CLS Trend (p50 / p75 / p95)",
      "type": "timeseries",
      "gridPos": { "h": 8, "w": 12, "x": 12, "y": 17 },
      "targets": [
        {
          "expr": "histogram_quantile(0.50, sum(rate(goodgo_web_vitals_cls_bucket[15m])) by (le))",
          "legendFormat": "p50",
          "refId": "A"
        },
        {
          "expr": "histogram_quantile(0.75, sum(rate(goodgo_web_vitals_cls_bucket[15m])) by (le))",
          "legendFormat": "p75",
          "refId": "B"
        },
        {
          "expr": "histogram_quantile(0.95, sum(rate(goodgo_web_vitals_cls_bucket[15m])) by (le))",
          "legendFormat": "p95",
          "refId": "C"
        }
      ],
      "fieldConfig": {
        "defaults": {
          "unit": "none",
          "custom": { "drawStyle": "line", "fillOpacity": 10, "pointSize": 5 },
          "thresholds": {
            "mode": "absolute",
            "steps": [
              { "color": "green", "value": null },
              { "color": "yellow", "value": 0.1 },
              { "color": "red", "value": 0.25 }
            ]
          }
        }
      }
    },
    {
      "title": "TTFB Trend (p50 / p75 / p95)",
      "type": "timeseries",
      "gridPos": { "h": 8, "w": 12, "x": 0, "y": 25 },
      "targets": [
        {
          "expr": "histogram_quantile(0.50, sum(rate(goodgo_web_vitals_ttfb_seconds_bucket[15m])) by (le))",
          "legendFormat": "p50",
          "refId": "A"
        },
        {
          "expr": "histogram_quantile(0.75, sum(rate(goodgo_web_vitals_ttfb_seconds_bucket[15m])) by (le))",
          "legendFormat": "p75",
          "refId": "B"
        },
        {
          "expr": "histogram_quantile(0.95, sum(rate(goodgo_web_vitals_ttfb_seconds_bucket[15m])) by (le))",
          "legendFormat": "p95",
          "refId": "C"
        }
      ],
      "fieldConfig": {
        "defaults": {
          "unit": "s",
          "custom": { "drawStyle": "line", "fillOpacity": 10, "pointSize": 5 },
          "thresholds": {
            "mode": "absolute",
            "steps": [
              { "color": "green", "value": null },
              { "color": "yellow", "value": 0.8 },
              { "color": "red", "value": 1.8 }
            ]
          }
        }
      }
    },
    {
      "title": "INP Trend (p50 / p75 / p95)",
      "type": "timeseries",
      "gridPos": { "h": 8, "w": 12, "x": 12, "y": 25 },
      "targets": [
        {
          "expr": "histogram_quantile(0.50, sum(rate(goodgo_web_vitals_inp_seconds_bucket[15m])) by (le))",
          "legendFormat": "p50",
          "refId": "A"
        },
        {
          "expr": "histogram_quantile(0.75, sum(rate(goodgo_web_vitals_inp_seconds_bucket[15m])) by (le))",
          "legendFormat": "p75",
          "refId": "B"
        },
        {
          "expr": "histogram_quantile(0.95, sum(rate(goodgo_web_vitals_inp_seconds_bucket[15m])) by (le))",
          "legendFormat": "p95",
          "refId": "C"
        }
      ],
      "fieldConfig": {
        "defaults": {
          "unit": "s",
          "custom": { "drawStyle": "line", "fillOpacity": 10, "pointSize": 5 },
          "thresholds": {
            "mode": "absolute",
            "steps": [
              { "color": "green", "value": null },
              { "color": "yellow", "value": 0.2 },
              { "color": "red", "value": 0.5 }
            ]
          }
        }
      }
    },
    {
      "title": "Page Breakdown",
      "type": "row",
      "gridPos": { "h": 1, "w": 24, "x": 0, "y": 33 },
      "collapsed": false
    },
    {
      "title": "LCP by Page (p75)",
      "type": "table",
      "gridPos": { "h": 8, "w": 12, "x": 0, "y": 34 },
      "targets": [
        {
          "expr": "histogram_quantile(0.75, sum(rate(goodgo_web_vitals_lcp_seconds_bucket[1h])) by (le, page)) > 0",
          "legendFormat": "{{page}}",
          "refId": "A",
          "format": "table",
          "instant": true
        }
      ],
      "fieldConfig": {
        "defaults": { "unit": "s" }
      },
      "transformations": [
        { "id": "organize", "options": { "excludeByName": { "Time": true, "le": true } } }
      ]
    },
    {
      "title": "Vitals Event Rate",
      "type": "timeseries",
      "gridPos": { "h": 8, "w": 12, "x": 12, "y": 34 },
      "targets": [
        {
          "expr": "sum(rate(goodgo_web_vitals_total[5m])) by (name)",
          "legendFormat": "{{name}}",
          "refId": "A"
        }
      ],
      "fieldConfig": {
        "defaults": {
          "unit": "ops",
          "custom": { "drawStyle": "line", "fillOpacity": 10 }
        }
      }
    }
  ],
  "schemaVersion": 39,
  "tags": ["web-vitals", "rum", "frontend"],
  "templating": { "list": [] },
  "time": { "from": "now-6h", "to": "now" },
  "title": "Frontend Performance — Core Web Vitals",
  "uid": "goodgo-web-vitals",
  "version": 1
}
