| 1 | // SPDX-License-Identifier: GPL-3.0-or-later |
| 2 | |
| 3 | #ifndef NETDATA_RRDENGINEAPI_H |
| 4 | #define NETDATA_RRDENGINEAPI_H |
| 5 | |
| 6 | #include "rrdengine.h" |
| 7 | |
| 8 | #define RRDENG_MIN_PAGE_CACHE_SIZE_MB (8) |
| 9 | #define RRDENG_MIN_DISK_SPACE_MB (25) |
| 10 | #define RRDENG_DEFAULT_TIER_DISK_SPACE_MB (1024) |
| 11 | |
| 12 | #define RRDENG_NR_STATS (38) |
| 13 | |
| 14 | #define RRDENG_FD_BUDGET_PER_INSTANCE (50) |
| 15 | |
| 16 | extern uint64_t dbengine_out_of_memory_protection; |
| 17 | extern bool dbengine_use_all_ram_for_caches; |
| 18 | |
| 19 | extern int default_rrdeng_page_cache_mb; |
| 20 | extern int default_rrdeng_extent_cache_mb; |
| 21 | extern int db_engine_journal_check; |
| 22 | extern int default_rrdeng_disk_quota_mb; |
| 23 | extern int default_multidb_disk_quota_mb; |
| 24 | extern bool new_dbengine_defaults; |
| 25 | extern bool legacy_multihost_db_space; |
| 26 | extern RRD_BACKFILL default_backfill; |
| 27 | |
| 28 | extern struct rrdengine_instance *multidb_ctx[RRD_STORAGE_TIERS]; |
| 29 | extern size_t page_type_size[]; |
| 30 | extern size_t tier_page_size[]; |
| 31 | extern size_t tier_quota_mb[]; |
| 32 | extern uint8_t tier_page_type[]; |
| 33 | |
| 34 | #define CTX_POINT_SIZE_BYTES(ctx) page_type_size[(ctx)->config.page_type] |
| 35 | |
| 36 | STORAGE_METRIC_HANDLE *rrdeng_metric_get_or_create(RRDDIM *rd, STORAGE_INSTANCE *si); |
| 37 | STORAGE_METRIC_HANDLE *rrdeng_metric_get_by_id(STORAGE_INSTANCE *si, UUIDMAP_ID id); |
| 38 | STORAGE_METRIC_HANDLE *rrdeng_metric_get_by_uuid(STORAGE_INSTANCE *si, nd_uuid_t *uuid); |
| 39 | void rrdeng_metric_release(STORAGE_METRIC_HANDLE *smh); |
| 40 | STORAGE_METRIC_HANDLE *rrdeng_metric_dup(STORAGE_METRIC_HANDLE *smh); |
| 41 | |
| 42 | STORAGE_COLLECT_HANDLE *rrdeng_store_metric_init(STORAGE_METRIC_HANDLE *smh, uint32_t update_every, STORAGE_METRICS_GROUP *smg); |
| 43 | void rrdeng_store_metric_flush_current_page(STORAGE_COLLECT_HANDLE *sch); |
| 44 | void rrdeng_store_metric_change_collection_frequency(STORAGE_COLLECT_HANDLE *sch, int update_every); |
| 45 | void rrdeng_store_metric_next(STORAGE_COLLECT_HANDLE *sch, usec_t point_in_time_ut, NETDATA_DOUBLE n, |
| 46 | NETDATA_DOUBLE min_value, |
| 47 | NETDATA_DOUBLE max_value, |
| 48 | uint16_t count, |
| 49 | uint16_t anomaly_count, |
| 50 | SN_FLAGS flags); |
| 51 | int rrdeng_store_metric_finalize(STORAGE_COLLECT_HANDLE *sch); |
| 52 | |
| 53 | void rrdeng_load_metric_init(STORAGE_METRIC_HANDLE *smh, struct storage_engine_query_handle *seqh, |
| 54 | time_t start_time_s, time_t end_time_s, STORAGE_PRIORITY priority); |
| 55 | STORAGE_POINT rrdeng_load_metric_next(struct storage_engine_query_handle *seqh); |
| 56 | |
| 57 | |
| 58 | int rrdeng_load_metric_is_finished(struct storage_engine_query_handle *seqh); |
| 59 | void rrdeng_load_metric_finalize(struct storage_engine_query_handle *seqh); |
| 60 | time_t rrdeng_metric_latest_time(STORAGE_METRIC_HANDLE *smh); |
| 61 | time_t rrdeng_metric_oldest_time(STORAGE_METRIC_HANDLE *smh); |
| 62 | time_t rrdeng_load_align_to_optimal_before(struct storage_engine_query_handle *seqh); |
| 63 | |
| 64 | void rrdeng_get_37_statistics(struct rrdengine_instance *ctx, unsigned long long *array); |
| 65 | |
| 66 | /* must call once before using anything */ |
| 67 | int rrdeng_init( |
| 68 | struct rrdengine_instance **ctxp, |
| 69 | const char *dbfiles_path, |
| 70 | unsigned disk_space_mb, |
| 71 | size_t tier, |
| 72 | time_t max_retention_s); |
| 73 | |
| 74 | void rrdeng_readiness_wait(struct rrdengine_instance *ctx); |
| 75 | |
| 76 | int rrdeng_exit(struct rrdengine_instance *ctx); |
| 77 | void rrdeng_quiesce(struct rrdengine_instance *ctx); |
| 78 | void rrdeng_flush_dirty(struct rrdengine_instance *ctx); |
| 79 | void rrdeng_flush_all(struct rrdengine_instance *ctx); |
| 80 | |
| 81 | |
| 82 | bool rrdeng_metric_retention_by_id(STORAGE_INSTANCE *si, UUIDMAP_ID id, time_t *first_entry_s, time_t *last_entry_s); |
| 83 | bool rrdeng_metric_retention_by_uuid(STORAGE_INSTANCE *si, nd_uuid_t *dim_uuid, time_t *first_entry_s, time_t *last_entry_s); |
| 84 | void rrdeng_metric_retention_delete_by_id(STORAGE_INSTANCE *si, UUIDMAP_ID id); |
| 85 | |
| 86 | extern STORAGE_METRICS_GROUP *rrdeng_metrics_group_get(STORAGE_INSTANCE *si, nd_uuid_t *uuid); |
| 87 | extern void rrdeng_metrics_group_release(STORAGE_INSTANCE *si, STORAGE_METRICS_GROUP *smg); |
| 88 | |
| 89 | typedef struct rrdengine_size_statistics { |
| 90 | size_t default_granularity_secs; |
| 91 | |
| 92 | size_t sizeof_datafile; |
| 93 | size_t sizeof_page_in_cache; |
| 94 | size_t sizeof_point_data; |
| 95 | size_t sizeof_page_data; |
| 96 | |
| 97 | size_t pages_per_extent; |
| 98 | |
| 99 | size_t datafiles; |
| 100 | size_t extents; |
| 101 | size_t extents_pages; |
| 102 | size_t points; |
| 103 | size_t metrics; |
| 104 | size_t metrics_pages; |
| 105 | |
| 106 | size_t extents_compressed_bytes; |
| 107 | size_t pages_uncompressed_bytes; |
| 108 | time_t pages_duration_secs; |
| 109 | |
| 110 | struct { |
| 111 | size_t pages; |
| 112 | size_t pages_uncompressed_bytes; |
| 113 | time_t pages_duration_secs; |
| 114 | size_t points; |
| 115 | } page_types[256]; |
| 116 | |
| 117 | size_t single_point_pages; |
| 118 | |
| 119 | time_t first_time_s; |
| 120 | time_t last_time_s; |
| 121 | |
| 122 | size_t currently_collected_metrics; |
| 123 | size_t estimated_concurrently_collected_metrics; |
| 124 | |
| 125 | size_t disk_space; |
| 126 | size_t max_disk_space; |
| 127 | |
| 128 | time_t database_retention_secs; |
| 129 | double average_compression_savings; |
| 130 | double average_point_duration_secs; |
| 131 | double average_metric_retention_secs; |
| 132 | |
| 133 | double ephemeral_metrics_per_day_percent; |
| 134 | |
| 135 | double average_page_size_bytes; |
| 136 | } RRDENG_SIZE_STATS; |
| 137 | |
| 138 | struct time_and_count { |
| 139 | size_t count; |
| 140 | usec_t usec; |
| 141 | }; |
| 142 | |
| 143 | static ALWAYS_INLINE void time_and_count_add(struct time_and_count *tc, usec_t dt) { |
| 144 | __atomic_add_fetch(&tc->count, 1, __ATOMIC_RELAXED); |
| 145 | __atomic_add_fetch(&tc->usec, dt, __ATOMIC_RELAXED); |
| 146 | } |
| 147 | |
| 148 | struct rrdeng_cache_efficiency_stats { |
| 149 | PAD64(size_t) queries_planned_with_gaps; |
| 150 | PAD64(size_t) queries_executed_with_gaps; |
| 151 | |
| 152 | PAD64(size_t) currently_running_queries; |
| 153 | |
| 154 | // query planner output of the queries |
| 155 | PAD64(size_t) pages_total; |
| 156 | PAD64(size_t) pages_to_load_from_disk; |
| 157 | PAD64(size_t) extents_loaded_from_disk; |
| 158 | |
| 159 | // pages metadata sources |
| 160 | PAD64(size_t) pages_meta_source_main_cache; |
| 161 | PAD64(size_t) pages_meta_source_open_cache; |
| 162 | PAD64(size_t) pages_meta_source_journal_v2; |
| 163 | |
| 164 | // preloading |
| 165 | PAD64(size_t) page_next_wait_failed; |
| 166 | PAD64(size_t) page_next_wait_loaded; |
| 167 | PAD64(size_t) page_next_nowait_failed; |
| 168 | PAD64(size_t) page_next_nowait_loaded; |
| 169 | |
| 170 | // pages data sources |
| 171 | PAD64(size_t) pages_data_source_main_cache; |
| 172 | PAD64(size_t) pages_data_source_main_cache_at_pass4; |
| 173 | PAD64(size_t) pages_data_source_disk; |
| 174 | PAD64(size_t) pages_data_source_extent_cache; // loaded by a cached extent |
| 175 | |
| 176 | // cache hits at different points |
| 177 | PAD64(size_t) pages_load_ok_loaded_but_cache_hit_while_inserting; // found in cache while inserting it (conflict) |
| 178 | |
| 179 | // loading |
| 180 | PAD64(size_t) pages_load_extent_merged; |
| 181 | PAD64(size_t) pages_load_ok_uncompressed; |
| 182 | PAD64(size_t) pages_load_ok_compressed; |
| 183 | PAD64(size_t) pages_load_fail_invalid_page_in_extent; |
| 184 | PAD64(size_t) pages_load_fail_cant_mmap_extent; |
| 185 | PAD64(size_t) pages_load_fail_datafile_not_available; |
| 186 | PAD64(size_t) pages_load_fail_unroutable; |
| 187 | PAD64(size_t) pages_load_fail_not_found; |
| 188 | PAD64(size_t) pages_load_fail_invalid_extent; |
| 189 | PAD64(size_t) pages_load_fail_cancelled; |
| 190 | |
| 191 | // count of queries and times spent in them |
| 192 | PAD64(struct time_and_count) prep_time_to_route_sync; |
| 193 | PAD64(struct time_and_count) prep_time_to_route_syncfirst; |
| 194 | PAD64(struct time_and_count) prep_time_to_route_async; |
| 195 | PAD64(struct time_and_count) prep_time_in_main_cache_lookup; |
| 196 | PAD64(struct time_and_count) prep_time_in_open_cache_lookup; |
| 197 | PAD64(struct time_and_count) prep_time_in_journal_v2_lookup; |
| 198 | PAD64(struct time_and_count) prep_time_in_pass4_lookup; |
| 199 | |
| 200 | // timings the query thread experiences |
| 201 | PAD64(struct time_and_count) query_time_init; |
| 202 | PAD64(struct time_and_count) query_time_wait_for_prep; |
| 203 | PAD64(struct time_and_count) query_time_to_slow_disk_next_page; |
| 204 | PAD64(struct time_and_count) query_time_to_fast_disk_next_page; |
| 205 | PAD64(struct time_and_count) query_time_to_slow_preload_next_page; |
| 206 | PAD64(struct time_and_count) query_time_to_fast_preload_next_page; |
| 207 | |
| 208 | // query issues |
| 209 | PAD64(size_t) pages_zero_time_skipped; |
| 210 | PAD64(size_t) pages_past_time_skipped; |
| 211 | PAD64(size_t) pages_overlapping_skipped; |
| 212 | PAD64(size_t) pages_invalid_size_skipped; |
| 213 | PAD64(size_t) pages_invalid_update_every_fixed; |
| 214 | PAD64(size_t) pages_invalid_entries_fixed; |
| 215 | |
| 216 | // database events |
| 217 | PAD64(size_t) journal_v2_mapped; |
| 218 | PAD64(size_t) journal_v2_unmapped; |
| 219 | PAD64(size_t) datafile_creation_started; |
| 220 | PAD64(size_t) datafile_deletion_started; |
| 221 | PAD64(size_t) datafile_deletion_spin; |
| 222 | PAD64(size_t) journal_v2_indexing_started; |
| 223 | PAD64(size_t) metrics_retention_started; |
| 224 | }; |
| 225 | |
| 226 | typedef enum rrdeng_mem { |
| 227 | RRDENG_MEM_PGC = 0, |
| 228 | RRDENG_MEM_PGD, |
| 229 | RRDENG_MEM_MRG, |
| 230 | RRDENG_MEM_OPCODES, |
| 231 | RRDENG_MEM_HANDLES, |
| 232 | RRDENG_MEM_DESCRIPTORS, |
| 233 | RRDENG_MEM_WORKERS, |
| 234 | RRDENG_MEM_PDC, |
| 235 | RRDENG_MEM_XT_IO, |
| 236 | RRDENG_MEM_EPDL, |
| 237 | RRDENG_MEM_DEOL, |
| 238 | RRDENG_MEM_PD, |
| 239 | RRDENG_MEM_EPDL_EXTENT, |
| 240 | |
| 241 | // terminator |
| 242 | RRDENG_MEM_MAX, |
| 243 | } RRDENG_MEM; |
| 244 | |
| 245 | struct rrdeng_buffer_sizes { |
| 246 | struct aral_statistics *as[RRDENG_MEM_MAX]; |
| 247 | |
| 248 | size_t wal; |
| 249 | size_t xt_buf; |
| 250 | }; |
| 251 | |
| 252 | struct rrdeng_buffer_sizes rrdeng_pulse_memory_sizes(void); |
| 253 | struct rrdeng_cache_efficiency_stats rrdeng_get_cache_efficiency_stats(void); |
| 254 | |
| 255 | RRDENG_SIZE_STATS rrdeng_size_statistics(struct rrdengine_instance *ctx); |
| 256 | size_t rrdeng_collectors_running(struct rrdengine_instance *ctx); |
| 257 | |
| 258 | #endif /* NETDATA_RRDENGINEAPI_H */ |