summaryrefslogtreecommitdiffstats
path: root/logsmanagement/file_info.h
blob: 751b87444809e7e3e5b52e16b425b90dc72c5797 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
// SPDX-License-Identifier: GPL-3.0-or-later

/** @file file_info.h
 *  @brief Includes the File_info structure that is the primary
 *         structure for configuring each log source.
 */

#ifndef FILE_INFO_H_
#define FILE_INFO_H_

#include <uv.h>
#include "../database/sqlite/sqlite3.h"
#include "defaults.h"
#include "parser.h"

// Cool trick --> http://userpage.fu-berlin.de/~ram/pub/pub_jf47ht81Ht/c_preprocessor_applications_en
/* WARNING: DO NOT CHANGED THE ORDER OF LOG_SRC_TYPES, ONLY APPEND NEW TYPES */
#define LOG_SRC_TYPES   LST(FLB_TAIL)LST(FLB_WEB_LOG)LST(FLB_KMSG) \
                        LST(FLB_SYSTEMD)LST(FLB_DOCKER_EV)LST(FLB_SYSLOG) \
                        LST(FLB_SERIAL)LST(FLB_MQTT)
#define LST(x) x,
enum log_src_type_t {LOG_SRC_TYPES};
#undef LST
#define LST(x) #x,   
static const char * const log_src_type_t_str[] = {LOG_SRC_TYPES};
#undef LST

#define LOG_SRCS    LST(LOG_SOURCE_LOCAL)LST(LOG_SOURCE_FORWARD)
#define LST(x) x,
enum log_src_t {LOG_SRCS};
#undef LST
#define LST(x) #x,   
static const char * const log_src_t_str[] = {LOG_SRCS};
#undef LST

#include "rrd_api/rrd_api.h"

typedef enum log_src_state {
    LOG_SRC_UNINITIALIZED = 0,      /*!< config not initialized */
    LOG_SRC_READY,                  /*!< config initialized (monitoring may have started or not) */
    LOG_SRC_EXITING                 /*!< cleanup and destroy stage */
} LOG_SRC_STATE;

typedef struct flb_tail_config {
    int use_inotify;
} Flb_tail_config_t;

typedef struct flb_kmsg_config {
    char *prio_level;
} Flb_kmsg_config_t;

typedef struct flb_serial_config {
    char *bitrate;
    char *min_bytes;
    char *separator;
    char *format;
} Flb_serial_config_t;

typedef struct flb_socket_config {
    char *mode;
    char *unix_path;
    char *unix_perm;
    char *listen;
    char *port;
} Flb_socket_config_t;

typedef struct syslog_parser_config {
    char *log_format;
    Flb_socket_config_t *socket_config;
} Syslog_parser_config_t;

typedef struct flb_output_config {
    char *plugin;                                   /**< Fluent Bit output plugin name, see: https://docs.fluentbit.io/manual/pipeline/outputs **/
    int id;                                         /**< Incremental id of plugin configuration in linked list, starting from 1 **/
    struct flb_output_config_param {
        char *key;                                  /**< Key of the parameter configuration **/
        char *val;                                  /**< Value of the parameter configuration **/
        struct flb_output_config_param *next;       /**< Next output parameter configuration in the linked list of parameters **/
    } *param;
    struct flb_output_config *next;                 /**< Next output plugin configuration in the linked list of output plugins **/
} Flb_output_config_t;

struct File_info {

    /* Struct members core to any log source type */
    const char *chartname;                          /**< Top level chart name for this log source on web dashboard **/ 
    char *filename;                                 /**< Full path of log source **/
    const char *file_basename;                      /**< Basename of log source **/
    const char *stream_guid;                        /**< Streaming input GUID **/
    enum log_src_t log_source;                      /**< Defines log source origin - see enum log_src_t for options **/
    enum log_src_type_t log_type;                   /**< Defines type of log source - see enum log_src_type_t for options **/
    struct Circ_buff *circ_buff;                    /**< Associated circular buffer - only one should exist per log source. **/
    int compression_accel;                          /**< LZ4 compression acceleration factor for collected logs, see also: https://github.com/lz4/lz4/blob/90d68e37093d815e7ea06b0ee3c168cccffc84b8/lib/lz4.h#L195 **/
    int update_every;                               /**< Interval (in sec) of how often to collect and update charts **/
    int update_timeout;                             /**< Timeout to update charts after, since last update */
    int use_log_timestamp;                          /**< Use log timestamps instead of collection timestamps, if available **/
    int do_sd_journal_send;                         /**< Write to system journal - not applicable to all log source types **/
    struct Chart_meta *chart_meta;
    LOG_SRC_STATE state;                            /**< State of log source, used to sync status among threads **/

    /* Struct members related to disk database */
    sqlite3 *db;                                    /**< SQLite3 DB connection to DB that contains metadata for this log source **/
    const char *db_dir;                             /**< Path to metadata DB and compressed log BLOBs directory **/
    const char *db_metadata;                        /**< Path to metadata DB file **/
    uv_mutex_t *db_mut;                             /**< DB access mutex **/
    uv_thread_t *db_writer_thread;                  /**< Thread responsible for handling the DB writes **/
    uv_file blob_handles[BLOB_MAX_FILES + 1];       /**< File handles for BLOB files. Item 0 not used - just for matching 1-1 with DB ids **/
    logs_manag_db_mode_t db_mode;                   /**< DB mode as enum. **/
    int blob_write_handle_offset;                   /**< File offset denoting HEAD of currently open database BLOB file **/
    int buff_flush_to_db_interval;                  /**< Frequency at which RAM buffers of this log source will be flushed to the database **/
    int64_t blob_max_size;                          /**< When the size of a BLOB exceeds this value, the BLOB gets rotated. **/
    int64_t blob_total_size;                        /**< This is the total disk space that all BLOBs occupy (for this log source) **/
    int64_t db_write_duration;                      /**< Holds timing details related to duration of DB write operations **/
    int64_t db_rotate_duration;                     /**< Holds timing details related to duration of DB rorate operations **/
    sqlite3_stmt *stmt_get_log_msg_metadata_asc;    /**< SQLITE3 statement used to retrieve metadata from database during queries in ascending order **/
    sqlite3_stmt *stmt_get_log_msg_metadata_desc;   /**< SQLITE3 statement used to retrieve metadata from database during queries in descending order **/

    /* Struct members related to queries */
    struct {
        usec_t user;
        usec_t sys;
    } cpu_time_per_mib;

    /* Struct members related to log parsing */
    Log_parser_config_t *parser_config;             /**< Configuration to be user by log parser - read from logsmanagement.conf **/ 
    Log_parser_cus_config_t **parser_cus_config;    /**< Array of custom log parsing configurations **/
    Log_parser_metrics_t *parser_metrics;           /**< Extracted metrics **/

    /* Struct members related to Fluent-Bit inputs, filters, buffers, outputs */
    int flb_input;                                  /**< Fluent-bit input interface property for this log source **/
    int flb_parser;                                 /**< Fluent-bit parser interface property for this log source **/
    int flb_lib_output;                             /**< Fluent-bit "lib" output interface property for this log source **/
    void *flb_config;                               /**< Any other Fluent-Bit configuration specific to this log source only **/
    uv_mutex_t flb_tmp_buff_mut;
    uv_timer_t flb_tmp_buff_cpy_timer;
    Flb_output_config_t *flb_outputs;               /**< Linked list of Fluent Bit outputs for this log source **/

};

struct File_infos_arr {
    struct File_info **data;
    uint8_t count;                                  /**< Number of items in array **/
};

extern struct File_infos_arr *p_file_infos_arr;     /**< Array that contains all p_file_info structs for all log sources **/

typedef struct {
    int update_every;
    int update_timeout;
    int use_log_timestamp;
    int circ_buff_max_size_in_mib;
    int circ_buff_drop_logs;
    int compression_acceleration;
    logs_manag_db_mode_t db_mode;
    int disk_space_limit_in_mib;
    int buff_flush_to_db_interval;
    int enable_collected_logs_total;
    int enable_collected_logs_rate;
    char *sd_journal_field_prefix;
    int do_sd_journal_send;
} g_logs_manag_config_t;

extern g_logs_manag_config_t g_logs_manag_config;

#endif  // FILE_INFO_H_