Add a fail reason to pinpoint exactly what went wrong (#15866)
* Add a fail reason to pinpoint exactly what went wrong * Drop the env for setting the fail reason. Always pass netdata_fail_reason
Stelios Fragkakis committed
Aug 23, 2023 at 11:00 UTC
9dec7660e8bb8e7696b6433ec0a49307c8543845
5 files changed
+16
-5
daemon/analytics.c
+7
-3
@@ -109,6 +109,7 @@ void analytics_free_data(void)
109
freez(analytics_data.netdata_config_use_private_registry);
110
freez(analytics_data.netdata_config_oom_score);
111
freez(analytics_data.netdata_prebuilt_distro);
112
+ freez(analytics_data.netdata_fail_reason);
113
}
114
115
/*
@@ -127,7 +128,7 @@ void analytics_set_data(char **name, char *value)
128
/*
129
* Set a string data with a value
130
*/
130
-void analytics_set_data_str(char **name, char *value)
131
+void analytics_set_data_str(char **name, const char *value)
132
{
133
size_t value_string_len;
134
if (*name) {
@@ -899,6 +900,7 @@ void set_global_environment()
900
analytics_set_data(&analytics_data.netdata_config_use_private_registry, "null");
901
analytics_set_data(&analytics_data.netdata_config_oom_score, "null");
902
analytics_set_data(&analytics_data.netdata_prebuilt_distro, "null");
903
+ analytics_set_data(&analytics_data.netdata_fail_reason, "null");
904
905
analytics_data.prometheus_hits = 0;
906
analytics_data.shell_hits = 0;
@@ -974,6 +976,7 @@ void send_statistics(const char *action, const char *action_result, const char *
976
action_result = "";
977
if (!action_data)
978
action_data = "";
979
+
980
char *command_to_run = mallocz(
981
sizeof(char) * (strlen(action) + strlen(action_result) + strlen(action_data) + strlen(as_script) +
982
analytics_data.data_length + (ANALYTICS_NO_OF_ITEMS * 3) + 15));
@@ -981,7 +984,7 @@ void send_statistics(const char *action, const char *action_result, const char *
984
985
sprintf(
986
command_to_run,
984
- "%s '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' ",
987
+ "%s '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' '%s' ",
988
as_script,
989
action,
990
action_result,
@@ -1024,7 +1027,8 @@ void send_statistics(const char *action, const char *action_result, const char *
1027
analytics_data.netdata_config_is_private_registry,
1028
analytics_data.netdata_config_use_private_registry,
1029
analytics_data.netdata_config_oom_score,
1027
- analytics_data.netdata_prebuilt_distro);
1030
+ analytics_data.netdata_prebuilt_distro,
1031
+ analytics_data.netdata_fail_reason);
1032
1033
netdata_log_info("%s '%s' '%s' '%s'", as_script, action, action_result, action_data);
1034
daemon/analytics.h
+2
-1
@@ -18,7 +18,7 @@
18
#define ANALYTICS_MAX_DASHBOARD_HITS 255
19
20
/* Needed to calculate the space needed for parameters */
21
-#define ANALYTICS_NO_OF_ITEMS 39
21
+#define ANALYTICS_NO_OF_ITEMS 40
22
23
struct analytics_data {
24
char *netdata_config_stream_enabled;
@@ -60,6 +60,7 @@ struct analytics_data {
60
char *netdata_config_use_private_registry;
61
char *netdata_config_oom_score;
62
char *netdata_prebuilt_distro;
63
+ char *netdata_fail_reason;
64
65
size_t data_length;
66
daemon/anonymous-statistics.sh.in
+3
-1
@@ -68,6 +68,7 @@ NETDATA_IS_PRIVATE_REGISTRY="${39}"
68
NETDATA_USE_PRIVATE_REGISTRY="${40}"
69
NETDATA_CONFIG_OOM_SCORE="${41}"
70
NETDATA_PREBUILT_DISTRO="${42}"
71
+NETDATA_FAIL_REASON="${43}"
72
73
[ -z "$NETDATA_REGISTRY_UNIQUE_ID" ] && NETDATA_REGISTRY_UNIQUE_ID="00000000-0000-0000-0000-000000000000"
74
@@ -175,7 +176,8 @@ REQ_BODY="$(cat << EOF
176
"mirrored_host_count": ${NETDATA_MIRRORED_HOST_COUNT},
177
"mirrored_hosts_reachable": ${NETDATA_MIRRORED_HOSTS_REACHABLE},
178
"mirrored_hosts_unreachable": ${NETDATA_MIRRORED_HOSTS_UNREACHABLE},
178
- "exporting_connectors": ${NETDATA_EXPORTING_CONNECTORS}
179
+ "exporting_connectors": ${NETDATA_EXPORTING_CONNECTORS},
180
+ "netdata_fail_reason": ${NETDATA_FAIL_REASON}
181
}
182
}
183
EOF
database/sqlite/sqlite_functions.c
+2
@@ -324,6 +324,7 @@ int init_database_batch(sqlite3 *database, int rebuild, int init_type, const cha
324
if (rc != SQLITE_OK) {
325
error_report("SQLite error during database %s, rc = %d (%s)", init_type ? "cleanup" : "setup", rc, err_msg);
326
error_report("SQLite failed statement %s", batch[i]);
327
+ analytics_set_data_str(&analytics_data.netdata_fail_reason, err_msg);
328
sqlite3_free(err_msg);
329
if (SQLITE_CORRUPT == rc) {
330
if (!rebuild)
@@ -398,6 +399,7 @@ int sql_init_database(db_check_action_type_t rebuild, int memory)
399
rc = sqlite3_open(sqlite_database, &db_meta);
400
if (rc != SQLITE_OK) {
401
error_report("Failed to initialize database at %s, due to \"%s\"", sqlite_database, sqlite3_errstr(rc));
402
+ analytics_set_data_str(&analytics_data.netdata_fail_reason, sqlite3_errstr(rc));
403
sqlite3_close(db_meta);
404
db_meta = NULL;
405
return 1;
database/sqlite/sqlite_functions.h
+2
@@ -6,6 +6,8 @@
6
#include "daemon/common.h"
7
#include "sqlite3.h"
8
9
+void analytics_set_data_str(char **name, const char *value);
10
+
11
// return a node list
12
struct node_instance_list {
13
uuid_t node_id;