This repository has no description
0

Configure Feed

Select the types of activity you want to include in your feed.

replica / docker / grafana / dashboards / replica.json
13 kB 271 lines
1{ 2 "annotations": { "list": [] }, 3 "editable": true, 4 "fiscalYearStartMonth": 0, 5 "graphTooltip": 1, 6 "links": [], 7 "panels": [ 8 { 9 "id": 13, 10 "type": "stat", 11 "title": "Repos left to sync", 12 "description": "Repos not yet mirrored: pending + resyncing + desynchronized + error. Parked/unavailable states (takendown, suspended, deactivated, deleted) are excluded since they can't be fetched until the account comes back. Drains to 0 as the first sync completes.", 13 "datasource": { "type": "prometheus", "uid": "prometheus" }, 14 "gridPos": { "h": 8, "w": 8, "x": 0, "y": 0 }, 15 "fieldConfig": { 16 "defaults": { 17 "color": { "mode": "thresholds" }, 18 "thresholds": { "mode": "absolute", "steps": [ { "color": "red", "value": null }, { "color": "green", "value": 0 } ] } 19 }, 20 "overrides": [] 21 }, 22 "options": { "colorMode": "value", "graphMode": "area", "justifyMode": "auto", "orientation": "auto", "textMode": "auto" }, 23 "targets": [ 24 { "expr": "sum(replica_repos_total{state=~\"pending|resyncing|desynchronized|error\"})", "legendFormat": "left to sync", "refId": "A" } 25 ] 26 }, 27 { 28 "id": 14, 29 "type": "gauge", 30 "title": "First sync progress", 31 "description": "Fraction of syncable repos that are now active. Denominator excludes parked/deleted states so a PDS with permanently-unavailable accounts can still reach 100%.", 32 "datasource": { "type": "prometheus", "uid": "prometheus" }, 33 "gridPos": { "h": 8, "w": 8, "x": 8, "y": 0 }, 34 "fieldConfig": { 35 "defaults": { 36 "color": { "mode": "thresholds" }, 37 "min": 0, 38 "max": 1, 39 "unit": "percentunit", 40 "thresholds": { "mode": "absolute", "steps": [ { "color": "red", "value": null }, { "color": "orange", "value": 0.5 }, { "color": "yellow", "value": 0.9 }, { "color": "green", "value": 0.99 } ] } 41 }, 42 "overrides": [] 43 }, 44 "options": { "showThresholdLabels": false, "showThresholdMarkers": true }, 45 "targets": [ 46 { "expr": "sum(replica_repos_total{state=\"active\"}) / sum(replica_repos_total{state=~\"pending|resyncing|active|desynchronized|error\"})", "legendFormat": "progress", "refId": "A" } 47 ] 48 }, 49 { 50 "id": 15, 51 "type": "stat", 52 "title": "Estimated time remaining", 53 "description": "Rough ETA based on the resync completion rate over the last hour. Inaccurate while throughput is stalled, rate-limited, or only a few workers are active. Treat as a guideline, not a deadline.", 54 "datasource": { "type": "prometheus", "uid": "prometheus" }, 55 "gridPos": { "h": 8, "w": 8, "x": 16, "y": 0 }, 56 "fieldConfig": { 57 "defaults": { 58 "color": { "mode": "thresholds" }, 59 "unit": "s", 60 "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": null }, { "color": "yellow", "value": 86400 }, { "color": "orange", "value": 604800 }, { "color": "red", "value": 2592000 } ] } 61 }, 62 "overrides": [] 63 }, 64 "options": { "colorMode": "value", "graphMode": "none", "justifyMode": "auto", "orientation": "auto", "textMode": "auto" }, 65 "targets": [ 66 { "expr": "sum(replica_repos_total{state=~\"pending|resyncing|desynchronized|error\"}) / clamp_min(sum(rate(replica_resyncs_completed_total[1h])), 0.00001)", "legendFormat": "eta", "refId": "A" } 67 ] 68 }, 69 { 70 "id": 1, 71 "type": "timeseries", 72 "title": "Repos by state", 73 "datasource": { "type": "prometheus", "uid": "prometheus" }, 74 "gridPos": { "h": 8, "w": 8, "x": 0, "y": 8 }, 75 "fieldConfig": { 76 "defaults": { 77 "custom": { "drawStyle": "line", "fillOpacity": 15, "stacking": { "mode": "normal" }, "showPoints": "never" }, 78 "min": 0 79 }, 80 "overrides": [] 81 }, 82 "options": { "legend": { "displayMode": "table", "placement": "right", "showLegend": true }, "tooltip": { "mode": "multi" } }, 83 "targets": [ 84 { "expr": "sum by (state) (replica_repos_total)", "legendFormat": "{{state}}", "refId": "A" } 85 ] 86 }, 87 { 88 "id": 2, 89 "type": "timeseries", 90 "title": "Firehose events/s by type", 91 "datasource": { "type": "prometheus", "uid": "prometheus" }, 92 "gridPos": { "h": 8, "w": 8, "x": 8, "y": 8 }, 93 "fieldConfig": { 94 "defaults": { "custom": { "drawStyle": "line", "fillOpacity": 15, "showPoints": "never" }, "min": 0 }, 95 "overrides": [] 96 }, 97 "options": { "legend": { "displayMode": "table", "placement": "right", "showLegend": true }, "tooltip": { "mode": "multi" } }, 98 "targets": [ 99 { "expr": "sum by (type) (rate(replica_firehose_events_received_total[$__rate_interval]))", "legendFormat": "{{type}}", "refId": "A" } 100 ] 101 }, 102 { 103 "id": 3, 104 "type": "timeseries", 105 "title": "Firehose cursor lag (seq)", 106 "description": "Gap between the newest event seen in memory and the last cursor persisted to the DB.", 107 "datasource": { "type": "prometheus", "uid": "prometheus" }, 108 "gridPos": { "h": 8, "w": 8, "x": 16, "y": 8 }, 109 "fieldConfig": { 110 "defaults": { "custom": { "drawStyle": "line", "fillOpacity": 15, "showPoints": "never" }, "min": 0 }, 111 "overrides": [] 112 }, 113 "options": { "legend": { "displayMode": "list", "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi" } }, 114 "targets": [ 115 { "expr": "replica_firehose_last_seq - replica_firehose_cursor_persisted_seq", "legendFormat": "cursor lag", "refId": "A" } 116 ] 117 }, 118 { 119 "id": 4, 120 "type": "timeseries", 121 "title": "CAR disk usage", 122 "datasource": { "type": "prometheus", "uid": "prometheus" }, 123 "gridPos": { "h": 8, "w": 8, "x": 0, "y": 16 }, 124 "fieldConfig": { 125 "defaults": { "custom": { "drawStyle": "line", "fillOpacity": 15, "showPoints": "never" }, "min": 0, "unit": "bytes" }, 126 "overrides": [] 127 }, 128 "options": { "legend": { "displayMode": "list", "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi" } }, 129 "targets": [ 130 { "expr": "replica_repos_disk_bytes", "legendFormat": "disk bytes", "refId": "A" } 131 ] 132 }, 133 { 134 "id": 5, 135 "type": "timeseries", 136 "title": "Firehose commits appended/s", 137 "datasource": { "type": "prometheus", "uid": "prometheus" }, 138 "gridPos": { "h": 8, "w": 8, "x": 8, "y": 16 }, 139 "fieldConfig": { 140 "defaults": { "custom": { "drawStyle": "line", "fillOpacity": 15, "showPoints": "never" }, "min": 0 }, 141 "overrides": [] 142 }, 143 "options": { "legend": { "displayMode": "list", "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi" } }, 144 "targets": [ 145 { "expr": "rate(replica_firehose_commits_appended_total[$__rate_interval])", "legendFormat": "commits/s", "refId": "A" }, 146 { "expr": "rate(replica_firehose_blocks_appended_total[$__rate_interval])", "legendFormat": "blocks/s", "refId": "B" } 147 ] 148 }, 149 { 150 "id": 6, 151 "type": "timeseries", 152 "title": "Firehose commit bytes/s", 153 "datasource": { "type": "prometheus", "uid": "prometheus" }, 154 "gridPos": { "h": 8, "w": 8, "x": 16, "y": 16 }, 155 "fieldConfig": { 156 "defaults": { "custom": { "drawStyle": "line", "fillOpacity": 15, "showPoints": "never" }, "min": 0, "unit": "Bps" }, 157 "overrides": [] 158 }, 159 "options": { "legend": { "displayMode": "list", "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi" } }, 160 "targets": [ 161 { "expr": "rate(replica_firehose_commit_bytes_total[$__rate_interval])", "legendFormat": "commit bytes/s", "refId": "A" } 162 ] 163 }, 164 { 165 "id": 7, 166 "type": "timeseries", 167 "title": "Resync outcomes/s", 168 "datasource": { "type": "prometheus", "uid": "prometheus" }, 169 "gridPos": { "h": 8, "w": 8, "x": 0, "y": 24 }, 170 "fieldConfig": { 171 "defaults": { "custom": { "drawStyle": "line", "fillOpacity": 15, "showPoints": "never" }, "min": 0 }, 172 "overrides": [] 173 }, 174 "options": { "legend": { "displayMode": "table", "placement": "right", "showLegend": true }, "tooltip": { "mode": "multi" } }, 175 "targets": [ 176 { "expr": "rate(replica_resyncs_completed_total[$__rate_interval])", "legendFormat": "completed", "refId": "A" }, 177 { "expr": "rate(replica_resyncs_failed_total[$__rate_interval])", "legendFormat": "failed", "refId": "B" }, 178 { "expr": "rate(replica_resyncs_rate_limited_total[$__rate_interval])", "legendFormat": "rate limited", "refId": "C" } 179 ] 180 }, 181 { 182 "id": 8, 183 "type": "timeseries", 184 "title": "Resync duration p50 / p95", 185 "datasource": { "type": "prometheus", "uid": "prometheus" }, 186 "gridPos": { "h": 8, "w": 8, "x": 8, "y": 24 }, 187 "fieldConfig": { 188 "defaults": { "custom": { "drawStyle": "line", "fillOpacity": 10, "showPoints": "never" }, "min": 0, "unit": "s" }, 189 "overrides": [] 190 }, 191 "options": { "legend": { "displayMode": "list", "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi" } }, 192 "targets": [ 193 { "expr": "histogram_quantile(0.50, rate(replica_resync_duration_seconds_bucket[$__rate_interval]))", "legendFormat": "p50", "refId": "A" }, 194 { "expr": "histogram_quantile(0.95, rate(replica_resync_duration_seconds_bucket[$__rate_interval]))", "legendFormat": "p95", "refId": "B" } 195 ] 196 }, 197 { 198 "id": 9, 199 "type": "stat", 200 "title": "Desyncs flagged", 201 "description": "Firehose + scrubber verification failures. Any non-zero value deserves attention.", 202 "datasource": { "type": "prometheus", "uid": "prometheus" }, 203 "gridPos": { "h": 8, "w": 8, "x": 16, "y": 24 }, 204 "fieldConfig": { 205 "defaults": { 206 "color": { "mode": "thresholds" }, 207 "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": null }, { "color": "red", "value": 1 } ] } 208 }, 209 "overrides": [] 210 }, 211 "options": { "colorMode": "background", "graphMode": "area", "justifyMode": "auto", "orientation": "auto", "textMode": "auto" }, 212 "targets": [ 213 { "expr": "replica_firehose_desync_total", "legendFormat": "firehose desyncs", "refId": "A" }, 214 { "expr": "replica_scrub_repos_flagged_total", "legendFormat": "scrub flagged", "refId": "B" } 215 ] 216 }, 217 { 218 "id": 10, 219 "type": "timeseries", 220 "title": "Scrub repos checked/s", 221 "datasource": { "type": "prometheus", "uid": "prometheus" }, 222 "gridPos": { "h": 8, "w": 8, "x": 0, "y": 32 }, 223 "fieldConfig": { 224 "defaults": { "custom": { "drawStyle": "line", "fillOpacity": 15, "showPoints": "never" }, "min": 0 }, 225 "overrides": [] 226 }, 227 "options": { "legend": { "displayMode": "list", "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi" } }, 228 "targets": [ 229 { "expr": "rate(replica_scrub_repos_checked_total[$__rate_interval])", "legendFormat": "checked/s", "refId": "A" } 230 ] 231 }, 232 { 233 "id": 11, 234 "type": "timeseries", 235 "title": "Repo state transitions/s", 236 "datasource": { "type": "prometheus", "uid": "prometheus" }, 237 "gridPos": { "h": 8, "w": 8, "x": 8, "y": 32 }, 238 "fieldConfig": { 239 "defaults": { "custom": { "drawStyle": "line", "fillOpacity": 15, "stacking": { "mode": "normal" }, "showPoints": "never" }, "min": 0 }, 240 "overrides": [] 241 }, 242 "options": { "legend": { "displayMode": "table", "placement": "right", "showLegend": true }, "tooltip": { "mode": "multi" } }, 243 "targets": [ 244 { "expr": "sum by (to) (rate(replica_repos_state_transitions_total[$__rate_interval]))", "legendFormat": "→ {{to}}", "refId": "A" } 245 ] 246 }, 247 { 248 "id": 12, 249 "type": "timeseries", 250 "title": "Firehose reconnects", 251 "datasource": { "type": "prometheus", "uid": "prometheus" }, 252 "gridPos": { "h": 8, "w": 8, "x": 16, "y": 32 }, 253 "fieldConfig": { 254 "defaults": { "custom": { "drawStyle": "line", "fillOpacity": 15, "showPoints": "never" }, "min": 0 }, 255 "overrides": [] 256 }, 257 "options": { "legend": { "displayMode": "list", "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi" } }, 258 "targets": [ 259 { "expr": "replica_firehose_reconnects_total", "legendFormat": "reconnects", "refId": "A" } 260 ] 261 } 262 ], 263 "refresh": "30s", 264 "schemaVersion": 39, 265 "tags": ["replica", "atproto", "pds"], 266 "time": { "from": "now-6h", "to": "now" }, 267 "timezone": "browser", 268 "title": "PDS Replica", 269 "uid": "replica-overview", 270 "version": 2 271}