use std::marker::PhantomData;
use metrics_exporter_prometheus::PrometheusHandle;
use crate::{PrometheusMetricLayer, Traffic};
#[doc(hidden)]
mod sealed {
use super::{LayerOnly, Paired};
pub trait Sealed {}
impl Sealed for LayerOnly {}
impl Sealed for Paired {}
}
pub trait MetricBuilderState: sealed::Sealed {}
pub enum Paired {}
pub enum LayerOnly {}
impl MetricBuilderState for Paired {}
impl MetricBuilderState for LayerOnly {}
#[derive(Default, Clone)]
pub enum EndpointLabel {
Exact,
#[default]
MatchedPath,
MatchedPathWithFallbackFn(for<'f> fn(&'f str) -> String),
}
#[derive(Clone, Default)]
pub struct PrometheusMetricLayerBuilder<'a, S: MetricBuilderState> {
pub(crate) traffic: Traffic<'a>,
pub(crate) metric_handle: Option<PrometheusHandle>,
pub(crate) _marker: PhantomData<S>,
}
impl<'a, S> PrometheusMetricLayerBuilder<'a, S>
where
S: MetricBuilderState,
{
pub fn with_ignore_pattern(mut self, ignore_pattern: &'a str) -> Self {
self.traffic.with_ignore_pattern(ignore_pattern);
self
}
pub fn with_ignore_patterns(mut self, ignore_patterns: &'a [&'a str]) -> Self {
self.traffic.with_ignore_patterns(ignore_patterns);
self
}
pub fn with_group_patterns_as(
mut self,
group_pattern: &'a str,
patterns: &'a [&'a str],
) -> Self {
self.traffic.with_group_patterns_as(group_pattern, patterns);
self
}
pub fn with_endpoint_label_type(mut self, endpoint_label: EndpointLabel) -> Self {
self.traffic.with_endpoint_label_type(endpoint_label);
self
}
}
impl<'a> PrometheusMetricLayerBuilder<'a, LayerOnly> {
pub fn new() -> PrometheusMetricLayerBuilder<'a, LayerOnly> {
PrometheusMetricLayerBuilder {
_marker: PhantomData,
traffic: Traffic::new(),
metric_handle: None,
}
}
pub fn with_default_metrics(mut self) -> PrometheusMetricLayerBuilder<'a, Paired> {
self.metric_handle = Some(PrometheusMetricLayer::make_default_handle());
PrometheusMetricLayerBuilder::<'_, Paired>::from_layer_only(self)
}
pub fn with_metrics_from_fn(
mut self,
f: impl FnOnce() -> PrometheusHandle,
) -> PrometheusMetricLayerBuilder<'a, Paired> {
self.metric_handle = Some(f());
PrometheusMetricLayerBuilder::<'_, Paired>::from_layer_only(self)
}
pub fn build(self) -> PrometheusMetricLayer<'a> {
PrometheusMetricLayer::from_builder(self)
}
}
impl<'a> PrometheusMetricLayerBuilder<'a, Paired> {
pub(crate) fn from_layer_only(layer_only: PrometheusMetricLayerBuilder<'a, LayerOnly>) -> Self {
PrometheusMetricLayerBuilder {
_marker: PhantomData,
traffic: layer_only.traffic,
metric_handle: layer_only.metric_handle,
}
}
pub fn build_pair(self) -> (PrometheusMetricLayer<'a>, PrometheusHandle) {
PrometheusMetricLayer::pair_from_builder(self)
}
}