From c21c3b0befeb46a51b6bf3758ffa30813bea0ff0 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sat, 9 Mar 2024 14:19:22 +0100 Subject: Adding upstream version 1.44.3. Signed-off-by: Daniel Baumann --- daemon/analytics.c | 117 ++++++++++++++++++++++++++++++++--------------------- 1 file changed, 70 insertions(+), 47 deletions(-) (limited to 'daemon/analytics.c') diff --git a/daemon/analytics.c b/daemon/analytics.c index c149e2583..353ebd136 100644 --- a/daemon/analytics.c +++ b/daemon/analytics.c @@ -117,12 +117,14 @@ void analytics_free_data(void) */ void analytics_set_data(char **name, char *value) { + spinlock_lock(&analytics_data.spinlock); if (*name) { analytics_data.data_length -= strlen(*name); freez(*name); } *name = strdupz(value); analytics_data.data_length += strlen(*name); + spinlock_unlock(&analytics_data.spinlock); } /* @@ -131,6 +133,7 @@ void analytics_set_data(char **name, char *value) void analytics_set_data_str(char **name, const char *value) { size_t value_string_len; + spinlock_lock(&analytics_data.spinlock); if (*name) { analytics_data.data_length -= strlen(*name); freez(*name); @@ -139,6 +142,7 @@ void analytics_set_data_str(char **name, const char *value) *name = mallocz(sizeof(char) * value_string_len); snprintfz(*name, value_string_len - 1, "\"%s\"", value); analytics_data.data_length += strlen(*name); + spinlock_unlock(&analytics_data.spinlock); } /* @@ -149,7 +153,7 @@ void analytics_log_prometheus(void) if (netdata_anonymous_statistics_enabled == 1 && likely(analytics_data.prometheus_hits < ANALYTICS_MAX_PROMETHEUS_HITS)) { analytics_data.prometheus_hits++; char b[21]; - snprintfz(b, 20, "%zu", analytics_data.prometheus_hits); + snprintfz(b, sizeof(b) - 1, "%zu", analytics_data.prometheus_hits); analytics_set_data(&analytics_data.netdata_allmetrics_prometheus_used, b); } } @@ -162,7 +166,7 @@ void analytics_log_shell(void) if (netdata_anonymous_statistics_enabled == 1 && likely(analytics_data.shell_hits < ANALYTICS_MAX_SHELL_HITS)) { analytics_data.shell_hits++; char b[21]; - snprintfz(b, 20, "%zu", analytics_data.shell_hits); + snprintfz(b, sizeof(b) - 1, "%zu", analytics_data.shell_hits); analytics_set_data(&analytics_data.netdata_allmetrics_shell_used, b); } } @@ -175,7 +179,7 @@ void analytics_log_json(void) if (netdata_anonymous_statistics_enabled == 1 && likely(analytics_data.json_hits < ANALYTICS_MAX_JSON_HITS)) { analytics_data.json_hits++; char b[21]; - snprintfz(b, 20, "%zu", analytics_data.json_hits); + snprintfz(b, sizeof(b) - 1, "%zu", analytics_data.json_hits); analytics_set_data(&analytics_data.netdata_allmetrics_json_used, b); } } @@ -188,7 +192,7 @@ void analytics_log_dashboard(void) if (netdata_anonymous_statistics_enabled == 1 && likely(analytics_data.dashboard_hits < ANALYTICS_MAX_DASHBOARD_HITS)) { analytics_data.dashboard_hits++; char b[21]; - snprintfz(b, 20, "%zu", analytics_data.dashboard_hits); + snprintfz(b, sizeof(b) - 1, "%zu", analytics_data.dashboard_hits); analytics_set_data(&analytics_data.netdata_dashboard_used, b); } } @@ -198,7 +202,7 @@ void analytics_log_dashboard(void) */ void analytics_report_oom_score(long long int score){ char b[21]; - snprintfz(b, 20, "%lld", score); + snprintfz(b, sizeof(b) - 1, "%lld", score); analytics_set_data(&analytics_data.netdata_config_oom_score, b); } @@ -222,11 +226,11 @@ void analytics_mirrored_hosts(void) } rrd_unlock(); - snprintfz(b, 20, "%zu", count); + snprintfz(b, sizeof(b) - 1, "%zu", count); analytics_set_data(&analytics_data.netdata_mirrored_host_count, b); - snprintfz(b, 20, "%zu", reachable); + snprintfz(b, sizeof(b) - 1, "%zu", reachable); analytics_set_data(&analytics_data.netdata_mirrored_hosts_reachable, b); - snprintfz(b, 20, "%zu", unreachable); + snprintfz(b, sizeof(b) - 1, "%zu", unreachable); analytics_set_data(&analytics_data.netdata_mirrored_hosts_unreachable, b); } @@ -281,7 +285,7 @@ void analytics_collectors(void) .plugin = rrdset_plugin_name(st), .module = rrdset_module_name(st) }; - snprintfz(name, 499, "%s:%s", col.plugin, col.module); + snprintfz(name, sizeof(name) - 1, "%s:%s", col.plugin, col.module); dictionary_set(dict, name, &col, sizeof(struct collector)); } rrdset_foreach_done(st); @@ -297,7 +301,7 @@ void analytics_collectors(void) { char b[21]; - snprintfz(b, 20, "%d", ap.c); + snprintfz(b, sizeof(b) - 1, "%d", ap.c); analytics_set_data(&analytics_data.netdata_collectors_count, b); } @@ -402,7 +406,7 @@ void analytics_charts(void) analytics_data.charts_count = c; { char b[21]; - snprintfz(b, 20, "%zu", c); + snprintfz(b, sizeof(b) - 1, "%zu", c); analytics_set_data(&analytics_data.netdata_charts_count, b); } } @@ -427,7 +431,7 @@ void analytics_metrics(void) analytics_data.metrics_count = dimensions; { char b[21]; - snprintfz(b, 20, "%zu", dimensions); + snprintfz(b, sizeof(b) - 1, "%zu", dimensions); analytics_set_data(&analytics_data.netdata_metrics_count, b); } } @@ -454,11 +458,11 @@ void analytics_alarms(void) } foreach_rrdcalc_in_rrdhost_done(rc); - snprintfz(b, 20, "%zu", alarm_normal); + snprintfz(b, sizeof(b) - 1, "%zu", alarm_normal); analytics_set_data(&analytics_data.netdata_alarms_normal, b); - snprintfz(b, 20, "%zu", alarm_warn); + snprintfz(b, sizeof(b) - 1, "%zu", alarm_warn); analytics_set_data(&analytics_data.netdata_alarms_warning, b); - snprintfz(b, 20, "%zu", alarm_crit); + snprintfz(b, sizeof(b) - 1, "%zu", alarm_crit); analytics_set_data(&analytics_data.netdata_alarms_critical, b); } @@ -467,6 +471,8 @@ void analytics_alarms(void) */ void analytics_misc(void) { + analytics_data.spinlock.locked = false; + #ifdef ENABLE_ACLK analytics_set_data(&analytics_data.netdata_host_cloud_available, "true"); analytics_set_data_str(&analytics_data.netdata_host_aclk_implementation, "Next Generation"); @@ -540,19 +546,19 @@ void analytics_gather_mutable_meta_data(void) { char b[21]; - snprintfz(b, 20, "%zu", analytics_data.prometheus_hits); + snprintfz(b, sizeof(b) - 1, "%zu", analytics_data.prometheus_hits); analytics_set_data(&analytics_data.netdata_allmetrics_prometheus_used, b); - snprintfz(b, 20, "%zu", analytics_data.shell_hits); + snprintfz(b, sizeof(b) - 1, "%zu", analytics_data.shell_hits); analytics_set_data(&analytics_data.netdata_allmetrics_shell_used, b); - snprintfz(b, 20, "%zu", analytics_data.json_hits); + snprintfz(b, sizeof(b) - 1, "%zu", analytics_data.json_hits); analytics_set_data(&analytics_data.netdata_allmetrics_json_used, b); - snprintfz(b, 20, "%zu", analytics_data.dashboard_hits); + snprintfz(b, sizeof(b) - 1, "%zu", analytics_data.dashboard_hits); analytics_set_data(&analytics_data.netdata_dashboard_used, b); - snprintfz(b, 20, "%zu", rrdhost_hosts_available()); + snprintfz(b, sizeof(b) - 1, "%zu", rrdhost_hosts_available()); analytics_set_data(&analytics_data.netdata_config_hosts_available, b); } } @@ -664,10 +670,10 @@ void set_late_global_environment(struct rrdhost_system_info *system_info) #ifdef ENABLE_DBENGINE { char b[16]; - snprintfz(b, 15, "%d", default_rrdeng_page_cache_mb); + snprintfz(b, sizeof(b) - 1, "%d", default_rrdeng_page_cache_mb); analytics_set_data(&analytics_data.netdata_config_page_cache_size, b); - snprintfz(b, 15, "%d", default_multidb_disk_quota_mb); + snprintfz(b, sizeof(b) - 1, "%d", default_multidb_disk_quota_mb); analytics_set_data(&analytics_data.netdata_config_multidb_disk_quota, b); } #endif @@ -824,11 +830,10 @@ void get_system_timezone(void) } } -void set_global_environment() -{ +void set_global_environment() { { char b[16]; - snprintfz(b, 15, "%d", default_rrd_update_every); + snprintfz(b, sizeof(b) - 1, "%d", default_rrd_update_every); setenv("NETDATA_UPDATE_EVERY", b, 1); } @@ -843,7 +848,6 @@ void set_global_environment() setenv("NETDATA_LIB_DIR", verify_or_create_required_directory(netdata_configured_varlib_dir), 1); setenv("NETDATA_LOCK_DIR", verify_or_create_required_directory(netdata_configured_lock_dir), 1); setenv("NETDATA_LOG_DIR", verify_or_create_required_directory(netdata_configured_log_dir), 1); - setenv("HOME", verify_or_create_required_directory(netdata_configured_home_dir), 1); setenv("NETDATA_HOST_PREFIX", netdata_configured_host_prefix, 1); { @@ -922,16 +926,14 @@ void set_global_environment() freez(default_port); // set the path we need - char path[1024 + 1], *p = getenv("PATH"); - if (!p) - p = "/bin:/usr/bin"; - snprintfz(path, 1024, "%s:%s", p, "/sbin:/usr/sbin:/usr/local/bin:/usr/local/sbin"); + char path[4096], *p = getenv("PATH"); + if (!p) p = "/bin:/usr/bin"; + snprintfz(path, sizeof(path), "%s:%s", p, "/sbin:/usr/sbin:/usr/local/bin:/usr/local/sbin"); setenv("PATH", config_get(CONFIG_SECTION_ENV_VARS, "PATH", path), 1); // python options p = getenv("PYTHONPATH"); - if (!p) - p = ""; + if (!p) p = ""; setenv("PYTHONPATH", config_get(CONFIG_SECTION_ENV_VARS, "PYTHONPATH", p), 1); // disable buffering for python plugins @@ -941,37 +943,46 @@ void set_global_environment() setenv("LC_ALL", "C", 1); } -void send_statistics(const char *action, const char *action_result, const char *action_data) -{ +void send_statistics(const char *action, const char *action_result, const char *action_data) { static char *as_script; if (netdata_anonymous_statistics_enabled == -1) { char *optout_file = mallocz( sizeof(char) * (strlen(netdata_configured_user_config_dir) + strlen(".opt-out-from-anonymous-statistics") + 2)); + sprintf(optout_file, "%s/%s", netdata_configured_user_config_dir, ".opt-out-from-anonymous-statistics"); + if (likely(access(optout_file, R_OK) != 0)) { as_script = mallocz( sizeof(char) * (strlen(netdata_configured_primary_plugins_dir) + strlen("anonymous-statistics.sh") + 2)); + sprintf(as_script, "%s/%s", netdata_configured_primary_plugins_dir, "anonymous-statistics.sh"); + if (unlikely(access(as_script, R_OK) != 0)) { netdata_anonymous_statistics_enabled = 0; - netdata_log_info("Anonymous statistics script %s not found.", as_script); + + nd_log(NDLS_DAEMON, NDLP_DEBUG, + "Statistics script '%s' not found.", + as_script); + freez(as_script); - } else { - netdata_anonymous_statistics_enabled = 1; } - } else { + else + netdata_anonymous_statistics_enabled = 1; + } + else { netdata_anonymous_statistics_enabled = 0; as_script = NULL; } + freez(optout_file); } - if (!netdata_anonymous_statistics_enabled) - return; - if (!action) + + if (!netdata_anonymous_statistics_enabled || !action) return; + if (!action_result) action_result = ""; if (!action_data) @@ -1030,7 +1041,9 @@ void send_statistics(const char *action, const char *action_result, const char * analytics_data.netdata_prebuilt_distro, analytics_data.netdata_fail_reason); - netdata_log_info("%s '%s' '%s' '%s'", as_script, action, action_result, action_data); + nd_log(NDLS_DAEMON, NDLP_DEBUG, + "%s '%s' '%s' '%s'", + as_script, action, action_result, action_data); FILE *fp_child_input; FILE *fp_child_output = netdata_popen(command_to_run, &command_pid, &fp_child_input); @@ -1039,11 +1052,21 @@ void send_statistics(const char *action, const char *action_result, const char * char *s = fgets(buffer, 4, fp_child_output); int exit_code = netdata_pclose(fp_child_input, fp_child_output, command_pid); if (exit_code) - netdata_log_error("Execution of anonymous statistics script returned %d.", exit_code); - if (s && strncmp(buffer, "200", 3)) - netdata_log_error("Execution of anonymous statistics script returned http code %s.", buffer); - } else { - netdata_log_error("Failed to run anonymous statistics script %s.", as_script); + + nd_log(NDLS_DAEMON, NDLP_NOTICE, + "Statistics script returned error: %d", + exit_code); + + if (s && strncmp(buffer, "200", 3) != 0) + nd_log(NDLS_DAEMON, NDLP_NOTICE, + "Statistics script returned http code: %s", + buffer); + } + else + nd_log(NDLS_DAEMON, NDLP_NOTICE, + "Failed to run statistics script: %s.", + as_script); + freez(command_to_run); } -- cgit v1.2.3