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