systemd-internals.h 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. // SPDX-License-Identifier: GPL-3.0-or-later
  2. #ifndef NETDATA_COLLECTORS_SYSTEMD_INTERNALS_H
  3. #define NETDATA_COLLECTORS_SYSTEMD_INTERNALS_H
  4. #include "collectors/all.h"
  5. #include "libnetdata/libnetdata.h"
  6. #include <linux/capability.h>
  7. #include <systemd/sd-journal.h>
  8. #include <syslog.h>
  9. #define SYSTEMD_JOURNAL_FUNCTION_DESCRIPTION "View, search and analyze systemd journal entries."
  10. #define SYSTEMD_JOURNAL_FUNCTION_NAME "systemd-journal"
  11. #define SYSTEMD_JOURNAL_DEFAULT_TIMEOUT 60
  12. #define SYSTEMD_JOURNAL_ENABLE_ESTIMATIONS_FILE_PERCENTAGE 0.01
  13. #define SYSTEMD_JOURNAL_EXECUTE_WATCHER_PENDING_EVERY_MS 250
  14. #define SYSTEMD_JOURNAL_ALL_FILES_SCAN_EVERY_USEC (5 * 60 * USEC_PER_SEC)
  15. #define SYSTEMD_UNITS_FUNCTION_DESCRIPTION "View the status of systemd units"
  16. #define SYSTEMD_UNITS_FUNCTION_NAME "systemd-list-units"
  17. #define SYSTEMD_UNITS_DEFAULT_TIMEOUT 30
  18. extern __thread size_t fstat_thread_calls;
  19. extern __thread size_t fstat_thread_cached_responses;
  20. void fstat_cache_enable_on_thread(void);
  21. void fstat_cache_disable_on_thread(void);
  22. extern netdata_mutex_t stdout_mutex;
  23. typedef enum {
  24. ND_SD_JOURNAL_NO_FILE_MATCHED,
  25. ND_SD_JOURNAL_FAILED_TO_OPEN,
  26. ND_SD_JOURNAL_FAILED_TO_SEEK,
  27. ND_SD_JOURNAL_TIMED_OUT,
  28. ND_SD_JOURNAL_OK,
  29. ND_SD_JOURNAL_NOT_MODIFIED,
  30. ND_SD_JOURNAL_CANCELLED,
  31. } ND_SD_JOURNAL_STATUS;
  32. typedef enum {
  33. SDJF_NONE = 0,
  34. SDJF_ALL = (1 << 0),
  35. SDJF_LOCAL_ALL = (1 << 1),
  36. SDJF_REMOTE_ALL = (1 << 2),
  37. SDJF_LOCAL_SYSTEM = (1 << 3),
  38. SDJF_LOCAL_USER = (1 << 4),
  39. SDJF_LOCAL_NAMESPACE = (1 << 5),
  40. SDJF_LOCAL_OTHER = (1 << 6),
  41. } SD_JOURNAL_FILE_SOURCE_TYPE;
  42. struct journal_file {
  43. const char *filename;
  44. size_t filename_len;
  45. STRING *source;
  46. SD_JOURNAL_FILE_SOURCE_TYPE source_type;
  47. usec_t file_last_modified_ut;
  48. usec_t msg_first_ut;
  49. usec_t msg_last_ut;
  50. size_t size;
  51. bool logged_failure;
  52. bool logged_journalctl_failure;
  53. usec_t max_journal_vs_realtime_delta_ut;
  54. usec_t last_scan_monotonic_ut;
  55. usec_t last_scan_header_vs_last_modified_ut;
  56. uint64_t first_seqnum;
  57. uint64_t last_seqnum;
  58. sd_id128_t first_writer_id;
  59. sd_id128_t last_writer_id;
  60. uint64_t messages_in_file;
  61. };
  62. #define SDJF_SOURCE_ALL_NAME "all"
  63. #define SDJF_SOURCE_LOCAL_NAME "all-local-logs"
  64. #define SDJF_SOURCE_LOCAL_SYSTEM_NAME "all-local-system-logs"
  65. #define SDJF_SOURCE_LOCAL_USERS_NAME "all-local-user-logs"
  66. #define SDJF_SOURCE_LOCAL_OTHER_NAME "all-uncategorized"
  67. #define SDJF_SOURCE_NAMESPACES_NAME "all-local-namespaces"
  68. #define SDJF_SOURCE_REMOTES_NAME "all-remote-systems"
  69. #define ND_SD_JOURNAL_OPEN_FLAGS (0)
  70. #define JOURNAL_VS_REALTIME_DELTA_DEFAULT_UT (5 * USEC_PER_SEC) // assume always 5 seconds latency
  71. #define JOURNAL_VS_REALTIME_DELTA_MAX_UT (2 * 60 * USEC_PER_SEC) // up to 2 minutes latency
  72. extern DICTIONARY *journal_files_registry;
  73. extern DICTIONARY *used_hashes_registry;
  74. extern DICTIONARY *function_query_status_dict;
  75. extern DICTIONARY *boot_ids_to_first_ut;
  76. int journal_file_dict_items_backward_compar(const void *a, const void *b);
  77. int journal_file_dict_items_forward_compar(const void *a, const void *b);
  78. void buffer_json_journal_versions(BUFFER *wb);
  79. void available_journal_file_sources_to_json_array(BUFFER *wb);
  80. bool journal_files_completed_once(void);
  81. void journal_files_registry_update(void);
  82. void journal_directory_scan_recursively(DICTIONARY *files, DICTIONARY *dirs, const char *dirname, int depth);
  83. FACET_ROW_SEVERITY syslog_priority_to_facet_severity(FACETS *facets, FACET_ROW *row, void *data);
  84. void netdata_systemd_journal_dynamic_row_id(FACETS *facets, BUFFER *json_array, FACET_ROW_KEY_VALUE *rkv, FACET_ROW *row, void *data);
  85. void netdata_systemd_journal_transform_priority(FACETS *facets, BUFFER *wb, FACETS_TRANSFORMATION_SCOPE scope, void *data);
  86. void netdata_systemd_journal_transform_syslog_facility(FACETS *facets, BUFFER *wb, FACETS_TRANSFORMATION_SCOPE scope, void *data);
  87. void netdata_systemd_journal_transform_errno(FACETS *facets, BUFFER *wb, FACETS_TRANSFORMATION_SCOPE scope, void *data);
  88. void netdata_systemd_journal_transform_boot_id(FACETS *facets, BUFFER *wb, FACETS_TRANSFORMATION_SCOPE scope, void *data);
  89. void netdata_systemd_journal_transform_uid(FACETS *facets, BUFFER *wb, FACETS_TRANSFORMATION_SCOPE scope, void *data);
  90. void netdata_systemd_journal_transform_gid(FACETS *facets, BUFFER *wb, FACETS_TRANSFORMATION_SCOPE scope, void *data);
  91. void netdata_systemd_journal_transform_cap_effective(FACETS *facets, BUFFER *wb, FACETS_TRANSFORMATION_SCOPE scope, void *data);
  92. void netdata_systemd_journal_transform_timestamp_usec(FACETS *facets, BUFFER *wb, FACETS_TRANSFORMATION_SCOPE scope, void *data);
  93. usec_t journal_file_update_annotation_boot_id(sd_journal *j, struct journal_file *jf, const char *boot_id);
  94. #define MAX_JOURNAL_DIRECTORIES 100
  95. struct journal_directory {
  96. char *path;
  97. };
  98. extern struct journal_directory journal_directories[MAX_JOURNAL_DIRECTORIES];
  99. void journal_init_files_and_directories(void);
  100. void journal_init_query_status(void);
  101. void function_systemd_journal(const char *transaction, char *function, int timeout, bool *cancelled);
  102. void journal_file_update_header(const char *filename, struct journal_file *jf);
  103. void netdata_systemd_journal_message_ids_init(void);
  104. void netdata_systemd_journal_transform_message_id(FACETS *facets __maybe_unused, BUFFER *wb, FACETS_TRANSFORMATION_SCOPE scope __maybe_unused, void *data __maybe_unused);
  105. void *journal_watcher_main(void *arg);
  106. #ifdef ENABLE_SYSTEMD_DBUS
  107. void function_systemd_units(const char *transaction, char *function, int timeout, bool *cancelled);
  108. #endif
  109. static inline void send_newline_and_flush(void) {
  110. netdata_mutex_lock(&stdout_mutex);
  111. fprintf(stdout, "\n");
  112. fflush(stdout);
  113. netdata_mutex_unlock(&stdout_mutex);
  114. }
  115. static inline bool parse_journal_field(const char *data, size_t data_length, const char **key, size_t *key_length, const char **value, size_t *value_length) {
  116. const char *k = data;
  117. const char *equal = strchr(k, '=');
  118. if(unlikely(!equal))
  119. return false;
  120. size_t kl = equal - k;
  121. const char *v = ++equal;
  122. size_t vl = data_length - kl - 1;
  123. *key = k;
  124. *key_length = kl;
  125. *value = v;
  126. *value_length = vl;
  127. return true;
  128. }
  129. #endif //NETDATA_COLLECTORS_SYSTEMD_INTERNALS_H