Skip to content

Commit

Permalink
add host/os fields to status file (netdata#19704)
Browse files Browse the repository at this point in the history
remove exclusive lock on netdata.lock - needs testing on macos
  • Loading branch information
ktsaou authored Feb 24, 2025
1 parent 787a961 commit 6402d03
Show file tree
Hide file tree
Showing 5 changed files with 92 additions and 8 deletions.
39 changes: 38 additions & 1 deletion src/daemon/daemon-status-file.c
Original file line number Diff line number Diff line change
Expand Up @@ -71,12 +71,16 @@ static void daemon_status_file_to_json(BUFFER *wb, DAEMON_STATUS_FILE *ds) {

buffer_json_member_add_object(wb, "host"); // ECS
{
buffer_json_member_add_string_or_empty(wb, "architecture", ds->architecture); // ECS
buffer_json_member_add_string_or_empty(wb, "virtualization", ds->virtualization); // custom
buffer_json_member_add_string_or_empty(wb, "container", ds->container); // custom
buffer_json_member_add_time_t(wb, "uptime", ds->boottime); // ECS

buffer_json_member_add_object(wb, "boot"); // ECS
{
buffer_json_member_add_uuid(wb, "id", ds->boot_id.uuid); // ECS
}
buffer_json_object_close(wb);
buffer_json_member_add_time_t(wb, "uptime", ds->boottime); // ECS

buffer_json_member_add_object(wb, "memory"); // custom
if(OS_SYSTEM_MEMORY_OK(ds->memory)) {
Expand Down Expand Up @@ -104,6 +108,11 @@ static void daemon_status_file_to_json(BUFFER *wb, DAEMON_STATUS_FILE *ds) {
buffer_json_member_add_object(wb, "os"); // ECS
{
buffer_json_member_add_string(wb, "type", DAEMON_OS_TYPE_2str(ds->os_type)); // ECS
buffer_json_member_add_string_or_empty(wb, "kernel", ds->kernel_version); // ECS
buffer_json_member_add_string_or_empty(wb, "name", ds->os_name); // ECS
buffer_json_member_add_string_or_empty(wb, "version", ds->os_version); // ECS
buffer_json_member_add_string_or_empty(wb, "family", ds->os_id); // ECS
buffer_json_member_add_string_or_empty(wb, "platform", ds->os_id_like); // ECS
}
buffer_json_object_close(wb);

Expand Down Expand Up @@ -158,6 +167,9 @@ static bool daemon_status_file_from_json(json_object *jobj, void *data, BUFFER *

// Parse host object
JSONC_PARSE_SUBOBJECT(jobj, path, "host", error, required, {
JSONC_PARSE_TXT2STRDUPZ_OR_ERROR_AND_RETURN(jobj, path, "architecture", ds->architecture, error, required);
JSONC_PARSE_TXT2STRDUPZ_OR_ERROR_AND_RETURN(jobj, path, "virtualization", ds->virtualization, error, required);
JSONC_PARSE_TXT2STRDUPZ_OR_ERROR_AND_RETURN(jobj, path, "container", ds->container, error, required);
JSONC_PARSE_UINT64_OR_ERROR_AND_RETURN(jobj, path, "uptime", ds->boottime, error, required);

JSONC_PARSE_SUBOBJECT(jobj, path, "boot", error, required, {
Expand Down Expand Up @@ -187,6 +199,11 @@ static bool daemon_status_file_from_json(json_object *jobj, void *data, BUFFER *
// Parse os object
JSONC_PARSE_SUBOBJECT(jobj, path, "os", error, required, {
JSONC_PARSE_TXT2ENUM_OR_ERROR_AND_RETURN(jobj, path, "type", DAEMON_OS_TYPE_2id, ds->os_type, error, required);
JSONC_PARSE_TXT2STRDUPZ_OR_ERROR_AND_RETURN(jobj, path, "kernel", ds->kernel_version, error, required);
JSONC_PARSE_TXT2STRDUPZ_OR_ERROR_AND_RETURN(jobj, path, "name", ds->os_name, error, required);
JSONC_PARSE_TXT2STRDUPZ_OR_ERROR_AND_RETURN(jobj, path, "version", ds->os_version, error, required);
JSONC_PARSE_TXT2STRDUPZ_OR_ERROR_AND_RETURN(jobj, path, "family", ds->os_id, error, required);
JSONC_PARSE_TXT2STRDUPZ_OR_ERROR_AND_RETURN(jobj, path, "platform", ds->os_id_like, error, required);
});

// Parse fatal object
Expand Down Expand Up @@ -255,12 +272,32 @@ static DAEMON_STATUS_FILE daemon_status_file_get(DAEMON_STATUS status) {
session_status.host_id = UUID_ZERO;
}

// copy items from the old status if they are not set
if(UUIDiszero(session_status.claim_id))
session_status.claim_id = last_session_status.claim_id;
if(UUIDiszero(session_status.node_id))
session_status.node_id = last_session_status.node_id;
if(UUIDiszero(session_status.host_id))
session_status.host_id = last_session_status.host_id;
if(!session_status.architecture && last_session_status.architecture)
session_status.architecture = strdupz(last_session_status.architecture);
if(!session_status.virtualization && last_session_status.virtualization)
session_status.virtualization = strdupz(last_session_status.virtualization);
if(!session_status.container && last_session_status.container)
session_status.container = strdupz(last_session_status.container);
if(!session_status.kernel_version && last_session_status.kernel_version)
session_status.kernel_version = strdupz(last_session_status.kernel_version);
if(!session_status.os_name && last_session_status.os_name)
session_status.os_name = strdupz(last_session_status.os_name);
if(!session_status.os_version && last_session_status.os_version)
session_status.os_version = strdupz(last_session_status.os_version);
if(!session_status.os_id && last_session_status.os_id)
session_status.os_id = strdupz(last_session_status.os_id);
if(!session_status.os_id_like && last_session_status.os_id_like)
session_status.os_id_like = strdupz(last_session_status.os_id_like);

if((session_status.status == DAEMON_STATUS_NONE && !session_status.architecture) || status == DAEMON_STATUS_RUNNING)
get_daemon_status_fields_from_system_info(&session_status);

session_status.exit_reason = exit_initiated;
session_status.profile = nd_profile_detect_and_configure(false);
Expand Down
10 changes: 10 additions & 0 deletions src/daemon/daemon-status-file.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,16 @@ typedef struct daemon_status_file {
OS_SYSTEM_MEMORY memory;
OS_SYSTEM_DISK_SPACE var_cache;

const char *architecture; // ECS: host.architecture
const char *virtualization;
const char *container;
const char *kernel_version; // ECS: os.kernel
const char *os_name; // ECS: os.name
const char *os_version; // ECS: os.version
const char *os_id; // ECS: os.family
const char *os_id_like; // ECS: os.platform
bool read_system_info;

struct {
long line;
const char *filename;
Expand Down
14 changes: 7 additions & 7 deletions src/daemon/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -771,13 +771,13 @@ int netdata_main(int argc, char **argv) {
}
netdata_log_info("Netdata run directory is '%s'", run_dir);

char lock_file[FILENAME_MAX];
snprintfz(lock_file, sizeof(lock_file), "%s/netdata.lock", run_dir);
FILE_LOCK lock = file_lock_get(lock_file);
if(!FILE_LOCK_OK(lock)) {
netdata_log_error("Cannot get exclusive lock on file '%s'. Is Netdata already running?", lock_file);
exit(1);
}
// char lock_file[FILENAME_MAX];
// snprintfz(lock_file, sizeof(lock_file), "%s/netdata.lock", run_dir);
// FILE_LOCK lock = file_lock_get(lock_file);
// if(!FILE_LOCK_OK(lock)) {
// netdata_log_error("Cannot get exclusive lock on file '%s'. Is Netdata already running?", lock_file);
// exit(1);
// }
}

// status and crash/update/exit detection
Expand Down
34 changes: 34 additions & 0 deletions src/database/rrdhost-system-info.c
Original file line number Diff line number Diff line change
Expand Up @@ -558,3 +558,37 @@ void rrdhost_system_info_to_streaming_function_array(BUFFER *wb, struct rrdhost_
buffer_json_add_array_item_string(wb, "");
}
}

void get_daemon_status_fields_from_system_info(DAEMON_STATUS_FILE *ds) {
if(ds->read_system_info) return;

struct rrdhost_system_info tmp = { 0 };
struct rrdhost_system_info *ri = (localhost && localhost->system_info) ? localhost->system_info : NULL;

if(!ri && rrdhost_system_info_detect(&tmp) == 0)
ri = &tmp;

if(!ri) {
// nothing we can do, let it be
return;
}

freez((char *)ds->architecture);
freez((char *)ds->virtualization);
freez((char *)ds->container);
freez((char *)ds->kernel_version);
freez((char *)ds->os_name);
freez((char *)ds->os_version);
freez((char *)ds->os_id);
freez((char *)ds->os_id_like);

ds->architecture = strdupz(ri->architecture ? ri->architecture : "");
ds->virtualization = strdupz(ri->virtualization ? ri->virtualization : "");
ds->container = strdupz(ri->container ? ri->container : "");
ds->kernel_version = strdupz(ri->kernel_version ? ri->kernel_version : "");
ds->os_name = strdupz(ri->host_os_name ? ri->host_os_name : "");
ds->os_version = strdupz(ri->host_os_version ? ri->host_os_version : "");
ds->os_id = strdupz(ri->host_os_id ? ri->host_os_id : "");
ds->os_id_like = strdupz(ri->host_os_id_like ? ri->host_os_id_like : "");
ds->read_system_info = true;
}
3 changes: 3 additions & 0 deletions src/database/rrdhost-system-info.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

#include "libnetdata/libnetdata.h"
#include "rrdlabels.h"
#include "daemon/daemon-status-file.h"

#ifdef RRDHOST_SYSTEM_INFO_INTERNALS
struct rrdhost_system_info {
Expand Down Expand Up @@ -98,4 +99,6 @@ void rrdhost_system_info_to_node_info(struct rrdhost_system_info *system_info, s

void rrdhost_system_info_to_streaming_function_array(BUFFER *wb, struct rrdhost_system_info *system_info);

void get_daemon_status_fields_from_system_info(DAEMON_STATUS_FILE *ds);

#endif //NETDATA_RRDHOST_SYSTEM_INFO_H

0 comments on commit 6402d03

Please sign in to comment.