upleb.uk

Public git repos — served from a NIP-34 GRASP relay at git.upleb.uk

summaryrefslogtreecommitdiff
path: root/docs/grafana
diff options
context:
space:
mode:
authorDanConwayDev <DanConwayDev@protonmail.com>2025-12-04 15:17:04 +0000
committerDanConwayDev <DanConwayDev@protonmail.com>2025-12-04 15:24:19 +0000
commitfd0c87c787d0626b3546fa571541c9c809711821 (patch)
tree934f20d973127f380b807d2bd44b25c197cf349c /docs/grafana
parent762cd8e815e797f173f541795de774fbbf978fc3 (diff)
add prometheus metrics
Diffstat (limited to 'docs/grafana')
-rw-r--r--docs/grafana/ngit-grasp-dashboard.json675
1 files changed, 675 insertions, 0 deletions
diff --git a/docs/grafana/ngit-grasp-dashboard.json b/docs/grafana/ngit-grasp-dashboard.json
new file mode 100644
index 0000000..bd1b6fe
--- /dev/null
+++ b/docs/grafana/ngit-grasp-dashboard.json
@@ -0,0 +1,675 @@
1{
2 "annotations": {
3 "list": []
4 },
5 "editable": true,
6 "fiscalYearStartMonth": 0,
7 "graphTooltip": 0,
8 "id": null,
9 "links": [],
10 "liveNow": false,
11 "panels": [
12 {
13 "collapsed": false,
14 "gridPos": { "h": 1, "w": 24, "x": 0, "y": 0 },
15 "id": 1,
16 "title": "Overview",
17 "type": "row"
18 },
19 {
20 "datasource": { "type": "prometheus", "uid": "${datasource}" },
21 "fieldConfig": {
22 "defaults": {
23 "color": { "mode": "thresholds" },
24 "mappings": [],
25 "thresholds": {
26 "mode": "absolute",
27 "steps": [
28 { "color": "green", "value": null },
29 { "color": "yellow", "value": 50 },
30 { "color": "red", "value": 100 }
31 ]
32 },
33 "unit": "short"
34 }
35 },
36 "gridPos": { "h": 4, "w": 4, "x": 0, "y": 1 },
37 "id": 2,
38 "options": {
39 "colorMode": "value",
40 "graphMode": "area",
41 "justifyMode": "auto",
42 "orientation": "auto",
43 "reduceOptions": { "calcs": ["lastNotNull"], "fields": "", "values": false },
44 "textMode": "auto"
45 },
46 "pluginVersion": "10.0.0",
47 "targets": [
48 {
49 "expr": "ngit_websocket_connections_active",
50 "legendFormat": "Active",
51 "refId": "A"
52 }
53 ],
54 "title": "Active Connections",
55 "type": "stat"
56 },
57 {
58 "datasource": { "type": "prometheus", "uid": "${datasource}" },
59 "fieldConfig": {
60 "defaults": {
61 "color": { "mode": "thresholds" },
62 "mappings": [],
63 "thresholds": {
64 "mode": "absolute",
65 "steps": [
66 { "color": "green", "value": null }
67 ]
68 },
69 "unit": "short"
70 }
71 },
72 "gridPos": { "h": 4, "w": 4, "x": 4, "y": 1 },
73 "id": 3,
74 "options": {
75 "colorMode": "value",
76 "graphMode": "none",
77 "justifyMode": "auto",
78 "orientation": "auto",
79 "reduceOptions": { "calcs": ["lastNotNull"], "fields": "", "values": false },
80 "textMode": "auto"
81 },
82 "targets": [
83 {
84 "expr": "ngit_websocket_unique_ips",
85 "legendFormat": "Unique IPs",
86 "refId": "A"
87 }
88 ],
89 "title": "Unique IPs",
90 "type": "stat"
91 },
92 {
93 "datasource": { "type": "prometheus", "uid": "${datasource}" },
94 "fieldConfig": {
95 "defaults": {
96 "color": { "mode": "thresholds" },
97 "mappings": [],
98 "thresholds": {
99 "mode": "absolute",
100 "steps": [
101 { "color": "green", "value": null },
102 { "color": "red", "value": 1 }
103 ]
104 },
105 "unit": "short"
106 }
107 },
108 "gridPos": { "h": 4, "w": 4, "x": 8, "y": 1 },
109 "id": 4,
110 "options": {
111 "colorMode": "value",
112 "graphMode": "none",
113 "justifyMode": "auto",
114 "orientation": "auto",
115 "reduceOptions": { "calcs": ["lastNotNull"], "fields": "", "values": false },
116 "textMode": "auto"
117 },
118 "targets": [
119 {
120 "expr": "ngit_websocket_flagged_abusers",
121 "legendFormat": "Flagged",
122 "refId": "A"
123 }
124 ],
125 "title": "Flagged Abusers",
126 "type": "stat"
127 },
128 {
129 "datasource": { "type": "prometheus", "uid": "${datasource}" },
130 "fieldConfig": {
131 "defaults": {
132 "color": { "mode": "thresholds" },
133 "mappings": [],
134 "thresholds": {
135 "mode": "absolute",
136 "steps": [{ "color": "blue", "value": null }]
137 },
138 "unit": "short"
139 }
140 },
141 "gridPos": { "h": 4, "w": 4, "x": 12, "y": 1 },
142 "id": 5,
143 "options": {
144 "colorMode": "value",
145 "graphMode": "none",
146 "justifyMode": "auto",
147 "orientation": "auto",
148 "reduceOptions": { "calcs": ["lastNotNull"], "fields": "", "values": false },
149 "textMode": "auto"
150 },
151 "targets": [
152 {
153 "expr": "ngit_repositories_total",
154 "legendFormat": "Repos",
155 "refId": "A"
156 }
157 ],
158 "title": "Total Repositories",
159 "type": "stat"
160 },
161 {
162 "datasource": { "type": "prometheus", "uid": "${datasource}" },
163 "fieldConfig": {
164 "defaults": {
165 "color": { "mode": "thresholds" },
166 "mappings": [],
167 "thresholds": {
168 "mode": "absolute",
169 "steps": [{ "color": "green", "value": null }]
170 },
171 "unit": "s"
172 }
173 },
174 "gridPos": { "h": 4, "w": 4, "x": 16, "y": 1 },
175 "id": 6,
176 "options": {
177 "colorMode": "value",
178 "graphMode": "none",
179 "justifyMode": "auto",
180 "orientation": "auto",
181 "reduceOptions": { "calcs": ["lastNotNull"], "fields": "", "values": false },
182 "textMode": "auto"
183 },
184 "targets": [
185 {
186 "expr": "ngit_uptime_seconds",
187 "legendFormat": "Uptime",
188 "refId": "A"
189 }
190 ],
191 "title": "Uptime",
192 "type": "stat"
193 },
194 {
195 "datasource": { "type": "prometheus", "uid": "${datasource}" },
196 "fieldConfig": {
197 "defaults": {
198 "color": { "mode": "thresholds" },
199 "mappings": [],
200 "thresholds": {
201 "mode": "absolute",
202 "steps": [{ "color": "purple", "value": null }]
203 },
204 "unit": "short"
205 }
206 },
207 "gridPos": { "h": 4, "w": 4, "x": 20, "y": 1 },
208 "id": 7,
209 "options": {
210 "colorMode": "value",
211 "graphMode": "none",
212 "justifyMode": "auto",
213 "orientation": "auto",
214 "reduceOptions": { "calcs": ["lastNotNull"], "fields": "", "values": false },
215 "textMode": "value_and_name"
216 },
217 "targets": [
218 {
219 "expr": "ngit_build_info",
220 "legendFormat": "{{version}}",
221 "refId": "A"
222 }
223 ],
224 "title": "Version",
225 "type": "stat"
226 },
227 {
228 "collapsed": false,
229 "gridPos": { "h": 1, "w": 24, "x": 0, "y": 5 },
230 "id": 10,
231 "title": "WebSocket Connections",
232 "type": "row"
233 },
234 {
235 "datasource": { "type": "prometheus", "uid": "${datasource}" },
236 "fieldConfig": {
237 "defaults": {
238 "color": { "mode": "palette-classic" },
239 "custom": {
240 "axisCenteredZero": false,
241 "axisColorMode": "text",
242 "axisLabel": "",
243 "axisPlacement": "auto",
244 "barAlignment": 0,
245 "drawStyle": "line",
246 "fillOpacity": 10,
247 "gradientMode": "none",
248 "hideFrom": { "legend": false, "tooltip": false, "viz": false },
249 "lineInterpolation": "linear",
250 "lineWidth": 1,
251 "pointSize": 5,
252 "scaleDistribution": { "type": "linear" },
253 "showPoints": "never",
254 "spanNulls": false,
255 "stacking": { "group": "A", "mode": "none" },
256 "thresholdsStyle": { "mode": "off" }
257 },
258 "mappings": [],
259 "thresholds": { "mode": "absolute", "steps": [] },
260 "unit": "short"
261 }
262 },
263 "gridPos": { "h": 8, "w": 12, "x": 0, "y": 6 },
264 "id": 11,
265 "options": {
266 "legend": { "calcs": [], "displayMode": "list", "placement": "bottom", "showLegend": true },
267 "tooltip": { "mode": "multi", "sort": "none" }
268 },
269 "targets": [
270 {
271 "expr": "ngit_websocket_connections_active",
272 "legendFormat": "Active Connections",
273 "refId": "A"
274 },
275 {
276 "expr": "ngit_websocket_unique_ips",
277 "legendFormat": "Unique IPs",
278 "refId": "B"
279 }
280 ],
281 "title": "Connections Over Time",
282 "type": "timeseries"
283 },
284 {
285 "datasource": { "type": "prometheus", "uid": "${datasource}" },
286 "fieldConfig": {
287 "defaults": {
288 "color": { "mode": "palette-classic" },
289 "custom": {
290 "axisCenteredZero": false,
291 "axisColorMode": "text",
292 "axisLabel": "",
293 "axisPlacement": "auto",
294 "barAlignment": 0,
295 "drawStyle": "line",
296 "fillOpacity": 10,
297 "gradientMode": "none",
298 "hideFrom": { "legend": false, "tooltip": false, "viz": false },
299 "lineInterpolation": "linear",
300 "lineWidth": 1,
301 "pointSize": 5,
302 "scaleDistribution": { "type": "linear" },
303 "showPoints": "never",
304 "spanNulls": false,
305 "stacking": { "group": "A", "mode": "none" },
306 "thresholdsStyle": { "mode": "off" }
307 },
308 "mappings": [],
309 "thresholds": { "mode": "absolute", "steps": [] },
310 "unit": "short"
311 }
312 },
313 "gridPos": { "h": 8, "w": 12, "x": 12, "y": 6 },
314 "id": 12,
315 "options": {
316 "legend": { "calcs": ["sum"], "displayMode": "table", "placement": "right", "showLegend": true },
317 "tooltip": { "mode": "multi", "sort": "none" }
318 },
319 "targets": [
320 {
321 "expr": "rate(ngit_websocket_messages_received_total[5m])",
322 "legendFormat": "Received: {{type}}",
323 "refId": "A"
324 },
325 {
326 "expr": "rate(ngit_websocket_messages_sent_total[5m])",
327 "legendFormat": "Sent: {{type}}",
328 "refId": "B"
329 }
330 ],
331 "title": "Message Rate (5m)",
332 "type": "timeseries"
333 },
334 {
335 "datasource": { "type": "prometheus", "uid": "${datasource}" },
336 "fieldConfig": {
337 "defaults": {
338 "color": { "mode": "palette-classic" },
339 "custom": { "hideFrom": { "legend": false, "tooltip": false, "viz": false } },
340 "mappings": [],
341 "unit": "s"
342 }
343 },
344 "gridPos": { "h": 8, "w": 12, "x": 0, "y": 14 },
345 "id": 13,
346 "options": {
347 "legend": { "displayMode": "list", "placement": "right", "showLegend": true },
348 "pieType": "pie",
349 "reduceOptions": { "calcs": ["lastNotNull"], "fields": "", "values": false },
350 "tooltip": { "mode": "single", "sort": "none" }
351 },
352 "targets": [
353 {
354 "expr": "histogram_quantile(0.5, rate(ngit_websocket_connection_duration_seconds_bucket[1h]))",
355 "legendFormat": "p50",
356 "refId": "A"
357 },
358 {
359 "expr": "histogram_quantile(0.95, rate(ngit_websocket_connection_duration_seconds_bucket[1h]))",
360 "legendFormat": "p95",
361 "refId": "B"
362 },
363 {
364 "expr": "histogram_quantile(0.99, rate(ngit_websocket_connection_duration_seconds_bucket[1h]))",
365 "legendFormat": "p99",
366 "refId": "C"
367 }
368 ],
369 "title": "Connection Duration Percentiles",
370 "type": "piechart"
371 },
372 {
373 "collapsed": false,
374 "gridPos": { "h": 1, "w": 24, "x": 0, "y": 22 },
375 "id": 20,
376 "title": "Git Operations",
377 "type": "row"
378 },
379 {
380 "datasource": { "type": "prometheus", "uid": "${datasource}" },
381 "fieldConfig": {
382 "defaults": {
383 "color": { "mode": "palette-classic" },
384 "custom": {
385 "axisCenteredZero": false,
386 "axisColorMode": "text",
387 "axisLabel": "",
388 "axisPlacement": "auto",
389 "barAlignment": 0,
390 "drawStyle": "bars",
391 "fillOpacity": 50,
392 "gradientMode": "none",
393 "hideFrom": { "legend": false, "tooltip": false, "viz": false },
394 "lineInterpolation": "linear",
395 "lineWidth": 1,
396 "pointSize": 5,
397 "scaleDistribution": { "type": "linear" },
398 "showPoints": "never",
399 "spanNulls": false,
400 "stacking": { "group": "A", "mode": "normal" },
401 "thresholdsStyle": { "mode": "off" }
402 },
403 "mappings": [],
404 "thresholds": { "mode": "absolute", "steps": [] },
405 "unit": "ops"
406 }
407 },
408 "gridPos": { "h": 8, "w": 12, "x": 0, "y": 23 },
409 "id": 21,
410 "options": {
411 "legend": { "calcs": ["sum"], "displayMode": "table", "placement": "right", "showLegend": true },
412 "tooltip": { "mode": "multi", "sort": "none" }
413 },
414 "targets": [
415 {
416 "expr": "rate(ngit_git_operations_total{status=\"success\"}[5m])",
417 "legendFormat": "{{operation}} (success)",
418 "refId": "A"
419 },
420 {
421 "expr": "rate(ngit_git_operations_total{status=\"error\"}[5m])",
422 "legendFormat": "{{operation}} (error)",
423 "refId": "B"
424 }
425 ],
426 "title": "Git Operations Rate (5m)",
427 "type": "timeseries"
428 },
429 {
430 "datasource": { "type": "prometheus", "uid": "${datasource}" },
431 "fieldConfig": {
432 "defaults": {
433 "color": { "mode": "palette-classic" },
434 "custom": {
435 "axisCenteredZero": false,
436 "axisColorMode": "text",
437 "axisLabel": "",
438 "axisPlacement": "auto",
439 "barAlignment": 0,
440 "drawStyle": "line",
441 "fillOpacity": 10,
442 "gradientMode": "none",
443 "hideFrom": { "legend": false, "tooltip": false, "viz": false },
444 "lineInterpolation": "linear",
445 "lineWidth": 1,
446 "pointSize": 5,
447 "scaleDistribution": { "type": "linear" },
448 "showPoints": "never",
449 "spanNulls": false,
450 "stacking": { "group": "A", "mode": "none" },
451 "thresholdsStyle": { "mode": "off" }
452 },
453 "mappings": [],
454 "thresholds": { "mode": "absolute", "steps": [] },
455 "unit": "bytes"
456 }
457 },
458 "gridPos": { "h": 8, "w": 12, "x": 12, "y": 23 },
459 "id": 22,
460 "options": {
461 "legend": { "calcs": ["sum"], "displayMode": "table", "placement": "right", "showLegend": true },
462 "tooltip": { "mode": "multi", "sort": "none" }
463 },
464 "targets": [
465 {
466 "expr": "rate(ngit_git_bytes_total[5m])",
467 "legendFormat": "{{direction}}",
468 "refId": "A"
469 }
470 ],
471 "title": "Git Bandwidth (5m)",
472 "type": "timeseries"
473 },
474 {
475 "datasource": { "type": "prometheus", "uid": "${datasource}" },
476 "fieldConfig": {
477 "defaults": {
478 "color": { "mode": "palette-classic" },
479 "custom": { "hideFrom": { "legend": false, "tooltip": false, "viz": false } },
480 "mappings": [],
481 "unit": "short"
482 },
483 "overrides": [
484 {
485 "matcher": { "id": "byName", "options": "denied" },
486 "properties": [{ "id": "color", "value": { "fixedColor": "red", "mode": "fixed" } }]
487 },
488 {
489 "matcher": { "id": "byName", "options": "allowed" },
490 "properties": [{ "id": "color", "value": { "fixedColor": "green", "mode": "fixed" } }]
491 }
492 ]
493 },
494 "gridPos": { "h": 8, "w": 6, "x": 0, "y": 31 },
495 "id": 23,
496 "options": {
497 "legend": { "displayMode": "list", "placement": "right", "showLegend": true },
498 "pieType": "pie",
499 "reduceOptions": { "calcs": ["sum"], "fields": "", "values": false },
500 "tooltip": { "mode": "single", "sort": "none" }
501 },
502 "targets": [
503 {
504 "expr": "increase(ngit_git_push_authorization_total[24h])",
505 "legendFormat": "{{result}}",
506 "refId": "A"
507 }
508 ],
509 "title": "Push Authorization (24h)",
510 "type": "piechart"
511 },
512 {
513 "datasource": { "type": "prometheus", "uid": "${datasource}" },
514 "fieldConfig": {
515 "defaults": {
516 "color": { "mode": "palette-classic" },
517 "mappings": [],
518 "thresholds": { "mode": "absolute", "steps": [{ "color": "green", "value": null }] },
519 "unit": "bytes"
520 }
521 },
522 "gridPos": { "h": 8, "w": 18, "x": 6, "y": 31 },
523 "id": 24,
524 "options": {
525 "displayMode": "gradient",
526 "minVizHeight": 10,
527 "minVizWidth": 0,
528 "orientation": "horizontal",
529 "reduceOptions": { "calcs": ["lastNotNull"], "fields": "", "values": false },
530 "showUnfilled": true,
531 "valueMode": "color"
532 },
533 "targets": [
534 {
535 "expr": "topk(10, ngit_git_top_repos_bytes)",
536 "legendFormat": "{{repo}}",
537 "refId": "A"
538 }
539 ],
540 "title": "Top Repositories by Bandwidth",
541 "type": "bargauge"
542 },
543 {
544 "collapsed": false,
545 "gridPos": { "h": 1, "w": 24, "x": 0, "y": 39 },
546 "id": 30,
547 "title": "Nostr Events",
548 "type": "row"
549 },
550 {
551 "datasource": { "type": "prometheus", "uid": "${datasource}" },
552 "fieldConfig": {
553 "defaults": {
554 "color": { "mode": "palette-classic" },
555 "custom": {
556 "axisCenteredZero": false,
557 "axisColorMode": "text",
558 "axisLabel": "",
559 "axisPlacement": "auto",
560 "barAlignment": 0,
561 "drawStyle": "line",
562 "fillOpacity": 10,
563 "gradientMode": "none",
564 "hideFrom": { "legend": false, "tooltip": false, "viz": false },
565 "lineInterpolation": "linear",
566 "lineWidth": 1,
567 "pointSize": 5,
568 "scaleDistribution": { "type": "linear" },
569 "showPoints": "never",
570 "spanNulls": false,
571 "stacking": { "group": "A", "mode": "none" },
572 "thresholdsStyle": { "mode": "off" }
573 },
574 "mappings": [],
575 "thresholds": { "mode": "absolute", "steps": [] },
576 "unit": "short"
577 }
578 },
579 "gridPos": { "h": 8, "w": 12, "x": 0, "y": 40 },
580 "id": 31,
581 "options": {
582 "legend": { "calcs": ["sum"], "displayMode": "table", "placement": "right", "showLegend": true },
583 "tooltip": { "mode": "multi", "sort": "none" }
584 },
585 "targets": [
586 {
587 "expr": "rate(ngit_events_received_total[5m])",
588 "legendFormat": "Kind {{kind}}",
589 "refId": "A"
590 }
591 ],
592 "title": "Events Received by Kind (5m)",
593 "type": "timeseries"
594 },
595 {
596 "datasource": { "type": "prometheus", "uid": "${datasource}" },
597 "fieldConfig": {
598 "defaults": {
599 "color": { "mode": "palette-classic" },
600 "custom": {
601 "axisCenteredZero": false,
602 "axisColorMode": "text",
603 "axisLabel": "",
604 "axisPlacement": "auto",
605 "barAlignment": 0,
606 "drawStyle": "line",
607 "fillOpacity": 10,
608 "gradientMode": "none",
609 "hideFrom": { "legend": false, "tooltip": false, "viz": false },
610 "lineInterpolation": "linear",
611 "lineWidth": 1,
612 "pointSize": 5,
613 "scaleDistribution": { "type": "linear" },
614 "showPoints": "never",
615 "spanNulls": false,
616 "stacking": { "group": "A", "mode": "none" },
617 "thresholdsStyle": { "mode": "off" }
618 },
619 "mappings": [],
620 "thresholds": { "mode": "absolute", "steps": [] },
621 "unit": "short"
622 }
623 },
624 "gridPos": { "h": 8, "w": 12, "x": 12, "y": 40 },
625 "id": 32,
626 "options": {
627 "legend": { "calcs": ["sum"], "displayMode": "table", "placement": "right", "showLegend": true },
628 "tooltip": { "mode": "multi", "sort": "none" }
629 },
630 "targets": [
631 {
632 "expr": "rate(ngit_events_stored_total[5m])",
633 "legendFormat": "Stored: Kind {{kind}}",
634 "refId": "A"
635 },
636 {
637 "expr": "rate(ngit_events_rejected_total[5m])",
638 "legendFormat": "Rejected: {{reason}}",
639 "refId": "B"
640 }
641 ],
642 "title": "Events Stored vs Rejected (5m)",
643 "type": "timeseries"
644 }
645 ],
646 "refresh": "30s",
647 "schemaVersion": 38,
648 "style": "dark",
649 "tags": ["ngit-grasp", "nostr", "git"],
650 "templating": {
651 "list": [
652 {
653 "current": { "selected": false, "text": "Prometheus", "value": "Prometheus" },
654 "hide": 0,
655 "includeAll": false,
656 "label": "Datasource",
657 "multi": false,
658 "name": "datasource",
659 "options": [],
660 "query": "prometheus",
661 "refresh": 1,
662 "regex": "",
663 "skipUrlSync": false,
664 "type": "datasource"
665 }
666 ]
667 },
668 "time": { "from": "now-6h", "to": "now" },
669 "timepicker": {},
670 "timezone": "browser",
671 "title": "ngit-grasp",
672 "uid": "ngit-grasp",
673 "version": 1,
674 "weekStart": ""
675} \ No newline at end of file