@cryptotaxi247 / netdata-1 / commits / 6402d03fc

add host/os fields to status file (#19704)

remove exclusive lock on netdata.lock - needs testing on macos

Costa Tsaousis committed Feb 24, 2025 at 16:53 UTC 6402d03fc4b3bc2cb98597b30f5c40de294c93b9
5 files changed +92 -8
src/daemon/daemon-status-file.c
+38 -1
@@ -71,12 +71,16 @@ static void daemon_status_file_to_json(BUFFER *wb, DAEMON_STATUS_FILE *ds) {
71
72 buffer_json_member_add_object(wb, "host"); // ECS
73 {
74 + buffer_json_member_add_string_or_empty(wb, "architecture", ds->architecture); // ECS
75 + buffer_json_member_add_string_or_empty(wb, "virtualization", ds->virtualization); // custom
76 + buffer_json_member_add_string_or_empty(wb, "container", ds->container); // custom
77 + buffer_json_member_add_time_t(wb, "uptime", ds->boottime); // ECS
78 +
79 buffer_json_member_add_object(wb, "boot"); // ECS
80 {
81 buffer_json_member_add_uuid(wb, "id", ds->boot_id.uuid); // ECS
82 }
83 buffer_json_object_close(wb);
79 - buffer_json_member_add_time_t(wb, "uptime", ds->boottime); // ECS
84
85 buffer_json_member_add_object(wb, "memory"); // custom
86 if(OS_SYSTEM_MEMORY_OK(ds->memory)) {
@@ -104,6 +108,11 @@ static void daemon_status_file_to_json(BUFFER *wb, DAEMON_STATUS_FILE *ds) {
108 buffer_json_member_add_object(wb, "os"); // ECS
109 {
110 buffer_json_member_add_string(wb, "type", DAEMON_OS_TYPE_2str(ds->os_type)); // ECS
111 + buffer_json_member_add_string_or_empty(wb, "kernel", ds->kernel_version); // ECS
112 + buffer_json_member_add_string_or_empty(wb, "name", ds->os_name); // ECS
113 + buffer_json_member_add_string_or_empty(wb, "version", ds->os_version); // ECS
114 + buffer_json_member_add_string_or_empty(wb, "family", ds->os_id); // ECS
115 + buffer_json_member_add_string_or_empty(wb, "platform", ds->os_id_like); // ECS
116 }
117 buffer_json_object_close(wb);
118
@@ -158,6 +167,9 @@ static bool daemon_status_file_from_json(json_object *jobj, void *data, BUFFER *
167
168 // Parse host object
169 JSONC_PARSE_SUBOBJECT(jobj, path, "host", error, required, {
170 + JSONC_PARSE_TXT2STRDUPZ_OR_ERROR_AND_RETURN(jobj, path, "architecture", ds->architecture, error, required);
171 + JSONC_PARSE_TXT2STRDUPZ_OR_ERROR_AND_RETURN(jobj, path, "virtualization", ds->virtualization, error, required);
172 + JSONC_PARSE_TXT2STRDUPZ_OR_ERROR_AND_RETURN(jobj, path, "container", ds->container, error, required);
173 JSONC_PARSE_UINT64_OR_ERROR_AND_RETURN(jobj, path, "uptime", ds->boottime, error, required);
174
175 JSONC_PARSE_SUBOBJECT(jobj, path, "boot", error, required, {
@@ -187,6 +199,11 @@ static bool daemon_status_file_from_json(json_object *jobj, void *data, BUFFER *
199 // Parse os object
200 JSONC_PARSE_SUBOBJECT(jobj, path, "os", error, required, {
201 JSONC_PARSE_TXT2ENUM_OR_ERROR_AND_RETURN(jobj, path, "type", DAEMON_OS_TYPE_2id, ds->os_type, error, required);
202 + JSONC_PARSE_TXT2STRDUPZ_OR_ERROR_AND_RETURN(jobj, path, "kernel", ds->kernel_version, error, required);
203 + JSONC_PARSE_TXT2STRDUPZ_OR_ERROR_AND_RETURN(jobj, path, "name", ds->os_name, error, required);
204 + JSONC_PARSE_TXT2STRDUPZ_OR_ERROR_AND_RETURN(jobj, path, "version", ds->os_version, error, required);
205 + JSONC_PARSE_TXT2STRDUPZ_OR_ERROR_AND_RETURN(jobj, path, "family", ds->os_id, error, required);
206 + JSONC_PARSE_TXT2STRDUPZ_OR_ERROR_AND_RETURN(jobj, path, "platform", ds->os_id_like, error, required);
207 });
208
209 // Parse fatal object
@@ -255,12 +272,32 @@ static DAEMON_STATUS_FILE daemon_status_file_get(DAEMON_STATUS status) {
272 session_status.host_id = UUID_ZERO;
273 }
274
275 + // copy items from the old status if they are not set
276 if(UUIDiszero(session_status.claim_id))
277 session_status.claim_id = last_session_status.claim_id;
278 if(UUIDiszero(session_status.node_id))
279 session_status.node_id = last_session_status.node_id;
280 if(UUIDiszero(session_status.host_id))
281 session_status.host_id = last_session_status.host_id;
282 + if(!session_status.architecture && last_session_status.architecture)
283 + session_status.architecture = strdupz(last_session_status.architecture);
284 + if(!session_status.virtualization && last_session_status.virtualization)
285 + session_status.virtualization = strdupz(last_session_status.virtualization);
286 + if(!session_status.container && last_session_status.container)
287 + session_status.container = strdupz(last_session_status.container);
288 + if(!session_status.kernel_version && last_session_status.kernel_version)
289 + session_status.kernel_version = strdupz(last_session_status.kernel_version);
290 + if(!session_status.os_name && last_session_status.os_name)
291 + session_status.os_name = strdupz(last_session_status.os_name);
292 + if(!session_status.os_version && last_session_status.os_version)
293 + session_status.os_version = strdupz(last_session_status.os_version);
294 + if(!session_status.os_id && last_session_status.os_id)
295 + session_status.os_id = strdupz(last_session_status.os_id);
296 + if(!session_status.os_id_like && last_session_status.os_id_like)
297 + session_status.os_id_like = strdupz(last_session_status.os_id_like);
298 +
299 + if((session_status.status == DAEMON_STATUS_NONE && !session_status.architecture) || status == DAEMON_STATUS_RUNNING)
300 + get_daemon_status_fields_from_system_info(&session_status);
301
302 session_status.exit_reason = exit_initiated;
303 session_status.profile = nd_profile_detect_and_configure(false);
src/daemon/daemon-status-file.h
+10
@@ -49,6 +49,16 @@ typedef struct daemon_status_file {
49 OS_SYSTEM_MEMORY memory;
50 OS_SYSTEM_DISK_SPACE var_cache;
51
52 + const char *architecture; // ECS: host.architecture
53 + const char *virtualization;
54 + const char *container;
55 + const char *kernel_version; // ECS: os.kernel
56 + const char *os_name; // ECS: os.name
57 + const char *os_version; // ECS: os.version
58 + const char *os_id; // ECS: os.family
59 + const char *os_id_like; // ECS: os.platform
60 + bool read_system_info;
61 +
62 struct {
63 long line;
64 const char *filename;
src/daemon/main.c
+7 -7
@@ -771,13 +771,13 @@ int netdata_main(int argc, char **argv) {
771 }
772 netdata_log_info("Netdata run directory is '%s'", run_dir);
773
774 - char lock_file[FILENAME_MAX];
775 - snprintfz(lock_file, sizeof(lock_file), "%s/netdata.lock", run_dir);
776 - FILE_LOCK lock = file_lock_get(lock_file);
777 - if(!FILE_LOCK_OK(lock)) {
778 - netdata_log_error("Cannot get exclusive lock on file '%s'. Is Netdata already running?", lock_file);
779 - exit(1);
780 - }
774 +// char lock_file[FILENAME_MAX];
775 +// snprintfz(lock_file, sizeof(lock_file), "%s/netdata.lock", run_dir);
776 +// FILE_LOCK lock = file_lock_get(lock_file);
777 +// if(!FILE_LOCK_OK(lock)) {
778 +// netdata_log_error("Cannot get exclusive lock on file '%s'. Is Netdata already running?", lock_file);
779 +// exit(1);
780 +// }
781 }
782
783 // status and crash/update/exit detection
src/database/rrdhost-system-info.c
+34
@@ -558,3 +558,37 @@ void rrdhost_system_info_to_streaming_function_array(BUFFER *wb, struct rrdhost_
558 buffer_json_add_array_item_string(wb, "");
559 }
560 }
561 +
562 +void get_daemon_status_fields_from_system_info(DAEMON_STATUS_FILE *ds) {
563 + if(ds->read_system_info) return;
564 +
565 + struct rrdhost_system_info tmp = { 0 };
566 + struct rrdhost_system_info *ri = (localhost && localhost->system_info) ? localhost->system_info : NULL;
567 +
568 + if(!ri && rrdhost_system_info_detect(&tmp) == 0)
569 + ri = &tmp;
570 +
571 + if(!ri) {
572 + // nothing we can do, let it be
573 + return;
574 + }
575 +
576 + freez((char *)ds->architecture);
577 + freez((char *)ds->virtualization);
578 + freez((char *)ds->container);
579 + freez((char *)ds->kernel_version);
580 + freez((char *)ds->os_name);
581 + freez((char *)ds->os_version);
582 + freez((char *)ds->os_id);
583 + freez((char *)ds->os_id_like);
584 +
585 + ds->architecture = strdupz(ri->architecture ? ri->architecture : "");
586 + ds->virtualization = strdupz(ri->virtualization ? ri->virtualization : "");
587 + ds->container = strdupz(ri->container ? ri->container : "");
588 + ds->kernel_version = strdupz(ri->kernel_version ? ri->kernel_version : "");
589 + ds->os_name = strdupz(ri->host_os_name ? ri->host_os_name : "");
590 + ds->os_version = strdupz(ri->host_os_version ? ri->host_os_version : "");
591 + ds->os_id = strdupz(ri->host_os_id ? ri->host_os_id : "");
592 + ds->os_id_like = strdupz(ri->host_os_id_like ? ri->host_os_id_like : "");
593 + ds->read_system_info = true;
594 +}
src/database/rrdhost-system-info.h
+3
@@ -5,6 +5,7 @@
5
6 #include "libnetdata/libnetdata.h"
7 #include "rrdlabels.h"
8 +#include "daemon/daemon-status-file.h"
9
10 #ifdef RRDHOST_SYSTEM_INFO_INTERNALS
11 struct rrdhost_system_info {
@@ -98,4 +99,6 @@ void rrdhost_system_info_to_node_info(struct rrdhost_system_info *system_info, s
99
100 void rrdhost_system_info_to_streaming_function_array(BUFFER *wb, struct rrdhost_system_info *system_info);
101
102 +void get_daemon_status_fields_from_system_info(DAEMON_STATUS_FILE *ds);
103 +
104 #endif //NETDATA_RRDHOST_SYSTEM_INFO_H