diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/https.rs | 4 | ||||
-rw-r--r-- | src/metrics.rs | 42 | ||||
-rw-r--r-- | src/proxy_config.rs | 5 |
3 files changed, 36 insertions, 15 deletions
diff --git a/src/https.rs b/src/https.rs index f31caef..ed98ae1 100644 --- a/src/https.rs +++ b/src/https.rs @@ -41,7 +41,7 @@ pub struct HttpsConfig { struct HttpsMetrics { requests_received: metrics::Counter<u64>, requests_served: metrics::Counter<u64>, - request_proxy_duration: metrics::ValueRecorder<f64>, + request_proxy_duration: metrics::Histogram<f64>, } pub async fn serve_https( @@ -63,7 +63,7 @@ pub async fn serve_https( .with_description("Total number of requests served over HTTPS") .init(), request_proxy_duration: meter - .f64_value_recorder("https_request_proxy_duration") + .f64_histogram("https_request_proxy_duration") .with_description("Duration between time when request was received, and time when backend returned status code and headers") .init(), }); diff --git a/src/metrics.rs b/src/metrics.rs index ee5c60a..d2e29c7 100644 --- a/src/metrics.rs +++ b/src/metrics.rs @@ -11,27 +11,29 @@ use hyper::{ service::{make_service_fn, service_fn}, Body, Method, Request, Response, Server, }; -use opentelemetry_prometheus::PrometheusExporter; +use opentelemetry::sdk::metrics; use prometheus::{Encoder, TextEncoder}; pub struct MetricsServer { bind_addr: Option<SocketAddr>, - exporter: PrometheusExporter, + registry: prometheus::Registry, } impl MetricsServer { pub fn init(bind_addr: Option<SocketAddr>) -> MetricsServer { + let registry = prometheus::Registry::new(); let exporter = opentelemetry_prometheus::exporter() - .with_default_summary_quantiles(vec![0.25, 0.5, 0.75, 0.9, 0.95, 0.99]) - .with_default_histogram_boundaries(vec![ - 0.001, 0.0015, 0.002, 0.003, 0.005, 0.007, 0.01, 0.015, 0.02, 0.03, 0.05, 0.07, - 0.1, 0.15, 0.2, 0.3, 0.5, 0.7, 1., 1.5, 2., 3., 5., 7., 10., 15., 20., 30., 40., - 50., 60., 70., 100., - ]) - .init(); + .with_registry(registry.clone()) + .with_aggregation_selector(AggregationSelector) + .build() + .expect("build prometheus registry"); + let mp = metrics::MeterProvider::builder() + .with_reader(exporter) + .build(); + opentelemetry::global::set_meter_provider(mp); Self { bind_addr, - exporter, + registry, } } @@ -70,7 +72,7 @@ impl MetricsServer { (&Method::GET, "/metrics") => { let mut buffer = vec![]; let encoder = TextEncoder::new(); - let metric_families = self.exporter.registry().gather(); + let metric_families = self.registry.gather(); encoder.encode(&metric_families, &mut buffer).unwrap(); Response::builder() @@ -88,3 +90,21 @@ impl MetricsServer { Ok(response) } } + +struct AggregationSelector; + +impl metrics::reader::AggregationSelector for AggregationSelector { + fn aggregation(&self, kind: metrics::InstrumentKind) -> metrics::Aggregation { + match kind { + metrics::InstrumentKind::Histogram => metrics::Aggregation::ExplicitBucketHistogram { + boundaries: vec![ + 0.001, 0.0015, 0.002, 0.003, 0.005, 0.007, 0.01, 0.015, 0.02, 0.03, 0.05, 0.07, + 0.1, 0.15, 0.2, 0.3, 0.5, 0.7, 1., 1.5, 2., 3., 5., 7., 10., 15., 20., 30., + 40., 50., 60., 70., 100., + ], + record_min_max: true, + }, + _ => metrics::reader::DefaultAggregationSelector::new().aggregation(kind), + } + } +} diff --git a/src/proxy_config.rs b/src/proxy_config.rs index 43d3929..dab4d98 100644 --- a/src/proxy_config.rs +++ b/src/proxy_config.rs @@ -334,7 +334,7 @@ pub fn spawn_proxy_config_task( // ---- struct ProxyConfigMetrics { - _proxy_config_entries: metrics::ValueObserver<u64>, + _proxy_config_entries: metrics::ObservableGauge<u64>, } impl ProxyConfigMetrics { @@ -342,7 +342,8 @@ impl ProxyConfigMetrics { let meter = opentelemetry::global::meter("tricot"); Self { _proxy_config_entries: meter - .u64_value_observer("proxy_config_entries", move |observer| { + .u64_observable_gauge("proxy_config_entries") + .with_callback(move |observer| { let mut patterns = HashMap::new(); for ent in rx.borrow().entries.iter() { let attrs = ( |