0
0
Fork 0
mirror of https://github.com/netdata/netdata.git synced 2025-04-26 05:47:20 +00:00

Extend netdata info API call ()

* Add array of collector plugins-modules to api/v1/info

* Add system info to api/v1/info, collect data from separate script, use environment vars in anonymous statistics script
This commit is contained in:
Chris Akritidis 2019-04-18 18:17:03 +03:00 committed by GitHub
parent 4f64e8edbd
commit ca95332d55
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 268 additions and 140 deletions

View file

@ -17,4 +17,5 @@ dist_noinst_DATA = \
dist_plugins_SCRIPTS = \
anonymous-statistics.sh \
system-info.sh \
$(NULL)

View file

@ -22,117 +22,23 @@ if [ -f "@configdir_POST@/.opt-out-from-anonymous-statistics" ]; then
exit 0
fi
# -------------------------------------------------------------------------------------------------
# detect the operating system
OS_DETECTION="unknown"
NAME="unknown"
VERSION="unknown"
VERSION_ID="unknown"
ID="unknown"
ID_LIKE="unknown"
if [ -f "/etc/os-release" ]; then
OS_DETECTION="/etc/os-release"
eval "$(grep -E "^(NAME|ID|ID_LIKE|VERSION|VERSION_ID)=" </etc/os-release)"
fi
if [ "${NAME}" = "unknown" ] || [ "${VERSION}" = "unknown" ] || [ "${ID}" = "unknown" ]; then
if [ -f "/etc/lsb-release" ]; then
if [ "${OS_DETECTION}" = "unknown" ]; then OS_DETECTION="/etc/lsb-release"; else OS_DETECTION="Mixed"; fi
DISTRIB_ID="unknown"
DISTRIB_RELEASE="unknown"
DISTRIB_CODENAME="unknown"
eval "$(grep -E "^(DISTRIB_ID|DISTRIB_RELEASE|DISTRIB_CODENAME)=" </etc/lsb-release)"
if [ "${NAME}" = "unknown" ]; then NAME="${DISTRIB_ID}"; fi
if [ "${VERSION}" = "unknown" ]; then VERSION="${DISTRIB_RELEASE}"; fi
if [ "${ID}" = "unknown" ]; then ID="${DISTRIB_CODENAME}"; fi
elif [ -n "$(command -v lsb_release 2>/dev/null)" ]; then
if [ "${OS_DETECTION}" = "unknown" ]; then OS_DETECTION="lsb_release"; else OS_DETECTION="Mixed"; fi
if [ "${NAME}" = "unknown" ]; then NAME="$(lsb_release -is 2>/dev/null)"; fi
if [ "${VERSION}" = "unknown" ]; then VERSION="$(lsb_release -rs 2>/dev/null)"; fi
if [ "${ID}" = "unknown" ]; then ID="$(lsb_release -cs 2>/dev/null)"; fi
fi
fi
# -------------------------------------------------------------------------------------------------
# detect the kernel
KERNEL_NAME="$(uname -s)"
KERNEL_VERSION="$(uname -r)"
ARCHITECTURE="$(uname -m)"
# -------------------------------------------------------------------------------------------------
# detect the virtualization
VIRTUALIZATION="unknown"
VIRT_DETECTION="none"
CONTAINER="unknown"
CONT_DETECTION="none"
if [ -n "$(command -v systemd-detect-virt 2>/dev/null)" ]; then
VIRTUALIZATION="$(systemd-detect-virt -v)"
VIRT_DETECTION="systemd-detect-virt"
CONTAINER="$(systemd-detect-virt -c)"
CONT_DETECTION="systemd-detect-virt"
else
if grep -q "^flags.*hypervisor" /proc/cpuinfo 2>/dev/null; then
VIRTUALIZATION="hypervisor"
VIRT_DETECTION="/proc/cpuinfo"
fi
fi
# -------------------------------------------------------------------------------------------------
# detect containers with heuristics
if [ "${CONTAINER}" = "unknown" ]; then
if [ -f /proc/1/sched ] ; then
IFS='(, ' read -r process _ </proc/1/sched
if [ "${process}" = "netdata" ]; then
CONTAINER="container"
CONT_DETECTION="process"
fi
fi
# ubuntu and debian supply /bin/running-in-container
# https://www.apt-browse.org/browse/ubuntu/trusty/main/i386/upstart/1.12.1-0ubuntu4/file/bin/running-in-container
if /bin/running-in-container >/dev/null 2>&1; then
CONTAINER="container"
CONT_DETECTION="/bin/running-in-container"
fi
# lxc sets environment variable 'container'
#shellcheck disable=SC2154
if [ -n "${container}" ]; then
CONTAINER="lxc"
CONT_DETECTION="containerenv"
fi
# docker creates /.dockerenv
# http://stackoverflow.com/a/25518345
if [ -f "/.dockerenv" ]; then
CONTAINER="docker"
CONT_DETECTION="dockerenv"
fi
fi
# -------------------------------------------------------------------------------------------------
# check netdata version
if [ -z "${NETDATA_VERSION}" ]; then
NETDATA_VERSION="uknown"
netdata -V >/dev/null 2>&1 && NETDATA_VERSION="$(netdata -V 2>&1 | cut -d ' ' -f 2)"
fi
# -------------------------------------------------------------------------------------------------
# check netdata unique id
if [ -z "${NETDATA_REGISTRY_UNIQUE_ID}" ] ; then
if [ -f "@registrydir_POST@/netdata.public.unique.id" ]; then
NETDATA_REGISTRY_UNIQUE_ID="$(cat "@registrydir_POST@/netdata.public.unique.id")"
else
NETDATA_REGISTRY_UNIQUE_ID="unknown"
fi
fi
echo "&av=${NETDATA_VERSION}\
&ec=${ACTION}\
&ea=${ACTION_RESULT}\
&el=${ACTION_DATA}\
&cd1=${NETDATA_SYSTEM_OS_NAME}\
&cd2=${NETDATA_SYSTEM_OS_ID}\
&cd3=${NETDATA_SYSTEM_OS_ID_LIKE}\
&cd4=${NETDATA_SYSTEM_OS_VERSION}\
&cd5=${NETDATA_SYSTEM_OS_VERSION_ID}\
&cd6=${NETDATA_SYSTEM_OS_DETECTION}\
&cd7=${NETDATA_SYSTEM_KERNEL_NAME}\
&cd8=${NETDATA_SYSTEM_KERNEL_VERSION}\
&cd9=${NETDATA_SYSTEM_ARCHITECTURE}\
&cd10=${NETDATA_SYSTEM_VIRTUALIZATION}\
&cd11=${NETDATA_SYSTEM_VIRT_DETECTION}\
&cd12=${NETDATA_SYSTEM_CONTAINER}\
&cd13=${NETDATA_SYSTEM_CONTAINER_DETECTION}" >> /tmp/as.log
# -------------------------------------------------------------------------------------------------
# send the anonymous statistics to GA
@ -152,19 +58,19 @@ if [ -n "$(command -v curl 2>/dev/null)" ]; then
--data-urlencode "ec=${ACTION}" \
--data-urlencode "ea=${ACTION_RESULT}" \
--data-urlencode "el=${ACTION_DATA}" \
--data-urlencode "cd1=${NAME}" \
--data-urlencode "cd2=${ID}" \
--data-urlencode "cd3=${ID_LIKE}" \
--data-urlencode "cd4=${VERSION}" \
--data-urlencode "cd5=${VERSION_ID}" \
--data-urlencode "cd6=${OS_DETECTION}" \
--data-urlencode "cd7=${KERNEL_NAME}" \
--data-urlencode "cd8=${KERNEL_VERSION}" \
--data-urlencode "cd9=${ARCHITECTURE}" \
--data-urlencode "cd10=${VIRTUALIZATION}" \
--data-urlencode "cd11=${VIRT_DETECTION}" \
--data-urlencode "cd12=${CONTAINER}" \
--data-urlencode "cd13=${CONT_DETECTION}" \
--data-urlencode "cd1=${NETDATA_SYSTEM_OS_NAME}" \
--data-urlencode "cd2=${NETDATA_SYSTEM_OS_ID}" \
--data-urlencode "cd3=${NETDATA_SYSTEM_OS_ID_LIKE}" \
--data-urlencode "cd4=${NETDATA_SYSTEM_OS_VERSION}" \
--data-urlencode "cd5=${NETDATA_SYSTEM_OS_DETECTION}" \
--data-urlencode "cd6=${NETDATA_SYSTEM_OS_DETECTION}" \
--data-urlencode "cd7=${NETDATA_SYSTEM_KERNEL_NAME}" \
--data-urlencode "cd8=${NETDATA_SYSTEM_KERNEL_VERSION}" \
--data-urlencode "cd9=${NETDATA_SYSTEM_ARCHITECTURE}" \
--data-urlencode "cd10=${NETDATA_SYSTEM_VIRTUALIZATION}" \
--data-urlencode "cd11=${NETDATA_SYSTEM_VIRT_DETECTION}" \
--data-urlencode "cd12=${NETDATA_SYSTEM_CONTAINER}" \
--data-urlencode "cd13=${NETDATA_SYSTEM_CONTAINER_DETECTION}" \
"https://www.google-analytics.com/collect" >/dev/null 2>&1
else
wget -q -O - --timeout=1 "https://www.google-analytics.com/collect?\
@ -181,18 +87,18 @@ else
&ec=${ACTION}\
&ea=${ACTION_RESULT}\
&el=${ACTION_DATA}\
&cd1=${NAME}\
&cd2=${ID}\
&cd3=${ID_LIKE}\
&cd4=${VERSION}\
&cd5=${VERSION_ID}\
&cd6=${OS_DETECTION}\
&cd7=${KERNEL_NAME}\
&cd8=${KERNEL_VERSION}\
&cd9=${ARCHITECTURE}\
&cd10=${VIRTUALIZATION}\
&cd11=${VIRT_DETECTION}\
&cd12=${CONTAINER}\
&cd13=${CONT_DETECTION}\
&cd1=${NETDATA_SYSTEM_OS_NAME}\
&cd2=${NETDATA_SYSTEM_OS_ID}\
&cd3=${NETDATA_SYSTEM_OS_ID_LIKE}\
&cd4=${NETDATA_SYSTEM_OS_VERSION}\
&cd5=${NETDATA_SYSTEM_OS_VERSION_ID}\
&cd6=${NETDATA_SYSTEM_OS_DETECTION}\
&cd7=${NETDATA_SYSTEM_KERNEL_NAME}\
&cd8=${NETDATA_SYSTEM_KERNEL_VERSION}\
&cd9=${NETDATA_SYSTEM_ARCHITECTURE}\
&cd10=${NETDATA_SYSTEM_VIRTUALIZATION}\
&cd11=${NETDATA_SYSTEM_VIRT_DETECTION}\
&cd12=${NETDATA_SYSTEM_CONTAINER}\
&cd13=${NETDATA_SYSTEM_CONTAINER_DETECTION}\
" > /dev/null 2>&1
fi

View file

@ -79,4 +79,6 @@ extern char *netdata_configured_host_prefix;
extern char *netdata_configured_timezone;
extern int netdata_anonymous_statistics_enabled;
int netdata_ready;
#endif /* NETDATA_COMMON_H */

View file

@ -12,4 +12,5 @@ extern void send_statistics(const char *action, const char *action_result, const
extern char pidfile[];
#endif /* NETDATA_DAEMON_H */

View file

@ -650,6 +650,43 @@ static int load_netdata_conf(char *filename, char overwrite_used) {
return ret;
}
int get_system_info () {
char *script;
script = mallocz(sizeof(char) * (strlen(netdata_configured_primary_plugins_dir) + strlen("system-info.sh") + 2));
sprintf(script, "%s/%s", netdata_configured_primary_plugins_dir, "system-info.sh");
if (unlikely(access(script, R_OK) != 0)) {
info("System info script %s not found.",script);
freez(script);
return 1;
}
pid_t command_pid;
info("Executing %s", script);
FILE *fp = mypopen(script, &command_pid);
if(fp) {
char buffer[200 + 1];
while (fgets(buffer, 200, fp) != NULL) {
char *name=buffer;
char *value=buffer;
while (*value && *value != '=') value++;
if (*value=='=') {
*value='\0';
value++;
char *newline = value + strlen(value) - 1;
(*newline)='\0';
}
if (name && value && *name && *value) {
info("%s=%s", name, value);
setenv(name, value, 1);
}
}
mypclose(fp, command_pid);
}
freez(script);
return 0;
}
void send_statistics( const char *action, const char *action_result, const char *action_data) {
static char *as_script;
@ -697,6 +734,7 @@ int main(int argc, char **argv) {
int dont_fork = 0;
size_t default_stacksize;
netdata_ready=0;
// set the name for logging
program_name = "netdata";
@ -1053,7 +1091,7 @@ int main(int argc, char **argv) {
// initialize the log files
open_all_log_files();
netdata_anonymous_statistics_enabled=-1;
send_statistics("START","-", "-");
if (get_system_info() == 0) send_statistics("START","-", "-");
#ifdef NETDATA_INTERNAL_CHECKS
if(debug_flags != 0) {
@ -1113,7 +1151,7 @@ int main(int argc, char **argv) {
}
info("netdata initialization completed. Enjoy real-time performance monitoring!");
netdata_ready = 1;
// ------------------------------------------------------------------------
// unblock signals

109
daemon/system-info.sh Executable file
View file

@ -0,0 +1,109 @@
#!/usr/bin/env sh
# -------------------------------------------------------------------------------------------------
# detect the operating system
OS_DETECTION="unknown"
NAME="unknown"
VERSION="unknown"
VERSION_ID="unknown"
ID="unknown"
ID_LIKE="unknown"
if [ -f "/etc/os-release" ]; then
OS_DETECTION="/etc/os-release"
eval "$(grep -E "^(NAME|ID|ID_LIKE|VERSION|VERSION_ID)=" </etc/os-release)"
fi
if [ "${NAME}" = "unknown" ] || [ "${VERSION}" = "unknown" ] || [ "${ID}" = "unknown" ]; then
if [ -f "/etc/lsb-release" ]; then
if [ "${OS_DETECTION}" = "unknown" ]; then OS_DETECTION="/etc/lsb-release"; else OS_DETECTION="Mixed"; fi
DISTRIB_ID="unknown"
DISTRIB_RELEASE="unknown"
DISTRIB_CODENAME="unknown"
eval "$(grep -E "^(DISTRIB_ID|DISTRIB_RELEASE|DISTRIB_CODENAME)=" </etc/lsb-release)"
if [ "${NAME}" = "unknown" ]; then NAME="${DISTRIB_ID}"; fi
if [ "${VERSION}" = "unknown" ]; then VERSION="${DISTRIB_RELEASE}"; fi
if [ "${ID}" = "unknown" ]; then ID="${DISTRIB_CODENAME}"; fi
elif [ -n "$(command -v lsb_release 2>/dev/null)" ]; then
if [ "${OS_DETECTION}" = "unknown" ]; then OS_DETECTION="lsb_release"; else OS_DETECTION="Mixed"; fi
if [ "${NAME}" = "unknown" ]; then NAME="$(lsb_release -is 2>/dev/null)"; fi
if [ "${VERSION}" = "unknown" ]; then VERSION="$(lsb_release -rs 2>/dev/null)"; fi
if [ "${ID}" = "unknown" ]; then ID="$(lsb_release -cs 2>/dev/null)"; fi
fi
fi
# -------------------------------------------------------------------------------------------------
# detect the kernel
KERNEL_NAME="$(uname -s)"
KERNEL_VERSION="$(uname -r)"
ARCHITECTURE="$(uname -m)"
# -------------------------------------------------------------------------------------------------
# detect the virtualization
VIRTUALIZATION="unknown"
VIRT_DETECTION="none"
CONTAINER="unknown"
CONT_DETECTION="none"
if [ -n "$(command -v systemd-detect-virt 2>/dev/null)" ]; then
VIRTUALIZATION="$(systemd-detect-virt -v)"
VIRT_DETECTION="systemd-detect-virt"
CONTAINER="$(systemd-detect-virt -c)"
CONT_DETECTION="systemd-detect-virt"
else
if grep -q "^flags.*hypervisor" /proc/cpuinfo 2>/dev/null; then
VIRTUALIZATION="hypervisor"
VIRT_DETECTION="/proc/cpuinfo"
fi
fi
# -------------------------------------------------------------------------------------------------
# detect containers with heuristics
if [ "${CONTAINER}" = "unknown" ]; then
if [ -f /proc/1/sched ] ; then
IFS='(, ' read -r process _ </proc/1/sched
if [ "${process}" = "netdata" ]; then
CONTAINER="container"
CONT_DETECTION="process"
fi
fi
# ubuntu and debian supply /bin/running-in-container
# https://www.apt-browse.org/browse/ubuntu/trusty/main/i386/upstart/1.12.1-0ubuntu4/file/bin/running-in-container
if /bin/running-in-container >/dev/null 2>&1; then
CONTAINER="container"
CONT_DETECTION="/bin/running-in-container"
fi
# lxc sets environment variable 'container'
#shellcheck disable=SC2154
if [ -n "${container}" ]; then
CONTAINER="lxc"
CONT_DETECTION="containerenv"
fi
# docker creates /.dockerenv
# http://stackoverflow.com/a/25518345
if [ -f "/.dockerenv" ]; then
CONTAINER="docker"
CONT_DETECTION="dockerenv"
fi
fi
echo "NETDATA_SYSTEM_OS_NAME=\"${NAME}\""
echo "NETDATA_SYSTEM_OS_ID=${ID}"
echo "NETDATA_SYSTEM_OS_ID_LIKE=${ID_LIKE}"
echo "NETDATA_SYSTEM_OS_VERSION=${VERSION}"
echo "NETDATA_SYSTEM_OS_VERSION_ID=${VERSION_ID}"
echo "NETDATA_SYSTEM_OS_DETECTION=${OS_DETECTION}"
echo "NETDATA_SYSTEM_KERNEL_NAME=${KERNEL_NAME}"
echo "NETDATA_SYSTEM_KERNEL_VERSION=${KERNEL_VERSION}"
echo "NETDATA_SYSTEM_ARCHITECTURE=${ARCHITECTURE}"
echo "NETDATA_SYSTEM_VIRTUALIZATION=${VIRTUALIZATION}"
echo "NETDATA_SYSTEM_VIRT_DETECTION=${VIRT_DETECTION}"
echo "NETDATA_SYSTEM_CONTAINER=${CONTAINER}"
echo "NETDATA_SYSTEM_CONTAINER_DETECTION=${CONT_DETECTION}"

View file

@ -135,3 +135,44 @@ void charts2json(RRDHOST *host, BUFFER *wb) {
buffer_sprintf(wb, "\n\t]\n}\n");
}
int print_collector(void *entry, void *data) {
struct array_printer *ap = (struct array_printer *)data;
BUFFER *wb = ap->wb;
struct collector *col=(struct collector *) entry;
if(ap->c) buffer_strcat(wb, ",");
buffer_strcat(wb, "\n\t\t{\n\t\t\t\"plugin\": \"");
buffer_strcat(wb, col->plugin);
buffer_strcat(wb, "\",\n\t\t\t\"module\": \"");
buffer_strcat(wb, col->module);
buffer_strcat(wb, "\"\n\t\t}");
(ap->c)++;
return 0;
}
void chartcollectors2json(RRDHOST *host, BUFFER *wb) {
DICTIONARY *dict = dictionary_create(DICTIONARY_FLAG_SINGLE_THREADED);
RRDSET *st;
char name[500];
time_t now = now_realtime_sec();
rrdhost_rdlock(host);
rrdset_foreach_read(st, host) {
if (rrdset_is_available_for_viewers(st)) {
struct collector col = {
.plugin = st->plugin_name ? st->plugin_name : "",
.module = st->module_name ? st->module_name : ""
};
sprintf(name, "%s:%s", col.plugin, col.module);
dictionary_set(dict, name, &col, sizeof(struct collector));
st->last_accessed_time = now;
}
}
rrdhost_unlock(host);
struct array_printer ap = {
.c = 0,
.wb = wb
};
dictionary_get_all(dict, print_collector, &ap);
dictionary_destroy(dict);
}

View file

@ -5,6 +5,17 @@
#include "rrd2json.h"
struct collector {
char *plugin;
char *module;
};
struct array_printer {
int c;
BUFFER *wb;
};
extern void charts2json(RRDHOST *host, BUFFER *wb);
extern void chartcollectors2json(RRDHOST *host, BUFFER *wb);
#endif //NETDATA_API_FORMATTER_CHARTS2JSON_H

View file

@ -717,6 +717,7 @@ static inline void web_client_api_request_v1_info_mirrored_hosts(BUFFER *wb) {
inline int web_client_api_request_v1_info(RRDHOST *host, struct web_client *w, char *url) {
(void)url;
if (!netdata_ready) return 400;
BUFFER *wb = w->response.data;
buffer_flush(wb);
@ -732,7 +733,25 @@ inline int web_client_api_request_v1_info(RRDHOST *host, struct web_client *w, c
buffer_strcat(wb, "\t\"alarms\": {\n");
web_client_api_request_v1_info_summary_alarm_statuses(host, wb);
buffer_strcat(wb, "\t}\n");
buffer_strcat(wb, "\t},\n");
buffer_sprintf(wb, "\t\"os_name\": %s,\n", getenv("NETDATA_SYSTEM_OS_NAME"));
buffer_sprintf(wb, "\t\"os_id\": \"%s\",\n", getenv("NETDATA_SYSTEM_OS_ID"));
buffer_sprintf(wb, "\t\"os_id_like\": \"%s\",\n", getenv("NETDATA_SYSTEM_OS_ID_LIKE"));
buffer_sprintf(wb, "\t\"os_version\": \"%s\",\n", getenv("NETDATA_SYSTEM_OS_VERSION"));
buffer_sprintf(wb, "\t\"os_version_id\": \"%s\",\n", getenv("NETDATA_SYSTEM_OS_VERSION_ID"));
buffer_sprintf(wb, "\t\"os_detection\": \"%s\",\n", getenv("NETDATA_SYSTEM_OS_DETECTION"));
buffer_sprintf(wb, "\t\"kernel_name\": \"%s\",\n", getenv("NETDATA_SYSTEM_KERNEL_NAME"));
buffer_sprintf(wb, "\t\"kernel_version\": \"%s\",\n", getenv("NETDATA_SYSTEM_KERNEL_VERSION"));
buffer_sprintf(wb, "\t\"architecture\": \"%s\",\n", getenv("NETDATA_SYSTEM_ARCHITECTURE"));
buffer_sprintf(wb, "\t\"virtualization\": \"%s\",\n", getenv("NETDATA_SYSTEM_VIRTUALIZATION"));
buffer_sprintf(wb, "\t\"virt_detection\": \"%s\",\n", getenv("NETDATA_SYSTEM_VIRT_DETECTION"));
buffer_sprintf(wb, "\t\"container\": \"%s\",\n", getenv("NETDATA_SYSTEM_CONTAINER"));
buffer_sprintf(wb, "\t\"container_detection\": \"%s\",\n", getenv("NETDATA_SYSTEM_CONTAINER_DETECTION"));
buffer_strcat(wb, "\t\"collectors\": [");
chartcollectors2json(host, wb);
buffer_strcat(wb, "\n\t]\n");
buffer_strcat(wb, "}");
return 200;