mirror of
https://github.com/netdata/netdata.git
synced 2025-04-14 17:48:37 +00:00

* cleanup of logging - wip
* first working iteration
* add errno annotator
* replace old logging functions with netdata_logger()
* cleanup
* update error_limit
* fix remanining error_limit references
* work on fatal()
* started working on structured logs
* full cleanup
* default logging to files; fix all plugins initialization
* fix formatting of numbers
* cleanup and reorg
* fix coverity issues
* cleanup obsolete code
* fix formatting of numbers
* fix log rotation
* fix for older systems
* add detection of systemd journal via stderr
* finished on access.log
* remove left-over transport
* do not add empty fields to the logs
* journal get compact uuids; X-Transaction-ID header is added in web responses
* allow compiling on systems without memfd sealing
* added libnetdata/uuid directory
* move datetime formatters to libnetdata
* add missing files
* link the makefiles in libnetdata
* added uuid_parse_flexi() to parse UUIDs with and without hyphens; the web server now read X-Transaction-ID and uses it for functions and web responses
* added stream receiver, sender, proc plugin and pluginsd log stack
* iso8601 advanced usage; line_splitter module in libnetdata; code cleanup
* add message ids to streaming inbound and outbound connections
* cleanup line_splitter between lines to avoid logging garbage; when killing children, kill them with SIGABRT if internal checks is enabled
* send SIGABRT to external plugins only if we are not shutting down
* fix cross cleanup in pluginsd parser
* fatal when there is a stack error in logs
* compile netdata with -fexceptions
* do not kill external plugins with SIGABRT
* metasync info logs to debug level
* added severity to logs
* added json output; added options per log output; added documentation; fixed issues mentioned
* allow memfd only on linux
* moved journal low level functions to journal.c/h
* move health logs to daemon.log with proper priorities
* fixed a couple of bugs; health log in journal
* updated docs
* systemd-cat-native command to push structured logs to journal from the command line
* fix makefiles
* restored NETDATA_LOG_SEVERITY_LEVEL
* fix makefiles
* systemd-cat-native can also work as the logger of Netdata scripts
* do not require a socket to systemd-journal to log-as-netdata
* alarm notify logs in native format
* properly compare log ids
* fatals log alerts; alarm-notify.sh working
* fix overflow warning
* alarm-notify.sh now logs the request (command line)
* anotate external plugins logs with the function cmd they run
* added context, component and type to alarm-notify.sh; shell sanitization removes control character and characters that may be expanded by bash
* reformatted alarm-notify logs
* unify cgroup-network-helper.sh
* added quotes around params
* charts.d.plugin switched logging to journal native
* quotes for logfmt
* unify the status codes of streaming receivers and senders
* alarm-notify: dont log anything, if there is nothing to do
* all external plugins log to stderr when running outside netdata; alarm-notify now shows an error when notifications menthod are needed but are not available
* migrate cgroup-name.sh to new logging
* systemd-cat-native now supports messages with newlines
* socket.c logs use priority
* cleanup log field types
* inherit the systemd set INVOCATION_ID if found
* allow systemd-cat-native to send messages to a systemd-journal-remote URL
* log2journal command that can convert structured logs to journal export format
* various fixes and documentation of log2journal
* updated log2journal docs
* updated log2journal docs
* updated documentation of fields
* allow compiling without libcurl
* do not use socket as format string
* added version information to newly added tools
* updated documentation and help messages
* fix the namespace socket path
* print errno with error
* do not timeout
* updated docs
* updated docs
* updated docs
* log2journal updated docs and params
* when talking to a remote journal, systemd-cat-native batches the messages
* enable lz4 compression for systemd-cat-native when sending messages to a systemd-journal-remote
* Revert "enable lz4 compression for systemd-cat-native when sending messages to a systemd-journal-remote"
This reverts commit b079d53c11
.
* note about uncompressed traffic
* log2journal: code reorg and cleanup to make modular
* finished rewriting log2journal
* more comments
* rewriting rules support
* increased limits
* updated docs
* updated docs
* fix old log call
* use journal only when stderr is connected to journal
* update netdata.spec for libcurl, libpcre2 and log2journal
* pcre2-devel
* do not require pcre2 in centos < 8, amazonlinux < 2023, open suse
* log2journal only on systems pcre2 is available
* ignore log2journal in .gitignore
* avoid log2journal on centos 7, amazonlinux 2 and opensuse
* add pcre2-8 to static build
* undo last commit
* Bundle to static
Signed-off-by: Tasos Katsoulas <tasos@netdata.cloud>
* Add build deps for deb packages
Signed-off-by: Tasos Katsoulas <tasos@netdata.cloud>
* Add dependencies; build from source
Signed-off-by: Tasos Katsoulas <tasos@netdata.cloud>
* Test build for amazon linux and centos expect to fail for suse
Signed-off-by: Tasos Katsoulas <tasos@netdata.cloud>
* fix minor oversight
Signed-off-by: Tasos Katsoulas <tasos@netdata.cloud>
* Reorg code
* Add the install from source (deps) as a TODO
* Not enable the build on suse ecosystem
Signed-off-by: Tasos Katsoulas <tasos@netdata.cloud>
---------
Signed-off-by: Tasos Katsoulas <tasos@netdata.cloud>
Co-authored-by: Tasos Katsoulas <tasos@netdata.cloud>
219 lines
7.7 KiB
C
219 lines
7.7 KiB
C
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
#include "aws_kinesis.h"
|
|
|
|
/**
|
|
* Clean AWS Kinesis *
|
|
*/
|
|
void aws_kinesis_cleanup(struct instance *instance)
|
|
{
|
|
netdata_log_info("EXPORTING: cleaning up instance %s ...", instance->config.name);
|
|
kinesis_shutdown(instance->connector_specific_data);
|
|
|
|
freez(instance->connector_specific_data);
|
|
|
|
struct aws_kinesis_specific_config *connector_specific_config = instance->config.connector_specific_config;
|
|
if (connector_specific_config) {
|
|
freez(connector_specific_config->auth_key_id);
|
|
freez(connector_specific_config->secure_key);
|
|
freez(connector_specific_config->stream_name);
|
|
|
|
freez(connector_specific_config);
|
|
}
|
|
|
|
netdata_log_info("EXPORTING: instance %s exited", instance->config.name);
|
|
instance->exited = 1;
|
|
}
|
|
|
|
/**
|
|
* Initialize AWS Kinesis connector instance
|
|
*
|
|
* @param instance an instance data structure.
|
|
* @return Returns 0 on success, 1 on failure.
|
|
*/
|
|
int init_aws_kinesis_instance(struct instance *instance)
|
|
{
|
|
instance->worker = aws_kinesis_connector_worker;
|
|
|
|
instance->start_batch_formatting = NULL;
|
|
instance->start_host_formatting = format_host_labels_json_plaintext;
|
|
instance->start_chart_formatting = NULL;
|
|
|
|
if (EXPORTING_OPTIONS_DATA_SOURCE(instance->config.options) == EXPORTING_SOURCE_DATA_AS_COLLECTED)
|
|
instance->metric_formatting = format_dimension_collected_json_plaintext;
|
|
else
|
|
instance->metric_formatting = format_dimension_stored_json_plaintext;
|
|
|
|
instance->end_chart_formatting = NULL;
|
|
instance->variables_formatting = NULL;
|
|
instance->end_host_formatting = flush_host_labels;
|
|
instance->end_batch_formatting = NULL;
|
|
|
|
instance->prepare_header = NULL;
|
|
instance->check_response = NULL;
|
|
|
|
instance->buffer = (void *)buffer_create(0, &netdata_buffers_statistics.buffers_exporters);
|
|
if (!instance->buffer) {
|
|
netdata_log_error("EXPORTING: cannot create buffer for AWS Kinesis exporting connector instance %s",
|
|
instance->config.name);
|
|
return 1;
|
|
}
|
|
if (uv_mutex_init(&instance->mutex))
|
|
return 1;
|
|
if (uv_cond_init(&instance->cond_var))
|
|
return 1;
|
|
|
|
if (!instance->engine->aws_sdk_initialized) {
|
|
aws_sdk_init();
|
|
instance->engine->aws_sdk_initialized = 1;
|
|
}
|
|
|
|
struct aws_kinesis_specific_config *connector_specific_config = instance->config.connector_specific_config;
|
|
struct aws_kinesis_specific_data *connector_specific_data = callocz(1, sizeof(struct aws_kinesis_specific_data));
|
|
instance->connector_specific_data = (void *)connector_specific_data;
|
|
|
|
if (!strcmp(connector_specific_config->stream_name, "")) {
|
|
netdata_log_error("stream name is a mandatory Kinesis parameter but it is not configured");
|
|
return 1;
|
|
}
|
|
|
|
kinesis_init(
|
|
(void *)connector_specific_data,
|
|
instance->config.destination,
|
|
connector_specific_config->auth_key_id,
|
|
connector_specific_config->secure_key,
|
|
instance->config.timeoutms);
|
|
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* AWS Kinesis connector worker
|
|
*
|
|
* Runs in a separate thread for every instance.
|
|
*
|
|
* @param instance_p an instance data structure.
|
|
*/
|
|
void aws_kinesis_connector_worker(void *instance_p)
|
|
{
|
|
struct instance *instance = (struct instance *)instance_p;
|
|
struct aws_kinesis_specific_config *connector_specific_config = instance->config.connector_specific_config;
|
|
struct aws_kinesis_specific_data *connector_specific_data = instance->connector_specific_data;
|
|
|
|
while (!instance->engine->exit) {
|
|
unsigned long long partition_key_seq = 0;
|
|
struct stats *stats = &instance->stats;
|
|
|
|
uv_mutex_lock(&instance->mutex);
|
|
while (!instance->data_is_ready)
|
|
uv_cond_wait(&instance->cond_var, &instance->mutex);
|
|
instance->data_is_ready = 0;
|
|
|
|
if (unlikely(instance->engine->exit)) {
|
|
uv_mutex_unlock(&instance->mutex);
|
|
break;
|
|
}
|
|
|
|
// reset the monitoring chart counters
|
|
stats->received_bytes =
|
|
stats->sent_bytes =
|
|
stats->sent_metrics =
|
|
stats->lost_metrics =
|
|
stats->receptions =
|
|
stats->transmission_successes =
|
|
stats->transmission_failures =
|
|
stats->data_lost_events =
|
|
stats->lost_bytes =
|
|
stats->reconnects = 0;
|
|
|
|
BUFFER *buffer = (BUFFER *)instance->buffer;
|
|
size_t buffer_len = buffer_strlen(buffer);
|
|
|
|
stats->buffered_bytes = buffer_len;
|
|
|
|
size_t sent = 0;
|
|
|
|
while (sent < buffer_len) {
|
|
char partition_key[KINESIS_PARTITION_KEY_MAX + 1];
|
|
snprintf(partition_key, KINESIS_PARTITION_KEY_MAX, "netdata_%llu", partition_key_seq++);
|
|
size_t partition_key_len = strnlen(partition_key, KINESIS_PARTITION_KEY_MAX);
|
|
|
|
const char *first_char = buffer_tostring(buffer) + sent;
|
|
|
|
size_t record_len = 0;
|
|
|
|
// split buffer into chunks of maximum allowed size
|
|
if (buffer_len - sent < KINESIS_RECORD_MAX - partition_key_len) {
|
|
record_len = buffer_len - sent;
|
|
} else {
|
|
record_len = KINESIS_RECORD_MAX - partition_key_len;
|
|
while (record_len && *(first_char + record_len - 1) != '\n')
|
|
record_len--;
|
|
}
|
|
char error_message[ERROR_LINE_MAX + 1] = "";
|
|
|
|
netdata_log_debug(D_EXPORTING,
|
|
"EXPORTING: kinesis_put_record(): dest = %s, id = %s, key = %s, stream = %s, partition_key = %s, "
|
|
"buffer = %zu, record = %zu",
|
|
instance->config.destination,
|
|
connector_specific_config->auth_key_id,
|
|
connector_specific_config->secure_key,
|
|
connector_specific_config->stream_name,
|
|
partition_key,
|
|
buffer_len,
|
|
record_len);
|
|
|
|
kinesis_put_record(
|
|
connector_specific_data, connector_specific_config->stream_name, partition_key, first_char, record_len);
|
|
|
|
sent += record_len;
|
|
stats->transmission_successes++;
|
|
|
|
size_t sent_bytes = 0, lost_bytes = 0;
|
|
|
|
if (unlikely(kinesis_get_result(
|
|
connector_specific_data->request_outcomes, error_message, &sent_bytes, &lost_bytes))) {
|
|
// oops! we couldn't send (all or some of the) data
|
|
netdata_log_error("EXPORTING: %s", error_message);
|
|
netdata_log_error("EXPORTING: failed to write data to external database '%s'. Willing to write %zu bytes, wrote %zu bytes.",
|
|
instance->config.destination,
|
|
sent_bytes,
|
|
sent_bytes - lost_bytes);
|
|
|
|
stats->transmission_failures++;
|
|
stats->data_lost_events++;
|
|
stats->lost_bytes += lost_bytes;
|
|
|
|
// estimate the number of lost metrics
|
|
stats->lost_metrics += (collected_number)(
|
|
stats->buffered_metrics *
|
|
(buffer_len && (lost_bytes > buffer_len) ? (double)lost_bytes / buffer_len : 1));
|
|
|
|
break;
|
|
} else {
|
|
stats->receptions++;
|
|
}
|
|
|
|
if (unlikely(instance->engine->exit))
|
|
break;
|
|
}
|
|
|
|
stats->sent_bytes += sent;
|
|
if (likely(sent == buffer_len))
|
|
stats->sent_metrics = stats->buffered_metrics;
|
|
|
|
buffer_flush(buffer);
|
|
|
|
send_internal_metrics(instance);
|
|
|
|
stats->buffered_metrics = 0;
|
|
|
|
uv_mutex_unlock(&instance->mutex);
|
|
|
|
#ifdef UNIT_TESTING
|
|
return;
|
|
#endif
|
|
}
|
|
|
|
aws_kinesis_cleanup(instance);
|
|
}
|