summaryrefslogtreecommitdiffstats
path: root/src/logsmanagement/parser.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/logsmanagement/parser.h')
-rw-r--r--src/logsmanagement/parser.h436
1 files changed, 0 insertions, 436 deletions
diff --git a/src/logsmanagement/parser.h b/src/logsmanagement/parser.h
deleted file mode 100644
index c0cf284b1..000000000
--- a/src/logsmanagement/parser.h
+++ /dev/null
@@ -1,436 +0,0 @@
-// SPDX-License-Identifier: GPL-3.0-or-later
-
-/** @file parser.h
- * @brief Header of parser.c
- */
-
-#ifndef PARSER_H_
-#define PARSER_H_
-
-#include <regex.h>
-#include "daemon/common.h"
-#include "libnetdata/libnetdata.h"
-
-// Forward decleration
-typedef struct log_parser_metrics Log_parser_metrics_t;
-
-
-/* -------------------------------------------------------------------------- */
-/* Configuration-related */
-/* -------------------------------------------------------------------------- */
-
-typedef enum{
-
- CHART_COLLECTED_LOGS_TOTAL = 1 << 0,
- CHART_COLLECTED_LOGS_RATE = 1 << 1,
-
- /* FLB_WEB_LOG charts */
- CHART_VHOST = 1 << 2,
- CHART_PORT = 1 << 3,
- CHART_IP_VERSION = 1 << 4,
- CHART_REQ_CLIENT_CURRENT = 1 << 5,
- CHART_REQ_CLIENT_ALL_TIME = 1 << 6,
- CHART_REQ_METHODS = 1 << 7,
- CHART_REQ_PROTO = 1 << 8,
- CHART_BANDWIDTH = 1 << 9,
- CHART_REQ_PROC_TIME = 1 << 10,
- CHART_RESP_CODE_FAMILY = 1 << 11,
- CHART_RESP_CODE = 1 << 12,
- CHART_RESP_CODE_TYPE = 1 << 13,
- CHART_SSL_PROTO = 1 << 14,
- CHART_SSL_CIPHER = 1 << 15,
-
- /* FLB_SYSTEMD or FLB_SYSLOG charts */
- CHART_SYSLOG_PRIOR = 1 << 16,
- CHART_SYSLOG_SEVER = 1 << 17,
- CHART_SYSLOG_FACIL = 1 << 18,
-
- /* FLB_KMSG charts */
- CHART_KMSG_SUBSYSTEM = 1 << 19,
- CHART_KMSG_DEVICE = 1 << 20,
-
- /* FLB_DOCKER_EV charts */
- CHART_DOCKER_EV_TYPE = 1 << 21,
- CHART_DOCKER_EV_ACTION = 1 << 22,
-
- /* FLB_MQTT charts*/
- CHART_MQTT_TOPIC = 1 << 23
-
-} chart_type_t;
-
-typedef struct log_parser_config{
- void *gen_config; /**< Pointer to (optional) generic configuration, as per use case. */
- unsigned long int chart_config; /**< Configuration of which charts to enable according to chart_type_t **/
-} Log_parser_config_t;
-
-/* -------------------------------------------------------------------------- */
-
-
-/* -------------------------------------------------------------------------- */
-/* Web Log parsing and metrics */
-/* -------------------------------------------------------------------------- */
-
-#define VHOST_MAX_LEN 255 /**< Max vhost string length, inclding terminating \0 **/
-#define PORT_MAX_LEN 6 /**< Max port string length, inclding terminating \0 **/
-#define REQ_SCHEME_MAX_LEN 6 /**< Max request scheme length, including terminating \0 **/
-#define REQ_CLIENT_MAX_LEN 46 /**< https://superuser.com/questions/381022/how-many-characters-can-an-ip-address-be#comment2219013_381029 **/
-#define REQ_METHOD_MAX_LEN 18 /**< Max request method length, including terminating \0 **/
-#define REQ_URL_MAX_LEN 128 /**< Max request URL length, including terminating \0 **/
-#define REQ_PROTO_PREF_SIZE (sizeof("HTTP/") - 1)
-#define REQ_PROTO_MAX_LEN 4 /**< Max request protocol numerical part length, including terminating \0 **/
-#define REQ_SIZE_MAX_LEN 11 /**< Max size of bytes received, including terminating \0 **/
-#define REQ_PROC_TIME_MAX_LEN 11 /**< Max size of request processing time, including terminating \0 **/
-#define REQ_RESP_CODE_MAX_LEN 4 /**< Max size of response code, including terminating \0 **/
-#define REQ_RESP_SIZE_MAX_LEN 11 /**< Max size of request response size, including terminating \0 **/
-#define UPS_RESP_TIME_MAX_LEN 10 /**< Max size of upstream response time, including terminating \0 **/
-#define SSL_PROTO_MAX_LEN 8 /**< Max SSL protocol length, inclding terminating \0 **/
-#define SSL_CIPHER_SUITE_MAX_LEN 256 /**< TODO: Check max len for ssl cipher suite string is indeed 256 **/
-
-#define RESP_CODE_ARR_SIZE 501 /**< Size of resp_code array, assuming 500 valid resp codes + 1 for "other" **/
-
-#define WEB_LOG_INVALID_HOST_STR "invalid"
-#define WEB_LOG_INVALID_PORT -1
-#define WEB_LOG_INVALID_PORT_STR "inv"
-#define WEB_LOG_INVALID_CLIENT_IP_STR WEB_LOG_INVALID_PORT_STR
-
-/* Web log configuration */
-#define ENABLE_PARSE_WEB_LOG_LINE_DEBUG 0
-
-#define VHOST_BUFFS_SCALE_FACTOR 1.5
-#define PORT_BUFFS_SCALE_FACTOR 8 // Unlike Vhosts, ports are stored as integers, so scale factor can be bigger
-
-
-typedef enum{
- VHOST_WITH_PORT, // nginx: $host:$server_port apache: %v:%p
- VHOST, // nginx: $host ($http_host) apache: %v
- PORT, // nginx: $server_port apache: %p
- REQ_SCHEME, // nginx: $scheme apache: -
- REQ_CLIENT, // nginx: $remote_addr apache: %a (%h)
- REQ, // nginx: $request apache: %r
- REQ_METHOD, // nginx: $request_method apache: %m
- REQ_URL, // nginx: $request_uri apache: %U
- REQ_PROTO, // nginx: $server_protocol apache: %H
- REQ_SIZE, // nginx: $request_length apache: %I
- REQ_PROC_TIME, // nginx: $request_time apache: %D
- RESP_CODE, // nginx: $status apache: %s, %>s
- RESP_SIZE, // nginx: $bytes_sent, $body_bytes_sent apache: %b, %O, %B // TODO: Should separate %b from %O ?
- UPS_RESP_TIME, // nginx: $upstream_response_time apache: -
- SSL_PROTO, // nginx: $ssl_protocol apache: -
- SSL_CIPHER_SUITE, // nginx: $ssl_cipher apache: -
- TIME, // nginx: $time_local apache: %t
- CUSTOM
-} web_log_line_field_t;
-
-typedef struct web_log_parser_config{
- web_log_line_field_t *fields;
- int num_fields; /**< Number of strings in the fields array. **/
- char delimiter; /**< Delimiter that separates the fields in the log format. **/
- int verify_parsed_logs; /**< Boolean whether to try and verify parsed log fields or not **/
- int skip_timestamp_parsing; /**< Boolean whether to skip parsing of timestamp fields **/
-} Web_log_parser_config_t;
-
-static const char *const req_method_str[] = {
- "ACL",
- "BASELINE-CONTROL",
- "BIND",
- "CHECKIN",
- "CHECKOUT",
- "CONNECT",
- "COPY",
- "DELETE",
- "GET",
- "HEAD",
- "LABEL",
- "LINK",
- "LOCK",
- "MERGE",
- "MKACTIVITY",
- "MKCALENDAR",
- "MKCOL",
- "MKREDIRECTREF",
- "MKWORKSPACE",
- "MOVE",
- "OPTIONS",
- "ORDERPATCH",
- "PATCH",
- "POST",
- "PRI",
- "PROPFIND",
- "PROPPATCH",
- "PUT",
- "REBIND",
- "REPORT",
- "SEARCH",
- "TRACE",
- "UNBIND",
- "UNCHECKOUT",
- "UNLINK",
- "UNLOCK",
- "UPDATE",
- "UPDATEREDIRECTREF",
- "-"
-};
-
-#define REQ_METHOD_ARR_SIZE (int)(sizeof(req_method_str) / sizeof(req_method_str[0]))
-
-typedef struct web_log_metrics{
- /* Web log metrics */
- struct log_parser_metrics_vhosts_array{
- struct log_parser_metrics_vhost{
- char name[VHOST_MAX_LEN]; /**< Name of the vhost **/
- int count; /**< Occurences of the vhost **/
- } *vhosts;
- int size; /**< Size of vhosts array **/
- int size_max;
- } vhost_arr;
- struct log_parser_metrics_ports_array{
- struct log_parser_metrics_port{
- char name[PORT_MAX_LEN]; /**< Number of port in str */
- int port; /**< Number of port **/
- int count; /**< Occurences of the port **/
- } *ports;
- int size; /**< Size of ports array **/
- int size_max;
- } port_arr;
- struct log_parser_metrics_ip_ver{
- int v4, v6, invalid;
- } ip_ver;
- /**< req_clients_current_arr is used by parser.c to save unique client IPs
- * extracted per circular buffer item and also in p_file_info to save unique
- * client IPs per collection (poll) iteration of plugin_logsmanagement.c.
- * req_clients_alltime_arr is used in p_file_info to save unique client IPs
- * of all time (and so ipv4_size and ipv6_size can only grow and are never reset to 0). **/
- struct log_parser_metrics_req_clients_array{
- char (*ipv4_req_clients)[REQ_CLIENT_MAX_LEN];
- int ipv4_size;
- int ipv4_size_max;
- char (*ipv6_req_clients)[REQ_CLIENT_MAX_LEN];
- int ipv6_size;
- int ipv6_size_max;
- } req_clients_current_arr, req_clients_alltime_arr;
- int req_method[REQ_METHOD_ARR_SIZE];
- struct log_parser_metrics_req_proto{
- int http_1, http_1_1, http_2, other;
- } req_proto;
- struct log_parser_metrics_bandwidth{
- long long req_size, resp_size;
- } bandwidth;
- struct log_parser_metrics_req_proc_time{
- int min, max, sum, count;
- } req_proc_time;
- struct log_parser_metrics_resp_code_family{
- int resp_1xx, resp_2xx, resp_3xx, resp_4xx, resp_5xx, other; // TODO: Can there be "other"?
- } resp_code_family;
- /**< Array counting occurences of response codes. Each item represents the
- * respective response code by adding 100 to its index, e.g. resp_code[102]
- * counts how many 202 codes were detected. 501st item represents "other" */
- unsigned int resp_code[RESP_CODE_ARR_SIZE];
- struct log_parser_metrics_resp_code_type{ /* Note: 304 and 401 should be treated as resp_success */
- int resp_success, resp_redirect, resp_bad, resp_error, other; // TODO: Can there be "other"?
- } resp_code_type;
- struct log_parser_metrics_ssl_proto{
- int tlsv1, tlsv1_1, tlsv1_2, tlsv1_3, sslv2, sslv3, other;
- } ssl_proto;
- struct log_parser_metrics_ssl_cipher_array{
- struct log_parser_metrics_ssl_cipher{
- char name[SSL_CIPHER_SUITE_MAX_LEN]; /**< SSL cipher suite string **/
- int count; /**< Occurences of the SSL cipher **/
- } *ssl_ciphers;
- int size; /**< Size of SSL ciphers array **/
- } ssl_cipher_arr;
- int64_t timestamp;
-} Web_log_metrics_t;
-
-typedef struct log_line_parsed{
- char vhost[VHOST_MAX_LEN];
- int port;
- char req_scheme[REQ_SCHEME_MAX_LEN];
- char req_client[REQ_CLIENT_MAX_LEN];
- char req_method[REQ_METHOD_MAX_LEN];
- char req_URL[REQ_URL_MAX_LEN];
- char req_proto[REQ_PROTO_MAX_LEN];
- int req_size;
- int req_proc_time;
- int resp_code;
- int resp_size;
- int ups_resp_time;
- char ssl_proto[SSL_PROTO_MAX_LEN];
- char ssl_cipher[SSL_CIPHER_SUITE_MAX_LEN];
- int64_t timestamp;
- int parsing_errors;
-} Log_line_parsed_t;
-
-Web_log_parser_config_t *read_web_log_parser_config(const char *log_format, const char delimiter);
-#ifdef ENABLE_LOGSMANAGEMENT_TESTS
-/* Used as public only for unit testing, normally defined as static */
-int count_fields(const char *line, const char delimiter);
-#endif // ENABLE_LOGSMANAGEMENT_TESTS
-void parse_web_log_line(const Web_log_parser_config_t *wblp_config,
- char *line, const size_t line_len,
- Log_line_parsed_t *log_line_parsed);
-void extract_web_log_metrics(Log_parser_config_t *parser_config,
- Log_line_parsed_t *line_parsed,
- Web_log_metrics_t *metrics);
-Web_log_parser_config_t *auto_detect_web_log_parser_config(char *line, const char delimiter);
-
-/* -------------------------------------------------------------------------- */
-
-
-/* -------------------------------------------------------------------------- */
-/* Kernel logs (kmsg) metrics */
-/* -------------------------------------------------------------------------- */
-
-#define SYSLOG_SEVER_ARR_SIZE 9 /**< Number of severity levels plus 1 for 'unknown' **/
-
-typedef struct metrics_dict_item{
- bool dim_initialized;
- int num;
- int num_new;
-} metrics_dict_item_t;
-
-typedef struct kernel_metrics{
- unsigned int sever[SYSLOG_SEVER_ARR_SIZE]; /**< Syslog severity, 0-7 plus 1 space for 'unknown' **/
- DICTIONARY *subsystem;
- DICTIONARY *device;
-} Kernel_metrics_t;
-
-/* -------------------------------------------------------------------------- */
-
-
-/* -------------------------------------------------------------------------- */
-/* Systemd and Syslog metrics */
-/* -------------------------------------------------------------------------- */
-
-#define SYSLOG_FACIL_ARR_SIZE 25 /**< Number of facility levels plus 1 for 'unknown' **/
-#define SYSLOG_PRIOR_ARR_SIZE 193 /**< Number of priority values plus 1 for 'unknown' **/
-
-typedef struct systemd_metrics{
- unsigned int sever[SYSLOG_SEVER_ARR_SIZE]; /**< Syslog severity, 0-7 plus 1 space for 'unknown' **/
- unsigned int facil[SYSLOG_FACIL_ARR_SIZE]; /**< Syslog facility, 0-23 plus 1 space for 'unknown' **/
- unsigned int prior[SYSLOG_PRIOR_ARR_SIZE]; /**< Syslog priority value, 0-191 plus 1 space for 'unknown' **/
-} Systemd_metrics_t;
-
-/* -------------------------------------------------------------------------- */
-
-
-/* -------------------------------------------------------------------------- */
-/* Docker Events metrics */
-/* -------------------------------------------------------------------------- */
-
-static const char *const docker_ev_type_string[] = {
- "container", "image", "plugin", "volume", "network", "daemon", "service", "node", "secret", "config", "unknown"
-};
-
-#define NUM_OF_DOCKER_EV_TYPES ((int) (sizeof docker_ev_type_string / sizeof docker_ev_type_string[0]))
-
-#define NUM_OF_CONTAINER_ACTIONS 25 /**< == size of 'Containers actions' array, largest array in docker_ev_action_string **/
-
-static const char *const docker_ev_action_string[NUM_OF_DOCKER_EV_TYPES][NUM_OF_CONTAINER_ACTIONS] = {
- /* Order of arrays is important, it must match the order of docker_ev_type_string[] strings. */
-
- /* Containers actions */
- {"attach", "commit", "copy", "create", "destroy", "detach", "die", "exec_create", "exec_detach", "exec_die",
- "exec_start", "export", "health_status", "kill", "oom", "pause", "rename", "resize", "restart", "start", "stop",
- "top", "unpause", "update", NULL},
-
- /* Images actions */
- {"delete", "import", "load", "pull", "push", "save", "tag", "untag", NULL},
-
- /* Plugins actions */
- {"enable", "disable", "install", "remove", NULL},
-
- /* Volumes actions */
- {"create", "destroy", "mount", "unmount", NULL},
-
- /* Networks actions */
- {"create", "connect", "destroy", "disconnect", "remove", NULL},
-
- /* Daemons actions */
- {"reload", NULL},
-
- /* Services actions */
- {"create", "remove", "update", NULL},
-
- /* Nodes actions */
- {"create", "remove", "update", NULL},
-
- /* Secrets actions */
- {"create", "remove", "update", NULL},
-
- /* Configs actions */
- {"create", "remove", "update", NULL},
-
- {"unknown", NULL}
-};
-
-typedef struct docker_ev_metrics{
- unsigned int ev_type[NUM_OF_DOCKER_EV_TYPES];
- unsigned int ev_action[NUM_OF_DOCKER_EV_TYPES][NUM_OF_CONTAINER_ACTIONS];
-} Docker_ev_metrics_t;
-
-/* -------------------------------------------------------------------------- */
-
-
-/* -------------------------------------------------------------------------- */
-/* MQTT metrics */
-/* -------------------------------------------------------------------------- */
-
-typedef struct mqtt_metrics{
- DICTIONARY *topic;
-} Mqtt_metrics_t;
-
-/* -------------------------------------------------------------------------- */
-
-
-/* -------------------------------------------------------------------------- */
-/* Regex / Keyword search */
-/* -------------------------------------------------------------------------- */
-
-#define MAX_KEYWORD_LEN 100 /**< Max size of keyword used in keyword search, in bytes */
-#define MAX_REGEX_SIZE MAX_KEYWORD_LEN + 7 /**< Max size of regular expression (used in keyword search) in bytes **/
-
-int search_keyword( char *src, size_t src_sz,
- char *dest, size_t *dest_sz,
- const char *keyword, regex_t *regex,
- const int ignore_case);
-
-/* -------------------------------------------------------------------------- */
-
-
-/* -------------------------------------------------------------------------- */
-/* Custom Charts configuration and metrics */
-/* -------------------------------------------------------------------------- */
-
-typedef struct log_parser_cus_config{
- char *chartname; /**< Chart name where the regex metrics will appear in **/
- char *regex_str; /**< String representation of the regex **/
- char *regex_name; /**< If regex is named, this is where its name is stored **/
- regex_t regex; /**< The compiled regex **/
-} Log_parser_cus_config_t;
-
-typedef struct log_parser_cus_metrics{
- unsigned long long count;
-} Log_parser_cus_metrics_t;
-
-/* -------------------------------------------------------------------------- */
-
-
-/* -------------------------------------------------------------------------- */
-/* General / Other */
-/* -------------------------------------------------------------------------- */
-
-struct log_parser_metrics{
- unsigned long long num_lines;
- // struct timeval tv;
- time_t last_update;
- union {
- Web_log_metrics_t *web_log;
- Kernel_metrics_t *kernel;
- Systemd_metrics_t *systemd;
- Docker_ev_metrics_t *docker_ev;
- Mqtt_metrics_t *mqtt;
- };
- Log_parser_cus_metrics_t **parser_cus; /**< Array storing custom chart metrics structs **/
-} ;
-
-#endif // PARSER_H_