@leverege/build-tools 2.104.0 → 2.105.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,2949 @@
1
+ {
2
+ "apiVersion": "dashboard.grafana.app/v2",
3
+ "kind": "Dashboard",
4
+ "metadata": {
5
+ "name": "vms-server",
6
+ "namespace": "default",
7
+ "uid": "EILZKxdyQ04itI2aTWQrX6notMxU03y4FN09cdi2SygX",
8
+ "resourceVersion": "1773762240000053",
9
+ "generation": 9,
10
+ "creationTimestamp": "2026-02-21T15:21:39Z",
11
+ "labels": {
12
+ "grafana.app/deprecatedInternalID": "13"
13
+ },
14
+ "annotations": {
15
+ "grafana.app/createdBy": "user:fepujy16x1ywwc",
16
+ "grafana.app/folder": "efgawspk5648wd",
17
+ "grafana.app/updatedBy": "user:fepujy16x1ywwc",
18
+ "grafana.app/updatedTimestamp": "2026-03-17T15:44:03Z",
19
+ "grafana.app/folderTitle": "Leverege CV",
20
+ "grafana.app/folderUrl": "/dashboards/f/efgawspk5648wd/leverege-cv"
21
+ }
22
+ },
23
+ "spec": {
24
+ "annotations": [
25
+ {
26
+ "kind": "AnnotationQuery",
27
+ "spec": {
28
+ "query": {
29
+ "kind": "DataQuery",
30
+ "group": "grafana",
31
+ "version": "v0",
32
+ "datasource": {
33
+ "name": "-- Grafana --"
34
+ },
35
+ "spec": {}
36
+ },
37
+ "enable": true,
38
+ "hide": true,
39
+ "iconColor": "rgba(0, 211, 255, 1)",
40
+ "name": "Annotations & Alerts",
41
+ "builtIn": true,
42
+ "legacyOptions": {
43
+ "type": "dashboard"
44
+ }
45
+ }
46
+ }
47
+ ],
48
+ "cursorSync": "Off",
49
+ "editable": true,
50
+ "elements": {
51
+ "panel-1": {
52
+ "kind": "Panel",
53
+ "spec": {
54
+ "id": 1,
55
+ "title": "Playlist Request Rate",
56
+ "description": "Number of M3U8 playlist requests per second. A sustained drop may indicate clients stopped polling or upstream connectivity issues.",
57
+ "links": [],
58
+ "data": {
59
+ "kind": "QueryGroup",
60
+ "spec": {
61
+ "queries": [
62
+ {
63
+ "kind": "PanelQuery",
64
+ "spec": {
65
+ "query": {
66
+ "kind": "DataQuery",
67
+ "group": "",
68
+ "version": "v0",
69
+ "spec": {
70
+ "expr": "rate(vms_playlist_requests_success[5m])",
71
+ "legendFormat": "success/s"
72
+ }
73
+ },
74
+ "refId": "A",
75
+ "hidden": false
76
+ }
77
+ }
78
+ ],
79
+ "transformations": [],
80
+ "queryOptions": {}
81
+ }
82
+ },
83
+ "vizConfig": {
84
+ "kind": "VizConfig",
85
+ "group": "timeseries",
86
+ "version": "",
87
+ "spec": {
88
+ "options": {},
89
+ "fieldConfig": {
90
+ "defaults": {
91
+ "unit": "reqps",
92
+ "min": 0
93
+ },
94
+ "overrides": []
95
+ }
96
+ }
97
+ }
98
+ }
99
+ },
100
+ "panel-10": {
101
+ "kind": "Panel",
102
+ "spec": {
103
+ "id": 10,
104
+ "title": "BigQuery Error Rate",
105
+ "description": "Rate of failed BigQuery queries per second. Errors here cause playlist generation to fail entirely. Any sustained non-zero value warrants investigation of GCP service health and credentials.",
106
+ "links": [],
107
+ "data": {
108
+ "kind": "QueryGroup",
109
+ "spec": {
110
+ "queries": [
111
+ {
112
+ "kind": "PanelQuery",
113
+ "spec": {
114
+ "query": {
115
+ "kind": "DataQuery",
116
+ "group": "",
117
+ "version": "v0",
118
+ "spec": {
119
+ "expr": "rate(vms_bq_errors_total[5m])",
120
+ "legendFormat": "errors/s"
121
+ }
122
+ },
123
+ "refId": "A",
124
+ "hidden": false
125
+ }
126
+ }
127
+ ],
128
+ "transformations": [],
129
+ "queryOptions": {}
130
+ }
131
+ },
132
+ "vizConfig": {
133
+ "kind": "VizConfig",
134
+ "group": "timeseries",
135
+ "version": "",
136
+ "spec": {
137
+ "options": {},
138
+ "fieldConfig": {
139
+ "defaults": {
140
+ "unit": "reqps",
141
+ "min": 0,
142
+ "color": {
143
+ "mode": "fixed",
144
+ "fixedColor": "red"
145
+ }
146
+ },
147
+ "overrides": []
148
+ }
149
+ }
150
+ }
151
+ }
152
+ },
153
+ "panel-12": {
154
+ "kind": "Panel",
155
+ "spec": {
156
+ "id": 12,
157
+ "title": "Active Segment Streams",
158
+ "description": "Number of GCS segment transfers currently in flight via the async httpx pass-through proxy. A sustained high value indicates the server is handling many concurrent segment streams.",
159
+ "links": [],
160
+ "data": {
161
+ "kind": "QueryGroup",
162
+ "spec": {
163
+ "queries": [
164
+ {
165
+ "kind": "PanelQuery",
166
+ "spec": {
167
+ "query": {
168
+ "kind": "DataQuery",
169
+ "group": "",
170
+ "version": "v0",
171
+ "spec": {
172
+ "expr": "vms_active_streams",
173
+ "legendFormat": "active streams"
174
+ }
175
+ },
176
+ "refId": "A",
177
+ "hidden": false
178
+ }
179
+ }
180
+ ],
181
+ "transformations": [],
182
+ "queryOptions": {}
183
+ }
184
+ },
185
+ "vizConfig": {
186
+ "kind": "VizConfig",
187
+ "group": "timeseries",
188
+ "version": "",
189
+ "spec": {
190
+ "options": {},
191
+ "fieldConfig": {
192
+ "defaults": {
193
+ "unit": "short",
194
+ "min": 0
195
+ },
196
+ "overrides": []
197
+ }
198
+ }
199
+ }
200
+ }
201
+ },
202
+ "panel-13": {
203
+ "kind": "Panel",
204
+ "spec": {
205
+ "id": 13,
206
+ "title": "GCS Bytes Served",
207
+ "description": "Bytes per second streamed from GCS to clients. This metric directly reflects egress volume and cost. Sudden drops may indicate client disconnects or segment unavailability; spikes may indicate unexpectedly large segments.",
208
+ "links": [],
209
+ "data": {
210
+ "kind": "QueryGroup",
211
+ "spec": {
212
+ "queries": [
213
+ {
214
+ "kind": "PanelQuery",
215
+ "spec": {
216
+ "query": {
217
+ "kind": "DataQuery",
218
+ "group": "",
219
+ "version": "v0",
220
+ "spec": {
221
+ "expr": "rate(vms_gcs_bytes_served_total[5m])",
222
+ "legendFormat": "bytes/s"
223
+ }
224
+ },
225
+ "refId": "A",
226
+ "hidden": false
227
+ }
228
+ }
229
+ ],
230
+ "transformations": [],
231
+ "queryOptions": {}
232
+ }
233
+ },
234
+ "vizConfig": {
235
+ "kind": "VizConfig",
236
+ "group": "timeseries",
237
+ "version": "",
238
+ "spec": {
239
+ "options": {},
240
+ "fieldConfig": {
241
+ "defaults": {
242
+ "unit": "Bps",
243
+ "min": 0
244
+ },
245
+ "overrides": []
246
+ }
247
+ }
248
+ }
249
+ }
250
+ },
251
+ "panel-14": {
252
+ "kind": "Panel",
253
+ "spec": {
254
+ "id": 14,
255
+ "title": "GCS Streaming Errors",
256
+ "description": "Rate of errors during GCS segment streaming (read failures, network interruptions, missing blobs). These errors surface as broken video playback for the client. Any non-zero rate should be correlated with GCS availability metrics.",
257
+ "links": [],
258
+ "data": {
259
+ "kind": "QueryGroup",
260
+ "spec": {
261
+ "queries": [
262
+ {
263
+ "kind": "PanelQuery",
264
+ "spec": {
265
+ "query": {
266
+ "kind": "DataQuery",
267
+ "group": "",
268
+ "version": "v0",
269
+ "spec": {
270
+ "expr": "rate(vms_gcs_errors_total[5m])",
271
+ "legendFormat": "errors/s"
272
+ }
273
+ },
274
+ "refId": "A",
275
+ "hidden": false
276
+ }
277
+ }
278
+ ],
279
+ "transformations": [],
280
+ "queryOptions": {}
281
+ }
282
+ },
283
+ "vizConfig": {
284
+ "kind": "VizConfig",
285
+ "group": "timeseries",
286
+ "version": "",
287
+ "spec": {
288
+ "options": {},
289
+ "fieldConfig": {
290
+ "defaults": {
291
+ "unit": "reqps",
292
+ "min": 0,
293
+ "color": {
294
+ "mode": "fixed",
295
+ "fixedColor": "red"
296
+ }
297
+ },
298
+ "overrides": []
299
+ }
300
+ }
301
+ }
302
+ }
303
+ },
304
+ "panel-15": {
305
+ "kind": "Panel",
306
+ "spec": {
307
+ "id": 15,
308
+ "title": "Segment Request Rate",
309
+ "description": "Rate of HTTP requests to the segment streaming endpoint, split by outcome. A high error ratio relative to success indicates GCS or networking problems.",
310
+ "links": [],
311
+ "data": {
312
+ "kind": "QueryGroup",
313
+ "spec": {
314
+ "queries": [
315
+ {
316
+ "kind": "PanelQuery",
317
+ "spec": {
318
+ "query": {
319
+ "kind": "DataQuery",
320
+ "group": "",
321
+ "version": "v0",
322
+ "spec": {
323
+ "expr": "rate(vms_segment_requests_success[5m])",
324
+ "legendFormat": "success/s"
325
+ }
326
+ },
327
+ "refId": "A",
328
+ "hidden": false
329
+ }
330
+ },
331
+ {
332
+ "kind": "PanelQuery",
333
+ "spec": {
334
+ "query": {
335
+ "kind": "DataQuery",
336
+ "group": "",
337
+ "version": "v0",
338
+ "spec": {
339
+ "expr": "rate(vms_segment_requests_error[5m])",
340
+ "legendFormat": "errors/s"
341
+ }
342
+ },
343
+ "refId": "B",
344
+ "hidden": false
345
+ }
346
+ }
347
+ ],
348
+ "transformations": [],
349
+ "queryOptions": {}
350
+ }
351
+ },
352
+ "vizConfig": {
353
+ "kind": "VizConfig",
354
+ "group": "timeseries",
355
+ "version": "",
356
+ "spec": {
357
+ "options": {},
358
+ "fieldConfig": {
359
+ "defaults": {
360
+ "unit": "reqps",
361
+ "min": 0
362
+ },
363
+ "overrides": []
364
+ }
365
+ }
366
+ }
367
+ }
368
+ },
369
+ "panel-17": {
370
+ "kind": "Panel",
371
+ "spec": {
372
+ "id": 17,
373
+ "title": "Upload Requests",
374
+ "description": "Rate of segment upload requests published to edge servers per second. Each request triggers the edge server to transcode and upload HIGH quality segments to GCS. A rise here means more clients are requesting high-quality playback.",
375
+ "links": [],
376
+ "data": {
377
+ "kind": "QueryGroup",
378
+ "spec": {
379
+ "queries": [
380
+ {
381
+ "kind": "PanelQuery",
382
+ "spec": {
383
+ "query": {
384
+ "kind": "DataQuery",
385
+ "group": "",
386
+ "version": "v0",
387
+ "spec": {
388
+ "expr": "rate(vms_upload_requests[5m])",
389
+ "legendFormat": "requests/s"
390
+ }
391
+ },
392
+ "refId": "A",
393
+ "hidden": false
394
+ }
395
+ }
396
+ ],
397
+ "transformations": [],
398
+ "queryOptions": {}
399
+ }
400
+ },
401
+ "vizConfig": {
402
+ "kind": "VizConfig",
403
+ "group": "timeseries",
404
+ "version": "",
405
+ "spec": {
406
+ "options": {},
407
+ "fieldConfig": {
408
+ "defaults": {
409
+ "unit": "reqps",
410
+ "min": 0
411
+ },
412
+ "overrides": []
413
+ }
414
+ }
415
+ }
416
+ }
417
+ },
418
+ "panel-18": {
419
+ "kind": "Panel",
420
+ "spec": {
421
+ "id": 18,
422
+ "title": "Upload Poll Duration",
423
+ "description": "Time the server waits polling the cache for an edge server upload response. The configured maximum timeout is 30 s. Values near the timeout ceiling indicate the edge server is slow or failing to respond. p95 above 20 s warrants investigation of edge server health.",
424
+ "links": [],
425
+ "data": {
426
+ "kind": "QueryGroup",
427
+ "spec": {
428
+ "queries": [
429
+ {
430
+ "kind": "PanelQuery",
431
+ "spec": {
432
+ "query": {
433
+ "kind": "DataQuery",
434
+ "group": "",
435
+ "version": "v0",
436
+ "spec": {
437
+ "expr": "histogram_quantile(0.50, rate(vms_upload_poll_duration_seconds_bucket[5m]))",
438
+ "legendFormat": "p50"
439
+ }
440
+ },
441
+ "refId": "A",
442
+ "hidden": false
443
+ }
444
+ },
445
+ {
446
+ "kind": "PanelQuery",
447
+ "spec": {
448
+ "query": {
449
+ "kind": "DataQuery",
450
+ "group": "",
451
+ "version": "v0",
452
+ "spec": {
453
+ "expr": "histogram_quantile(0.95, rate(vms_upload_poll_duration_seconds_bucket[5m]))",
454
+ "legendFormat": "p95"
455
+ }
456
+ },
457
+ "refId": "B",
458
+ "hidden": false
459
+ }
460
+ }
461
+ ],
462
+ "transformations": [],
463
+ "queryOptions": {}
464
+ }
465
+ },
466
+ "vizConfig": {
467
+ "kind": "VizConfig",
468
+ "group": "timeseries",
469
+ "version": "",
470
+ "spec": {
471
+ "options": {},
472
+ "fieldConfig": {
473
+ "defaults": {
474
+ "unit": "s",
475
+ "min": 0,
476
+ "max": 30
477
+ },
478
+ "overrides": []
479
+ }
480
+ }
481
+ }
482
+ }
483
+ },
484
+ "panel-19": {
485
+ "kind": "Panel",
486
+ "spec": {
487
+ "id": 19,
488
+ "title": "Upload Timeouts",
489
+ "description": "Rate of upload requests that expired without receiving a response within the configured timeout (default 30 s). Each timeout means a playlist request fell back to whatever LOW quality segments were available. A sustained non-zero rate indicates edge server instability.",
490
+ "links": [],
491
+ "data": {
492
+ "kind": "QueryGroup",
493
+ "spec": {
494
+ "queries": [
495
+ {
496
+ "kind": "PanelQuery",
497
+ "spec": {
498
+ "query": {
499
+ "kind": "DataQuery",
500
+ "group": "",
501
+ "version": "v0",
502
+ "spec": {
503
+ "expr": "rate(vms_upload_timeouts_total[5m])",
504
+ "legendFormat": "timeouts/s"
505
+ }
506
+ },
507
+ "refId": "A",
508
+ "hidden": false
509
+ }
510
+ }
511
+ ],
512
+ "transformations": [],
513
+ "queryOptions": {}
514
+ }
515
+ },
516
+ "vizConfig": {
517
+ "kind": "VizConfig",
518
+ "group": "timeseries",
519
+ "version": "",
520
+ "spec": {
521
+ "options": {},
522
+ "fieldConfig": {
523
+ "defaults": {
524
+ "unit": "reqps",
525
+ "min": 0,
526
+ "color": {
527
+ "mode": "fixed",
528
+ "fixedColor": "orange"
529
+ }
530
+ },
531
+ "overrides": []
532
+ }
533
+ }
534
+ }
535
+ }
536
+ },
537
+ "panel-2": {
538
+ "kind": "Panel",
539
+ "spec": {
540
+ "id": 2,
541
+ "title": "Playlist Error Rate",
542
+ "description": "Rate of failed playlist requests per second. Errors include BigQuery failures, upload timeouts, and unhandled exceptions. Sustained errors require immediate investigation.",
543
+ "links": [],
544
+ "data": {
545
+ "kind": "QueryGroup",
546
+ "spec": {
547
+ "queries": [
548
+ {
549
+ "kind": "PanelQuery",
550
+ "spec": {
551
+ "query": {
552
+ "kind": "DataQuery",
553
+ "group": "",
554
+ "version": "v0",
555
+ "spec": {
556
+ "expr": "rate(vms_playlist_requests_error[5m])",
557
+ "legendFormat": "errors/s"
558
+ }
559
+ },
560
+ "refId": "A",
561
+ "hidden": false
562
+ }
563
+ }
564
+ ],
565
+ "transformations": [],
566
+ "queryOptions": {}
567
+ }
568
+ },
569
+ "vizConfig": {
570
+ "kind": "VizConfig",
571
+ "group": "timeseries",
572
+ "version": "",
573
+ "spec": {
574
+ "options": {},
575
+ "fieldConfig": {
576
+ "defaults": {
577
+ "unit": "reqps",
578
+ "min": 0,
579
+ "color": {
580
+ "mode": "fixed",
581
+ "fixedColor": "red"
582
+ }
583
+ },
584
+ "overrides": []
585
+ }
586
+ }
587
+ }
588
+ }
589
+ },
590
+ "panel-20": {
591
+ "kind": "Panel",
592
+ "spec": {
593
+ "id": 20,
594
+ "title": "Upload Response Status Distribution",
595
+ "description": "Breakdown of edge server upload response statuses: COMPLETED (full upload), PARTIAL (some segments uploaded), FAILED (upload attempted but failed), NOT_FOUND (camera/segment not found on edge). A growing share of FAILED or NOT_FOUND responses indicates a misconfiguration or recording gap on the edge.",
596
+ "links": [],
597
+ "data": {
598
+ "kind": "QueryGroup",
599
+ "spec": {
600
+ "queries": [
601
+ {
602
+ "kind": "PanelQuery",
603
+ "spec": {
604
+ "query": {
605
+ "kind": "DataQuery",
606
+ "group": "",
607
+ "version": "v0",
608
+ "spec": {
609
+ "expr": "rate(vms_upload_response_completed[5m])",
610
+ "legendFormat": "completed/s"
611
+ }
612
+ },
613
+ "refId": "A",
614
+ "hidden": false
615
+ }
616
+ },
617
+ {
618
+ "kind": "PanelQuery",
619
+ "spec": {
620
+ "query": {
621
+ "kind": "DataQuery",
622
+ "group": "",
623
+ "version": "v0",
624
+ "spec": {
625
+ "expr": "rate(vms_upload_response_partial[5m])",
626
+ "legendFormat": "partial/s"
627
+ }
628
+ },
629
+ "refId": "B",
630
+ "hidden": false
631
+ }
632
+ },
633
+ {
634
+ "kind": "PanelQuery",
635
+ "spec": {
636
+ "query": {
637
+ "kind": "DataQuery",
638
+ "group": "",
639
+ "version": "v0",
640
+ "spec": {
641
+ "expr": "rate(vms_upload_response_failed[5m])",
642
+ "legendFormat": "failed/s"
643
+ }
644
+ },
645
+ "refId": "C",
646
+ "hidden": false
647
+ }
648
+ },
649
+ {
650
+ "kind": "PanelQuery",
651
+ "spec": {
652
+ "query": {
653
+ "kind": "DataQuery",
654
+ "group": "",
655
+ "version": "v0",
656
+ "spec": {
657
+ "expr": "rate(vms_upload_response_not_found[5m])",
658
+ "legendFormat": "not_found/s"
659
+ }
660
+ },
661
+ "refId": "D",
662
+ "hidden": false
663
+ }
664
+ }
665
+ ],
666
+ "transformations": [],
667
+ "queryOptions": {}
668
+ }
669
+ },
670
+ "vizConfig": {
671
+ "kind": "VizConfig",
672
+ "group": "timeseries",
673
+ "version": "",
674
+ "spec": {
675
+ "options": {},
676
+ "fieldConfig": {
677
+ "defaults": {
678
+ "unit": "reqps",
679
+ "min": 0
680
+ },
681
+ "overrides": []
682
+ }
683
+ }
684
+ }
685
+ }
686
+ },
687
+ "panel-22": {
688
+ "kind": "Panel",
689
+ "spec": {
690
+ "id": 22,
691
+ "title": "Queue Throughput",
692
+ "description": "Rate of messages enqueued, dequeued, and successfully processed through the per-camera ordered queues. The gap between enqueue and processed rates reveals how much work is accumulating. A growing backlog (enqueue >> dequeue) means consumers are falling behind.",
693
+ "links": [],
694
+ "data": {
695
+ "kind": "QueryGroup",
696
+ "spec": {
697
+ "queries": [
698
+ {
699
+ "kind": "PanelQuery",
700
+ "spec": {
701
+ "query": {
702
+ "kind": "DataQuery",
703
+ "group": "",
704
+ "version": "v0",
705
+ "spec": {
706
+ "expr": "rate(ordered_q_enqueue_count[5m])",
707
+ "legendFormat": "enqueued/s"
708
+ }
709
+ },
710
+ "refId": "A",
711
+ "hidden": false
712
+ }
713
+ },
714
+ {
715
+ "kind": "PanelQuery",
716
+ "spec": {
717
+ "query": {
718
+ "kind": "DataQuery",
719
+ "group": "",
720
+ "version": "v0",
721
+ "spec": {
722
+ "expr": "rate(ordered_q_dequeue_count[5m])",
723
+ "legendFormat": "dequeued/s"
724
+ }
725
+ },
726
+ "refId": "B",
727
+ "hidden": false
728
+ }
729
+ },
730
+ {
731
+ "kind": "PanelQuery",
732
+ "spec": {
733
+ "query": {
734
+ "kind": "DataQuery",
735
+ "group": "",
736
+ "version": "v0",
737
+ "spec": {
738
+ "expr": "rate(ordered_q_processed_count[5m])",
739
+ "legendFormat": "processed/s"
740
+ }
741
+ },
742
+ "refId": "C",
743
+ "hidden": false
744
+ }
745
+ }
746
+ ],
747
+ "transformations": [],
748
+ "queryOptions": {}
749
+ }
750
+ },
751
+ "vizConfig": {
752
+ "kind": "VizConfig",
753
+ "group": "timeseries",
754
+ "version": "",
755
+ "spec": {
756
+ "options": {},
757
+ "fieldConfig": {
758
+ "defaults": {
759
+ "unit": "reqps",
760
+ "min": 0
761
+ },
762
+ "overrides": []
763
+ }
764
+ }
765
+ }
766
+ }
767
+ },
768
+ "panel-23": {
769
+ "kind": "Panel",
770
+ "spec": {
771
+ "id": 23,
772
+ "title": "Queue Processing Errors",
773
+ "description": "Rate of errors encountered while processing messages from the ordered queues. These include failures in the VideoSegmentsProcessor and VideoSegmentCreatedProcessor. Errors here can cause segments to remain unregistered in Imagine or upload responses to be lost.",
774
+ "links": [],
775
+ "data": {
776
+ "kind": "QueryGroup",
777
+ "spec": {
778
+ "queries": [
779
+ {
780
+ "kind": "PanelQuery",
781
+ "spec": {
782
+ "query": {
783
+ "kind": "DataQuery",
784
+ "group": "",
785
+ "version": "v0",
786
+ "spec": {
787
+ "expr": "rate(ordered_q_process_error_count[5m])",
788
+ "legendFormat": "errors/s"
789
+ }
790
+ },
791
+ "refId": "A",
792
+ "hidden": false
793
+ }
794
+ }
795
+ ],
796
+ "transformations": [],
797
+ "queryOptions": {}
798
+ }
799
+ },
800
+ "vizConfig": {
801
+ "kind": "VizConfig",
802
+ "group": "timeseries",
803
+ "version": "",
804
+ "spec": {
805
+ "options": {},
806
+ "fieldConfig": {
807
+ "defaults": {
808
+ "unit": "reqps",
809
+ "min": 0,
810
+ "color": {
811
+ "mode": "fixed",
812
+ "fixedColor": "red"
813
+ }
814
+ },
815
+ "overrides": []
816
+ }
817
+ }
818
+ }
819
+ }
820
+ },
821
+ "panel-24": {
822
+ "kind": "Panel",
823
+ "spec": {
824
+ "id": 24,
825
+ "title": "Active Processing Queues",
826
+ "description": "Number of per-camera ordered queues actively consuming messages at any given moment. Each active queue corresponds to a camera currently receiving segment events. A sudden drop to zero while traffic is expected may indicate a processing stall.",
827
+ "links": [],
828
+ "data": {
829
+ "kind": "QueryGroup",
830
+ "spec": {
831
+ "queries": [
832
+ {
833
+ "kind": "PanelQuery",
834
+ "spec": {
835
+ "query": {
836
+ "kind": "DataQuery",
837
+ "group": "",
838
+ "version": "v0",
839
+ "spec": {
840
+ "expr": "ordered_q_processing_queues",
841
+ "legendFormat": "active queues"
842
+ }
843
+ },
844
+ "refId": "A",
845
+ "hidden": false
846
+ }
847
+ }
848
+ ],
849
+ "transformations": [],
850
+ "queryOptions": {}
851
+ }
852
+ },
853
+ "vizConfig": {
854
+ "kind": "VizConfig",
855
+ "group": "timeseries",
856
+ "version": "",
857
+ "spec": {
858
+ "options": {},
859
+ "fieldConfig": {
860
+ "defaults": {
861
+ "unit": "short",
862
+ "min": 0
863
+ },
864
+ "overrides": []
865
+ }
866
+ }
867
+ }
868
+ }
869
+ },
870
+ "panel-25": {
871
+ "kind": "Panel",
872
+ "spec": {
873
+ "id": 25,
874
+ "title": "Total Playlist Requests",
875
+ "description": "Total number of successful playlist requests over the selected dashboard interval. Use this to understand the volume of video sessions started in a given window.",
876
+ "links": [],
877
+ "data": {
878
+ "kind": "QueryGroup",
879
+ "spec": {
880
+ "queries": [
881
+ {
882
+ "kind": "PanelQuery",
883
+ "spec": {
884
+ "query": {
885
+ "kind": "DataQuery",
886
+ "group": "",
887
+ "version": "v0",
888
+ "spec": {
889
+ "expr": "increase(vms_playlist_requests_success[${__range}])",
890
+ "legendFormat": "total"
891
+ }
892
+ },
893
+ "refId": "A",
894
+ "hidden": false
895
+ }
896
+ }
897
+ ],
898
+ "transformations": [],
899
+ "queryOptions": {}
900
+ }
901
+ },
902
+ "vizConfig": {
903
+ "kind": "VizConfig",
904
+ "group": "stat",
905
+ "version": "",
906
+ "spec": {
907
+ "options": {
908
+ "colorMode": "background",
909
+ "graphMode": "none",
910
+ "reduceOptions": {
911
+ "calcs": [
912
+ "lastNotNull"
913
+ ]
914
+ },
915
+ "textMode": "value_and_name"
916
+ },
917
+ "fieldConfig": {
918
+ "defaults": {
919
+ "unit": "short",
920
+ "min": 0
921
+ },
922
+ "overrides": []
923
+ }
924
+ }
925
+ }
926
+ }
927
+ },
928
+ "panel-26": {
929
+ "kind": "Panel",
930
+ "spec": {
931
+ "id": 26,
932
+ "title": "Total Segment Requests",
933
+ "description": "Total number of successful video segment HTTP requests over the selected dashboard interval. Reflects how many .ts chunks were actually served to clients.",
934
+ "links": [],
935
+ "data": {
936
+ "kind": "QueryGroup",
937
+ "spec": {
938
+ "queries": [
939
+ {
940
+ "kind": "PanelQuery",
941
+ "spec": {
942
+ "query": {
943
+ "kind": "DataQuery",
944
+ "group": "",
945
+ "version": "v0",
946
+ "spec": {
947
+ "expr": "increase(vms_segment_requests_success[${__range}])",
948
+ "legendFormat": "total"
949
+ }
950
+ },
951
+ "refId": "A",
952
+ "hidden": false
953
+ }
954
+ }
955
+ ],
956
+ "transformations": [],
957
+ "queryOptions": {}
958
+ }
959
+ },
960
+ "vizConfig": {
961
+ "kind": "VizConfig",
962
+ "group": "stat",
963
+ "version": "",
964
+ "spec": {
965
+ "options": {
966
+ "colorMode": "background",
967
+ "graphMode": "none",
968
+ "reduceOptions": {
969
+ "calcs": [
970
+ "lastNotNull"
971
+ ]
972
+ },
973
+ "textMode": "value_and_name"
974
+ },
975
+ "fieldConfig": {
976
+ "defaults": {
977
+ "unit": "short",
978
+ "min": 0
979
+ },
980
+ "overrides": []
981
+ }
982
+ }
983
+ }
984
+ }
985
+ },
986
+ "panel-27": {
987
+ "kind": "Panel",
988
+ "spec": {
989
+ "id": 27,
990
+ "title": "Coverage Ratio",
991
+ "description": "Ratio of actual segment duration to requested range. A value of 1.0 means full coverage; lower values indicate missing footage for the requested time window.",
992
+ "links": [],
993
+ "data": {
994
+ "kind": "QueryGroup",
995
+ "spec": {
996
+ "queries": [
997
+ {
998
+ "kind": "PanelQuery",
999
+ "spec": {
1000
+ "query": {
1001
+ "kind": "DataQuery",
1002
+ "group": "",
1003
+ "version": "v0",
1004
+ "spec": {
1005
+ "expr": "histogram_quantile(0.50, rate(vms_playlist_coverage_ratio_bucket[5m]))",
1006
+ "legendFormat": "p50"
1007
+ }
1008
+ },
1009
+ "refId": "A",
1010
+ "hidden": false
1011
+ }
1012
+ },
1013
+ {
1014
+ "kind": "PanelQuery",
1015
+ "spec": {
1016
+ "query": {
1017
+ "kind": "DataQuery",
1018
+ "group": "",
1019
+ "version": "v0",
1020
+ "spec": {
1021
+ "expr": "histogram_quantile(0.95, rate(vms_playlist_coverage_ratio_bucket[5m]))",
1022
+ "legendFormat": "p95"
1023
+ }
1024
+ },
1025
+ "refId": "B",
1026
+ "hidden": false
1027
+ }
1028
+ }
1029
+ ],
1030
+ "transformations": [],
1031
+ "queryOptions": {}
1032
+ }
1033
+ },
1034
+ "vizConfig": {
1035
+ "kind": "VizConfig",
1036
+ "group": "timeseries",
1037
+ "version": "",
1038
+ "spec": {
1039
+ "options": {},
1040
+ "fieldConfig": {
1041
+ "defaults": {
1042
+ "unit": "percentunit",
1043
+ "min": 0,
1044
+ "max": 1
1045
+ },
1046
+ "overrides": []
1047
+ }
1048
+ }
1049
+ }
1050
+ }
1051
+ },
1052
+ "panel-28": {
1053
+ "kind": "Panel",
1054
+ "spec": {
1055
+ "id": 28,
1056
+ "title": "Segment Staleness",
1057
+ "description": "Age of the most recent segment relative to request time. High staleness means the latest available footage is far behind real-time, indicating recording or upload delays.",
1058
+ "links": [],
1059
+ "data": {
1060
+ "kind": "QueryGroup",
1061
+ "spec": {
1062
+ "queries": [
1063
+ {
1064
+ "kind": "PanelQuery",
1065
+ "spec": {
1066
+ "query": {
1067
+ "kind": "DataQuery",
1068
+ "group": "",
1069
+ "version": "v0",
1070
+ "spec": {
1071
+ "expr": "histogram_quantile(0.50, rate(vms_segment_staleness_seconds_bucket[5m]))",
1072
+ "legendFormat": "p50"
1073
+ }
1074
+ },
1075
+ "refId": "A",
1076
+ "hidden": false
1077
+ }
1078
+ },
1079
+ {
1080
+ "kind": "PanelQuery",
1081
+ "spec": {
1082
+ "query": {
1083
+ "kind": "DataQuery",
1084
+ "group": "",
1085
+ "version": "v0",
1086
+ "spec": {
1087
+ "expr": "histogram_quantile(0.95, rate(vms_segment_staleness_seconds_bucket[5m]))",
1088
+ "legendFormat": "p95"
1089
+ }
1090
+ },
1091
+ "refId": "B",
1092
+ "hidden": false
1093
+ }
1094
+ }
1095
+ ],
1096
+ "transformations": [],
1097
+ "queryOptions": {}
1098
+ }
1099
+ },
1100
+ "vizConfig": {
1101
+ "kind": "VizConfig",
1102
+ "group": "timeseries",
1103
+ "version": "",
1104
+ "spec": {
1105
+ "options": {},
1106
+ "fieldConfig": {
1107
+ "defaults": {
1108
+ "unit": "s",
1109
+ "min": 0
1110
+ },
1111
+ "overrides": []
1112
+ }
1113
+ }
1114
+ }
1115
+ }
1116
+ },
1117
+ "panel-29": {
1118
+ "kind": "Panel",
1119
+ "spec": {
1120
+ "id": 29,
1121
+ "title": "Total Gap Seconds",
1122
+ "description": "Total gap time in a playlist response. Unlike gap duration distribution, this tracks the absolute seconds of missing footage per playlist.",
1123
+ "links": [],
1124
+ "data": {
1125
+ "kind": "QueryGroup",
1126
+ "spec": {
1127
+ "queries": [
1128
+ {
1129
+ "kind": "PanelQuery",
1130
+ "spec": {
1131
+ "query": {
1132
+ "kind": "DataQuery",
1133
+ "group": "",
1134
+ "version": "v0",
1135
+ "spec": {
1136
+ "expr": "histogram_quantile(0.50, rate(vms_playlist_total_gap_seconds_bucket[5m]))",
1137
+ "legendFormat": "p50"
1138
+ }
1139
+ },
1140
+ "refId": "A",
1141
+ "hidden": false
1142
+ }
1143
+ },
1144
+ {
1145
+ "kind": "PanelQuery",
1146
+ "spec": {
1147
+ "query": {
1148
+ "kind": "DataQuery",
1149
+ "group": "",
1150
+ "version": "v0",
1151
+ "spec": {
1152
+ "expr": "histogram_quantile(0.95, rate(vms_playlist_total_gap_seconds_bucket[5m]))",
1153
+ "legendFormat": "p95"
1154
+ }
1155
+ },
1156
+ "refId": "B",
1157
+ "hidden": false
1158
+ }
1159
+ }
1160
+ ],
1161
+ "transformations": [],
1162
+ "queryOptions": {}
1163
+ }
1164
+ },
1165
+ "vizConfig": {
1166
+ "kind": "VizConfig",
1167
+ "group": "timeseries",
1168
+ "version": "",
1169
+ "spec": {
1170
+ "options": {},
1171
+ "fieldConfig": {
1172
+ "defaults": {
1173
+ "unit": "s",
1174
+ "min": 0
1175
+ },
1176
+ "overrides": []
1177
+ }
1178
+ }
1179
+ }
1180
+ }
1181
+ },
1182
+ "panel-3": {
1183
+ "kind": "Panel",
1184
+ "spec": {
1185
+ "id": 3,
1186
+ "title": "Playlist Generation Latency",
1187
+ "description": "End-to-end time to produce a playlist response, including the BigQuery query and M3U8 build. p50 is the median experience; p95 reflects tail latency that affects a small but significant share of users. Latency spikes here often trace back to BigQuery.",
1188
+ "links": [],
1189
+ "data": {
1190
+ "kind": "QueryGroup",
1191
+ "spec": {
1192
+ "queries": [
1193
+ {
1194
+ "kind": "PanelQuery",
1195
+ "spec": {
1196
+ "query": {
1197
+ "kind": "DataQuery",
1198
+ "group": "",
1199
+ "version": "v0",
1200
+ "spec": {
1201
+ "expr": "histogram_quantile(0.50, rate(vms_playlist_generation_duration_seconds_bucket[5m]))",
1202
+ "legendFormat": "p50"
1203
+ }
1204
+ },
1205
+ "refId": "A",
1206
+ "hidden": false
1207
+ }
1208
+ },
1209
+ {
1210
+ "kind": "PanelQuery",
1211
+ "spec": {
1212
+ "query": {
1213
+ "kind": "DataQuery",
1214
+ "group": "",
1215
+ "version": "v0",
1216
+ "spec": {
1217
+ "expr": "histogram_quantile(0.95, rate(vms_playlist_generation_duration_seconds_bucket[5m]))",
1218
+ "legendFormat": "p95"
1219
+ }
1220
+ },
1221
+ "refId": "B",
1222
+ "hidden": false
1223
+ }
1224
+ },
1225
+ {
1226
+ "kind": "PanelQuery",
1227
+ "spec": {
1228
+ "query": {
1229
+ "kind": "DataQuery",
1230
+ "group": "",
1231
+ "version": "v0",
1232
+ "spec": {
1233
+ "expr": "histogram_quantile(0.99, rate(vms_playlist_generation_duration_seconds_bucket[5m]))",
1234
+ "legendFormat": "p99"
1235
+ }
1236
+ },
1237
+ "refId": "C",
1238
+ "hidden": false
1239
+ }
1240
+ }
1241
+ ],
1242
+ "transformations": [],
1243
+ "queryOptions": {}
1244
+ }
1245
+ },
1246
+ "vizConfig": {
1247
+ "kind": "VizConfig",
1248
+ "group": "timeseries",
1249
+ "version": "",
1250
+ "spec": {
1251
+ "options": {},
1252
+ "fieldConfig": {
1253
+ "defaults": {
1254
+ "unit": "s",
1255
+ "min": 0
1256
+ },
1257
+ "overrides": []
1258
+ }
1259
+ }
1260
+ }
1261
+ }
1262
+ },
1263
+ "panel-31": {
1264
+ "kind": "Panel",
1265
+ "spec": {
1266
+ "id": 31,
1267
+ "title": "Cache Hit/Miss Rate",
1268
+ "description": "Rate of cache hits vs misses by quality level. A low hit rate indicates the cache is not effective and most requests fall through to BigQuery.",
1269
+ "links": [],
1270
+ "data": {
1271
+ "kind": "QueryGroup",
1272
+ "spec": {
1273
+ "queries": [
1274
+ {
1275
+ "kind": "PanelQuery",
1276
+ "spec": {
1277
+ "query": {
1278
+ "kind": "DataQuery",
1279
+ "group": "",
1280
+ "version": "v0",
1281
+ "spec": {
1282
+ "expr": "rate(vms_cache_hit_low[5m])",
1283
+ "legendFormat": "hit low/s"
1284
+ }
1285
+ },
1286
+ "refId": "A",
1287
+ "hidden": false
1288
+ }
1289
+ },
1290
+ {
1291
+ "kind": "PanelQuery",
1292
+ "spec": {
1293
+ "query": {
1294
+ "kind": "DataQuery",
1295
+ "group": "",
1296
+ "version": "v0",
1297
+ "spec": {
1298
+ "expr": "rate(vms_cache_miss_low[5m])",
1299
+ "legendFormat": "miss low/s"
1300
+ }
1301
+ },
1302
+ "refId": "B",
1303
+ "hidden": false
1304
+ }
1305
+ },
1306
+ {
1307
+ "kind": "PanelQuery",
1308
+ "spec": {
1309
+ "query": {
1310
+ "kind": "DataQuery",
1311
+ "group": "",
1312
+ "version": "v0",
1313
+ "spec": {
1314
+ "expr": "rate(vms_cache_hit_high[5m])",
1315
+ "legendFormat": "hit high/s"
1316
+ }
1317
+ },
1318
+ "refId": "C",
1319
+ "hidden": false
1320
+ }
1321
+ },
1322
+ {
1323
+ "kind": "PanelQuery",
1324
+ "spec": {
1325
+ "query": {
1326
+ "kind": "DataQuery",
1327
+ "group": "",
1328
+ "version": "v0",
1329
+ "spec": {
1330
+ "expr": "rate(vms_cache_miss_high[5m])",
1331
+ "legendFormat": "miss high/s"
1332
+ }
1333
+ },
1334
+ "refId": "D",
1335
+ "hidden": false
1336
+ }
1337
+ }
1338
+ ],
1339
+ "transformations": [],
1340
+ "queryOptions": {}
1341
+ }
1342
+ },
1343
+ "vizConfig": {
1344
+ "kind": "VizConfig",
1345
+ "group": "timeseries",
1346
+ "version": "",
1347
+ "spec": {
1348
+ "options": {},
1349
+ "fieldConfig": {
1350
+ "defaults": {
1351
+ "unit": "reqps",
1352
+ "min": 0
1353
+ },
1354
+ "overrides": []
1355
+ }
1356
+ }
1357
+ }
1358
+ }
1359
+ },
1360
+ "panel-32": {
1361
+ "kind": "Panel",
1362
+ "spec": {
1363
+ "id": 32,
1364
+ "title": "Cache Lookup Latency",
1365
+ "description": "Redis cache lookup latency. Spikes here indicate Redis connectivity or performance issues that directly impact playlist generation time.",
1366
+ "links": [],
1367
+ "data": {
1368
+ "kind": "QueryGroup",
1369
+ "spec": {
1370
+ "queries": [
1371
+ {
1372
+ "kind": "PanelQuery",
1373
+ "spec": {
1374
+ "query": {
1375
+ "kind": "DataQuery",
1376
+ "group": "",
1377
+ "version": "v0",
1378
+ "spec": {
1379
+ "expr": "histogram_quantile(0.50, rate(vms_cache_lookup_duration_seconds_bucket[5m]))",
1380
+ "legendFormat": "p50"
1381
+ }
1382
+ },
1383
+ "refId": "A",
1384
+ "hidden": false
1385
+ }
1386
+ },
1387
+ {
1388
+ "kind": "PanelQuery",
1389
+ "spec": {
1390
+ "query": {
1391
+ "kind": "DataQuery",
1392
+ "group": "",
1393
+ "version": "v0",
1394
+ "spec": {
1395
+ "expr": "histogram_quantile(0.95, rate(vms_cache_lookup_duration_seconds_bucket[5m]))",
1396
+ "legendFormat": "p95"
1397
+ }
1398
+ },
1399
+ "refId": "B",
1400
+ "hidden": false
1401
+ }
1402
+ }
1403
+ ],
1404
+ "transformations": [],
1405
+ "queryOptions": {}
1406
+ }
1407
+ },
1408
+ "vizConfig": {
1409
+ "kind": "VizConfig",
1410
+ "group": "timeseries",
1411
+ "version": "",
1412
+ "spec": {
1413
+ "options": {},
1414
+ "fieldConfig": {
1415
+ "defaults": {
1416
+ "unit": "s",
1417
+ "min": 0
1418
+ },
1419
+ "overrides": []
1420
+ }
1421
+ }
1422
+ }
1423
+ }
1424
+ },
1425
+ "panel-33": {
1426
+ "kind": "Panel",
1427
+ "spec": {
1428
+ "id": 33,
1429
+ "title": "Cache Backfill Duration",
1430
+ "description": "Time to backfill the cache from BigQuery on a cache miss. Long backfill times increase playlist latency for uncached requests.",
1431
+ "links": [],
1432
+ "data": {
1433
+ "kind": "QueryGroup",
1434
+ "spec": {
1435
+ "queries": [
1436
+ {
1437
+ "kind": "PanelQuery",
1438
+ "spec": {
1439
+ "query": {
1440
+ "kind": "DataQuery",
1441
+ "group": "",
1442
+ "version": "v0",
1443
+ "spec": {
1444
+ "expr": "histogram_quantile(0.50, rate(vms_cache_backfill_duration_seconds_bucket[5m]))",
1445
+ "legendFormat": "p50"
1446
+ }
1447
+ },
1448
+ "refId": "A",
1449
+ "hidden": false
1450
+ }
1451
+ },
1452
+ {
1453
+ "kind": "PanelQuery",
1454
+ "spec": {
1455
+ "query": {
1456
+ "kind": "DataQuery",
1457
+ "group": "",
1458
+ "version": "v0",
1459
+ "spec": {
1460
+ "expr": "histogram_quantile(0.95, rate(vms_cache_backfill_duration_seconds_bucket[5m]))",
1461
+ "legendFormat": "p95"
1462
+ }
1463
+ },
1464
+ "refId": "B",
1465
+ "hidden": false
1466
+ }
1467
+ }
1468
+ ],
1469
+ "transformations": [],
1470
+ "queryOptions": {}
1471
+ }
1472
+ },
1473
+ "vizConfig": {
1474
+ "kind": "VizConfig",
1475
+ "group": "timeseries",
1476
+ "version": "",
1477
+ "spec": {
1478
+ "options": {},
1479
+ "fieldConfig": {
1480
+ "defaults": {
1481
+ "unit": "s",
1482
+ "min": 0
1483
+ },
1484
+ "overrides": []
1485
+ }
1486
+ }
1487
+ }
1488
+ }
1489
+ },
1490
+ "panel-34": {
1491
+ "kind": "Panel",
1492
+ "spec": {
1493
+ "id": 34,
1494
+ "title": "Cache Segments Added",
1495
+ "description": "Rate of segments written to the cache by quality level. Tracks how actively the cache is being populated.",
1496
+ "links": [],
1497
+ "data": {
1498
+ "kind": "QueryGroup",
1499
+ "spec": {
1500
+ "queries": [
1501
+ {
1502
+ "kind": "PanelQuery",
1503
+ "spec": {
1504
+ "query": {
1505
+ "kind": "DataQuery",
1506
+ "group": "",
1507
+ "version": "v0",
1508
+ "spec": {
1509
+ "expr": "rate(vms_cache_segment_added_low[5m])",
1510
+ "legendFormat": "low/s"
1511
+ }
1512
+ },
1513
+ "refId": "A",
1514
+ "hidden": false
1515
+ }
1516
+ },
1517
+ {
1518
+ "kind": "PanelQuery",
1519
+ "spec": {
1520
+ "query": {
1521
+ "kind": "DataQuery",
1522
+ "group": "",
1523
+ "version": "v0",
1524
+ "spec": {
1525
+ "expr": "rate(vms_cache_segment_added_high[5m])",
1526
+ "legendFormat": "high/s"
1527
+ }
1528
+ },
1529
+ "refId": "B",
1530
+ "hidden": false
1531
+ }
1532
+ }
1533
+ ],
1534
+ "transformations": [],
1535
+ "queryOptions": {}
1536
+ }
1537
+ },
1538
+ "vizConfig": {
1539
+ "kind": "VizConfig",
1540
+ "group": "timeseries",
1541
+ "version": "",
1542
+ "spec": {
1543
+ "options": {},
1544
+ "fieldConfig": {
1545
+ "defaults": {
1546
+ "unit": "reqps",
1547
+ "min": 0
1548
+ },
1549
+ "overrides": []
1550
+ }
1551
+ }
1552
+ }
1553
+ }
1554
+ },
1555
+ "panel-35": {
1556
+ "kind": "Panel",
1557
+ "spec": {
1558
+ "id": 35,
1559
+ "title": "GCS First Byte Latency",
1560
+ "description": "Time-to-first-byte from GCS. Measures how quickly the proxy begins receiving data after initiating the stream. High values indicate GCS latency or network issues.",
1561
+ "links": [],
1562
+ "data": {
1563
+ "kind": "QueryGroup",
1564
+ "spec": {
1565
+ "queries": [
1566
+ {
1567
+ "kind": "PanelQuery",
1568
+ "spec": {
1569
+ "query": {
1570
+ "kind": "DataQuery",
1571
+ "group": "",
1572
+ "version": "v0",
1573
+ "spec": {
1574
+ "expr": "histogram_quantile(0.50, rate(vms_gcs_first_byte_seconds_bucket[5m]))",
1575
+ "legendFormat": "p50"
1576
+ }
1577
+ },
1578
+ "refId": "A",
1579
+ "hidden": false
1580
+ }
1581
+ },
1582
+ {
1583
+ "kind": "PanelQuery",
1584
+ "spec": {
1585
+ "query": {
1586
+ "kind": "DataQuery",
1587
+ "group": "",
1588
+ "version": "v0",
1589
+ "spec": {
1590
+ "expr": "histogram_quantile(0.95, rate(vms_gcs_first_byte_seconds_bucket[5m]))",
1591
+ "legendFormat": "p95"
1592
+ }
1593
+ },
1594
+ "refId": "B",
1595
+ "hidden": false
1596
+ }
1597
+ },
1598
+ {
1599
+ "kind": "PanelQuery",
1600
+ "spec": {
1601
+ "query": {
1602
+ "kind": "DataQuery",
1603
+ "group": "",
1604
+ "version": "v0",
1605
+ "spec": {
1606
+ "expr": "histogram_quantile(0.99, rate(vms_gcs_first_byte_seconds_bucket[5m]))",
1607
+ "legendFormat": "p99"
1608
+ }
1609
+ },
1610
+ "refId": "C",
1611
+ "hidden": false
1612
+ }
1613
+ }
1614
+ ],
1615
+ "transformations": [],
1616
+ "queryOptions": {}
1617
+ }
1618
+ },
1619
+ "vizConfig": {
1620
+ "kind": "VizConfig",
1621
+ "group": "timeseries",
1622
+ "version": "",
1623
+ "spec": {
1624
+ "options": {},
1625
+ "fieldConfig": {
1626
+ "defaults": {
1627
+ "unit": "s",
1628
+ "min": 0
1629
+ },
1630
+ "overrides": []
1631
+ }
1632
+ }
1633
+ }
1634
+ }
1635
+ },
1636
+ "panel-36": {
1637
+ "kind": "Panel",
1638
+ "spec": {
1639
+ "id": 36,
1640
+ "title": "GCS Stream Duration",
1641
+ "description": "Total time to stream a segment from GCS to the client. Combines first-byte latency and transfer time. Useful for understanding end-to-end playback delay.",
1642
+ "links": [],
1643
+ "data": {
1644
+ "kind": "QueryGroup",
1645
+ "spec": {
1646
+ "queries": [
1647
+ {
1648
+ "kind": "PanelQuery",
1649
+ "spec": {
1650
+ "query": {
1651
+ "kind": "DataQuery",
1652
+ "group": "",
1653
+ "version": "v0",
1654
+ "spec": {
1655
+ "expr": "histogram_quantile(0.50, rate(vms_gcs_stream_duration_seconds_bucket[5m]))",
1656
+ "legendFormat": "p50"
1657
+ }
1658
+ },
1659
+ "refId": "A",
1660
+ "hidden": false
1661
+ }
1662
+ },
1663
+ {
1664
+ "kind": "PanelQuery",
1665
+ "spec": {
1666
+ "query": {
1667
+ "kind": "DataQuery",
1668
+ "group": "",
1669
+ "version": "v0",
1670
+ "spec": {
1671
+ "expr": "histogram_quantile(0.95, rate(vms_gcs_stream_duration_seconds_bucket[5m]))",
1672
+ "legendFormat": "p95"
1673
+ }
1674
+ },
1675
+ "refId": "B",
1676
+ "hidden": false
1677
+ }
1678
+ }
1679
+ ],
1680
+ "transformations": [],
1681
+ "queryOptions": {}
1682
+ }
1683
+ },
1684
+ "vizConfig": {
1685
+ "kind": "VizConfig",
1686
+ "group": "timeseries",
1687
+ "version": "",
1688
+ "spec": {
1689
+ "options": {},
1690
+ "fieldConfig": {
1691
+ "defaults": {
1692
+ "unit": "s",
1693
+ "min": 0
1694
+ },
1695
+ "overrides": []
1696
+ }
1697
+ }
1698
+ }
1699
+ }
1700
+ },
1701
+ "panel-37": {
1702
+ "kind": "Panel",
1703
+ "spec": {
1704
+ "id": 37,
1705
+ "title": "GCS Segment Size",
1706
+ "description": "Size distribution of segments served from GCS. Helps identify unexpectedly large or small segments that may indicate transcoding issues.",
1707
+ "links": [],
1708
+ "data": {
1709
+ "kind": "QueryGroup",
1710
+ "spec": {
1711
+ "queries": [
1712
+ {
1713
+ "kind": "PanelQuery",
1714
+ "spec": {
1715
+ "query": {
1716
+ "kind": "DataQuery",
1717
+ "group": "",
1718
+ "version": "v0",
1719
+ "spec": {
1720
+ "expr": "histogram_quantile(0.50, rate(vms_gcs_segment_size_bytes_bucket[5m]))",
1721
+ "legendFormat": "p50"
1722
+ }
1723
+ },
1724
+ "refId": "A",
1725
+ "hidden": false
1726
+ }
1727
+ },
1728
+ {
1729
+ "kind": "PanelQuery",
1730
+ "spec": {
1731
+ "query": {
1732
+ "kind": "DataQuery",
1733
+ "group": "",
1734
+ "version": "v0",
1735
+ "spec": {
1736
+ "expr": "histogram_quantile(0.95, rate(vms_gcs_segment_size_bytes_bucket[5m]))",
1737
+ "legendFormat": "p95"
1738
+ }
1739
+ },
1740
+ "refId": "B",
1741
+ "hidden": false
1742
+ }
1743
+ }
1744
+ ],
1745
+ "transformations": [],
1746
+ "queryOptions": {}
1747
+ }
1748
+ },
1749
+ "vizConfig": {
1750
+ "kind": "VizConfig",
1751
+ "group": "timeseries",
1752
+ "version": "",
1753
+ "spec": {
1754
+ "options": {},
1755
+ "fieldConfig": {
1756
+ "defaults": {
1757
+ "unit": "bytes",
1758
+ "min": 0
1759
+ },
1760
+ "overrides": []
1761
+ }
1762
+ }
1763
+ }
1764
+ }
1765
+ },
1766
+ "panel-38": {
1767
+ "kind": "Panel",
1768
+ "spec": {
1769
+ "id": 38,
1770
+ "title": "Segment Not Found Rate",
1771
+ "description": "Rate of segments not found in GCS after polling. Indicates segments that were expected based on metadata but are missing from storage.",
1772
+ "links": [],
1773
+ "data": {
1774
+ "kind": "QueryGroup",
1775
+ "spec": {
1776
+ "queries": [
1777
+ {
1778
+ "kind": "PanelQuery",
1779
+ "spec": {
1780
+ "query": {
1781
+ "kind": "DataQuery",
1782
+ "group": "",
1783
+ "version": "v0",
1784
+ "spec": {
1785
+ "expr": "rate(vms_segment_requests_not_found[5m])",
1786
+ "legendFormat": "not_found/s"
1787
+ }
1788
+ },
1789
+ "refId": "A",
1790
+ "hidden": false
1791
+ }
1792
+ }
1793
+ ],
1794
+ "transformations": [],
1795
+ "queryOptions": {}
1796
+ }
1797
+ },
1798
+ "vizConfig": {
1799
+ "kind": "VizConfig",
1800
+ "group": "timeseries",
1801
+ "version": "",
1802
+ "spec": {
1803
+ "options": {},
1804
+ "fieldConfig": {
1805
+ "defaults": {
1806
+ "unit": "reqps",
1807
+ "min": 0,
1808
+ "color": {
1809
+ "mode": "fixed",
1810
+ "fixedColor": "orange"
1811
+ }
1812
+ },
1813
+ "overrides": []
1814
+ }
1815
+ }
1816
+ }
1817
+ }
1818
+ },
1819
+ "panel-4": {
1820
+ "kind": "Panel",
1821
+ "spec": {
1822
+ "id": 4,
1823
+ "title": "Playlist Segment Count",
1824
+ "description": "Distribution of how many video segments appear in each generated playlist. A median near zero indicates sparse recording coverage for the requested time range. An unusually high count may suggest the time range query is too broad.",
1825
+ "links": [],
1826
+ "data": {
1827
+ "kind": "QueryGroup",
1828
+ "spec": {
1829
+ "queries": [
1830
+ {
1831
+ "kind": "PanelQuery",
1832
+ "spec": {
1833
+ "query": {
1834
+ "kind": "DataQuery",
1835
+ "group": "",
1836
+ "version": "v0",
1837
+ "spec": {
1838
+ "expr": "histogram_quantile(0.50, rate(vms_playlist_segment_count_bucket[5m]))",
1839
+ "legendFormat": "p50"
1840
+ }
1841
+ },
1842
+ "refId": "A",
1843
+ "hidden": false
1844
+ }
1845
+ },
1846
+ {
1847
+ "kind": "PanelQuery",
1848
+ "spec": {
1849
+ "query": {
1850
+ "kind": "DataQuery",
1851
+ "group": "",
1852
+ "version": "v0",
1853
+ "spec": {
1854
+ "expr": "histogram_quantile(0.95, rate(vms_playlist_segment_count_bucket[5m]))",
1855
+ "legendFormat": "p95"
1856
+ }
1857
+ },
1858
+ "refId": "B",
1859
+ "hidden": false
1860
+ }
1861
+ }
1862
+ ],
1863
+ "transformations": [],
1864
+ "queryOptions": {}
1865
+ }
1866
+ },
1867
+ "vizConfig": {
1868
+ "kind": "VizConfig",
1869
+ "group": "timeseries",
1870
+ "version": "",
1871
+ "spec": {
1872
+ "options": {},
1873
+ "fieldConfig": {
1874
+ "defaults": {
1875
+ "unit": "short",
1876
+ "min": 0
1877
+ },
1878
+ "overrides": []
1879
+ }
1880
+ }
1881
+ }
1882
+ }
1883
+ },
1884
+ "panel-40": {
1885
+ "kind": "Panel",
1886
+ "spec": {
1887
+ "id": 40,
1888
+ "title": "Ingestion Lag",
1889
+ "description": "End-to-end delay from edge recording to server processing. High lag means segments are arriving late, which delays playlist availability and impacts playback freshness.",
1890
+ "links": [],
1891
+ "data": {
1892
+ "kind": "QueryGroup",
1893
+ "spec": {
1894
+ "queries": [
1895
+ {
1896
+ "kind": "PanelQuery",
1897
+ "spec": {
1898
+ "query": {
1899
+ "kind": "DataQuery",
1900
+ "group": "",
1901
+ "version": "v0",
1902
+ "spec": {
1903
+ "expr": "histogram_quantile(0.50, rate(vms_segment_ingestion_lag_seconds_bucket[5m]))",
1904
+ "legendFormat": "p50"
1905
+ }
1906
+ },
1907
+ "refId": "A",
1908
+ "hidden": false
1909
+ }
1910
+ },
1911
+ {
1912
+ "kind": "PanelQuery",
1913
+ "spec": {
1914
+ "query": {
1915
+ "kind": "DataQuery",
1916
+ "group": "",
1917
+ "version": "v0",
1918
+ "spec": {
1919
+ "expr": "histogram_quantile(0.95, rate(vms_segment_ingestion_lag_seconds_bucket[5m]))",
1920
+ "legendFormat": "p95"
1921
+ }
1922
+ },
1923
+ "refId": "B",
1924
+ "hidden": false
1925
+ }
1926
+ }
1927
+ ],
1928
+ "transformations": [],
1929
+ "queryOptions": {}
1930
+ }
1931
+ },
1932
+ "vizConfig": {
1933
+ "kind": "VizConfig",
1934
+ "group": "timeseries",
1935
+ "version": "",
1936
+ "spec": {
1937
+ "options": {},
1938
+ "fieldConfig": {
1939
+ "defaults": {
1940
+ "unit": "s",
1941
+ "min": 0
1942
+ },
1943
+ "overrides": []
1944
+ }
1945
+ }
1946
+ }
1947
+ }
1948
+ },
1949
+ "panel-41": {
1950
+ "kind": "Panel",
1951
+ "spec": {
1952
+ "id": 41,
1953
+ "title": "Registration Duration",
1954
+ "description": "Time to register a segment resource via the Imagine API. Sustained high values indicate Imagine API latency or availability issues.",
1955
+ "links": [],
1956
+ "data": {
1957
+ "kind": "QueryGroup",
1958
+ "spec": {
1959
+ "queries": [
1960
+ {
1961
+ "kind": "PanelQuery",
1962
+ "spec": {
1963
+ "query": {
1964
+ "kind": "DataQuery",
1965
+ "group": "",
1966
+ "version": "v0",
1967
+ "spec": {
1968
+ "expr": "histogram_quantile(0.50, rate(vms_segment_registration_duration_seconds_bucket[5m]))",
1969
+ "legendFormat": "p50"
1970
+ }
1971
+ },
1972
+ "refId": "A",
1973
+ "hidden": false
1974
+ }
1975
+ },
1976
+ {
1977
+ "kind": "PanelQuery",
1978
+ "spec": {
1979
+ "query": {
1980
+ "kind": "DataQuery",
1981
+ "group": "",
1982
+ "version": "v0",
1983
+ "spec": {
1984
+ "expr": "histogram_quantile(0.95, rate(vms_segment_registration_duration_seconds_bucket[5m]))",
1985
+ "legendFormat": "p95"
1986
+ }
1987
+ },
1988
+ "refId": "B",
1989
+ "hidden": false
1990
+ }
1991
+ }
1992
+ ],
1993
+ "transformations": [],
1994
+ "queryOptions": {}
1995
+ }
1996
+ },
1997
+ "vizConfig": {
1998
+ "kind": "VizConfig",
1999
+ "group": "timeseries",
2000
+ "version": "",
2001
+ "spec": {
2002
+ "options": {},
2003
+ "fieldConfig": {
2004
+ "defaults": {
2005
+ "unit": "s",
2006
+ "min": 0
2007
+ },
2008
+ "overrides": []
2009
+ }
2010
+ }
2011
+ }
2012
+ }
2013
+ },
2014
+ "panel-42": {
2015
+ "kind": "Panel",
2016
+ "spec": {
2017
+ "id": 42,
2018
+ "title": "Segment Processing Errors",
2019
+ "description": "Rate of segment processing errors by type. Includes message handling failures and camera-not-found errors from unregistered cameras.",
2020
+ "links": [],
2021
+ "data": {
2022
+ "kind": "QueryGroup",
2023
+ "spec": {
2024
+ "queries": [
2025
+ {
2026
+ "kind": "PanelQuery",
2027
+ "spec": {
2028
+ "query": {
2029
+ "kind": "DataQuery",
2030
+ "group": "",
2031
+ "version": "v0",
2032
+ "spec": {
2033
+ "expr": "sum by (__name__) (rate({__name__=~\"vms_segment_processing_errors_.*_total\"}[5m]))",
2034
+ "legendFormat": "{{__name__}}"
2035
+ }
2036
+ },
2037
+ "refId": "A",
2038
+ "hidden": false
2039
+ }
2040
+ }
2041
+ ],
2042
+ "transformations": [],
2043
+ "queryOptions": {}
2044
+ }
2045
+ },
2046
+ "vizConfig": {
2047
+ "kind": "VizConfig",
2048
+ "group": "timeseries",
2049
+ "version": "",
2050
+ "spec": {
2051
+ "options": {},
2052
+ "fieldConfig": {
2053
+ "defaults": {
2054
+ "unit": "reqps",
2055
+ "min": 0,
2056
+ "color": {
2057
+ "mode": "fixed",
2058
+ "fixedColor": "red"
2059
+ }
2060
+ },
2061
+ "overrides": []
2062
+ }
2063
+ }
2064
+ }
2065
+ }
2066
+ },
2067
+ "panel-5": {
2068
+ "kind": "Panel",
2069
+ "spec": {
2070
+ "id": 5,
2071
+ "title": "Recording Gaps per Playlist",
2072
+ "description": "Number of discontinuities (gaps >1 s between consecutive segments) inserted into each playlist. Gaps indicate the camera or recorder was offline during the requested window. A rising p95 signals degraded upstream recording reliability.",
2073
+ "links": [],
2074
+ "data": {
2075
+ "kind": "QueryGroup",
2076
+ "spec": {
2077
+ "queries": [
2078
+ {
2079
+ "kind": "PanelQuery",
2080
+ "spec": {
2081
+ "query": {
2082
+ "kind": "DataQuery",
2083
+ "group": "",
2084
+ "version": "v0",
2085
+ "spec": {
2086
+ "expr": "histogram_quantile(0.50, rate(vms_playlist_gap_count_bucket[5m]))",
2087
+ "legendFormat": "p50"
2088
+ }
2089
+ },
2090
+ "refId": "A",
2091
+ "hidden": false
2092
+ }
2093
+ },
2094
+ {
2095
+ "kind": "PanelQuery",
2096
+ "spec": {
2097
+ "query": {
2098
+ "kind": "DataQuery",
2099
+ "group": "",
2100
+ "version": "v0",
2101
+ "spec": {
2102
+ "expr": "histogram_quantile(0.95, rate(vms_playlist_gap_count_bucket[5m]))",
2103
+ "legendFormat": "p95"
2104
+ }
2105
+ },
2106
+ "refId": "B",
2107
+ "hidden": false
2108
+ }
2109
+ }
2110
+ ],
2111
+ "transformations": [],
2112
+ "queryOptions": {}
2113
+ }
2114
+ },
2115
+ "vizConfig": {
2116
+ "kind": "VizConfig",
2117
+ "group": "timeseries",
2118
+ "version": "",
2119
+ "spec": {
2120
+ "options": {},
2121
+ "fieldConfig": {
2122
+ "defaults": {
2123
+ "unit": "short",
2124
+ "min": 0
2125
+ },
2126
+ "overrides": []
2127
+ }
2128
+ }
2129
+ }
2130
+ }
2131
+ },
2132
+ "panel-6": {
2133
+ "kind": "Panel",
2134
+ "spec": {
2135
+ "id": 6,
2136
+ "title": "Total Gap Duration per Playlist",
2137
+ "description": "Cumulative duration of all recording gaps within a single playlist response. Large values mean a significant fraction of the requested time range has no recorded video. Combine with gap count to distinguish many short gaps from a few long outages.",
2138
+ "links": [],
2139
+ "data": {
2140
+ "kind": "QueryGroup",
2141
+ "spec": {
2142
+ "queries": [
2143
+ {
2144
+ "kind": "PanelQuery",
2145
+ "spec": {
2146
+ "query": {
2147
+ "kind": "DataQuery",
2148
+ "group": "",
2149
+ "version": "v0",
2150
+ "spec": {
2151
+ "expr": "histogram_quantile(0.50, rate(vms_playlist_gap_duration_seconds_bucket[5m]))",
2152
+ "legendFormat": "p50"
2153
+ }
2154
+ },
2155
+ "refId": "A",
2156
+ "hidden": false
2157
+ }
2158
+ },
2159
+ {
2160
+ "kind": "PanelQuery",
2161
+ "spec": {
2162
+ "query": {
2163
+ "kind": "DataQuery",
2164
+ "group": "",
2165
+ "version": "v0",
2166
+ "spec": {
2167
+ "expr": "histogram_quantile(0.95, rate(vms_playlist_gap_duration_seconds_bucket[5m]))",
2168
+ "legendFormat": "p95"
2169
+ }
2170
+ },
2171
+ "refId": "B",
2172
+ "hidden": false
2173
+ }
2174
+ }
2175
+ ],
2176
+ "transformations": [],
2177
+ "queryOptions": {}
2178
+ }
2179
+ },
2180
+ "vizConfig": {
2181
+ "kind": "VizConfig",
2182
+ "group": "timeseries",
2183
+ "version": "",
2184
+ "spec": {
2185
+ "options": {},
2186
+ "fieldConfig": {
2187
+ "defaults": {
2188
+ "unit": "s",
2189
+ "min": 0
2190
+ },
2191
+ "overrides": []
2192
+ }
2193
+ }
2194
+ }
2195
+ }
2196
+ },
2197
+ "panel-8": {
2198
+ "kind": "Panel",
2199
+ "spec": {
2200
+ "id": 8,
2201
+ "title": "BigQuery Query Latency",
2202
+ "description": "Time taken to execute the segment metadata query against BigQuery. This is the dominant cost in playlist generation. p95 above 5 s is a signal to investigate query efficiency or BigQuery slot availability.",
2203
+ "links": [],
2204
+ "data": {
2205
+ "kind": "QueryGroup",
2206
+ "spec": {
2207
+ "queries": [
2208
+ {
2209
+ "kind": "PanelQuery",
2210
+ "spec": {
2211
+ "query": {
2212
+ "kind": "DataQuery",
2213
+ "group": "",
2214
+ "version": "v0",
2215
+ "spec": {
2216
+ "expr": "histogram_quantile(0.50, rate(vms_bq_query_duration_seconds_bucket[5m]))",
2217
+ "legendFormat": "p50"
2218
+ }
2219
+ },
2220
+ "refId": "A",
2221
+ "hidden": false
2222
+ }
2223
+ },
2224
+ {
2225
+ "kind": "PanelQuery",
2226
+ "spec": {
2227
+ "query": {
2228
+ "kind": "DataQuery",
2229
+ "group": "",
2230
+ "version": "v0",
2231
+ "spec": {
2232
+ "expr": "histogram_quantile(0.95, rate(vms_bq_query_duration_seconds_bucket[5m]))",
2233
+ "legendFormat": "p95"
2234
+ }
2235
+ },
2236
+ "refId": "B",
2237
+ "hidden": false
2238
+ }
2239
+ },
2240
+ {
2241
+ "kind": "PanelQuery",
2242
+ "spec": {
2243
+ "query": {
2244
+ "kind": "DataQuery",
2245
+ "group": "",
2246
+ "version": "v0",
2247
+ "spec": {
2248
+ "expr": "histogram_quantile(0.99, rate(vms_bq_query_duration_seconds_bucket[5m]))",
2249
+ "legendFormat": "p99"
2250
+ }
2251
+ },
2252
+ "refId": "C",
2253
+ "hidden": false
2254
+ }
2255
+ }
2256
+ ],
2257
+ "transformations": [],
2258
+ "queryOptions": {}
2259
+ }
2260
+ },
2261
+ "vizConfig": {
2262
+ "kind": "VizConfig",
2263
+ "group": "timeseries",
2264
+ "version": "",
2265
+ "spec": {
2266
+ "options": {},
2267
+ "fieldConfig": {
2268
+ "defaults": {
2269
+ "unit": "s",
2270
+ "min": 0
2271
+ },
2272
+ "overrides": []
2273
+ }
2274
+ }
2275
+ }
2276
+ }
2277
+ },
2278
+ "panel-9": {
2279
+ "kind": "Panel",
2280
+ "spec": {
2281
+ "id": 9,
2282
+ "title": "BigQuery Segments Returned",
2283
+ "description": "Number of segment rows returned per query. A median of zero means there is no recorded footage for the queried time range and quality. Very high values (p95 > 500) may indicate an unusually wide query window.",
2284
+ "links": [],
2285
+ "data": {
2286
+ "kind": "QueryGroup",
2287
+ "spec": {
2288
+ "queries": [
2289
+ {
2290
+ "kind": "PanelQuery",
2291
+ "spec": {
2292
+ "query": {
2293
+ "kind": "DataQuery",
2294
+ "group": "",
2295
+ "version": "v0",
2296
+ "spec": {
2297
+ "expr": "histogram_quantile(0.50, rate(vms_bq_segments_returned_bucket[5m]))",
2298
+ "legendFormat": "p50"
2299
+ }
2300
+ },
2301
+ "refId": "A",
2302
+ "hidden": false
2303
+ }
2304
+ },
2305
+ {
2306
+ "kind": "PanelQuery",
2307
+ "spec": {
2308
+ "query": {
2309
+ "kind": "DataQuery",
2310
+ "group": "",
2311
+ "version": "v0",
2312
+ "spec": {
2313
+ "expr": "histogram_quantile(0.95, rate(vms_bq_segments_returned_bucket[5m]))",
2314
+ "legendFormat": "p95"
2315
+ }
2316
+ },
2317
+ "refId": "B",
2318
+ "hidden": false
2319
+ }
2320
+ }
2321
+ ],
2322
+ "transformations": [],
2323
+ "queryOptions": {}
2324
+ }
2325
+ },
2326
+ "vizConfig": {
2327
+ "kind": "VizConfig",
2328
+ "group": "timeseries",
2329
+ "version": "",
2330
+ "spec": {
2331
+ "options": {},
2332
+ "fieldConfig": {
2333
+ "defaults": {
2334
+ "unit": "short",
2335
+ "min": 0
2336
+ },
2337
+ "overrides": []
2338
+ }
2339
+ }
2340
+ }
2341
+ }
2342
+ }
2343
+ },
2344
+ "layout": {
2345
+ "kind": "RowsLayout",
2346
+ "spec": {
2347
+ "rows": [
2348
+ {
2349
+ "kind": "RowsLayoutRow",
2350
+ "spec": {
2351
+ "title": "",
2352
+ "collapse": false,
2353
+ "hideHeader": true,
2354
+ "layout": {
2355
+ "kind": "GridLayout",
2356
+ "spec": {
2357
+ "items": [
2358
+ {
2359
+ "kind": "GridLayoutItem",
2360
+ "spec": {
2361
+ "x": 0,
2362
+ "y": 0,
2363
+ "width": 12,
2364
+ "height": 4,
2365
+ "element": {
2366
+ "kind": "ElementReference",
2367
+ "name": "panel-25"
2368
+ }
2369
+ }
2370
+ },
2371
+ {
2372
+ "kind": "GridLayoutItem",
2373
+ "spec": {
2374
+ "x": 12,
2375
+ "y": 0,
2376
+ "width": 12,
2377
+ "height": 4,
2378
+ "element": {
2379
+ "kind": "ElementReference",
2380
+ "name": "panel-26"
2381
+ }
2382
+ }
2383
+ },
2384
+ {
2385
+ "kind": "GridLayoutItem",
2386
+ "spec": {
2387
+ "x": 0,
2388
+ "y": 4,
2389
+ "width": 12,
2390
+ "height": 8,
2391
+ "element": {
2392
+ "kind": "ElementReference",
2393
+ "name": "panel-1"
2394
+ }
2395
+ }
2396
+ },
2397
+ {
2398
+ "kind": "GridLayoutItem",
2399
+ "spec": {
2400
+ "x": 12,
2401
+ "y": 4,
2402
+ "width": 12,
2403
+ "height": 8,
2404
+ "element": {
2405
+ "kind": "ElementReference",
2406
+ "name": "panel-2"
2407
+ }
2408
+ }
2409
+ },
2410
+ {
2411
+ "kind": "GridLayoutItem",
2412
+ "spec": {
2413
+ "x": 0,
2414
+ "y": 12,
2415
+ "width": 12,
2416
+ "height": 8,
2417
+ "element": {
2418
+ "kind": "ElementReference",
2419
+ "name": "panel-3"
2420
+ }
2421
+ }
2422
+ },
2423
+ {
2424
+ "kind": "GridLayoutItem",
2425
+ "spec": {
2426
+ "x": 12,
2427
+ "y": 12,
2428
+ "width": 12,
2429
+ "height": 8,
2430
+ "element": {
2431
+ "kind": "ElementReference",
2432
+ "name": "panel-4"
2433
+ }
2434
+ }
2435
+ },
2436
+ {
2437
+ "kind": "GridLayoutItem",
2438
+ "spec": {
2439
+ "x": 0,
2440
+ "y": 20,
2441
+ "width": 12,
2442
+ "height": 8,
2443
+ "element": {
2444
+ "kind": "ElementReference",
2445
+ "name": "panel-5"
2446
+ }
2447
+ }
2448
+ },
2449
+ {
2450
+ "kind": "GridLayoutItem",
2451
+ "spec": {
2452
+ "x": 12,
2453
+ "y": 20,
2454
+ "width": 12,
2455
+ "height": 8,
2456
+ "element": {
2457
+ "kind": "ElementReference",
2458
+ "name": "panel-6"
2459
+ }
2460
+ }
2461
+ },
2462
+ {
2463
+ "kind": "GridLayoutItem",
2464
+ "spec": {
2465
+ "x": 0,
2466
+ "y": 28,
2467
+ "width": 8,
2468
+ "height": 8,
2469
+ "element": {
2470
+ "kind": "ElementReference",
2471
+ "name": "panel-27"
2472
+ }
2473
+ }
2474
+ },
2475
+ {
2476
+ "kind": "GridLayoutItem",
2477
+ "spec": {
2478
+ "x": 8,
2479
+ "y": 28,
2480
+ "width": 8,
2481
+ "height": 8,
2482
+ "element": {
2483
+ "kind": "ElementReference",
2484
+ "name": "panel-28"
2485
+ }
2486
+ }
2487
+ },
2488
+ {
2489
+ "kind": "GridLayoutItem",
2490
+ "spec": {
2491
+ "x": 16,
2492
+ "y": 28,
2493
+ "width": 8,
2494
+ "height": 8,
2495
+ "element": {
2496
+ "kind": "ElementReference",
2497
+ "name": "panel-29"
2498
+ }
2499
+ }
2500
+ }
2501
+ ]
2502
+ }
2503
+ }
2504
+ }
2505
+ },
2506
+ {
2507
+ "kind": "RowsLayoutRow",
2508
+ "spec": {
2509
+ "title": "BigQuery",
2510
+ "collapse": false,
2511
+ "layout": {
2512
+ "kind": "GridLayout",
2513
+ "spec": {
2514
+ "items": [
2515
+ {
2516
+ "kind": "GridLayoutItem",
2517
+ "spec": {
2518
+ "x": 0,
2519
+ "y": 0,
2520
+ "width": 12,
2521
+ "height": 8,
2522
+ "element": {
2523
+ "kind": "ElementReference",
2524
+ "name": "panel-8"
2525
+ }
2526
+ }
2527
+ },
2528
+ {
2529
+ "kind": "GridLayoutItem",
2530
+ "spec": {
2531
+ "x": 12,
2532
+ "y": 0,
2533
+ "width": 6,
2534
+ "height": 8,
2535
+ "element": {
2536
+ "kind": "ElementReference",
2537
+ "name": "panel-9"
2538
+ }
2539
+ }
2540
+ },
2541
+ {
2542
+ "kind": "GridLayoutItem",
2543
+ "spec": {
2544
+ "x": 18,
2545
+ "y": 0,
2546
+ "width": 6,
2547
+ "height": 8,
2548
+ "element": {
2549
+ "kind": "ElementReference",
2550
+ "name": "panel-10"
2551
+ }
2552
+ }
2553
+ }
2554
+ ]
2555
+ }
2556
+ }
2557
+ }
2558
+ },
2559
+ {
2560
+ "kind": "RowsLayoutRow",
2561
+ "spec": {
2562
+ "title": "Cache",
2563
+ "collapse": false,
2564
+ "layout": {
2565
+ "kind": "GridLayout",
2566
+ "spec": {
2567
+ "items": [
2568
+ {
2569
+ "kind": "GridLayoutItem",
2570
+ "spec": {
2571
+ "x": 0,
2572
+ "y": 0,
2573
+ "width": 6,
2574
+ "height": 8,
2575
+ "element": {
2576
+ "kind": "ElementReference",
2577
+ "name": "panel-31"
2578
+ }
2579
+ }
2580
+ },
2581
+ {
2582
+ "kind": "GridLayoutItem",
2583
+ "spec": {
2584
+ "x": 6,
2585
+ "y": 0,
2586
+ "width": 6,
2587
+ "height": 8,
2588
+ "element": {
2589
+ "kind": "ElementReference",
2590
+ "name": "panel-32"
2591
+ }
2592
+ }
2593
+ },
2594
+ {
2595
+ "kind": "GridLayoutItem",
2596
+ "spec": {
2597
+ "x": 12,
2598
+ "y": 0,
2599
+ "width": 6,
2600
+ "height": 8,
2601
+ "element": {
2602
+ "kind": "ElementReference",
2603
+ "name": "panel-33"
2604
+ }
2605
+ }
2606
+ },
2607
+ {
2608
+ "kind": "GridLayoutItem",
2609
+ "spec": {
2610
+ "x": 18,
2611
+ "y": 0,
2612
+ "width": 6,
2613
+ "height": 8,
2614
+ "element": {
2615
+ "kind": "ElementReference",
2616
+ "name": "panel-34"
2617
+ }
2618
+ }
2619
+ }
2620
+ ]
2621
+ }
2622
+ }
2623
+ }
2624
+ },
2625
+ {
2626
+ "kind": "RowsLayoutRow",
2627
+ "spec": {
2628
+ "title": "GCS Streaming",
2629
+ "collapse": false,
2630
+ "layout": {
2631
+ "kind": "GridLayout",
2632
+ "spec": {
2633
+ "items": [
2634
+ {
2635
+ "kind": "GridLayoutItem",
2636
+ "spec": {
2637
+ "x": 0,
2638
+ "y": 0,
2639
+ "width": 8,
2640
+ "height": 8,
2641
+ "element": {
2642
+ "kind": "ElementReference",
2643
+ "name": "panel-12"
2644
+ }
2645
+ }
2646
+ },
2647
+ {
2648
+ "kind": "GridLayoutItem",
2649
+ "spec": {
2650
+ "x": 8,
2651
+ "y": 0,
2652
+ "width": 8,
2653
+ "height": 8,
2654
+ "element": {
2655
+ "kind": "ElementReference",
2656
+ "name": "panel-13"
2657
+ }
2658
+ }
2659
+ },
2660
+ {
2661
+ "kind": "GridLayoutItem",
2662
+ "spec": {
2663
+ "x": 16,
2664
+ "y": 0,
2665
+ "width": 8,
2666
+ "height": 8,
2667
+ "element": {
2668
+ "kind": "ElementReference",
2669
+ "name": "panel-14"
2670
+ }
2671
+ }
2672
+ },
2673
+ {
2674
+ "kind": "GridLayoutItem",
2675
+ "spec": {
2676
+ "x": 0,
2677
+ "y": 8,
2678
+ "width": 12,
2679
+ "height": 8,
2680
+ "element": {
2681
+ "kind": "ElementReference",
2682
+ "name": "panel-15"
2683
+ }
2684
+ }
2685
+ },
2686
+ {
2687
+ "kind": "GridLayoutItem",
2688
+ "spec": {
2689
+ "x": 0,
2690
+ "y": 16,
2691
+ "width": 6,
2692
+ "height": 8,
2693
+ "element": {
2694
+ "kind": "ElementReference",
2695
+ "name": "panel-35"
2696
+ }
2697
+ }
2698
+ },
2699
+ {
2700
+ "kind": "GridLayoutItem",
2701
+ "spec": {
2702
+ "x": 6,
2703
+ "y": 16,
2704
+ "width": 6,
2705
+ "height": 8,
2706
+ "element": {
2707
+ "kind": "ElementReference",
2708
+ "name": "panel-36"
2709
+ }
2710
+ }
2711
+ },
2712
+ {
2713
+ "kind": "GridLayoutItem",
2714
+ "spec": {
2715
+ "x": 12,
2716
+ "y": 16,
2717
+ "width": 6,
2718
+ "height": 8,
2719
+ "element": {
2720
+ "kind": "ElementReference",
2721
+ "name": "panel-37"
2722
+ }
2723
+ }
2724
+ },
2725
+ {
2726
+ "kind": "GridLayoutItem",
2727
+ "spec": {
2728
+ "x": 18,
2729
+ "y": 16,
2730
+ "width": 6,
2731
+ "height": 8,
2732
+ "element": {
2733
+ "kind": "ElementReference",
2734
+ "name": "panel-38"
2735
+ }
2736
+ }
2737
+ }
2738
+ ]
2739
+ }
2740
+ }
2741
+ }
2742
+ },
2743
+ {
2744
+ "kind": "RowsLayoutRow",
2745
+ "spec": {
2746
+ "title": "High Quality Upload Pipeline",
2747
+ "collapse": false,
2748
+ "layout": {
2749
+ "kind": "GridLayout",
2750
+ "spec": {
2751
+ "items": [
2752
+ {
2753
+ "kind": "GridLayoutItem",
2754
+ "spec": {
2755
+ "x": 0,
2756
+ "y": 0,
2757
+ "width": 8,
2758
+ "height": 8,
2759
+ "element": {
2760
+ "kind": "ElementReference",
2761
+ "name": "panel-17"
2762
+ }
2763
+ }
2764
+ },
2765
+ {
2766
+ "kind": "GridLayoutItem",
2767
+ "spec": {
2768
+ "x": 8,
2769
+ "y": 0,
2770
+ "width": 8,
2771
+ "height": 8,
2772
+ "element": {
2773
+ "kind": "ElementReference",
2774
+ "name": "panel-18"
2775
+ }
2776
+ }
2777
+ },
2778
+ {
2779
+ "kind": "GridLayoutItem",
2780
+ "spec": {
2781
+ "x": 16,
2782
+ "y": 0,
2783
+ "width": 8,
2784
+ "height": 8,
2785
+ "element": {
2786
+ "kind": "ElementReference",
2787
+ "name": "panel-19"
2788
+ }
2789
+ }
2790
+ },
2791
+ {
2792
+ "kind": "GridLayoutItem",
2793
+ "spec": {
2794
+ "x": 0,
2795
+ "y": 8,
2796
+ "width": 12,
2797
+ "height": 8,
2798
+ "element": {
2799
+ "kind": "ElementReference",
2800
+ "name": "panel-20"
2801
+ }
2802
+ }
2803
+ }
2804
+ ]
2805
+ }
2806
+ }
2807
+ }
2808
+ },
2809
+ {
2810
+ "kind": "RowsLayoutRow",
2811
+ "spec": {
2812
+ "title": "Segment Processing",
2813
+ "collapse": false,
2814
+ "layout": {
2815
+ "kind": "GridLayout",
2816
+ "spec": {
2817
+ "items": [
2818
+ {
2819
+ "kind": "GridLayoutItem",
2820
+ "spec": {
2821
+ "x": 0,
2822
+ "y": 0,
2823
+ "width": 8,
2824
+ "height": 8,
2825
+ "element": {
2826
+ "kind": "ElementReference",
2827
+ "name": "panel-40"
2828
+ }
2829
+ }
2830
+ },
2831
+ {
2832
+ "kind": "GridLayoutItem",
2833
+ "spec": {
2834
+ "x": 8,
2835
+ "y": 0,
2836
+ "width": 8,
2837
+ "height": 8,
2838
+ "element": {
2839
+ "kind": "ElementReference",
2840
+ "name": "panel-41"
2841
+ }
2842
+ }
2843
+ },
2844
+ {
2845
+ "kind": "GridLayoutItem",
2846
+ "spec": {
2847
+ "x": 16,
2848
+ "y": 0,
2849
+ "width": 8,
2850
+ "height": 8,
2851
+ "element": {
2852
+ "kind": "ElementReference",
2853
+ "name": "panel-42"
2854
+ }
2855
+ }
2856
+ }
2857
+ ]
2858
+ }
2859
+ }
2860
+ }
2861
+ },
2862
+ {
2863
+ "kind": "RowsLayoutRow",
2864
+ "spec": {
2865
+ "title": "Message Queue",
2866
+ "collapse": false,
2867
+ "layout": {
2868
+ "kind": "GridLayout",
2869
+ "spec": {
2870
+ "items": [
2871
+ {
2872
+ "kind": "GridLayoutItem",
2873
+ "spec": {
2874
+ "x": 0,
2875
+ "y": 0,
2876
+ "width": 12,
2877
+ "height": 8,
2878
+ "element": {
2879
+ "kind": "ElementReference",
2880
+ "name": "panel-22"
2881
+ }
2882
+ }
2883
+ },
2884
+ {
2885
+ "kind": "GridLayoutItem",
2886
+ "spec": {
2887
+ "x": 12,
2888
+ "y": 0,
2889
+ "width": 6,
2890
+ "height": 8,
2891
+ "element": {
2892
+ "kind": "ElementReference",
2893
+ "name": "panel-23"
2894
+ }
2895
+ }
2896
+ },
2897
+ {
2898
+ "kind": "GridLayoutItem",
2899
+ "spec": {
2900
+ "x": 18,
2901
+ "y": 0,
2902
+ "width": 6,
2903
+ "height": 8,
2904
+ "element": {
2905
+ "kind": "ElementReference",
2906
+ "name": "panel-24"
2907
+ }
2908
+ }
2909
+ }
2910
+ ]
2911
+ }
2912
+ }
2913
+ }
2914
+ }
2915
+ ]
2916
+ }
2917
+ },
2918
+ "links": [],
2919
+ "liveNow": false,
2920
+ "preload": false,
2921
+ "tags": [
2922
+ "vms",
2923
+ "video",
2924
+ "hls"
2925
+ ],
2926
+ "timeSettings": {
2927
+ "timezone": "browser",
2928
+ "from": "now-6h",
2929
+ "to": "now",
2930
+ "autoRefresh": "30s",
2931
+ "autoRefreshIntervals": [
2932
+ "5s",
2933
+ "10s",
2934
+ "30s",
2935
+ "1m",
2936
+ "5m",
2937
+ "15m",
2938
+ "30m",
2939
+ "1h",
2940
+ "2h",
2941
+ "1d"
2942
+ ],
2943
+ "hideTimepicker": false,
2944
+ "fiscalYearStartMonth": 0
2945
+ },
2946
+ "title": "VMS Server",
2947
+ "variables": []
2948
+ }
2949
+ }