@cryptotaxi247 / netdata-1 / commits / 3da7df1a7

cgroup plugin: simplify and remove "ignore zero metrics" (#17795)

Ilya Mashchenko committed Jun 3, 2024 at 09:35 UTC 3da7df1a72f8d09f2190f82aaecd697a713a1c4d
6 files changed +450 -773
src/collectors/cgroups.plugin/README.md
+19 -56
@@ -17,9 +17,9 @@ processes. When cgroups are bundled with namespaces (i.e. isolation), they form
17 cgroups are hierarchical, meaning that cgroups can contain child cgroups, which can contain more cgroups, etc. All
18 accounting is reported (and resource usage limits are applied) also in a hierarchical way.
19
20 -To visualize cgroup metrics Netdata provides configuration for cherry picking the cgroups of interest. By default (
21 -without any configuration) Netdata should pick **systemd services**, all kinds of **containers** (lxc, docker, etc)
22 -and **virtual machines** spawn by managers that register them with cgroups (qemu, libvirt, etc).
20 +To visualize cgroup metrics Netdata provides configuration for cherry-picking the cgroups of interest. By default,
21 +Netdata should pick **systemd services**, all kinds of **containers** (lxc, docker, etc.) and **virtual machines** spawn
22 +by managers that register them with cgroups (qemu, libvirt, etc.).
23
24 ## Configuring Netdata for cgroups
25
@@ -29,19 +29,10 @@ collects their metrics.
29 ### How Netdata finds the available cgroups
30
31 Linux exposes resource usage reporting and provides dynamic configuration for cgroups, using virtual files (usually)
32 -under `/sys/fs/cgroup`. Netdata reads `/proc/self/mountinfo` to detect the exact mount point of cgroups. Netdata also
33 -allows manual configuration of this mount point, using these settings:
32 +under `/sys/fs/cgroup`. Netdata reads `/proc/self/mountinfo` to detect the exact mount point of cgroups.
33
35 -```text
36 -[plugin:cgroups]
37 - check for new cgroups every = 10
38 - path to /sys/fs/cgroup/cpuacct = /sys/fs/cgroup/cpuacct
39 - path to /sys/fs/cgroup/blkio = /sys/fs/cgroup/blkio
40 - path to /sys/fs/cgroup/memory = /sys/fs/cgroup/memory
41 - path to /sys/fs/cgroup/devices = /sys/fs/cgroup/devices
42 -```
43 -
44 -Netdata rescans these directories for added or removed cgroups every `check for new cgroups every` seconds.
34 +Netdata rescans directories inside `/sys/fs/cgroup` for added or removed cgroups every `checking for new cgroups every`
35 +seconds.
36
37 ### Hierarchical search for cgroups
38
@@ -61,20 +52,6 @@ cgroups ([systemd services are monitored by Netdata](#monitoring-systemd-service
52 desktop and remote user sessions), qemu virtual machines (child cgroups of virtual machines) and `init.scope`. All
53 others are enabled.
54
64 -### Unified cgroups (cgroups v2) support
65 -
66 -Netdata automatically detects cgroups version. If detection fails Netdata assumes v1.
67 -To switch to v2 manually add:
68 -
69 -```text
70 -[plugin:cgroups]
71 - use unified cgroups = yes
72 - path to unified cgroups = /sys/fs/cgroup
73 -```
74 -
75 -Unified cgroups use same name pattern matching as v1 cgroups. `cgroup_enable_systemd_services_detailed_memory` is
76 -currently unsupported when using unified cgroups.
77 -
55 ### Enabled cgroups
56
57 To provide a sane default, Netdata uses the
@@ -120,36 +97,21 @@ container names. To do this, ensure `podman system service` is running and Netda
97 to `/run/podman/podman.sock` (the default permissions as specified by upstream are `0600`, with owner `root`, so you
98 will have to adjust the configuration).
99
123 -[Docker Socket Proxy (HAProxy)](https://github.com/Tecnativa/docker-socket-proxy) or [CetusGuard](https://github.com/hectorm/cetusguard)
124 -can also be used to give Netdata restricted access to the socket. Note that `PODMAN_HOST` in Netdata's environment should
125 -be set to the proxy's URL in this case.
126 -
127 -### Charts with zero metrics
128 -
129 -By default, Netdata will enable monitoring metrics only when they are not zero. If they are constantly zero they are
130 -ignored. Metrics that will start having values, after Netdata is started, will be detected and charts will be
131 -automatically added to the dashboard (a refresh of the dashboard is needed for them to appear though). Set `yes` for a
132 -chart instead of `auto` to enable it permanently. For example:
133 -
134 -```text
135 -[plugin:cgroups]
136 - enable memory (used mem including cache) = yes
137 -```
138 -
139 -You can also set the `enable zero metrics` option to `yes` in the `[global]` section which enables charts with zero
140 -metrics for all internal Netdata plugins.
100 +[Docker Socket Proxy (HAProxy)](https://github.com/Tecnativa/docker-socket-proxy)
101 +or [CetusGuard](https://github.com/hectorm/cetusguard)
102 +can also be used to give Netdata restricted access to the socket. Note that `PODMAN_HOST` in Netdata's environment
103 +should be set to the proxy's URL in this case.
104
105 ### Alerts
106
107 CPU and memory limits are watched and used to rise alerts. Memory usage for every cgroup is checked against `ram`
145 -and `ram+swap` limits. CPU usage for every cgroup is checked against `cpuset.cpus` and `cpu.cfs_period_us` + `cpu.cfs_quota_us` pair assigned for the cgroup. Configuration for the alerts is available in `health.d/cgroups.conf`
146 -file.
108 +and `ram+swap` limits. CPU usage for every cgroup is checked against `cpuset.cpus`
109 +and `cpu.cfs_period_us` + `cpu.cfs_quota_us` pair assigned for the cgroup. Configuration for the alerts is available
110 +in `health.d/cgroups.conf` file.
111
112 ## Monitoring systemd services
113
150 -Netdata monitors **systemd services**. Example:
151 -
152 -![image](https://cloud.githubusercontent.com/assets/2662304/21964372/20cd7b84-db53-11e6-98a2-b9c986b082c0.png)
114 +Netdata monitors **systemd services**.
115
116 Support per distribution:
117
@@ -233,7 +195,8 @@ sudo systemctl daemon-reexec
195 (`systemctl daemon-reload` does not reload the configuration of the server - so you have to
196 execute `systemctl daemon-reexec`).
197
236 -Now, when you run `systemd-cgtop`, services will start reporting usage (if it does not, restart any service to wake it up). Refresh your Netdata dashboard, and you will have the charts too.
198 +Now, when you run `systemd-cgtop`, services will start reporting usage (if it does not, restart any service to wake it
199 +up). Refresh your Netdata dashboard, and you will have the charts too.
200
201 In case memory accounting is missing, you will need to enable it at your kernel, by appending the following kernel boot
202 options and rebooting:
@@ -260,15 +223,15 @@ Which systemd services are monitored by Netdata is determined by the following p
223 Netdata monitors containers automatically when it is installed at the host, or when it is installed in a container that
224 has access to the `/proc` and `/sys` filesystems of the host.
225
263 -Network interfaces and cgroups (containers) are self-cleaned. When a network interface or container stops, Netdata might log
264 -a few errors in error.log complaining about files it cannot find, but immediately:
226 +Network interfaces and cgroups (containers) are self-cleaned. When a network interface or container stops, Netdata might
227 +log a few errors in error.log complaining about files it cannot find, but immediately:
228
229 1. It will detect this is a removed container or network interface
230 2. It will freeze/pause all alerts for them
231 3. It will mark their charts as obsolete
232 4. Obsolete charts are not be offered on new dashboard sessions (so hit F5 and the charts are gone)
233 5. Existing dashboard sessions will continue to see them, but of course they will not refresh
271 -6. Obsolete charts will be removed from memory, 1 hour after the last user viewed them (configurable
234 +6. Obsolete charts will be removed from memory, 1 hour after the last user viewed them (configurable)
235 with `[global].cleanup obsolete charts after seconds = 3600` (at `netdata.conf`).
236
237 ### Monitored container metrics
src/collectors/cgroups.plugin/cgroup-charts.c
+38 -38
@@ -17,7 +17,7 @@ void update_cpu_utilization_chart(struct cgroup *cg) {
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 = cgroup_containers_chart_priority;
20 + prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS;
21 }
22
23 char buff[RRD_ID_LENGTH_MAX + 1];
@@ -60,7 +60,7 @@ void update_cpu_utilization_limit_chart(struct cgroup *cg, NETDATA_DOUBLE cpu_li
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 = cgroup_containers_chart_priority - 1;
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(
@@ -109,7 +109,7 @@ void update_cpu_throttled_chart(struct cgroup *cg) {
109 if (unlikely(!cg->st_cpu_nr_throttled)) {
110 char *title = "CPU Throttled Runnable Periods";
111 char *context = k8s_is_kubepod(cg) ? "k8s.cgroup.throttled" : "cgroup.throttled";
112 - int prio = cgroup_containers_chart_priority + 10;
112 + int prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS + 10;
113
114 char buff[RRD_ID_LENGTH_MAX + 1];
115 chart = cg->st_cpu_nr_throttled = rrdset_create_localhost(
@@ -143,7 +143,7 @@ void update_cpu_throttled_duration_chart(struct cgroup *cg) {
143 if (unlikely(!cg->st_cpu_throttled_time)) {
144 char *title = "CPU Throttled Time Duration";
145 char *context = k8s_is_kubepod(cg) ? "k8s.cgroup.throttled_duration" : "cgroup.throttled_duration";
146 - int prio = cgroup_containers_chart_priority + 15;
146 + int prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS + 15;
147
148 char buff[RRD_ID_LENGTH_MAX + 1];
149 chart = cg->st_cpu_throttled_time = rrdset_create_localhost(
@@ -177,7 +177,7 @@ void update_cpu_shares_chart(struct cgroup *cg) {
177 if (unlikely(!cg->st_cpu_shares)) {
178 char *title = "CPU Time Relative Share";
179 char *context = k8s_is_kubepod(cg) ? "k8s.cgroup.cpu_shares" : "cgroup.cpu_shares";
180 - int prio = cgroup_containers_chart_priority + 20;
180 + int prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS + 20;
181
182 char buff[RRD_ID_LENGTH_MAX + 1];
183 chart = cg->st_cpu_shares = rrdset_create_localhost(
@@ -212,7 +212,7 @@ void update_cpu_per_core_usage_chart(struct cgroup *cg) {
212 if (unlikely(!cg->st_cpu_per_core)) {
213 char *title = k8s_is_kubepod(cg) ? "CPU Usage (100%% = 1000 mCPU) Per Core" : "CPU Usage (100%% = 1 core) Per Core";
214 char *context = k8s_is_kubepod(cg) ? "k8s.cgroup.cpu_per_core" : "cgroup.cpu_per_core";
215 - int prio = cgroup_containers_chart_priority + 100;
215 + int prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS + 100;
216
217 char buff[RRD_ID_LENGTH_MAX + 1];
218 cg->st_cpu_per_core = rrdset_create_localhost(
@@ -258,7 +258,7 @@ void update_mem_usage_detailed_chart(struct cgroup *cg) {
258 } else {
259 title = "Memory Usage";
260 context = k8s_is_kubepod(cg) ? "k8s.cgroup.mem" : "cgroup.mem";
261 - prio = cgroup_containers_chart_priority + 220;
261 + prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS + 220;
262 }
263
264 char buff[RRD_ID_LENGTH_MAX + 1];
@@ -333,7 +333,7 @@ void update_mem_writeback_chart(struct cgroup *cg) {
333 } else {
334 title = "Writeback Memory";
335 context = k8s_is_kubepod(cg) ? "k8s.cgroup.writeback" : "cgroup.writeback";
336 - prio = cgroup_containers_chart_priority + 300;
336 + prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS + 300;
337 }
338
339 char buff[RRD_ID_LENGTH_MAX + 1];
@@ -377,7 +377,7 @@ void update_mem_activity_chart(struct cgroup *cg) {
377 } else {
378 title = "Memory Activity";
379 context = k8s_is_kubepod(cg) ? "k8s.cgroup.mem_activity" : "cgroup.mem_activity";
380 - prio = cgroup_containers_chart_priority + 400;
380 + prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS + 400;
381 }
382
383 char buff[RRD_ID_LENGTH_MAX + 1];
@@ -420,7 +420,7 @@ void update_mem_pgfaults_chart(struct cgroup *cg) {
420 } else {
421 title = "Memory Page Faults";
422 context = k8s_is_kubepod(cg) ? "k8s.cgroup.pgfaults" : "cgroup.pgfaults";
423 - prio = cgroup_containers_chart_priority + 500;
423 + prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS + 500;
424 }
425
426 char buff[RRD_ID_LENGTH_MAX + 1];
@@ -457,7 +457,7 @@ void update_mem_usage_limit_chart(struct cgroup *cg, unsigned long long memory_l
457 if (unlikely(!cg->st_mem_usage_limit)) {
458 char *title = "Used RAM within the limits";
459 char *context = k8s_is_kubepod(cg) ? "k8s.cgroup.mem_usage_limit" : "cgroup.mem_usage_limit";
460 - int prio = cgroup_containers_chart_priority + 200;
460 + int prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS + 200;
461
462 char buff[RRD_ID_LENGTH_MAX + 1];
463 chart = cg->st_mem_usage_limit = rrdset_create_localhost(
@@ -496,7 +496,7 @@ void update_mem_utilization_chart(struct cgroup *cg, unsigned long long memory_l
496 if (unlikely(!cg->st_mem_utilization)) {
497 char *title = "Memory Utilization";
498 char *context = k8s_is_kubepod(cg) ? "k8s.cgroup.mem_utilization" : "cgroup.mem_utilization";
499 - int prio = cgroup_containers_chart_priority + 199;
499 + int prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS + 199;
500
501 char buff[RRD_ID_LENGTH_MAX + 1];
502 chart = cg->st_mem_utilization = rrdset_create_localhost(
@@ -538,7 +538,7 @@ void update_mem_failcnt_chart(struct cgroup *cg) {
538 } else {
539 title = "Memory Limit Failures";
540 context = k8s_is_kubepod(cg) ? "k8s.cgroup.mem_failcnt" : "cgroup.mem_failcnt";
541 - prio = cgroup_containers_chart_priority + 250;
541 + prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS + 250;
542 }
543
544 char buff[RRD_ID_LENGTH_MAX + 1];
@@ -578,7 +578,7 @@ void update_mem_usage_chart(struct cgroup *cg) {
578 } else {
579 title = "Used Memory";
580 context = k8s_is_kubepod(cg) ? "k8s.cgroup.mem_usage" : "cgroup.mem_usage";
581 - prio = cgroup_containers_chart_priority + 210;
581 + prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS + 210;
582 }
583
584 char buff[RRD_ID_LENGTH_MAX + 1];
@@ -633,7 +633,7 @@ void update_io_serviced_bytes_chart(struct cgroup *cg) {
633 } else {
634 title = "I/O Bandwidth (all disks)";
635 context = k8s_is_kubepod(cg) ? "k8s.cgroup.io" : "cgroup.io";
636 - prio = cgroup_containers_chart_priority + 1200;
636 + prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS + 1200;
637 }
638
639 char buff[RRD_ID_LENGTH_MAX + 1];
@@ -675,7 +675,7 @@ void update_io_serviced_ops_chart(struct cgroup *cg) {
675 } else {
676 title = "Serviced I/O Operations (all disks)";
677 context = k8s_is_kubepod(cg) ? "k8s.cgroup.serviced_ops" : "cgroup.serviced_ops";
678 - prio = cgroup_containers_chart_priority + 1200;
678 + prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS + 1200;
679 }
680
681 char buff[RRD_ID_LENGTH_MAX + 1];
@@ -717,7 +717,7 @@ void update_throttle_io_serviced_bytes_chart(struct cgroup *cg) {
717 } else {
718 title = "Throttle I/O Bandwidth (all disks)";
719 context = k8s_is_kubepod(cg) ? "k8s.cgroup.throttle_io" : "cgroup.throttle_io";
720 - prio = cgroup_containers_chart_priority + 1200;
720 + prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS + 1200;
721 }
722
723 char buff[RRD_ID_LENGTH_MAX + 1];
@@ -760,7 +760,7 @@ void update_throttle_io_serviced_ops_chart(struct cgroup *cg) {
760 } else {
761 title = "Throttle Serviced I/O Operations (all disks)";
762 context = k8s_is_kubepod(cg) ? "k8s.cgroup.throttle_serviced_ops" : "cgroup.throttle_serviced_ops";
763 - prio = cgroup_containers_chart_priority + 1200;
763 + prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS + 1200;
764 }
765
766 char buff[RRD_ID_LENGTH_MAX + 1];
@@ -802,7 +802,7 @@ void update_io_queued_ops_chart(struct cgroup *cg) {
802 } else {
803 title = "Queued I/O Operations (all disks)";
804 context = k8s_is_kubepod(cg) ? "k8s.cgroup.queued_ops" : "cgroup.queued_ops";
805 - prio = cgroup_containers_chart_priority + 2000;
805 + prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS + 2000;
806 }
807
808 char buff[RRD_ID_LENGTH_MAX + 1];
@@ -844,7 +844,7 @@ void update_io_merged_ops_chart(struct cgroup *cg) {
844 } else {
845 title = "Merged I/O Operations (all disks)";
846 context = k8s_is_kubepod(cg) ? "k8s.cgroup.merged_ops" : "cgroup.merged_ops";
847 - prio = cgroup_containers_chart_priority + 2100;
847 + prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS + 2100;
848 }
849
850 char buff[RRD_ID_LENGTH_MAX + 1];
@@ -883,7 +883,7 @@ void update_cpu_some_pressure_chart(struct cgroup *cg) {
883 if (unlikely(!pcs->share_time.st)) {
884 char *title = "CPU some pressure";
885 char *context = k8s_is_kubepod(cg) ? "k8s.cgroup.cpu_some_pressure" : "cgroup.cpu_some_pressure";
886 - int prio = cgroup_containers_chart_priority + 2200;
886 + int prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS + 2200;
887
888 char buff[RRD_ID_LENGTH_MAX + 1];
889 chart = pcs->share_time.st = rrdset_create_localhost(
@@ -924,7 +924,7 @@ void update_cpu_some_pressure_stall_time_chart(struct cgroup *cg) {
924 char *title = "CPU some pressure stall time";
925 char *context =
926 k8s_is_kubepod(cg) ? "k8s.cgroup.cpu_some_pressure_stall_time" : "cgroup.cpu_some_pressure_stall_time";
927 - int prio = cgroup_containers_chart_priority + 2220;
927 + int prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS + 2220;
928
929 char buff[RRD_ID_LENGTH_MAX + 1];
930 chart = pcs->total_time.st = rrdset_create_localhost(
@@ -959,7 +959,7 @@ void update_cpu_full_pressure_chart(struct cgroup *cg) {
959 if (unlikely(!pcs->share_time.st)) {
960 char *title = "CPU full pressure";
961 char *context = k8s_is_kubepod(cg) ? "k8s.cgroup.cpu_full_pressure" : "cgroup.cpu_full_pressure";
962 - int prio = cgroup_containers_chart_priority + 2240;
962 + int prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS + 2240;
963
964 char buff[RRD_ID_LENGTH_MAX + 1];
965 chart = pcs->share_time.st = rrdset_create_localhost(
@@ -1000,7 +1000,7 @@ void update_cpu_full_pressure_stall_time_chart(struct cgroup *cg) {
1000 char *title = "CPU full pressure stall time";
1001 char *context =
1002 k8s_is_kubepod(cg) ? "k8s.cgroup.cpu_full_pressure_stall_time" : "cgroup.cpu_full_pressure_stall_time";
1003 - int prio = cgroup_containers_chart_priority + 2260;
1003 + int prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS + 2260;
1004
1005 char buff[RRD_ID_LENGTH_MAX + 1];
1006 chart = pcs->total_time.st = rrdset_create_localhost(
@@ -1036,7 +1036,7 @@ void update_mem_some_pressure_chart(struct cgroup *cg) {
1036 if (unlikely(!pcs->share_time.st)) {
1037 char *title = "Memory some pressure";
1038 char *context = k8s_is_kubepod(cg) ? "k8s.cgroup.memory_some_pressure" : "cgroup.memory_some_pressure";
1039 - int prio = cgroup_containers_chart_priority + 2300;
1039 + int prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS + 2300;
1040
1041 char buff[RRD_ID_LENGTH_MAX + 1];
1042 chart = pcs->share_time.st = rrdset_create_localhost(
@@ -1077,7 +1077,7 @@ void update_mem_some_pressure_stall_time_chart(struct cgroup *cg) {
1077 char *title = "Memory some pressure stall time";
1078 char *context = k8s_is_kubepod(cg) ? "k8s.cgroup.memory_some_pressure_stall_time" :
1079 "cgroup.memory_some_pressure_stall_time";
1080 - int prio = cgroup_containers_chart_priority + 2320;
1080 + int prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS + 2320;
1081
1082 char buff[RRD_ID_LENGTH_MAX + 1];
1083 chart = pcs->total_time.st = rrdset_create_localhost(
@@ -1113,7 +1113,7 @@ void update_mem_full_pressure_chart(struct cgroup *cg) {
1113 if (unlikely(!pcs->share_time.st)) {
1114 char *title = "Memory full pressure";
1115 char *context = k8s_is_kubepod(cg) ? "k8s.cgroup.memory_full_pressure" : "cgroup.memory_full_pressure";
1116 - int prio = cgroup_containers_chart_priority + 2340;
1116 + int prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS + 2340;
1117
1118 char buff[RRD_ID_LENGTH_MAX + 1];
1119 chart = pcs->share_time.st = rrdset_create_localhost(
@@ -1154,7 +1154,7 @@ void update_mem_full_pressure_stall_time_chart(struct cgroup *cg) {
1154 char *title = "Memory full pressure stall time";
1155 char *context = k8s_is_kubepod(cg) ? "k8s.cgroup.memory_full_pressure_stall_time" :
1156 "cgroup.memory_full_pressure_stall_time";
1157 - int prio = cgroup_containers_chart_priority + 2360;
1157 + int prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS + 2360;
1158
1159 char buff[RRD_ID_LENGTH_MAX + 1];
1160 chart = pcs->total_time.st = rrdset_create_localhost(
@@ -1189,7 +1189,7 @@ void update_irq_some_pressure_chart(struct cgroup *cg) {
1189 if (unlikely(!pcs->share_time.st)) {
1190 char *title = "IRQ some pressure";
1191 char *context = k8s_is_kubepod(cg) ? "k8s.cgroup.irq_some_pressure" : "cgroup.irq_some_pressure";
1192 - int prio = cgroup_containers_chart_priority + 2310;
1192 + int prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS + 2310;
1193
1194 char buff[RRD_ID_LENGTH_MAX + 1];
1195 chart = pcs->share_time.st = rrdset_create_localhost(
@@ -1230,7 +1230,7 @@ void update_irq_some_pressure_stall_time_chart(struct cgroup *cg) {
1230 char *title = "IRQ some pressure stall time";
1231 char *context =
1232 k8s_is_kubepod(cg) ? "k8s.cgroup.irq_some_pressure_stall_time" : "cgroup.irq_some_pressure_stall_time";
1233 - int prio = cgroup_containers_chart_priority + 2330;
1233 + int prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS + 2330;
1234
1235 char buff[RRD_ID_LENGTH_MAX + 1];
1236 chart = pcs->total_time.st = rrdset_create_localhost(
@@ -1266,7 +1266,7 @@ void update_irq_full_pressure_chart(struct cgroup *cg) {
1266 if (unlikely(!pcs->share_time.st)) {
1267 char *title = "IRQ full pressure";
1268 char *context = k8s_is_kubepod(cg) ? "k8s.cgroup.irq_full_pressure" : "cgroup.irq_full_pressure";
1269 - int prio = cgroup_containers_chart_priority + 2350;
1269 + int prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS + 2350;
1270
1271 char buff[RRD_ID_LENGTH_MAX + 1];
1272 chart = pcs->share_time.st = rrdset_create_localhost(
@@ -1307,7 +1307,7 @@ void update_irq_full_pressure_stall_time_chart(struct cgroup *cg) {
1307 char *title = "IRQ full pressure stall time";
1308 char *context =
1309 k8s_is_kubepod(cg) ? "k8s.cgroup.irq_full_pressure_stall_time" : "cgroup.irq_full_pressure_stall_time";
1310 - int prio = cgroup_containers_chart_priority + 2370;
1310 + int prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS + 2370;
1311
1312 char buff[RRD_ID_LENGTH_MAX + 1];
1313 chart = pcs->total_time.st = rrdset_create_localhost(
@@ -1343,7 +1343,7 @@ void update_io_some_pressure_chart(struct cgroup *cg) {
1343 if (unlikely(!pcs->share_time.st)) {
1344 char *title = "I/O some pressure";
1345 char *context = k8s_is_kubepod(cg) ? "k8s.cgroup.io_some_pressure" : "cgroup.io_some_pressure";
1346 - int prio = cgroup_containers_chart_priority + 2400;
1346 + int prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS + 2400;
1347
1348 char buff[RRD_ID_LENGTH_MAX + 1];
1349 chart = pcs->share_time.st = rrdset_create_localhost(
@@ -1384,7 +1384,7 @@ void update_io_some_pressure_stall_time_chart(struct cgroup *cg) {
1384 char *title = "I/O some pressure stall time";
1385 char *context =
1386 k8s_is_kubepod(cg) ? "k8s.cgroup.io_some_pressure_stall_time" : "cgroup.io_some_pressure_stall_time";
1387 - int prio = cgroup_containers_chart_priority + 2420;
1387 + int prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS + 2420;
1388
1389 char buff[RRD_ID_LENGTH_MAX + 1];
1390 chart = pcs->total_time.st = rrdset_create_localhost(
@@ -1419,7 +1419,7 @@ void update_io_full_pressure_chart(struct cgroup *cg) {
1419 if (unlikely(!pcs->share_time.st)) {
1420 char *title = "I/O full pressure";
1421 char *context = k8s_is_kubepod(cg) ? "k8s.cgroup.io_full_pressure" : "cgroup.io_full_pressure";
1422 - int prio = cgroup_containers_chart_priority + 2440;
1422 + int prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS + 2440;
1423
1424 char buff[RRD_ID_LENGTH_MAX + 1];
1425 chart = pcs->share_time.st = rrdset_create_localhost(
@@ -1460,7 +1460,7 @@ void update_io_full_pressure_stall_time_chart(struct cgroup *cg) {
1460 char *title = "I/O full pressure stall time";
1461 char *context =
1462 k8s_is_kubepod(cg) ? "k8s.cgroup.io_full_pressure_stall_time" : "cgroup.io_full_pressure_stall_time";
1463 - int prio = cgroup_containers_chart_priority + 2460;
1463 + int prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS + 2460;
1464
1465 char buff[RRD_ID_LENGTH_MAX + 1];
1466 chart = pcs->total_time.st = rrdset_create_localhost(
@@ -1499,7 +1499,7 @@ void update_pids_current_chart(struct cgroup *cg) {
1499 } else {
1500 title = "Number of processes";
1501 context = k8s_is_kubepod(cg) ? "k8s.cgroup.pids_current" : "cgroup.pids_current";
1502 - prio = cgroup_containers_chart_priority + 2150;
1502 + prio = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS + 2150;
1503 }
1504
1505 char buff[RRD_ID_LENGTH_MAX + 1];
@@ -1521,6 +1521,6 @@ void update_pids_current_chart(struct cgroup *cg) {
1521 cg->st_pids_rd_pids_current = rrddim_add(chart, "pids", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
1522 }
1523
1524 - rrddim_set_by_pointer(chart, cg->st_pids_rd_pids_current, (collected_number)cg->pids.pids_current);
1524 + rrddim_set_by_pointer(chart, cg->st_pids_rd_pids_current, (collected_number)cg->pids_current.pids_current);
1525 rrdset_done(chart);
1526 }
src/collectors/cgroups.plugin/cgroup-discovery.c
+208 -238
@@ -110,7 +110,7 @@ static inline void cgroup_free(struct cgroup *cg) {
110
111 freez(cg->io_merged.filename);
112 freez(cg->io_queued.filename);
113 - freez(cg->pids.pids_current_filename);
113 + freez(cg->pids_current.filename);
114
115 free_pressure(&cg->cpu_pressure);
116 free_pressure(&cg->io_pressure);
@@ -249,11 +249,6 @@ static void is_cgroup_procs_exist(netdata_ebpf_cgroup_shm_body_t *out, char *id)
249 return;
250 }
251
252 - snprintfz(out->path, FILENAME_MAX, "%s%s/cgroup.procs", cgroup_devices_base, id);
253 - if (likely(stat(out->path, &buf) == 0)) {
254 - return;
255 - }
256 -
252 out->path[0] = '\0';
253 out->enabled = 0;
254 }
@@ -351,13 +346,11 @@ static int calc_cgroup_depth(const char *id) {
346 return depth;
347 }
348
354 -static inline void discovery_find_cgroup_in_dir_callback(const char *dir) {
349 +static inline void discovery_find_cgroup_in_dir(const char *dir) {
350 if (!dir || !*dir) {
351 dir = "/";
352 }
353
359 - netdata_log_debug(D_CGROUP, "examining cgroup dir '%s'", dir);
360 -
354 struct cgroup *cg = discovery_cgroup_find(dir);
355 if (cg) {
356 cg->available = 1;
@@ -385,40 +378,41 @@ static inline void discovery_find_cgroup_in_dir_callback(const char *dir) {
378 cgroup_root_count++;
379 }
380
388 -static inline int discovery_find_dir_in_subdirs(const char *base, const char *this, void (*callback)(const char *)) {
389 - if(!this) this = base;
390 - netdata_log_debug(D_CGROUP, "searching for directories in '%s' (base '%s')", this?this:"", base);
381 +static inline int discovery_find_walkdir(const char *base, const char *dirpath) {
382 + if (!dirpath)
383 + dirpath = base;
384 +
385 + netdata_log_debug(D_CGROUP, "searching for directories in '%s' (base '%s')", dirpath ? dirpath : "", base);
386
392 - size_t dirlen = strlen(this), baselen = strlen(base);
387 + size_t dirlen = strlen(dirpath), baselen = strlen(base);
388
389 int ret = -1;
390 int enabled = -1;
391
397 - const char *relative_path = &this[baselen];
398 - if(!*relative_path) relative_path = "/";
392 + const char *relative_path = &dirpath[baselen];
393 + if (!*relative_path)
394 + relative_path = "/";
395
400 - DIR *dir = opendir(this);
396 + DIR *dir = opendir(dirpath);
397 if(!dir) {
402 - collector_error("CGROUP: cannot read directory '%s'", base);
398 + collector_error("CGROUP: cannot open directory '%s'", base);
399 return ret;
400 }
401 ret = 1;
402
407 - callback(relative_path);
403 + discovery_find_cgroup_in_dir(relative_path);
404
405 struct dirent *de = NULL;
406 while((de = readdir(dir))) {
411 - if(de->d_type == DT_DIR
412 - && (
413 - (de->d_name[0] == '.' && de->d_name[1] == '\0')
414 - || (de->d_name[0] == '.' && de->d_name[1] == '.' && de->d_name[2] == '\0')
415 - ))
407 + if (de->d_type == DT_DIR && ((de->d_name[0] == '.' && de->d_name[1] == '\0') ||
408 + (de->d_name[0] == '.' && de->d_name[1] == '.' && de->d_name[2] == '\0')))
409 continue;
410
411 if(de->d_type == DT_DIR) {
412 if(enabled == -1) {
413 const char *r = relative_path;
421 - if(*r == '\0') r = "/";
414 + if (*r == '\0')
415 + r = "/";
416
417 // do not decent in directories we are not interested
418 enabled = matches_search_cgroup_paths(r);
@@ -426,11 +420,12 @@ static inline int discovery_find_dir_in_subdirs(const char *base, const char *th
420
421 if(enabled) {
422 char *s = mallocz(dirlen + strlen(de->d_name) + 2);
429 - strcpy(s, this);
423 + strcpy(s, dirpath);
424 strcat(s, "/");
425 strcat(s, de->d_name);
432 - int ret2 = discovery_find_dir_in_subdirs(base, s, callback);
433 - if(ret2 > 0) ret += ret2;
426 + int ret2 = discovery_find_walkdir(base, s);
427 + if (ret2 > 0)
428 + ret += ret2;
429 freez(s);
430 }
431 }
@@ -451,290 +446,277 @@ static inline void discovery_update_filenames_cgroup_v1(struct cgroup *cg) {
446 struct stat buf;
447
448 // CPU
454 - if (unlikely(cgroup_enable_cpuacct_stat && !cg->cpuacct_stat.filename)) {
455 - snprintfz(filename, FILENAME_MAX, "%s%s/cpuacct.stat", cgroup_cpuacct_base, cg->id);
456 - if (likely(stat(filename, &buf) != -1)) {
457 - cg->cpuacct_stat.filename = strdupz(filename);
458 - cg->cpuacct_stat.enabled = cgroup_enable_cpuacct_stat;
459 - snprintfz(filename, FILENAME_MAX, "%s%s/cpuset.cpus", cgroup_cpuset_base, cg->id);
460 - cg->filename_cpuset_cpus = strdupz(filename);
461 - snprintfz(filename, FILENAME_MAX, "%s%s/cpu.cfs_period_us", cgroup_cpuacct_base, cg->id);
462 - cg->filename_cpu_cfs_period = strdupz(filename);
463 - snprintfz(filename, FILENAME_MAX, "%s%s/cpu.cfs_quota_us", cgroup_cpuacct_base, cg->id);
464 - cg->filename_cpu_cfs_quota = strdupz(filename);
465 - }
466 - }
467 - // FIXME: remove usage_percpu
468 - if (unlikely(cgroup_enable_cpuacct_usage && !cg->cpuacct_usage.filename && !is_cgroup_systemd_service(cg))) {
469 - snprintfz(filename, FILENAME_MAX, "%s%s/cpuacct.usage_percpu", cgroup_cpuacct_base, cg->id);
470 - if (likely(stat(filename, &buf) != -1)) {
471 - cg->cpuacct_usage.filename = strdupz(filename);
472 - cg->cpuacct_usage.enabled = cgroup_enable_cpuacct_usage;
473 - }
474 - }
475 - if (unlikely(
476 - cgroup_enable_cpuacct_cpu_throttling && !cg->cpuacct_cpu_throttling.filename &&
477 - !is_cgroup_systemd_service(cg))) {
478 - snprintfz(filename, FILENAME_MAX, "%s%s/cpu.stat", cgroup_cpuacct_base, cg->id);
479 - if (likely(stat(filename, &buf) != -1)) {
480 - cg->cpuacct_cpu_throttling.filename = strdupz(filename);
481 - cg->cpuacct_cpu_throttling.enabled = cgroup_enable_cpuacct_cpu_throttling;
449 + if (likely(cgroup_enable_cpuacct)) {
450 + if (unlikely(!cg->cpuacct_stat.staterr && !cg->cpuacct_stat.filename)) {
451 + snprintfz(filename, FILENAME_MAX, "%s%s/cpuacct.stat", cgroup_cpuacct_base, cg->id);
452 + if (!(cg->cpuacct_stat.staterr = stat(filename, &buf) != 0)) {
453 + cg->cpuacct_stat.filename = strdupz(filename);
454 +
455 + snprintfz(filename, FILENAME_MAX, "%s%s/cpuset.cpus", cgroup_cpuset_base, cg->id);
456 + cg->filename_cpuset_cpus = strdupz(filename);
457 +
458 + snprintfz(filename, FILENAME_MAX, "%s%s/cpu.cfs_period_us", cgroup_cpuacct_base, cg->id);
459 + cg->filename_cpu_cfs_period = strdupz(filename);
460 +
461 + snprintfz(filename, FILENAME_MAX, "%s%s/cpu.cfs_quota_us", cgroup_cpuacct_base, cg->id);
462 + cg->filename_cpu_cfs_quota = strdupz(filename);
463 + }
464 }
483 - }
484 - if (unlikely(
485 - cgroup_enable_cpuacct_cpu_shares && !cg->cpuacct_cpu_shares.filename && !is_cgroup_systemd_service(cg))) {
486 - snprintfz(filename, FILENAME_MAX, "%s%s/cpu.shares", cgroup_cpuacct_base, cg->id);
487 - if (likely(stat(filename, &buf) != -1)) {
488 - cg->cpuacct_cpu_shares.filename = strdupz(filename);
489 - cg->cpuacct_cpu_shares.enabled = cgroup_enable_cpuacct_cpu_shares;
465 + if (!is_cgroup_systemd_service(cg)) {
466 + if (unlikely(!cg->cpuacct_cpu_throttling.staterr && !cg->cpuacct_cpu_throttling.filename)) {
467 + snprintfz(filename, FILENAME_MAX, "%s%s/cpu.stat", cgroup_cpuacct_base, cg->id);
468 + if (!(cg->cpuacct_cpu_throttling.staterr = stat(filename, &buf) != 0)) {
469 + cg->cpuacct_cpu_throttling.filename = strdupz(filename);
470 + }
471 + }
472 +
473 + if (cgroup_enable_cpuacct_cpu_shares) {
474 + if (unlikely(!cg->cpuacct_cpu_shares.staterr && !cg->cpuacct_cpu_shares.filename)) {
475 + snprintfz(filename, FILENAME_MAX, "%s%s/cpu.shares", cgroup_cpuacct_base, cg->id);
476 +
477 + if (!(cg->cpuacct_cpu_shares.staterr = stat(filename, &buf) != 0)) {
478 + cg->cpuacct_cpu_shares.filename = strdupz(filename);
479 + }
480 + }
481 + }
482 }
483 }
484
485 // Memory
494 - if (unlikely(
495 - (cgroup_enable_detailed_memory || cgroup_used_memory) && !cg->memory.filename_detailed &&
496 - (cgroup_used_memory || cgroup_enable_systemd_services_detailed_memory || !is_cgroup_systemd_service(cg)))) {
497 - snprintfz(filename, FILENAME_MAX, "%s%s/memory.stat", cgroup_memory_base, cg->id);
498 - if (likely(stat(filename, &buf) != -1)) {
499 - cg->memory.filename_detailed = strdupz(filename);
500 - cg->memory.enabled_detailed =
501 - (cgroup_enable_detailed_memory == CONFIG_BOOLEAN_YES) ? CONFIG_BOOLEAN_YES : CONFIG_BOOLEAN_AUTO;
486 + if (likely(cgroup_enable_memory)) {
487 + if (unlikely(!cg->memory.staterr_mem_current && !cg->memory.filename_usage_in_bytes)) {
488 + snprintfz(filename, FILENAME_MAX, "%s%s/memory.usage_in_bytes", cgroup_memory_base, cg->id);
489 + if (!(cg->memory.staterr_mem_current = stat(filename, &buf) != 0)) {
490 + cg->memory.filename_usage_in_bytes = strdupz(filename);
491 +
492 + snprintfz(filename, FILENAME_MAX, "%s%s/memory.limit_in_bytes", cgroup_memory_base, cg->id);
493 + cg->filename_memory_limit = strdupz(filename);
494 + }
495 }
503 - }
504 - if (unlikely(cgroup_enable_memory && !cg->memory.filename_usage_in_bytes)) {
505 - snprintfz(filename, FILENAME_MAX, "%s%s/memory.usage_in_bytes", cgroup_memory_base, cg->id);
506 - if (likely(stat(filename, &buf) != -1)) {
507 - cg->memory.filename_usage_in_bytes = strdupz(filename);
508 - cg->memory.enabled_usage_in_bytes = cgroup_enable_memory;
509 - snprintfz(filename, FILENAME_MAX, "%s%s/memory.limit_in_bytes", cgroup_memory_base, cg->id);
510 - cg->filename_memory_limit = strdupz(filename);
496 +
497 + if (unlikely(!cg->memory.staterr_mem_stat && !cg->memory.filename_detailed)) {
498 + snprintfz(filename, FILENAME_MAX, "%s%s/memory.stat", cgroup_memory_base, cg->id);
499 + if (!(cg->memory.staterr_mem_stat = stat(filename, &buf) != 0)) {
500 + cg->memory.filename_detailed = strdupz(filename);
501 + }
502 }
512 - }
513 - if (unlikely(cgroup_enable_swap && !cg->memory.filename_msw_usage_in_bytes)) {
514 - snprintfz(filename, FILENAME_MAX, "%s%s/memory.memsw.usage_in_bytes", cgroup_memory_base, cg->id);
515 - if (likely(stat(filename, &buf) != -1)) {
516 - cg->memory.filename_msw_usage_in_bytes = strdupz(filename);
517 - cg->memory.enabled_msw_usage_in_bytes = cgroup_enable_swap;
518 - snprintfz(filename, FILENAME_MAX, "%s%s/memory.memsw.limit_in_bytes", cgroup_memory_base, cg->id);
519 - cg->filename_memoryswap_limit = strdupz(filename);
503 +
504 + if (unlikely(!cg->memory.staterr_swap && !cg->memory.filename_msw_usage_in_bytes)) {
505 + snprintfz(filename, FILENAME_MAX, "%s%s/memory.memsw.usage_in_bytes", cgroup_memory_base, cg->id);
506 + if (!(cg->memory.staterr_swap = stat(filename, &buf) != 0)) {
507 + cg->memory.filename_msw_usage_in_bytes = strdupz(filename);
508 +
509 + snprintfz(filename, FILENAME_MAX, "%s%s/memory.memsw.limit_in_bytes", cgroup_memory_base, cg->id);
510 + cg->filename_memoryswap_limit = strdupz(filename);
511 + }
512 }
521 - }
522 - if (unlikely(cgroup_enable_memory_failcnt && !cg->memory.filename_failcnt)) {
523 - snprintfz(filename, FILENAME_MAX, "%s%s/memory.failcnt", cgroup_memory_base, cg->id);
524 - if (likely(stat(filename, &buf) != -1)) {
525 - cg->memory.filename_failcnt = strdupz(filename);
526 - cg->memory.enabled_failcnt = cgroup_enable_memory_failcnt;
513 +
514 + if (unlikely(!cg->memory.staterr_failcnt && !cg->memory.filename_failcnt)) {
515 + snprintfz(filename, FILENAME_MAX, "%s%s/memory.failcnt", cgroup_memory_base, cg->id);
516 + if (!(cg->memory.staterr_failcnt = stat(filename, &buf) != 0)) {
517 + cg->memory.filename_failcnt = strdupz(filename);
518 + }
519 }
520 }
521
522 // Blkio
531 - if (unlikely(cgroup_enable_blkio_io && !cg->io_service_bytes.filename)) {
532 - snprintfz(filename, FILENAME_MAX, "%s%s/blkio.io_service_bytes_recursive", cgroup_blkio_base, cg->id);
533 - if (unlikely(stat(filename, &buf) != -1)) {
534 - cg->io_service_bytes.filename = strdupz(filename);
535 - cg->io_service_bytes.enabled = cgroup_enable_blkio_io;
536 - } else {
537 - snprintfz(filename, FILENAME_MAX, "%s%s/blkio.io_service_bytes", cgroup_blkio_base, cg->id);
538 - if (likely(stat(filename, &buf) != -1)) {
523 + if (likely(cgroup_enable_blkio)) {
524 + if (unlikely(!cg->io_service_bytes.staterr && !cg->io_service_bytes.filename)) {
525 + snprintfz(filename, FILENAME_MAX, "%s%s/blkio.io_service_bytes_recursive", cgroup_blkio_base, cg->id);
526 + if (!(cg->io_service_bytes.staterr = stat(filename, &buf) != 0)) {
527 cg->io_service_bytes.filename = strdupz(filename);
540 - cg->io_service_bytes.enabled = cgroup_enable_blkio_io;
528 + } else {
529 + snprintfz(filename, FILENAME_MAX, "%s%s/blkio.io_service_bytes", cgroup_blkio_base, cg->id);
530 + if (!(cg->io_service_bytes.staterr = stat(filename, &buf) != 0)) {
531 + cg->io_service_bytes.filename = strdupz(filename);
532 + }
533 }
534 }
543 - }
544 - if (unlikely(cgroup_enable_blkio_ops && !cg->io_serviced.filename)) {
545 - snprintfz(filename, FILENAME_MAX, "%s%s/blkio.io_serviced_recursive", cgroup_blkio_base, cg->id);
546 - if (unlikely(stat(filename, &buf) != -1)) {
547 - cg->io_serviced.filename = strdupz(filename);
548 - cg->io_serviced.enabled = cgroup_enable_blkio_ops;
549 - } else {
550 - snprintfz(filename, FILENAME_MAX, "%s%s/blkio.io_serviced", cgroup_blkio_base, cg->id);
551 - if (likely(stat(filename, &buf) != -1)) {
535 +
536 + if (unlikely(!cg->io_serviced.staterr && !cg->io_serviced.filename)) {
537 + snprintfz(filename, FILENAME_MAX, "%s%s/blkio.io_serviced_recursive", cgroup_blkio_base, cg->id);
538 + if (!(cg->io_serviced.staterr = stat(filename, &buf) != 0)) {
539 cg->io_serviced.filename = strdupz(filename);
553 - cg->io_serviced.enabled = cgroup_enable_blkio_ops;
540 + } else {
541 + snprintfz(filename, FILENAME_MAX, "%s%s/blkio.io_serviced", cgroup_blkio_base, cg->id);
542 + if (!(cg->io_serviced.staterr = stat(filename, &buf) != 0)) {
543 + cg->io_serviced.filename = strdupz(filename);
544 + }
545 }
546 }
556 - }
557 - if (unlikely(cgroup_enable_blkio_throttle_io && !cg->throttle_io_service_bytes.filename)) {
558 - snprintfz(filename, FILENAME_MAX, "%s%s/blkio.throttle.io_service_bytes_recursive", cgroup_blkio_base, cg->id);
559 - if (unlikely(stat(filename, &buf) != -1)) {
560 - cg->throttle_io_service_bytes.filename = strdupz(filename);
561 - cg->throttle_io_service_bytes.enabled = cgroup_enable_blkio_throttle_io;
562 - } else {
563 - snprintfz(filename, FILENAME_MAX, "%s%s/blkio.throttle.io_service_bytes", cgroup_blkio_base, cg->id);
564 - if (likely(stat(filename, &buf) != -1)) {
547 +
548 + if (unlikely(!cg->throttle_io_service_bytes.staterr && !cg->throttle_io_service_bytes.filename)) {
549 + snprintfz(
550 + filename, FILENAME_MAX, "%s%s/blkio.throttle.io_service_bytes_recursive", cgroup_blkio_base, cg->id);
551 + if (!(cg->throttle_io_service_bytes.staterr = stat(filename, &buf) != 0)) {
552 cg->throttle_io_service_bytes.filename = strdupz(filename);
566 - cg->throttle_io_service_bytes.enabled = cgroup_enable_blkio_throttle_io;
553 + } else {
554 + snprintfz(filename, FILENAME_MAX, "%s%s/blkio.throttle.io_service_bytes", cgroup_blkio_base, cg->id);
555 + if (!(cg->throttle_io_service_bytes.staterr = stat(filename, &buf) != 0)) {
556 + cg->throttle_io_service_bytes.filename = strdupz(filename);
557 + }
558 }
559 }
569 - }
570 - if (unlikely(cgroup_enable_blkio_throttle_ops && !cg->throttle_io_serviced.filename)) {
571 - snprintfz(filename, FILENAME_MAX, "%s%s/blkio.throttle.io_serviced_recursive", cgroup_blkio_base, cg->id);
572 - if (unlikely(stat(filename, &buf) != -1)) {
573 - cg->throttle_io_serviced.filename = strdupz(filename);
574 - cg->throttle_io_serviced.enabled = cgroup_enable_blkio_throttle_ops;
575 - } else {
576 - snprintfz(filename, FILENAME_MAX, "%s%s/blkio.throttle.io_serviced", cgroup_blkio_base, cg->id);
577 - if (likely(stat(filename, &buf) != -1)) {
560 +
561 + if (unlikely(!cg->throttle_io_serviced.staterr && !cg->throttle_io_serviced.filename)) {
562 + snprintfz(filename, FILENAME_MAX, "%s%s/blkio.throttle.io_serviced_recursive", cgroup_blkio_base, cg->id);
563 + if(!(cg->throttle_io_serviced.staterr = stat(filename, &buf) != 0)) {
564 cg->throttle_io_serviced.filename = strdupz(filename);
579 - cg->throttle_io_serviced.enabled = cgroup_enable_blkio_throttle_ops;
565 + } else {
566 + snprintfz(filename, FILENAME_MAX, "%s%s/blkio.throttle.io_serviced", cgroup_blkio_base, cg->id);
567 + if (!(cg->throttle_io_serviced.staterr = stat(filename, &buf) != 0)) {
568 + cg->throttle_io_serviced.filename = strdupz(filename);
569 + }
570 }
571 }
582 - }
583 - if (unlikely(cgroup_enable_blkio_merged_ops && !cg->io_merged.filename)) {
584 - snprintfz(filename, FILENAME_MAX, "%s%s/blkio.io_merged_recursive", cgroup_blkio_base, cg->id);
585 - if (unlikely(stat(filename, &buf) != -1)) {
586 - cg->io_merged.filename = strdupz(filename);
587 - cg->io_merged.enabled = cgroup_enable_blkio_merged_ops;
588 - } else {
589 - snprintfz(filename, FILENAME_MAX, "%s%s/blkio.io_merged", cgroup_blkio_base, cg->id);
590 - if (likely(stat(filename, &buf) != -1)) {
572 +
573 + if (unlikely(!cg->io_merged.staterr && !cg->io_merged.filename)) {
574 + snprintfz(filename, FILENAME_MAX, "%s%s/blkio.io_merged_recursive", cgroup_blkio_base, cg->id);
575 + if (!(cg->io_merged.staterr = stat(filename, &buf) != 0)) {
576 cg->io_merged.filename = strdupz(filename);
592 - cg->io_merged.enabled = cgroup_enable_blkio_merged_ops;
577 + } else {
578 + snprintfz(filename, FILENAME_MAX, "%s%s/blkio.io_merged", cgroup_blkio_base, cg->id);
579 + if (!(cg->io_merged.staterr = stat(filename, &buf) != 0)) {
580 + cg->io_merged.filename = strdupz(filename);
581 + }
582 }
583 }
595 - }
596 - if (unlikely(cgroup_enable_blkio_queued_ops && !cg->io_queued.filename)) {
597 - snprintfz(filename, FILENAME_MAX, "%s%s/blkio.io_queued_recursive", cgroup_blkio_base, cg->id);
598 - if (unlikely(stat(filename, &buf) != -1)) {
599 - cg->io_queued.filename = strdupz(filename);
600 - cg->io_queued.enabled = cgroup_enable_blkio_queued_ops;
601 - } else {
602 - snprintfz(filename, FILENAME_MAX, "%s%s/blkio.io_queued", cgroup_blkio_base, cg->id);
603 - if (likely(stat(filename, &buf) != -1)) {
584 +
585 + if (unlikely(!cg->io_queued.staterr && !cg->io_queued.filename)) {
586 + snprintfz(filename, FILENAME_MAX, "%s%s/blkio.io_queued_recursive", cgroup_blkio_base, cg->id);
587 + if (!(cg->io_queued.staterr = stat(filename, &buf) != 0)) {
588 cg->io_queued.filename = strdupz(filename);
605 - cg->io_queued.enabled = cgroup_enable_blkio_queued_ops;
589 + } else {
590 + snprintfz(filename, FILENAME_MAX, "%s%s/blkio.io_queued", cgroup_blkio_base, cg->id);
591 + if (!(cg->io_queued.staterr = stat(filename, &buf) != 0)) {
592 + cg->io_queued.filename = strdupz(filename);
593 + }
594 }
595 }
596 }
597
598 // Pids
611 - if (unlikely(!cg->pids.pids_current_filename)) {
599 + if (unlikely(!cg->pids_current.staterr && !cg->pids_current.filename)) {
600 snprintfz(filename, FILENAME_MAX, "%s%s/pids.current", cgroup_pids_base, cg->id);
613 - if (likely(stat(filename, &buf) != -1)) {
614 - cg->pids.pids_current_filename = strdupz(filename);
601 + if (!(cg->pids_current.staterr = stat(filename, &buf) != 0)) {
602 + cg->pids_current.filename = strdupz(filename);
603 }
604 }
605 }
606
607 static inline void discovery_update_filenames_cgroup_v2(struct cgroup *cg) {
608 + if (!cgroup_unified_exist)
609 + return;
610 +
611 char filename[FILENAME_MAX + 1];
612 struct stat buf;
613
614 // CPU
624 - if (unlikely((cgroup_enable_cpuacct_stat || cgroup_enable_cpuacct_cpu_throttling) && !cg->cpuacct_stat.filename)) {
615 + if (unlikely((!cg->cpuacct_stat.staterr && !cg->cpuacct_stat.filename))) {
616 snprintfz(filename, FILENAME_MAX, "%s%s/cpu.stat", cgroup_unified_base, cg->id);
626 - if (likely(stat(filename, &buf) != -1)) {
617 + if (!(cg->cpuacct_stat.staterr = stat(filename, &buf) != 0)) {
618 cg->cpuacct_stat.filename = strdupz(filename);
628 - cg->cpuacct_stat.enabled = cgroup_enable_cpuacct_stat;
629 - cg->cpuacct_cpu_throttling.enabled = cgroup_enable_cpuacct_cpu_throttling;
619 cg->filename_cpuset_cpus = NULL;
620 cg->filename_cpu_cfs_period = NULL;
621 +
622 snprintfz(filename, FILENAME_MAX, "%s%s/cpu.max", cgroup_unified_base, cg->id);
623 cg->filename_cpu_cfs_quota = strdupz(filename);
624 }
625 }
636 - if (unlikely(cgroup_enable_cpuacct_cpu_shares && !cg->cpuacct_cpu_shares.filename)) {
637 - snprintfz(filename, FILENAME_MAX, "%s%s/cpu.weight", cgroup_unified_base, cg->id);
638 - if (likely(stat(filename, &buf) != -1)) {
639 - cg->cpuacct_cpu_shares.filename = strdupz(filename);
640 - cg->cpuacct_cpu_shares.enabled = cgroup_enable_cpuacct_cpu_shares;
641 - }
642 - }
643 -
644 - // Memory
645 - // FIXME: this if condition!
646 - if (unlikely(
647 - (cgroup_enable_detailed_memory || cgroup_used_memory) && !cg->memory.filename_detailed &&
648 - (cgroup_used_memory || cgroup_enable_systemd_services_detailed_memory || !is_cgroup_systemd_service(cg)))) {
649 - snprintfz(filename, FILENAME_MAX, "%s%s/memory.stat", cgroup_unified_base, cg->id);
650 - if (likely(stat(filename, &buf) != -1)) {
651 - cg->memory.filename_detailed = strdupz(filename);
652 - cg->memory.enabled_detailed =
653 - (cgroup_enable_detailed_memory == CONFIG_BOOLEAN_YES) ? CONFIG_BOOLEAN_YES : CONFIG_BOOLEAN_AUTO;
626 + if (cgroup_enable_cpuacct_cpu_shares) {
627 + if (unlikely(!cg->cpuacct_cpu_shares.staterr && !cg->cpuacct_cpu_shares.filename)) {
628 + snprintfz(filename, FILENAME_MAX, "%s%s/cpu.weight", cgroup_unified_base, cg->id);
629 + if (!(cg->cpuacct_cpu_shares.staterr = stat(filename, &buf) != 0)) {
630 + cg->cpuacct_cpu_shares.filename = strdupz(filename);
631 + }
632 }
633 }
634
657 - if (unlikely(cgroup_enable_memory && !cg->memory.filename_usage_in_bytes)) {
635 + // Memory
636 + if (unlikely(!cg->memory.staterr_mem_current && !cg->memory.filename_usage_in_bytes)) {
637 snprintfz(filename, FILENAME_MAX, "%s%s/memory.current", cgroup_unified_base, cg->id);
659 - if (likely(stat(filename, &buf) != -1)) {
638 + if (!(cg->memory.staterr_mem_current = stat(filename, &buf) != 0)) {
639 cg->memory.filename_usage_in_bytes = strdupz(filename);
661 - cg->memory.enabled_usage_in_bytes = cgroup_enable_memory;
640 +
641 snprintfz(filename, FILENAME_MAX, "%s%s/memory.max", cgroup_unified_base, cg->id);
642 cg->filename_memory_limit = strdupz(filename);
643 }
644 }
645
667 - if (unlikely(cgroup_enable_swap && !cg->memory.filename_msw_usage_in_bytes)) {
646 + if (unlikely(!cg->memory.staterr_mem_stat && !cg->memory.filename_detailed)) {
647 + snprintfz(filename, FILENAME_MAX, "%s%s/memory.stat", cgroup_unified_base, cg->id);
648 + if (!(cg->memory.staterr_mem_stat = stat(filename, &buf) != 0)) {
649 + cg->memory.filename_detailed = strdupz(filename);
650 + }
651 + }
652 +
653 + if (unlikely(!cg->memory.staterr_swap && !cg->memory.filename_msw_usage_in_bytes)) {
654 snprintfz(filename, FILENAME_MAX, "%s%s/memory.swap.current", cgroup_unified_base, cg->id);
669 - if (likely(stat(filename, &buf) != -1)) {
655 + if (!(cg->memory.staterr_swap = stat(filename, &buf) != 0)) {
656 cg->memory.filename_msw_usage_in_bytes = strdupz(filename);
671 - cg->memory.enabled_msw_usage_in_bytes = cgroup_enable_swap;
657 +
658 snprintfz(filename, FILENAME_MAX, "%s%s/memory.swap.max", cgroup_unified_base, cg->id);
659 cg->filename_memoryswap_limit = strdupz(filename);
660 }
661 }
662
663 // Blkio
678 - if (unlikely(cgroup_enable_blkio_io && !cg->io_service_bytes.filename)) {
664 + if (unlikely(!cg->io_service_bytes.staterr && !cg->io_service_bytes.filename)) {
665 snprintfz(filename, FILENAME_MAX, "%s%s/io.stat", cgroup_unified_base, cg->id);
680 - if (likely(stat(filename, &buf) != -1)) {
666 + if (!(cg->io_service_bytes.staterr = stat(filename, &buf) != 0)) {
667 cg->io_service_bytes.filename = strdupz(filename);
682 - cg->io_service_bytes.enabled = cgroup_enable_blkio_io;
668 }
669 }
670
686 - if (unlikely(cgroup_enable_blkio_ops && !cg->io_serviced.filename)) {
671 + if (unlikely(!cg->io_serviced.staterr && !cg->io_serviced.filename)) {
672 snprintfz(filename, FILENAME_MAX, "%s%s/io.stat", cgroup_unified_base, cg->id);
688 - if (likely(stat(filename, &buf) != -1)) {
673 + if (!(cg->io_serviced.staterr = stat(filename, &buf) != 0)) {
674 cg->io_serviced.filename = strdupz(filename);
690 - cg->io_serviced.enabled = cgroup_enable_blkio_ops;
675 }
676 }
677
678 // PSI
695 - if (unlikely(cgroup_enable_pressure_cpu && !cg->cpu_pressure.filename)) {
679 + if (unlikely(!cg->cpu_pressure.staterr && !cg->cpu_pressure.filename)) {
680 snprintfz(filename, FILENAME_MAX, "%s%s/cpu.pressure", cgroup_unified_base, cg->id);
697 - if (likely(stat(filename, &buf) != -1)) {
681 + if (!(cg->cpu_pressure.staterr = stat(filename, &buf) != 0)) {
682 cg->cpu_pressure.filename = strdupz(filename);
699 - cg->cpu_pressure.some.enabled = cgroup_enable_pressure_cpu;
700 - cg->cpu_pressure.full.enabled = CONFIG_BOOLEAN_NO;
683 + cg->cpu_pressure.some.enabled = CONFIG_BOOLEAN_YES;
684 + cg->cpu_pressure.full.enabled = CONFIG_BOOLEAN_YES;
685 }
686 }
687
704 - if (unlikely((cgroup_enable_pressure_io_some || cgroup_enable_pressure_io_full) && !cg->io_pressure.filename)) {
688 + if (unlikely(!cg->io_pressure.staterr && !cg->io_pressure.filename)) {
689 snprintfz(filename, FILENAME_MAX, "%s%s/io.pressure", cgroup_unified_base, cg->id);
706 - if (likely(stat(filename, &buf) != -1)) {
690 + if (!(cg->io_pressure.staterr = stat(filename, &buf) != 0)) {
691 cg->io_pressure.filename = strdupz(filename);
708 - cg->io_pressure.some.enabled = cgroup_enable_pressure_io_some;
709 - cg->io_pressure.full.enabled = cgroup_enable_pressure_io_full;
692 + cg->io_pressure.some.enabled = CONFIG_BOOLEAN_YES;
693 + cg->io_pressure.full.enabled = CONFIG_BOOLEAN_YES;
694 }
695 }
696
713 - if (unlikely(
714 - (cgroup_enable_pressure_memory_some || cgroup_enable_pressure_memory_full) &&
715 - !cg->memory_pressure.filename)) {
697 + if (unlikely(!cg->memory_pressure.staterr && !cg->memory_pressure.filename)) {
698 snprintfz(filename, FILENAME_MAX, "%s%s/memory.pressure", cgroup_unified_base, cg->id);
717 - if (likely(stat(filename, &buf) != -1)) {
699 + if (!(cg->memory_pressure.staterr = stat(filename, &buf) != 0)) {
700 cg->memory_pressure.filename = strdupz(filename);
719 - cg->memory_pressure.some.enabled = cgroup_enable_pressure_memory_some;
720 - cg->memory_pressure.full.enabled = cgroup_enable_pressure_memory_full;
701 + cg->memory_pressure.some.enabled = CONFIG_BOOLEAN_YES;
702 + cg->memory_pressure.full.enabled = CONFIG_BOOLEAN_YES;
703 }
704 }
705
724 - if (unlikely((cgroup_enable_pressure_irq_some || cgroup_enable_pressure_irq_full) && !cg->irq_pressure.filename)) {
706 + if (unlikely(!cg->irq_pressure.staterr && !cg->irq_pressure.filename)) {
707 snprintfz(filename, FILENAME_MAX, "%s%s/irq.pressure", cgroup_unified_base, cg->id);
726 - if (likely(stat(filename, &buf) != -1)) {
708 + if (!(cg->irq_pressure.staterr = stat(filename, &buf) != 0)) {
709 cg->irq_pressure.filename = strdupz(filename);
728 - cg->irq_pressure.some.enabled = cgroup_enable_pressure_irq_some;
729 - cg->irq_pressure.full.enabled = cgroup_enable_pressure_irq_full;
710 + cg->irq_pressure.some.enabled = CONFIG_BOOLEAN_YES;
711 + cg->irq_pressure.full.enabled = CONFIG_BOOLEAN_YES;
712 }
713 }
714
715 // Pids
734 - if (unlikely(!cg->pids.pids_current_filename)) {
716 + if (unlikely(!cg->pids_current.staterr && !cg->pids_current.filename)) {
717 snprintfz(filename, FILENAME_MAX, "%s%s/pids.current", cgroup_unified_base, cg->id);
736 - if (likely(stat(filename, &buf) != -1)) {
737 - cg->pids.pids_current_filename = strdupz(filename);
718 + if (!(cg->pids_current.staterr = stat(filename, &buf) != 0)) {
719 + cg->pids_current.filename = strdupz(filename);
720 }
721 }
722 }
@@ -746,7 +728,7 @@ static inline void discovery_update_filenames_all_cgroups() {
728
729 if (!cgroup_use_unified_cgroups)
730 discovery_update_filenames_cgroup_v1(cg);
749 - else if (likely(cgroup_unified_exist))
731 + else
732 discovery_update_filenames_cgroup_v2(cg);
733 }
734 }
@@ -837,43 +819,34 @@ static inline void discovery_share_cgroups_with_ebpf() {
819 }
820
821 static inline void discovery_find_all_cgroups_v1() {
840 - if (cgroup_enable_cpuacct_stat || cgroup_enable_cpuacct_usage) {
841 - if (discovery_find_dir_in_subdirs(cgroup_cpuacct_base, NULL, discovery_find_cgroup_in_dir_callback) == -1) {
842 - cgroup_enable_cpuacct_stat = cgroup_enable_cpuacct_usage = CONFIG_BOOLEAN_NO;
822 + if (cgroup_enable_cpuacct) {
823 + if (discovery_find_walkdir(cgroup_cpuacct_base, NULL) == -1) {
824 + cgroup_enable_cpuacct = false;
825 collector_error("CGROUP: disabled cpu statistics.");
826 }
827 }
828
847 - if (cgroup_enable_blkio_io || cgroup_enable_blkio_ops || cgroup_enable_blkio_throttle_io ||
848 - cgroup_enable_blkio_throttle_ops || cgroup_enable_blkio_merged_ops || cgroup_enable_blkio_queued_ops) {
849 - if (discovery_find_dir_in_subdirs(cgroup_blkio_base, NULL, discovery_find_cgroup_in_dir_callback) == -1) {
850 - cgroup_enable_blkio_io = cgroup_enable_blkio_ops = cgroup_enable_blkio_throttle_io =
851 - cgroup_enable_blkio_throttle_ops = cgroup_enable_blkio_merged_ops = cgroup_enable_blkio_queued_ops =
852 - CONFIG_BOOLEAN_NO;
829 + if (cgroup_enable_blkio) {
830 + if (discovery_find_walkdir(cgroup_blkio_base, NULL) == -1) {
831 + cgroup_enable_blkio = false;
832 collector_error("CGROUP: disabled blkio statistics.");
833 }
834 }
835
857 - if (cgroup_enable_memory || cgroup_enable_detailed_memory || cgroup_enable_swap || cgroup_enable_memory_failcnt) {
858 - if (discovery_find_dir_in_subdirs(cgroup_memory_base, NULL, discovery_find_cgroup_in_dir_callback) == -1) {
859 - cgroup_enable_memory = cgroup_enable_detailed_memory = cgroup_enable_swap = cgroup_enable_memory_failcnt =
860 - CONFIG_BOOLEAN_NO;
836 + if (cgroup_enable_memory) {
837 + if (discovery_find_walkdir(cgroup_memory_base, NULL) == -1) {
838 + cgroup_enable_memory = false;
839 collector_error("CGROUP: disabled memory statistics.");
840 }
841 }
864 -
865 - if (cgroup_search_in_devices) {
866 - if (discovery_find_dir_in_subdirs(cgroup_devices_base, NULL, discovery_find_cgroup_in_dir_callback) == -1) {
867 - cgroup_search_in_devices = 0;
868 - collector_error("CGROUP: disabled devices statistics.");
869 - }
870 - }
842 }
843
844 static inline void discovery_find_all_cgroups_v2() {
874 - if (discovery_find_dir_in_subdirs(cgroup_unified_base, NULL, discovery_find_cgroup_in_dir_callback) == -1) {
875 - cgroup_unified_exist = CONFIG_BOOLEAN_NO;
876 - collector_error("CGROUP: disabled unified cgroups statistics.");
845 + if (cgroup_unified_exist) {
846 + if (discovery_find_walkdir(cgroup_unified_base, NULL) == -1) {
847 + cgroup_unified_exist = false;
848 + collector_error("CGROUP: disabled unified cgroups statistics.");
849 + }
850 }
851 }
852
@@ -995,7 +968,7 @@ static inline void discovery_process_first_time_seen_cgroup(struct cgroup *cg) {
968 }
969 }
970
998 - if (cgroup_enable_systemd_services && matches_systemd_services_cgroups(cg->id)) {
971 + if (matches_systemd_services_cgroups(cg->id)) {
972 netdata_log_debug(D_CGROUP, "cgroup '%s' (name '%s') matches 'cgroups to match as systemd services'", cg->id, cg->chart_id);
973 convert_cgroup_to_systemd_service(cg);
974 return;
@@ -1038,9 +1011,7 @@ static void netdata_cgroup_ebpf_set_values(size_t length)
1011 sem_wait(shm_mutex_cgroup_ebpf);
1012
1013 shm_cgroup_ebpf.header->cgroup_max = cgroup_root_max;
1041 - shm_cgroup_ebpf.header->systemd_enabled = cgroup_enable_systemd_services |
1042 - cgroup_enable_systemd_services_detailed_memory |
1043 - cgroup_used_memory;
1014 + shm_cgroup_ebpf.header->systemd_enabled = CONFIG_BOOLEAN_YES;
1015 shm_cgroup_ebpf.header->body_length = length;
1016
1017 sem_post(shm_mutex_cgroup_ebpf);
@@ -1175,7 +1146,6 @@ static inline void read_cgroup_network_interfaces(struct cgroup *cg) {
1146 }
1147
1148 netdata_pclose(fp_child_input, fp_child_output, cgroup_pid);
1178 - // netdata_log_debug(D_CGROUP, "closed cgroup_identifier for cgroup '%s'", cg->id);
1149 }
1150
1151 static inline void discovery_process_cgroup(struct cgroup *cg) {
src/collectors/cgroups.plugin/cgroup-internals.h
+49 -105
@@ -10,24 +10,21 @@
10 #endif
11
12 struct blkio {
13 - int updated;
14 - int enabled; // CONFIG_BOOLEAN_YES or CONFIG_BOOLEAN_AUTO
15 - int delay_counter;
16 -
13 char *filename;
14 + bool staterr;
15 +
16 + int updated;
17
18 unsigned long long Read;
19 unsigned long long Write;
21 -/*
22 - unsigned long long Sync;
23 - unsigned long long Async;
24 - unsigned long long Total;
25 -*/
20 };
21
22 struct pids {
29 - char *pids_current_filename;
30 - int pids_current_updated;
23 + char *filename;
24 + bool staterr;
25 +
26 + int updated;
27 +
28 unsigned long long pids_current;
29 };
30
@@ -37,57 +34,29 @@ struct memory {
34 ARL_ENTRY *arl_dirty;
35 ARL_ENTRY *arl_swap;
36
40 - int updated_detailed;
41 - int updated_usage_in_bytes;
42 - int updated_msw_usage_in_bytes;
43 - int updated_failcnt;
44 -
45 - int enabled_detailed; // CONFIG_BOOLEAN_YES or CONFIG_BOOLEAN_AUTO
46 - int enabled_usage_in_bytes; // CONFIG_BOOLEAN_YES or CONFIG_BOOLEAN_AUTO
47 - int enabled_msw_usage_in_bytes; // CONFIG_BOOLEAN_YES or CONFIG_BOOLEAN_AUTO
48 - int enabled_failcnt; // CONFIG_BOOLEAN_YES or CONFIG_BOOLEAN_AUTO
49 -
50 - int delay_counter_detailed;
51 - int delay_counter_failcnt;
52 -
53 - char *filename_detailed;
37 char *filename_usage_in_bytes;
38 + char *filename_detailed;
39 char *filename_msw_usage_in_bytes;
40 char *filename_failcnt;
41
42 + bool staterr_mem_current;
43 + bool staterr_mem_stat;
44 + bool staterr_failcnt;
45 + bool staterr_swap;
46 +
47 + int updated_usage_in_bytes;
48 + int updated_detailed;
49 + int updated_msw_usage_in_bytes;
50 + int updated_failcnt;
51 +
52 int detailed_has_dirty;
53 int detailed_has_swap;
54
61 - // detailed metrics
62 -/*
63 - unsigned long long cache;
64 - unsigned long long rss;
65 - unsigned long long rss_huge;
66 - unsigned long long mapped_file;
67 - unsigned long long writeback;
68 - unsigned long long dirty;
69 - unsigned long long swap;
70 - unsigned long long pgpgin;
71 - unsigned long long pgpgout;
72 - unsigned long long pgfault;
73 - unsigned long long pgmajfault;
74 - unsigned long long inactive_anon;
75 - unsigned long long active_anon;
76 - unsigned long long inactive_file;
77 - unsigned long long active_file;
78 - unsigned long long unevictable;
79 - unsigned long long hierarchical_memory_limit;
80 -*/
81 - //unified cgroups metrics
55 unsigned long long anon;
56 unsigned long long kernel_stack;
57 unsigned long long slab;
58 unsigned long long sock;
86 - // unsigned long long shmem;
59 unsigned long long anon_thp;
88 - //unsigned long long file_writeback;
89 - //unsigned long long file_dirty;
90 - //unsigned long long file;
60
61 unsigned long long total_cache;
62 unsigned long long total_rss;
@@ -100,18 +69,9 @@ struct memory {
69 unsigned long long total_pgpgout;
70 unsigned long long total_pgfault;
71 unsigned long long total_pgmajfault;
103 -/*
104 - unsigned long long total_inactive_anon;
105 - unsigned long long total_active_anon;
106 -*/
72
73 unsigned long long total_inactive_file;
74
110 -/*
111 - unsigned long long total_active_file;
112 - unsigned long long total_unevictable;
113 -*/
114 -
75 // single file metrics
76 unsigned long long usage_in_bytes;
77 unsigned long long msw_usage_in_bytes;
@@ -120,10 +80,10 @@ struct memory {
80
81 // https://www.kernel.org/doc/Documentation/cgroup-v1/cpuacct.txt
82 struct cpuacct_stat {
123 - int updated;
124 - int enabled; // CONFIG_BOOLEAN_YES or CONFIG_BOOLEAN_AUTO
125 -
83 char *filename;
84 + bool staterr;
85 +
86 + int updated;
87
88 unsigned long long user; // v1, v2(user_usec)
89 unsigned long long system; // v1, v2(system_usec)
@@ -131,10 +91,9 @@ struct cpuacct_stat {
91
92 // https://www.kernel.org/doc/Documentation/cgroup-v1/cpuacct.txt
93 struct cpuacct_usage {
134 - int updated;
135 - int enabled; // CONFIG_BOOLEAN_YES or CONFIG_BOOLEAN_AUTO
136 -
94 char *filename;
95 + bool disabled;
96 + int updated;
97
98 unsigned int cpus;
99 unsigned long long *cpu_percpu;
@@ -142,10 +101,10 @@ struct cpuacct_usage {
101
102 // represents cpuacct/cpu.stat, for v2 'cpuacct_stat' is used for 'user_usec', 'system_usec'
103 struct cpuacct_cpu_throttling {
145 - int updated;
146 - int enabled; // CONFIG_BOOLEAN_YES or CONFIG_BOOLEAN_AUTO
147 -
104 char *filename;
105 + bool staterr;
106 +
107 + int updated;
108
109 unsigned long long nr_periods;
110 unsigned long long nr_throttled;
@@ -157,10 +116,10 @@ struct cpuacct_cpu_throttling {
116 // https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/resource_management_guide/sec-cpu#sect-cfs
117 // https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/managing_monitoring_and_updating_the_kernel/using-cgroups-v2-to-control-distribution-of-cpu-time-for-applications_managing-monitoring-and-updating-the-kernel#proc_controlling-distribution-of-cpu-time-for-applications-by-adjusting-cpu-weight_using-cgroups-v2-to-control-distribution-of-cpu-time-for-applications
118 struct cpuacct_cpu_shares {
160 - int updated;
161 - int enabled; // CONFIG_BOOLEAN_YES or CONFIG_BOOLEAN_AUTO
162 -
119 char *filename;
120 + bool staterr;
121 +
122 + int updated;
123
124 unsigned long long shares;
125 };
@@ -224,7 +183,7 @@ struct cgroup {
183 struct blkio io_merged; // operations
184 struct blkio io_queued; // operations
185
227 - struct pids pids;
186 + struct pids pids_current;
187
188 struct cgroup_network_interface *interfaces;
189
@@ -321,59 +280,43 @@ extern uv_mutex_t cgroup_root_mutex;
280
281 void cgroup_discovery_worker(void *ptr);
282
324 -extern int is_inside_k8s;
283 +extern bool is_inside_k8s;
284 extern long system_page_size;
326 -extern int cgroup_enable_cpuacct_stat;
327 -extern int cgroup_enable_cpuacct_usage;
328 -extern int cgroup_enable_cpuacct_cpu_throttling;
329 -extern int cgroup_enable_cpuacct_cpu_shares;
330 -extern int cgroup_enable_memory;
331 -extern int cgroup_enable_detailed_memory;
332 -extern int cgroup_enable_memory_failcnt;
333 -extern int cgroup_enable_swap;
334 -extern int cgroup_enable_blkio_io;
335 -extern int cgroup_enable_blkio_ops;
336 -extern int cgroup_enable_blkio_throttle_io;
337 -extern int cgroup_enable_blkio_throttle_ops;
338 -extern int cgroup_enable_blkio_merged_ops;
339 -extern int cgroup_enable_blkio_queued_ops;
340 -extern int cgroup_enable_pressure_cpu;
341 -extern int cgroup_enable_pressure_io_some;
342 -extern int cgroup_enable_pressure_io_full;
343 -extern int cgroup_enable_pressure_memory_some;
344 -extern int cgroup_enable_pressure_memory_full;
345 -extern int cgroup_enable_pressure_irq_some;
346 -extern int cgroup_enable_pressure_irq_full;
347 -extern int cgroup_enable_systemd_services;
348 -extern int cgroup_enable_systemd_services_detailed_memory;
349 -extern int cgroup_used_memory;
350 -extern int cgroup_use_unified_cgroups;
351 -extern int cgroup_unified_exist;
352 -extern int cgroup_search_in_devices;
285 +
286 +extern bool cgroup_use_unified_cgroups;
287 +extern bool cgroup_unified_exist;
288 +
289 +extern bool cgroup_enable_cpuacct;
290 +extern bool cgroup_enable_memory;
291 +extern bool cgroup_enable_blkio;
292 +extern bool cgroup_enable_pressure;
293 +extern bool cgroup_enable_cpuacct_cpu_shares;
294 +
295 extern int cgroup_check_for_new_every;
296 extern int cgroup_update_every;
355 -extern int cgroup_containers_chart_priority;
356 -extern int cgroup_recheck_zero_blkio_every_iterations;
357 -extern int cgroup_recheck_zero_mem_failcnt_every_iterations;
358 -extern int cgroup_recheck_zero_mem_detailed_every_iterations;
297 +
298 extern char *cgroup_cpuacct_base;
299 extern char *cgroup_cpuset_base;
300 extern char *cgroup_blkio_base;
301 extern char *cgroup_memory_base;
302 extern char *cgroup_pids_base;
364 -extern char *cgroup_devices_base;
303 extern char *cgroup_unified_base;
304 +
305 extern int cgroup_root_count;
306 extern int cgroup_root_max;
307 extern int cgroup_max_depth;
308 +
309 extern SIMPLE_PATTERN *enabled_cgroup_paths;
310 extern SIMPLE_PATTERN *enabled_cgroup_names;
311 extern SIMPLE_PATTERN *search_cgroup_paths;
312 extern SIMPLE_PATTERN *enabled_cgroup_renames;
313 extern SIMPLE_PATTERN *systemd_services_cgroups;
314 extern SIMPLE_PATTERN *entrypoint_parent_process_comm;
315 +
316 extern char *cgroups_network_interface_script;
317 +
318 extern int cgroups_check;
319 +
320 extern uint32_t Read_hash;
321 extern uint32_t Write_hash;
322 extern uint32_t user_hash;
@@ -384,6 +327,7 @@ extern uint32_t nr_periods_hash;
327 extern uint32_t nr_throttled_hash;
328 extern uint32_t throttled_time_hash;
329 extern uint32_t throttled_usec_hash;
330 +
331 extern struct cgroup *cgroup_root;
332
333 enum cgroups_type { CGROUPS_AUTODETECT_FAIL, CGROUPS_V1, CGROUPS_V2 };
src/collectors/cgroups.plugin/sys_fs_cgroup.c
+134 -335
@@ -10,46 +10,24 @@
10 // ----------------------------------------------------------------------------
11 // cgroup globals
12 unsigned long long host_ram_total = 0;
13 -int is_inside_k8s = 0;
13 +bool is_inside_k8s = false;
14 long system_page_size = 4096; // system will be queried via sysconf() in configuration()
15 -int cgroup_enable_cpuacct_stat = CONFIG_BOOLEAN_AUTO;
16 -int cgroup_enable_cpuacct_usage = CONFIG_BOOLEAN_NO;
17 -int cgroup_enable_cpuacct_cpu_throttling = CONFIG_BOOLEAN_YES;
18 -int cgroup_enable_cpuacct_cpu_shares = CONFIG_BOOLEAN_NO;
19 -int cgroup_enable_memory = CONFIG_BOOLEAN_AUTO;
20 -int cgroup_enable_detailed_memory = CONFIG_BOOLEAN_AUTO;
21 -int cgroup_enable_memory_failcnt = CONFIG_BOOLEAN_AUTO;
22 -int cgroup_enable_swap = CONFIG_BOOLEAN_AUTO;
23 -int cgroup_enable_blkio_io = CONFIG_BOOLEAN_AUTO;
24 -int cgroup_enable_blkio_ops = CONFIG_BOOLEAN_AUTO;
25 -int cgroup_enable_blkio_throttle_io = CONFIG_BOOLEAN_AUTO;
26 -int cgroup_enable_blkio_throttle_ops = CONFIG_BOOLEAN_AUTO;
27 -int cgroup_enable_blkio_merged_ops = CONFIG_BOOLEAN_AUTO;
28 -int cgroup_enable_blkio_queued_ops = CONFIG_BOOLEAN_AUTO;
29 -int cgroup_enable_pressure_cpu = CONFIG_BOOLEAN_AUTO;
30 -int cgroup_enable_pressure_io_some = CONFIG_BOOLEAN_AUTO;
31 -int cgroup_enable_pressure_io_full = CONFIG_BOOLEAN_AUTO;
32 -int cgroup_enable_pressure_memory_some = CONFIG_BOOLEAN_AUTO;
33 -int cgroup_enable_pressure_memory_full = CONFIG_BOOLEAN_AUTO;
34 -int cgroup_enable_pressure_irq_some = CONFIG_BOOLEAN_NO;
35 -int cgroup_enable_pressure_irq_full = CONFIG_BOOLEAN_AUTO;
36 -int cgroup_enable_systemd_services = CONFIG_BOOLEAN_YES;
37 -int cgroup_enable_systemd_services_detailed_memory = CONFIG_BOOLEAN_NO;
38 -int cgroup_used_memory = CONFIG_BOOLEAN_YES;
39 -int cgroup_use_unified_cgroups = CONFIG_BOOLEAN_NO;
40 -int cgroup_unified_exist = CONFIG_BOOLEAN_AUTO;
41 -int cgroup_search_in_devices = 1;
15 +
16 +bool cgroup_use_unified_cgroups = false;
17 +bool cgroup_unified_exist = true;
18 +
19 +bool cgroup_enable_blkio = true;
20 +bool cgroup_enable_pressure = true;
21 +bool cgroup_enable_memory = true;
22 +bool cgroup_enable_cpuacct = true;
23 +bool cgroup_enable_cpuacct_cpu_shares = false;
24 +
25 int cgroup_check_for_new_every = 10;
26 int cgroup_update_every = 1;
44 -int cgroup_containers_chart_priority = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS;
45 -int cgroup_recheck_zero_blkio_every_iterations = 10;
46 -int cgroup_recheck_zero_mem_failcnt_every_iterations = 10;
47 -int cgroup_recheck_zero_mem_detailed_every_iterations = 10;
27 char *cgroup_cpuacct_base = NULL;
28 char *cgroup_cpuset_base = NULL;
29 char *cgroup_blkio_base = NULL;
30 char *cgroup_memory_base = NULL;
52 -char *cgroup_devices_base = NULL;
31 char *cgroup_pids_base = NULL;
32 char *cgroup_unified_base = NULL;
33 int cgroup_root_count = 0;
@@ -254,57 +232,12 @@ void read_cgroup_plugin_configuration() {
232 if(cgroup_check_for_new_every < cgroup_update_every)
233 cgroup_check_for_new_every = cgroup_update_every;
234
257 - cgroup_use_unified_cgroups = config_get_boolean_ondemand("plugin:cgroups", "use unified cgroups", CONFIG_BOOLEAN_AUTO);
258 - if(cgroup_use_unified_cgroups == CONFIG_BOOLEAN_AUTO)
259 - cgroup_use_unified_cgroups = (cgroups_try_detect_version() == CGROUPS_V2);
260 -
235 + cgroup_use_unified_cgroups = (cgroups_try_detect_version() == CGROUPS_V2);
236 collector_info("use unified cgroups %s", cgroup_use_unified_cgroups ? "true" : "false");
237
263 - cgroup_containers_chart_priority = (int)config_get_number("plugin:cgroups", "containers priority", cgroup_containers_chart_priority);
264 - if(cgroup_containers_chart_priority < 1)
265 - cgroup_containers_chart_priority = NETDATA_CHART_PRIO_CGROUPS_CONTAINERS;
266 -
267 - cgroup_enable_cpuacct_stat = config_get_boolean_ondemand("plugin:cgroups", "enable cpuacct stat (total CPU)", cgroup_enable_cpuacct_stat);
268 - cgroup_enable_cpuacct_usage = config_get_boolean_ondemand("plugin:cgroups", "enable cpuacct usage (per core CPU)", cgroup_enable_cpuacct_usage);
269 - cgroup_enable_cpuacct_cpu_throttling = config_get_boolean_ondemand("plugin:cgroups", "enable cpuacct cpu throttling", cgroup_enable_cpuacct_cpu_throttling);
270 - cgroup_enable_cpuacct_cpu_shares = config_get_boolean_ondemand("plugin:cgroups", "enable cpuacct cpu shares", cgroup_enable_cpuacct_cpu_shares);
271 -
272 - cgroup_enable_memory = config_get_boolean_ondemand("plugin:cgroups", "enable memory", cgroup_enable_memory);
273 - cgroup_enable_detailed_memory = config_get_boolean_ondemand("plugin:cgroups", "enable detailed memory", cgroup_enable_detailed_memory);
274 - cgroup_enable_memory_failcnt = config_get_boolean_ondemand("plugin:cgroups", "enable memory limits fail count", cgroup_enable_memory_failcnt);
275 - cgroup_enable_swap = config_get_boolean_ondemand("plugin:cgroups", "enable swap memory", cgroup_enable_swap);
276 -
277 - cgroup_enable_blkio_io = config_get_boolean_ondemand("plugin:cgroups", "enable blkio bandwidth", cgroup_enable_blkio_io);
278 - cgroup_enable_blkio_ops = config_get_boolean_ondemand("plugin:cgroups", "enable blkio operations", cgroup_enable_blkio_ops);
279 - cgroup_enable_blkio_throttle_io = config_get_boolean_ondemand("plugin:cgroups", "enable blkio throttle bandwidth", cgroup_enable_blkio_throttle_io);
280 - cgroup_enable_blkio_throttle_ops = config_get_boolean_ondemand("plugin:cgroups", "enable blkio throttle operations", cgroup_enable_blkio_throttle_ops);
281 - cgroup_enable_blkio_queued_ops = config_get_boolean_ondemand("plugin:cgroups", "enable blkio queued operations", cgroup_enable_blkio_queued_ops);
282 - cgroup_enable_blkio_merged_ops = config_get_boolean_ondemand("plugin:cgroups", "enable blkio merged operations", cgroup_enable_blkio_merged_ops);
283 -
284 - cgroup_enable_pressure_cpu = config_get_boolean_ondemand("plugin:cgroups", "enable cpu pressure", cgroup_enable_pressure_cpu);
285 - cgroup_enable_pressure_io_some = config_get_boolean_ondemand("plugin:cgroups", "enable io some pressure", cgroup_enable_pressure_io_some);
286 - cgroup_enable_pressure_io_full = config_get_boolean_ondemand("plugin:cgroups", "enable io full pressure", cgroup_enable_pressure_io_full);
287 - cgroup_enable_pressure_memory_some = config_get_boolean_ondemand("plugin:cgroups", "enable memory some pressure", cgroup_enable_pressure_memory_some);
288 - cgroup_enable_pressure_memory_full = config_get_boolean_ondemand("plugin:cgroups", "enable memory full pressure", cgroup_enable_pressure_memory_full);
289 -
290 - cgroup_recheck_zero_blkio_every_iterations = (int)config_get_number("plugin:cgroups", "recheck zero blkio every iterations", cgroup_recheck_zero_blkio_every_iterations);
291 - cgroup_recheck_zero_mem_failcnt_every_iterations = (int)config_get_number("plugin:cgroups", "recheck zero memory failcnt every iterations", cgroup_recheck_zero_mem_failcnt_every_iterations);
292 - cgroup_recheck_zero_mem_detailed_every_iterations = (int)config_get_number("plugin:cgroups", "recheck zero detailed memory every iterations", cgroup_recheck_zero_mem_detailed_every_iterations);
293 -
294 - cgroup_enable_systemd_services = config_get_boolean("plugin:cgroups", "enable systemd services", cgroup_enable_systemd_services);
295 - cgroup_enable_systemd_services_detailed_memory = config_get_boolean("plugin:cgroups", "enable systemd services detailed memory", cgroup_enable_systemd_services_detailed_memory);
296 - cgroup_used_memory = config_get_boolean("plugin:cgroups", "report used memory", cgroup_used_memory);
297 -
238 char filename[FILENAME_MAX + 1], *s;
239 struct mountinfo *mi, *root = mountinfo_read(0);
300 - if(!cgroup_use_unified_cgroups) {
301 - // cgroup v1 does not have pressure metrics
302 - cgroup_enable_pressure_cpu =
303 - cgroup_enable_pressure_io_some =
304 - cgroup_enable_pressure_io_full =
305 - cgroup_enable_pressure_memory_some =
306 - cgroup_enable_pressure_memory_full = CONFIG_BOOLEAN_NO;
307 -
240 + if (!cgroup_use_unified_cgroups) {
241 mi = mountinfo_find_by_filesystem_super_option(root, "cgroup", "cpuacct");
242 if (!mi)
243 mi = mountinfo_find_by_filesystem_mount_source(root, "cgroup", "cpuacct");
@@ -314,7 +247,7 @@ void read_cgroup_plugin_configuration() {
247 } else
248 s = mi->mount_point;
249 set_cgroup_base_path(filename, s);
317 - cgroup_cpuacct_base = config_get("plugin:cgroups", "path to /sys/fs/cgroup/cpuacct", filename);
250 + cgroup_cpuacct_base = strdupz(filename);
251
252 mi = mountinfo_find_by_filesystem_super_option(root, "cgroup", "cpuset");
253 if (!mi)
@@ -325,7 +258,7 @@ void read_cgroup_plugin_configuration() {
258 } else
259 s = mi->mount_point;
260 set_cgroup_base_path(filename, s);
328 - cgroup_cpuset_base = config_get("plugin:cgroups", "path to /sys/fs/cgroup/cpuset", filename);
261 + cgroup_cpuset_base = strdupz(filename);
262
263 mi = mountinfo_find_by_filesystem_super_option(root, "cgroup", "blkio");
264 if (!mi)
@@ -336,7 +269,7 @@ void read_cgroup_plugin_configuration() {
269 } else
270 s = mi->mount_point;
271 set_cgroup_base_path(filename, s);
339 - cgroup_blkio_base = config_get("plugin:cgroups", "path to /sys/fs/cgroup/blkio", filename);
272 + cgroup_blkio_base = strdupz(filename);
273
274 mi = mountinfo_find_by_filesystem_super_option(root, "cgroup", "memory");
275 if (!mi)
@@ -344,21 +277,11 @@ void read_cgroup_plugin_configuration() {
277 if (!mi) {
278 collector_error("CGROUP: cannot find memory mountinfo. Assuming default: /sys/fs/cgroup/memory");
279 s = "/sys/fs/cgroup/memory";
347 - } else
348 - s = mi->mount_point;
349 - set_cgroup_base_path(filename, s);
350 - cgroup_memory_base = config_get("plugin:cgroups", "path to /sys/fs/cgroup/memory", filename);
351 -
352 - mi = mountinfo_find_by_filesystem_super_option(root, "cgroup", "devices");
353 - if (!mi)
354 - mi = mountinfo_find_by_filesystem_mount_source(root, "cgroup", "devices");
355 - if (!mi) {
356 - collector_error("CGROUP: cannot find devices mountinfo. Assuming default: /sys/fs/cgroup/devices");
357 - s = "/sys/fs/cgroup/devices";
358 - } else
280 + } else {
281 s = mi->mount_point;
282 + }
283 set_cgroup_base_path(filename, s);
361 - cgroup_devices_base = config_get("plugin:cgroups", "path to /sys/fs/cgroup/devices", filename);
284 + cgroup_memory_base = strdupz(filename);
285
286 mi = mountinfo_find_by_filesystem_super_option(root, "cgroup", "pids");
287 if (!mi)
@@ -366,28 +289,13 @@ void read_cgroup_plugin_configuration() {
289 if (!mi) {
290 collector_error("CGROUP: cannot find pids mountinfo. Assuming default: /sys/fs/cgroup/pids");
291 s = "/sys/fs/cgroup/pids";
369 - } else
292 + } else {
293 s = mi->mount_point;
371 - set_cgroup_base_path(filename, s);
372 - cgroup_pids_base = config_get("plugin:cgroups", "path to /sys/fs/cgroup/pids", filename);
373 - }
374 - else {
375 - //cgroup_enable_cpuacct_stat =
376 - cgroup_enable_cpuacct_usage =
377 - //cgroup_enable_memory =
378 - //cgroup_enable_detailed_memory =
379 - cgroup_enable_memory_failcnt =
380 - //cgroup_enable_swap =
381 - //cgroup_enable_blkio_io =
382 - //cgroup_enable_blkio_ops =
383 - cgroup_enable_blkio_throttle_io =
384 - cgroup_enable_blkio_throttle_ops =
385 - cgroup_enable_blkio_merged_ops =
386 - cgroup_enable_blkio_queued_ops = CONFIG_BOOLEAN_NO;
387 - cgroup_search_in_devices = 0;
388 - cgroup_enable_systemd_services_detailed_memory = CONFIG_BOOLEAN_NO;
389 - cgroup_used_memory = CONFIG_BOOLEAN_NO; //unified cgroups use different values
294 + }
295
296 + set_cgroup_base_path(filename, s);
297 + cgroup_pids_base = strdupz(filename);
298 + } else {
299 //TODO: can there be more than 1 cgroup2 mount point?
300 //there is no cgroup2 specific super option - for now use 'rw' option
301 mi = mountinfo_find_by_filesystem_super_option(root, "cgroup2", "rw");
@@ -401,7 +309,7 @@ void read_cgroup_plugin_configuration() {
309 s = mi->mount_point;
310
311 set_cgroup_base_path(filename, s);
404 - cgroup_unified_base = config_get("plugin:cgroups", "path to unified cgroups", filename);
312 + cgroup_unified_base = strdupz(filename);
313 }
314
315 cgroup_root_max = (int)config_get_number("plugin:cgroups", "max cgroups to allow", cgroup_root_max);
@@ -512,13 +420,15 @@ void read_cgroup_plugin_configuration() {
420 " * "
421 ), NULL, SIMPLE_PATTERN_EXACT, true);
422
515 - if(cgroup_enable_systemd_services) {
516 - systemd_services_cgroups = simple_pattern_create(
517 - config_get("plugin:cgroups", "cgroups to match as systemd services",
518 - " !/system.slice/*/*.service "
519 - " /system.slice/*.service "
520 - ), NULL, SIMPLE_PATTERN_EXACT, true);
521 - }
423 + systemd_services_cgroups = simple_pattern_create(
424 + config_get(
425 + "plugin:cgroups",
426 + "cgroups to match as systemd services",
427 + " !/system.slice/*/*.service "
428 + " /system.slice/*.service "),
429 + NULL,
430 + SIMPLE_PATTERN_EXACT,
431 + true);
432
433 mountinfo_free_all(root);
434 }
@@ -580,10 +490,6 @@ static inline void cgroup_read_cpuacct_stat(struct cpuacct_stat *cp) {
490 }
491
492 cp->updated = 1;
583 -
584 - if(unlikely(cp->enabled == CONFIG_BOOLEAN_AUTO &&
585 - (cp->user || cp->system || netdata_zero_metrics_enabled == CONFIG_BOOLEAN_YES)))
586 - cp->enabled = CONFIG_BOOLEAN_YES;
493 }
494 }
495
@@ -633,14 +539,6 @@ static inline void cgroup_read_cpuacct_cpu_stat(struct cpuacct_cpu_throttling *c
539 calc_percentage(calc_delta(cp->nr_throttled, nr_throttled_last), calc_delta(cp->nr_periods, nr_periods_last));
540
541 cp->updated = 1;
636 -
637 - if (unlikely(cp->enabled == CONFIG_BOOLEAN_AUTO)) {
638 - if (likely(
639 - cp->nr_periods || cp->nr_throttled || cp->throttled_time ||
640 - netdata_zero_metrics_enabled == CONFIG_BOOLEAN_YES)) {
641 - cp->enabled = CONFIG_BOOLEAN_YES;
642 - }
643 - }
542 }
543
544 static inline void cgroup2_read_cpuacct_cpu_stat(struct cpuacct_stat *cp, struct cpuacct_cpu_throttling *cpt) {
@@ -695,19 +593,6 @@ static inline void cgroup2_read_cpuacct_cpu_stat(struct cpuacct_stat *cp, struct
593
594 cp->updated = 1;
595 cpt->updated = 1;
698 -
699 - if (unlikely(cp->enabled == CONFIG_BOOLEAN_AUTO)) {
700 - if (likely(cp->user || cp->system || netdata_zero_metrics_enabled == CONFIG_BOOLEAN_YES)) {
701 - cp->enabled = CONFIG_BOOLEAN_YES;
702 - }
703 - }
704 - if (unlikely(cpt->enabled == CONFIG_BOOLEAN_AUTO)) {
705 - if (likely(
706 - cpt->nr_periods || cpt->nr_throttled || cpt->throttled_time ||
707 - netdata_zero_metrics_enabled == CONFIG_BOOLEAN_YES)) {
708 - cpt->enabled = CONFIG_BOOLEAN_YES;
709 - }
710 - }
596 }
597
598 static inline void cgroup_read_cpuacct_cpu_shares(struct cpuacct_cpu_shares *cp) {
@@ -722,10 +607,6 @@ static inline void cgroup_read_cpuacct_cpu_shares(struct cpuacct_cpu_shares *cp)
607 }
608
609 cp->updated = 1;
725 - if (unlikely((cp->enabled == CONFIG_BOOLEAN_AUTO)) &&
726 - (cp->shares || netdata_zero_metrics_enabled == CONFIG_BOOLEAN_YES)) {
727 - cp->enabled = CONFIG_BOOLEAN_YES;
728 - }
610 }
611
612 static inline void cgroup_read_cpuacct_usage(struct cpuacct_usage *ca) {
@@ -779,31 +660,22 @@ static inline void cgroup_read_cpuacct_usage(struct cpuacct_usage *ca) {
660 }
661
662 ca->updated = 1;
782 -
783 - if(unlikely(ca->enabled == CONFIG_BOOLEAN_AUTO &&
784 - (total || netdata_zero_metrics_enabled == CONFIG_BOOLEAN_YES)))
785 - ca->enabled = CONFIG_BOOLEAN_YES;
663 }
664 }
665
666 static inline void cgroup_read_blkio(struct blkio *io) {
790 - if(unlikely(io->enabled == CONFIG_BOOLEAN_AUTO && io->delay_counter > 0)) {
791 - io->delay_counter--;
792 - return;
793 - }
794 -
795 - if(likely(io->filename)) {
667 + if (likely(io->filename)) {
668 static procfile *ff = NULL;
669
670 ff = procfile_reopen(ff, io->filename, NULL, CGROUP_PROCFILE_FLAG);
799 - if(unlikely(!ff)) {
671 + if (unlikely(!ff)) {
672 io->updated = 0;
673 cgroups_check = 1;
674 return;
675 }
676
677 ff = procfile_readall(ff);
806 - if(unlikely(!ff)) {
678 + if (unlikely(!ff)) {
679 io->updated = 0;
680 cgroups_check = 1;
681 return;
@@ -811,7 +683,7 @@ static inline void cgroup_read_blkio(struct blkio *io) {
683
684 unsigned long i, lines = procfile_lines(ff);
685
814 - if(unlikely(lines < 1)) {
686 + if (unlikely(lines < 1)) {
687 collector_error("CGROUP: file '%s' should have 1+ lines.", io->filename);
688 io->updated = 0;
689 return;
@@ -819,93 +691,57 @@ static inline void cgroup_read_blkio(struct blkio *io) {
691
692 io->Read = 0;
693 io->Write = 0;
822 -/*
823 - io->Sync = 0;
824 - io->Async = 0;
825 - io->Total = 0;
826 -*/
694
828 - for(i = 0; i < lines ; i++) {
695 + for (i = 0; i < lines; i++) {
696 char *s = procfile_lineword(ff, i, 1);
697 uint32_t hash = simple_hash(s);
698
832 - if(unlikely(hash == Read_hash && !strcmp(s, "Read")))
699 + if (unlikely(hash == Read_hash && !strcmp(s, "Read")))
700 io->Read += str2ull(procfile_lineword(ff, i, 2), NULL);
834 -
835 - else if(unlikely(hash == Write_hash && !strcmp(s, "Write")))
701 + else if (unlikely(hash == Write_hash && !strcmp(s, "Write")))
702 io->Write += str2ull(procfile_lineword(ff, i, 2), NULL);
837 -
838 -/*
839 - else if(unlikely(hash == Sync_hash && !strcmp(s, "Sync")))
840 - io->Sync += str2ull(procfile_lineword(ff, i, 2));
841 -
842 - else if(unlikely(hash == Async_hash && !strcmp(s, "Async")))
843 - io->Async += str2ull(procfile_lineword(ff, i, 2));
844 -
845 - else if(unlikely(hash == Total_hash && !strcmp(s, "Total")))
846 - io->Total += str2ull(procfile_lineword(ff, i, 2));
847 -*/
703 }
704
705 io->updated = 1;
851 -
852 - if(unlikely(io->enabled == CONFIG_BOOLEAN_AUTO)) {
853 - if(unlikely(io->Read || io->Write || netdata_zero_metrics_enabled == CONFIG_BOOLEAN_YES))
854 - io->enabled = CONFIG_BOOLEAN_YES;
855 - else
856 - io->delay_counter = cgroup_recheck_zero_blkio_every_iterations;
857 - }
706 }
707 }
708
709 static inline void cgroup2_read_blkio(struct blkio *io, unsigned int word_offset) {
862 - if(unlikely(io->enabled == CONFIG_BOOLEAN_AUTO && io->delay_counter > 0)) {
863 - io->delay_counter--;
710 + if (likely(io->filename)) {
711 + static procfile *ff = NULL;
712 +
713 + ff = procfile_reopen(ff, io->filename, NULL, CGROUP_PROCFILE_FLAG);
714 + if (unlikely(!ff)) {
715 + io->updated = 0;
716 + cgroups_check = 1;
717 return;
718 }
719
867 - if(likely(io->filename)) {
868 - static procfile *ff = NULL;
869 -
870 - ff = procfile_reopen(ff, io->filename, NULL, CGROUP_PROCFILE_FLAG);
871 - if(unlikely(!ff)) {
872 - io->updated = 0;
873 - cgroups_check = 1;
874 - return;
875 - }
876 -
877 - ff = procfile_readall(ff);
878 - if(unlikely(!ff)) {
879 - io->updated = 0;
880 - cgroups_check = 1;
881 - return;
882 - }
883 -
884 - unsigned long i, lines = procfile_lines(ff);
885 -
886 - if (unlikely(lines < 1)) {
887 - collector_error("CGROUP: file '%s' should have 1+ lines.", io->filename);
888 - io->updated = 0;
889 - return;
890 - }
720 + ff = procfile_readall(ff);
721 + if (unlikely(!ff)) {
722 + io->updated = 0;
723 + cgroups_check = 1;
724 + return;
725 + }
726
892 - io->Read = 0;
893 - io->Write = 0;
727 + unsigned long i, lines = procfile_lines(ff);
728
895 - for (i = 0; i < lines; i++) {
896 - io->Read += str2ull(procfile_lineword(ff, i, 2 + word_offset), NULL);
897 - io->Write += str2ull(procfile_lineword(ff, i, 4 + word_offset), NULL);
898 - }
729 + if (unlikely(lines < 1)) {
730 + collector_error("CGROUP: file '%s' should have 1+ lines.", io->filename);
731 + io->updated = 0;
732 + return;
733 + }
734
900 - io->updated = 1;
735 + io->Read = 0;
736 + io->Write = 0;
737
902 - if(unlikely(io->enabled == CONFIG_BOOLEAN_AUTO)) {
903 - if(unlikely(io->Read || io->Write || netdata_zero_metrics_enabled == CONFIG_BOOLEAN_YES))
904 - io->enabled = CONFIG_BOOLEAN_YES;
905 - else
906 - io->delay_counter = cgroup_recheck_zero_blkio_every_iterations;
907 - }
738 + for (i = 0; i < lines; i++) {
739 + io->Read += str2ull(procfile_lineword(ff, i, 2 + word_offset), NULL);
740 + io->Write += str2ull(procfile_lineword(ff, i, 4 + word_offset), NULL);
741 }
742 +
743 + io->updated = 1;
744 + }
745 }
746
747 static inline void cgroup2_read_pressure(struct pressure *res) {
@@ -966,13 +802,7 @@ static inline void cgroup2_read_pressure(struct pressure *res) {
802 static inline void cgroup_read_memory(struct memory *mem, char parent_cg_is_unified) {
803 static procfile *ff = NULL;
804
969 - // read detailed ram usage
805 if(likely(mem->filename_detailed)) {
971 - if(unlikely(mem->enabled_detailed == CONFIG_BOOLEAN_AUTO && mem->delay_counter_detailed > 0)) {
972 - mem->delay_counter_detailed--;
973 - goto memory_next;
974 - }
975 -
806 ff = procfile_reopen(ff, mem->filename_detailed, NULL, CGROUP_PROCFILE_FLAG);
807 if(unlikely(!ff)) {
808 mem->updated_detailed = 0;
@@ -1031,42 +861,24 @@ static inline void cgroup_read_memory(struct memory *mem, char parent_cg_is_unif
861
862 arl_begin(mem->arl_base);
863
1034 - for(i = 0; i < lines ; i++) {
1035 - if(arl_check(mem->arl_base,
1036 - procfile_lineword(ff, i, 0),
1037 - procfile_lineword(ff, i, 1))) break;
864 + for (i = 0; i < lines; i++) {
865 + if (arl_check(mem->arl_base, procfile_lineword(ff, i, 0), procfile_lineword(ff, i, 1)))
866 + break;
867 }
868
1040 - if(unlikely(mem->arl_dirty->flags & ARL_ENTRY_FLAG_FOUND))
869 + if (unlikely(mem->arl_dirty->flags & ARL_ENTRY_FLAG_FOUND))
870 mem->detailed_has_dirty = 1;
871
1043 - if(unlikely(parent_cg_is_unified == 0 && mem->arl_swap->flags & ARL_ENTRY_FLAG_FOUND))
872 + if (unlikely(parent_cg_is_unified == 0 && mem->arl_swap->flags & ARL_ENTRY_FLAG_FOUND))
873 mem->detailed_has_swap = 1;
874
1046 - // fprintf(stderr, "READ: '%s', cache: %llu, rss: %llu, rss_huge: %llu, mapped_file: %llu, writeback: %llu, dirty: %llu, swap: %llu, pgpgin: %llu, pgpgout: %llu, pgfault: %llu, pgmajfault: %llu, inactive_anon: %llu, active_anon: %llu, inactive_file: %llu, active_file: %llu, unevictable: %llu, hierarchical_memory_limit: %llu, total_cache: %llu, total_rss: %llu, total_rss_huge: %llu, total_mapped_file: %llu, total_writeback: %llu, total_dirty: %llu, total_swap: %llu, total_pgpgin: %llu, total_pgpgout: %llu, total_pgfault: %llu, total_pgmajfault: %llu, total_inactive_anon: %llu, total_active_anon: %llu, total_inactive_file: %llu, total_active_file: %llu, total_unevictable: %llu\n", mem->filename, mem->cache, mem->rss, mem->rss_huge, mem->mapped_file, mem->writeback, mem->dirty, mem->swap, mem->pgpgin, mem->pgpgout, mem->pgfault, mem->pgmajfault, mem->inactive_anon, mem->active_anon, mem->inactive_file, mem->active_file, mem->unevictable, mem->hierarchical_memory_limit, mem->total_cache, mem->total_rss, mem->total_rss_huge, mem->total_mapped_file, mem->total_writeback, mem->total_dirty, mem->total_swap, mem->total_pgpgin, mem->total_pgpgout, mem->total_pgfault, mem->total_pgmajfault, mem->total_inactive_anon, mem->total_active_anon, mem->total_inactive_file, mem->total_active_file, mem->total_unevictable);
1047 -
875 mem->updated_detailed = 1;
1049 -
1050 - if(unlikely(mem->enabled_detailed == CONFIG_BOOLEAN_AUTO)) {
1051 - if(( (!parent_cg_is_unified) && ( mem->total_cache || mem->total_dirty || mem->total_rss || mem->total_rss_huge || mem->total_mapped_file || mem->total_writeback
1052 - || mem->total_swap || mem->total_pgpgin || mem->total_pgpgout || mem->total_pgfault || mem->total_pgmajfault || mem->total_inactive_file))
1053 - || (parent_cg_is_unified && ( mem->anon || mem->total_dirty || mem->kernel_stack || mem->slab || mem->sock || mem->total_writeback
1054 - || mem->anon_thp || mem->total_pgfault || mem->total_pgmajfault || mem->total_inactive_file))
1055 - || netdata_zero_metrics_enabled == CONFIG_BOOLEAN_YES)
1056 - mem->enabled_detailed = CONFIG_BOOLEAN_YES;
1057 - else
1058 - mem->delay_counter_detailed = cgroup_recheck_zero_mem_detailed_every_iterations;
1059 - }
876 }
877
878 memory_next:
879
1064 - // read usage_in_bytes
1065 - if(likely(mem->filename_usage_in_bytes)) {
880 + if (likely(mem->filename_usage_in_bytes)) {
881 mem->updated_usage_in_bytes = !read_single_number_file(mem->filename_usage_in_bytes, &mem->usage_in_bytes);
1067 - if(unlikely(mem->updated_usage_in_bytes && mem->enabled_usage_in_bytes == CONFIG_BOOLEAN_AUTO &&
1068 - (mem->usage_in_bytes || netdata_zero_metrics_enabled == CONFIG_BOOLEAN_YES)))
1069 - mem->enabled_usage_in_bytes = CONFIG_BOOLEAN_YES;
882 }
883
884 if (likely(mem->updated_usage_in_bytes && mem->updated_detailed)) {
@@ -1074,44 +886,28 @@ memory_next:
886 (mem->usage_in_bytes > mem->total_inactive_file) ? (mem->usage_in_bytes - mem->total_inactive_file) : 0;
887 }
888
1077 - // read msw_usage_in_bytes
1078 - if(likely(mem->filename_msw_usage_in_bytes)) {
1079 - mem->updated_msw_usage_in_bytes = !read_single_number_file(mem->filename_msw_usage_in_bytes, &mem->msw_usage_in_bytes);
1080 - if(unlikely(mem->updated_msw_usage_in_bytes && mem->enabled_msw_usage_in_bytes == CONFIG_BOOLEAN_AUTO &&
1081 - (mem->msw_usage_in_bytes || netdata_zero_metrics_enabled == CONFIG_BOOLEAN_YES)))
1082 - mem->enabled_msw_usage_in_bytes = CONFIG_BOOLEAN_YES;
889 + if (likely(mem->filename_msw_usage_in_bytes)) {
890 + mem->updated_msw_usage_in_bytes =
891 + !read_single_number_file(mem->filename_msw_usage_in_bytes, &mem->msw_usage_in_bytes);
892 }
893
1085 - // read failcnt
1086 - if(likely(mem->filename_failcnt)) {
1087 - if(unlikely(mem->enabled_failcnt == CONFIG_BOOLEAN_AUTO && mem->delay_counter_failcnt > 0)) {
1088 - mem->updated_failcnt = 0;
1089 - mem->delay_counter_failcnt--;
1090 - }
1091 - else {
1092 - mem->updated_failcnt = !read_single_number_file(mem->filename_failcnt, &mem->failcnt);
1093 - if(unlikely(mem->updated_failcnt && mem->enabled_failcnt == CONFIG_BOOLEAN_AUTO)) {
1094 - if(unlikely(mem->failcnt || netdata_zero_metrics_enabled == CONFIG_BOOLEAN_YES))
1095 - mem->enabled_failcnt = CONFIG_BOOLEAN_YES;
1096 - else
1097 - mem->delay_counter_failcnt = cgroup_recheck_zero_mem_failcnt_every_iterations;
1098 - }
1099 - }
894 + if (likely(mem->filename_failcnt)) {
895 + mem->updated_failcnt = !read_single_number_file(mem->filename_failcnt, &mem->failcnt);
896 }
897 }
898
899 static void cgroup_read_pids_current(struct pids *pids) {
1104 - pids->pids_current_updated = 0;
900 + pids->updated = 0;
901
1106 - if (unlikely(!pids->pids_current_filename))
902 + if (unlikely(!pids->filename))
903 return;
904
1109 - pids->pids_current_updated = !read_single_number_file(pids->pids_current_filename, &pids->pids_current);
905 + pids->updated = !read_single_number_file(pids->filename, &pids->pids_current);
906 }
907
908 static inline void read_cgroup(struct cgroup *cg) {
909 netdata_log_debug(D_CGROUP, "reading metrics for cgroups '%s'", cg->id);
1114 - if(!(cg->options & CGROUP_OPTIONS_IS_UNIFIED)) {
910 + if (!(cg->options & CGROUP_OPTIONS_IS_UNIFIED)) {
911 cgroup_read_cpuacct_stat(&cg->cpuacct_stat);
912 cgroup_read_cpuacct_usage(&cg->cpuacct_usage);
913 cgroup_read_cpuacct_cpu_stat(&cg->cpuacct_cpu_throttling);
@@ -1123,10 +919,8 @@ static inline void read_cgroup(struct cgroup *cg) {
919 cgroup_read_blkio(&cg->throttle_io_serviced);
920 cgroup_read_blkio(&cg->io_merged);
921 cgroup_read_blkio(&cg->io_queued);
1126 - cgroup_read_pids_current(&cg->pids);
1127 - }
1128 - else {
1129 - //TODO: io_service_bytes and io_serviced use same file merge into 1 function
922 + cgroup_read_pids_current(&cg->pids_current);
923 + } else {
924 cgroup2_read_blkio(&cg->io_service_bytes, 0);
925 cgroup2_read_blkio(&cg->io_serviced, 4);
926 cgroup2_read_cpuacct_cpu_stat(&cg->cpuacct_stat, &cg->cpuacct_cpu_throttling);
@@ -1136,7 +930,7 @@ static inline void read_cgroup(struct cgroup *cg) {
930 cgroup2_read_pressure(&cg->memory_pressure);
931 cgroup2_read_pressure(&cg->irq_pressure);
932 cgroup_read_memory(&cg->memory, 1);
1139 - cgroup_read_pids_current(&cg->pids);
933 + cgroup_read_pids_current(&cg->pids_current);
934 }
935 }
936
@@ -1314,7 +1108,7 @@ void update_cgroup_systemd_services_charts() {
1108 update_io_merged_ops_chart(cg);
1109 }
1110
1317 - if (likely(cg->pids.pids_current_updated)) {
1111 + if (likely(cg->pids_current.updated)) {
1112 update_pids_current_chart(cg);
1113 }
1114
@@ -1324,14 +1118,14 @@ void update_cgroup_systemd_services_charts() {
1118
1119 void update_cgroup_charts() {
1120 for (struct cgroup *cg = cgroup_root; cg; cg = cg->next) {
1327 - if(unlikely(!cg->enabled || cg->pending_renames || is_cgroup_systemd_service(cg)))
1121 + if (unlikely(!cg->enabled || cg->pending_renames || is_cgroup_systemd_service(cg)))
1122 continue;
1123
1330 - if (likely(cg->cpuacct_stat.updated && cg->cpuacct_stat.enabled == CONFIG_BOOLEAN_YES)) {
1124 + if (likely(cg->cpuacct_stat.updated)) {
1125 update_cpu_utilization_chart(cg);
1126
1333 - if(likely(cg->filename_cpuset_cpus || cg->filename_cpu_cfs_period || cg->filename_cpu_cfs_quota)) {
1334 - if(!(cg->options & CGROUP_OPTIONS_IS_UNIFIED)) {
1127 + if (likely(cg->filename_cpuset_cpus || cg->filename_cpu_cfs_period || cg->filename_cpu_cfs_quota)) {
1128 + if (!(cg->options & CGROUP_OPTIONS_IS_UNIFIED)) {
1129 update_cpu_limits(&cg->filename_cpuset_cpus, &cg->cpuset_cpus, cg);
1130 update_cpu_limits(&cg->filename_cpu_cfs_period, &cg->cpu_cfs_period, cg);
1131 update_cpu_limits(&cg->filename_cpu_cfs_quota, &cg->cpu_cfs_quota, cg);
@@ -1339,31 +1133,39 @@ void update_cgroup_charts() {
1133 update_cpu_limits2(cg);
1134 }
1135
1342 - if(unlikely(!cg->chart_var_cpu_limit)) {
1136 + if (unlikely(!cg->chart_var_cpu_limit)) {
1137 cg->chart_var_cpu_limit = rrdvar_chart_variable_add_and_acquire(cg->st_cpu, "cpu_limit");
1344 - if(!cg->chart_var_cpu_limit) {
1345 - collector_error("Cannot create cgroup %s chart variable 'cpu_limit'. Will not update its limit anymore.", cg->id);
1346 - if(cg->filename_cpuset_cpus) freez(cg->filename_cpuset_cpus);
1138 + if (!cg->chart_var_cpu_limit) {
1139 + collector_error(
1140 + "Cannot create cgroup %s chart variable 'cpu_limit'. Will not update its limit anymore.",
1141 + cg->id);
1142 + if (cg->filename_cpuset_cpus)
1143 + freez(cg->filename_cpuset_cpus);
1144 cg->filename_cpuset_cpus = NULL;
1348 - if(cg->filename_cpu_cfs_period) freez(cg->filename_cpu_cfs_period);
1145 + if (cg->filename_cpu_cfs_period)
1146 + freez(cg->filename_cpu_cfs_period);
1147 cg->filename_cpu_cfs_period = NULL;
1350 - if(cg->filename_cpu_cfs_quota) freez(cg->filename_cpu_cfs_quota);
1148 + if (cg->filename_cpu_cfs_quota)
1149 + freez(cg->filename_cpu_cfs_quota);
1150 cg->filename_cpu_cfs_quota = NULL;
1151 }
1152 } else {
1153 NETDATA_DOUBLE value = 0, quota = 0;
1154
1356 - if(likely( ((!(cg->options & CGROUP_OPTIONS_IS_UNIFIED)) && (cg->filename_cpuset_cpus || (cg->filename_cpu_cfs_period && cg->filename_cpu_cfs_quota)))
1357 - || ((cg->options & CGROUP_OPTIONS_IS_UNIFIED) && cg->filename_cpu_cfs_quota))) {
1358 - if(unlikely(cg->cpu_cfs_quota > 0))
1155 + if (likely(
1156 + ((!(cg->options & CGROUP_OPTIONS_IS_UNIFIED)) &&
1157 + (cg->filename_cpuset_cpus ||
1158 + (cg->filename_cpu_cfs_period && cg->filename_cpu_cfs_quota))) ||
1159 + ((cg->options & CGROUP_OPTIONS_IS_UNIFIED) && cg->filename_cpu_cfs_quota))) {
1160 + if (unlikely(cg->cpu_cfs_quota > 0))
1161 quota = (NETDATA_DOUBLE)cg->cpu_cfs_quota / (NETDATA_DOUBLE)cg->cpu_cfs_period;
1162
1361 - if(unlikely(quota > 0 && quota < cg->cpuset_cpus))
1163 + if (unlikely(quota > 0 && quota < cg->cpuset_cpus))
1164 value = quota * 100;
1165 else
1166 value = (NETDATA_DOUBLE)cg->cpuset_cpus * 100;
1167 }
1366 - if(likely(value)) {
1168 + if (likely(value)) {
1169 update_cpu_utilization_limit_chart(cg, value);
1170 } else {
1171 if (unlikely(cg->st_cpu_limit)) {
@@ -1376,20 +1178,20 @@ void update_cgroup_charts() {
1178 }
1179 }
1180
1379 - if (likely(cg->cpuacct_cpu_throttling.updated && cg->cpuacct_cpu_throttling.enabled == CONFIG_BOOLEAN_YES)) {
1181 + if (likely(cg->cpuacct_cpu_throttling.updated)) {
1182 update_cpu_throttled_chart(cg);
1183 update_cpu_throttled_duration_chart(cg);
1184 }
1185
1384 - if (likely(cg->cpuacct_cpu_shares.updated && cg->cpuacct_cpu_shares.enabled == CONFIG_BOOLEAN_YES)) {
1186 + if (unlikely(cg->cpuacct_cpu_shares.updated)) {
1187 update_cpu_shares_chart(cg);
1188 }
1189
1388 - if (likely(cg->cpuacct_usage.updated && cg->cpuacct_usage.enabled == CONFIG_BOOLEAN_YES)) {
1190 + if (likely(cg->cpuacct_usage.updated)) {
1191 update_cpu_per_core_usage_chart(cg);
1192 }
1193
1392 - if (likely(cg->memory.updated_detailed && cg->memory.enabled_detailed == CONFIG_BOOLEAN_YES)) {
1194 + if (likely(cg->memory.updated_detailed)) {
1195 update_mem_usage_detailed_chart(cg);
1196 update_mem_writeback_chart(cg);
1197
@@ -1400,14 +1202,13 @@ void update_cgroup_charts() {
1202 update_mem_pgfaults_chart(cg);
1203 }
1204
1403 - if (likely(cg->memory.updated_usage_in_bytes && cg->memory.enabled_usage_in_bytes == CONFIG_BOOLEAN_YES)) {
1205 + if (likely(cg->memory.updated_usage_in_bytes)) {
1206 update_mem_usage_chart(cg);
1207
1406 - // FIXME: this if should be only for unlimited charts
1407 - if(likely(host_ram_total)) {
1208 + // FIXME: this "if" should be only for unlimited charts
1209 + if (likely(host_ram_total)) {
1210 // FIXME: do we need to update mem limits on every data collection?
1211 if (likely(update_memory_limits(cg))) {
1410 -
1212 unsigned long long memory_limit = host_ram_total;
1213 if (unlikely(cg->memory_limit < host_ram_total))
1214 memory_limit = cg->memory_limit;
@@ -1428,35 +1229,35 @@ void update_cgroup_charts() {
1229 }
1230 }
1231
1431 - if (likely(cg->memory.updated_failcnt && cg->memory.enabled_failcnt == CONFIG_BOOLEAN_YES)) {
1232 + if (likely(cg->memory.updated_failcnt)) {
1233 update_mem_failcnt_chart(cg);
1234 }
1235
1435 - if (likely(cg->io_service_bytes.updated && cg->io_service_bytes.enabled == CONFIG_BOOLEAN_YES)) {
1236 + if (likely(cg->io_service_bytes.updated)) {
1237 update_io_serviced_bytes_chart(cg);
1238 }
1239
1439 - if (likely(cg->io_serviced.updated && cg->io_serviced.enabled == CONFIG_BOOLEAN_YES)) {
1240 + if (likely(cg->io_serviced.updated)) {
1241 update_io_serviced_ops_chart(cg);
1242 }
1243
1443 - if (likely(cg->throttle_io_service_bytes.updated && cg->throttle_io_service_bytes.enabled == CONFIG_BOOLEAN_YES)) {
1444 - update_throttle_io_serviced_bytes_chart(cg);
1244 + if (likely(cg->throttle_io_service_bytes.updated)) {
1245 + update_throttle_io_serviced_bytes_chart(cg);
1246 }
1247
1447 - if (likely(cg->throttle_io_serviced.updated && cg->throttle_io_serviced.enabled == CONFIG_BOOLEAN_YES)) {
1448 - update_throttle_io_serviced_ops_chart(cg);
1248 + if (likely(cg->throttle_io_serviced.updated)) {
1249 + update_throttle_io_serviced_ops_chart(cg);
1250 }
1251
1451 - if (likely(cg->io_queued.updated && cg->io_queued.enabled == CONFIG_BOOLEAN_YES)) {
1452 - update_io_queued_ops_chart(cg);
1252 + if (likely(cg->io_queued.updated)) {
1253 + update_io_queued_ops_chart(cg);
1254 }
1255
1455 - if (likely(cg->io_merged.updated && cg->io_merged.enabled == CONFIG_BOOLEAN_YES)) {
1456 - update_io_merged_ops_chart(cg);
1256 + if (likely(cg->io_merged.updated)) {
1257 + update_io_merged_ops_chart(cg);
1258 }
1259
1459 - if (likely(cg->pids.pids_current_updated)) {
1260 + if (likely(cg->pids_current.updated)) {
1261 update_pids_current_chart(cg);
1262 }
1263
@@ -1541,10 +1342,9 @@ static void cgroup_main_cleanup(void *pptr) {
1342 void cgroup_read_host_total_ram() {
1343 procfile *ff = NULL;
1344 char filename[FILENAME_MAX + 1];
1544 - snprintfz(filename, FILENAME_MAX, "%s%s", netdata_configured_host_prefix, "/proc/meminfo");
1345
1546 - ff = procfile_open(
1547 - config_get("plugin:cgroups", "meminfo filename to monitor", filename), " \t:", PROCFILE_FLAG_DEFAULT);
1346 + snprintfz(filename, FILENAME_MAX, "%s%s", netdata_configured_host_prefix, "/proc/meminfo");
1347 + ff = procfile_open(filename, " \t:", PROCFILE_FLAG_DEFAULT);
1348
1349 if (likely((ff = procfile_readall(ff)) && procfile_lines(ff) && !strncmp(procfile_word(ff, 0), "MemTotal", 8)))
1350 host_ram_total = str2ull(procfile_word(ff, 1), NULL) * 1024;
@@ -1563,8 +1363,8 @@ void *cgroups_main(void *ptr) {
1363 worker_register_job_name(WORKER_CGROUPS_CHART, "chart");
1364
1365 if (getenv("KUBERNETES_SERVICE_HOST") != NULL && getenv("KUBERNETES_SERVICE_PORT") != NULL) {
1566 - is_inside_k8s = 1;
1567 - cgroup_enable_cpuacct_cpu_shares = CONFIG_BOOLEAN_YES;
1366 + is_inside_k8s = true;
1367 + cgroup_enable_cpuacct_cpu_shares = true;
1368 }
1369
1370 read_cgroup_plugin_configuration();
@@ -1643,8 +1443,7 @@ void *cgroups_main(void *ptr) {
1443 worker_is_busy(WORKER_CGROUPS_CHART);
1444
1445 update_cgroup_charts();
1646 - if (cgroup_enable_systemd_services)
1647 - update_cgroup_systemd_services_charts();
1446 + update_cgroup_systemd_services_charts();
1447
1448 if (unlikely(!service_running(SERVICE_COLLECTORS))) {
1449 uv_mutex_unlock(&cgroup_root_mutex);
src/collectors/proc.plugin/proc_pressure.h
+2 -1
@@ -6,8 +6,9 @@
6 #define PRESSURE_NUM_RESOURCES 4
7
8 struct pressure {
9 - int updated;
9 char *filename;
10 + bool staterr;
11 + int updated;
12
13 struct pressure_charts {
14 bool available;