mirror of
https://github.com/netdata/netdata.git
synced 2025-05-10 11:50:55 +00:00

* function renames and code cleanup in popen.c; no actual code changes
* netdata popen() now opens both child process stdin and stdout and returns FILE * for both
* pass both input and output to parser structures
* updated rrdset to call custom functions
* RRDSET FUNCTION leading calls for both sync and async operation
* put RRDSET functions to a separate file
* added format and timeout at function definition
* support for synchronous (internal plugins) and asynchronous (external plugins and children) functions
* /api/v1/function endpoint
* functions are now attached to the host and there is a dictionary view per chart
* functions implemented at plugins.d
* remove the defer until keyword hook from plugins.d when it is done
* stream sender implementation of functions
* sanitization of all functions so that certain characters are only allowed
* strictier sanitization
* common max size
* 1st working plugins.d example
* always init inflight dictionary
* properly destroy dictionaries to avoid parallel insertion of items
* add more debugging on disconnection reasons
* add more debugging on disconnection reasons again
* streaming receiver respects newlines
* dont use the same fp for both streaming receive and send
* dont free dbengine memory with internal checks
* make sender proceed in the buffer
* added timing info and garbage collection at plugins.d
* added info about routing nodes
* added info about routing nodes with delay
* added more info about delays
* added more info about delays again
* signal sending thread to wake up
* streaming version labeling and commented code to support capabilities
* added functions to /api/v1/data, /api/v1/charts, /api/v1/chart, /api/v1/info
* redirect top output to stdout
* address coverity findings
* fix resource leaks of popen
* log attempts to connect to individual destinations
* better messages
* properly parse destinations
* try to find a function from the most matching to the least matching
* log added streaming destinations
* rotate destinations bypassing a node in the middle that does not accept our connection
* break the loops properly
* use typedef to define callbacks
* capabilities negotiation during streaming
* functions exposed upstream based on capabilities; compression disabled per node persisting reconnects; always try to connect with all capabilities
* restore functionality to lookup functions
* better logging of capabilities
* remove old versions from capabilities when a newer version is there
* fix formatting
* optimization for plugins.d rrdlabels to avoid creating and destructing dictionaries all the time
* delayed health initialization for rrddim and rrdset
* cleanup health initialization
* fix for popen() not returning the right value
* add health worker jobs for initializing rrdset and rrddim
* added content type support for functions; apps.plugin permanent function to display all the processes
* fixes for functions parameters parsing in apps.plugin
* fix for process matching in apps.plugiin
* first working function for apps.plugin
* Dashboard ACL is disabled for functions; Function errors are all in JSON format
* apps.plugin function processes returns json table
* use json_escape_string() to escape message
* fix formatting
* apps.plugin exposes all its metrics to function processes
* fix json formatting when filtering out some rows
* reopen the internal pipe of rrdpush in case of errors
* misplaced statement
* do not use buffer->len
* support for GLOBAL functions (functions that are not linked to a chart
* added /api/v1/functions endpoint; removed format from the FUNCTIONS api;
* swagger documentation about the new api end points
* added plugins.d documentation about functions
* never re-close a file
* remove uncessesary ifdef
* fixed issues identified by codacy
* fix for null label value
* make edit-config copy-and-paste friendly
* Revert "make edit-config copy-and-paste friendly"
This reverts commit 54500c0e0a
.
* reworked sender handshake to fix coverity findings
* timeout is zero, for both send_timeout() and recv_timeout()
* properly detect that parent closed the socket
* support caching of function responses; limit function response to 10MB; added protection from malformed function responses
* disabled excessive logging
* added units to apps.plugin function processes and normalized all values to be human readable
* shorter field names
* fixed issues reported
* fixed apps.plugin error response; tested that pluginsd can properly handle faulty responses
* use double linked list macros for double linked list management
* faster apps.plugin function printing by minimizing file operations
* added memory percentage
* fix compatibility issues with older compilers and FreeBSD
* rrdpush sender code cleanup; rrhost structure cleanup from sender flags and variables;
* fix letftover variable in ifdef
* apps.plugin: do not call detach from the thread; exit immediately when input is broken
* exclude AR charts from health
* flush cleaner; prefer sender output
* clarity
* do not fill the cbuffer if not connected
* fix
* dont enabled host->sender if streaming is not enabled; send host label updates to parent;
* functions are only available through ACLK
* Prepared statement reports only in dev mode
* fix AR chart detection
* fix for streaming not being enabling itself
* more cleanup of sender and receiver structures
* moved read-only flags and configuration options to rrdhost->options
* fixed merge with master
* fix for incomplete rename
* prevent service thread from working on charts that are being collected
Co-authored-by: Stelios Fragkakis <52996999+stelfrag@users.noreply.github.com>
137 lines
5.3 KiB
C
137 lines
5.3 KiB
C
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
#include "sqlite_functions.h"
|
|
#include "sqlite_aclk_node.h"
|
|
|
|
#include "../../aclk/aclk_contexts_api.h"
|
|
|
|
#ifdef ENABLE_ACLK
|
|
DICTIONARY *collectors_from_charts(RRDHOST *host, DICTIONARY *dict) {
|
|
RRDSET *st;
|
|
char name[500];
|
|
|
|
rrdset_foreach_read(st, host) {
|
|
if (rrdset_is_available_for_viewers(st)) {
|
|
struct collector_info col = {
|
|
.plugin = rrdset_plugin_name(st),
|
|
.module = rrdset_module_name(st)
|
|
};
|
|
snprintfz(name, 499, "%s:%s", col.plugin, col.module);
|
|
dictionary_set(dict, name, &col, sizeof(struct collector_info));
|
|
}
|
|
}
|
|
rrdset_foreach_done(st);
|
|
|
|
return dict;
|
|
}
|
|
#endif
|
|
|
|
void sql_build_node_collectors(struct aclk_database_worker_config *wc)
|
|
{
|
|
#ifdef ENABLE_ACLK
|
|
if (!wc->host)
|
|
return;
|
|
|
|
struct update_node_collectors upd_node_collectors;
|
|
DICTIONARY *dict = dictionary_create(DICT_OPTION_SINGLE_THREADED);
|
|
|
|
upd_node_collectors.node_id = wc->node_id;
|
|
upd_node_collectors.claim_id = get_agent_claimid();
|
|
|
|
upd_node_collectors.node_collectors = collectors_from_charts(wc->host, dict);
|
|
aclk_update_node_collectors(&upd_node_collectors);
|
|
|
|
dictionary_destroy(dict);
|
|
freez(upd_node_collectors.claim_id);
|
|
|
|
log_access("ACLK RES [%s (%s)]: NODE COLLECTORS SENT", wc->node_id, rrdhost_hostname(wc->host));
|
|
#else
|
|
UNUSED(wc);
|
|
#endif
|
|
return;
|
|
}
|
|
|
|
void sql_build_node_info(struct aclk_database_worker_config *wc, struct aclk_database_cmd cmd)
|
|
{
|
|
UNUSED(cmd);
|
|
|
|
#ifdef ENABLE_ACLK
|
|
struct update_node_info node_info;
|
|
|
|
if (!wc->host) {
|
|
wc->node_info_send = 1;
|
|
return;
|
|
}
|
|
|
|
rrd_rdlock();
|
|
node_info.node_id = wc->node_id;
|
|
node_info.claim_id = get_agent_claimid();
|
|
node_info.machine_guid = wc->host_guid;
|
|
node_info.child = (wc->host != localhost);
|
|
node_info.ml_info.ml_capable = ml_capable(localhost);
|
|
node_info.ml_info.ml_enabled = ml_enabled(wc->host);
|
|
|
|
struct capability instance_caps[] = {
|
|
{ .name = "proto", .version = 1, .enabled = 1 },
|
|
{ .name = "ml", .version = ml_capable(localhost), .enabled = ml_enabled(wc->host) },
|
|
{ .name = "mc", .version = enable_metric_correlations ? metric_correlations_version : 0, .enabled = enable_metric_correlations },
|
|
{ .name = "ctx", .version = 1, .enabled = 1 },
|
|
{ .name = NULL, .version = 0, .enabled = 0 }
|
|
};
|
|
node_info.node_instance_capabilities = instance_caps;
|
|
|
|
now_realtime_timeval(&node_info.updated_at);
|
|
|
|
RRDHOST *host = wc->host;
|
|
char *host_version = NULL;
|
|
if (host != localhost) {
|
|
netdata_mutex_lock(&host->receiver_lock);
|
|
host_version = strdupz(host->receiver && host->receiver->program_version ? host->receiver->program_version : "unknown");
|
|
netdata_mutex_unlock(&host->receiver_lock);
|
|
}
|
|
|
|
node_info.data.name = rrdhost_hostname(host);
|
|
node_info.data.os = rrdhost_os(host);
|
|
node_info.data.os_name = host->system_info->host_os_name;
|
|
node_info.data.os_version = host->system_info->host_os_version;
|
|
node_info.data.kernel_name = host->system_info->kernel_name;
|
|
node_info.data.kernel_version = host->system_info->kernel_version;
|
|
node_info.data.architecture = host->system_info->architecture;
|
|
node_info.data.cpus = host->system_info->host_cores ? str2uint32_t(host->system_info->host_cores) : 0;
|
|
node_info.data.cpu_frequency = host->system_info->host_cpu_freq ? host->system_info->host_cpu_freq : "0";
|
|
node_info.data.memory = host->system_info->host_ram_total ? host->system_info->host_ram_total : "0";
|
|
node_info.data.disk_space = host->system_info->host_disk_space ? host->system_info->host_disk_space : "0";
|
|
node_info.data.version = host_version ? host_version : VERSION;
|
|
node_info.data.release_channel = get_release_channel();
|
|
node_info.data.timezone = rrdhost_abbrev_timezone(host);
|
|
node_info.data.virtualization_type = host->system_info->virtualization ? host->system_info->virtualization : "unknown";
|
|
node_info.data.container_type = host->system_info->container ? host->system_info->container : "unknown";
|
|
node_info.data.custom_info = config_get(CONFIG_SECTION_WEB, "custom dashboard_info.js", "");
|
|
node_info.data.machine_guid = wc->host_guid;
|
|
|
|
struct capability node_caps[] = {
|
|
{ .name = "ml", .version = host->system_info->ml_capable, .enabled = host->system_info->ml_enabled },
|
|
{ .name = "mc", .version = host->system_info->mc_version ? host->system_info->mc_version : 0, .enabled = host->system_info->mc_version ? 1 : 0 },
|
|
{ .name = NULL, .version = 0, .enabled = 0 }
|
|
};
|
|
node_info.node_capabilities = node_caps;
|
|
|
|
node_info.data.ml_info.ml_capable = host->system_info->ml_capable;
|
|
node_info.data.ml_info.ml_enabled = host->system_info->ml_enabled;
|
|
|
|
node_info.data.host_labels_ptr = host->rrdlabels;
|
|
|
|
aclk_update_node_info(&node_info);
|
|
log_access("ACLK RES [%s (%s)]: NODE INFO SENT for guid [%s] (%s)", wc->node_id, rrdhost_hostname(wc->host), wc->host_guid, wc->host == localhost ? "parent" : "child");
|
|
|
|
rrd_unlock();
|
|
freez(node_info.claim_id);
|
|
freez(host_version);
|
|
|
|
wc->node_collectors_send = now_realtime_sec();
|
|
#else
|
|
UNUSED(wc);
|
|
#endif
|
|
|
|
return;
|
|
}
|