mirror of
https://github.com/netdata/netdata.git
synced 2025-04-16 10:31:07 +00:00

* listening ipv6 sockets may be both ipv4 and ipv6, depending on the IPV6_ONLY flag * working libmnl ipv46 detection and added latency and retransmits from TCP_INFO * fix aggregations for rtt and retrans * code cleanup * code cleanup * code cleanup again * restore field renames * count namespaces * run namespaces in parallel * add libmnl to buildinfo * lock around safe_fork() * libmnl ports are in network byte order * posix spawn server for both executables and callback functions * local-sockets and network-viewer using the new spawn server * cleanup spawn servers sockets * spawn server stdin and stdout are linked to /dev/null * no need for spinlock in spawn server * empty all parameters * new spawn server is now used for plugins.d plugins * fix for environ * claiming script runs via the new spawn server * tc.plugin uses the new spawn server * analytics, buildinfo and cgroups.plugin use the new spawn server * cgroup-discovery uses the new spawn server * added ability to wait or kill spawned processes * removed old spawn server and now alert notifications use the new one * remove left-overs * hide spawn server internals; started working on windows version of the spawn server * fixes for windows * more windows work * more work on windows * added debug log to spawn server * fix compilation warnings * enable static threads on windows * running external plugins * working spawn server on windows * spawn server logs to collectoers.log * log windows last error together with errno * log updates * cleanup * decode_argv does not add an empty parameter * removed debug log * removed debug return * rework on close_range() * eliminate the need for waitid() * clear errno on the signal handler * added universal os_setproctitle() call to support FreeBSD too * os_get_pid_max() for windows and macos * isolate pids array from the rest of the code in apps.plugin so that it can be turned to a hashtable
197 lines
5.3 KiB
C
197 lines
5.3 KiB
C
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
#include "common.h"
|
|
|
|
char *netdata_configured_hostname = NULL;
|
|
char *netdata_configured_user_config_dir = CONFIG_DIR;
|
|
char *netdata_configured_stock_config_dir = LIBCONFIG_DIR;
|
|
char *netdata_configured_log_dir = LOG_DIR;
|
|
char *netdata_configured_primary_plugins_dir = PLUGINS_DIR;
|
|
char *netdata_configured_web_dir = WEB_DIR;
|
|
char *netdata_configured_cache_dir = CACHE_DIR;
|
|
char *netdata_configured_varlib_dir = VARLIB_DIR;
|
|
char *netdata_configured_lock_dir = VARLIB_DIR "/lock";
|
|
char *netdata_configured_home_dir = VARLIB_DIR;
|
|
char *netdata_configured_host_prefix = NULL;
|
|
char *netdata_configured_timezone = NULL;
|
|
char *netdata_configured_abbrev_timezone = NULL;
|
|
int32_t netdata_configured_utc_offset = 0;
|
|
|
|
bool netdata_ready = false;
|
|
|
|
#if defined( DISABLE_CLOUD ) || !defined( ENABLE_ACLK )
|
|
int netdata_cloud_enabled = CONFIG_BOOLEAN_NO;
|
|
#else
|
|
int netdata_cloud_enabled = CONFIG_BOOLEAN_AUTO;
|
|
#endif
|
|
|
|
long get_netdata_cpus(void) {
|
|
static long processors = 0;
|
|
|
|
if(processors)
|
|
return processors;
|
|
|
|
long cores_proc_stat = os_get_system_cpus_cached(false, true);
|
|
long cores_cpuset_v1 = (long)os_read_cpuset_cpus("/sys/fs/cgroup/cpuset/cpuset.cpus", cores_proc_stat);
|
|
long cores_cpuset_v2 = (long)os_read_cpuset_cpus("/sys/fs/cgroup/cpuset.cpus", cores_proc_stat);
|
|
|
|
if(cores_cpuset_v2)
|
|
processors = cores_cpuset_v2;
|
|
else if(cores_cpuset_v1)
|
|
processors = cores_cpuset_v1;
|
|
else
|
|
processors = cores_proc_stat;
|
|
|
|
long cores_user_configured = config_get_number(CONFIG_SECTION_GLOBAL, "cpu cores", processors);
|
|
|
|
errno_clear();
|
|
internal_error(true,
|
|
"System CPUs: %ld, ("
|
|
"system: %ld, cgroups cpuset v1: %ld, cgroups cpuset v2: %ld, netdata.conf: %ld"
|
|
")"
|
|
, processors
|
|
, cores_proc_stat
|
|
, cores_cpuset_v1
|
|
, cores_cpuset_v2
|
|
, cores_user_configured
|
|
);
|
|
|
|
processors = cores_user_configured;
|
|
|
|
if(processors < 1)
|
|
processors = 1;
|
|
|
|
return processors;
|
|
}
|
|
|
|
const char *cloud_status_to_string(CLOUD_STATUS status) {
|
|
switch(status) {
|
|
default:
|
|
case CLOUD_STATUS_UNAVAILABLE:
|
|
return "unavailable";
|
|
|
|
case CLOUD_STATUS_AVAILABLE:
|
|
return "available";
|
|
|
|
case CLOUD_STATUS_DISABLED:
|
|
return "disabled";
|
|
|
|
case CLOUD_STATUS_BANNED:
|
|
return "banned";
|
|
|
|
case CLOUD_STATUS_OFFLINE:
|
|
return "offline";
|
|
|
|
case CLOUD_STATUS_ONLINE:
|
|
return "online";
|
|
}
|
|
}
|
|
|
|
CLOUD_STATUS cloud_status(void) {
|
|
#ifdef ENABLE_ACLK
|
|
if(aclk_disable_runtime)
|
|
return CLOUD_STATUS_BANNED;
|
|
|
|
if(aclk_connected)
|
|
return CLOUD_STATUS_ONLINE;
|
|
|
|
if(netdata_cloud_enabled == CONFIG_BOOLEAN_YES) {
|
|
char *agent_id = get_agent_claimid();
|
|
bool claimed = agent_id != NULL;
|
|
freez(agent_id);
|
|
|
|
if(claimed)
|
|
return CLOUD_STATUS_OFFLINE;
|
|
}
|
|
|
|
if(netdata_cloud_enabled != CONFIG_BOOLEAN_NO)
|
|
return CLOUD_STATUS_AVAILABLE;
|
|
|
|
return CLOUD_STATUS_DISABLED;
|
|
#else
|
|
return CLOUD_STATUS_UNAVAILABLE;
|
|
#endif
|
|
}
|
|
|
|
time_t cloud_last_change(void) {
|
|
#ifdef ENABLE_ACLK
|
|
time_t ret = MAX(last_conn_time_mqtt, last_disconnect_time);
|
|
if(!ret) ret = netdata_start_time;
|
|
return ret;
|
|
#else
|
|
return netdata_start_time;
|
|
#endif
|
|
}
|
|
|
|
time_t cloud_next_connection_attempt(void) {
|
|
#ifdef ENABLE_ACLK
|
|
return next_connection_attempt;
|
|
#else
|
|
return 0;
|
|
#endif
|
|
}
|
|
|
|
size_t cloud_connection_id(void) {
|
|
#ifdef ENABLE_ACLK
|
|
return aclk_connection_counter;
|
|
#else
|
|
return 0;
|
|
#endif
|
|
}
|
|
|
|
const char *cloud_offline_reason() {
|
|
#ifdef ENABLE_ACLK
|
|
if(!netdata_cloud_enabled)
|
|
return "disabled";
|
|
|
|
if(aclk_disable_runtime)
|
|
return "banned";
|
|
|
|
return aclk_status_to_string();
|
|
#else
|
|
return "disabled";
|
|
#endif
|
|
}
|
|
|
|
const char *cloud_base_url() {
|
|
#ifdef ENABLE_ACLK
|
|
return aclk_cloud_base_url;
|
|
#else
|
|
return NULL;
|
|
#endif
|
|
}
|
|
|
|
CLOUD_STATUS buffer_json_cloud_status(BUFFER *wb, time_t now_s) {
|
|
CLOUD_STATUS status = cloud_status();
|
|
|
|
buffer_json_member_add_object(wb, "cloud");
|
|
{
|
|
size_t id = cloud_connection_id();
|
|
time_t last_change = cloud_last_change();
|
|
time_t next_connect = cloud_next_connection_attempt();
|
|
buffer_json_member_add_uint64(wb, "id", id);
|
|
buffer_json_member_add_string(wb, "status", cloud_status_to_string(status));
|
|
buffer_json_member_add_time_t(wb, "since", last_change);
|
|
buffer_json_member_add_time_t(wb, "age", now_s - last_change);
|
|
|
|
if (status != CLOUD_STATUS_ONLINE)
|
|
buffer_json_member_add_string(wb, "reason", cloud_offline_reason());
|
|
|
|
if (status == CLOUD_STATUS_OFFLINE && next_connect > now_s) {
|
|
buffer_json_member_add_time_t(wb, "next_check", next_connect);
|
|
buffer_json_member_add_time_t(wb, "next_in", next_connect - now_s);
|
|
}
|
|
|
|
if (cloud_base_url())
|
|
buffer_json_member_add_string(wb, "url", cloud_base_url());
|
|
|
|
char *claim_id = get_agent_claimid();
|
|
if(claim_id) {
|
|
buffer_json_member_add_string(wb, "claim_id", claim_id);
|
|
freez(claim_id);
|
|
}
|
|
}
|
|
buffer_json_object_close(wb); // cloud
|
|
|
|
return status;
|
|
}
|