2024-07-29 12:15:26 -07:00
|
|
|
use log::error;
|
2024-07-15 13:54:07 -07:00
|
|
|
use proxy_wasm::hostcalls;
|
|
|
|
|
use proxy_wasm::types::*;
|
|
|
|
|
|
|
|
|
|
pub trait Metric {
|
|
|
|
|
fn id(&self) -> u32;
|
2024-07-29 12:15:26 -07:00
|
|
|
fn value(&self) -> Result<u64, String> {
|
2024-07-15 13:54:07 -07:00
|
|
|
match hostcalls::get_metric(self.id()) {
|
2024-07-29 12:15:26 -07:00
|
|
|
Ok(value) => Ok(value),
|
|
|
|
|
Err(Status::NotFound) => Err(format!("metric not found: {}", self.id())),
|
|
|
|
|
Err(err) => Err(format!("unexpected status: {:?}", err)),
|
2024-07-15 13:54:07 -07:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub trait IncrementingMetric: Metric {
|
|
|
|
|
fn increment(&self, offset: i64) {
|
|
|
|
|
match hostcalls::increment_metric(self.id(), offset) {
|
2024-07-29 12:15:26 -07:00
|
|
|
Ok(_) => (),
|
|
|
|
|
Err(err) => error!("error incrementing metric: {:?}", err),
|
2024-07-15 13:54:07 -07:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub trait RecordingMetric: Metric {
|
|
|
|
|
fn record(&self, value: u64) {
|
|
|
|
|
match hostcalls::record_metric(self.id(), value) {
|
2024-07-29 12:15:26 -07:00
|
|
|
Ok(_) => (),
|
|
|
|
|
Err(err) => error!("error recording metric: {:?}", err),
|
2024-07-15 13:54:07 -07:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-09-16 19:20:07 -07:00
|
|
|
#[derive(Copy, Clone, Debug)]
|
2024-07-15 13:54:07 -07:00
|
|
|
pub struct Counter {
|
|
|
|
|
id: u32,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl Counter {
|
|
|
|
|
pub fn new(name: String) -> Counter {
|
|
|
|
|
let returned_id = hostcalls::define_metric(MetricType::Counter, &name)
|
|
|
|
|
.expect("failed to define counter '{}', name");
|
|
|
|
|
Counter { id: returned_id }
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl Metric for Counter {
|
|
|
|
|
fn id(&self) -> u32 {
|
|
|
|
|
self.id
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl IncrementingMetric for Counter {}
|
|
|
|
|
|
2024-09-16 19:20:07 -07:00
|
|
|
#[derive(Copy, Clone, Debug)]
|
2024-07-15 13:54:07 -07:00
|
|
|
pub struct Gauge {
|
|
|
|
|
id: u32,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl Gauge {
|
|
|
|
|
pub fn new(name: String) -> Gauge {
|
|
|
|
|
let returned_id = hostcalls::define_metric(MetricType::Gauge, &name)
|
|
|
|
|
.expect("failed to define gauge '{}', name");
|
|
|
|
|
Gauge { id: returned_id }
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl Metric for Gauge {
|
|
|
|
|
fn id(&self) -> u32 {
|
|
|
|
|
self.id
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-09-04 17:28:12 -07:00
|
|
|
/// For state of the world updates
|
2024-07-15 13:54:07 -07:00
|
|
|
impl RecordingMetric for Gauge {}
|
2024-09-04 17:28:12 -07:00
|
|
|
/// For offset deltas
|
|
|
|
|
impl IncrementingMetric for Gauge {}
|
2024-07-15 13:54:07 -07:00
|
|
|
|
2024-11-12 15:03:26 -08:00
|
|
|
#[derive(Copy, Clone, Debug)]
|
2024-07-15 13:54:07 -07:00
|
|
|
pub struct Histogram {
|
|
|
|
|
id: u32,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl Histogram {
|
|
|
|
|
pub fn new(name: String) -> Histogram {
|
|
|
|
|
let returned_id = hostcalls::define_metric(MetricType::Histogram, &name)
|
|
|
|
|
.expect("failed to define histogram '{}', name");
|
|
|
|
|
Histogram { id: returned_id }
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl Metric for Histogram {
|
|
|
|
|
fn id(&self) -> u32 {
|
|
|
|
|
self.id
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl RecordingMetric for Histogram {}
|