summaryrefslogtreecommitdiffstats
path: root/src/collectors/cgroups.plugin/sys_fs_cgroup.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/collectors/cgroups.plugin/sys_fs_cgroup.c (renamed from collectors/cgroups.plugin/sys_fs_cgroup.c)116
1 files changed, 25 insertions, 91 deletions
diff --git a/collectors/cgroups.plugin/sys_fs_cgroup.c b/src/collectors/cgroups.plugin/sys_fs_cgroup.c
index 705edf6f7..fd30b4acc 100644
--- a/collectors/cgroups.plugin/sys_fs_cgroup.c
+++ b/src/collectors/cgroups.plugin/sys_fs_cgroup.c
@@ -85,11 +85,6 @@ struct cgroups_systemd_config_setting cgroups_systemd_options[] = {
{ .name = NULL, .setting = SYSTEMD_CGROUP_ERR },
};
-// Shared memory with information from detected cgroups
-netdata_ebpf_cgroup_shm_t shm_cgroup_ebpf = {NULL, NULL};
-int shm_fd_cgroup_ebpf = -1;
-sem_t *shm_mutex_cgroup_ebpf = SEM_FAILED;
-
struct discovery_thread discovery_thread;
@@ -255,7 +250,7 @@ void read_cgroup_plugin_configuration() {
if(cgroup_update_every < localhost->rrd_update_every)
cgroup_update_every = localhost->rrd_update_every;
- cgroup_check_for_new_every = (int)config_get_number("plugin:cgroups", "check for new cgroups every", (long long)cgroup_check_for_new_every * (long long)cgroup_update_every);
+ cgroup_check_for_new_every = (int)config_get_number("plugin:cgroups", "check for new cgroups every", cgroup_check_for_new_every);
if(cgroup_check_for_new_every < cgroup_update_every)
cgroup_check_for_new_every = cgroup_update_every;
@@ -418,6 +413,8 @@ void read_cgroup_plugin_configuration() {
" !*/init.scope " // ignore init.scope
" !/system.slice/run-*.scope " // ignore system.slice/run-XXXX.scope
+ " *user.slice/docker-*" // allow docker rootless containers
+ " !*user.slice*" // ignore the rest stuff in user.slice
" *.scope " // we need all other *.scope for sure
// ----------------------------------------------------------------
@@ -452,6 +449,7 @@ void read_cgroup_plugin_configuration() {
" !/lxc.monitor* "
" !/lxc.pivot "
" !/lxc.payload "
+ " !*lxcfs.service/.control"
" !/machine "
" !/qemu "
" !/system "
@@ -474,7 +472,6 @@ void read_cgroup_plugin_configuration() {
" !/system "
" !/systemd "
" !/user "
- " !/user.slice "
" !/lxc/*/* " // #2161 #2649
" !/lxc.monitor "
" !/lxc.payload/*/* "
@@ -526,63 +523,6 @@ void read_cgroup_plugin_configuration() {
mountinfo_free_all(root);
}
-void netdata_cgroup_ebpf_set_values(size_t length)
-{
- sem_wait(shm_mutex_cgroup_ebpf);
-
- shm_cgroup_ebpf.header->cgroup_max = cgroup_root_max;
- shm_cgroup_ebpf.header->systemd_enabled = cgroup_enable_systemd_services |
- cgroup_enable_systemd_services_detailed_memory |
- cgroup_used_memory;
- shm_cgroup_ebpf.header->body_length = length;
-
- sem_post(shm_mutex_cgroup_ebpf);
-}
-
-void netdata_cgroup_ebpf_initialize_shm()
-{
- shm_fd_cgroup_ebpf = shm_open(NETDATA_SHARED_MEMORY_EBPF_CGROUP_NAME, O_CREAT | O_RDWR, 0660);
- if (shm_fd_cgroup_ebpf < 0) {
- collector_error("Cannot initialize shared memory used by cgroup and eBPF, integration won't happen.");
- return;
- }
-
- size_t length = sizeof(netdata_ebpf_cgroup_shm_header_t) + cgroup_root_max * sizeof(netdata_ebpf_cgroup_shm_body_t);
- if (ftruncate(shm_fd_cgroup_ebpf, length)) {
- collector_error("Cannot set size for shared memory.");
- goto end_init_shm;
- }
-
- shm_cgroup_ebpf.header = (netdata_ebpf_cgroup_shm_header_t *) mmap(NULL, length,
- PROT_READ | PROT_WRITE, MAP_SHARED,
- shm_fd_cgroup_ebpf, 0);
-
- if (unlikely(MAP_FAILED == shm_cgroup_ebpf.header)) {
- shm_cgroup_ebpf.header = NULL;
- collector_error("Cannot map shared memory used between cgroup and eBPF, integration won't happen");
- goto end_init_shm;
- }
- shm_cgroup_ebpf.body = (netdata_ebpf_cgroup_shm_body_t *) ((char *)shm_cgroup_ebpf.header +
- sizeof(netdata_ebpf_cgroup_shm_header_t));
-
- shm_mutex_cgroup_ebpf = sem_open(NETDATA_NAMED_SEMAPHORE_EBPF_CGROUP_NAME, O_CREAT,
- S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH, 1);
-
- if (shm_mutex_cgroup_ebpf != SEM_FAILED) {
- netdata_cgroup_ebpf_set_values(length);
- return;
- }
-
- collector_error("Cannot create semaphore, integration between eBPF and cgroup won't happen");
- munmap(shm_cgroup_ebpf.header, length);
- shm_cgroup_ebpf.header = NULL;
-
-end_init_shm:
- close(shm_fd_cgroup_ebpf);
- shm_fd_cgroup_ebpf = -1;
- shm_unlink(NETDATA_SHARED_MEMORY_EBPF_CGROUP_NAME);
-}
-
// ---------------------------------------------------------------------------------------------
static unsigned long long calc_delta(unsigned long long curr, unsigned long long prev) {
@@ -1280,12 +1220,12 @@ cpu_limits2_err:
static inline int update_memory_limits(struct cgroup *cg) {
char **filename = &cg->filename_memory_limit;
- const RRDSETVAR_ACQUIRED **chart_var = &cg->chart_var_memory_limit;
+ const RRDVAR_ACQUIRED **chart_var = &cg->chart_var_memory_limit;
unsigned long long *value = &cg->memory_limit;
if(*filename) {
if(unlikely(!*chart_var)) {
- *chart_var = rrdsetvar_custom_chart_variable_add_and_acquire(cg->st_mem_usage, "memory_limit");
+ *chart_var = rrdvar_chart_variable_add_and_acquire(cg->st_mem_usage, "memory_limit");
if(!*chart_var) {
collector_error("Cannot create cgroup %s chart variable '%s'. Will not update its limit anymore.", cg->id, "memory_limit");
freez(*filename);
@@ -1301,12 +1241,13 @@ static inline int update_memory_limits(struct cgroup *cg) {
*filename = NULL;
}
else {
- rrdsetvar_custom_chart_variable_set(cg->st_mem_usage, *chart_var, (NETDATA_DOUBLE)(*value) / (1024.0 * 1024.0));
+ rrdvar_chart_variable_set(
+ cg->st_mem_usage, *chart_var, (NETDATA_DOUBLE)(*value) / (1024.0 * 1024.0));
return 1;
}
} else {
- char buffer[30 + 1];
- int ret = read_file(*filename, buffer, 30);
+ char buffer[32];
+ int ret = read_txt_file(*filename, buffer, sizeof(buffer));
if(ret) {
collector_error("Cannot refresh cgroup %s memory limit by reading '%s'. Will not update its limit anymore.", cg->id, *filename);
freez(*filename);
@@ -1316,11 +1257,12 @@ static inline int update_memory_limits(struct cgroup *cg) {
char *s = "max\n\0";
if(strcmp(s, buffer) == 0){
*value = UINT64_MAX;
- rrdsetvar_custom_chart_variable_set(cg->st_mem_usage, *chart_var, (NETDATA_DOUBLE)(*value) / (1024.0 * 1024.0));
+ rrdvar_chart_variable_set(
+ cg->st_mem_usage, *chart_var, (NETDATA_DOUBLE)(*value) / (1024.0 * 1024.0));
return 1;
}
*value = str2ull(buffer, NULL);
- rrdsetvar_custom_chart_variable_set(cg->st_mem_usage, *chart_var, (NETDATA_DOUBLE)(*value) / (1024.0 * 1024.0));
+ rrdvar_chart_variable_set(cg->st_mem_usage, *chart_var, (NETDATA_DOUBLE)(*value) / (1024.0 * 1024.0));
return 1;
}
}
@@ -1398,7 +1340,7 @@ void update_cgroup_charts() {
}
if(unlikely(!cg->chart_var_cpu_limit)) {
- cg->chart_var_cpu_limit = rrdsetvar_custom_chart_variable_add_and_acquire(cg->st_cpu, "cpu_limit");
+ cg->chart_var_cpu_limit = rrdvar_chart_variable_add_and_acquire(cg->st_cpu, "cpu_limit");
if(!cg->chart_var_cpu_limit) {
collector_error("Cannot create cgroup %s chart variable 'cpu_limit'. Will not update its limit anymore.", cg->id);
if(cg->filename_cpuset_cpus) freez(cg->filename_cpuset_cpus);
@@ -1428,7 +1370,7 @@ void update_cgroup_charts() {
rrdset_is_obsolete___safe_from_collector_thread(cg->st_cpu_limit);
cg->st_cpu_limit = NULL;
}
- rrdsetvar_custom_chart_variable_set(cg->st_cpu, cg->chart_var_cpu_limit, NAN);
+ rrdvar_chart_variable_set(cg->st_cpu, cg->chart_var_cpu_limit, NAN);
}
}
}
@@ -1592,19 +1534,6 @@ static void cgroup_main_cleanup(void *ptr) {
}
}
- if (shm_mutex_cgroup_ebpf != SEM_FAILED) {
- sem_close(shm_mutex_cgroup_ebpf);
- }
-
- if (shm_cgroup_ebpf.header) {
- shm_cgroup_ebpf.header->cgroup_root_count = 0;
- munmap(shm_cgroup_ebpf.header, shm_cgroup_ebpf.header->body_length);
- }
-
- if (shm_fd_cgroup_ebpf > 0) {
- close(shm_fd_cgroup_ebpf);
- }
-
static_thread->enabled = NETDATA_MAIN_THREAD_EXITED;
}
@@ -1641,8 +1570,6 @@ void *cgroups_main(void *ptr) {
cgroup_read_host_total_ram();
- netdata_cgroup_ebpf_initialize_shm();
-
if (uv_mutex_init(&cgroup_root_mutex)) {
collector_error("CGROUP: cannot initialize mutex for the main cgroup list");
goto exit;
@@ -1669,10 +1596,17 @@ void *cgroups_main(void *ptr) {
// we register this only on localhost
// for the other nodes, the origin server should register it
- rrd_collector_started(); // this creates a collector that runs for as long as netdata runs
cgroup_netdev_link_init();
- rrd_function_add(localhost, NULL, "containers-vms", 10, RRDFUNCTIONS_CGTOP_HELP, true, cgroup_function_cgroup_top, NULL);
- rrd_function_add(localhost, NULL, "systemd-services", 10, RRDFUNCTIONS_CGTOP_HELP, true, cgroup_function_systemd_top, NULL);
+
+ rrd_function_add_inline(localhost, NULL, "containers-vms", 10,
+ RRDFUNCTIONS_PRIORITY_DEFAULT / 2, RRDFUNCTIONS_CGTOP_HELP,
+ "top", HTTP_ACCESS_ANONYMOUS_DATA,
+ cgroup_function_cgroup_top);
+
+ rrd_function_add_inline(localhost, NULL, "systemd-services", 10,
+ RRDFUNCTIONS_PRIORITY_DEFAULT / 3, RRDFUNCTIONS_SYSTEMD_SERVICES_HELP,
+ "top", HTTP_ACCESS_ANONYMOUS_DATA,
+ cgroup_function_systemd_top);
heartbeat_t hb;
heartbeat_init(&hb);