@leverege/build-tools 2.103.0 → 2.105.0
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.
- package/.github/dependabot.yml +7 -0
- package/README.md +20 -8
- package/eslint.config.mjs +13 -0
- package/package.json +14 -14
- package/src/Docker.mjs +3 -3
- package/src/Utils.mjs +33 -4
- package/src/bash-funcs +1 -1
- package/src/build-cnpg-image.mjs +1 -1
- package/src/chart-compass.mjs +3 -3
- package/src/chart-to-registry.mjs +1 -1
- package/src/custom-images/bitnami-audits/bitnami-audit.mjs +1 -1
- package/src/dashboard/DashboardManager.mjs +6 -0
- package/src/dashboard/json/deprecated/pitcrew/triton-server.json +1611 -0
- package/src/dashboard/json/deprecated/pitcrew/vms-server.json +2949 -0
- package/src/dashboard/json/pitcrew/triton-interface.json +1201 -0
- package/src/dashboard/json/pitcrew/vms-server.json +1636 -0
- package/src/firebaseDeploy.mjs +0 -1
- package/src/firebaseServe.mjs +0 -1
- package/src/helm-charts/prom-operator/helmup.plugin +1 -1
- package/src/helm-charts/prom-operator/prometheus-stack.yaml.ovh +24 -2
- package/src/helm-charts/prom-operator/rules/cnpg-rules.yaml +2 -1
- package/src/helm-charts/prom-operator/test-alert.yaml +1 -1
- package/src/overwhelm.mjs +6 -28
- package/src/refresh-npm-token.mjs +116 -197
- package/src/repo-panopticon.mjs +1 -1
- package/src/service-man/config/CommandLine.mjs +6 -3
- package/src/service-man/config/Config.mjs +1 -1
- package/src/service-man/gcloud-k8s/RolesManager.mjs +1 -1
- package/src/service-man/gcloud-k8s/SecretsManager.mjs +3 -3
- package/src/service-man/gcloud-k8s/ServiceAccountManager.mjs +4 -4
- package/src/unleash.mjs +1 -1
|
@@ -0,0 +1,1636 @@
|
|
|
1
|
+
{
|
|
2
|
+
"annotations": {
|
|
3
|
+
"list": [
|
|
4
|
+
{
|
|
5
|
+
"builtIn": 1,
|
|
6
|
+
"datasource": {
|
|
7
|
+
"type": "datasource",
|
|
8
|
+
"uid": "grafana"
|
|
9
|
+
},
|
|
10
|
+
"enable": true,
|
|
11
|
+
"hide": true,
|
|
12
|
+
"iconColor": "rgba(0, 211, 255, 1)",
|
|
13
|
+
"name": "Annotations & Alerts",
|
|
14
|
+
"type": "dashboard"
|
|
15
|
+
}
|
|
16
|
+
]
|
|
17
|
+
},
|
|
18
|
+
"description": "",
|
|
19
|
+
"editable": false,
|
|
20
|
+
"fiscalYearStartMonth": 0,
|
|
21
|
+
"graphTooltip": 0,
|
|
22
|
+
"id": null,
|
|
23
|
+
"links": [],
|
|
24
|
+
"panels": [
|
|
25
|
+
{
|
|
26
|
+
"datasource": {
|
|
27
|
+
"type": "prometheus",
|
|
28
|
+
"uid": "${datasource}"
|
|
29
|
+
},
|
|
30
|
+
"fieldConfig": {
|
|
31
|
+
"defaults": {
|
|
32
|
+
"unit": "short",
|
|
33
|
+
"min": 0
|
|
34
|
+
},
|
|
35
|
+
"overrides": []
|
|
36
|
+
},
|
|
37
|
+
"id": 25,
|
|
38
|
+
"options": {
|
|
39
|
+
"colorMode": "background",
|
|
40
|
+
"graphMode": "none",
|
|
41
|
+
"reduceOptions": {
|
|
42
|
+
"calcs": [
|
|
43
|
+
"lastNotNull"
|
|
44
|
+
]
|
|
45
|
+
},
|
|
46
|
+
"textMode": "value_and_name"
|
|
47
|
+
},
|
|
48
|
+
"targets": [
|
|
49
|
+
{
|
|
50
|
+
"datasource": {
|
|
51
|
+
"type": "prometheus",
|
|
52
|
+
"uid": "${datasource}"
|
|
53
|
+
},
|
|
54
|
+
"expr": "increase(vms_playlist_requests_success[${__range}])",
|
|
55
|
+
"legendFormat": "total",
|
|
56
|
+
"refId": "A"
|
|
57
|
+
}
|
|
58
|
+
],
|
|
59
|
+
"title": "Total Playlist Requests",
|
|
60
|
+
"type": "stat",
|
|
61
|
+
"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.",
|
|
62
|
+
"gridPos": {
|
|
63
|
+
"h": 4,
|
|
64
|
+
"w": 12,
|
|
65
|
+
"x": 0,
|
|
66
|
+
"y": 0
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
"datasource": {
|
|
71
|
+
"type": "prometheus",
|
|
72
|
+
"uid": "${datasource}"
|
|
73
|
+
},
|
|
74
|
+
"fieldConfig": {
|
|
75
|
+
"defaults": {
|
|
76
|
+
"unit": "short",
|
|
77
|
+
"min": 0
|
|
78
|
+
},
|
|
79
|
+
"overrides": []
|
|
80
|
+
},
|
|
81
|
+
"id": 26,
|
|
82
|
+
"options": {
|
|
83
|
+
"colorMode": "background",
|
|
84
|
+
"graphMode": "none",
|
|
85
|
+
"reduceOptions": {
|
|
86
|
+
"calcs": [
|
|
87
|
+
"lastNotNull"
|
|
88
|
+
]
|
|
89
|
+
},
|
|
90
|
+
"textMode": "value_and_name"
|
|
91
|
+
},
|
|
92
|
+
"targets": [
|
|
93
|
+
{
|
|
94
|
+
"datasource": {
|
|
95
|
+
"type": "prometheus",
|
|
96
|
+
"uid": "${datasource}"
|
|
97
|
+
},
|
|
98
|
+
"expr": "increase(vms_segment_requests_success[${__range}])",
|
|
99
|
+
"legendFormat": "total",
|
|
100
|
+
"refId": "A"
|
|
101
|
+
}
|
|
102
|
+
],
|
|
103
|
+
"title": "Total Segment Requests",
|
|
104
|
+
"type": "stat",
|
|
105
|
+
"description": "Total number of successful video segment HTTP requests over the selected dashboard interval. Reflects how many .ts chunks were actually served to clients.",
|
|
106
|
+
"gridPos": {
|
|
107
|
+
"h": 4,
|
|
108
|
+
"w": 12,
|
|
109
|
+
"x": 12,
|
|
110
|
+
"y": 0
|
|
111
|
+
}
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
"datasource": {
|
|
115
|
+
"type": "prometheus",
|
|
116
|
+
"uid": "${datasource}"
|
|
117
|
+
},
|
|
118
|
+
"fieldConfig": {
|
|
119
|
+
"defaults": {
|
|
120
|
+
"unit": "reqps",
|
|
121
|
+
"min": 0
|
|
122
|
+
},
|
|
123
|
+
"overrides": []
|
|
124
|
+
},
|
|
125
|
+
"id": 1,
|
|
126
|
+
"options": {},
|
|
127
|
+
"targets": [
|
|
128
|
+
{
|
|
129
|
+
"datasource": {
|
|
130
|
+
"type": "prometheus",
|
|
131
|
+
"uid": "${datasource}"
|
|
132
|
+
},
|
|
133
|
+
"expr": "rate(vms_playlist_requests_success[5m])",
|
|
134
|
+
"legendFormat": "success/s",
|
|
135
|
+
"refId": "A"
|
|
136
|
+
}
|
|
137
|
+
],
|
|
138
|
+
"title": "Playlist Request Rate",
|
|
139
|
+
"type": "timeseries",
|
|
140
|
+
"description": "Number of M3U8 playlist requests per second. A sustained drop may indicate clients stopped polling or upstream connectivity issues.",
|
|
141
|
+
"gridPos": {
|
|
142
|
+
"h": 9,
|
|
143
|
+
"w": 12,
|
|
144
|
+
"x": 0,
|
|
145
|
+
"y": 4
|
|
146
|
+
}
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
"datasource": {
|
|
150
|
+
"type": "prometheus",
|
|
151
|
+
"uid": "${datasource}"
|
|
152
|
+
},
|
|
153
|
+
"fieldConfig": {
|
|
154
|
+
"defaults": {
|
|
155
|
+
"unit": "reqps",
|
|
156
|
+
"min": 0,
|
|
157
|
+
"color": {
|
|
158
|
+
"mode": "fixed",
|
|
159
|
+
"fixedColor": "red"
|
|
160
|
+
}
|
|
161
|
+
},
|
|
162
|
+
"overrides": []
|
|
163
|
+
},
|
|
164
|
+
"id": 2,
|
|
165
|
+
"options": {},
|
|
166
|
+
"targets": [
|
|
167
|
+
{
|
|
168
|
+
"datasource": {
|
|
169
|
+
"type": "prometheus",
|
|
170
|
+
"uid": "${datasource}"
|
|
171
|
+
},
|
|
172
|
+
"expr": "rate(vms_playlist_requests_error[5m])",
|
|
173
|
+
"legendFormat": "errors/s",
|
|
174
|
+
"refId": "A"
|
|
175
|
+
}
|
|
176
|
+
],
|
|
177
|
+
"title": "Playlist Error Rate",
|
|
178
|
+
"type": "timeseries",
|
|
179
|
+
"description": "Rate of failed playlist requests per second. Errors include BigQuery failures, upload timeouts, and unhandled exceptions. Sustained errors require immediate investigation.",
|
|
180
|
+
"gridPos": {
|
|
181
|
+
"h": 9,
|
|
182
|
+
"w": 12,
|
|
183
|
+
"x": 12,
|
|
184
|
+
"y": 4
|
|
185
|
+
}
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
"datasource": {
|
|
189
|
+
"type": "prometheus",
|
|
190
|
+
"uid": "${datasource}"
|
|
191
|
+
},
|
|
192
|
+
"fieldConfig": {
|
|
193
|
+
"defaults": {
|
|
194
|
+
"unit": "s",
|
|
195
|
+
"min": 0
|
|
196
|
+
},
|
|
197
|
+
"overrides": []
|
|
198
|
+
},
|
|
199
|
+
"id": 3,
|
|
200
|
+
"options": {},
|
|
201
|
+
"targets": [
|
|
202
|
+
{
|
|
203
|
+
"datasource": {
|
|
204
|
+
"type": "prometheus",
|
|
205
|
+
"uid": "${datasource}"
|
|
206
|
+
},
|
|
207
|
+
"expr": "histogram_quantile(0.50, rate(vms_playlist_generation_duration_seconds_bucket[5m]))",
|
|
208
|
+
"legendFormat": "p50",
|
|
209
|
+
"refId": "A"
|
|
210
|
+
},
|
|
211
|
+
{
|
|
212
|
+
"datasource": {
|
|
213
|
+
"type": "prometheus",
|
|
214
|
+
"uid": "${datasource}"
|
|
215
|
+
},
|
|
216
|
+
"expr": "histogram_quantile(0.95, rate(vms_playlist_generation_duration_seconds_bucket[5m]))",
|
|
217
|
+
"legendFormat": "p95",
|
|
218
|
+
"refId": "B"
|
|
219
|
+
},
|
|
220
|
+
{
|
|
221
|
+
"datasource": {
|
|
222
|
+
"type": "prometheus",
|
|
223
|
+
"uid": "${datasource}"
|
|
224
|
+
},
|
|
225
|
+
"expr": "histogram_quantile(0.99, rate(vms_playlist_generation_duration_seconds_bucket[5m]))",
|
|
226
|
+
"legendFormat": "p99",
|
|
227
|
+
"refId": "C"
|
|
228
|
+
}
|
|
229
|
+
],
|
|
230
|
+
"title": "Playlist Generation Latency",
|
|
231
|
+
"type": "timeseries",
|
|
232
|
+
"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.",
|
|
233
|
+
"gridPos": {
|
|
234
|
+
"h": 9,
|
|
235
|
+
"w": 12,
|
|
236
|
+
"x": 0,
|
|
237
|
+
"y": 13
|
|
238
|
+
}
|
|
239
|
+
},
|
|
240
|
+
{
|
|
241
|
+
"datasource": {
|
|
242
|
+
"type": "prometheus",
|
|
243
|
+
"uid": "${datasource}"
|
|
244
|
+
},
|
|
245
|
+
"fieldConfig": {
|
|
246
|
+
"defaults": {
|
|
247
|
+
"unit": "short",
|
|
248
|
+
"min": 0
|
|
249
|
+
},
|
|
250
|
+
"overrides": []
|
|
251
|
+
},
|
|
252
|
+
"id": 4,
|
|
253
|
+
"options": {},
|
|
254
|
+
"targets": [
|
|
255
|
+
{
|
|
256
|
+
"datasource": {
|
|
257
|
+
"type": "prometheus",
|
|
258
|
+
"uid": "${datasource}"
|
|
259
|
+
},
|
|
260
|
+
"expr": "histogram_quantile(0.50, rate(vms_playlist_segment_count_bucket[5m]))",
|
|
261
|
+
"legendFormat": "p50",
|
|
262
|
+
"refId": "A"
|
|
263
|
+
},
|
|
264
|
+
{
|
|
265
|
+
"datasource": {
|
|
266
|
+
"type": "prometheus",
|
|
267
|
+
"uid": "${datasource}"
|
|
268
|
+
},
|
|
269
|
+
"expr": "histogram_quantile(0.95, rate(vms_playlist_segment_count_bucket[5m]))",
|
|
270
|
+
"legendFormat": "p95",
|
|
271
|
+
"refId": "B"
|
|
272
|
+
}
|
|
273
|
+
],
|
|
274
|
+
"title": "Playlist Segment Count",
|
|
275
|
+
"type": "timeseries",
|
|
276
|
+
"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.",
|
|
277
|
+
"gridPos": {
|
|
278
|
+
"h": 9,
|
|
279
|
+
"w": 12,
|
|
280
|
+
"x": 12,
|
|
281
|
+
"y": 13
|
|
282
|
+
}
|
|
283
|
+
},
|
|
284
|
+
{
|
|
285
|
+
"datasource": {
|
|
286
|
+
"type": "prometheus",
|
|
287
|
+
"uid": "${datasource}"
|
|
288
|
+
},
|
|
289
|
+
"fieldConfig": {
|
|
290
|
+
"defaults": {
|
|
291
|
+
"unit": "short",
|
|
292
|
+
"min": 0
|
|
293
|
+
},
|
|
294
|
+
"overrides": []
|
|
295
|
+
},
|
|
296
|
+
"id": 5,
|
|
297
|
+
"options": {},
|
|
298
|
+
"targets": [
|
|
299
|
+
{
|
|
300
|
+
"datasource": {
|
|
301
|
+
"type": "prometheus",
|
|
302
|
+
"uid": "${datasource}"
|
|
303
|
+
},
|
|
304
|
+
"expr": "histogram_quantile(0.50, rate(vms_playlist_gap_count_bucket[5m]))",
|
|
305
|
+
"legendFormat": "p50",
|
|
306
|
+
"refId": "A"
|
|
307
|
+
},
|
|
308
|
+
{
|
|
309
|
+
"datasource": {
|
|
310
|
+
"type": "prometheus",
|
|
311
|
+
"uid": "${datasource}"
|
|
312
|
+
},
|
|
313
|
+
"expr": "histogram_quantile(0.95, rate(vms_playlist_gap_count_bucket[5m]))",
|
|
314
|
+
"legendFormat": "p95",
|
|
315
|
+
"refId": "B"
|
|
316
|
+
}
|
|
317
|
+
],
|
|
318
|
+
"title": "Recording Gaps per Playlist",
|
|
319
|
+
"type": "timeseries",
|
|
320
|
+
"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.",
|
|
321
|
+
"gridPos": {
|
|
322
|
+
"h": 9,
|
|
323
|
+
"w": 12,
|
|
324
|
+
"x": 0,
|
|
325
|
+
"y": 22
|
|
326
|
+
}
|
|
327
|
+
},
|
|
328
|
+
{
|
|
329
|
+
"datasource": {
|
|
330
|
+
"type": "prometheus",
|
|
331
|
+
"uid": "${datasource}"
|
|
332
|
+
},
|
|
333
|
+
"fieldConfig": {
|
|
334
|
+
"defaults": {
|
|
335
|
+
"unit": "s",
|
|
336
|
+
"min": 0
|
|
337
|
+
},
|
|
338
|
+
"overrides": []
|
|
339
|
+
},
|
|
340
|
+
"id": 6,
|
|
341
|
+
"options": {},
|
|
342
|
+
"targets": [
|
|
343
|
+
{
|
|
344
|
+
"datasource": {
|
|
345
|
+
"type": "prometheus",
|
|
346
|
+
"uid": "${datasource}"
|
|
347
|
+
},
|
|
348
|
+
"expr": "histogram_quantile(0.50, rate(vms_playlist_gap_duration_seconds_bucket[5m]))",
|
|
349
|
+
"legendFormat": "p50",
|
|
350
|
+
"refId": "A"
|
|
351
|
+
},
|
|
352
|
+
{
|
|
353
|
+
"datasource": {
|
|
354
|
+
"type": "prometheus",
|
|
355
|
+
"uid": "${datasource}"
|
|
356
|
+
},
|
|
357
|
+
"expr": "histogram_quantile(0.95, rate(vms_playlist_gap_duration_seconds_bucket[5m]))",
|
|
358
|
+
"legendFormat": "p95",
|
|
359
|
+
"refId": "B"
|
|
360
|
+
}
|
|
361
|
+
],
|
|
362
|
+
"title": "Total Gap Duration per Playlist",
|
|
363
|
+
"type": "timeseries",
|
|
364
|
+
"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.",
|
|
365
|
+
"gridPos": {
|
|
366
|
+
"h": 9,
|
|
367
|
+
"w": 12,
|
|
368
|
+
"x": 12,
|
|
369
|
+
"y": 22
|
|
370
|
+
}
|
|
371
|
+
},
|
|
372
|
+
{
|
|
373
|
+
"datasource": {
|
|
374
|
+
"type": "prometheus",
|
|
375
|
+
"uid": "${datasource}"
|
|
376
|
+
},
|
|
377
|
+
"fieldConfig": {
|
|
378
|
+
"defaults": {
|
|
379
|
+
"unit": "s",
|
|
380
|
+
"min": 0
|
|
381
|
+
},
|
|
382
|
+
"overrides": []
|
|
383
|
+
},
|
|
384
|
+
"id": 8,
|
|
385
|
+
"options": {},
|
|
386
|
+
"targets": [
|
|
387
|
+
{
|
|
388
|
+
"datasource": {
|
|
389
|
+
"type": "prometheus",
|
|
390
|
+
"uid": "${datasource}"
|
|
391
|
+
},
|
|
392
|
+
"expr": "histogram_quantile(0.50, rate(vms_bq_query_duration_seconds_bucket[5m]))",
|
|
393
|
+
"legendFormat": "p50",
|
|
394
|
+
"refId": "A"
|
|
395
|
+
},
|
|
396
|
+
{
|
|
397
|
+
"datasource": {
|
|
398
|
+
"type": "prometheus",
|
|
399
|
+
"uid": "${datasource}"
|
|
400
|
+
},
|
|
401
|
+
"expr": "histogram_quantile(0.95, rate(vms_bq_query_duration_seconds_bucket[5m]))",
|
|
402
|
+
"legendFormat": "p95",
|
|
403
|
+
"refId": "B"
|
|
404
|
+
},
|
|
405
|
+
{
|
|
406
|
+
"datasource": {
|
|
407
|
+
"type": "prometheus",
|
|
408
|
+
"uid": "${datasource}"
|
|
409
|
+
},
|
|
410
|
+
"expr": "histogram_quantile(0.99, rate(vms_bq_query_duration_seconds_bucket[5m]))",
|
|
411
|
+
"legendFormat": "p99",
|
|
412
|
+
"refId": "C"
|
|
413
|
+
}
|
|
414
|
+
],
|
|
415
|
+
"title": "BigQuery Query Latency",
|
|
416
|
+
"type": "timeseries",
|
|
417
|
+
"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.",
|
|
418
|
+
"gridPos": {
|
|
419
|
+
"h": 9,
|
|
420
|
+
"w": 12,
|
|
421
|
+
"x": 0,
|
|
422
|
+
"y": 31
|
|
423
|
+
}
|
|
424
|
+
},
|
|
425
|
+
{
|
|
426
|
+
"datasource": {
|
|
427
|
+
"type": "prometheus",
|
|
428
|
+
"uid": "${datasource}"
|
|
429
|
+
},
|
|
430
|
+
"fieldConfig": {
|
|
431
|
+
"defaults": {
|
|
432
|
+
"unit": "short",
|
|
433
|
+
"min": 0
|
|
434
|
+
},
|
|
435
|
+
"overrides": []
|
|
436
|
+
},
|
|
437
|
+
"id": 9,
|
|
438
|
+
"options": {},
|
|
439
|
+
"targets": [
|
|
440
|
+
{
|
|
441
|
+
"datasource": {
|
|
442
|
+
"type": "prometheus",
|
|
443
|
+
"uid": "${datasource}"
|
|
444
|
+
},
|
|
445
|
+
"expr": "histogram_quantile(0.50, rate(vms_bq_segments_returned_bucket[5m]))",
|
|
446
|
+
"legendFormat": "p50",
|
|
447
|
+
"refId": "A"
|
|
448
|
+
},
|
|
449
|
+
{
|
|
450
|
+
"datasource": {
|
|
451
|
+
"type": "prometheus",
|
|
452
|
+
"uid": "${datasource}"
|
|
453
|
+
},
|
|
454
|
+
"expr": "histogram_quantile(0.95, rate(vms_bq_segments_returned_bucket[5m]))",
|
|
455
|
+
"legendFormat": "p95",
|
|
456
|
+
"refId": "B"
|
|
457
|
+
}
|
|
458
|
+
],
|
|
459
|
+
"title": "BigQuery Segments Returned",
|
|
460
|
+
"type": "timeseries",
|
|
461
|
+
"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.",
|
|
462
|
+
"gridPos": {
|
|
463
|
+
"h": 9,
|
|
464
|
+
"w": 12,
|
|
465
|
+
"x": 12,
|
|
466
|
+
"y": 31
|
|
467
|
+
}
|
|
468
|
+
},
|
|
469
|
+
{
|
|
470
|
+
"datasource": {
|
|
471
|
+
"type": "prometheus",
|
|
472
|
+
"uid": "${datasource}"
|
|
473
|
+
},
|
|
474
|
+
"fieldConfig": {
|
|
475
|
+
"defaults": {
|
|
476
|
+
"unit": "reqps",
|
|
477
|
+
"min": 0,
|
|
478
|
+
"color": {
|
|
479
|
+
"mode": "fixed",
|
|
480
|
+
"fixedColor": "red"
|
|
481
|
+
}
|
|
482
|
+
},
|
|
483
|
+
"overrides": []
|
|
484
|
+
},
|
|
485
|
+
"id": 10,
|
|
486
|
+
"options": {},
|
|
487
|
+
"targets": [
|
|
488
|
+
{
|
|
489
|
+
"datasource": {
|
|
490
|
+
"type": "prometheus",
|
|
491
|
+
"uid": "${datasource}"
|
|
492
|
+
},
|
|
493
|
+
"expr": "rate(vms_bq_errors_total[5m])",
|
|
494
|
+
"legendFormat": "errors/s",
|
|
495
|
+
"refId": "A"
|
|
496
|
+
}
|
|
497
|
+
],
|
|
498
|
+
"title": "BigQuery Error Rate",
|
|
499
|
+
"type": "timeseries",
|
|
500
|
+
"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.",
|
|
501
|
+
"gridPos": {
|
|
502
|
+
"h": 9,
|
|
503
|
+
"w": 12,
|
|
504
|
+
"x": 0,
|
|
505
|
+
"y": 40
|
|
506
|
+
}
|
|
507
|
+
},
|
|
508
|
+
{
|
|
509
|
+
"datasource": {
|
|
510
|
+
"type": "prometheus",
|
|
511
|
+
"uid": "${datasource}"
|
|
512
|
+
},
|
|
513
|
+
"fieldConfig": {
|
|
514
|
+
"defaults": {
|
|
515
|
+
"unit": "short",
|
|
516
|
+
"min": 0
|
|
517
|
+
},
|
|
518
|
+
"overrides": []
|
|
519
|
+
},
|
|
520
|
+
"id": 12,
|
|
521
|
+
"options": {},
|
|
522
|
+
"targets": [
|
|
523
|
+
{
|
|
524
|
+
"datasource": {
|
|
525
|
+
"type": "prometheus",
|
|
526
|
+
"uid": "${datasource}"
|
|
527
|
+
},
|
|
528
|
+
"expr": "vms_active_streams",
|
|
529
|
+
"legendFormat": "active streams",
|
|
530
|
+
"refId": "A"
|
|
531
|
+
}
|
|
532
|
+
],
|
|
533
|
+
"title": "Active Segment Streams",
|
|
534
|
+
"type": "timeseries",
|
|
535
|
+
"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.",
|
|
536
|
+
"gridPos": {
|
|
537
|
+
"h": 9,
|
|
538
|
+
"w": 12,
|
|
539
|
+
"x": 12,
|
|
540
|
+
"y": 40
|
|
541
|
+
}
|
|
542
|
+
},
|
|
543
|
+
{
|
|
544
|
+
"datasource": {
|
|
545
|
+
"type": "prometheus",
|
|
546
|
+
"uid": "${datasource}"
|
|
547
|
+
},
|
|
548
|
+
"fieldConfig": {
|
|
549
|
+
"defaults": {
|
|
550
|
+
"unit": "Bps",
|
|
551
|
+
"min": 0
|
|
552
|
+
},
|
|
553
|
+
"overrides": []
|
|
554
|
+
},
|
|
555
|
+
"id": 13,
|
|
556
|
+
"options": {},
|
|
557
|
+
"targets": [
|
|
558
|
+
{
|
|
559
|
+
"datasource": {
|
|
560
|
+
"type": "prometheus",
|
|
561
|
+
"uid": "${datasource}"
|
|
562
|
+
},
|
|
563
|
+
"expr": "rate(vms_gcs_bytes_served_total[5m])",
|
|
564
|
+
"legendFormat": "bytes/s",
|
|
565
|
+
"refId": "A"
|
|
566
|
+
}
|
|
567
|
+
],
|
|
568
|
+
"title": "GCS Bytes Served",
|
|
569
|
+
"type": "timeseries",
|
|
570
|
+
"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.",
|
|
571
|
+
"gridPos": {
|
|
572
|
+
"h": 9,
|
|
573
|
+
"w": 12,
|
|
574
|
+
"x": 0,
|
|
575
|
+
"y": 49
|
|
576
|
+
}
|
|
577
|
+
},
|
|
578
|
+
{
|
|
579
|
+
"datasource": {
|
|
580
|
+
"type": "prometheus",
|
|
581
|
+
"uid": "${datasource}"
|
|
582
|
+
},
|
|
583
|
+
"fieldConfig": {
|
|
584
|
+
"defaults": {
|
|
585
|
+
"unit": "reqps",
|
|
586
|
+
"min": 0,
|
|
587
|
+
"color": {
|
|
588
|
+
"mode": "fixed",
|
|
589
|
+
"fixedColor": "red"
|
|
590
|
+
}
|
|
591
|
+
},
|
|
592
|
+
"overrides": []
|
|
593
|
+
},
|
|
594
|
+
"id": 14,
|
|
595
|
+
"options": {},
|
|
596
|
+
"targets": [
|
|
597
|
+
{
|
|
598
|
+
"datasource": {
|
|
599
|
+
"type": "prometheus",
|
|
600
|
+
"uid": "${datasource}"
|
|
601
|
+
},
|
|
602
|
+
"expr": "rate(vms_gcs_errors_total[5m])",
|
|
603
|
+
"legendFormat": "errors/s",
|
|
604
|
+
"refId": "A"
|
|
605
|
+
}
|
|
606
|
+
],
|
|
607
|
+
"title": "GCS Streaming Errors",
|
|
608
|
+
"type": "timeseries",
|
|
609
|
+
"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.",
|
|
610
|
+
"gridPos": {
|
|
611
|
+
"h": 9,
|
|
612
|
+
"w": 12,
|
|
613
|
+
"x": 12,
|
|
614
|
+
"y": 49
|
|
615
|
+
}
|
|
616
|
+
},
|
|
617
|
+
{
|
|
618
|
+
"datasource": {
|
|
619
|
+
"type": "prometheus",
|
|
620
|
+
"uid": "${datasource}"
|
|
621
|
+
},
|
|
622
|
+
"fieldConfig": {
|
|
623
|
+
"defaults": {
|
|
624
|
+
"unit": "reqps",
|
|
625
|
+
"min": 0
|
|
626
|
+
},
|
|
627
|
+
"overrides": []
|
|
628
|
+
},
|
|
629
|
+
"id": 15,
|
|
630
|
+
"options": {},
|
|
631
|
+
"targets": [
|
|
632
|
+
{
|
|
633
|
+
"datasource": {
|
|
634
|
+
"type": "prometheus",
|
|
635
|
+
"uid": "${datasource}"
|
|
636
|
+
},
|
|
637
|
+
"expr": "rate(vms_segment_requests_success[5m])",
|
|
638
|
+
"legendFormat": "success/s",
|
|
639
|
+
"refId": "A"
|
|
640
|
+
},
|
|
641
|
+
{
|
|
642
|
+
"datasource": {
|
|
643
|
+
"type": "prometheus",
|
|
644
|
+
"uid": "${datasource}"
|
|
645
|
+
},
|
|
646
|
+
"expr": "rate(vms_segment_requests_error[5m])",
|
|
647
|
+
"legendFormat": "errors/s",
|
|
648
|
+
"refId": "B"
|
|
649
|
+
}
|
|
650
|
+
],
|
|
651
|
+
"title": "Segment Request Rate",
|
|
652
|
+
"type": "timeseries",
|
|
653
|
+
"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.",
|
|
654
|
+
"gridPos": {
|
|
655
|
+
"h": 9,
|
|
656
|
+
"w": 12,
|
|
657
|
+
"x": 0,
|
|
658
|
+
"y": 58
|
|
659
|
+
}
|
|
660
|
+
},
|
|
661
|
+
{
|
|
662
|
+
"datasource": {
|
|
663
|
+
"type": "prometheus",
|
|
664
|
+
"uid": "${datasource}"
|
|
665
|
+
},
|
|
666
|
+
"fieldConfig": {
|
|
667
|
+
"defaults": {
|
|
668
|
+
"unit": "reqps",
|
|
669
|
+
"min": 0
|
|
670
|
+
},
|
|
671
|
+
"overrides": []
|
|
672
|
+
},
|
|
673
|
+
"id": 17,
|
|
674
|
+
"options": {},
|
|
675
|
+
"targets": [
|
|
676
|
+
{
|
|
677
|
+
"datasource": {
|
|
678
|
+
"type": "prometheus",
|
|
679
|
+
"uid": "${datasource}"
|
|
680
|
+
},
|
|
681
|
+
"expr": "rate(vms_upload_requests[5m])",
|
|
682
|
+
"legendFormat": "requests/s",
|
|
683
|
+
"refId": "A"
|
|
684
|
+
}
|
|
685
|
+
],
|
|
686
|
+
"title": "Upload Requests",
|
|
687
|
+
"type": "timeseries",
|
|
688
|
+
"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.",
|
|
689
|
+
"gridPos": {
|
|
690
|
+
"h": 9,
|
|
691
|
+
"w": 12,
|
|
692
|
+
"x": 12,
|
|
693
|
+
"y": 58
|
|
694
|
+
}
|
|
695
|
+
},
|
|
696
|
+
{
|
|
697
|
+
"datasource": {
|
|
698
|
+
"type": "prometheus",
|
|
699
|
+
"uid": "${datasource}"
|
|
700
|
+
},
|
|
701
|
+
"fieldConfig": {
|
|
702
|
+
"defaults": {
|
|
703
|
+
"unit": "s",
|
|
704
|
+
"min": 0,
|
|
705
|
+
"max": 30
|
|
706
|
+
},
|
|
707
|
+
"overrides": []
|
|
708
|
+
},
|
|
709
|
+
"id": 18,
|
|
710
|
+
"options": {},
|
|
711
|
+
"targets": [
|
|
712
|
+
{
|
|
713
|
+
"datasource": {
|
|
714
|
+
"type": "prometheus",
|
|
715
|
+
"uid": "${datasource}"
|
|
716
|
+
},
|
|
717
|
+
"expr": "histogram_quantile(0.50, rate(vms_upload_poll_duration_seconds_bucket[5m]))",
|
|
718
|
+
"legendFormat": "p50",
|
|
719
|
+
"refId": "A"
|
|
720
|
+
},
|
|
721
|
+
{
|
|
722
|
+
"datasource": {
|
|
723
|
+
"type": "prometheus",
|
|
724
|
+
"uid": "${datasource}"
|
|
725
|
+
},
|
|
726
|
+
"expr": "histogram_quantile(0.95, rate(vms_upload_poll_duration_seconds_bucket[5m]))",
|
|
727
|
+
"legendFormat": "p95",
|
|
728
|
+
"refId": "B"
|
|
729
|
+
}
|
|
730
|
+
],
|
|
731
|
+
"title": "Upload Poll Duration",
|
|
732
|
+
"type": "timeseries",
|
|
733
|
+
"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.",
|
|
734
|
+
"gridPos": {
|
|
735
|
+
"h": 9,
|
|
736
|
+
"w": 12,
|
|
737
|
+
"x": 0,
|
|
738
|
+
"y": 67
|
|
739
|
+
}
|
|
740
|
+
},
|
|
741
|
+
{
|
|
742
|
+
"datasource": {
|
|
743
|
+
"type": "prometheus",
|
|
744
|
+
"uid": "${datasource}"
|
|
745
|
+
},
|
|
746
|
+
"fieldConfig": {
|
|
747
|
+
"defaults": {
|
|
748
|
+
"unit": "reqps",
|
|
749
|
+
"min": 0,
|
|
750
|
+
"color": {
|
|
751
|
+
"mode": "fixed",
|
|
752
|
+
"fixedColor": "orange"
|
|
753
|
+
}
|
|
754
|
+
},
|
|
755
|
+
"overrides": []
|
|
756
|
+
},
|
|
757
|
+
"id": 19,
|
|
758
|
+
"options": {},
|
|
759
|
+
"targets": [
|
|
760
|
+
{
|
|
761
|
+
"datasource": {
|
|
762
|
+
"type": "prometheus",
|
|
763
|
+
"uid": "${datasource}"
|
|
764
|
+
},
|
|
765
|
+
"expr": "rate(vms_upload_timeouts_total[5m])",
|
|
766
|
+
"legendFormat": "timeouts/s",
|
|
767
|
+
"refId": "A"
|
|
768
|
+
}
|
|
769
|
+
],
|
|
770
|
+
"title": "Upload Timeouts",
|
|
771
|
+
"type": "timeseries",
|
|
772
|
+
"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.",
|
|
773
|
+
"gridPos": {
|
|
774
|
+
"h": 9,
|
|
775
|
+
"w": 12,
|
|
776
|
+
"x": 12,
|
|
777
|
+
"y": 67
|
|
778
|
+
}
|
|
779
|
+
},
|
|
780
|
+
{
|
|
781
|
+
"datasource": {
|
|
782
|
+
"type": "prometheus",
|
|
783
|
+
"uid": "${datasource}"
|
|
784
|
+
},
|
|
785
|
+
"fieldConfig": {
|
|
786
|
+
"defaults": {
|
|
787
|
+
"unit": "reqps",
|
|
788
|
+
"min": 0
|
|
789
|
+
},
|
|
790
|
+
"overrides": []
|
|
791
|
+
},
|
|
792
|
+
"id": 20,
|
|
793
|
+
"options": {},
|
|
794
|
+
"targets": [
|
|
795
|
+
{
|
|
796
|
+
"datasource": {
|
|
797
|
+
"type": "prometheus",
|
|
798
|
+
"uid": "${datasource}"
|
|
799
|
+
},
|
|
800
|
+
"expr": "rate(vms_upload_response_completed[5m])",
|
|
801
|
+
"legendFormat": "completed/s",
|
|
802
|
+
"refId": "A"
|
|
803
|
+
},
|
|
804
|
+
{
|
|
805
|
+
"datasource": {
|
|
806
|
+
"type": "prometheus",
|
|
807
|
+
"uid": "${datasource}"
|
|
808
|
+
},
|
|
809
|
+
"expr": "rate(vms_upload_response_partial[5m])",
|
|
810
|
+
"legendFormat": "partial/s",
|
|
811
|
+
"refId": "B"
|
|
812
|
+
},
|
|
813
|
+
{
|
|
814
|
+
"datasource": {
|
|
815
|
+
"type": "prometheus",
|
|
816
|
+
"uid": "${datasource}"
|
|
817
|
+
},
|
|
818
|
+
"expr": "rate(vms_upload_response_failed[5m])",
|
|
819
|
+
"legendFormat": "failed/s",
|
|
820
|
+
"refId": "C"
|
|
821
|
+
},
|
|
822
|
+
{
|
|
823
|
+
"datasource": {
|
|
824
|
+
"type": "prometheus",
|
|
825
|
+
"uid": "${datasource}"
|
|
826
|
+
},
|
|
827
|
+
"expr": "rate(vms_upload_response_not_found[5m])",
|
|
828
|
+
"legendFormat": "not_found/s",
|
|
829
|
+
"refId": "D"
|
|
830
|
+
}
|
|
831
|
+
],
|
|
832
|
+
"title": "Upload Response Status Distribution",
|
|
833
|
+
"type": "timeseries",
|
|
834
|
+
"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.",
|
|
835
|
+
"gridPos": {
|
|
836
|
+
"h": 9,
|
|
837
|
+
"w": 12,
|
|
838
|
+
"x": 0,
|
|
839
|
+
"y": 76
|
|
840
|
+
}
|
|
841
|
+
},
|
|
842
|
+
{
|
|
843
|
+
"datasource": {
|
|
844
|
+
"type": "prometheus",
|
|
845
|
+
"uid": "${datasource}"
|
|
846
|
+
},
|
|
847
|
+
"fieldConfig": {
|
|
848
|
+
"defaults": {
|
|
849
|
+
"unit": "reqps",
|
|
850
|
+
"min": 0
|
|
851
|
+
},
|
|
852
|
+
"overrides": []
|
|
853
|
+
},
|
|
854
|
+
"id": 22,
|
|
855
|
+
"options": {},
|
|
856
|
+
"targets": [
|
|
857
|
+
{
|
|
858
|
+
"datasource": {
|
|
859
|
+
"type": "prometheus",
|
|
860
|
+
"uid": "${datasource}"
|
|
861
|
+
},
|
|
862
|
+
"expr": "rate(ordered_q_enqueue_count[5m])",
|
|
863
|
+
"legendFormat": "enqueued/s",
|
|
864
|
+
"refId": "A"
|
|
865
|
+
},
|
|
866
|
+
{
|
|
867
|
+
"datasource": {
|
|
868
|
+
"type": "prometheus",
|
|
869
|
+
"uid": "${datasource}"
|
|
870
|
+
},
|
|
871
|
+
"expr": "rate(ordered_q_dequeue_count[5m])",
|
|
872
|
+
"legendFormat": "dequeued/s",
|
|
873
|
+
"refId": "B"
|
|
874
|
+
},
|
|
875
|
+
{
|
|
876
|
+
"datasource": {
|
|
877
|
+
"type": "prometheus",
|
|
878
|
+
"uid": "${datasource}"
|
|
879
|
+
},
|
|
880
|
+
"expr": "rate(ordered_q_processed_count[5m])",
|
|
881
|
+
"legendFormat": "processed/s",
|
|
882
|
+
"refId": "C"
|
|
883
|
+
}
|
|
884
|
+
],
|
|
885
|
+
"title": "Queue Throughput",
|
|
886
|
+
"type": "timeseries",
|
|
887
|
+
"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.",
|
|
888
|
+
"gridPos": {
|
|
889
|
+
"h": 9,
|
|
890
|
+
"w": 12,
|
|
891
|
+
"x": 12,
|
|
892
|
+
"y": 76
|
|
893
|
+
}
|
|
894
|
+
},
|
|
895
|
+
{
|
|
896
|
+
"datasource": {
|
|
897
|
+
"type": "prometheus",
|
|
898
|
+
"uid": "${datasource}"
|
|
899
|
+
},
|
|
900
|
+
"fieldConfig": {
|
|
901
|
+
"defaults": {
|
|
902
|
+
"unit": "reqps",
|
|
903
|
+
"min": 0,
|
|
904
|
+
"color": {
|
|
905
|
+
"mode": "fixed",
|
|
906
|
+
"fixedColor": "red"
|
|
907
|
+
}
|
|
908
|
+
},
|
|
909
|
+
"overrides": []
|
|
910
|
+
},
|
|
911
|
+
"id": 23,
|
|
912
|
+
"options": {},
|
|
913
|
+
"targets": [
|
|
914
|
+
{
|
|
915
|
+
"datasource": {
|
|
916
|
+
"type": "prometheus",
|
|
917
|
+
"uid": "${datasource}"
|
|
918
|
+
},
|
|
919
|
+
"expr": "rate(ordered_q_process_error_count[5m])",
|
|
920
|
+
"legendFormat": "errors/s",
|
|
921
|
+
"refId": "A"
|
|
922
|
+
}
|
|
923
|
+
],
|
|
924
|
+
"title": "Queue Processing Errors",
|
|
925
|
+
"type": "timeseries",
|
|
926
|
+
"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.",
|
|
927
|
+
"gridPos": {
|
|
928
|
+
"h": 9,
|
|
929
|
+
"w": 12,
|
|
930
|
+
"x": 0,
|
|
931
|
+
"y": 85
|
|
932
|
+
}
|
|
933
|
+
},
|
|
934
|
+
{
|
|
935
|
+
"datasource": {
|
|
936
|
+
"type": "prometheus",
|
|
937
|
+
"uid": "${datasource}"
|
|
938
|
+
},
|
|
939
|
+
"fieldConfig": {
|
|
940
|
+
"defaults": {
|
|
941
|
+
"unit": "short",
|
|
942
|
+
"min": 0
|
|
943
|
+
},
|
|
944
|
+
"overrides": []
|
|
945
|
+
},
|
|
946
|
+
"id": 24,
|
|
947
|
+
"options": {},
|
|
948
|
+
"targets": [
|
|
949
|
+
{
|
|
950
|
+
"datasource": {
|
|
951
|
+
"type": "prometheus",
|
|
952
|
+
"uid": "${datasource}"
|
|
953
|
+
},
|
|
954
|
+
"expr": "ordered_q_processing_queues",
|
|
955
|
+
"legendFormat": "active queues",
|
|
956
|
+
"refId": "A"
|
|
957
|
+
}
|
|
958
|
+
],
|
|
959
|
+
"title": "Active Processing Queues",
|
|
960
|
+
"type": "timeseries",
|
|
961
|
+
"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.",
|
|
962
|
+
"gridPos": {
|
|
963
|
+
"h": 9,
|
|
964
|
+
"w": 12,
|
|
965
|
+
"x": 12,
|
|
966
|
+
"y": 85
|
|
967
|
+
}
|
|
968
|
+
},
|
|
969
|
+
{
|
|
970
|
+
"datasource": {
|
|
971
|
+
"type": "prometheus",
|
|
972
|
+
"uid": "${datasource}"
|
|
973
|
+
},
|
|
974
|
+
"fieldConfig": {
|
|
975
|
+
"defaults": {
|
|
976
|
+
"unit": "percentunit",
|
|
977
|
+
"min": 0,
|
|
978
|
+
"max": 1
|
|
979
|
+
},
|
|
980
|
+
"overrides": []
|
|
981
|
+
},
|
|
982
|
+
"id": 27,
|
|
983
|
+
"options": {},
|
|
984
|
+
"targets": [
|
|
985
|
+
{
|
|
986
|
+
"datasource": {
|
|
987
|
+
"type": "prometheus",
|
|
988
|
+
"uid": "${datasource}"
|
|
989
|
+
},
|
|
990
|
+
"expr": "histogram_quantile(0.50, rate(vms_playlist_coverage_ratio_bucket[5m]))",
|
|
991
|
+
"legendFormat": "p50",
|
|
992
|
+
"refId": "A"
|
|
993
|
+
},
|
|
994
|
+
{
|
|
995
|
+
"datasource": {
|
|
996
|
+
"type": "prometheus",
|
|
997
|
+
"uid": "${datasource}"
|
|
998
|
+
},
|
|
999
|
+
"expr": "histogram_quantile(0.95, rate(vms_playlist_coverage_ratio_bucket[5m]))",
|
|
1000
|
+
"legendFormat": "p95",
|
|
1001
|
+
"refId": "B"
|
|
1002
|
+
}
|
|
1003
|
+
],
|
|
1004
|
+
"title": "Coverage Ratio",
|
|
1005
|
+
"type": "timeseries",
|
|
1006
|
+
"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.",
|
|
1007
|
+
"gridPos": {
|
|
1008
|
+
"h": 9,
|
|
1009
|
+
"w": 12,
|
|
1010
|
+
"x": 0,
|
|
1011
|
+
"y": 94
|
|
1012
|
+
}
|
|
1013
|
+
},
|
|
1014
|
+
{
|
|
1015
|
+
"datasource": {
|
|
1016
|
+
"type": "prometheus",
|
|
1017
|
+
"uid": "${datasource}"
|
|
1018
|
+
},
|
|
1019
|
+
"fieldConfig": {
|
|
1020
|
+
"defaults": {
|
|
1021
|
+
"unit": "s",
|
|
1022
|
+
"min": 0
|
|
1023
|
+
},
|
|
1024
|
+
"overrides": []
|
|
1025
|
+
},
|
|
1026
|
+
"id": 28,
|
|
1027
|
+
"options": {},
|
|
1028
|
+
"targets": [
|
|
1029
|
+
{
|
|
1030
|
+
"datasource": {
|
|
1031
|
+
"type": "prometheus",
|
|
1032
|
+
"uid": "${datasource}"
|
|
1033
|
+
},
|
|
1034
|
+
"expr": "histogram_quantile(0.50, rate(vms_segment_staleness_seconds_bucket[5m]))",
|
|
1035
|
+
"legendFormat": "p50",
|
|
1036
|
+
"refId": "A"
|
|
1037
|
+
},
|
|
1038
|
+
{
|
|
1039
|
+
"datasource": {
|
|
1040
|
+
"type": "prometheus",
|
|
1041
|
+
"uid": "${datasource}"
|
|
1042
|
+
},
|
|
1043
|
+
"expr": "histogram_quantile(0.95, rate(vms_segment_staleness_seconds_bucket[5m]))",
|
|
1044
|
+
"legendFormat": "p95",
|
|
1045
|
+
"refId": "B"
|
|
1046
|
+
}
|
|
1047
|
+
],
|
|
1048
|
+
"title": "Segment Staleness",
|
|
1049
|
+
"type": "timeseries",
|
|
1050
|
+
"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.",
|
|
1051
|
+
"gridPos": {
|
|
1052
|
+
"h": 9,
|
|
1053
|
+
"w": 12,
|
|
1054
|
+
"x": 12,
|
|
1055
|
+
"y": 94
|
|
1056
|
+
}
|
|
1057
|
+
},
|
|
1058
|
+
{
|
|
1059
|
+
"datasource": {
|
|
1060
|
+
"type": "prometheus",
|
|
1061
|
+
"uid": "${datasource}"
|
|
1062
|
+
},
|
|
1063
|
+
"fieldConfig": {
|
|
1064
|
+
"defaults": {
|
|
1065
|
+
"unit": "s",
|
|
1066
|
+
"min": 0
|
|
1067
|
+
},
|
|
1068
|
+
"overrides": []
|
|
1069
|
+
},
|
|
1070
|
+
"id": 29,
|
|
1071
|
+
"options": {},
|
|
1072
|
+
"targets": [
|
|
1073
|
+
{
|
|
1074
|
+
"datasource": {
|
|
1075
|
+
"type": "prometheus",
|
|
1076
|
+
"uid": "${datasource}"
|
|
1077
|
+
},
|
|
1078
|
+
"expr": "histogram_quantile(0.50, rate(vms_playlist_total_gap_seconds_bucket[5m]))",
|
|
1079
|
+
"legendFormat": "p50",
|
|
1080
|
+
"refId": "A"
|
|
1081
|
+
},
|
|
1082
|
+
{
|
|
1083
|
+
"datasource": {
|
|
1084
|
+
"type": "prometheus",
|
|
1085
|
+
"uid": "${datasource}"
|
|
1086
|
+
},
|
|
1087
|
+
"expr": "histogram_quantile(0.95, rate(vms_playlist_total_gap_seconds_bucket[5m]))",
|
|
1088
|
+
"legendFormat": "p95",
|
|
1089
|
+
"refId": "B"
|
|
1090
|
+
}
|
|
1091
|
+
],
|
|
1092
|
+
"title": "Total Gap Seconds",
|
|
1093
|
+
"type": "timeseries",
|
|
1094
|
+
"description": "Total gap time in a playlist response. Unlike gap duration distribution, this tracks the absolute seconds of missing footage per playlist.",
|
|
1095
|
+
"gridPos": {
|
|
1096
|
+
"h": 9,
|
|
1097
|
+
"w": 12,
|
|
1098
|
+
"x": 0,
|
|
1099
|
+
"y": 103
|
|
1100
|
+
}
|
|
1101
|
+
},
|
|
1102
|
+
{
|
|
1103
|
+
"datasource": {
|
|
1104
|
+
"type": "prometheus",
|
|
1105
|
+
"uid": "${datasource}"
|
|
1106
|
+
},
|
|
1107
|
+
"fieldConfig": {
|
|
1108
|
+
"defaults": {
|
|
1109
|
+
"unit": "reqps",
|
|
1110
|
+
"min": 0
|
|
1111
|
+
},
|
|
1112
|
+
"overrides": []
|
|
1113
|
+
},
|
|
1114
|
+
"id": 31,
|
|
1115
|
+
"options": {},
|
|
1116
|
+
"targets": [
|
|
1117
|
+
{
|
|
1118
|
+
"datasource": {
|
|
1119
|
+
"type": "prometheus",
|
|
1120
|
+
"uid": "${datasource}"
|
|
1121
|
+
},
|
|
1122
|
+
"expr": "rate(vms_cache_hit_low[5m])",
|
|
1123
|
+
"legendFormat": "hit low/s",
|
|
1124
|
+
"refId": "A"
|
|
1125
|
+
},
|
|
1126
|
+
{
|
|
1127
|
+
"datasource": {
|
|
1128
|
+
"type": "prometheus",
|
|
1129
|
+
"uid": "${datasource}"
|
|
1130
|
+
},
|
|
1131
|
+
"expr": "rate(vms_cache_miss_low[5m])",
|
|
1132
|
+
"legendFormat": "miss low/s",
|
|
1133
|
+
"refId": "B"
|
|
1134
|
+
},
|
|
1135
|
+
{
|
|
1136
|
+
"datasource": {
|
|
1137
|
+
"type": "prometheus",
|
|
1138
|
+
"uid": "${datasource}"
|
|
1139
|
+
},
|
|
1140
|
+
"expr": "rate(vms_cache_hit_high[5m])",
|
|
1141
|
+
"legendFormat": "hit high/s",
|
|
1142
|
+
"refId": "C"
|
|
1143
|
+
},
|
|
1144
|
+
{
|
|
1145
|
+
"datasource": {
|
|
1146
|
+
"type": "prometheus",
|
|
1147
|
+
"uid": "${datasource}"
|
|
1148
|
+
},
|
|
1149
|
+
"expr": "rate(vms_cache_miss_high[5m])",
|
|
1150
|
+
"legendFormat": "miss high/s",
|
|
1151
|
+
"refId": "D"
|
|
1152
|
+
}
|
|
1153
|
+
],
|
|
1154
|
+
"title": "Cache Hit/Miss Rate",
|
|
1155
|
+
"type": "timeseries",
|
|
1156
|
+
"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.",
|
|
1157
|
+
"gridPos": {
|
|
1158
|
+
"h": 9,
|
|
1159
|
+
"w": 12,
|
|
1160
|
+
"x": 12,
|
|
1161
|
+
"y": 103
|
|
1162
|
+
}
|
|
1163
|
+
},
|
|
1164
|
+
{
|
|
1165
|
+
"datasource": {
|
|
1166
|
+
"type": "prometheus",
|
|
1167
|
+
"uid": "${datasource}"
|
|
1168
|
+
},
|
|
1169
|
+
"fieldConfig": {
|
|
1170
|
+
"defaults": {
|
|
1171
|
+
"unit": "s",
|
|
1172
|
+
"min": 0
|
|
1173
|
+
},
|
|
1174
|
+
"overrides": []
|
|
1175
|
+
},
|
|
1176
|
+
"id": 32,
|
|
1177
|
+
"options": {},
|
|
1178
|
+
"targets": [
|
|
1179
|
+
{
|
|
1180
|
+
"datasource": {
|
|
1181
|
+
"type": "prometheus",
|
|
1182
|
+
"uid": "${datasource}"
|
|
1183
|
+
},
|
|
1184
|
+
"expr": "histogram_quantile(0.50, rate(vms_cache_lookup_duration_seconds_bucket[5m]))",
|
|
1185
|
+
"legendFormat": "p50",
|
|
1186
|
+
"refId": "A"
|
|
1187
|
+
},
|
|
1188
|
+
{
|
|
1189
|
+
"datasource": {
|
|
1190
|
+
"type": "prometheus",
|
|
1191
|
+
"uid": "${datasource}"
|
|
1192
|
+
},
|
|
1193
|
+
"expr": "histogram_quantile(0.95, rate(vms_cache_lookup_duration_seconds_bucket[5m]))",
|
|
1194
|
+
"legendFormat": "p95",
|
|
1195
|
+
"refId": "B"
|
|
1196
|
+
}
|
|
1197
|
+
],
|
|
1198
|
+
"title": "Cache Lookup Latency",
|
|
1199
|
+
"type": "timeseries",
|
|
1200
|
+
"description": "Redis cache lookup latency. Spikes here indicate Redis connectivity or performance issues that directly impact playlist generation time.",
|
|
1201
|
+
"gridPos": {
|
|
1202
|
+
"h": 9,
|
|
1203
|
+
"w": 12,
|
|
1204
|
+
"x": 0,
|
|
1205
|
+
"y": 112
|
|
1206
|
+
}
|
|
1207
|
+
},
|
|
1208
|
+
{
|
|
1209
|
+
"datasource": {
|
|
1210
|
+
"type": "prometheus",
|
|
1211
|
+
"uid": "${datasource}"
|
|
1212
|
+
},
|
|
1213
|
+
"fieldConfig": {
|
|
1214
|
+
"defaults": {
|
|
1215
|
+
"unit": "s",
|
|
1216
|
+
"min": 0
|
|
1217
|
+
},
|
|
1218
|
+
"overrides": []
|
|
1219
|
+
},
|
|
1220
|
+
"id": 33,
|
|
1221
|
+
"options": {},
|
|
1222
|
+
"targets": [
|
|
1223
|
+
{
|
|
1224
|
+
"datasource": {
|
|
1225
|
+
"type": "prometheus",
|
|
1226
|
+
"uid": "${datasource}"
|
|
1227
|
+
},
|
|
1228
|
+
"expr": "histogram_quantile(0.50, rate(vms_cache_backfill_duration_seconds_bucket[5m]))",
|
|
1229
|
+
"legendFormat": "p50",
|
|
1230
|
+
"refId": "A"
|
|
1231
|
+
},
|
|
1232
|
+
{
|
|
1233
|
+
"datasource": {
|
|
1234
|
+
"type": "prometheus",
|
|
1235
|
+
"uid": "${datasource}"
|
|
1236
|
+
},
|
|
1237
|
+
"expr": "histogram_quantile(0.95, rate(vms_cache_backfill_duration_seconds_bucket[5m]))",
|
|
1238
|
+
"legendFormat": "p95",
|
|
1239
|
+
"refId": "B"
|
|
1240
|
+
}
|
|
1241
|
+
],
|
|
1242
|
+
"title": "Cache Backfill Duration",
|
|
1243
|
+
"type": "timeseries",
|
|
1244
|
+
"description": "Time to backfill the cache from BigQuery on a cache miss. Long backfill times increase playlist latency for uncached requests.",
|
|
1245
|
+
"gridPos": {
|
|
1246
|
+
"h": 9,
|
|
1247
|
+
"w": 12,
|
|
1248
|
+
"x": 12,
|
|
1249
|
+
"y": 112
|
|
1250
|
+
}
|
|
1251
|
+
},
|
|
1252
|
+
{
|
|
1253
|
+
"datasource": {
|
|
1254
|
+
"type": "prometheus",
|
|
1255
|
+
"uid": "${datasource}"
|
|
1256
|
+
},
|
|
1257
|
+
"fieldConfig": {
|
|
1258
|
+
"defaults": {
|
|
1259
|
+
"unit": "reqps",
|
|
1260
|
+
"min": 0
|
|
1261
|
+
},
|
|
1262
|
+
"overrides": []
|
|
1263
|
+
},
|
|
1264
|
+
"id": 34,
|
|
1265
|
+
"options": {},
|
|
1266
|
+
"targets": [
|
|
1267
|
+
{
|
|
1268
|
+
"datasource": {
|
|
1269
|
+
"type": "prometheus",
|
|
1270
|
+
"uid": "${datasource}"
|
|
1271
|
+
},
|
|
1272
|
+
"expr": "rate(vms_cache_segment_added_low[5m])",
|
|
1273
|
+
"legendFormat": "low/s",
|
|
1274
|
+
"refId": "A"
|
|
1275
|
+
},
|
|
1276
|
+
{
|
|
1277
|
+
"datasource": {
|
|
1278
|
+
"type": "prometheus",
|
|
1279
|
+
"uid": "${datasource}"
|
|
1280
|
+
},
|
|
1281
|
+
"expr": "rate(vms_cache_segment_added_high[5m])",
|
|
1282
|
+
"legendFormat": "high/s",
|
|
1283
|
+
"refId": "B"
|
|
1284
|
+
}
|
|
1285
|
+
],
|
|
1286
|
+
"title": "Cache Segments Added",
|
|
1287
|
+
"type": "timeseries",
|
|
1288
|
+
"description": "Rate of segments written to the cache by quality level. Tracks how actively the cache is being populated.",
|
|
1289
|
+
"gridPos": {
|
|
1290
|
+
"h": 9,
|
|
1291
|
+
"w": 12,
|
|
1292
|
+
"x": 0,
|
|
1293
|
+
"y": 121
|
|
1294
|
+
}
|
|
1295
|
+
},
|
|
1296
|
+
{
|
|
1297
|
+
"datasource": {
|
|
1298
|
+
"type": "prometheus",
|
|
1299
|
+
"uid": "${datasource}"
|
|
1300
|
+
},
|
|
1301
|
+
"fieldConfig": {
|
|
1302
|
+
"defaults": {
|
|
1303
|
+
"unit": "s",
|
|
1304
|
+
"min": 0
|
|
1305
|
+
},
|
|
1306
|
+
"overrides": []
|
|
1307
|
+
},
|
|
1308
|
+
"id": 35,
|
|
1309
|
+
"options": {},
|
|
1310
|
+
"targets": [
|
|
1311
|
+
{
|
|
1312
|
+
"datasource": {
|
|
1313
|
+
"type": "prometheus",
|
|
1314
|
+
"uid": "${datasource}"
|
|
1315
|
+
},
|
|
1316
|
+
"expr": "histogram_quantile(0.50, rate(vms_gcs_first_byte_seconds_bucket[5m]))",
|
|
1317
|
+
"legendFormat": "p50",
|
|
1318
|
+
"refId": "A"
|
|
1319
|
+
},
|
|
1320
|
+
{
|
|
1321
|
+
"datasource": {
|
|
1322
|
+
"type": "prometheus",
|
|
1323
|
+
"uid": "${datasource}"
|
|
1324
|
+
},
|
|
1325
|
+
"expr": "histogram_quantile(0.95, rate(vms_gcs_first_byte_seconds_bucket[5m]))",
|
|
1326
|
+
"legendFormat": "p95",
|
|
1327
|
+
"refId": "B"
|
|
1328
|
+
},
|
|
1329
|
+
{
|
|
1330
|
+
"datasource": {
|
|
1331
|
+
"type": "prometheus",
|
|
1332
|
+
"uid": "${datasource}"
|
|
1333
|
+
},
|
|
1334
|
+
"expr": "histogram_quantile(0.99, rate(vms_gcs_first_byte_seconds_bucket[5m]))",
|
|
1335
|
+
"legendFormat": "p99",
|
|
1336
|
+
"refId": "C"
|
|
1337
|
+
}
|
|
1338
|
+
],
|
|
1339
|
+
"title": "GCS First Byte Latency",
|
|
1340
|
+
"type": "timeseries",
|
|
1341
|
+
"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.",
|
|
1342
|
+
"gridPos": {
|
|
1343
|
+
"h": 9,
|
|
1344
|
+
"w": 12,
|
|
1345
|
+
"x": 12,
|
|
1346
|
+
"y": 121
|
|
1347
|
+
}
|
|
1348
|
+
},
|
|
1349
|
+
{
|
|
1350
|
+
"datasource": {
|
|
1351
|
+
"type": "prometheus",
|
|
1352
|
+
"uid": "${datasource}"
|
|
1353
|
+
},
|
|
1354
|
+
"fieldConfig": {
|
|
1355
|
+
"defaults": {
|
|
1356
|
+
"unit": "s",
|
|
1357
|
+
"min": 0
|
|
1358
|
+
},
|
|
1359
|
+
"overrides": []
|
|
1360
|
+
},
|
|
1361
|
+
"id": 36,
|
|
1362
|
+
"options": {},
|
|
1363
|
+
"targets": [
|
|
1364
|
+
{
|
|
1365
|
+
"datasource": {
|
|
1366
|
+
"type": "prometheus",
|
|
1367
|
+
"uid": "${datasource}"
|
|
1368
|
+
},
|
|
1369
|
+
"expr": "histogram_quantile(0.50, rate(vms_gcs_stream_duration_seconds_bucket[5m]))",
|
|
1370
|
+
"legendFormat": "p50",
|
|
1371
|
+
"refId": "A"
|
|
1372
|
+
},
|
|
1373
|
+
{
|
|
1374
|
+
"datasource": {
|
|
1375
|
+
"type": "prometheus",
|
|
1376
|
+
"uid": "${datasource}"
|
|
1377
|
+
},
|
|
1378
|
+
"expr": "histogram_quantile(0.95, rate(vms_gcs_stream_duration_seconds_bucket[5m]))",
|
|
1379
|
+
"legendFormat": "p95",
|
|
1380
|
+
"refId": "B"
|
|
1381
|
+
}
|
|
1382
|
+
],
|
|
1383
|
+
"title": "GCS Stream Duration",
|
|
1384
|
+
"type": "timeseries",
|
|
1385
|
+
"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.",
|
|
1386
|
+
"gridPos": {
|
|
1387
|
+
"h": 9,
|
|
1388
|
+
"w": 12,
|
|
1389
|
+
"x": 0,
|
|
1390
|
+
"y": 130
|
|
1391
|
+
}
|
|
1392
|
+
},
|
|
1393
|
+
{
|
|
1394
|
+
"datasource": {
|
|
1395
|
+
"type": "prometheus",
|
|
1396
|
+
"uid": "${datasource}"
|
|
1397
|
+
},
|
|
1398
|
+
"fieldConfig": {
|
|
1399
|
+
"defaults": {
|
|
1400
|
+
"unit": "bytes",
|
|
1401
|
+
"min": 0
|
|
1402
|
+
},
|
|
1403
|
+
"overrides": []
|
|
1404
|
+
},
|
|
1405
|
+
"id": 37,
|
|
1406
|
+
"options": {},
|
|
1407
|
+
"targets": [
|
|
1408
|
+
{
|
|
1409
|
+
"datasource": {
|
|
1410
|
+
"type": "prometheus",
|
|
1411
|
+
"uid": "${datasource}"
|
|
1412
|
+
},
|
|
1413
|
+
"expr": "histogram_quantile(0.50, rate(vms_gcs_segment_size_bytes_bucket[5m]))",
|
|
1414
|
+
"legendFormat": "p50",
|
|
1415
|
+
"refId": "A"
|
|
1416
|
+
},
|
|
1417
|
+
{
|
|
1418
|
+
"datasource": {
|
|
1419
|
+
"type": "prometheus",
|
|
1420
|
+
"uid": "${datasource}"
|
|
1421
|
+
},
|
|
1422
|
+
"expr": "histogram_quantile(0.95, rate(vms_gcs_segment_size_bytes_bucket[5m]))",
|
|
1423
|
+
"legendFormat": "p95",
|
|
1424
|
+
"refId": "B"
|
|
1425
|
+
}
|
|
1426
|
+
],
|
|
1427
|
+
"title": "GCS Segment Size",
|
|
1428
|
+
"type": "timeseries",
|
|
1429
|
+
"description": "Size distribution of segments served from GCS. Helps identify unexpectedly large or small segments that may indicate transcoding issues.",
|
|
1430
|
+
"gridPos": {
|
|
1431
|
+
"h": 9,
|
|
1432
|
+
"w": 12,
|
|
1433
|
+
"x": 12,
|
|
1434
|
+
"y": 130
|
|
1435
|
+
}
|
|
1436
|
+
},
|
|
1437
|
+
{
|
|
1438
|
+
"datasource": {
|
|
1439
|
+
"type": "prometheus",
|
|
1440
|
+
"uid": "${datasource}"
|
|
1441
|
+
},
|
|
1442
|
+
"fieldConfig": {
|
|
1443
|
+
"defaults": {
|
|
1444
|
+
"unit": "reqps",
|
|
1445
|
+
"min": 0,
|
|
1446
|
+
"color": {
|
|
1447
|
+
"mode": "fixed",
|
|
1448
|
+
"fixedColor": "orange"
|
|
1449
|
+
}
|
|
1450
|
+
},
|
|
1451
|
+
"overrides": []
|
|
1452
|
+
},
|
|
1453
|
+
"id": 38,
|
|
1454
|
+
"options": {},
|
|
1455
|
+
"targets": [
|
|
1456
|
+
{
|
|
1457
|
+
"datasource": {
|
|
1458
|
+
"type": "prometheus",
|
|
1459
|
+
"uid": "${datasource}"
|
|
1460
|
+
},
|
|
1461
|
+
"expr": "rate(vms_segment_requests_not_found[5m])",
|
|
1462
|
+
"legendFormat": "not_found/s",
|
|
1463
|
+
"refId": "A"
|
|
1464
|
+
}
|
|
1465
|
+
],
|
|
1466
|
+
"title": "Segment Not Found Rate",
|
|
1467
|
+
"type": "timeseries",
|
|
1468
|
+
"description": "Rate of segments not found in GCS after polling. Indicates segments that were expected based on metadata but are missing from storage.",
|
|
1469
|
+
"gridPos": {
|
|
1470
|
+
"h": 9,
|
|
1471
|
+
"w": 12,
|
|
1472
|
+
"x": 0,
|
|
1473
|
+
"y": 139
|
|
1474
|
+
}
|
|
1475
|
+
},
|
|
1476
|
+
{
|
|
1477
|
+
"datasource": {
|
|
1478
|
+
"type": "prometheus",
|
|
1479
|
+
"uid": "${datasource}"
|
|
1480
|
+
},
|
|
1481
|
+
"fieldConfig": {
|
|
1482
|
+
"defaults": {
|
|
1483
|
+
"unit": "s",
|
|
1484
|
+
"min": 0
|
|
1485
|
+
},
|
|
1486
|
+
"overrides": []
|
|
1487
|
+
},
|
|
1488
|
+
"id": 40,
|
|
1489
|
+
"options": {},
|
|
1490
|
+
"targets": [
|
|
1491
|
+
{
|
|
1492
|
+
"datasource": {
|
|
1493
|
+
"type": "prometheus",
|
|
1494
|
+
"uid": "${datasource}"
|
|
1495
|
+
},
|
|
1496
|
+
"expr": "histogram_quantile(0.50, rate(vms_segment_ingestion_lag_seconds_bucket[5m]))",
|
|
1497
|
+
"legendFormat": "p50",
|
|
1498
|
+
"refId": "A"
|
|
1499
|
+
},
|
|
1500
|
+
{
|
|
1501
|
+
"datasource": {
|
|
1502
|
+
"type": "prometheus",
|
|
1503
|
+
"uid": "${datasource}"
|
|
1504
|
+
},
|
|
1505
|
+
"expr": "histogram_quantile(0.95, rate(vms_segment_ingestion_lag_seconds_bucket[5m]))",
|
|
1506
|
+
"legendFormat": "p95",
|
|
1507
|
+
"refId": "B"
|
|
1508
|
+
}
|
|
1509
|
+
],
|
|
1510
|
+
"title": "Ingestion Lag",
|
|
1511
|
+
"type": "timeseries",
|
|
1512
|
+
"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.",
|
|
1513
|
+
"gridPos": {
|
|
1514
|
+
"h": 9,
|
|
1515
|
+
"w": 12,
|
|
1516
|
+
"x": 12,
|
|
1517
|
+
"y": 139
|
|
1518
|
+
}
|
|
1519
|
+
},
|
|
1520
|
+
{
|
|
1521
|
+
"datasource": {
|
|
1522
|
+
"type": "prometheus",
|
|
1523
|
+
"uid": "${datasource}"
|
|
1524
|
+
},
|
|
1525
|
+
"fieldConfig": {
|
|
1526
|
+
"defaults": {
|
|
1527
|
+
"unit": "s",
|
|
1528
|
+
"min": 0
|
|
1529
|
+
},
|
|
1530
|
+
"overrides": []
|
|
1531
|
+
},
|
|
1532
|
+
"id": 41,
|
|
1533
|
+
"options": {},
|
|
1534
|
+
"targets": [
|
|
1535
|
+
{
|
|
1536
|
+
"datasource": {
|
|
1537
|
+
"type": "prometheus",
|
|
1538
|
+
"uid": "${datasource}"
|
|
1539
|
+
},
|
|
1540
|
+
"expr": "histogram_quantile(0.50, rate(vms_segment_registration_duration_seconds_bucket[5m]))",
|
|
1541
|
+
"legendFormat": "p50",
|
|
1542
|
+
"refId": "A"
|
|
1543
|
+
},
|
|
1544
|
+
{
|
|
1545
|
+
"datasource": {
|
|
1546
|
+
"type": "prometheus",
|
|
1547
|
+
"uid": "${datasource}"
|
|
1548
|
+
},
|
|
1549
|
+
"expr": "histogram_quantile(0.95, rate(vms_segment_registration_duration_seconds_bucket[5m]))",
|
|
1550
|
+
"legendFormat": "p95",
|
|
1551
|
+
"refId": "B"
|
|
1552
|
+
}
|
|
1553
|
+
],
|
|
1554
|
+
"title": "Registration Duration",
|
|
1555
|
+
"type": "timeseries",
|
|
1556
|
+
"description": "Time to register a segment resource via the Imagine API. Sustained high values indicate Imagine API latency or availability issues.",
|
|
1557
|
+
"gridPos": {
|
|
1558
|
+
"h": 9,
|
|
1559
|
+
"w": 12,
|
|
1560
|
+
"x": 0,
|
|
1561
|
+
"y": 148
|
|
1562
|
+
}
|
|
1563
|
+
},
|
|
1564
|
+
{
|
|
1565
|
+
"datasource": {
|
|
1566
|
+
"type": "prometheus",
|
|
1567
|
+
"uid": "${datasource}"
|
|
1568
|
+
},
|
|
1569
|
+
"fieldConfig": {
|
|
1570
|
+
"defaults": {
|
|
1571
|
+
"unit": "reqps",
|
|
1572
|
+
"min": 0,
|
|
1573
|
+
"color": {
|
|
1574
|
+
"mode": "fixed",
|
|
1575
|
+
"fixedColor": "red"
|
|
1576
|
+
}
|
|
1577
|
+
},
|
|
1578
|
+
"overrides": []
|
|
1579
|
+
},
|
|
1580
|
+
"id": 42,
|
|
1581
|
+
"options": {},
|
|
1582
|
+
"targets": [
|
|
1583
|
+
{
|
|
1584
|
+
"datasource": {
|
|
1585
|
+
"type": "prometheus",
|
|
1586
|
+
"uid": "${datasource}"
|
|
1587
|
+
},
|
|
1588
|
+
"expr": "sum by (__name__) (rate({__name__=~\"vms_segment_processing_errors_.*_total\"}[5m]))",
|
|
1589
|
+
"legendFormat": "{{__name__}}",
|
|
1590
|
+
"refId": "A"
|
|
1591
|
+
}
|
|
1592
|
+
],
|
|
1593
|
+
"title": "Segment Processing Errors",
|
|
1594
|
+
"type": "timeseries",
|
|
1595
|
+
"description": "Rate of segment processing errors by type. Includes message handling failures and camera-not-found errors from unregistered cameras.",
|
|
1596
|
+
"gridPos": {
|
|
1597
|
+
"h": 9,
|
|
1598
|
+
"w": 12,
|
|
1599
|
+
"x": 12,
|
|
1600
|
+
"y": 148
|
|
1601
|
+
}
|
|
1602
|
+
}
|
|
1603
|
+
],
|
|
1604
|
+
"refresh": "30s",
|
|
1605
|
+
"schemaVersion": 41,
|
|
1606
|
+
"tags": [
|
|
1607
|
+
"vms",
|
|
1608
|
+
"video",
|
|
1609
|
+
"hls"
|
|
1610
|
+
],
|
|
1611
|
+
"templating": {
|
|
1612
|
+
"list": [
|
|
1613
|
+
{
|
|
1614
|
+
"current": {},
|
|
1615
|
+
"hide": 0,
|
|
1616
|
+
"includeAll": false,
|
|
1617
|
+
"label": "Datasource",
|
|
1618
|
+
"multi": false,
|
|
1619
|
+
"name": "datasource",
|
|
1620
|
+
"options": [],
|
|
1621
|
+
"query": "prometheus",
|
|
1622
|
+
"refresh": 1,
|
|
1623
|
+
"type": "datasource"
|
|
1624
|
+
}
|
|
1625
|
+
]
|
|
1626
|
+
},
|
|
1627
|
+
"time": {
|
|
1628
|
+
"from": "now-6h",
|
|
1629
|
+
"to": "now"
|
|
1630
|
+
},
|
|
1631
|
+
"timepicker": {},
|
|
1632
|
+
"timezone": "browser",
|
|
1633
|
+
"title": "VMS Server",
|
|
1634
|
+
"uid": null,
|
|
1635
|
+
"version": 1
|
|
1636
|
+
}
|