use super::conventions::metrics as names;
use opentelemetry::metrics::{Counter, Histogram, Meter, UpDownCounter};
use std::sync::OnceLock;
pub struct ExtractionMetrics {
pub extraction_total: Counter<u64>,
pub cache_hits: Counter<u64>,
pub cache_misses: Counter<u64>,
pub batch_total: Counter<u64>,
pub extraction_duration_ms: Histogram<f64>,
pub extraction_input_bytes: Histogram<u64>,
pub extraction_output_bytes: Histogram<u64>,
pub pipeline_duration_ms: Histogram<f64>,
pub ocr_duration_ms: Histogram<f64>,
pub batch_duration_ms: Histogram<f64>,
pub concurrent_extractions: UpDownCounter<i64>,
}
static METRICS: OnceLock<ExtractionMetrics> = OnceLock::new();
pub fn get_metrics() -> &'static ExtractionMetrics {
METRICS.get_or_init(|| {
let meter = opentelemetry::global::meter("kreuzberg");
ExtractionMetrics::new(&meter)
})
}
impl ExtractionMetrics {
fn new(meter: &Meter) -> Self {
Self {
extraction_total: meter
.u64_counter(names::EXTRACTION_TOTAL)
.with_description("Total document extractions")
.build(),
cache_hits: meter
.u64_counter(names::CACHE_HITS)
.with_description("Extraction cache hits")
.build(),
cache_misses: meter
.u64_counter(names::CACHE_MISSES)
.with_description("Extraction cache misses")
.build(),
batch_total: meter
.u64_counter(names::BATCH_TOTAL)
.with_description("Total batch extraction requests")
.build(),
extraction_duration_ms: meter
.f64_histogram(names::EXTRACTION_DURATION_MS)
.with_description("Extraction wall-clock duration in milliseconds")
.with_unit("ms")
.build(),
extraction_input_bytes: meter
.u64_histogram(names::EXTRACTION_INPUT_BYTES)
.with_description("Input document size in bytes")
.with_unit("By")
.build(),
extraction_output_bytes: meter
.u64_histogram(names::EXTRACTION_OUTPUT_BYTES)
.with_description("Output content size in bytes")
.with_unit("By")
.build(),
pipeline_duration_ms: meter
.f64_histogram(names::PIPELINE_DURATION_MS)
.with_description("Pipeline stage duration in milliseconds")
.with_unit("ms")
.build(),
ocr_duration_ms: meter
.f64_histogram(names::OCR_DURATION_MS)
.with_description("OCR duration in milliseconds")
.with_unit("ms")
.build(),
batch_duration_ms: meter
.f64_histogram(names::BATCH_DURATION_MS)
.with_description("Batch extraction duration in milliseconds")
.with_unit("ms")
.build(),
concurrent_extractions: meter
.i64_up_down_counter(names::CONCURRENT_EXTRACTIONS)
.with_description("Currently in-flight extractions")
.build(),
}
}
}