mirror of
https://github.com/netdata/netdata.git
synced 2025-05-01 07:59:52 +00:00
parent
45bf6721ae
commit
2881c3e5a1
2 changed files with 67 additions and 6 deletions
collectors/cgroups.plugin
|
@ -60,7 +60,7 @@ fatal() {
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
debug=0
|
debug=${NETDATA_CGROUP_NETWORK_HELPER_DEBUG=0}
|
||||||
debug() {
|
debug() {
|
||||||
[ "${debug}" = "1" ] && log DEBUG "${@}"
|
[ "${debug}" = "1" ] && log DEBUG "${@}"
|
||||||
}
|
}
|
||||||
|
@ -132,6 +132,8 @@ find_tun_tap_interfaces_for_cgroup() {
|
||||||
do
|
do
|
||||||
proc_pid_fdinfo_iff "${p}"
|
proc_pid_fdinfo_iff "${p}"
|
||||||
done
|
done
|
||||||
|
else
|
||||||
|
debug "Cannot find file '${c}/emulator/cgroup.procs', not searching for tun/tap interfaces."
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -184,6 +186,39 @@ virsh_find_all_interfaces_for_cgroup() {
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
# netnsid detected interfaces
|
||||||
|
|
||||||
|
netnsid_find_all_interfaces_for_pid() {
|
||||||
|
local pid="${1}"
|
||||||
|
[ -z "${pid}" ] && return 1
|
||||||
|
|
||||||
|
local nsid=$(lsns -t net -p ${pid} -o NETNSID -nr)
|
||||||
|
[ -z "${nsid}" -o "${nsid}" = "unassigned" ] && return 1
|
||||||
|
|
||||||
|
set_source "netnsid"
|
||||||
|
ip link show |\
|
||||||
|
grep -B 1 -E " link-netnsid ${nsid}($| )" |\
|
||||||
|
ip link show | grep -B 1 -E " link-netnsid ${nsid}($| )" | sed -n -e "s|^[[:space:]]*[0-9]\+:[[:space:]]\+\([A-Za-z0-9_]\+\)\(@[A-Za-z0-9_]\+\)*:[[:space:]].*$|\1|p"
|
||||||
|
}
|
||||||
|
|
||||||
|
netnsid_find_all_interfaces_for_cgroup() {
|
||||||
|
local c="${1}" # the cgroup path
|
||||||
|
|
||||||
|
# for each pid of the cgroup
|
||||||
|
# find any tun/tap devices linked to the pid
|
||||||
|
if [ -f "${c}/cgroup.procs" ]
|
||||||
|
then
|
||||||
|
local p
|
||||||
|
for p in $(< "${c}/cgroup.procs" )
|
||||||
|
do
|
||||||
|
netnsid_find_all_interfaces_for_pid "${p}"
|
||||||
|
done
|
||||||
|
else
|
||||||
|
debug "Cannot find file '${c}/cgroup.procs', not searching for netnsid interfaces."
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
# -----------------------------------------------------------------------------
|
# -----------------------------------------------------------------------------
|
||||||
|
|
||||||
find_all_interfaces_of_pid_or_cgroup() {
|
find_all_interfaces_of_pid_or_cgroup() {
|
||||||
|
@ -194,6 +229,7 @@ find_all_interfaces_of_pid_or_cgroup() {
|
||||||
# we have been called with a pid
|
# we have been called with a pid
|
||||||
|
|
||||||
proc_pid_fdinfo_iff "${p}"
|
proc_pid_fdinfo_iff "${p}"
|
||||||
|
netnsid_find_all_interfaces_for_pid "${p}"
|
||||||
|
|
||||||
elif [ ! -z "${c}" ]
|
elif [ ! -z "${c}" ]
|
||||||
then
|
then
|
||||||
|
@ -203,6 +239,7 @@ find_all_interfaces_of_pid_or_cgroup() {
|
||||||
|
|
||||||
find_tun_tap_interfaces_for_cgroup "${c}"
|
find_tun_tap_interfaces_for_cgroup "${c}"
|
||||||
virsh_find_all_interfaces_for_cgroup "${c}"
|
virsh_find_all_interfaces_for_cgroup "${c}"
|
||||||
|
netnsid_find_all_interfaces_for_cgroup "${c}"
|
||||||
|
|
||||||
else
|
else
|
||||||
|
|
||||||
|
|
|
@ -86,13 +86,18 @@ unsigned int read_iface_ifindex(const char *prefix, const char *iface) {
|
||||||
return (unsigned int)ifindex;
|
return (unsigned int)ifindex;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct iface *read_proc_net_dev(const char *prefix) {
|
struct iface *read_proc_net_dev(const char *scope, const char *prefix) {
|
||||||
if(!prefix) prefix = "";
|
if(!prefix) prefix = "";
|
||||||
|
|
||||||
procfile *ff = NULL;
|
procfile *ff = NULL;
|
||||||
char filename[FILENAME_MAX + 1];
|
char filename[FILENAME_MAX + 1];
|
||||||
|
|
||||||
snprintfz(filename, FILENAME_MAX, "%s%s", prefix, (*prefix)?"/proc/1/net/dev":"/proc/net/dev");
|
snprintfz(filename, FILENAME_MAX, "%s%s", prefix, (*prefix)?"/proc/1/net/dev":"/proc/net/dev");
|
||||||
|
|
||||||
|
#ifdef NETDATA_INTERNAL_CHECKS
|
||||||
|
info("parsing '%s'", filename);
|
||||||
|
#endif
|
||||||
|
|
||||||
ff = procfile_open(filename, " \t,:|", PROCFILE_FLAG_DEFAULT);
|
ff = procfile_open(filename, " \t,:|", PROCFILE_FLAG_DEFAULT);
|
||||||
if(unlikely(!ff)) {
|
if(unlikely(!ff)) {
|
||||||
error("Cannot open file '%s'", filename);
|
error("Cannot open file '%s'", filename);
|
||||||
|
@ -117,6 +122,10 @@ struct iface *read_proc_net_dev(const char *prefix) {
|
||||||
t->iflink = read_iface_iflink(prefix, t->device);
|
t->iflink = read_iface_iflink(prefix, t->device);
|
||||||
t->next = root;
|
t->next = root;
|
||||||
root = t;
|
root = t;
|
||||||
|
|
||||||
|
#ifdef NETDATA_INTERNAL_CHECKS
|
||||||
|
info("added %s interface '%s', ifindex %u, iflink %u", scope, t->device, t->ifindex, t->iflink);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
procfile_close(ff);
|
procfile_close(ff);
|
||||||
|
@ -323,6 +332,11 @@ pid_t read_pid_from_cgroup_file(const char *filename) {
|
||||||
}
|
}
|
||||||
|
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
|
|
||||||
|
#ifdef NETDATA_INTERNAL_CHECKS
|
||||||
|
if(pid > 0) info("found pid %d on file '%s'", pid, filename);
|
||||||
|
#endif
|
||||||
|
|
||||||
return pid;
|
return pid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -380,6 +394,10 @@ struct found_device {
|
||||||
} *detected_devices = NULL;
|
} *detected_devices = NULL;
|
||||||
|
|
||||||
void add_device(const char *host, const char *guest) {
|
void add_device(const char *host, const char *guest) {
|
||||||
|
#ifdef NETDATA_INTERNAL_CHECKS
|
||||||
|
info("adding device with host '%s', guest '%s'", host, guest);
|
||||||
|
#endif
|
||||||
|
|
||||||
uint32_t hash = simple_hash(host);
|
uint32_t hash = simple_hash(host);
|
||||||
|
|
||||||
if(guest && (!*guest || strcmp(host, guest) == 0))
|
if(guest && (!*guest || strcmp(host, guest) == 0))
|
||||||
|
@ -387,10 +405,12 @@ void add_device(const char *host, const char *guest) {
|
||||||
|
|
||||||
struct found_device *f;
|
struct found_device *f;
|
||||||
for(f = detected_devices; f ; f = f->next) {
|
for(f = detected_devices; f ; f = f->next) {
|
||||||
if(f->host_device_hash == hash && strcmp(host, f->host_device) == 0) {
|
if(f->host_device_hash == hash && !strcmp(host, f->host_device)) {
|
||||||
|
|
||||||
if(guest && !f->guest_device)
|
if(guest && (!f->guest_device || !strcmp(f->host_device, f->guest_device))) {
|
||||||
|
if(f->guest_device) freez((void *)f->guest_device);
|
||||||
f->guest_device = strdupz(guest);
|
f->guest_device = strdupz(guest);
|
||||||
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -425,7 +445,7 @@ void detect_veth_interfaces(pid_t pid) {
|
||||||
struct iface *cgroup = NULL;
|
struct iface *cgroup = NULL;
|
||||||
struct iface *host, *h, *c;
|
struct iface *host, *h, *c;
|
||||||
|
|
||||||
host = read_proc_net_dev(netdata_configured_host_prefix);
|
host = read_proc_net_dev("host", netdata_configured_host_prefix);
|
||||||
if(!host) {
|
if(!host) {
|
||||||
errno = 0;
|
errno = 0;
|
||||||
error("cannot read host interface list.");
|
error("cannot read host interface list.");
|
||||||
|
@ -444,7 +464,11 @@ void detect_veth_interfaces(pid_t pid) {
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
cgroup = read_proc_net_dev(NULL);
|
#ifdef NETDATA_INTERNAL_CHECKS
|
||||||
|
info("switched to namespaces of pid %d", pid);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
cgroup = read_proc_net_dev("cgroup", NULL);
|
||||||
if(!cgroup) {
|
if(!cgroup) {
|
||||||
errno = 0;
|
errno = 0;
|
||||||
error("cannot read cgroup interface list.");
|
error("cannot read cgroup interface list.");
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue