From 54deae27eed83a162ee438ef6bad4a23767757dd Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Tue, 21 May 2019 20:56:05 +0200 Subject: Merging upstream version 1.15.0. Signed-off-by: Daniel Baumann --- database/rrdhost.c | 150 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 148 insertions(+), 2 deletions(-) (limited to 'database/rrdhost.c') diff --git a/database/rrdhost.c b/database/rrdhost.c index 5f0f8ac64..c552c6c39 100644 --- a/database/rrdhost.c +++ b/database/rrdhost.c @@ -122,6 +122,7 @@ RRDHOST *rrdhost_create(const char *hostname, char *rrdpush_destination, char *rrdpush_api_key, char *rrdpush_send_charts_matching, + struct rrdhost_system_info *system_info, int is_localhost ) { debug(D_RRDHOST, "Host '%s': adding with guid '%s'", hostname, guid); @@ -133,6 +134,10 @@ RRDHOST *rrdhost_create(const char *hostname, host->rrd_update_every = (update_every > 0)?update_every:1; host->rrd_history_entries = align_entries_to_pagesize(memory_mode, entries); host->rrd_memory_mode = memory_mode; +#ifdef ENABLE_DBENGINE + host->page_cache_mb = default_rrdeng_page_cache_mb; + host->disk_space_mb = default_rrdeng_disk_quota_mb; +#endif host->health_enabled = (memory_mode == RRD_MEMORY_MODE_NONE)? 0 : health_enabled; host->rrdpush_send_enabled = (rrdpush_enabled && rrdpush_destination && *rrdpush_destination && rrdpush_api_key && *rrdpush_api_key) ? 1 : 0; host->rrdpush_send_destination = (host->rrdpush_send_enabled)?strdupz(rrdpush_destination):NULL; @@ -157,6 +162,8 @@ RRDHOST *rrdhost_create(const char *hostname, host->program_version = strdupz((program_version && *program_version)?program_version:"unknown"); host->registry_hostname = strdupz((registry_hostname && *registry_hostname)?registry_hostname:hostname); + host->system_info = rrdhost_system_info_dup(system_info); + avl_init_lock(&(host->rrdset_root_index), rrdset_compare); avl_init_lock(&(host->rrdset_root_index_name), rrdset_compare_name); avl_init_lock(&(host->rrdfamily_root_index), rrdfamily_compare); @@ -202,7 +209,8 @@ RRDHOST *rrdhost_create(const char *hostname, snprintfz(filename, FILENAME_MAX, "%s/%s", netdata_configured_cache_dir, host->machine_guid); host->cache_dir = strdupz(filename); - if(host->rrd_memory_mode == RRD_MEMORY_MODE_MAP || host->rrd_memory_mode == RRD_MEMORY_MODE_SAVE) { + if(host->rrd_memory_mode == RRD_MEMORY_MODE_MAP || host->rrd_memory_mode == RRD_MEMORY_MODE_SAVE || + host->rrd_memory_mode == RRD_MEMORY_MODE_DBENGINE) { int r = mkdir(host->cache_dir, 0775); if(r != 0 && errno != EEXIST) error("Host '%s': cannot create directory '%s'", host->hostname, host->cache_dir); @@ -218,6 +226,30 @@ RRDHOST *rrdhost_create(const char *hostname, } } + if (host->rrd_memory_mode == RRD_MEMORY_MODE_DBENGINE) { +#ifdef ENABLE_DBENGINE + char dbenginepath[FILENAME_MAX + 1]; + int ret; + + snprintfz(dbenginepath, FILENAME_MAX, "%s/dbengine", host->cache_dir); + ret = mkdir(dbenginepath, 0775); + if(ret != 0 && errno != EEXIST) + error("Host '%s': cannot create directory '%s'", host->hostname, dbenginepath); + else + ret = rrdeng_init(&host->rrdeng_ctx, dbenginepath, host->page_cache_mb, host->disk_space_mb); + if(ret) { + error("Host '%s': cannot initialize host with machine guid '%s'. Failed to initialize DB engine at '%s'.", + host->hostname, host->machine_guid, host->cache_dir); + rrdhost_free(host); + host = NULL; + //rrd_hosts_available++; //TODO: maybe we want this? + + return host; + } +#else + fatal("RRD_MEMORY_MODE_DBENGINE is not supported in this platform."); +#endif + } if(host->health_enabled) { snprintfz(filename, FILENAME_MAX, "%s/health", host->varlib_dir); @@ -332,6 +364,7 @@ RRDHOST *rrdhost_find_or_create( , char *rrdpush_destination , char *rrdpush_api_key , char *rrdpush_send_charts_matching + , struct rrdhost_system_info *system_info ) { debug(D_RRDHOST, "Searching for host '%s' with guid '%s'", hostname, guid); @@ -355,6 +388,7 @@ RRDHOST *rrdhost_find_or_create( , rrdpush_destination , rrdpush_api_key , rrdpush_send_charts_matching + , system_info , 0 ); } @@ -439,7 +473,7 @@ restart_after_removal: // ---------------------------------------------------------------------------- // RRDHOST global / startup initialization -void rrd_init(char *hostname) { +void rrd_init(char *hostname, struct rrdhost_system_info *system_info) { rrdset_free_obsolete_time = config_get_number(CONFIG_SECTION_GLOBAL, "cleanup obsolete charts after seconds", rrdset_free_obsolete_time); gap_when_lost_iterations_above = (int)config_get_number(CONFIG_SECTION_GLOBAL, "gap when lost iterations above", gap_when_lost_iterations_above); if (gap_when_lost_iterations_above < 1) @@ -468,6 +502,7 @@ void rrd_init(char *hostname) { , default_rrdpush_destination , default_rrdpush_api_key , default_rrdpush_send_charts_matching + , system_info , 1 ); rrd_unlock(); @@ -513,6 +548,27 @@ void __rrd_check_wrlock(const char *file, const char *function, const unsigned l // ---------------------------------------------------------------------------- // RRDHOST - free +void rrdhost_system_info_free(struct rrdhost_system_info *system_info) { + info("SYSTEM_INFO: free %p", system_info); + + if(likely(system_info)) { + freez(system_info->os_name); + freez(system_info->os_id); + freez(system_info->os_id_like); + freez(system_info->os_version); + freez(system_info->os_version_id); + freez(system_info->os_detection); + freez(system_info->kernel_name); + freez(system_info->kernel_version); + freez(system_info->architecture); + freez(system_info->virtualization); + freez(system_info->virt_detection); + freez(system_info->container); + freez(system_info->container_detection); + freez(system_info); + } +} + void rrdhost_free(RRDHOST *host) { if(!host) return; @@ -542,6 +598,12 @@ void rrdhost_free(RRDHOST *host) { health_alarm_log_free(host); + if (host->rrd_memory_mode == RRD_MEMORY_MODE_DBENGINE) { +#ifdef ENABLE_DBENGINE + rrdeng_exit(host->rrdeng_ctx); +#endif + } + // ------------------------------------------------------------------------ // remove it from the indexes @@ -573,6 +635,7 @@ void rrdhost_free(RRDHOST *host) { freez((void *)host->timezone); freez(host->program_version); freez(host->program_name); + rrdhost_system_info_free(host->system_info); freez(host->cache_dir); freez(host->varlib_dir); freez(host->rrdpush_send_api_key); @@ -744,3 +807,86 @@ restart_after_removal: } } } + +// ---------------------------------------------------------------------------- +// RRDHOST - set system info from environment variables + +int rrdhost_set_system_info_variable(struct rrdhost_system_info *system_info, char *name, char *value) { + if(!strcmp(name, "NETDATA_SYSTEM_OS_NAME")){ + system_info->os_name = strdupz(value); + } + else if(!strcmp(name, "NETDATA_SYSTEM_OS_ID")){ + system_info->os_id = strdupz(value); + } + else if(!strcmp(name, "NETDATA_SYSTEM_OS_ID_LIKE")){ + system_info->os_id_like = strdupz(value); + } + else if(!strcmp(name, "NETDATA_SYSTEM_OS_VERSION")){ + system_info->os_version = strdupz(value); + } + else if(!strcmp(name, "NETDATA_SYSTEM_OS_VERSION_ID")){ + system_info->os_version_id = strdupz(value); + } + else if(!strcmp(name, "NETDATA_SYSTEM_OS_DETECTION")){ + system_info->os_detection = strdupz(value); + } + else if(!strcmp(name, "NETDATA_SYSTEM_KERNEL_NAME")){ + system_info->kernel_name = strdupz(value); + } + else if(!strcmp(name, "NETDATA_SYSTEM_KERNEL_VERSION")){ + system_info->kernel_version = strdupz(value); + } + else if(!strcmp(name, "NETDATA_SYSTEM_ARCHITECTURE")){ + system_info->architecture = strdupz(value); + } + else if(!strcmp(name, "NETDATA_SYSTEM_VIRTUALIZATION")){ + system_info->virtualization = strdupz(value); + } + else if(!strcmp(name, "NETDATA_SYSTEM_VIRT_DETECTION")){ + system_info->virt_detection = strdupz(value); + } + else if(!strcmp(name, "NETDATA_SYSTEM_CONTAINER")){ + system_info->container = strdupz(value); + } + else if(!strcmp(name, "NETDATA_SYSTEM_CONTAINER_DETECTION")){ + system_info->container_detection = strdupz(value); + } + else return 1; + + return 0; +} + +struct rrdhost_system_info *rrdhost_system_info_dup(struct rrdhost_system_info *system_info) { + struct rrdhost_system_info *ret = callocz(1, sizeof(struct rrdhost_system_info)); + + if(likely(system_info)) { + if(system_info->os_name) + ret->os_name = strdupz(system_info->os_name); + if(system_info->os_id) + ret->os_id = strdupz(system_info->os_id); + if(system_info->os_id_like) + ret->os_id_like = strdupz(system_info->os_id_like); + if(system_info->os_version) + ret->os_version = strdupz(system_info->os_version); + if(system_info->os_version_id) + ret->os_version_id = strdupz(system_info->os_version_id); + if(system_info->os_detection) + ret->os_detection = strdupz(system_info->os_detection); + if(system_info->kernel_name) + ret->kernel_name = strdupz(system_info->kernel_name); + if(system_info->kernel_version) + ret->kernel_version = strdupz(system_info->kernel_version); + if(system_info->architecture) + ret->architecture = strdupz(system_info->architecture); + if(system_info->virtualization) + ret->virtualization = strdupz(system_info->virtualization); + if(system_info->virt_detection) + ret->virt_detection = strdupz(system_info->virt_detection); + if(system_info->container) + ret->container = strdupz(system_info->container); + if(system_info->container_detection) + ret->container_detection = strdupz(system_info->container_detection); + } + + return ret; +} -- cgit v1.2.3