pub mod cache;
pub mod cluster;
pub mod gpu;
pub mod io;
pub mod query;
pub mod raster;
pub mod vector;
use crate::error::Result;
use opentelemetry::KeyValue;
use opentelemetry::metrics::{Counter, Histogram, Meter, UpDownCounter};
use parking_lot::RwLock;
use std::sync::Arc;
use std::time::Instant;
pub struct GeoMetrics {
#[allow(dead_code)]
meter: Meter,
pub raster: raster::RasterMetrics,
pub vector: vector::VectorMetrics,
pub io: io::IoMetrics,
pub cache: cache::CacheMetrics,
pub query: query::QueryMetrics,
pub gpu: gpu::GpuMetrics,
pub cluster: cluster::ClusterMetrics,
}
impl GeoMetrics {
pub fn new(meter: Meter) -> Result<Self> {
Ok(Self {
raster: raster::RasterMetrics::new(meter.clone())?,
vector: vector::VectorMetrics::new(meter.clone())?,
io: io::IoMetrics::new(meter.clone())?,
cache: cache::CacheMetrics::new(meter.clone())?,
query: query::QueryMetrics::new(meter.clone())?,
gpu: gpu::GpuMetrics::new(meter.clone())?,
cluster: cluster::ClusterMetrics::new(meter.clone())?,
meter,
})
}
}
pub struct Timer {
start: Instant,
histogram: Histogram<f64>,
attributes: Vec<KeyValue>,
}
impl Timer {
pub fn new(histogram: Histogram<f64>, attributes: Vec<KeyValue>) -> Self {
Self {
start: Instant::now(),
histogram,
attributes,
}
}
pub fn stop(self) {
let duration = self.start.elapsed();
self.histogram.record(
duration.as_secs_f64() * 1000.0, &self.attributes,
);
}
}
pub struct MetricCounter {
counter: Counter<u64>,
}
impl MetricCounter {
pub fn new(counter: Counter<u64>) -> Self {
Self { counter }
}
pub fn inc(&self, attributes: &[KeyValue]) {
self.counter.add(1, attributes);
}
pub fn add(&self, value: u64, attributes: &[KeyValue]) {
self.counter.add(value, attributes);
}
}
pub struct MetricGauge {
value: Arc<RwLock<f64>>,
}
impl MetricGauge {
pub fn new() -> Self {
Self {
value: Arc::new(RwLock::new(0.0)),
}
}
pub fn set(&self, value: f64) {
*self.value.write() = value;
}
pub fn get(&self) -> f64 {
*self.value.read()
}
pub fn inc(&self) {
*self.value.write() += 1.0;
}
pub fn dec(&self) {
*self.value.write() -= 1.0;
}
}
impl Default for MetricGauge {
fn default() -> Self {
Self::new()
}
}
pub struct MetricUpDownCounter {
counter: UpDownCounter<i64>,
}
impl MetricUpDownCounter {
pub fn new(counter: UpDownCounter<i64>) -> Self {
Self { counter }
}
pub fn inc(&self, attributes: &[KeyValue]) {
self.counter.add(1, attributes);
}
pub fn dec(&self, attributes: &[KeyValue]) {
self.counter.add(-1, attributes);
}
pub fn add(&self, value: i64, attributes: &[KeyValue]) {
self.counter.add(value, attributes);
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_metric_gauge() {
let gauge = MetricGauge::new();
assert_eq!(gauge.get(), 0.0);
gauge.set(10.0);
assert_eq!(gauge.get(), 10.0);
gauge.inc();
assert_eq!(gauge.get(), 11.0);
gauge.dec();
assert_eq!(gauge.get(), 10.0);
}
}