master
h 185 lines 6.5 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 #ifndef NETDATA_COLLECTORS_SYSTEMD_INTERNALS_H
4 #define NETDATA_COLLECTORS_SYSTEMD_INTERNALS_H
5
6 #include "collectors/all.h"
7 #include "libnetdata/libnetdata.h"
8 #include "provider/netdata_provider.h"
9
10 #include <linux/capability.h>
11 #include <syslog.h>
12
13 #define ND_SD_JOURNAL_FUNCTION_DESCRIPTION "View, search and analyze systemd journal entries."
14 #define ND_SD_JOURNAL_FUNCTION_NAME "systemd-journal"
15 #define ND_SD_JOURNAL_DEFAULT_TIMEOUT 60
16 #define ND_SD_JOURNAL_ENABLE_ESTIMATIONS_FILE_PERCENTAGE 0.01
17 #define ND_SD_JOURNAL_EXECUTE_WATCHER_PENDING_EVERY_MS 250
18 #define ND_SD_JOURNAL_ALL_FILES_SCAN_EVERY_USEC (5 * 60 * USEC_PER_SEC)
19
20 #define ND_SD_UNITS_FUNCTION_DESCRIPTION "Lists all systemd units (services, timers, mounts, etc.) with their current state and status."
21 #define ND_SD_UNITS_FUNCTION_NAME "systemd-list-units"
22 #define ND_SD_UNITS_DEFAULT_TIMEOUT 30
23
24 extern __thread size_t fstat_thread_calls;
25 extern __thread size_t fstat_thread_cached_responses;
26 void fstat_cache_enable_on_thread(void);
27 void fstat_cache_disable_on_thread(void);
28
29 extern netdata_mutex_t stdout_mutex;
30
31 typedef enum {
32 ND_SD_JOURNAL_NO_FILE_MATCHED,
33 ND_SD_JOURNAL_FAILED_TO_OPEN,
34 ND_SD_JOURNAL_FAILED_TO_SEEK,
35 ND_SD_JOURNAL_TIMED_OUT,
36 ND_SD_JOURNAL_OK,
37 ND_SD_JOURNAL_NOT_MODIFIED,
38 ND_SD_JOURNAL_CANCELLED,
39 } ND_SD_JOURNAL_STATUS;
40
41 typedef enum {
42 ND_SD_JF_NONE = 0,
43 ND_SD_JF_ALL = (1 << 0),
44 ND_SD_JF_LOCAL_ALL = (1 << 1),
45 ND_SD_JF_REMOTE_ALL = (1 << 2),
46 ND_SD_JF_LOCAL_SYSTEM = (1 << 3),
47 ND_SD_JF_LOCAL_USER = (1 << 4),
48 ND_SD_JF_LOCAL_NAMESPACE = (1 << 5),
49 ND_SD_JF_LOCAL_OTHER = (1 << 6),
50 } SD_JOURNAL_FILE_SOURCE_TYPE;
51
52 struct nd_journal_file {
53 const char *filename;
54 size_t filename_len;
55 STRING *source;
56 SD_JOURNAL_FILE_SOURCE_TYPE source_type;
57 usec_t file_last_modified_ut;
58 usec_t msg_first_ut;
59 usec_t msg_last_ut;
60 size_t size;
61 bool logged_failure;
62 bool logged_journalctl_failure;
63 usec_t max_journal_vs_realtime_delta_ut;
64
65 usec_t last_scan_monotonic_ut;
66 usec_t last_scan_header_vs_last_modified_ut;
67
68 uint64_t first_seqnum;
69 uint64_t last_seqnum;
70 NsdId128 first_writer_id;
71 NsdId128 last_writer_id;
72
73 uint64_t messages_in_file;
74 };
75
76 #define ND_SD_JF_SOURCE_ALL_NAME "all"
77 #define ND_SD_JF_SOURCE_LOCAL_NAME "all-local-logs"
78 #define ND_SD_JF_SOURCE_LOCAL_SYSTEM_NAME "all-local-system-logs"
79 #define ND_SD_JF_SOURCE_LOCAL_USERS_NAME "all-local-user-logs"
80 #define ND_SD_JF_SOURCE_LOCAL_OTHER_NAME "all-uncategorized"
81 #define ND_SD_JF_SOURCE_NAMESPACES_NAME "all-local-namespaces"
82 #define ND_SD_JF_SOURCE_REMOTES_NAME "all-remote-systems"
83
84 #define ND_SD_JOURNAL_OPEN_FLAGS (0)
85
86 #define JOURNAL_VS_REALTIME_DELTA_DEFAULT_UT (5 * USEC_PER_SEC) // assume a 5-seconds latency
87 #define JOURNAL_VS_REALTIME_DELTA_MAX_UT (2 * 60 * USEC_PER_SEC) // up to 2-minutes latency
88
89 extern DICTIONARY *nd_journal_files_registry;
90 extern DICTIONARY *used_hashes_registry;
91 extern DICTIONARY *boot_ids_to_first_ut;
92
93 int nd_journal_file_dict_items_backward_compar(const void *a, const void *b);
94 int nd_journal_file_dict_items_forward_compar(const void *a, const void *b);
95 void buffer_json_journal_versions(BUFFER *wb);
96 void available_journal_file_sources_to_json_array(BUFFER *wb);
97 bool nd_journal_files_completed_once(void);
98 void nd_journal_files_registry_update(void);
99 void nd_journal_directory_scan_recursively(DICTIONARY *files, DICTIONARY *dirs, const char *dirname, int depth);
100 void nd_journal_set_scan_progress_enabled(bool enabled);
101 void nd_journal_use_single_directory(const char *path);
102
103 FACET_ROW_SEVERITY syslog_priority_to_facet_severity(FACETS *facets, FACET_ROW *row, void *data);
104
105 void nd_sd_journal_dynamic_row_id(
106 FACETS *facets,
107 BUFFER *json_array,
108 FACET_ROW_KEY_VALUE *rkv,
109 FACET_ROW *row,
110 void *data);
111 void nd_sd_journal_transform_priority(FACETS *facets, BUFFER *wb, FACETS_TRANSFORMATION_SCOPE scope, void *data);
112 void nd_sd_journal_transform_syslog_facility(FACETS *facets, BUFFER *wb, FACETS_TRANSFORMATION_SCOPE scope, void *data);
113 void nd_sd_journal_transform_errno(FACETS *facets, BUFFER *wb, FACETS_TRANSFORMATION_SCOPE scope, void *data);
114 void nd_sd_journal_transform_boot_id(FACETS *facets, BUFFER *wb, FACETS_TRANSFORMATION_SCOPE scope, void *data);
115 void nd_sd_journal_transform_uid(FACETS *facets, BUFFER *wb, FACETS_TRANSFORMATION_SCOPE scope, void *data);
116 void nd_sd_journal_transform_gid(FACETS *facets, BUFFER *wb, FACETS_TRANSFORMATION_SCOPE scope, void *data);
117 void nd_sd_journal_transform_cap_effective(FACETS *facets, BUFFER *wb, FACETS_TRANSFORMATION_SCOPE scope, void *data);
118 void nd_sd_journal_transform_timestamp_usec(FACETS *facets, BUFFER *wb, FACETS_TRANSFORMATION_SCOPE scope, void *data);
119
120 usec_t nd_journal_file_update_annotation_boot_id(NsdJournal *j, struct nd_journal_file *njf, const char *boot_id);
121
122 #define MAX_JOURNAL_DIRECTORIES 100
123 struct journal_directory {
124 STRING *path;
125 };
126 extern struct journal_directory journal_directories[MAX_JOURNAL_DIRECTORIES];
127
128 void nd_journal_init_files_and_directories(void);
129 BUFFER *function_systemd_journal_result(
130 const char *transaction,
131 char *function,
132 usec_t *stop_monotonic_ut,
133 bool *cancelled,
134 BUFFER *payload,
135 HTTP_ACCESS access __maybe_unused,
136 const char *source __maybe_unused,
137 void *data __maybe_unused);
138 void function_systemd_journal(
139 const char *transaction,
140 char *function,
141 usec_t *stop_monotonic_ut,
142 bool *cancelled,
143 BUFFER *payload,
144 HTTP_ACCESS access __maybe_unused,
145 const char *source,
146 void *data);
147 void nd_journal_file_update_header(const char *filename, struct nd_journal_file *njf);
148
149 void nd_sd_journal_annotations_init(void);
150 void nd_sd_journal_transform_message_id(FACETS *facets, BUFFER *wb, FACETS_TRANSFORMATION_SCOPE scope, void *data);
151
152 void nd_journal_watcher_main(void *arg);
153 void nd_journal_watcher_restart(void);
154
155 static inline bool parse_journal_field(
156 const char *data,
157 size_t data_length,
158 const char **key,
159 size_t *key_length,
160 const char **value,
161 size_t *value_length)
162 {
163 const char *k = data;
164 const char *equal = strchr(k, '=');
165 if (unlikely(!equal))
166 return false;
167
168 size_t kl = equal - k;
169
170 const char *v = ++equal;
171 size_t vl = data_length - kl - 1;
172
173 *key = k;
174 *key_length = kl;
175 *value = v;
176 *value_length = vl;
177
178 return true;
179 }
180
181 void nd_systemd_journal_dyncfg_init(struct functions_evloop_globals *wg);
182
183 bool is_journal_file(const char *filename, ssize_t len, const char **start_of_extension);
184
185 #endif //NETDATA_COLLECTORS_SYSTEMD_INTERNALS_H