CGROUP labels (#19316)
Costa Tsaousis committed
Jan 7, 2025 at 10:45 UTC
d4235647401d181fc3539b9ef9d93b9857ec2e1f
2 files changed
+60
-15
src/collectors/cgroups.plugin/cgroup-discovery.c
+56
-10
@@ -157,16 +157,62 @@ static inline void substitute_dots_in_id(char *s) {
157
// ----------------------------------------------------------------------------
158
// parse k8s labels
159
160
-char *cgroup_parse_resolved_name_and_labels(RRDLABELS *labels, char *data) {
160
+#define CGROUP_NETDATA_CLOUD_LABEL_PREFIX "netdata.cloud/"
161
+#define CGROUP_RENAME_LABEL "cgroup.name="
162
+#define CGROUP_IGNORE_LABEL "ignore="
163
+
164
+static char *cgroup_parse_resolved_name_and_labels(struct cgroup *cg, char *data) {
165
+ if (!cg->chart_labels)
166
+ cg->chart_labels = rrdlabels_create();
167
+
168
+ rrdlabels_unmark_all(cg->chart_labels);
169
+
170
// the first word, up to the first space is the name
171
char *name = strsep_skip_consecutive_separators(&data, " ");
172
173
+ bool ignored = false;
174
+
175
// the rest are key=value pairs separated by comma
176
while(data) {
177
char *pair = strsep_skip_consecutive_separators(&data, ",");
167
- rrdlabels_add_pair(labels, pair, RRDLABEL_SRC_AUTO | RRDLABEL_SRC_K8S);
178
+
179
+ if(strncmp(pair, CGROUP_NETDATA_CLOUD_LABEL_PREFIX, sizeof(CGROUP_NETDATA_CLOUD_LABEL_PREFIX) - 1) == 0) {
180
+ // a netdata.cloud label
181
+ char *key = &pair[sizeof(CGROUP_NETDATA_CLOUD_LABEL_PREFIX) - 1];
182
+
183
+ if(strncmp(key, CGROUP_RENAME_LABEL, sizeof(CGROUP_RENAME_LABEL) - 1) == 0) {
184
+ char *n = &key[sizeof(CGROUP_RENAME_LABEL) - 1];
185
+ size_t len = strlen(n);
186
+ if(n[0] == '"' && n[len - 1] == '"') {
187
+ n[len - 1] = '\0';
188
+ n++;
189
+ }
190
+ if(*n) name = n;
191
+
192
+ // no need to add this label
193
+ }
194
+ else if(strncmp(key, CGROUP_IGNORE_LABEL, sizeof(CGROUP_IGNORE_LABEL) - 1) == 0) {
195
+ char *v = &key[sizeof(CGROUP_IGNORE_LABEL) - 1];
196
+ if(strcasecmp(v, "\"true\"") == 0 || strcasecmp(v, "\"yes\"") == 0)
197
+ ignored = true;
198
+ else
199
+ ignored = false;
200
+
201
+ // no need to add this label
202
+ }
203
+ }
204
+ else
205
+ // add the label as-is
206
+ rrdlabels_add_pair(cg->chart_labels, pair, RRDLABEL_SRC_AUTO | RRDLABEL_SRC_K8S);
207
}
208
209
+ rrdlabels_remove_all_unmarked(cg->chart_labels);
210
+
211
+ if(ignored)
212
+ cg->options |= CGROUP_OPTIONS_DISABLED_EXCLUDED;
213
+ else
214
+ cg->options &= ~CGROUP_OPTIONS_DISABLED_EXCLUDED;
215
+
216
return name;
217
}
218
@@ -187,8 +233,8 @@ static inline void discovery_rename_cgroup(struct cgroup *cg) {
233
return;
234
}
235
190
- char buffer[CGROUP_CHARTID_LINE_MAX + 1];
191
- char *new_name = fgets(buffer, CGROUP_CHARTID_LINE_MAX, spawn_popen_stdout(instance));
236
+ char buffer[8192]; // we need some size for labels
237
+ char *new_name = fgets(buffer, sizeof(buffer), spawn_popen_stdout(instance));
238
int exit_code = spawn_popen_wait(instance);
239
240
switch (exit_code) {
@@ -212,12 +258,7 @@ static inline void discovery_rename_cgroup(struct cgroup *cg) {
258
if (!(new_name = trim(new_name)))
259
return;
260
215
- if (!cg->chart_labels)
216
- cg->chart_labels = rrdlabels_create();
217
- // read the new labels and remove the obsolete ones
218
- rrdlabels_unmark_all(cg->chart_labels);
219
- char *name = cgroup_parse_resolved_name_and_labels(cg->chart_labels, new_name);
220
- rrdlabels_remove_all_unmarked(cg->chart_labels);
261
+ char *name = cgroup_parse_resolved_name_and_labels(cg, new_name);
262
263
freez(cg->name);
264
cg->name = strdupz(name);
@@ -1185,6 +1226,11 @@ static inline void discovery_process_cgroup(struct cgroup *cg) {
1226
return;
1227
}
1228
1229
+ if (cg->options & CGROUP_OPTIONS_DISABLED_EXCLUDED) {
1230
+ cg->enabled = 0;
1231
+ return;
1232
+ }
1233
+
1234
if (!(cg->enabled = matches_enabled_cgroup_names(cg->name))) {
1235
netdata_log_debug(D_CGROUP, "cgroup '%s' (name '%s') disabled by 'enable by default cgroups names matching'", cg->id, cg->name);
1236
return;
src/collectors/cgroups.plugin/sys_fs_cgroup.h
+4
-5
@@ -9,9 +9,10 @@
9
#define PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME "systemd"
10
#define PLUGIN_CGROUPS_MODULE_CGROUPS_NAME "/sys/fs/cgroup"
11
12
-#define CGROUP_OPTIONS_DISABLED_DUPLICATE 0x00000001
13
-#define CGROUP_OPTIONS_SYSTEM_SLICE_SERVICE 0x00000002
14
-#define CGROUP_OPTIONS_IS_UNIFIED 0x00000004
12
+#define CGROUP_OPTIONS_DISABLED_DUPLICATE (1 << 0)
13
+#define CGROUP_OPTIONS_SYSTEM_SLICE_SERVICE (1 << 1)
14
+#define CGROUP_OPTIONS_IS_UNIFIED (1 << 2)
15
+#define CGROUP_OPTIONS_DISABLED_EXCLUDED (1 << 3)
16
17
typedef struct netdata_ebpf_cgroup_shm_header {
18
int cgroup_root_count;
@@ -43,6 +44,4 @@ typedef struct netdata_ebpf_cgroup_shm {
44
45
#include "../proc.plugin/plugin_proc.h"
46
46
-char *cgroup_parse_resolved_name_and_labels(RRDLABELS *labels, char *data);
47
-
47
#endif //NETDATA_SYS_FS_CGROUP_H