15 releases (9 breaking)

new 0.10.0 Feb 13, 2025
0.9.1 Dec 10, 2024
0.9.0-alpha.2 Aug 4, 2024
0.9.0-alpha.1 Apr 6, 2024
0.2.0 Nov 25, 2022

#86 in HTTP server

Download history 352/week @ 2024-10-26 697/week @ 2024-11-02 971/week @ 2024-11-09 950/week @ 2024-11-16 1009/week @ 2024-11-23 824/week @ 2024-11-30 1438/week @ 2024-12-07 1092/week @ 2024-12-14 609/week @ 2024-12-21 838/week @ 2024-12-28 1375/week @ 2025-01-04 1056/week @ 2025-01-11 1163/week @ 2025-01-18 1197/week @ 2025-01-25 768/week @ 2025-02-01 764/week @ 2025-02-08

4,047 downloads per month

MIT license

34KB
458 lines

axum-otel-metrics

Build status Crates.io Documentation

axum OpenTelemetry metrics middleware

supported exporters:

follow Semantic Conventions for HTTP Metrics

axum is an ergonomic and modular web framework built with Tokio, Tower, and Hyper

Usage

by default, it will use the OTLP Exporter you can config it via env var: OTEL_EXPORTER_OTLP_ENDPOINT or OTEL_EXPORTER_OTLP_METRICS_ENDPOINT

OTEL_EXPORTER_OTLP_ENDPOINT default value:

gRPC: http://localhost:4317

HTTP: http://localhost:4318

OTEL_EXPORTER_OTLP_METRICS_ENDPOINT default value:

gRPC: http://localhost:4317

HTTP: http://localhost:4318/v1/metrics

for more details, see https://opentelemetry.io/docs/languages/sdk-configuration/otlp-exporter/#endpoint-configuration

use axum_otel_metrics::HttpMetricsLayerBuilder;
use axum::{response::Html, routing::get, Router};
use opentelemetry_sdk::metrics::{PeriodicReader, SdkMeterProvider, Temporality};
 
let exporter = opentelemetry_otlp::MetricExporter::builder()
    .with_http()
    .with_temporality(Temporality::default())
    .build()
    .unwrap();
 
let reader = PeriodicReader::builder(exporter, opentelemetry_sdk::runtime::Tokio)
    .with_interval(std::time::Duration::from_secs(30))
    .build()
    .unwrap();

let provider = opentelemetry_sdk::metrics::SdkMeterProvider::builder()
    .with_reader(reader)
    .build();

 // TODO: ensure defer run `provider.shutdown()?;`

global::set_meter_provider(provider.clone());

let metrics = HttpMetricsLayerBuilder::new()
    .build();

let app = Router::new()
    .route("/", get(handler))
    .route("/hello", get(handler))
    .route("/world", get(handler))
    // add the metrics middleware
    .layer(metrics);

Prometheus Exporter

check the doc Advanced Usage section to see how to use the prometheus exporter

for prometheus exporter, below metrics will be exported:

http_server_active_requests gauge

The number of active HTTP requests

http_server_request_duration_seconds histogram

http_server_request_duration_seconds_bucket
http_server_request_duration_seconds_sum
http_server_request_duration_seconds_count

http_server_request_body_size_bytes histogram

http_server_request_body_size_bytes_bucket
http_server_request_body_size_bytes_sum
http_server_request_body_size_bytes_count

http_server_response_body_size_bytes histogram

http_server_response_body_size_bytes_bucket
http_server_response_body_size_bytes_sum
http_server_response_body_size_bytes_count

labels for http_server_request_duration_seconds, http_server_request_body_size_bytes, http_server_response_body_size_bytes :

http_request_method
http_route
http_response_status_code
server_address

labels for http_server_active_requests :

http_request_method
url_scheme

OpenTelemetry Rust Instrumentation Status and Releases

https://opentelemetry.io/docs/instrumentation/rust/#status-and-releases

Traces Metrics Logs
Beta Beta Beta

OpenTelemetry Metrics Exporter

Push Metric Exporter https://opentelemetry.io/docs/reference/specification/metrics/sdk/#push-metric-exporter

Pull Metric Exporter https://opentelemetry.io/docs/reference/specification/metrics/sdk/#pull-metric-exporter

exporters

https://opentelemetry.io/docs/reference/specification/metrics/sdk_exporters/

In-memory https://opentelemetry.io/docs/reference/specification/metrics/sdk_exporters/in-memory/

Prometheus https://opentelemetry.io/docs/reference/specification/metrics/sdk_exporters/prometheus/

OTLP https://opentelemetry.io/docs/reference/specification/metrics/sdk_exporters/otlp/

Standard output https://opentelemetry.io/docs/reference/specification/metrics/sdk_exporters/stdout/

Metrics Data Model

https://opentelemetry.io/docs/reference/specification/metrics/data-model/

https://github.com/nlopes/actix-web-prom

Actix-web middleware to expose Prometheus metrics

https://github.com/sd2k/rocket_prometheus

Prometheus fairing and handler for Rocket

https://github.com/Ptrskay3/axum-prometheus

axum-prometheus relies on metrics.rs and its ecosystem to collect and export metrics - for instance for Prometheus, metrics_exporter_prometheus is used as a backend to interact with Prometheus.

Dependencies

~7–13MB
~152K SLoC