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
-
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;