Skip to main content

vectorless/index/pipeline/
metrics.rs

1// Copyright (c) 2026 vectorless developers
2// SPDX-License-Identifier: Apache-2.0
3
4//! Performance metrics for indexing.
5
6use serde::{Deserialize, Serialize};
7
8/// Performance metrics for the indexing pipeline.
9#[derive(Debug, Clone, Default, Serialize, Deserialize)]
10pub struct IndexMetrics {
11    /// Parse stage duration (ms).
12    #[serde(default)]
13    pub parse_time_ms: u64,
14
15    /// Build stage duration (ms).
16    #[serde(default)]
17    pub build_time_ms: u64,
18
19    /// Enhance stage duration (ms).
20    #[serde(default)]
21    pub enhance_time_ms: u64,
22
23    /// Enrich stage duration (ms).
24    #[serde(default)]
25    pub enrich_time_ms: u64,
26
27    /// Optimize stage duration (ms).
28    #[serde(default)]
29    pub optimize_time_ms: u64,
30
31    /// Persist stage duration (ms).
32    #[serde(default)]
33    pub persist_time_ms: u64,
34
35    /// Total tokens generated (summaries).
36    #[serde(default)]
37    pub total_tokens_generated: usize,
38
39    /// Number of LLM calls.
40    #[serde(default)]
41    pub llm_calls: usize,
42
43    /// Number of nodes processed.
44    #[serde(default)]
45    pub nodes_processed: usize,
46
47    /// Number of summaries generated.
48    #[serde(default)]
49    pub summaries_generated: usize,
50
51    /// Number of nodes skipped (thinning).
52    #[serde(default)]
53    pub nodes_skipped: usize,
54
55    /// Number of nodes merged.
56    #[serde(default)]
57    pub nodes_merged: usize,
58}
59
60impl IndexMetrics {
61    /// Create new metrics with start time.
62    pub fn new() -> Self {
63        Self::default()
64    }
65
66    /// Record parse stage time.
67    pub fn record_parse(&mut self, duration_ms: u64) {
68        self.parse_time_ms = duration_ms;
69    }
70
71    /// Record build stage time.
72    pub fn record_build(&mut self, duration_ms: u64) {
73        self.build_time_ms = duration_ms;
74    }
75
76    /// Record enhance stage time.
77    pub fn record_enhance(&mut self, duration_ms: u64) {
78        self.enhance_time_ms = duration_ms;
79    }
80
81    /// Record enrich stage time.
82    pub fn record_enrich(&mut self, duration_ms: u64) {
83        self.enhance_time_ms = duration_ms;
84    }
85
86    /// Record optimize stage time.
87    pub fn record_optimize(&mut self, duration_ms: u64) {
88        self.optimize_time_ms = duration_ms;
89    }
90
91    /// Record persist stage time.
92    pub fn record_persist(&mut self, duration_ms: u64) {
93        self.persist_time_ms = duration_ms;
94    }
95
96    /// Increment LLM calls.
97    pub fn increment_llm_calls(&mut self) {
98        self.llm_calls += 1;
99    }
100
101    /// Add to tokens generated.
102    pub fn add_tokens_generated(&mut self, tokens: usize) {
103        self.total_tokens_generated += tokens;
104    }
105
106    /// Set nodes processed.
107    pub fn set_nodes_processed(&mut self, count: usize) {
108        self.nodes_processed = count;
109    }
110
111    /// Increment summaries generated.
112    pub fn increment_summaries(&mut self) {
113        self.summaries_generated += 1;
114    }
115
116    /// Increment nodes skipped.
117    pub fn increment_nodes_skipped(&mut self) {
118        self.nodes_skipped += 1;
119    }
120
121    /// Increment nodes merged.
122    pub fn increment_nodes_merged(&mut self) {
123        self.nodes_merged += 1;
124    }
125
126    /// Get total time.
127    pub fn total_time_ms(&self) -> u64 {
128        self.parse_time_ms
129            + self.build_time_ms
130            + self.enhance_time_ms
131            + self.enrich_time_ms
132            + self.optimize_time_ms
133            + self.persist_time_ms
134    }
135}