1use std::time::Duration;
16
17use lazy_static::lazy_static;
18use prometheus::*;
19use puffin::puffin_manager::stager::StagerNotifier;
20
21pub const STAGE_LABEL: &str = "stage";
23pub const TYPE_LABEL: &str = "type";
25const CACHE_EVICTION_CAUSE: &str = "cause";
26pub const FLUSH_REASON: &str = "reason";
28pub const FILE_TYPE_LABEL: &str = "file_type";
30pub const WORKER_LABEL: &str = "worker";
32pub const PARTITION_LABEL: &str = "partition";
34pub const STAGING_TYPE: &str = "index_staging";
36pub const RECYCLE_TYPE: &str = "recycle_bin";
38
39lazy_static! {
41 pub static ref WRITE_BUFFER_BYTES: IntGauge =
43 register_int_gauge!("greptime_mito_write_buffer_bytes", "mito write buffer bytes").unwrap();
44 pub static ref MEMTABLE_DICT_BYTES: IntGauge =
46 register_int_gauge!("greptime_mito_memtable_dict_bytes", "mito memtable dictionary size in bytes").unwrap();
47 pub static ref REGION_COUNT: IntGaugeVec =
49 register_int_gauge_vec!(
50 "greptime_mito_region_count",
51 "mito region count in each worker",
52 &[WORKER_LABEL],
53 ).unwrap();
54 pub static ref HANDLE_REQUEST_ELAPSED: HistogramVec = register_histogram_vec!(
56 "greptime_mito_handle_request_elapsed",
57 "mito handle request elapsed",
58 &[TYPE_LABEL],
59 exponential_buckets(0.01, 10.0, 7).unwrap(),
61 )
62 .unwrap();
63
64 pub static ref FLUSH_REQUESTS_TOTAL: IntCounterVec = register_int_counter_vec!(
68 "greptime_mito_flush_requests_total",
69 "mito flush requests total",
70 &[FLUSH_REASON]
71 )
72 .unwrap();
73 pub static ref FLUSH_FAILURE_TOTAL: IntCounter =
75 register_int_counter!("greptime_mito_flush_failure_total", "mito flush failure total").unwrap();
76 pub static ref FLUSH_ELAPSED: HistogramVec = register_histogram_vec!(
78 "greptime_mito_flush_elapsed",
79 "mito flush elapsed",
80 &[TYPE_LABEL],
81 exponential_buckets(1.0, 5.0, 6).unwrap(),
83 )
84 .unwrap();
85 pub static ref FLUSH_BYTES_TOTAL: IntCounter =
87 register_int_counter!("greptime_mito_flush_bytes_total", "mito flush bytes total").unwrap();
88 pub static ref INFLIGHT_FLUSH_COUNT: IntGauge =
90 register_int_gauge!(
91 "greptime_mito_inflight_flush_count",
92 "inflight flush count",
93 ).unwrap();
94 pub static ref WRITE_REJECT_TOTAL: IntCounter =
101 register_int_counter!("greptime_mito_write_reject_total", "mito write reject total").unwrap();
102 pub static ref WRITE_STAGE_ELAPSED: HistogramVec = register_histogram_vec!(
104 "greptime_mito_write_stage_elapsed",
105 "mito write stage elapsed",
106 &[STAGE_LABEL],
107 exponential_buckets(0.01, 10.0, 6).unwrap(),
109 )
110 .unwrap();
111 pub static ref WRITE_ROWS_TOTAL: IntCounterVec = register_int_counter_vec!(
113 "greptime_mito_write_rows_total",
114 "mito write rows total",
115 &[TYPE_LABEL]
116 )
117 .unwrap();
118}
119
120lazy_static! {
122 pub static ref COMPACTION_STAGE_ELAPSED: HistogramVec = register_histogram_vec!(
132 "greptime_mito_compaction_stage_elapsed",
133 "mito compaction stage elapsed",
134 &[STAGE_LABEL],
135 exponential_buckets(1.0, 10.0, 6).unwrap(),
137 )
138 .unwrap();
139 pub static ref COMPACTION_ELAPSED_TOTAL: Histogram =
141 register_histogram!(
142 "greptime_mito_compaction_total_elapsed",
143 "mito compaction total elapsed",
144 exponential_buckets(1.0, 10.0, 6).unwrap(),
146 ).unwrap();
147 pub static ref COMPACTION_REQUEST_COUNT: IntCounter =
149 register_int_counter!("greptime_mito_compaction_requests_total", "mito compaction requests total").unwrap();
150 pub static ref COMPACTION_FAILURE_COUNT: IntCounter =
152 register_int_counter!("greptime_mito_compaction_failure_total", "mito compaction failure total").unwrap();
153
154 pub static ref INFLIGHT_COMPACTION_COUNT: IntGauge =
156 register_int_gauge!(
157 "greptime_mito_inflight_compaction_count",
158 "inflight compaction count",
159 ).unwrap();
160
161 pub static ref COMPACTION_MEMORY_IN_USE: IntGauge =
163 register_int_gauge!(
164 "greptime_mito_compaction_memory_in_use_bytes",
165 "bytes currently reserved for compaction tasks",
166 )
167 .unwrap();
168 pub static ref COMPACTION_MEMORY_LIMIT: IntGauge =
170 register_int_gauge!(
171 "greptime_mito_compaction_memory_limit_bytes",
172 "maximum bytes allowed for compaction tasks",
173 )
174 .unwrap();
175 pub static ref COMPACTION_MEMORY_WAIT: Histogram = register_histogram!(
177 "greptime_mito_compaction_memory_wait_seconds",
178 "time waiting for compaction memory",
179 exponential_buckets(0.01, 2.0, 10).unwrap(),
181 ).unwrap();
182 pub static ref COMPACTION_MEMORY_REJECTED: IntCounterVec =
184 register_int_counter_vec!(
185 "greptime_mito_compaction_memory_rejected_total",
186 "number of compaction tasks rejected due to memory limit",
187 &[TYPE_LABEL]
188 ).unwrap();
189}
190
191lazy_static! {
193 pub static ref READ_STAGE_ELAPSED: HistogramVec = register_histogram_vec!(
195 "greptime_mito_read_stage_elapsed",
196 "mito read stage elapsed",
197 &[STAGE_LABEL],
198 exponential_buckets(0.01, 10.0, 7).unwrap(),
200 )
201 .unwrap();
202 pub static ref READ_STAGE_FETCH_PAGES: Histogram = READ_STAGE_ELAPSED.with_label_values(&["fetch_pages"]);
203 pub static ref IN_PROGRESS_SCAN: IntGaugeVec = register_int_gauge_vec!(
205 "greptime_mito_in_progress_scan",
206 "mito in progress scan per partition",
207 &[TYPE_LABEL, PARTITION_LABEL]
208 )
209 .unwrap();
210 pub static ref READ_ROWS_TOTAL: IntCounterVec =
212 register_int_counter_vec!("greptime_mito_read_rows_total", "mito read rows total", &[TYPE_LABEL]).unwrap();
213 pub static ref MERGE_FILTER_ROWS_TOTAL: IntCounterVec =
215 register_int_counter_vec!("greptime_mito_merge_filter_rows_total", "mito merge filter rows total", &[TYPE_LABEL]).unwrap();
216 pub static ref READ_ROW_GROUPS_TOTAL: IntCounterVec =
218 register_int_counter_vec!("greptime_mito_read_row_groups_total", "mito read row groups total", &[TYPE_LABEL]).unwrap();
219 pub static ref PRECISE_FILTER_ROWS_TOTAL: IntCounterVec =
221 register_int_counter_vec!("greptime_mito_precise_filter_rows_total", "mito precise filter rows total", &[TYPE_LABEL]).unwrap();
222 pub static ref READ_ROWS_IN_ROW_GROUP_TOTAL: IntCounterVec =
223 register_int_counter_vec!("greptime_mito_read_rows_in_row_group_total", "mito read rows in row group total", &[TYPE_LABEL]).unwrap();
224 pub static ref READ_SST_COUNT: Histogram = register_histogram!(
226 "greptime_mito_read_sst_count",
227 "Number of SSTs to scan in a scan task",
228 vec![1.0, 4.0, 8.0, 16.0, 32.0, 64.0, 256.0, 1024.0],
229 ).unwrap();
230 pub static ref READ_ROWS_RETURN: Histogram = register_histogram!(
232 "greptime_mito_read_rows_return",
233 "Number of rows returned in a scan task",
234 exponential_buckets(100.0, 10.0, 8).unwrap(),
235 ).unwrap();
236 pub static ref READ_BATCHES_RETURN: Histogram = register_histogram!(
238 "greptime_mito_read_batches_return",
239 "Number of rows returned in a scan task",
240 exponential_buckets(100.0, 10.0, 7).unwrap(),
241 ).unwrap();
242 pub static ref SCAN_MEMORY_USAGE_BYTES: IntGauge = register_int_gauge!(
244 "greptime_mito_scan_memory_usage_bytes",
245 "current scan memory usage in bytes"
246 ).unwrap();
247 pub static ref SCAN_MEMORY_EXHAUSTED_TOTAL: IntCounter = register_int_counter!(
249 "greptime_mito_scan_memory_exhausted_total",
250 "total number of times scan memory was unavailable for immediate acquisition"
251 ).unwrap();
252 pub static ref SCAN_REQUESTS_REJECTED_TOTAL: IntCounter = register_int_counter!(
254 "greptime_mito_scan_requests_rejected_total",
255 "total number of scan requests that ultimately failed due to memory limit"
256 ).unwrap();
257 pub static ref PRUNER_ACTIVE_BUILDERS: IntGauge = register_int_gauge!(
259 "greptime_mito_pruner_active_builders",
260 "number of active file range builders in the pruner"
261 ).unwrap();
262}
263
264lazy_static! {
266 pub static ref CACHE_HIT: IntCounterVec = register_int_counter_vec!(
268 "greptime_mito_cache_hit",
269 "mito cache hit",
270 &[TYPE_LABEL]
271 )
272 .unwrap();
273 pub static ref CACHE_MISS: IntCounterVec = register_int_counter_vec!(
275 "greptime_mito_cache_miss",
276 "mito cache miss",
277 &[TYPE_LABEL]
278 )
279 .unwrap();
280 pub static ref CACHE_BYTES: IntGaugeVec = register_int_gauge_vec!(
282 "greptime_mito_cache_bytes",
283 "mito cache bytes",
284 &[TYPE_LABEL]
285 )
286 .unwrap();
287 pub static ref WRITE_CACHE_DOWNLOAD_BYTES_TOTAL: IntCounter = register_int_counter!(
289 "mito_write_cache_download_bytes_total",
290 "mito write cache download bytes total",
291 ).unwrap();
292 pub static ref WRITE_CACHE_DOWNLOAD_ELAPSED: HistogramVec = register_histogram_vec!(
294 "mito_write_cache_download_elapsed",
295 "mito write cache download elapsed",
296 &[TYPE_LABEL],
297 exponential_buckets(0.1, 10.0, 6).unwrap(),
299 ).unwrap();
300 pub static ref WRITE_CACHE_INFLIGHT_DOWNLOAD: IntGauge = register_int_gauge!(
302 "mito_write_cache_inflight_download_count",
303 "mito write cache inflight download tasks",
304 ).unwrap();
305 pub static ref UPLOAD_BYTES_TOTAL: IntCounter = register_int_counter!(
307 "mito_upload_bytes_total",
308 "mito upload bytes total",
309 )
310 .unwrap();
311 pub static ref CACHE_EVICTION: IntCounterVec = register_int_counter_vec!(
313 "greptime_mito_cache_eviction",
314 "mito cache eviction",
315 &[TYPE_LABEL, CACHE_EVICTION_CAUSE]
316 ).unwrap();
317}
318
319lazy_static! {
321 pub static ref INDEX_PUBLICATION_STALE_TOTAL: IntCounterVec =
324 register_int_counter_vec!(
325 "greptime_mito_index_publication_stale_total",
326 "stale index publications rejected",
327 &[STAGE_LABEL],
328 ).unwrap();
329 pub static ref INDEX_ARTIFACT_CLEANUP_FAILURE_TOTAL: IntCounter =
331 register_int_counter!(
332 "greptime_mito_index_artifact_cleanup_failure_total",
333 "failures while cleaning local state for stale index artifacts",
334 ).unwrap();
335 pub static ref INDEX_APPLY_ELAPSED: HistogramVec = register_histogram_vec!(
337 "greptime_index_apply_elapsed",
338 "index apply elapsed",
339 &[TYPE_LABEL],
340 exponential_buckets(0.01, 10.0, 6).unwrap(),
342 )
343 .unwrap();
344 pub static ref INDEX_APPLY_MEMORY_USAGE: IntGauge = register_int_gauge!(
346 "greptime_index_apply_memory_usage",
347 "index apply memory usage",
348 )
349 .unwrap();
350 pub static ref INDEX_CREATE_ELAPSED: HistogramVec = register_histogram_vec!(
352 "greptime_index_create_elapsed",
353 "index create elapsed",
354 &[STAGE_LABEL, TYPE_LABEL],
355 exponential_buckets(0.1, 10.0, 6).unwrap(),
357 )
358 .unwrap();
359 pub static ref INDEX_CREATE_ROWS_TOTAL: IntCounterVec = register_int_counter_vec!(
361 "greptime_index_create_rows_total",
362 "index create rows total",
363 &[TYPE_LABEL],
364 )
365 .unwrap();
366 pub static ref INDEX_CREATE_BYTES_TOTAL: IntCounterVec = register_int_counter_vec!(
368 "greptime_index_create_bytes_total",
369 "index create bytes total",
370 &[TYPE_LABEL],
371 )
372 .unwrap();
373 pub static ref INDEX_CREATE_MEMORY_USAGE: IntGaugeVec = register_int_gauge_vec!(
375 "greptime_index_create_memory_usage",
376 "index create memory usage",
377 &[TYPE_LABEL],
378 ).unwrap();
379 pub static ref INDEX_IO_BYTES_TOTAL: IntCounterVec = register_int_counter_vec!(
381 "greptime_index_io_bytes_total",
382 "index io bytes total",
383 &[TYPE_LABEL, FILE_TYPE_LABEL]
384 )
385 .unwrap();
386 pub static ref INDEX_PUFFIN_READ_BYTES_TOTAL: IntCounter = INDEX_IO_BYTES_TOTAL
388 .with_label_values(&["read", "puffin"]);
389 pub static ref INDEX_PUFFIN_WRITE_BYTES_TOTAL: IntCounter = INDEX_IO_BYTES_TOTAL
391 .with_label_values(&["write", "puffin"]);
392 pub static ref INDEX_INTERMEDIATE_READ_BYTES_TOTAL: IntCounter = INDEX_IO_BYTES_TOTAL
394 .with_label_values(&["read", "intermediate"]);
395 pub static ref INDEX_INTERMEDIATE_WRITE_BYTES_TOTAL: IntCounter = INDEX_IO_BYTES_TOTAL
397 .with_label_values(&["write", "intermediate"]);
398
399 pub static ref INDEX_IO_OP_TOTAL: IntCounterVec = register_int_counter_vec!(
401 "greptime_index_io_op_total",
402 "index io op total",
403 &[TYPE_LABEL, FILE_TYPE_LABEL]
404 )
405 .unwrap();
406 pub static ref INDEX_PUFFIN_READ_OP_TOTAL: IntCounter = INDEX_IO_OP_TOTAL
408 .with_label_values(&["read", "puffin"]);
409 pub static ref INDEX_PUFFIN_SEEK_OP_TOTAL: IntCounter = INDEX_IO_OP_TOTAL
411 .with_label_values(&["seek", "puffin"]);
412 pub static ref INDEX_PUFFIN_WRITE_OP_TOTAL: IntCounter = INDEX_IO_OP_TOTAL
414 .with_label_values(&["write", "puffin"]);
415 pub static ref INDEX_PUFFIN_FLUSH_OP_TOTAL: IntCounter = INDEX_IO_OP_TOTAL
417 .with_label_values(&["flush", "puffin"]);
418 pub static ref INDEX_INTERMEDIATE_READ_OP_TOTAL: IntCounter = INDEX_IO_OP_TOTAL
420 .with_label_values(&["read", "intermediate"]);
421 pub static ref INDEX_INTERMEDIATE_SEEK_OP_TOTAL: IntCounter = INDEX_IO_OP_TOTAL
423 .with_label_values(&["seek", "intermediate"]);
424 pub static ref INDEX_INTERMEDIATE_WRITE_OP_TOTAL: IntCounter = INDEX_IO_OP_TOTAL
426 .with_label_values(&["write", "intermediate"]);
427 pub static ref INDEX_INTERMEDIATE_FLUSH_OP_TOTAL: IntCounter = INDEX_IO_OP_TOTAL
429 .with_label_values(&["flush", "intermediate"]);
430}
431
432lazy_static! {
433 pub static ref MANIFEST_OP_ELAPSED: HistogramVec = register_histogram_vec!(
437 "greptime_manifest_op_elapsed",
438 "mito manifest operation elapsed",
439 &["op"],
440 exponential_buckets(0.01, 10.0, 6).unwrap(),
442 ).unwrap();
443
444
445 pub static ref REGION_WORKER_HANDLE_WRITE_ELAPSED: HistogramVec = register_histogram_vec!(
446 "greptime_region_worker_handle_write",
447 "elapsed time for handling writes in region worker loop",
448 &["stage"],
449 exponential_buckets(0.001, 10.0, 5).unwrap()
450 ).unwrap();
451
452}
453
454lazy_static! {
455 pub static ref COMPACTION_INPUT_BYTES: Counter = register_counter!(
457 "greptime_mito_compaction_input_bytes",
458 "mito compaction input file size",
459 ).unwrap();
460
461 pub static ref COMPACTION_OUTPUT_BYTES: Counter = register_counter!(
463 "greptime_mito_compaction_output_bytes",
464 "mito compaction output file size",
465 ).unwrap();
466
467 pub static ref MEMTABLE_ACTIVE_SERIES_COUNT: IntGauge = register_int_gauge!(
469 "greptime_mito_memtable_active_series_count",
470 "active time series count in TimeSeriesMemtable",
471 ).unwrap();
472
473 pub static ref MEMTABLE_ACTIVE_FIELD_BUILDER_COUNT: IntGauge = register_int_gauge!(
475 "greptime_mito_memtable_field_builder_count",
476 "active field builder count in TimeSeriesMemtable",
477 ).unwrap();
478
479 pub static ref WRITE_STALLING: IntGaugeVec = register_int_gauge_vec!(
481 "greptime_mito_write_stalling_count",
482 "mito stalled write request in each worker",
483 &[WORKER_LABEL]
484 ).unwrap();
485 pub static ref GC_REF_FILE_CNT: IntGauge = register_int_gauge!(
487 "greptime_gc_ref_file_count",
488 "gc ref file count",
489 ).unwrap();
490 pub static ref WRITE_STALL_TOTAL: IntCounter = register_int_counter!(
492 "greptime_mito_write_stall_total",
493 "Total number of stalled write requests"
494 ).unwrap();
495 pub static ref REQUEST_WAIT_TIME: HistogramVec = register_histogram_vec!(
497 "greptime_mito_request_wait_time",
498 "mito request wait time before being handled by region worker",
499 &[WORKER_LABEL],
500 exponential_buckets(0.001, 10.0, 8).unwrap(),
502 )
503 .unwrap();
504
505 pub static ref GC_DELETE_FILE_CNT: IntCounter =
507 register_int_counter!(
508 "greptime_mito_gc_delete_file_count",
509 "mito gc deleted file count",
510 ).unwrap();
511
512 pub static ref GC_SKIPPED_UNPARSABLE_FILES: IntCounter =
514 register_int_counter!(
515 "greptime_mito_gc_skipped_unparsable_files",
516 "mito gc skipped unparsable files count",
517 ).unwrap();
518
519 pub static ref GC_ORPHANED_INDEX_FILES: IntCounter =
521 register_int_counter!(
522 "greptime_mito_gc_orphaned_index_files",
523 "mito gc orphaned index files count",
524 ).unwrap();
525
526 pub static ref GC_DURATION_SECONDS: HistogramVec = register_histogram_vec!(
528 "greptime_mito_gc_duration_seconds",
529 "GC operation duration by stage",
530 &[STAGE_LABEL],
531 exponential_buckets(0.01, 10.0, 6).unwrap(),
532 ).unwrap();
533
534 pub static ref GC_RUNS_TOTAL: IntCounterVec = register_int_counter_vec!(
536 "greptime_mito_gc_runs_total",
537 "Total GC runs by mode",
538 &["mode"],
539 ).unwrap();
540
541 pub static ref GC_ERRORS_TOTAL: IntCounterVec = register_int_counter_vec!(
543 "greptime_mito_gc_errors_total",
544 "Total GC errors by type",
545 &["error_type"],
546 ).unwrap();
547
548 pub static ref GC_FILES_DELETED_TOTAL: IntCounterVec = register_int_counter_vec!(
550 "greptime_mito_gc_files_deleted_total",
551 "Total files deleted by GC",
552 &[FILE_TYPE_LABEL],
553 ).unwrap();
554
555 pub static ref CACHE_FILL_DOWNLOADED_FILES: IntCounter = register_int_counter!(
557 "mito_cache_fill_downloaded_files",
558 "mito cache fill downloaded files count",
559 ).unwrap();
560
561 pub static ref CACHE_FILL_PENDING_FILES: IntGauge = register_int_gauge!(
563 "mito_cache_fill_pending_files",
564 "mito cache fill pending files count",
565 ).unwrap();
566
567 pub static ref FLUSH_FILE_TOTAL: IntCounter =
569 register_int_counter!("greptime_mito_flush_file_total", "mito flushed file count").unwrap();
570}
571
572pub struct StagerMetrics {
574 cache_hit: IntCounter,
575 cache_miss: IntCounter,
576 staging_cache_bytes: IntGauge,
577 recycle_cache_bytes: IntGauge,
578 cache_eviction: IntCounter,
579 staging_miss_read: Histogram,
580}
581
582impl StagerMetrics {
583 pub fn new() -> Self {
585 Self {
586 cache_hit: CACHE_HIT.with_label_values(&[STAGING_TYPE]),
587 cache_miss: CACHE_MISS.with_label_values(&[STAGING_TYPE]),
588 staging_cache_bytes: CACHE_BYTES.with_label_values(&[STAGING_TYPE]),
589 recycle_cache_bytes: CACHE_BYTES.with_label_values(&[RECYCLE_TYPE]),
590 cache_eviction: CACHE_EVICTION.with_label_values(&[STAGING_TYPE, "size"]),
591 staging_miss_read: READ_STAGE_ELAPSED.with_label_values(&["staging_miss_read"]),
592 }
593 }
594}
595
596impl Default for StagerMetrics {
597 fn default() -> Self {
598 Self::new()
599 }
600}
601
602impl StagerNotifier for StagerMetrics {
603 fn on_cache_hit(&self, _size: u64) {
604 self.cache_hit.inc();
605 }
606
607 fn on_cache_miss(&self, _size: u64) {
608 self.cache_miss.inc();
609 }
610
611 fn on_cache_insert(&self, size: u64) {
612 self.staging_cache_bytes.add(size as i64);
613 }
614
615 fn on_load_dir(&self, duration: Duration) {
616 self.staging_miss_read.observe(duration.as_secs_f64());
617 }
618
619 fn on_load_blob(&self, duration: Duration) {
620 self.staging_miss_read.observe(duration.as_secs_f64());
621 }
622
623 fn on_cache_evict(&self, size: u64) {
624 self.cache_eviction.inc();
625 self.staging_cache_bytes.sub(size as i64);
626 }
627
628 fn on_recycle_insert(&self, size: u64) {
629 self.recycle_cache_bytes.add(size as i64);
630 }
631
632 fn on_recycle_clear(&self, size: u64) {
633 self.recycle_cache_bytes.sub(size as i64);
634 }
635}