@cryptotaxi247 / netdata-1 / commits / d42356474

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