@leverege/build-tools 2.121.0 → 2.122.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/package.json
CHANGED
|
@@ -0,0 +1,637 @@
|
|
|
1
|
+
{
|
|
2
|
+
"annotations": {
|
|
3
|
+
"list": []
|
|
4
|
+
},
|
|
5
|
+
"description": "HTTP traffic, Imagine API load and Node runtime health for the pitcrew-ui-service. The service emits no metrics of its own: every application counter here comes from the leverege framework.",
|
|
6
|
+
"editable": true,
|
|
7
|
+
"graphTooltip": 1,
|
|
8
|
+
"links": [],
|
|
9
|
+
"panels": [
|
|
10
|
+
{
|
|
11
|
+
"type": "row",
|
|
12
|
+
"title": "Service health",
|
|
13
|
+
"id": 1,
|
|
14
|
+
"gridPos": {
|
|
15
|
+
"h": 1,
|
|
16
|
+
"w": 24,
|
|
17
|
+
"x": 0,
|
|
18
|
+
"y": 0
|
|
19
|
+
},
|
|
20
|
+
"collapsed": false,
|
|
21
|
+
"panels": []
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"type": "stat",
|
|
25
|
+
"title": "Pods scraped",
|
|
26
|
+
"description": "Targets answering /metrics for this job. Every rate on this dashboard is summed across these pods, so if this disagrees with the replica count a pod is running but invisible here.",
|
|
27
|
+
"id": 2,
|
|
28
|
+
"datasource": {
|
|
29
|
+
"type": "prometheus",
|
|
30
|
+
"uid": "${datasource}"
|
|
31
|
+
},
|
|
32
|
+
"gridPos": {
|
|
33
|
+
"h": 8,
|
|
34
|
+
"w": 6,
|
|
35
|
+
"x": 0,
|
|
36
|
+
"y": 1
|
|
37
|
+
},
|
|
38
|
+
"fieldConfig": {
|
|
39
|
+
"defaults": {
|
|
40
|
+
"unit": "short",
|
|
41
|
+
"min": 0
|
|
42
|
+
},
|
|
43
|
+
"overrides": []
|
|
44
|
+
},
|
|
45
|
+
"options": {
|
|
46
|
+
"reduceOptions": {
|
|
47
|
+
"calcs": [
|
|
48
|
+
"lastNotNull"
|
|
49
|
+
],
|
|
50
|
+
"fields": "",
|
|
51
|
+
"values": false
|
|
52
|
+
},
|
|
53
|
+
"textMode": "auto",
|
|
54
|
+
"colorMode": "value",
|
|
55
|
+
"graphMode": "area"
|
|
56
|
+
},
|
|
57
|
+
"targets": [
|
|
58
|
+
{
|
|
59
|
+
"datasource": {
|
|
60
|
+
"type": "prometheus",
|
|
61
|
+
"uid": "${datasource}"
|
|
62
|
+
},
|
|
63
|
+
"expr": "sum(up{job=~\"$job\"})",
|
|
64
|
+
"legendFormat": "up",
|
|
65
|
+
"refId": "A"
|
|
66
|
+
}
|
|
67
|
+
]
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
"type": "stat",
|
|
71
|
+
"title": "Deployed version",
|
|
72
|
+
"description": "The app version label the ServiceMonitor copies off the pod. Two values at once means a rollout is in flight and the counters below span two builds.",
|
|
73
|
+
"id": 3,
|
|
74
|
+
"datasource": {
|
|
75
|
+
"type": "prometheus",
|
|
76
|
+
"uid": "${datasource}"
|
|
77
|
+
},
|
|
78
|
+
"gridPos": {
|
|
79
|
+
"h": 8,
|
|
80
|
+
"w": 6,
|
|
81
|
+
"x": 6,
|
|
82
|
+
"y": 1
|
|
83
|
+
},
|
|
84
|
+
"fieldConfig": {
|
|
85
|
+
"defaults": {
|
|
86
|
+
"unit": "short"
|
|
87
|
+
},
|
|
88
|
+
"overrides": []
|
|
89
|
+
},
|
|
90
|
+
"options": {
|
|
91
|
+
"reduceOptions": {
|
|
92
|
+
"calcs": [
|
|
93
|
+
"lastNotNull"
|
|
94
|
+
],
|
|
95
|
+
"fields": "",
|
|
96
|
+
"values": false
|
|
97
|
+
},
|
|
98
|
+
"textMode": "name",
|
|
99
|
+
"colorMode": "value",
|
|
100
|
+
"graphMode": "none"
|
|
101
|
+
},
|
|
102
|
+
"targets": [
|
|
103
|
+
{
|
|
104
|
+
"datasource": {
|
|
105
|
+
"type": "prometheus",
|
|
106
|
+
"uid": "${datasource}"
|
|
107
|
+
},
|
|
108
|
+
"expr": "max by (app_kubernetes_io_version) (up{job=~\"$job\"})",
|
|
109
|
+
"legendFormat": "{{app_kubernetes_io_version}}",
|
|
110
|
+
"refId": "A"
|
|
111
|
+
}
|
|
112
|
+
]
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
"type": "timeseries",
|
|
116
|
+
"title": "Scrape health per pod",
|
|
117
|
+
"description": "1 while the pod answers /metrics, 0 when the scrape fails. Counters hold their last value through a failed scrape, so rates go flat rather than dropping. Gaps here explain steps in the panels below.",
|
|
118
|
+
"id": 4,
|
|
119
|
+
"datasource": {
|
|
120
|
+
"type": "prometheus",
|
|
121
|
+
"uid": "${datasource}"
|
|
122
|
+
},
|
|
123
|
+
"gridPos": {
|
|
124
|
+
"h": 8,
|
|
125
|
+
"w": 12,
|
|
126
|
+
"x": 12,
|
|
127
|
+
"y": 1
|
|
128
|
+
},
|
|
129
|
+
"fieldConfig": {
|
|
130
|
+
"defaults": {
|
|
131
|
+
"unit": "short",
|
|
132
|
+
"min": 0
|
|
133
|
+
},
|
|
134
|
+
"overrides": []
|
|
135
|
+
},
|
|
136
|
+
"targets": [
|
|
137
|
+
{
|
|
138
|
+
"datasource": {
|
|
139
|
+
"type": "prometheus",
|
|
140
|
+
"uid": "${datasource}"
|
|
141
|
+
},
|
|
142
|
+
"expr": "up{job=~\"$job\"}",
|
|
143
|
+
"legendFormat": "{{pod}}",
|
|
144
|
+
"refId": "A"
|
|
145
|
+
}
|
|
146
|
+
]
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
"type": "row",
|
|
150
|
+
"title": "HTTP traffic",
|
|
151
|
+
"id": 5,
|
|
152
|
+
"gridPos": {
|
|
153
|
+
"h": 1,
|
|
154
|
+
"w": 24,
|
|
155
|
+
"x": 0,
|
|
156
|
+
"y": 9
|
|
157
|
+
},
|
|
158
|
+
"collapsed": false,
|
|
159
|
+
"panels": []
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
"type": "timeseries",
|
|
163
|
+
"title": "Requests / sec",
|
|
164
|
+
"description": "From @leverege/server-http's request middleware. This counter carries no route or status label, so this is total request volume only. There is no way to break it down by endpoint or to separate 2xx from 5xx without a code change in the service.",
|
|
165
|
+
"id": 6,
|
|
166
|
+
"datasource": {
|
|
167
|
+
"type": "prometheus",
|
|
168
|
+
"uid": "${datasource}"
|
|
169
|
+
},
|
|
170
|
+
"gridPos": {
|
|
171
|
+
"h": 8,
|
|
172
|
+
"w": 12,
|
|
173
|
+
"x": 0,
|
|
174
|
+
"y": 10
|
|
175
|
+
},
|
|
176
|
+
"fieldConfig": {
|
|
177
|
+
"defaults": {
|
|
178
|
+
"unit": "reqps",
|
|
179
|
+
"min": 0
|
|
180
|
+
},
|
|
181
|
+
"overrides": []
|
|
182
|
+
},
|
|
183
|
+
"targets": [
|
|
184
|
+
{
|
|
185
|
+
"datasource": {
|
|
186
|
+
"type": "prometheus",
|
|
187
|
+
"uid": "${datasource}"
|
|
188
|
+
},
|
|
189
|
+
"expr": "sum(rate(pitcrew_ui_service_http_requests_total{job=~\"$job\"}[5m]))",
|
|
190
|
+
"legendFormat": "requests/s",
|
|
191
|
+
"refId": "A"
|
|
192
|
+
}
|
|
193
|
+
]
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
"type": "stat",
|
|
197
|
+
"title": "Requests over the range",
|
|
198
|
+
"description": "Total requests served in the selected window, summed across pods. Counters reset on pod restart, and increase() accounts for that.",
|
|
199
|
+
"id": 7,
|
|
200
|
+
"datasource": {
|
|
201
|
+
"type": "prometheus",
|
|
202
|
+
"uid": "${datasource}"
|
|
203
|
+
},
|
|
204
|
+
"gridPos": {
|
|
205
|
+
"h": 8,
|
|
206
|
+
"w": 12,
|
|
207
|
+
"x": 12,
|
|
208
|
+
"y": 10
|
|
209
|
+
},
|
|
210
|
+
"fieldConfig": {
|
|
211
|
+
"defaults": {
|
|
212
|
+
"unit": "short",
|
|
213
|
+
"min": 0
|
|
214
|
+
},
|
|
215
|
+
"overrides": []
|
|
216
|
+
},
|
|
217
|
+
"options": {
|
|
218
|
+
"reduceOptions": {
|
|
219
|
+
"calcs": [
|
|
220
|
+
"lastNotNull"
|
|
221
|
+
],
|
|
222
|
+
"fields": "",
|
|
223
|
+
"values": false
|
|
224
|
+
},
|
|
225
|
+
"textMode": "auto",
|
|
226
|
+
"colorMode": "value",
|
|
227
|
+
"graphMode": "area"
|
|
228
|
+
},
|
|
229
|
+
"targets": [
|
|
230
|
+
{
|
|
231
|
+
"datasource": {
|
|
232
|
+
"type": "prometheus",
|
|
233
|
+
"uid": "${datasource}"
|
|
234
|
+
},
|
|
235
|
+
"expr": "sum(increase(pitcrew_ui_service_http_requests_total{job=~\"$job\"}[$__range]))",
|
|
236
|
+
"legendFormat": "requests",
|
|
237
|
+
"refId": "A"
|
|
238
|
+
}
|
|
239
|
+
]
|
|
240
|
+
},
|
|
241
|
+
{
|
|
242
|
+
"type": "row",
|
|
243
|
+
"title": "Imagine API",
|
|
244
|
+
"id": 8,
|
|
245
|
+
"gridPos": {
|
|
246
|
+
"h": 1,
|
|
247
|
+
"w": 24,
|
|
248
|
+
"x": 0,
|
|
249
|
+
"y": 18
|
|
250
|
+
},
|
|
251
|
+
"collapsed": false,
|
|
252
|
+
"panels": []
|
|
253
|
+
},
|
|
254
|
+
{
|
|
255
|
+
"type": "timeseries",
|
|
256
|
+
"title": "Imagine calls / sec",
|
|
257
|
+
"description": "GETs this service makes to api-server, from @leverege/comms via server-imagine. The error line is guarded with or vector(0) because that counter has never fired: @leverege/metrics creates a counter lazily on first increment, so an unused one does not exist in Prometheus at all. Only GET is instrumented here, since this service never writes.",
|
|
258
|
+
"id": 9,
|
|
259
|
+
"datasource": {
|
|
260
|
+
"type": "prometheus",
|
|
261
|
+
"uid": "${datasource}"
|
|
262
|
+
},
|
|
263
|
+
"gridPos": {
|
|
264
|
+
"h": 8,
|
|
265
|
+
"w": 12,
|
|
266
|
+
"x": 0,
|
|
267
|
+
"y": 19
|
|
268
|
+
},
|
|
269
|
+
"fieldConfig": {
|
|
270
|
+
"defaults": {
|
|
271
|
+
"unit": "reqps",
|
|
272
|
+
"min": 0
|
|
273
|
+
},
|
|
274
|
+
"overrides": []
|
|
275
|
+
},
|
|
276
|
+
"targets": [
|
|
277
|
+
{
|
|
278
|
+
"datasource": {
|
|
279
|
+
"type": "prometheus",
|
|
280
|
+
"uid": "${datasource}"
|
|
281
|
+
},
|
|
282
|
+
"expr": "sum(rate(pitcrew_ui_service_imagine_api_get{job=~\"$job\"}[5m]))",
|
|
283
|
+
"legendFormat": "get/s",
|
|
284
|
+
"refId": "A"
|
|
285
|
+
},
|
|
286
|
+
{
|
|
287
|
+
"datasource": {
|
|
288
|
+
"type": "prometheus",
|
|
289
|
+
"uid": "${datasource}"
|
|
290
|
+
},
|
|
291
|
+
"expr": "sum(rate(pitcrew_ui_service_imagine_api_get_error{job=~\"$job\"}[5m])) or vector(0)",
|
|
292
|
+
"legendFormat": "error/s",
|
|
293
|
+
"refId": "B"
|
|
294
|
+
}
|
|
295
|
+
]
|
|
296
|
+
},
|
|
297
|
+
{
|
|
298
|
+
"type": "timeseries",
|
|
299
|
+
"title": "Imagine calls per HTTP request",
|
|
300
|
+
"description": "How many upstream Imagine reads each inbound request costs. This service sits on @leverege/server-cache, so in health this sits far below 1 and most requests are served from cache. A climb toward 1 means the cache has stopped absorbing reads and api-server is taking the full load, which is the main thing worth watching on this dashboard.",
|
|
301
|
+
"id": 10,
|
|
302
|
+
"datasource": {
|
|
303
|
+
"type": "prometheus",
|
|
304
|
+
"uid": "${datasource}"
|
|
305
|
+
},
|
|
306
|
+
"gridPos": {
|
|
307
|
+
"h": 8,
|
|
308
|
+
"w": 12,
|
|
309
|
+
"x": 12,
|
|
310
|
+
"y": 19
|
|
311
|
+
},
|
|
312
|
+
"fieldConfig": {
|
|
313
|
+
"defaults": {
|
|
314
|
+
"unit": "short",
|
|
315
|
+
"min": 0
|
|
316
|
+
},
|
|
317
|
+
"overrides": []
|
|
318
|
+
},
|
|
319
|
+
"targets": [
|
|
320
|
+
{
|
|
321
|
+
"datasource": {
|
|
322
|
+
"type": "prometheus",
|
|
323
|
+
"uid": "${datasource}"
|
|
324
|
+
},
|
|
325
|
+
"expr": "(sum(rate(pitcrew_ui_service_imagine_api_get{job=~\"$job\"}[5m])) or vector(0)) / clamp_min(sum(rate(pitcrew_ui_service_http_requests_total{job=~\"$job\"}[5m])), 1e-9)",
|
|
326
|
+
"legendFormat": "imagine per request",
|
|
327
|
+
"refId": "A"
|
|
328
|
+
}
|
|
329
|
+
]
|
|
330
|
+
},
|
|
331
|
+
{
|
|
332
|
+
"type": "row",
|
|
333
|
+
"title": "Node runtime",
|
|
334
|
+
"id": 11,
|
|
335
|
+
"gridPos": {
|
|
336
|
+
"h": 1,
|
|
337
|
+
"w": 24,
|
|
338
|
+
"x": 0,
|
|
339
|
+
"y": 27
|
|
340
|
+
},
|
|
341
|
+
"collapsed": false,
|
|
342
|
+
"panels": []
|
|
343
|
+
},
|
|
344
|
+
{
|
|
345
|
+
"type": "timeseries",
|
|
346
|
+
"title": "Event loop lag",
|
|
347
|
+
"description": "Percentiles across pods, taken as max so the worst replica is what shows. This service is a single-threaded Node process, so sustained p99 lag means requests are queueing behind CPU-bound work and latency is being felt by the UI regardless of what the request rate looks like.",
|
|
348
|
+
"id": 12,
|
|
349
|
+
"datasource": {
|
|
350
|
+
"type": "prometheus",
|
|
351
|
+
"uid": "${datasource}"
|
|
352
|
+
},
|
|
353
|
+
"gridPos": {
|
|
354
|
+
"h": 8,
|
|
355
|
+
"w": 12,
|
|
356
|
+
"x": 0,
|
|
357
|
+
"y": 28
|
|
358
|
+
},
|
|
359
|
+
"fieldConfig": {
|
|
360
|
+
"defaults": {
|
|
361
|
+
"unit": "s",
|
|
362
|
+
"min": 0
|
|
363
|
+
},
|
|
364
|
+
"overrides": []
|
|
365
|
+
},
|
|
366
|
+
"targets": [
|
|
367
|
+
{
|
|
368
|
+
"datasource": {
|
|
369
|
+
"type": "prometheus",
|
|
370
|
+
"uid": "${datasource}"
|
|
371
|
+
},
|
|
372
|
+
"expr": "max(nodejs_eventloop_lag_p50_seconds{job=~\"$job\"})",
|
|
373
|
+
"legendFormat": "p50",
|
|
374
|
+
"refId": "A"
|
|
375
|
+
},
|
|
376
|
+
{
|
|
377
|
+
"datasource": {
|
|
378
|
+
"type": "prometheus",
|
|
379
|
+
"uid": "${datasource}"
|
|
380
|
+
},
|
|
381
|
+
"expr": "max(nodejs_eventloop_lag_p90_seconds{job=~\"$job\"})",
|
|
382
|
+
"legendFormat": "p90",
|
|
383
|
+
"refId": "B"
|
|
384
|
+
},
|
|
385
|
+
{
|
|
386
|
+
"datasource": {
|
|
387
|
+
"type": "prometheus",
|
|
388
|
+
"uid": "${datasource}"
|
|
389
|
+
},
|
|
390
|
+
"expr": "max(nodejs_eventloop_lag_p99_seconds{job=~\"$job\"})",
|
|
391
|
+
"legendFormat": "p99",
|
|
392
|
+
"refId": "C"
|
|
393
|
+
}
|
|
394
|
+
]
|
|
395
|
+
},
|
|
396
|
+
{
|
|
397
|
+
"type": "timeseries",
|
|
398
|
+
"title": "Heap used per pod",
|
|
399
|
+
"description": "Deliberately per-pod rather than summed: a single leaking replica is exactly what you are looking for, and a sum would hide it. A pod climbing steadily toward its limit will be OOM-killed and reappear as a restart in the health row.",
|
|
400
|
+
"id": 13,
|
|
401
|
+
"datasource": {
|
|
402
|
+
"type": "prometheus",
|
|
403
|
+
"uid": "${datasource}"
|
|
404
|
+
},
|
|
405
|
+
"gridPos": {
|
|
406
|
+
"h": 8,
|
|
407
|
+
"w": 12,
|
|
408
|
+
"x": 12,
|
|
409
|
+
"y": 28
|
|
410
|
+
},
|
|
411
|
+
"fieldConfig": {
|
|
412
|
+
"defaults": {
|
|
413
|
+
"unit": "bytes",
|
|
414
|
+
"min": 0
|
|
415
|
+
},
|
|
416
|
+
"overrides": []
|
|
417
|
+
},
|
|
418
|
+
"targets": [
|
|
419
|
+
{
|
|
420
|
+
"datasource": {
|
|
421
|
+
"type": "prometheus",
|
|
422
|
+
"uid": "${datasource}"
|
|
423
|
+
},
|
|
424
|
+
"expr": "nodejs_heap_size_used_bytes{job=~\"$job\"}",
|
|
425
|
+
"legendFormat": "{{pod}}",
|
|
426
|
+
"refId": "A"
|
|
427
|
+
}
|
|
428
|
+
]
|
|
429
|
+
},
|
|
430
|
+
{
|
|
431
|
+
"type": "timeseries",
|
|
432
|
+
"title": "GC time",
|
|
433
|
+
"description": "Fraction of wall-clock time spent in garbage collection, from the gc duration histogram. Rising GC time alongside rising event loop lag points at allocation pressure rather than at inbound load.",
|
|
434
|
+
"id": 14,
|
|
435
|
+
"datasource": {
|
|
436
|
+
"type": "prometheus",
|
|
437
|
+
"uid": "${datasource}"
|
|
438
|
+
},
|
|
439
|
+
"gridPos": {
|
|
440
|
+
"h": 8,
|
|
441
|
+
"w": 12,
|
|
442
|
+
"x": 0,
|
|
443
|
+
"y": 36
|
|
444
|
+
},
|
|
445
|
+
"fieldConfig": {
|
|
446
|
+
"defaults": {
|
|
447
|
+
"unit": "percentunit",
|
|
448
|
+
"min": 0
|
|
449
|
+
},
|
|
450
|
+
"overrides": []
|
|
451
|
+
},
|
|
452
|
+
"targets": [
|
|
453
|
+
{
|
|
454
|
+
"datasource": {
|
|
455
|
+
"type": "prometheus",
|
|
456
|
+
"uid": "${datasource}"
|
|
457
|
+
},
|
|
458
|
+
"expr": "sum by (pod) (rate(nodejs_gc_duration_seconds_sum{job=~\"$job\"}[5m]))",
|
|
459
|
+
"legendFormat": "{{pod}}",
|
|
460
|
+
"refId": "A"
|
|
461
|
+
}
|
|
462
|
+
]
|
|
463
|
+
},
|
|
464
|
+
{
|
|
465
|
+
"type": "timeseries",
|
|
466
|
+
"title": "Active handles and requests",
|
|
467
|
+
"description": "Open libuv handles and in-flight async requests. A handle count that only grows is a socket or timer leak, and it usually shows here well before it shows in heap.",
|
|
468
|
+
"id": 15,
|
|
469
|
+
"datasource": {
|
|
470
|
+
"type": "prometheus",
|
|
471
|
+
"uid": "${datasource}"
|
|
472
|
+
},
|
|
473
|
+
"gridPos": {
|
|
474
|
+
"h": 8,
|
|
475
|
+
"w": 12,
|
|
476
|
+
"x": 12,
|
|
477
|
+
"y": 36
|
|
478
|
+
},
|
|
479
|
+
"fieldConfig": {
|
|
480
|
+
"defaults": {
|
|
481
|
+
"unit": "short",
|
|
482
|
+
"min": 0
|
|
483
|
+
},
|
|
484
|
+
"overrides": []
|
|
485
|
+
},
|
|
486
|
+
"targets": [
|
|
487
|
+
{
|
|
488
|
+
"datasource": {
|
|
489
|
+
"type": "prometheus",
|
|
490
|
+
"uid": "${datasource}"
|
|
491
|
+
},
|
|
492
|
+
"expr": "sum(nodejs_active_handles_total{job=~\"$job\"})",
|
|
493
|
+
"legendFormat": "handles",
|
|
494
|
+
"refId": "A"
|
|
495
|
+
},
|
|
496
|
+
{
|
|
497
|
+
"datasource": {
|
|
498
|
+
"type": "prometheus",
|
|
499
|
+
"uid": "${datasource}"
|
|
500
|
+
},
|
|
501
|
+
"expr": "sum(nodejs_active_requests_total{job=~\"$job\"})",
|
|
502
|
+
"legendFormat": "requests",
|
|
503
|
+
"refId": "B"
|
|
504
|
+
}
|
|
505
|
+
]
|
|
506
|
+
},
|
|
507
|
+
{
|
|
508
|
+
"type": "row",
|
|
509
|
+
"title": "Container",
|
|
510
|
+
"id": 16,
|
|
511
|
+
"gridPos": {
|
|
512
|
+
"h": 1,
|
|
513
|
+
"w": 24,
|
|
514
|
+
"x": 0,
|
|
515
|
+
"y": 44
|
|
516
|
+
},
|
|
517
|
+
"collapsed": false,
|
|
518
|
+
"panels": []
|
|
519
|
+
},
|
|
520
|
+
{
|
|
521
|
+
"type": "timeseries",
|
|
522
|
+
"title": "CPU per pod",
|
|
523
|
+
"description": "From cAdvisor, so it includes everything in the container rather than just the Node process. Compare against the pod's CPU limit.",
|
|
524
|
+
"id": 17,
|
|
525
|
+
"datasource": {
|
|
526
|
+
"type": "prometheus",
|
|
527
|
+
"uid": "${datasource}"
|
|
528
|
+
},
|
|
529
|
+
"gridPos": {
|
|
530
|
+
"h": 8,
|
|
531
|
+
"w": 12,
|
|
532
|
+
"x": 0,
|
|
533
|
+
"y": 45
|
|
534
|
+
},
|
|
535
|
+
"fieldConfig": {
|
|
536
|
+
"defaults": {
|
|
537
|
+
"unit": "short",
|
|
538
|
+
"min": 0
|
|
539
|
+
},
|
|
540
|
+
"overrides": []
|
|
541
|
+
},
|
|
542
|
+
"targets": [
|
|
543
|
+
{
|
|
544
|
+
"datasource": {
|
|
545
|
+
"type": "prometheus",
|
|
546
|
+
"uid": "${datasource}"
|
|
547
|
+
},
|
|
548
|
+
"expr": "sum by (pod) (rate(container_cpu_usage_seconds_total{pod=~\"pitcrew-ui-service.*\", container!=\"\"}[5m]))",
|
|
549
|
+
"legendFormat": "{{pod}}",
|
|
550
|
+
"refId": "A"
|
|
551
|
+
}
|
|
552
|
+
]
|
|
553
|
+
},
|
|
554
|
+
{
|
|
555
|
+
"type": "timeseries",
|
|
556
|
+
"title": "Memory per pod",
|
|
557
|
+
"description": "Container working set, which sits above the Node heap because it includes buffers, native allocations and the runtime itself. This is the number the OOM killer acts on, not the heap panel above.",
|
|
558
|
+
"id": 18,
|
|
559
|
+
"datasource": {
|
|
560
|
+
"type": "prometheus",
|
|
561
|
+
"uid": "${datasource}"
|
|
562
|
+
},
|
|
563
|
+
"gridPos": {
|
|
564
|
+
"h": 8,
|
|
565
|
+
"w": 12,
|
|
566
|
+
"x": 12,
|
|
567
|
+
"y": 45
|
|
568
|
+
},
|
|
569
|
+
"fieldConfig": {
|
|
570
|
+
"defaults": {
|
|
571
|
+
"unit": "bytes",
|
|
572
|
+
"min": 0
|
|
573
|
+
},
|
|
574
|
+
"overrides": []
|
|
575
|
+
},
|
|
576
|
+
"targets": [
|
|
577
|
+
{
|
|
578
|
+
"datasource": {
|
|
579
|
+
"type": "prometheus",
|
|
580
|
+
"uid": "${datasource}"
|
|
581
|
+
},
|
|
582
|
+
"expr": "sum by (pod) (container_memory_working_set_bytes{pod=~\"pitcrew-ui-service.*\", container!=\"\"})",
|
|
583
|
+
"legendFormat": "{{pod}}",
|
|
584
|
+
"refId": "A"
|
|
585
|
+
}
|
|
586
|
+
]
|
|
587
|
+
}
|
|
588
|
+
],
|
|
589
|
+
"refresh": "1m",
|
|
590
|
+
"schemaVersion": 39,
|
|
591
|
+
"tags": [
|
|
592
|
+
"pitcrew-ui-service",
|
|
593
|
+
"pitcrew",
|
|
594
|
+
"ui"
|
|
595
|
+
],
|
|
596
|
+
"templating": {
|
|
597
|
+
"list": [
|
|
598
|
+
{
|
|
599
|
+
"type": "datasource",
|
|
600
|
+
"name": "datasource",
|
|
601
|
+
"label": "Data source",
|
|
602
|
+
"query": "prometheus",
|
|
603
|
+
"current": {},
|
|
604
|
+
"hide": 0
|
|
605
|
+
},
|
|
606
|
+
{
|
|
607
|
+
"type": "query",
|
|
608
|
+
"name": "job",
|
|
609
|
+
"label": "Job",
|
|
610
|
+
"datasource": {
|
|
611
|
+
"type": "prometheus",
|
|
612
|
+
"uid": "${datasource}"
|
|
613
|
+
},
|
|
614
|
+
"description": "Scrape job, so one dashboard can serve several deployments of this service. Derived from up{app_kubernetes_io_name=...} so the list only ever contains this service.",
|
|
615
|
+
"query": "label_values(up{app_kubernetes_io_name=\"pitcrew-ui-service\"}, job)",
|
|
616
|
+
"refresh": 1,
|
|
617
|
+
"includeAll": true,
|
|
618
|
+
"multi": true,
|
|
619
|
+
"current": {
|
|
620
|
+
"selected": false,
|
|
621
|
+
"text": "pitcrew-ui-service",
|
|
622
|
+
"value": "pitcrew-ui-service"
|
|
623
|
+
},
|
|
624
|
+
"hide": 0
|
|
625
|
+
}
|
|
626
|
+
]
|
|
627
|
+
},
|
|
628
|
+
"time": {
|
|
629
|
+
"from": "now-6h",
|
|
630
|
+
"to": "now"
|
|
631
|
+
},
|
|
632
|
+
"timepicker": {},
|
|
633
|
+
"timezone": "",
|
|
634
|
+
"title": "PitCrew UI Service",
|
|
635
|
+
"uid": "pitcrew-ui-service",
|
|
636
|
+
"version": 1
|
|
637
|
+
}
|