Skip to main content

PrometheusLayer

Struct PrometheusLayer 

Source
pub struct PrometheusLayer { /* private fields */ }
Expand description

PrometheusLayer records OpenDAL operation and HTTP fetch metrics with prometheus.

§Prometheus Metrics

This layer registers operation metrics and HTTP fetch metrics. Please see the documentation of observe module for metric details. For a more detailed explanation of these metrics and how they are used, please refer to the Prometheus documentation.

§Examples

§Basic Usage

let registry = prometheus::default_registry();

let op = Operator::new(services::Memory::default())?
    .layer(
        PrometheusLayer::builder()
            .register(registry)
            .expect("register metrics successfully"),
    );

// Write data into object test.
op.write("test", "Hello, World!").await?;
// Read data from the object.
let bs = op.read("test").await?;
info!("content: {}", String::from_utf8_lossy(&bs.to_bytes()));

// Get object metadata.
let meta = op.stat("test").await?;
info!("meta: {:?}", meta);

// Export prometheus metrics.
let mut buffer = Vec::<u8>::new();
let encoder = prometheus::TextEncoder::new();
encoder.encode(&prometheus::gather(), &mut buffer).unwrap();
println!("## Prometheus Metrics");
println!("{}", String::from_utf8(buffer.clone()).unwrap());

§Global Instance

PrometheusLayer needs to be registered before instantiation.

If there are multiple operators in an application that need the PrometheusLayer, we could instantiate it once and pass it to multiple operators. But we cannot directly call .layer(PrometheusLayer::builder().register(&registry)?) for different services, because registering the same metrics multiple times to the same registry will cause register errors. Therefore, we can provide a global instance for the PrometheusLayer.

fn global_prometheus_layer() -> &'static PrometheusLayer {
    static GLOBAL: OnceLock<PrometheusLayer> = OnceLock::new();
    GLOBAL.get_or_init(|| {
        PrometheusLayer::builder()
            .register_default()
            .expect("Failed to register with the global registry")
    })
}

let op = Operator::new(services::Memory::default())?
    .layer(global_prometheus_layer().clone());

// Write data into object test.
op.write("test", "Hello, World!").await?;

// Read data from the object.
let bs = op.read("test").await?;
info!("content: {}", String::from_utf8_lossy(&bs.to_bytes()));

// Get object metadata.
let meta = op.stat("test").await?;
info!("meta: {:?}", meta);

// Export prometheus metrics.
let mut buffer = Vec::<u8>::new();
let encoder = prometheus::TextEncoder::new();
encoder.encode(&prometheus::gather(), &mut buffer).unwrap();
println!("## Prometheus Metrics");
println!("{}", String::from_utf8(buffer.clone()).unwrap());

Implementations§

Source§

impl PrometheusLayer

Source

pub fn builder() -> PrometheusLayerBuilder

Create a PrometheusLayerBuilder to set the configuration of metrics.

§Example
// Pick a builder and configure it.
let builder = services::Memory::default();
let registry = prometheus::default_registry();

let duration_seconds_buckets = prometheus::exponential_buckets(0.01, 2.0, 16).unwrap();
let bytes_buckets = prometheus::exponential_buckets(1.0, 2.0, 16).unwrap();
let _ = Operator::new(builder)?
    .layer(
        PrometheusLayer::builder()
            .duration_seconds_buckets(duration_seconds_buckets)
            .bytes_buckets(bytes_buckets)
            .register(registry)
            .expect("register metrics successfully"),
    );

Trait Implementations§

Source§

impl Clone for PrometheusLayer

Source§

fn clone(&self) -> PrometheusLayer

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for PrometheusLayer

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Layer for PrometheusLayer

Source§

fn apply_service(&self, inner: Servicer) -> Servicer

Intercept the operation service stack. Read more
Source§

fn apply_context( &self, srv: Servicer, inner: OperationContext, ) -> OperationContext

Intercept the operation context (HTTP transport and executor). Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> MaybeSend for T
where T: Send,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.