master
c 1,521 lines 58.1 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 #include "cgroup-internals.h"
4
5 void update_cpu_utilization_chart(struct cgroup *cg) {
6 RRDSET *chart = cg->st_cpu;
7
8 if (unlikely(!cg->st_cpu)) {
9 char *title;
10 char *context;
11 int prio;
12
13 if (is_cgroup_systemd_service(cg)) {
14 title = "Systemd Services CPU utilization (100%% = 1 core)";
15 context = "systemd.service.cpu.utilization";
16 prio = NETDATA_CHART_PRIO_CGROUPS_SYSTEMD;
17 } else {
18 title = k8s_is_kubepod(cg) ? "CPU Usage (100%% = 1000 mCPU)" : "CPU Usage (100%% = 1 core)";
19 context = k8s_is_kubepod(cg) ? "k8s.cgroup.cpu" : "cgroup.cpu";
20 prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS;
21 }
22
23 char buff[RRD_ID_LENGTH_MAX + 1];
24 chart = cg->st_cpu = rrdset_create_localhost(
25 cgroup_chart_type(buff, cg),
26 "cpu",
27 NULL,
28 "cpu",
29 context,
30 title,
31 "percentage",
32 PLUGIN_CGROUPS_NAME,
33 is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
34 prio,
35 cgroup_update_every,
36 RRDSET_TYPE_STACKED);
37
38 rrdset_update_rrdlabels(chart, cg->chart_labels);
39
40 if (!(cg->options & CGROUP_OPTIONS_IS_UNIFIED)) {
41 cg->st_cpu_rd_user = rrddim_add(chart, "user", NULL, 100, system_hz, RRD_ALGORITHM_INCREMENTAL);
42 cg->st_cpu_rd_system = rrddim_add(chart, "system", NULL, 100, system_hz, RRD_ALGORITHM_INCREMENTAL);
43 } else {
44 cg->st_cpu_rd_user = rrddim_add(chart, "user", NULL, 100, 1000000, RRD_ALGORITHM_INCREMENTAL);
45 cg->st_cpu_rd_system = rrddim_add(chart, "system", NULL, 100, 1000000, RRD_ALGORITHM_INCREMENTAL);
46 }
47 }
48
49 rrddim_set_by_pointer(chart, cg->st_cpu_rd_user, (collected_number)cg->cpuacct_stat.user);
50 rrddim_set_by_pointer(chart, cg->st_cpu_rd_system, (collected_number)cg->cpuacct_stat.system);
51 rrdset_done(chart);
52 }
53
54 void update_cpu_utilization_limit_chart(struct cgroup *cg, NETDATA_DOUBLE cpu_limit) {
55 if (is_cgroup_systemd_service(cg))
56 return;
57
58 RRDSET *chart = cg->st_cpu_limit;
59
60 if (unlikely(!cg->st_cpu_limit)) {
61 char *title = "CPU Usage within the limits";
62 char *context = k8s_is_kubepod(cg) ? "k8s.cgroup.cpu_limit" : "cgroup.cpu_limit";
63 int prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS - 1;
64
65 char buff[RRD_ID_LENGTH_MAX + 1];
66 chart = cg->st_cpu_limit = rrdset_create_localhost(
67 cgroup_chart_type(buff, cg),
68 "cpu_limit",
69 NULL,
70 "cpu",
71 context,
72 title,
73 "percentage",
74 PLUGIN_CGROUPS_NAME,
75 is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
76 prio,
77 cgroup_update_every,
78 RRDSET_TYPE_LINE);
79
80 rrdset_update_rrdlabels(chart, cg->chart_labels);
81
82 if (!(cg->options & CGROUP_OPTIONS_IS_UNIFIED))
83 rrddim_add(chart, "used", NULL, 1, system_hz, RRD_ALGORITHM_ABSOLUTE);
84 else
85 rrddim_add(chart, "used", NULL, 1, 1000000, RRD_ALGORITHM_ABSOLUTE);
86 cg->prev_cpu_usage = (NETDATA_DOUBLE)(cg->cpuacct_stat.user + cg->cpuacct_stat.system) * 100;
87 }
88
89 NETDATA_DOUBLE cpu_usage = 0;
90 cpu_usage = (NETDATA_DOUBLE)(cg->cpuacct_stat.user + cg->cpuacct_stat.system) * 100;
91 NETDATA_DOUBLE cpu_used = 100 * (cpu_usage - cg->prev_cpu_usage) / (cpu_limit * cgroup_update_every);
92
93 rrddim_set(chart, "used", (cpu_used > 0) ? (collected_number)cpu_used : 0);
94
95 cg->prev_cpu_usage = cpu_usage;
96
97 rrdvar_chart_variable_set(cg->st_cpu, cg->chart_var_cpu_limit, cpu_limit);
98 rrdset_done(chart);
99 }
100
101 void update_cpu_throttled_chart(struct cgroup *cg) {
102 if (is_cgroup_systemd_service(cg))
103 return;
104
105 RRDSET *chart = cg->st_cpu_nr_throttled;
106
107 if (unlikely(!cg->st_cpu_nr_throttled)) {
108 char *title = "CPU Throttled Runnable Periods";
109 char *context = k8s_is_kubepod(cg) ? "k8s.cgroup.throttled" : "cgroup.throttled";
110 int prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS + 10;
111
112 char buff[RRD_ID_LENGTH_MAX + 1];
113 chart = cg->st_cpu_nr_throttled = rrdset_create_localhost(
114 cgroup_chart_type(buff, cg),
115 "throttled",
116 NULL,
117 "cpu",
118 context,
119 title,
120 "percentage",
121 PLUGIN_CGROUPS_NAME,
122 is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
123 prio,
124 cgroup_update_every,
125 RRDSET_TYPE_LINE);
126
127 rrdset_update_rrdlabels(chart, cg->chart_labels);
128 rrddim_add(chart, "throttled", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
129 }
130
131 rrddim_set(chart, "throttled", (collected_number)cg->cpuacct_cpu_throttling.nr_throttled_perc);
132 rrdset_done(chart);
133 }
134
135 void update_cpu_throttled_duration_chart(struct cgroup *cg) {
136 if (is_cgroup_systemd_service(cg))
137 return;
138
139 RRDSET *chart = cg->st_cpu_throttled_time;
140
141 if (unlikely(!cg->st_cpu_throttled_time)) {
142 char *title = "CPU Throttled Time Duration";
143 char *context = k8s_is_kubepod(cg) ? "k8s.cgroup.throttled_duration" : "cgroup.throttled_duration";
144 int prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS + 15;
145
146 char buff[RRD_ID_LENGTH_MAX + 1];
147 chart = cg->st_cpu_throttled_time = rrdset_create_localhost(
148 cgroup_chart_type(buff, cg),
149 "throttled_duration",
150 NULL,
151 "cpu",
152 context,
153 title,
154 "ms",
155 PLUGIN_CGROUPS_NAME,
156 is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
157 prio,
158 cgroup_update_every,
159 RRDSET_TYPE_LINE);
160
161 rrdset_update_rrdlabels(chart, cg->chart_labels);
162 rrddim_add(chart, "duration", NULL, 1, 1000000, RRD_ALGORITHM_INCREMENTAL);
163 }
164
165 rrddim_set(chart, "duration", (collected_number)cg->cpuacct_cpu_throttling.throttled_time);
166 rrdset_done(chart);
167 }
168
169 void update_cpu_shares_chart(struct cgroup *cg) {
170 if (is_cgroup_systemd_service(cg))
171 return;
172
173 RRDSET *chart = cg->st_cpu_shares;
174
175 if (unlikely(!cg->st_cpu_shares)) {
176 char *title = "CPU Time Relative Share";
177 char *context = k8s_is_kubepod(cg) ? "k8s.cgroup.cpu_shares" : "cgroup.cpu_shares";
178 int prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS + 20;
179
180 char buff[RRD_ID_LENGTH_MAX + 1];
181 chart = cg->st_cpu_shares = rrdset_create_localhost(
182 cgroup_chart_type(buff, cg),
183 "cpu_shares",
184 NULL,
185 "cpu",
186 context,
187 title,
188 "shares",
189 PLUGIN_CGROUPS_NAME,
190 is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
191 prio,
192 cgroup_update_every,
193 RRDSET_TYPE_LINE);
194
195 rrdset_update_rrdlabels(chart, cg->chart_labels);
196 rrddim_add(chart, "shares", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
197 }
198
199 rrddim_set(chart, "shares", (collected_number)cg->cpuacct_cpu_shares.shares);
200 rrdset_done(chart);
201 }
202
203 void update_cpu_per_core_usage_chart(struct cgroup *cg) {
204 if (is_cgroup_systemd_service(cg))
205 return;
206
207 char id[RRD_ID_LENGTH_MAX + 1];
208 unsigned int i;
209
210 if (unlikely(!cg->st_cpu_per_core)) {
211 char *title = k8s_is_kubepod(cg) ? "CPU Usage (100%% = 1000 mCPU) Per Core" : "CPU Usage (100%% = 1 core) Per Core";
212 char *context = k8s_is_kubepod(cg) ? "k8s.cgroup.cpu_per_core" : "cgroup.cpu_per_core";
213 int prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS + 100;
214
215 char buff[RRD_ID_LENGTH_MAX + 1];
216 cg->st_cpu_per_core = rrdset_create_localhost(
217 cgroup_chart_type(buff, cg),
218 "cpu_per_core",
219 NULL,
220 "cpu",
221 context,
222 title,
223 "percentage",
224 PLUGIN_CGROUPS_NAME,
225 is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
226 prio,
227 cgroup_update_every,
228 RRDSET_TYPE_STACKED);
229
230 rrdset_update_rrdlabels(cg->st_cpu_per_core, cg->chart_labels);
231
232 for (i = 0; i < cg->cpuacct_usage.cpus; i++) {
233 snprintfz(id, RRD_ID_LENGTH_MAX, "cpu%u", i);
234 rrddim_add(cg->st_cpu_per_core, id, NULL, 100, 1000000000, RRD_ALGORITHM_INCREMENTAL);
235 }
236 }
237
238 for (i = 0; i < cg->cpuacct_usage.cpus; i++) {
239 snprintfz(id, RRD_ID_LENGTH_MAX, "cpu%u", i);
240 rrddim_set(cg->st_cpu_per_core, id, (collected_number)cg->cpuacct_usage.cpu_percpu[i]);
241 }
242 rrdset_done(cg->st_cpu_per_core);
243 }
244
245 void update_mem_usage_detailed_chart(struct cgroup *cg) {
246 RRDSET *chart = cg->st_mem;
247
248 if (unlikely(!cg->st_mem)) {
249 char *title;
250 char *context;
251 int prio;
252 if (is_cgroup_systemd_service(cg)) {
253 title = "Systemd Services Memory";
254 context = "systemd.service.memory.ram.usage";
255 prio = NETDATA_CHART_PRIO_CGROUPS_SYSTEMD + 15;
256 } else {
257 title = "Memory Usage";
258 context = k8s_is_kubepod(cg) ? "k8s.cgroup.mem" : "cgroup.mem";
259 prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS + 220;
260 }
261
262 char buff[RRD_ID_LENGTH_MAX + 1];
263
264 chart = cg->st_mem = rrdset_create_localhost(
265 cgroup_chart_type(buff, cg),
266 "mem",
267 NULL,
268 "mem",
269 context,
270 title,
271 "MiB",
272 PLUGIN_CGROUPS_NAME,
273 is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
274 prio,
275 cgroup_update_every,
276 RRDSET_TYPE_STACKED);
277
278 rrdset_update_rrdlabels(chart, cg->chart_labels);
279
280 if (!(cg->options & CGROUP_OPTIONS_IS_UNIFIED)) {
281 rrddim_add(chart, "cache", NULL, 1, 1024 * 1024, RRD_ALGORITHM_ABSOLUTE);
282 rrddim_add(chart, "rss", NULL, 1, 1024 * 1024, RRD_ALGORITHM_ABSOLUTE);
283
284 if (cg->memory.detailed_has_swap)
285 rrddim_add(chart, "swap", NULL, 1, 1024 * 1024, RRD_ALGORITHM_ABSOLUTE);
286
287 rrddim_add(chart, "rss_huge", NULL, 1, 1024 * 1024, RRD_ALGORITHM_ABSOLUTE);
288 rrddim_add(chart, "mapped_file", NULL, 1, 1024 * 1024, RRD_ALGORITHM_ABSOLUTE);
289 } else {
290 rrddim_add(chart, "anon", NULL, 1, 1024 * 1024, RRD_ALGORITHM_ABSOLUTE);
291 rrddim_add(chart, "kernel_stack", NULL, 1, 1024 * 1024, RRD_ALGORITHM_ABSOLUTE);
292 rrddim_add(chart, "slab", NULL, 1, 1024 * 1024, RRD_ALGORITHM_ABSOLUTE);
293 rrddim_add(chart, "sock", NULL, 1, 1024 * 1024, RRD_ALGORITHM_ABSOLUTE);
294 rrddim_add(chart, "anon_thp", NULL, 1, 1024 * 1024, RRD_ALGORITHM_ABSOLUTE);
295 rrddim_add(chart, "file", NULL, 1, 1024 * 1024, RRD_ALGORITHM_ABSOLUTE);
296 }
297 }
298
299 if (!(cg->options & CGROUP_OPTIONS_IS_UNIFIED)) {
300 rrddim_set(chart, "cache", (collected_number)cg->memory.total_cache);
301 collected_number rss = (collected_number)(cg->memory.total_rss - cg->memory.total_rss_huge);
302 if (rss < 0)
303 rss = 0;
304 rrddim_set(chart, "rss", rss);
305 if (cg->memory.detailed_has_swap)
306 rrddim_set(chart, "swap", (collected_number)cg->memory.total_swap);
307 rrddim_set(chart, "rss_huge", (collected_number)cg->memory.total_rss_huge);
308 rrddim_set(chart, "mapped_file", (collected_number)cg->memory.total_mapped_file);
309 } else {
310 rrddim_set(chart, "anon", (collected_number)cg->memory.anon);
311 rrddim_set(chart, "kernel_stack", (collected_number)cg->memory.kernel_stack);
312 rrddim_set(chart, "slab", (collected_number)cg->memory.slab);
313 rrddim_set(chart, "sock", (collected_number)cg->memory.sock);
314 rrddim_set(chart, "anon_thp", (collected_number)cg->memory.anon_thp);
315 rrddim_set(chart, "file", (collected_number)cg->memory.total_mapped_file);
316 }
317 rrdset_done(chart);
318 }
319
320 void update_mem_writeback_chart(struct cgroup *cg) {
321 RRDSET *chart = cg->st_writeback;
322
323 if (unlikely(!cg->st_writeback)) {
324 char *title;
325 char *context;
326 int prio;
327 if (is_cgroup_systemd_service(cg)) {
328 title = "Systemd Services Writeback Memory";
329 context = "systemd.service.memory.writeback";
330 prio = NETDATA_CHART_PRIO_CGROUPS_SYSTEMD + 20;
331 } else {
332 title = "Writeback Memory";
333 context = k8s_is_kubepod(cg) ? "k8s.cgroup.writeback" : "cgroup.writeback";
334 prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS + 300;
335 }
336
337 char buff[RRD_ID_LENGTH_MAX + 1];
338 chart = cg->st_writeback = rrdset_create_localhost(
339 cgroup_chart_type(buff, cg),
340 "writeback",
341 NULL,
342 "mem",
343 context,
344 title,
345 "MiB",
346 PLUGIN_CGROUPS_NAME,
347 is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
348 prio,
349 cgroup_update_every,
350 RRDSET_TYPE_AREA);
351
352 rrdset_update_rrdlabels(chart, cg->chart_labels);
353 if (cg->memory.detailed_has_dirty)
354 rrddim_add(chart, "dirty", NULL, 1, 1024 * 1024, RRD_ALGORITHM_ABSOLUTE);
355 rrddim_add(chart, "writeback", NULL, 1, 1024 * 1024, RRD_ALGORITHM_ABSOLUTE);
356 }
357
358 if (cg->memory.detailed_has_dirty)
359 rrddim_set(chart, "dirty", (collected_number)cg->memory.total_dirty);
360 rrddim_set(chart, "writeback", (collected_number)cg->memory.total_writeback);
361 rrdset_done(chart);
362 }
363
364 void update_mem_activity_chart(struct cgroup *cg) {
365 RRDSET *chart = cg->st_mem_activity;
366
367 if (unlikely(!cg->st_mem_activity)) {
368 char *title;
369 char *context;
370 int prio;
371 if (is_cgroup_systemd_service(cg)) {
372 title = "Systemd Services Memory Paging IO";
373 context = "systemd.service.memory.paging.io";
374 prio = NETDATA_CHART_PRIO_CGROUPS_SYSTEMD + 30;
375 } else {
376 title = "Memory Activity";
377 context = k8s_is_kubepod(cg) ? "k8s.cgroup.mem_activity" : "cgroup.mem_activity";
378 prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS + 400;
379 }
380
381 char buff[RRD_ID_LENGTH_MAX + 1];
382 chart = cg->st_mem_activity = rrdset_create_localhost(
383 cgroup_chart_type(buff, cg),
384 "mem_activity",
385 NULL,
386 "mem",
387 context,
388 title,
389 "MiB/s",
390 PLUGIN_CGROUPS_NAME,
391 is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
392 prio,
393 cgroup_update_every,
394 RRDSET_TYPE_LINE);
395
396 rrdset_update_rrdlabels(chart, cg->chart_labels);
397 // FIXME: systemd just in, out
398 rrddim_add(chart, "pgpgin", "in", system_page_size, 1024 * 1024, RRD_ALGORITHM_INCREMENTAL);
399 rrddim_add(chart, "pgpgout", "out", -system_page_size, 1024 * 1024, RRD_ALGORITHM_INCREMENTAL);
400 }
401
402 rrddim_set(chart, "pgpgin", (collected_number)cg->memory.total_pgpgin);
403 rrddim_set(chart, "pgpgout", (collected_number)cg->memory.total_pgpgout);
404 rrdset_done(chart);
405 }
406
407 void update_mem_pgfaults_chart(struct cgroup *cg) {
408 RRDSET *chart = cg->st_pgfaults;
409
410 if (unlikely(!cg->st_pgfaults)) {
411 char *title;
412 char *context;
413 int prio;
414 if (is_cgroup_systemd_service(cg)) {
415 title = "Systemd Services Memory Page Faults";
416 context = "systemd.service.memory.paging.faults";
417 prio = NETDATA_CHART_PRIO_CGROUPS_SYSTEMD + 25;
418 } else {
419 title = "Memory Page Faults";
420 context = k8s_is_kubepod(cg) ? "k8s.cgroup.pgfaults" : "cgroup.pgfaults";
421 prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS + 500;
422 }
423
424 char buff[RRD_ID_LENGTH_MAX + 1];
425 chart = cg->st_pgfaults = rrdset_create_localhost(
426 cgroup_chart_type(buff, cg),
427 "pgfaults",
428 NULL,
429 "mem",
430 context,
431 title,
432 "MiB/s",
433 PLUGIN_CGROUPS_NAME,
434 is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
435 prio,
436 cgroup_update_every,
437 RRDSET_TYPE_LINE);
438
439 rrdset_update_rrdlabels(chart, cg->chart_labels);
440 rrddim_add(chart, "pgfault", NULL, system_page_size, 1024 * 1024, RRD_ALGORITHM_INCREMENTAL);
441 rrddim_add(chart, "pgmajfault", "swap", -system_page_size, 1024 * 1024, RRD_ALGORITHM_INCREMENTAL);
442 }
443
444 rrddim_set(chart, "pgfault", (collected_number)cg->memory.total_pgfault);
445 rrddim_set(chart, "pgmajfault", (collected_number)cg->memory.total_pgmajfault);
446 rrdset_done(chart);
447 }
448
449 void update_mem_usage_limit_chart(struct cgroup *cg, unsigned long long memory_limit) {
450 if (is_cgroup_systemd_service(cg) || !memory_limit)
451 return;
452
453 RRDSET *chart = cg->st_mem_usage_limit;
454
455 if (unlikely(!cg->st_mem_usage_limit)) {
456 char *title = "Used RAM within the limits";
457 char *context = k8s_is_kubepod(cg) ? "k8s.cgroup.mem_usage_limit" : "cgroup.mem_usage_limit";
458 int prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS + 200;
459
460 char buff[RRD_ID_LENGTH_MAX + 1];
461 chart = cg->st_mem_usage_limit = rrdset_create_localhost(
462 cgroup_chart_type(buff, cg),
463 "mem_usage_limit",
464 NULL,
465 "mem",
466 context,
467 title,
468 "MiB",
469 PLUGIN_CGROUPS_NAME,
470 is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
471 prio,
472 cgroup_update_every,
473 RRDSET_TYPE_STACKED);
474
475 rrdset_update_rrdlabels(chart, cg->chart_labels);
476
477 rrddim_add(chart, "available", NULL, 1, 1024 * 1024, RRD_ALGORITHM_ABSOLUTE);
478 rrddim_add(chart, "used", NULL, 1, 1024 * 1024, RRD_ALGORITHM_ABSOLUTE);
479 }
480
481 rrddim_set(chart, "available", (collected_number)(memory_limit - cg->memory.usage_in_bytes));
482 rrddim_set(chart, "used", (collected_number)cg->memory.usage_in_bytes);
483 rrdset_done(chart);
484 }
485
486 void update_mem_utilization_chart(struct cgroup *cg, unsigned long long memory_limit) {
487 if (is_cgroup_systemd_service(cg) || !memory_limit)
488 return;
489
490 RRDSET *chart = cg->st_mem_utilization;
491
492 if (unlikely(!cg->st_mem_utilization)) {
493 char *title = "Memory Utilization";
494 char *context = k8s_is_kubepod(cg) ? "k8s.cgroup.mem_utilization" : "cgroup.mem_utilization";
495 int prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS + 199;
496
497 char buff[RRD_ID_LENGTH_MAX + 1];
498 chart = cg->st_mem_utilization = rrdset_create_localhost(
499 cgroup_chart_type(buff, cg),
500 "mem_utilization",
501 NULL,
502 "mem",
503 context,
504 title,
505 "percentage",
506 PLUGIN_CGROUPS_NAME,
507 is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
508 prio,
509 cgroup_update_every,
510 RRDSET_TYPE_AREA);
511
512 rrdset_update_rrdlabels(chart, cg->chart_labels);
513
514 rrddim_add(chart, "utilization", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
515 }
516
517 collected_number util = (collected_number)(cg->memory.usage_in_bytes * 100 / memory_limit);
518 rrddim_set(chart, "utilization", util);
519 rrdset_done(chart);
520 }
521
522 void update_mem_failcnt_chart(struct cgroup *cg) {
523 RRDSET *chart = cg->st_mem_failcnt;
524
525 if (unlikely(!cg->st_mem_failcnt)) {
526 char *title;
527 char *context;
528 int prio;
529 if (is_cgroup_systemd_service(cg)) {
530 title = "Systemd Services Memory Limit Failures";
531 context = "systemd.service.memory.failcnt";
532 prio = NETDATA_CHART_PRIO_CGROUPS_SYSTEMD + 10;
533 } else {
534 title = "Memory Limit Failures";
535 context = k8s_is_kubepod(cg) ? "k8s.cgroup.mem_failcnt" : "cgroup.mem_failcnt";
536 prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS + 250;
537 }
538
539 char buff[RRD_ID_LENGTH_MAX + 1];
540 chart = cg->st_mem_failcnt = rrdset_create_localhost(
541 cgroup_chart_type(buff, cg),
542 "mem_failcnt",
543 NULL,
544 "mem",
545 context,
546 title,
547 "count",
548 PLUGIN_CGROUPS_NAME,
549 is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
550 prio,
551 cgroup_update_every,
552 RRDSET_TYPE_LINE);
553
554 rrdset_update_rrdlabels(chart, cg->chart_labels);
555 rrddim_add(chart, "failures", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
556 }
557
558 rrddim_set(chart, "failures", (collected_number)cg->memory.failcnt);
559 rrdset_done(chart);
560 }
561
562 void update_mem_usage_chart(struct cgroup *cg) {
563 RRDSET *chart = cg->st_mem_usage;
564
565 if (unlikely(!cg->st_mem_usage)) {
566 char *title;
567 char *context;
568 int prio;
569 if (is_cgroup_systemd_service(cg)) {
570 title = "Systemd Services Used Memory";
571 context = "systemd.service.memory.usage";
572 prio = NETDATA_CHART_PRIO_CGROUPS_SYSTEMD + 5;
573 } else {
574 title = "Used Memory";
575 context = k8s_is_kubepod(cg) ? "k8s.cgroup.mem_usage" : "cgroup.mem_usage";
576 prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS + 210;
577 }
578
579 char buff[RRD_ID_LENGTH_MAX + 1];
580 chart = cg->st_mem_usage = rrdset_create_localhost(
581 cgroup_chart_type(buff, cg),
582 "mem_usage",
583 NULL,
584 "mem",
585 context,
586 title,
587 "MiB",
588 PLUGIN_CGROUPS_NAME,
589 is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
590 prio,
591 cgroup_update_every,
592 RRDSET_TYPE_STACKED);
593
594 rrdset_update_rrdlabels(chart, cg->chart_labels);
595
596 cg->st_mem_rd_ram = rrddim_add(chart, "ram", NULL, 1, 1024 * 1024, RRD_ALGORITHM_ABSOLUTE);
597 cg->st_mem_rd_swap = rrddim_add(chart, "swap", NULL, 1, 1024 * 1024, RRD_ALGORITHM_ABSOLUTE);
598 }
599
600 rrddim_set_by_pointer(chart, cg->st_mem_rd_ram, (collected_number)cg->memory.usage_in_bytes);
601
602 if (!(cg->options & CGROUP_OPTIONS_IS_UNIFIED)) {
603 rrddim_set_by_pointer(
604 chart,
605 cg->st_mem_rd_swap,
606 cg->memory.msw_usage_in_bytes > (cg->memory.usage_in_bytes + cg->memory.total_inactive_file) ?
607 (collected_number)(cg->memory.msw_usage_in_bytes -
608 (cg->memory.usage_in_bytes + cg->memory.total_inactive_file)) :
609 0);
610 } else {
611 rrddim_set_by_pointer(chart, cg->st_mem_rd_swap, (collected_number)cg->memory.msw_usage_in_bytes);
612 }
613
614 rrdset_done(chart);
615 }
616
617 void update_io_serviced_bytes_chart(struct cgroup *cg) {
618 RRDSET *chart = cg->st_io;
619
620 if (unlikely(!cg->st_io)) {
621 char *title;
622 char *context;
623 int prio;
624 if (is_cgroup_systemd_service(cg)) {
625 title = "Systemd Services Disk Read/Write Bandwidth";
626 context = "systemd.service.disk.io";
627 prio = NETDATA_CHART_PRIO_CGROUPS_SYSTEMD + 35;
628 } else {
629 title = "I/O Bandwidth (all disks)";
630 context = k8s_is_kubepod(cg) ? "k8s.cgroup.io" : "cgroup.io";
631 prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS + 1200;
632 }
633
634 char buff[RRD_ID_LENGTH_MAX + 1];
635 chart = cg->st_io = rrdset_create_localhost(
636 cgroup_chart_type(buff, cg),
637 "io",
638 NULL,
639 "disk",
640 context,
641 title,
642 "KiB/s",
643 PLUGIN_CGROUPS_NAME,
644 is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
645 prio,
646 cgroup_update_every,
647 RRDSET_TYPE_AREA);
648
649 rrdset_update_rrdlabels(chart, cg->chart_labels);
650 cg->st_io_rd_read = rrddim_add(chart, "read", NULL, 1, 1024, RRD_ALGORITHM_INCREMENTAL);
651 cg->st_io_rd_written = rrddim_add(cg->st_io, "write", NULL, -1, 1024, RRD_ALGORITHM_INCREMENTAL);
652 }
653
654 rrddim_set_by_pointer(chart, cg->st_io_rd_read, (collected_number)cg->io_service_bytes.Read);
655 rrddim_set_by_pointer(chart, cg->st_io_rd_written, (collected_number)cg->io_service_bytes.Write);
656 rrdset_done(chart);
657 }
658
659 void update_io_serviced_ops_chart(struct cgroup *cg) {
660 RRDSET *chart = cg->st_serviced_ops;
661
662 if (unlikely(!cg->st_serviced_ops)) {
663 char *title;
664 char *context;
665 int prio;
666 if (is_cgroup_systemd_service(cg)) {
667 title = "Systemd Services Disk Read/Write Operations";
668 context = "systemd.service.disk.iops";
669 prio = NETDATA_CHART_PRIO_CGROUPS_SYSTEMD + 40;
670 } else {
671 title = "Serviced I/O Operations (all disks)";
672 context = k8s_is_kubepod(cg) ? "k8s.cgroup.serviced_ops" : "cgroup.serviced_ops";
673 prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS + 1200;
674 }
675
676 char buff[RRD_ID_LENGTH_MAX + 1];
677 chart = cg->st_serviced_ops = rrdset_create_localhost(
678 cgroup_chart_type(buff, cg),
679 "serviced_ops",
680 NULL,
681 "disk",
682 context,
683 title,
684 "operations/s",
685 PLUGIN_CGROUPS_NAME,
686 is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
687 prio,
688 cgroup_update_every,
689 RRDSET_TYPE_LINE);
690
691 rrdset_update_rrdlabels(chart, cg->chart_labels);
692 rrddim_add(chart, "read", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
693 rrddim_add(chart, "write", NULL, -1, 1, RRD_ALGORITHM_INCREMENTAL);
694 }
695
696 rrddim_set(chart, "read", (collected_number)cg->io_serviced.Read);
697 rrddim_set(chart, "write", (collected_number)cg->io_serviced.Write);
698 rrdset_done(chart);
699 }
700
701 void update_throttle_io_serviced_bytes_chart(struct cgroup *cg) {
702 RRDSET *chart = cg->st_throttle_io;
703
704 if (unlikely(!cg->st_throttle_io)) {
705 char *title;
706 char *context;
707 int prio;
708 if (is_cgroup_systemd_service(cg)) {
709 title = "Systemd Services Throttle Disk Read/Write Bandwidth";
710 context = "systemd.service.disk.throttle.io";
711 prio = NETDATA_CHART_PRIO_CGROUPS_SYSTEMD + 45;
712 } else {
713 title = "Throttle I/O Bandwidth (all disks)";
714 context = k8s_is_kubepod(cg) ? "k8s.cgroup.throttle_io" : "cgroup.throttle_io";
715 prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS + 1200;
716 }
717
718 char buff[RRD_ID_LENGTH_MAX + 1];
719 chart = cg->st_throttle_io = rrdset_create_localhost(
720 cgroup_chart_type(buff, cg),
721 "throttle_io",
722 NULL,
723 "disk",
724 context,
725 title,
726 "KiB/s",
727 PLUGIN_CGROUPS_NAME,
728 is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
729 prio,
730 cgroup_update_every,
731 RRDSET_TYPE_AREA);
732
733 rrdset_update_rrdlabels(chart, cg->chart_labels);
734
735 cg->st_throttle_io_rd_read = rrddim_add(chart, "read", NULL, 1, 1024, RRD_ALGORITHM_INCREMENTAL);
736 cg->st_throttle_io_rd_written = rrddim_add(chart, "write", NULL, -1, 1024, RRD_ALGORITHM_INCREMENTAL);
737 }
738
739 rrddim_set_by_pointer(chart, cg->st_throttle_io_rd_read, (collected_number)cg->throttle_io_service_bytes.Read);
740 rrddim_set_by_pointer(chart, cg->st_throttle_io_rd_written, (collected_number)cg->throttle_io_service_bytes.Write);
741 rrdset_done(chart);
742 }
743
744 void update_throttle_io_serviced_ops_chart(struct cgroup *cg) {
745 RRDSET *chart = cg->st_throttle_serviced_ops;
746
747 if (unlikely(!cg->st_throttle_serviced_ops)) {
748 char *title;
749 char *context;
750 int prio;
751 if (is_cgroup_systemd_service(cg)) {
752 title = "Systemd Services Throttle Disk Read/Write Operations";
753 context = "systemd.service.disk.throttle.iops";
754 prio = NETDATA_CHART_PRIO_CGROUPS_SYSTEMD + 50;
755 } else {
756 title = "Throttle Serviced I/O Operations (all disks)";
757 context = k8s_is_kubepod(cg) ? "k8s.cgroup.throttle_serviced_ops" : "cgroup.throttle_serviced_ops";
758 prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS + 1200;
759 }
760
761 char buff[RRD_ID_LENGTH_MAX + 1];
762 chart = cg->st_throttle_serviced_ops = rrdset_create_localhost(
763 cgroup_chart_type(buff, cg),
764 "throttle_serviced_ops",
765 NULL,
766 "disk",
767 context,
768 title,
769 "operations/s",
770 PLUGIN_CGROUPS_NAME,
771 is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
772 prio,
773 cgroup_update_every,
774 RRDSET_TYPE_LINE);
775
776 rrdset_update_rrdlabels(chart, cg->chart_labels);
777 rrddim_add(chart, "read", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
778 rrddim_add(chart, "write", NULL, -1, 1, RRD_ALGORITHM_INCREMENTAL);
779 }
780
781 rrddim_set(chart, "read", (collected_number)cg->throttle_io_serviced.Read);
782 rrddim_set(chart, "write", (collected_number)cg->throttle_io_serviced.Write);
783 rrdset_done(chart);
784 }
785
786 void update_io_queued_ops_chart(struct cgroup *cg) {
787 RRDSET *chart = cg->st_queued_ops;
788
789 if (unlikely(!cg->st_queued_ops)) {
790 char *title;
791 char *context;
792 int prio;
793 if (is_cgroup_systemd_service(cg)) {
794 title = "Systemd Services Queued Disk Read/Write Operations";
795 context = "systemd.service.disk.queued_iops";
796 prio = NETDATA_CHART_PRIO_CGROUPS_SYSTEMD + 55;
797 } else {
798 title = "Queued I/O Operations (all disks)";
799 context = k8s_is_kubepod(cg) ? "k8s.cgroup.queued_ops" : "cgroup.queued_ops";
800 prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS + 2000;
801 }
802
803 char buff[RRD_ID_LENGTH_MAX + 1];
804 chart = cg->st_queued_ops = rrdset_create_localhost(
805 cgroup_chart_type(buff, cg),
806 "queued_ops",
807 NULL,
808 "disk",
809 context,
810 title,
811 "operations",
812 PLUGIN_CGROUPS_NAME,
813 is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
814 prio,
815 cgroup_update_every,
816 RRDSET_TYPE_LINE);
817
818 rrdset_update_rrdlabels(chart, cg->chart_labels);
819 rrddim_add(chart, "read", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
820 rrddim_add(chart, "write", NULL, -1, 1, RRD_ALGORITHM_ABSOLUTE);
821 }
822
823 rrddim_set(chart, "read", (collected_number)cg->io_queued.Read);
824 rrddim_set(chart, "write", (collected_number)cg->io_queued.Write);
825 rrdset_done(chart);
826 }
827
828 void update_io_merged_ops_chart(struct cgroup *cg) {
829 RRDSET *chart = cg->st_merged_ops;
830
831 if (unlikely(!cg->st_merged_ops)) {
832 char *title;
833 char *context;
834 int prio;
835 if (is_cgroup_systemd_service(cg)) {
836 title = "Systemd Services Merged Disk Read/Write Operations";
837 context = "systemd.service.disk.merged_iops";
838 prio = NETDATA_CHART_PRIO_CGROUPS_SYSTEMD + 60;
839 } else {
840 title = "Merged I/O Operations (all disks)";
841 context = k8s_is_kubepod(cg) ? "k8s.cgroup.merged_ops" : "cgroup.merged_ops";
842 prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS + 2100;
843 }
844
845 char buff[RRD_ID_LENGTH_MAX + 1];
846 chart = cg->st_merged_ops = rrdset_create_localhost(
847 cgroup_chart_type(buff, cg),
848 "merged_ops",
849 NULL,
850 "disk",
851 context,
852 title,
853 "operations/s",
854 PLUGIN_CGROUPS_NAME,
855 is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
856 prio,
857 cgroup_update_every,
858 RRDSET_TYPE_LINE);
859
860 rrdset_update_rrdlabels(chart, cg->chart_labels);
861 rrddim_add(chart, "read", NULL, 1, 1024, RRD_ALGORITHM_INCREMENTAL);
862 rrddim_add(chart, "write", NULL, -1, 1024, RRD_ALGORITHM_INCREMENTAL);
863 }
864
865 rrddim_set(chart, "read", (collected_number)cg->io_merged.Read);
866 rrddim_set(chart, "write", (collected_number)cg->io_merged.Write);
867 rrdset_done(chart);
868 }
869
870 void update_cpu_some_pressure_chart(struct cgroup *cg) {
871 if (is_cgroup_systemd_service(cg))
872 return;
873
874 struct pressure *res = &cg->cpu_pressure;
875 struct pressure_charts *pcs = &res->some;
876 RRDSET *chart = pcs->share_time.st;
877
878 if (unlikely(!pcs->share_time.st)) {
879 char *title = "CPU some pressure";
880 char *context = k8s_is_kubepod(cg) ? "k8s.cgroup.cpu_some_pressure" : "cgroup.cpu_some_pressure";
881 int prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS + 2200;
882
883 char buff[RRD_ID_LENGTH_MAX + 1];
884 chart = pcs->share_time.st = rrdset_create_localhost(
885 cgroup_chart_type(buff, cg),
886 "cpu_some_pressure",
887 NULL,
888 "cpu",
889 context,
890 title,
891 "percentage",
892 PLUGIN_CGROUPS_NAME,
893 is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
894 prio,
895 cgroup_update_every,
896 RRDSET_TYPE_LINE);
897
898 rrdset_update_rrdlabels(chart, cg->chart_labels);
899 pcs->share_time.rd10 = rrddim_add(chart, "some 10", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
900 pcs->share_time.rd60 = rrddim_add(chart, "some 60", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
901 pcs->share_time.rd300 = rrddim_add(chart, "some 300", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
902 }
903
904 rrddim_set_by_pointer(chart, pcs->share_time.rd10, (collected_number)(pcs->share_time.value10 * 100));
905 rrddim_set_by_pointer(chart, pcs->share_time.rd60, (collected_number)(pcs->share_time.value60 * 100));
906 rrddim_set_by_pointer(chart, pcs->share_time.rd300, (collected_number)(pcs->share_time.value300 * 100));
907 rrdset_done(chart);
908 }
909
910 void update_cpu_some_pressure_stall_time_chart(struct cgroup *cg) {
911 if (is_cgroup_systemd_service(cg))
912 return;
913
914 struct pressure *res = &cg->cpu_pressure;
915 struct pressure_charts *pcs = &res->some;
916 RRDSET *chart = pcs->total_time.st;
917
918 if (unlikely(!pcs->total_time.st)) {
919 char *title = "CPU some pressure stall time";
920 char *context =
921 k8s_is_kubepod(cg) ? "k8s.cgroup.cpu_some_pressure_stall_time" : "cgroup.cpu_some_pressure_stall_time";
922 int prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS + 2220;
923
924 char buff[RRD_ID_LENGTH_MAX + 1];
925 chart = pcs->total_time.st = rrdset_create_localhost(
926 cgroup_chart_type(buff, cg),
927 "cpu_some_pressure_stall_time",
928 NULL,
929 "cpu",
930 context,
931 title,
932 "ms",
933 PLUGIN_CGROUPS_NAME,
934 is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
935 prio,
936 cgroup_update_every,
937 RRDSET_TYPE_LINE);
938 rrdset_update_rrdlabels(chart, cg->chart_labels);
939 pcs->total_time.rdtotal = rrddim_add(chart, "time", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
940 }
941
942 rrddim_set_by_pointer(chart, pcs->total_time.rdtotal, (collected_number)(pcs->total_time.value_total));
943 rrdset_done(chart);
944 }
945
946 void update_cpu_full_pressure_chart(struct cgroup *cg) {
947 if (is_cgroup_systemd_service(cg))
948 return;
949
950 struct pressure *res = &cg->cpu_pressure;
951 struct pressure_charts *pcs = &res->full;
952 RRDSET *chart = pcs->share_time.st;
953
954 if (unlikely(!pcs->share_time.st)) {
955 char *title = "CPU full pressure";
956 char *context = k8s_is_kubepod(cg) ? "k8s.cgroup.cpu_full_pressure" : "cgroup.cpu_full_pressure";
957 int prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS + 2240;
958
959 char buff[RRD_ID_LENGTH_MAX + 1];
960 chart = pcs->share_time.st = rrdset_create_localhost(
961 cgroup_chart_type(buff, cg),
962 "cpu_full_pressure",
963 NULL,
964 "cpu",
965 context,
966 title,
967 "percentage",
968 PLUGIN_CGROUPS_NAME,
969 is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
970 prio,
971 cgroup_update_every,
972 RRDSET_TYPE_LINE);
973
974 rrdset_update_rrdlabels(chart, cg->chart_labels);
975 pcs->share_time.rd10 = rrddim_add(chart, "full 10", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
976 pcs->share_time.rd60 = rrddim_add(chart, "full 60", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
977 pcs->share_time.rd300 = rrddim_add(chart, "full 300", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
978 }
979
980 rrddim_set_by_pointer(chart, pcs->share_time.rd10, (collected_number)(pcs->share_time.value10 * 100));
981 rrddim_set_by_pointer(chart, pcs->share_time.rd60, (collected_number)(pcs->share_time.value60 * 100));
982 rrddim_set_by_pointer(chart, pcs->share_time.rd300, (collected_number)(pcs->share_time.value300 * 100));
983 rrdset_done(chart);
984 }
985
986 void update_cpu_full_pressure_stall_time_chart(struct cgroup *cg) {
987 if (is_cgroup_systemd_service(cg))
988 return;
989
990 struct pressure *res = &cg->cpu_pressure;
991 struct pressure_charts *pcs = &res->full;
992 RRDSET *chart = pcs->total_time.st;
993
994 if (unlikely(!pcs->total_time.st)) {
995 char *title = "CPU full pressure stall time";
996 char *context =
997 k8s_is_kubepod(cg) ? "k8s.cgroup.cpu_full_pressure_stall_time" : "cgroup.cpu_full_pressure_stall_time";
998 int prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS + 2260;
999
1000 char buff[RRD_ID_LENGTH_MAX + 1];
1001 chart = pcs->total_time.st = rrdset_create_localhost(
1002 cgroup_chart_type(buff, cg),
1003 "cpu_full_pressure_stall_time",
1004 NULL,
1005 "cpu",
1006 context,
1007 title,
1008 "ms",
1009 PLUGIN_CGROUPS_NAME,
1010 is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
1011 prio,
1012 cgroup_update_every,
1013 RRDSET_TYPE_LINE);
1014
1015 rrdset_update_rrdlabels(chart, cg->chart_labels);
1016 pcs->total_time.rdtotal = rrddim_add(chart, "time", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
1017 }
1018
1019 rrddim_set_by_pointer(chart, pcs->total_time.rdtotal, (collected_number)(pcs->total_time.value_total));
1020 rrdset_done(chart);
1021 }
1022
1023 void update_mem_some_pressure_chart(struct cgroup *cg) {
1024 if (is_cgroup_systemd_service(cg))
1025 return;
1026
1027 struct pressure *res = &cg->memory_pressure;
1028 struct pressure_charts *pcs = &res->some;
1029 RRDSET *chart = pcs->share_time.st;
1030
1031 if (unlikely(!pcs->share_time.st)) {
1032 char *title = "Memory some pressure";
1033 char *context = k8s_is_kubepod(cg) ? "k8s.cgroup.memory_some_pressure" : "cgroup.memory_some_pressure";
1034 int prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS + 2300;
1035
1036 char buff[RRD_ID_LENGTH_MAX + 1];
1037 chart = pcs->share_time.st = rrdset_create_localhost(
1038 cgroup_chart_type(buff, cg),
1039 "mem_some_pressure",
1040 NULL,
1041 "mem",
1042 context,
1043 title,
1044 "percentage",
1045 PLUGIN_CGROUPS_NAME,
1046 is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
1047 prio,
1048 cgroup_update_every,
1049 RRDSET_TYPE_LINE);
1050
1051 rrdset_update_rrdlabels(chart, cg->chart_labels);
1052 pcs->share_time.rd10 = rrddim_add(chart, "some 10", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
1053 pcs->share_time.rd60 = rrddim_add(chart, "some 60", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
1054 pcs->share_time.rd300 = rrddim_add(chart, "some 300", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
1055 }
1056
1057 rrddim_set_by_pointer(chart, pcs->share_time.rd10, (collected_number)(pcs->share_time.value10 * 100));
1058 rrddim_set_by_pointer(chart, pcs->share_time.rd60, (collected_number)(pcs->share_time.value60 * 100));
1059 rrddim_set_by_pointer(chart, pcs->share_time.rd300, (collected_number)(pcs->share_time.value300 * 100));
1060 rrdset_done(chart);
1061 }
1062
1063 void update_mem_some_pressure_stall_time_chart(struct cgroup *cg) {
1064 if (is_cgroup_systemd_service(cg))
1065 return;
1066
1067 struct pressure *res = &cg->memory_pressure;
1068 struct pressure_charts *pcs = &res->some;
1069 RRDSET *chart = pcs->total_time.st;
1070
1071 if (unlikely(!pcs->total_time.st)) {
1072 char *title = "Memory some pressure stall time";
1073 char *context = k8s_is_kubepod(cg) ? "k8s.cgroup.memory_some_pressure_stall_time" :
1074 "cgroup.memory_some_pressure_stall_time";
1075 int prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS + 2320;
1076
1077 char buff[RRD_ID_LENGTH_MAX + 1];
1078 chart = pcs->total_time.st = rrdset_create_localhost(
1079 cgroup_chart_type(buff, cg),
1080 "memory_some_pressure_stall_time",
1081 NULL,
1082 "mem",
1083 context,
1084 title,
1085 "ms",
1086 PLUGIN_CGROUPS_NAME,
1087 is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
1088 prio,
1089 cgroup_update_every,
1090 RRDSET_TYPE_LINE);
1091
1092 rrdset_update_rrdlabels(chart, cg->chart_labels);
1093 pcs->total_time.rdtotal = rrddim_add(chart, "time", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
1094 }
1095
1096 rrddim_set_by_pointer(chart, pcs->total_time.rdtotal, (collected_number)(pcs->total_time.value_total));
1097 rrdset_done(chart);
1098 }
1099
1100 void update_mem_full_pressure_chart(struct cgroup *cg) {
1101 if (is_cgroup_systemd_service(cg))
1102 return;
1103
1104 struct pressure *res = &cg->memory_pressure;
1105 struct pressure_charts *pcs = &res->full;
1106 RRDSET *chart = pcs->share_time.st;
1107
1108 if (unlikely(!pcs->share_time.st)) {
1109 char *title = "Memory full pressure";
1110 char *context = k8s_is_kubepod(cg) ? "k8s.cgroup.memory_full_pressure" : "cgroup.memory_full_pressure";
1111 int prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS + 2340;
1112
1113 char buff[RRD_ID_LENGTH_MAX + 1];
1114 chart = pcs->share_time.st = rrdset_create_localhost(
1115 cgroup_chart_type(buff, cg),
1116 "mem_full_pressure",
1117 NULL,
1118 "mem",
1119 context,
1120 title,
1121 "percentage",
1122 PLUGIN_CGROUPS_NAME,
1123 is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
1124 prio,
1125 cgroup_update_every,
1126 RRDSET_TYPE_LINE);
1127
1128 rrdset_update_rrdlabels(chart, cg->chart_labels);
1129 pcs->share_time.rd10 = rrddim_add(chart, "full 10", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
1130 pcs->share_time.rd60 = rrddim_add(chart, "full 60", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
1131 pcs->share_time.rd300 = rrddim_add(chart, "full 300", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
1132 }
1133
1134 rrddim_set_by_pointer(chart, pcs->share_time.rd10, (collected_number)(pcs->share_time.value10 * 100));
1135 rrddim_set_by_pointer(chart, pcs->share_time.rd60, (collected_number)(pcs->share_time.value60 * 100));
1136 rrddim_set_by_pointer(chart, pcs->share_time.rd300, (collected_number)(pcs->share_time.value300 * 100));
1137 rrdset_done(chart);
1138 }
1139
1140 void update_mem_full_pressure_stall_time_chart(struct cgroup *cg) {
1141 if (is_cgroup_systemd_service(cg))
1142 return;
1143
1144 struct pressure *res = &cg->memory_pressure;
1145 struct pressure_charts *pcs = &res->full;
1146 RRDSET *chart = pcs->total_time.st;
1147
1148 if (unlikely(!pcs->total_time.st)) {
1149 char *title = "Memory full pressure stall time";
1150 char *context = k8s_is_kubepod(cg) ? "k8s.cgroup.memory_full_pressure_stall_time" :
1151 "cgroup.memory_full_pressure_stall_time";
1152 int prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS + 2360;
1153
1154 char buff[RRD_ID_LENGTH_MAX + 1];
1155 chart = pcs->total_time.st = rrdset_create_localhost(
1156 cgroup_chart_type(buff, cg),
1157 "memory_full_pressure_stall_time",
1158 NULL,
1159 "mem",
1160 context,
1161 title,
1162 "ms",
1163 PLUGIN_CGROUPS_NAME,
1164 is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
1165 prio,
1166 cgroup_update_every,
1167 RRDSET_TYPE_LINE);
1168 rrdset_update_rrdlabels(chart, cg->chart_labels);
1169 pcs->total_time.rdtotal = rrddim_add(chart, "time", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
1170 }
1171
1172 rrddim_set_by_pointer(chart, pcs->total_time.rdtotal, (collected_number)(pcs->total_time.value_total));
1173 rrdset_done(chart);
1174 }
1175
1176 void update_irq_some_pressure_chart(struct cgroup *cg) {
1177 if (is_cgroup_systemd_service(cg))
1178 return;
1179
1180 struct pressure *res = &cg->irq_pressure;
1181 struct pressure_charts *pcs = &res->some;
1182 RRDSET *chart = pcs->share_time.st;
1183
1184 if (unlikely(!pcs->share_time.st)) {
1185 char *title = "IRQ some pressure";
1186 char *context = k8s_is_kubepod(cg) ? "k8s.cgroup.irq_some_pressure" : "cgroup.irq_some_pressure";
1187 int prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS + 2310;
1188
1189 char buff[RRD_ID_LENGTH_MAX + 1];
1190 chart = pcs->share_time.st = rrdset_create_localhost(
1191 cgroup_chart_type(buff, cg),
1192 "irq_some_pressure",
1193 NULL,
1194 "interrupts",
1195 context,
1196 title,
1197 "percentage",
1198 PLUGIN_CGROUPS_NAME,
1199 is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
1200 prio,
1201 cgroup_update_every,
1202 RRDSET_TYPE_LINE);
1203
1204 rrdset_update_rrdlabels(chart, cg->chart_labels);
1205 pcs->share_time.rd10 = rrddim_add(chart, "some 10", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
1206 pcs->share_time.rd60 = rrddim_add(chart, "some 60", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
1207 pcs->share_time.rd300 = rrddim_add(chart, "some 300", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
1208 }
1209
1210 rrddim_set_by_pointer(chart, pcs->share_time.rd10, (collected_number)(pcs->share_time.value10 * 100));
1211 rrddim_set_by_pointer(chart, pcs->share_time.rd60, (collected_number)(pcs->share_time.value60 * 100));
1212 rrddim_set_by_pointer(chart, pcs->share_time.rd300, (collected_number)(pcs->share_time.value300 * 100));
1213 rrdset_done(chart);
1214 }
1215
1216 void update_irq_some_pressure_stall_time_chart(struct cgroup *cg) {
1217 if (is_cgroup_systemd_service(cg))
1218 return;
1219
1220 struct pressure *res = &cg->irq_pressure;
1221 struct pressure_charts *pcs = &res->some;
1222 RRDSET *chart = pcs->total_time.st;
1223
1224 if (unlikely(!pcs->total_time.st)) {
1225 char *title = "IRQ some pressure stall time";
1226 char *context =
1227 k8s_is_kubepod(cg) ? "k8s.cgroup.irq_some_pressure_stall_time" : "cgroup.irq_some_pressure_stall_time";
1228 int prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS + 2330;
1229
1230 char buff[RRD_ID_LENGTH_MAX + 1];
1231 chart = pcs->total_time.st = rrdset_create_localhost(
1232 cgroup_chart_type(buff, cg),
1233 "irq_some_pressure_stall_time",
1234 NULL,
1235 "interrupts",
1236 context,
1237 title,
1238 "ms",
1239 PLUGIN_CGROUPS_NAME,
1240 is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
1241 prio,
1242 cgroup_update_every,
1243 RRDSET_TYPE_LINE);
1244
1245 rrdset_update_rrdlabels(chart, cg->chart_labels);
1246 pcs->total_time.rdtotal = rrddim_add(chart, "time", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
1247 }
1248
1249 rrddim_set_by_pointer(chart, pcs->total_time.rdtotal, (collected_number)(pcs->total_time.value_total));
1250 rrdset_done(chart);
1251 }
1252
1253 void update_irq_full_pressure_chart(struct cgroup *cg) {
1254 if (is_cgroup_systemd_service(cg))
1255 return;
1256
1257 struct pressure *res = &cg->irq_pressure;
1258 struct pressure_charts *pcs = &res->full;
1259 RRDSET *chart = pcs->share_time.st;
1260
1261 if (unlikely(!pcs->share_time.st)) {
1262 char *title = "IRQ full pressure";
1263 char *context = k8s_is_kubepod(cg) ? "k8s.cgroup.irq_full_pressure" : "cgroup.irq_full_pressure";
1264 int prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS + 2350;
1265
1266 char buff[RRD_ID_LENGTH_MAX + 1];
1267 chart = pcs->share_time.st = rrdset_create_localhost(
1268 cgroup_chart_type(buff, cg),
1269 "irq_full_pressure",
1270 NULL,
1271 "interrupts",
1272 context,
1273 title,
1274 "percentage",
1275 PLUGIN_CGROUPS_NAME,
1276 is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
1277 prio,
1278 cgroup_update_every,
1279 RRDSET_TYPE_LINE);
1280
1281 rrdset_update_rrdlabels(chart, cg->chart_labels);
1282 pcs->share_time.rd10 = rrddim_add(chart, "full 10", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
1283 pcs->share_time.rd60 = rrddim_add(chart, "full 60", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
1284 pcs->share_time.rd300 = rrddim_add(chart, "full 300", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
1285 }
1286
1287 rrddim_set_by_pointer(chart, pcs->share_time.rd10, (collected_number)(pcs->share_time.value10 * 100));
1288 rrddim_set_by_pointer(chart, pcs->share_time.rd60, (collected_number)(pcs->share_time.value60 * 100));
1289 rrddim_set_by_pointer(chart, pcs->share_time.rd300, (collected_number)(pcs->share_time.value300 * 100));
1290 rrdset_done(chart);
1291 }
1292
1293 void update_irq_full_pressure_stall_time_chart(struct cgroup *cg) {
1294 if (is_cgroup_systemd_service(cg))
1295 return;
1296
1297 struct pressure *res = &cg->irq_pressure;
1298 struct pressure_charts *pcs = &res->full;
1299 RRDSET *chart = pcs->total_time.st;
1300
1301 if (unlikely(!pcs->total_time.st)) {
1302 char *title = "IRQ full pressure stall time";
1303 char *context =
1304 k8s_is_kubepod(cg) ? "k8s.cgroup.irq_full_pressure_stall_time" : "cgroup.irq_full_pressure_stall_time";
1305 int prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS + 2370;
1306
1307 char buff[RRD_ID_LENGTH_MAX + 1];
1308 chart = pcs->total_time.st = rrdset_create_localhost(
1309 cgroup_chart_type(buff, cg),
1310 "irq_full_pressure_stall_time",
1311 NULL,
1312 "interrupts",
1313 context,
1314 title,
1315 "ms",
1316 PLUGIN_CGROUPS_NAME,
1317 is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
1318 prio,
1319 cgroup_update_every,
1320 RRDSET_TYPE_LINE);
1321
1322 rrdset_update_rrdlabels(chart, cg->chart_labels);
1323 pcs->total_time.rdtotal = rrddim_add(chart, "time", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
1324 }
1325
1326 rrddim_set_by_pointer(chart, pcs->total_time.rdtotal, (collected_number)(pcs->total_time.value_total));
1327 rrdset_done(chart);
1328 }
1329
1330 void update_io_some_pressure_chart(struct cgroup *cg) {
1331 if (is_cgroup_systemd_service(cg))
1332 return;
1333
1334 struct pressure *res = &cg->io_pressure;
1335 struct pressure_charts *pcs = &res->some;
1336 RRDSET *chart = pcs->share_time.st;
1337
1338 if (unlikely(!pcs->share_time.st)) {
1339 char *title = "I/O some pressure";
1340 char *context = k8s_is_kubepod(cg) ? "k8s.cgroup.io_some_pressure" : "cgroup.io_some_pressure";
1341 int prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS + 2400;
1342
1343 char buff[RRD_ID_LENGTH_MAX + 1];
1344 chart = pcs->share_time.st = rrdset_create_localhost(
1345 cgroup_chart_type(buff, cg),
1346 "io_some_pressure",
1347 NULL,
1348 "disk",
1349 context,
1350 title,
1351 "percentage",
1352 PLUGIN_CGROUPS_NAME,
1353 is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
1354 prio,
1355 cgroup_update_every,
1356 RRDSET_TYPE_LINE);
1357
1358 rrdset_update_rrdlabels(chart, cg->chart_labels);
1359 pcs->share_time.rd10 = rrddim_add(chart, "some 10", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
1360 pcs->share_time.rd60 = rrddim_add(chart, "some 60", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
1361 pcs->share_time.rd300 = rrddim_add(chart, "some 300", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
1362 }
1363
1364 rrddim_set_by_pointer(chart, pcs->share_time.rd10, (collected_number)(pcs->share_time.value10 * 100));
1365 rrddim_set_by_pointer(chart, pcs->share_time.rd60, (collected_number)(pcs->share_time.value60 * 100));
1366 rrddim_set_by_pointer(chart, pcs->share_time.rd300, (collected_number)(pcs->share_time.value300 * 100));
1367 rrdset_done(chart);
1368 }
1369
1370 void update_io_some_pressure_stall_time_chart(struct cgroup *cg) {
1371 if (is_cgroup_systemd_service(cg))
1372 return;
1373
1374 struct pressure *res = &cg->io_pressure;
1375 struct pressure_charts *pcs = &res->some;
1376 RRDSET *chart = pcs->total_time.st;
1377
1378 if (unlikely(!pcs->total_time.st)) {
1379 char *title = "I/O some pressure stall time";
1380 char *context =
1381 k8s_is_kubepod(cg) ? "k8s.cgroup.io_some_pressure_stall_time" : "cgroup.io_some_pressure_stall_time";
1382 int prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS + 2420;
1383
1384 char buff[RRD_ID_LENGTH_MAX + 1];
1385 chart = pcs->total_time.st = rrdset_create_localhost(
1386 cgroup_chart_type(buff, cg),
1387 "io_some_pressure_stall_time",
1388 NULL,
1389 "disk",
1390 context,
1391 title,
1392 "ms",
1393 PLUGIN_CGROUPS_NAME,
1394 is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
1395 prio,
1396 cgroup_update_every,
1397 RRDSET_TYPE_LINE);
1398 rrdset_update_rrdlabels(chart, cg->chart_labels);
1399 pcs->total_time.rdtotal = rrddim_add(chart, "time", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
1400 }
1401
1402 rrddim_set_by_pointer(chart, pcs->total_time.rdtotal, (collected_number)(pcs->total_time.value_total));
1403 rrdset_done(chart);
1404 }
1405
1406 void update_io_full_pressure_chart(struct cgroup *cg) {
1407 if (is_cgroup_systemd_service(cg))
1408 return;
1409
1410 struct pressure *res = &cg->io_pressure;
1411 struct pressure_charts *pcs = &res->full;
1412 RRDSET *chart = pcs->share_time.st;
1413
1414 if (unlikely(!pcs->share_time.st)) {
1415 char *title = "I/O full pressure";
1416 char *context = k8s_is_kubepod(cg) ? "k8s.cgroup.io_full_pressure" : "cgroup.io_full_pressure";
1417 int prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS + 2440;
1418
1419 char buff[RRD_ID_LENGTH_MAX + 1];
1420 chart = pcs->share_time.st = rrdset_create_localhost(
1421 cgroup_chart_type(buff, cg),
1422 "io_full_pressure",
1423 NULL,
1424 "disk",
1425 context,
1426 title,
1427 "percentage",
1428 PLUGIN_CGROUPS_NAME,
1429 is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
1430 prio,
1431 cgroup_update_every,
1432 RRDSET_TYPE_LINE);
1433
1434 rrdset_update_rrdlabels(chart, cg->chart_labels);
1435 pcs->share_time.rd10 = rrddim_add(chart, "full 10", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
1436 pcs->share_time.rd60 = rrddim_add(chart, "full 60", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
1437 pcs->share_time.rd300 = rrddim_add(chart, "full 300", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
1438 }
1439
1440 rrddim_set_by_pointer(chart, pcs->share_time.rd10, (collected_number)(pcs->share_time.value10 * 100));
1441 rrddim_set_by_pointer(chart, pcs->share_time.rd60, (collected_number)(pcs->share_time.value60 * 100));
1442 rrddim_set_by_pointer(chart, pcs->share_time.rd300, (collected_number)(pcs->share_time.value300 * 100));
1443 rrdset_done(chart);
1444 }
1445
1446 void update_io_full_pressure_stall_time_chart(struct cgroup *cg) {
1447 if (is_cgroup_systemd_service(cg))
1448 return;
1449
1450 struct pressure *res = &cg->io_pressure;
1451 struct pressure_charts *pcs = &res->full;
1452 RRDSET *chart = pcs->total_time.st;
1453
1454 if (unlikely(!pcs->total_time.st)) {
1455 char *title = "I/O full pressure stall time";
1456 char *context =
1457 k8s_is_kubepod(cg) ? "k8s.cgroup.io_full_pressure_stall_time" : "cgroup.io_full_pressure_stall_time";
1458 int prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS + 2460;
1459
1460 char buff[RRD_ID_LENGTH_MAX + 1];
1461 chart = pcs->total_time.st = rrdset_create_localhost(
1462 cgroup_chart_type(buff, cg),
1463 "io_full_pressure_stall_time",
1464 NULL,
1465 "disk",
1466 context,
1467 title,
1468 "ms",
1469 PLUGIN_CGROUPS_NAME,
1470 is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
1471 prio,
1472 cgroup_update_every,
1473 RRDSET_TYPE_LINE);
1474
1475 rrdset_update_rrdlabels(chart, cg->chart_labels);
1476 pcs->total_time.rdtotal = rrddim_add(chart, "time", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
1477 }
1478
1479 rrddim_set_by_pointer(chart, pcs->total_time.rdtotal, (collected_number)(pcs->total_time.value_total));
1480 rrdset_done(chart);
1481 }
1482
1483 void update_pids_current_chart(struct cgroup *cg) {
1484 RRDSET *chart = cg->st_pids;
1485
1486 if (unlikely(!cg->st_pids)) {
1487 char *title;
1488 char *context;
1489 int prio;
1490 if (is_cgroup_systemd_service(cg)) {
1491 title = "Systemd Services Number of Processes";
1492 context = "systemd.service.pids.current";
1493 prio = NETDATA_CHART_PRIO_CGROUPS_SYSTEMD + 70;
1494 } else {
1495 title = "Number of processes";
1496 context = k8s_is_kubepod(cg) ? "k8s.cgroup.pids_current" : "cgroup.pids_current";
1497 prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS + 2150;
1498 }
1499
1500 char buff[RRD_ID_LENGTH_MAX + 1];
1501 chart = cg->st_pids = rrdset_create_localhost(
1502 cgroup_chart_type(buff, cg),
1503 "pids_current",
1504 NULL,
1505 "pids",
1506 context,
1507 title,
1508 "pids",
1509 PLUGIN_CGROUPS_NAME,
1510 is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
1511 prio,
1512 cgroup_update_every,
1513 RRDSET_TYPE_LINE);
1514
1515 rrdset_update_rrdlabels(chart, cg->chart_labels);
1516 cg->st_pids_rd_pids_current = rrddim_add(chart, "pids", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
1517 }
1518
1519 rrddim_set_by_pointer(chart, cg->st_pids_rd_pids_current, (collected_number)cg->pids_current.pids_current);
1520 rrdset_done(chart);
1521 }