|
@@ -18,8 +18,6 @@ char *ebpf_plugin_dir = PLUGINS_DIR;
|
|
|
static char *ebpf_configured_log_dir = LOG_DIR;
|
|
|
|
|
|
char *ebpf_algorithms[] = {"absolute", "incremental"};
|
|
|
-static int thread_finished = 0;
|
|
|
-int close_ebpf_plugin = 0;
|
|
|
struct config collector_config = { .first_section = NULL,
|
|
|
.last_section = NULL,
|
|
|
.mutex = NETDATA_MUTEX_INITIALIZER,
|
|
@@ -29,7 +27,6 @@ struct config collector_config = { .first_section = NULL,
|
|
|
int running_on_kernel = 0;
|
|
|
int ebpf_nprocs;
|
|
|
int isrh = 0;
|
|
|
-uint32_t finalized_threads = 1;
|
|
|
|
|
|
pthread_mutex_t lock;
|
|
|
pthread_mutex_t collect_data_mutex;
|
|
@@ -37,132 +34,264 @@ pthread_cond_t collect_data_cond_var;
|
|
|
|
|
|
ebpf_module_t ebpf_modules[] = {
|
|
|
{ .thread_name = "process", .config_name = "process", .enabled = 0, .start_routine = ebpf_process_thread,
|
|
|
- .update_every = EBPF_DEFAULT_UPDATE_EVERY, .global_charts = 1, .apps_charts = CONFIG_BOOLEAN_NO,
|
|
|
+ .update_every = EBPF_DEFAULT_UPDATE_EVERY, .global_charts = 1, .apps_charts = NETDATA_EBPF_APPS_FLAG_NO,
|
|
|
.cgroup_charts = CONFIG_BOOLEAN_NO, .mode = MODE_ENTRY, .optional = 0,
|
|
|
.apps_routine = ebpf_process_create_apps_charts, .maps = NULL,
|
|
|
.pid_map_size = ND_EBPF_DEFAULT_PID_SIZE, .names = NULL, .cfg = &process_config,
|
|
|
.config_file = NETDATA_PROCESS_CONFIG_FILE,
|
|
|
.kernels = NETDATA_V3_10 | NETDATA_V4_14 | NETDATA_V4_16 | NETDATA_V4_18 | NETDATA_V5_4 | NETDATA_V5_10,
|
|
|
- .load = EBPF_LOAD_LEGACY, .targets = NULL},
|
|
|
+ .load = EBPF_LOAD_LEGACY, .targets = NULL, .probe_links = NULL, .objects = NULL},
|
|
|
{ .thread_name = "socket", .config_name = "socket", .enabled = 0, .start_routine = ebpf_socket_thread,
|
|
|
- .update_every = EBPF_DEFAULT_UPDATE_EVERY, .global_charts = 1, .apps_charts = CONFIG_BOOLEAN_NO,
|
|
|
+ .update_every = EBPF_DEFAULT_UPDATE_EVERY, .global_charts = 1, .apps_charts = NETDATA_EBPF_APPS_FLAG_NO,
|
|
|
.cgroup_charts = CONFIG_BOOLEAN_NO, .mode = MODE_ENTRY, .optional = 0,
|
|
|
.apps_routine = ebpf_socket_create_apps_charts, .maps = NULL,
|
|
|
.pid_map_size = ND_EBPF_DEFAULT_PID_SIZE, .names = NULL, .cfg = &socket_config,
|
|
|
.config_file = NETDATA_NETWORK_CONFIG_FILE,
|
|
|
.kernels = NETDATA_V3_10 | NETDATA_V4_14 | NETDATA_V4_16 | NETDATA_V4_18 | NETDATA_V5_4,
|
|
|
- .load = EBPF_LOAD_LEGACY, .targets = socket_targets},
|
|
|
+ .load = EBPF_LOAD_LEGACY, .targets = socket_targets, .probe_links = NULL, .objects = NULL},
|
|
|
{ .thread_name = "cachestat", .config_name = "cachestat", .enabled = 0, .start_routine = ebpf_cachestat_thread,
|
|
|
- .update_every = EBPF_DEFAULT_UPDATE_EVERY, .global_charts = 1, .apps_charts = CONFIG_BOOLEAN_NO,
|
|
|
+ .update_every = EBPF_DEFAULT_UPDATE_EVERY, .global_charts = 1, .apps_charts = NETDATA_EBPF_APPS_FLAG_NO,
|
|
|
.cgroup_charts = CONFIG_BOOLEAN_NO, .mode = MODE_ENTRY, .optional = 0,
|
|
|
.apps_routine = ebpf_cachestat_create_apps_charts, .maps = NULL,
|
|
|
.pid_map_size = ND_EBPF_DEFAULT_PID_SIZE, .names = NULL, .cfg = &cachestat_config,
|
|
|
.config_file = NETDATA_CACHESTAT_CONFIG_FILE,
|
|
|
- .kernels = NETDATA_V3_10 | NETDATA_V4_14 | NETDATA_V4_16 | NETDATA_V4_18|
|
|
|
- NETDATA_V5_4 | NETDATA_V5_15 | NETDATA_V5_16,
|
|
|
- .load = EBPF_LOAD_LEGACY, .targets = cachestat_targets},
|
|
|
+ .kernels = NETDATA_V3_10 | NETDATA_V4_14 | NETDATA_V4_16 | NETDATA_V4_18| NETDATA_V5_4 | NETDATA_V5_15 |
|
|
|
+ NETDATA_V5_16,
|
|
|
+ .load = EBPF_LOAD_LEGACY, .targets = cachestat_targets, .probe_links = NULL, .objects = NULL},
|
|
|
{ .thread_name = "sync", .config_name = "sync", .enabled = 0, .start_routine = ebpf_sync_thread,
|
|
|
- .update_every = EBPF_DEFAULT_UPDATE_EVERY, .global_charts = 1, .apps_charts = CONFIG_BOOLEAN_NO,
|
|
|
+ .update_every = EBPF_DEFAULT_UPDATE_EVERY, .global_charts = 1, .apps_charts = NETDATA_EBPF_APPS_FLAG_NO,
|
|
|
.cgroup_charts = CONFIG_BOOLEAN_NO, .mode = MODE_ENTRY, .optional = 0, .apps_routine = NULL, .maps = NULL,
|
|
|
.pid_map_size = ND_EBPF_DEFAULT_PID_SIZE, .names = NULL, .cfg = &sync_config,
|
|
|
.config_file = NETDATA_SYNC_CONFIG_FILE,
|
|
|
// All syscalls have the same kernels
|
|
|
.kernels = NETDATA_V3_10 | NETDATA_V4_14 | NETDATA_V4_16 | NETDATA_V4_18 | NETDATA_V5_4,
|
|
|
- .load = EBPF_LOAD_LEGACY, .targets = sync_targets},
|
|
|
+ .load = EBPF_LOAD_LEGACY, .targets = sync_targets, .probe_links = NULL, .objects = NULL},
|
|
|
{ .thread_name = "dc", .config_name = "dc", .enabled = 0, .start_routine = ebpf_dcstat_thread,
|
|
|
- .update_every = EBPF_DEFAULT_UPDATE_EVERY, .global_charts = 1, .apps_charts = CONFIG_BOOLEAN_NO,
|
|
|
+ .update_every = EBPF_DEFAULT_UPDATE_EVERY, .global_charts = 1, .apps_charts = NETDATA_EBPF_APPS_FLAG_NO,
|
|
|
.cgroup_charts = CONFIG_BOOLEAN_NO, .mode = MODE_ENTRY, .optional = 0,
|
|
|
.apps_routine = ebpf_dcstat_create_apps_charts, .maps = NULL,
|
|
|
.pid_map_size = ND_EBPF_DEFAULT_PID_SIZE, .names = NULL, .cfg = &dcstat_config,
|
|
|
.config_file = NETDATA_DIRECTORY_DCSTAT_CONFIG_FILE,
|
|
|
.kernels = NETDATA_V3_10 | NETDATA_V4_14 | NETDATA_V4_16 | NETDATA_V4_18 | NETDATA_V5_4,
|
|
|
- .load = EBPF_LOAD_LEGACY, .targets = dc_targets},
|
|
|
+ .load = EBPF_LOAD_LEGACY, .targets = dc_targets, .probe_links = NULL, .objects = NULL},
|
|
|
{ .thread_name = "swap", .config_name = "swap", .enabled = 0, .start_routine = ebpf_swap_thread,
|
|
|
- .update_every = EBPF_DEFAULT_UPDATE_EVERY, .global_charts = 1, .apps_charts = CONFIG_BOOLEAN_NO,
|
|
|
+ .update_every = EBPF_DEFAULT_UPDATE_EVERY, .global_charts = 1, .apps_charts = NETDATA_EBPF_APPS_FLAG_NO,
|
|
|
.cgroup_charts = CONFIG_BOOLEAN_NO, .mode = MODE_ENTRY, .optional = 0,
|
|
|
.apps_routine = ebpf_swap_create_apps_charts, .maps = NULL,
|
|
|
.pid_map_size = ND_EBPF_DEFAULT_PID_SIZE, .names = NULL, .cfg = &swap_config,
|
|
|
.config_file = NETDATA_DIRECTORY_SWAP_CONFIG_FILE,
|
|
|
.kernels = NETDATA_V3_10 | NETDATA_V4_14 | NETDATA_V4_16 | NETDATA_V4_18 | NETDATA_V5_4,
|
|
|
- .load = EBPF_LOAD_LEGACY, .targets = swap_targets},
|
|
|
+ .load = EBPF_LOAD_LEGACY, .targets = swap_targets, .probe_links = NULL, .objects = NULL},
|
|
|
{ .thread_name = "vfs", .config_name = "vfs", .enabled = 0, .start_routine = ebpf_vfs_thread,
|
|
|
- .update_every = EBPF_DEFAULT_UPDATE_EVERY, .global_charts = 1, .apps_charts = CONFIG_BOOLEAN_NO,
|
|
|
+ .update_every = EBPF_DEFAULT_UPDATE_EVERY, .global_charts = 1, .apps_charts = NETDATA_EBPF_APPS_FLAG_NO,
|
|
|
.cgroup_charts = CONFIG_BOOLEAN_NO, .mode = MODE_ENTRY, .optional = 0,
|
|
|
.apps_routine = ebpf_vfs_create_apps_charts, .maps = NULL,
|
|
|
.pid_map_size = ND_EBPF_DEFAULT_PID_SIZE, .names = NULL, .cfg = &vfs_config,
|
|
|
.config_file = NETDATA_DIRECTORY_VFS_CONFIG_FILE,
|
|
|
.kernels = NETDATA_V3_10 | NETDATA_V4_14 | NETDATA_V4_16 | NETDATA_V4_18 | NETDATA_V5_4,
|
|
|
- .load = EBPF_LOAD_LEGACY, .targets = NULL},
|
|
|
+ .load = EBPF_LOAD_LEGACY, .targets = NULL, .probe_links = NULL, .objects = NULL},
|
|
|
{ .thread_name = "filesystem", .config_name = "filesystem", .enabled = 0, .start_routine = ebpf_filesystem_thread,
|
|
|
- .update_every = EBPF_DEFAULT_UPDATE_EVERY, .global_charts = 1, .apps_charts = CONFIG_BOOLEAN_NO,
|
|
|
+ .update_every = EBPF_DEFAULT_UPDATE_EVERY, .global_charts = 1, .apps_charts = NETDATA_EBPF_APPS_FLAG_NO,
|
|
|
.cgroup_charts = CONFIG_BOOLEAN_NO, .mode = MODE_ENTRY, .optional = 0, .apps_routine = NULL, .maps = NULL,
|
|
|
.pid_map_size = ND_EBPF_DEFAULT_PID_SIZE, .names = NULL, .cfg = &fs_config,
|
|
|
.config_file = NETDATA_FILESYSTEM_CONFIG_FILE,
|
|
|
//We are setting kernels as zero, because we load eBPF programs according the kernel running.
|
|
|
- .kernels = 0, .load = EBPF_LOAD_LEGACY, .targets = NULL },
|
|
|
+ .kernels = 0, .load = EBPF_LOAD_LEGACY, .targets = NULL, .probe_links = NULL, .objects = NULL },
|
|
|
{ .thread_name = "disk", .config_name = "disk", .enabled = 0, .start_routine = ebpf_disk_thread,
|
|
|
- .update_every = EBPF_DEFAULT_UPDATE_EVERY, .global_charts = 1, .apps_charts = CONFIG_BOOLEAN_NO,
|
|
|
+ .update_every = EBPF_DEFAULT_UPDATE_EVERY, .global_charts = 1, .apps_charts = NETDATA_EBPF_APPS_FLAG_NO,
|
|
|
.cgroup_charts = CONFIG_BOOLEAN_NO, .mode = MODE_ENTRY, .optional = 0, .apps_routine = NULL, .maps = NULL,
|
|
|
.pid_map_size = ND_EBPF_DEFAULT_PID_SIZE, .names = NULL, .cfg = &disk_config,
|
|
|
.config_file = NETDATA_DISK_CONFIG_FILE,
|
|
|
.kernels = NETDATA_V3_10 | NETDATA_V4_14 | NETDATA_V4_16 | NETDATA_V4_18 | NETDATA_V5_4,
|
|
|
- .load = EBPF_LOAD_LEGACY, .targets = NULL},
|
|
|
+ .load = EBPF_LOAD_LEGACY, .targets = NULL, .probe_links = NULL, .objects = NULL},
|
|
|
{ .thread_name = "mount", .config_name = "mount", .enabled = 0, .start_routine = ebpf_mount_thread,
|
|
|
- .update_every = EBPF_DEFAULT_UPDATE_EVERY, .global_charts = 1, .apps_charts = CONFIG_BOOLEAN_NO,
|
|
|
+ .update_every = EBPF_DEFAULT_UPDATE_EVERY, .global_charts = 1, .apps_charts = NETDATA_EBPF_APPS_FLAG_NO,
|
|
|
.cgroup_charts = CONFIG_BOOLEAN_NO, .mode = MODE_ENTRY, .optional = 0, .apps_routine = NULL, .maps = NULL,
|
|
|
.pid_map_size = ND_EBPF_DEFAULT_PID_SIZE, .names = NULL, .cfg = &mount_config,
|
|
|
.config_file = NETDATA_MOUNT_CONFIG_FILE,
|
|
|
.kernels = NETDATA_V3_10 | NETDATA_V4_14 | NETDATA_V4_16 | NETDATA_V4_18 | NETDATA_V5_4,
|
|
|
- .load = EBPF_LOAD_LEGACY, .targets = mount_targets},
|
|
|
+ .load = EBPF_LOAD_LEGACY, .targets = mount_targets, .probe_links = NULL, .objects = NULL},
|
|
|
{ .thread_name = "fd", .config_name = "fd", .enabled = 0, .start_routine = ebpf_fd_thread,
|
|
|
- .update_every = EBPF_DEFAULT_UPDATE_EVERY, .global_charts = 1, .apps_charts = CONFIG_BOOLEAN_NO,
|
|
|
+ .update_every = EBPF_DEFAULT_UPDATE_EVERY, .global_charts = 1, .apps_charts = NETDATA_EBPF_APPS_FLAG_NO,
|
|
|
.cgroup_charts = CONFIG_BOOLEAN_NO, .mode = MODE_ENTRY, .optional = 0,
|
|
|
.apps_routine = ebpf_fd_create_apps_charts, .maps = NULL,
|
|
|
.pid_map_size = ND_EBPF_DEFAULT_PID_SIZE, .names = NULL, .cfg = &fd_config,
|
|
|
.config_file = NETDATA_FD_CONFIG_FILE,
|
|
|
.kernels = NETDATA_V3_10 | NETDATA_V4_14 | NETDATA_V4_16 | NETDATA_V4_18 | NETDATA_V5_4 | NETDATA_V5_11,
|
|
|
- .load = EBPF_LOAD_LEGACY, .targets = NULL},
|
|
|
+ .load = EBPF_LOAD_LEGACY, .targets = NULL, .probe_links = NULL, .objects = NULL},
|
|
|
{ .thread_name = "hardirq", .config_name = "hardirq", .enabled = 0, .start_routine = ebpf_hardirq_thread,
|
|
|
- .update_every = EBPF_DEFAULT_UPDATE_EVERY, .global_charts = 1, .apps_charts = CONFIG_BOOLEAN_NO,
|
|
|
+ .update_every = EBPF_DEFAULT_UPDATE_EVERY, .global_charts = 1, .apps_charts = NETDATA_EBPF_APPS_FLAG_NO,
|
|
|
.cgroup_charts = CONFIG_BOOLEAN_NO, .mode = MODE_ENTRY, .optional = 0, .apps_routine = NULL, .maps = NULL,
|
|
|
.pid_map_size = ND_EBPF_DEFAULT_PID_SIZE, .names = NULL, .cfg = &hardirq_config,
|
|
|
.config_file = NETDATA_HARDIRQ_CONFIG_FILE,
|
|
|
.kernels = NETDATA_V3_10 | NETDATA_V4_14 | NETDATA_V4_16 | NETDATA_V4_18 | NETDATA_V5_4,
|
|
|
- .load = EBPF_LOAD_LEGACY, .targets = NULL},
|
|
|
+ .load = EBPF_LOAD_LEGACY, .targets = NULL, .probe_links = NULL, .objects = NULL},
|
|
|
{ .thread_name = "softirq", .config_name = "softirq", .enabled = 0, .start_routine = ebpf_softirq_thread,
|
|
|
- .update_every = EBPF_DEFAULT_UPDATE_EVERY, .global_charts = 1, .apps_charts = CONFIG_BOOLEAN_NO,
|
|
|
+ .update_every = EBPF_DEFAULT_UPDATE_EVERY, .global_charts = 1, .apps_charts = NETDATA_EBPF_APPS_FLAG_NO,
|
|
|
.cgroup_charts = CONFIG_BOOLEAN_NO, .mode = MODE_ENTRY, .optional = 0, .apps_routine = NULL, .maps = NULL,
|
|
|
.pid_map_size = ND_EBPF_DEFAULT_PID_SIZE, .names = NULL, .cfg = &softirq_config,
|
|
|
.config_file = NETDATA_SOFTIRQ_CONFIG_FILE,
|
|
|
.kernels = NETDATA_V3_10 | NETDATA_V4_14 | NETDATA_V4_16 | NETDATA_V4_18 | NETDATA_V5_4,
|
|
|
- .load = EBPF_LOAD_LEGACY, .targets = NULL},
|
|
|
+ .load = EBPF_LOAD_LEGACY, .targets = NULL, .probe_links = NULL, .objects = NULL},
|
|
|
{ .thread_name = "oomkill", .config_name = "oomkill", .enabled = 0, .start_routine = ebpf_oomkill_thread,
|
|
|
- .update_every = EBPF_DEFAULT_UPDATE_EVERY, .global_charts = 1, .apps_charts = CONFIG_BOOLEAN_NO,
|
|
|
+ .update_every = EBPF_DEFAULT_UPDATE_EVERY, .global_charts = 1, .apps_charts = NETDATA_EBPF_APPS_FLAG_NO,
|
|
|
.cgroup_charts = CONFIG_BOOLEAN_NO, .mode = MODE_ENTRY, .optional = 0,
|
|
|
.apps_routine = ebpf_oomkill_create_apps_charts, .maps = NULL,
|
|
|
.pid_map_size = ND_EBPF_DEFAULT_PID_SIZE, .names = NULL, .cfg = &oomkill_config,
|
|
|
.config_file = NETDATA_OOMKILL_CONFIG_FILE,
|
|
|
.kernels = NETDATA_V3_10 | NETDATA_V4_14 | NETDATA_V4_16 | NETDATA_V4_18 | NETDATA_V5_4,
|
|
|
- .load = EBPF_LOAD_LEGACY, .targets = NULL},
|
|
|
+ .load = EBPF_LOAD_LEGACY, .targets = NULL, .probe_links = NULL, .objects = NULL},
|
|
|
{ .thread_name = "shm", .config_name = "shm", .enabled = 0, .start_routine = ebpf_shm_thread,
|
|
|
- .update_every = EBPF_DEFAULT_UPDATE_EVERY, .global_charts = 1, .apps_charts = CONFIG_BOOLEAN_NO,
|
|
|
+ .update_every = EBPF_DEFAULT_UPDATE_EVERY, .global_charts = 1, .apps_charts = NETDATA_EBPF_APPS_FLAG_NO,
|
|
|
.cgroup_charts = CONFIG_BOOLEAN_NO, .mode = MODE_ENTRY, .optional = 0,
|
|
|
.apps_routine = ebpf_shm_create_apps_charts, .maps = NULL,
|
|
|
.pid_map_size = ND_EBPF_DEFAULT_PID_SIZE, .names = NULL, .cfg = &shm_config,
|
|
|
.config_file = NETDATA_DIRECTORY_SHM_CONFIG_FILE,
|
|
|
.kernels = NETDATA_V3_10 | NETDATA_V4_14 | NETDATA_V4_16 | NETDATA_V4_18 | NETDATA_V5_4,
|
|
|
- .load = EBPF_LOAD_LEGACY, .targets = shm_targets},
|
|
|
+ .load = EBPF_LOAD_LEGACY, .targets = shm_targets, .probe_links = NULL, .objects = NULL},
|
|
|
{ .thread_name = "mdflush", .config_name = "mdflush", .enabled = 0, .start_routine = ebpf_mdflush_thread,
|
|
|
- .update_every = EBPF_DEFAULT_UPDATE_EVERY, .global_charts = 1, .apps_charts = CONFIG_BOOLEAN_NO,
|
|
|
+ .update_every = EBPF_DEFAULT_UPDATE_EVERY, .global_charts = 1, .apps_charts = NETDATA_EBPF_APPS_FLAG_NO,
|
|
|
.cgroup_charts = CONFIG_BOOLEAN_NO, .mode = MODE_ENTRY, .optional = 0, .apps_routine = NULL, .maps = NULL,
|
|
|
.pid_map_size = ND_EBPF_DEFAULT_PID_SIZE, .names = NULL, .cfg = &mdflush_config,
|
|
|
.config_file = NETDATA_DIRECTORY_MDFLUSH_CONFIG_FILE,
|
|
|
.kernels = NETDATA_V3_10 | NETDATA_V4_14 | NETDATA_V4_16 | NETDATA_V4_18 | NETDATA_V5_4,
|
|
|
- .load = EBPF_LOAD_LEGACY, .targets = NULL},
|
|
|
+ .load = EBPF_LOAD_LEGACY, .targets = NULL, .probe_links = NULL, .objects = NULL},
|
|
|
{ .thread_name = NULL, .enabled = 0, .start_routine = NULL, .update_every = EBPF_DEFAULT_UPDATE_EVERY,
|
|
|
- .global_charts = 0, .apps_charts = CONFIG_BOOLEAN_NO, .cgroup_charts = CONFIG_BOOLEAN_NO,
|
|
|
+ .global_charts = 0, .apps_charts = NETDATA_EBPF_APPS_FLAG_NO, .cgroup_charts = CONFIG_BOOLEAN_NO,
|
|
|
.mode = MODE_ENTRY, .optional = 0, .apps_routine = NULL, .maps = NULL, .pid_map_size = 0, .names = NULL,
|
|
|
- .cfg = NULL, .config_name = NULL, .kernels = 0, .load = EBPF_LOAD_LEGACY, .targets = NULL},
|
|
|
+ .cfg = NULL, .config_name = NULL, .kernels = 0, .load = EBPF_LOAD_LEGACY, .targets = NULL, .probe_links = NULL,
|
|
|
+ .objects = NULL},
|
|
|
+};
|
|
|
+
|
|
|
+struct netdata_static_thread ebpf_threads[] = {
|
|
|
+ {"EBPF PROCESS", NULL, NULL, 1,
|
|
|
+ NULL, NULL, NULL},
|
|
|
+ {"EBPF SOCKET" , NULL, NULL, 1,
|
|
|
+ NULL, NULL, NULL},
|
|
|
+ {"EBPF CACHESTAT" , NULL, NULL, 1,
|
|
|
+ NULL, NULL, NULL},
|
|
|
+ {"EBPF SYNC" , NULL, NULL, 1,
|
|
|
+ NULL, NULL, NULL},
|
|
|
+ {"EBPF DCSTAT" , NULL, NULL, 1,
|
|
|
+ NULL, NULL, NULL},
|
|
|
+ {"EBPF SWAP" , NULL, NULL, 1,
|
|
|
+ NULL, NULL, NULL},
|
|
|
+ {"EBPF VFS" , NULL, NULL, 1,
|
|
|
+ NULL, NULL, NULL},
|
|
|
+ {"EBPF FILESYSTEM" , NULL, NULL, 1,
|
|
|
+ NULL, NULL, NULL},
|
|
|
+ {"EBPF DISK" , NULL, NULL, 1,
|
|
|
+ NULL, NULL, NULL},
|
|
|
+ {"EBPF MOUNT" , NULL, NULL, 1,
|
|
|
+ NULL, NULL, NULL},
|
|
|
+ {"EBPF FD" , NULL, NULL, 1,
|
|
|
+ NULL, NULL, NULL},
|
|
|
+ {"EBPF HARDIRQ" , NULL, NULL, 1,
|
|
|
+ NULL, NULL, NULL},
|
|
|
+ {"EBPF SOFTIRQ" , NULL, NULL, 1,
|
|
|
+ NULL, NULL, NULL},
|
|
|
+ {"EBPF OOMKILL" , NULL, NULL, 1,
|
|
|
+ NULL, NULL, NULL},
|
|
|
+ {"EBPF SHM" , NULL, NULL, 1,
|
|
|
+ NULL, NULL, NULL},
|
|
|
+ {"EBPF MDFLUSH" , NULL, NULL, 1,
|
|
|
+ NULL, NULL, NULL},
|
|
|
+ {NULL , NULL, NULL, 0,
|
|
|
+ NULL, NULL, NULL}
|
|
|
+};
|
|
|
+
|
|
|
+ebpf_filesystem_partitions_t localfs[] =
|
|
|
+ {{.filesystem = "ext4",
|
|
|
+ .optional_filesystem = NULL,
|
|
|
+ .family = "ext4",
|
|
|
+ .objects = NULL,
|
|
|
+ .probe_links = NULL,
|
|
|
+ .flags = NETDATA_FILESYSTEM_FLAG_NO_PARTITION,
|
|
|
+ .enabled = CONFIG_BOOLEAN_YES,
|
|
|
+ .addresses = {.function = NULL, .addr = 0},
|
|
|
+ .kernels = NETDATA_V3_10 | NETDATA_V4_14 | NETDATA_V4_16 | NETDATA_V4_18 | NETDATA_V5_4},
|
|
|
+ {.filesystem = "xfs",
|
|
|
+ .optional_filesystem = NULL,
|
|
|
+ .family = "xfs",
|
|
|
+ .objects = NULL,
|
|
|
+ .probe_links = NULL,
|
|
|
+ .flags = NETDATA_FILESYSTEM_FLAG_NO_PARTITION,
|
|
|
+ .enabled = CONFIG_BOOLEAN_YES,
|
|
|
+ .addresses = {.function = NULL, .addr = 0},
|
|
|
+ .kernels = NETDATA_V3_10 | NETDATA_V4_14 | NETDATA_V4_16 | NETDATA_V4_18 | NETDATA_V5_4},
|
|
|
+ {.filesystem = "nfs",
|
|
|
+ .optional_filesystem = "nfs4",
|
|
|
+ .family = "nfs",
|
|
|
+ .objects = NULL,
|
|
|
+ .probe_links = NULL,
|
|
|
+ .flags = NETDATA_FILESYSTEM_ATTR_CHARTS,
|
|
|
+ .enabled = CONFIG_BOOLEAN_YES,
|
|
|
+ .addresses = {.function = NULL, .addr = 0},
|
|
|
+ .kernels = NETDATA_V3_10 | NETDATA_V4_14 | NETDATA_V4_16 | NETDATA_V4_18 | NETDATA_V5_4},
|
|
|
+ {.filesystem = "zfs",
|
|
|
+ .optional_filesystem = NULL,
|
|
|
+ .family = "zfs",
|
|
|
+ .objects = NULL,
|
|
|
+ .probe_links = NULL,
|
|
|
+ .flags = NETDATA_FILESYSTEM_FLAG_NO_PARTITION,
|
|
|
+ .enabled = CONFIG_BOOLEAN_YES,
|
|
|
+ .addresses = {.function = NULL, .addr = 0},
|
|
|
+ .kernels = NETDATA_V3_10 | NETDATA_V4_14 | NETDATA_V4_16 | NETDATA_V4_18 | NETDATA_V5_4},
|
|
|
+ {.filesystem = "btrfs",
|
|
|
+ .optional_filesystem = NULL,
|
|
|
+ .family = "btrfs",
|
|
|
+ .objects = NULL,
|
|
|
+ .probe_links = NULL,
|
|
|
+ .flags = NETDATA_FILESYSTEM_FILL_ADDRESS_TABLE,
|
|
|
+ .enabled = CONFIG_BOOLEAN_YES,
|
|
|
+ .addresses = {.function = "btrfs_file_operations", .addr = 0},
|
|
|
+ .kernels = NETDATA_V3_10 | NETDATA_V4_14 | NETDATA_V4_16 | NETDATA_V4_18 | NETDATA_V5_4 | NETDATA_V5_10},
|
|
|
+ {.filesystem = NULL,
|
|
|
+ .optional_filesystem = NULL,
|
|
|
+ .family = NULL,
|
|
|
+ .objects = NULL,
|
|
|
+ .probe_links = NULL,
|
|
|
+ .flags = NETDATA_FILESYSTEM_FLAG_NO_PARTITION,
|
|
|
+ .enabled = CONFIG_BOOLEAN_YES,
|
|
|
+ .addresses = {.function = NULL, .addr = 0},
|
|
|
+ .kernels = 0}};
|
|
|
+
|
|
|
+ebpf_sync_syscalls_t local_syscalls[] = {
|
|
|
+ {.syscall = NETDATA_SYSCALLS_SYNC, .enabled = CONFIG_BOOLEAN_YES, .objects = NULL, .probe_links = NULL,
|
|
|
+#ifdef LIBBPF_MAJOR_VERSION
|
|
|
+ .sync_obj = NULL
|
|
|
+#endif
|
|
|
+ },
|
|
|
+ {.syscall = NETDATA_SYSCALLS_SYNCFS, .enabled = CONFIG_BOOLEAN_YES, .objects = NULL, .probe_links = NULL,
|
|
|
+#ifdef LIBBPF_MAJOR_VERSION
|
|
|
+ .sync_obj = NULL
|
|
|
+#endif
|
|
|
+ },
|
|
|
+ {.syscall = NETDATA_SYSCALLS_MSYNC, .enabled = CONFIG_BOOLEAN_YES, .objects = NULL, .probe_links = NULL,
|
|
|
+#ifdef LIBBPF_MAJOR_VERSION
|
|
|
+ .sync_obj = NULL
|
|
|
+#endif
|
|
|
+ },
|
|
|
+ {.syscall = NETDATA_SYSCALLS_FSYNC, .enabled = CONFIG_BOOLEAN_YES, .objects = NULL, .probe_links = NULL,
|
|
|
+#ifdef LIBBPF_MAJOR_VERSION
|
|
|
+ .sync_obj = NULL
|
|
|
+#endif
|
|
|
+ },
|
|
|
+ {.syscall = NETDATA_SYSCALLS_FDATASYNC, .enabled = CONFIG_BOOLEAN_YES, .objects = NULL, .probe_links = NULL,
|
|
|
+#ifdef LIBBPF_MAJOR_VERSION
|
|
|
+ .sync_obj = NULL
|
|
|
+#endif
|
|
|
+ },
|
|
|
+ {.syscall = NETDATA_SYSCALLS_SYNC_FILE_RANGE, .enabled = CONFIG_BOOLEAN_YES, .objects = NULL, .probe_links = NULL,
|
|
|
+#ifdef LIBBPF_MAJOR_VERSION
|
|
|
+ .sync_obj = NULL
|
|
|
+#endif
|
|
|
+ },
|
|
|
+ {.syscall = NULL, .enabled = CONFIG_BOOLEAN_NO, .objects = NULL, .probe_links = NULL,
|
|
|
+#ifdef LIBBPF_MAJOR_VERSION
|
|
|
+ .sync_obj = NULL
|
|
|
+#endif
|
|
|
+ }
|
|
|
};
|
|
|
|
|
|
// Link with apps.plugin
|
|
@@ -192,18 +321,6 @@ char *btf_path = NULL;
|
|
|
*
|
|
|
*****************************************************************/
|
|
|
|
|
|
-/**
|
|
|
- * Clean Loaded Events
|
|
|
- *
|
|
|
- * This function cleans the events previous loaded on Linux.
|
|
|
-void clean_loaded_events()
|
|
|
-{
|
|
|
- int event_pid;
|
|
|
- for (event_pid = 0; ebpf_modules[event_pid].probes; event_pid++)
|
|
|
- clean_kprobe_events(NULL, (int)ebpf_modules[event_pid].thread_id, ebpf_modules[event_pid].probes);
|
|
|
-}
|
|
|
- */
|
|
|
-
|
|
|
/**
|
|
|
* Close the collector gracefully
|
|
|
*
|
|
@@ -211,64 +328,89 @@ void clean_loaded_events()
|
|
|
*/
|
|
|
static void ebpf_exit(int sig)
|
|
|
{
|
|
|
- close_ebpf_plugin = 1;
|
|
|
- static int remove_pid = 0;
|
|
|
-
|
|
|
- // When both threads were not finished case I try to go in front this address, the collector will crash
|
|
|
- if (!thread_finished) {
|
|
|
- return;
|
|
|
+#ifdef LIBBPF_MAJOR_VERSION
|
|
|
+ if (default_btf) {
|
|
|
+ btf__free(default_btf);
|
|
|
+ default_btf = NULL;
|
|
|
}
|
|
|
+#endif
|
|
|
|
|
|
- ebpf_close_cgroup_shm();
|
|
|
+ char filename[FILENAME_MAX + 1];
|
|
|
+ ebpf_pid_file(filename, FILENAME_MAX);
|
|
|
+ if (unlink(filename))
|
|
|
+ error("Cannot remove PID file %s", filename);
|
|
|
|
|
|
- /*
|
|
|
- int ret = fork();
|
|
|
- if (ret < 0) // error
|
|
|
- error("Cannot fork(), so I won't be able to clean %skprobe_events", NETDATA_DEBUGFS);
|
|
|
- else if (!ret) { // child
|
|
|
- int i;
|
|
|
- for (i = getdtablesize(); i >= 0; --i)
|
|
|
- close(i);
|
|
|
+ exit(sig);
|
|
|
+}
|
|
|
|
|
|
- int fd = open("/dev/null", O_RDWR, 0);
|
|
|
- if (fd != -1) {
|
|
|
- dup2(fd, STDIN_FILENO);
|
|
|
- dup2(fd, STDOUT_FILENO);
|
|
|
- dup2(fd, STDERR_FILENO);
|
|
|
- }
|
|
|
+/**
|
|
|
+ * Unload loegacy code
|
|
|
+ *
|
|
|
+ * @param objects objects loaded from eBPF programs
|
|
|
+ * @param probe_links links from loader
|
|
|
+ */
|
|
|
+static void ebpf_unload_legacy_code(struct bpf_object *objects, struct bpf_link **probe_links)
|
|
|
+{
|
|
|
+ if (!probe_links || !objects)
|
|
|
+ return;
|
|
|
|
|
|
- if (fd > 2)
|
|
|
- close(fd);
|
|
|
+ struct bpf_program *prog;
|
|
|
+ size_t j = 0 ;
|
|
|
+ bpf_object__for_each_program(prog, objects) {
|
|
|
+ bpf_link__destroy(probe_links[j]);
|
|
|
+ j++;
|
|
|
+ }
|
|
|
+ freez(probe_links);
|
|
|
+ if (objects)
|
|
|
+ bpf_object__close(objects);
|
|
|
+}
|
|
|
|
|
|
- int sid = setsid();
|
|
|
- if (sid >= 0) {
|
|
|
- debug(D_EXIT, "Wait for father %d die", getpid());
|
|
|
- sleep_usec(200000); // Sleep 200 milliseconds to father dies.
|
|
|
- clean_loaded_events();
|
|
|
- } else {
|
|
|
- error("Cannot become session id leader, so I won't try to clean kprobe_events.\n");
|
|
|
+int ebpf_exit_plugin = 0;
|
|
|
+/**
|
|
|
+ * Close the collector gracefully
|
|
|
+ *
|
|
|
+ * @param sig is the signal number used to close the collector
|
|
|
+ */
|
|
|
+static void ebpf_stop_threads(int sig)
|
|
|
+{
|
|
|
+ ebpf_exit_plugin = 1;
|
|
|
+ int i;
|
|
|
+ for (i = 0; ebpf_threads[i].name != NULL; i++);
|
|
|
+
|
|
|
+ usec_t max = 2 * USEC_PER_SEC, step = 100000;
|
|
|
+ while (i && max) {
|
|
|
+ max -= step;
|
|
|
+ sleep_usec(step);
|
|
|
+ i = 0;
|
|
|
+ int j;
|
|
|
+ for (j = 0; ebpf_threads[j].name != NULL; j++) {
|
|
|
+ if (ebpf_threads[j].enabled != NETDATA_MAIN_THREAD_EXITED)
|
|
|
+ i++;
|
|
|
}
|
|
|
- } else { // parent
|
|
|
- exit(0);
|
|
|
}
|
|
|
- */
|
|
|
|
|
|
-#ifdef LIBBPF_MAJOR_VERSION
|
|
|
- if (default_btf) {
|
|
|
- btf__free(default_btf);
|
|
|
- default_btf = NULL;
|
|
|
+ //Unload threads(except sync and filesystem)
|
|
|
+ for (i = 0; ebpf_threads[i].name != NULL; i++) {
|
|
|
+ if (ebpf_threads[i].enabled == NETDATA_MAIN_THREAD_EXITED && i != EBPF_MODULE_FILESYSTEM_IDX &&
|
|
|
+ i != EBPF_MODULE_SYNC_IDX)
|
|
|
+ ebpf_unload_legacy_code(ebpf_modules[i].objects, ebpf_modules[i].probe_links);
|
|
|
}
|
|
|
-#endif
|
|
|
|
|
|
- if (!remove_pid) {
|
|
|
- remove_pid = 1;
|
|
|
- char filename[FILENAME_MAX + 1];
|
|
|
- ebpf_pid_file(filename, FILENAME_MAX);
|
|
|
- if (unlink(filename))
|
|
|
- error("Cannot remove PID file %s", filename);
|
|
|
+ //Unload filesystem
|
|
|
+ if (ebpf_threads[EBPF_MODULE_FILESYSTEM_IDX].enabled == NETDATA_MAIN_THREAD_EXITED) {
|
|
|
+ for (i = 0; localfs[i].filesystem != NULL; i++) {
|
|
|
+ ebpf_unload_legacy_code(localfs[i].objects, localfs[i].probe_links);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- exit(sig);
|
|
|
+ //Unload Sync
|
|
|
+ if (ebpf_threads[EBPF_MODULE_SYNC_IDX].enabled == NETDATA_MAIN_THREAD_EXITED) {
|
|
|
+ for (i = 0; local_syscalls[i].syscall != NULL; i++) {
|
|
|
+ ebpf_unload_legacy_code(local_syscalls[i].objects, local_syscalls[i].probe_links);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ ebpf_exit(sig);
|
|
|
}
|
|
|
|
|
|
/*****************************************************************
|
|
@@ -659,7 +801,7 @@ static inline void ebpf_enable_specific_chart(struct ebpf_module *em, int disabl
|
|
|
// oomkill stores data inside apps submenu, so it always need to have apps_enabled for plugin to create
|
|
|
// its chart, without this comparison eBPF.plugin will try to store invalid data when apps is disabled.
|
|
|
if (!disable_apps || !strcmp(em->thread_name, "oomkill")) {
|
|
|
- em->apps_charts = CONFIG_BOOLEAN_YES;
|
|
|
+ em->apps_charts = NETDATA_EBPF_APPS_FLAG_YES;
|
|
|
}
|
|
|
|
|
|
if (!disable_cgroup) {
|
|
@@ -724,7 +866,7 @@ static inline void ebpf_disable_apps()
|
|
|
{
|
|
|
int i;
|
|
|
for (i = 0; ebpf_modules[i].thread_name; i++) {
|
|
|
- ebpf_modules[i].apps_charts = 0;
|
|
|
+ ebpf_modules[i].apps_charts = NETDATA_EBPF_APPS_FLAG_NO;
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -1031,7 +1173,6 @@ int ebpf_start_pthread_variables()
|
|
|
pthread_mutex_init(&collect_data_mutex, NULL);
|
|
|
|
|
|
if (pthread_cond_init(&collect_data_cond_var, NULL)) {
|
|
|
- thread_finished++;
|
|
|
error("Cannot start conditional variable to control Apps charts.");
|
|
|
return -1;
|
|
|
}
|
|
@@ -1051,7 +1192,7 @@ static inline uint32_t ebpf_am_i_collect_pids()
|
|
|
uint32_t ret = 0;
|
|
|
int i;
|
|
|
for (i = 0; ebpf_modules[i].thread_name; i++) {
|
|
|
- ret |= ebpf_modules[i].cgroup_charts | ebpf_modules[i].apps_charts;
|
|
|
+ ret |= ebpf_modules[i].cgroup_charts | (ebpf_modules[i].apps_charts & NETDATA_EBPF_APPS_FLAG_YES);
|
|
|
}
|
|
|
|
|
|
return ret;
|
|
@@ -1675,7 +1816,6 @@ static void ebpf_parse_args(int argc, char **argv)
|
|
|
&apps_groups_default_target, &apps_groups_root_target, ebpf_stock_config_dir, "groups")) {
|
|
|
error("Cannot read process groups '%s/apps_groups.conf'. There are no internal defaults. Failing.",
|
|
|
ebpf_stock_config_dir);
|
|
|
- thread_finished++;
|
|
|
ebpf_exit(1);
|
|
|
}
|
|
|
} else
|
|
@@ -1831,6 +1971,19 @@ static void ebpf_manage_pid(pid_t pid)
|
|
|
ebpf_update_pid_file(filename, pid);
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * Set start routine
|
|
|
+ *
|
|
|
+ * Set static routine before threads to be created.
|
|
|
+ */
|
|
|
+ static void ebpf_set_static_routine()
|
|
|
+ {
|
|
|
+ int i;
|
|
|
+ for (i = 0; ebpf_modules[i].thread_name; i++) {
|
|
|
+ ebpf_threads[i].start_routine = ebpf_modules[i].start_routine;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* Entry point
|
|
|
*
|
|
@@ -1875,16 +2028,19 @@ int main(int argc, char **argv)
|
|
|
return 4;
|
|
|
}
|
|
|
|
|
|
- signal(SIGINT, ebpf_exit);
|
|
|
- signal(SIGTERM, ebpf_exit);
|
|
|
- signal(SIGPIPE, ebpf_exit);
|
|
|
+ signal(SIGINT, ebpf_stop_threads);
|
|
|
+ signal(SIGQUIT, ebpf_stop_threads);
|
|
|
+ signal(SIGTERM, ebpf_stop_threads);
|
|
|
+ signal(SIGPIPE, ebpf_stop_threads);
|
|
|
|
|
|
if (ebpf_start_pthread_variables()) {
|
|
|
- thread_finished++;
|
|
|
error("Cannot start mutex to control overall charts.");
|
|
|
ebpf_exit(5);
|
|
|
}
|
|
|
|
|
|
+ netdata_configured_host_prefix = getenv("NETDATA_HOST_PREFIX");
|
|
|
+ if(verify_netdata_host_prefix() == -1) ebpf_exit(6);
|
|
|
+
|
|
|
ebpf_allocate_common_vectors();
|
|
|
|
|
|
#ifdef LIBBPF_MAJOR_VERSION
|
|
@@ -1897,44 +2053,7 @@ int main(int argc, char **argv)
|
|
|
read_local_ports("/proc/net/udp", IPPROTO_UDP);
|
|
|
read_local_ports("/proc/net/udp6", IPPROTO_UDP);
|
|
|
|
|
|
- struct netdata_static_thread ebpf_threads[] = {
|
|
|
- {"EBPF PROCESS", NULL, NULL, 1,
|
|
|
- NULL, NULL, ebpf_modules[EBPF_MODULE_PROCESS_IDX].start_routine},
|
|
|
- {"EBPF SOCKET" , NULL, NULL, 1,
|
|
|
- NULL, NULL, ebpf_modules[EBPF_MODULE_SOCKET_IDX].start_routine},
|
|
|
- {"EBPF CACHESTAT" , NULL, NULL, 1,
|
|
|
- NULL, NULL, ebpf_modules[EBPF_MODULE_CACHESTAT_IDX].start_routine},
|
|
|
- {"EBPF SYNC" , NULL, NULL, 1,
|
|
|
- NULL, NULL, ebpf_modules[EBPF_MODULE_SYNC_IDX].start_routine},
|
|
|
- {"EBPF DCSTAT" , NULL, NULL, 1,
|
|
|
- NULL, NULL, ebpf_modules[EBPF_MODULE_DCSTAT_IDX].start_routine},
|
|
|
- {"EBPF SWAP" , NULL, NULL, 1,
|
|
|
- NULL, NULL, ebpf_modules[EBPF_MODULE_SWAP_IDX].start_routine},
|
|
|
- {"EBPF VFS" , NULL, NULL, 1,
|
|
|
- NULL, NULL, ebpf_modules[EBPF_MODULE_VFS_IDX].start_routine},
|
|
|
- {"EBPF FILESYSTEM" , NULL, NULL, 1,
|
|
|
- NULL, NULL, ebpf_modules[EBPF_MODULE_FILESYSTEM_IDX].start_routine},
|
|
|
- {"EBPF DISK" , NULL, NULL, 1,
|
|
|
- NULL, NULL, ebpf_modules[EBPF_MODULE_DISK_IDX].start_routine},
|
|
|
- {"EBPF MOUNT" , NULL, NULL, 1,
|
|
|
- NULL, NULL, ebpf_modules[EBPF_MODULE_MOUNT_IDX].start_routine},
|
|
|
- {"EBPF FD" , NULL, NULL, 1,
|
|
|
- NULL, NULL, ebpf_modules[EBPF_MODULE_FD_IDX].start_routine},
|
|
|
- {"EBPF HARDIRQ" , NULL, NULL, 1,
|
|
|
- NULL, NULL, ebpf_modules[EBPF_MODULE_HARDIRQ_IDX].start_routine},
|
|
|
- {"EBPF SOFTIRQ" , NULL, NULL, 1,
|
|
|
- NULL, NULL, ebpf_modules[EBPF_MODULE_SOFTIRQ_IDX].start_routine},
|
|
|
- {"EBPF OOMKILL" , NULL, NULL, 1,
|
|
|
- NULL, NULL, ebpf_modules[EBPF_MODULE_OOMKILL_IDX].start_routine},
|
|
|
- {"EBPF SHM" , NULL, NULL, 1,
|
|
|
- NULL, NULL, ebpf_modules[EBPF_MODULE_SHM_IDX].start_routine},
|
|
|
- {"EBPF MDFLUSH" , NULL, NULL, 1,
|
|
|
- NULL, NULL, ebpf_modules[EBPF_MODULE_MDFLUSH_IDX].start_routine},
|
|
|
- {NULL , NULL, NULL, 0,
|
|
|
- NULL, NULL, NULL}
|
|
|
- };
|
|
|
-
|
|
|
- //clean_loaded_events();
|
|
|
+ ebpf_set_static_routine();
|
|
|
|
|
|
int i;
|
|
|
for (i = 0; ebpf_threads[i].name != NULL; i++) {
|
|
@@ -1943,16 +2062,16 @@ int main(int argc, char **argv)
|
|
|
|
|
|
ebpf_module_t *em = &ebpf_modules[i];
|
|
|
em->thread_id = i;
|
|
|
- netdata_thread_create(st->thread, st->name, NETDATA_THREAD_OPTION_JOINABLE, st->start_routine, em);
|
|
|
+ netdata_thread_create(st->thread, st->name, NETDATA_THREAD_OPTION_DEFAULT, st->start_routine, em);
|
|
|
}
|
|
|
|
|
|
- for (i = 0; ebpf_threads[i].name != NULL; i++) {
|
|
|
- struct netdata_static_thread *st = &ebpf_threads[i];
|
|
|
- netdata_thread_join(*st->thread, NULL);
|
|
|
+ usec_t step = 60 * USEC_PER_SEC;
|
|
|
+ heartbeat_t hb;
|
|
|
+ heartbeat_init(&hb);
|
|
|
+ //Plugin will be killed when it receives a signal
|
|
|
+ for (;;) {
|
|
|
+ (void)heartbeat_next(&hb, step);
|
|
|
}
|
|
|
|
|
|
- thread_finished++;
|
|
|
- ebpf_exit(0);
|
|
|
-
|
|
|
return 0;
|
|
|
}
|