| Crates.io | axum-otel-metrics |
| lib.rs | axum-otel-metrics |
| version | 0.12.0 |
| created_at | 2022-10-14 16:03:53.793326+00 |
| updated_at | 2025-06-20 15:46:48.726474+00 |
| description | axum OpenTelemetry metrics middleware with OTLP exporter |
| homepage | https://ttys3.dev/ |
| repository | https://github.com/ttys3/axum-otel-metrics/ |
| max_upload_size | |
| id | 688325 |
| size | 83,111 |
axum OpenTelemetry metrics middleware with OTLP exporter
follows Semantic Conventions for HTTP Metrics
axum is an ergonomic and modular web framework built with Tokio, Tower, and Hyper
Development of the Prometheus exporter has been discontinued. See the related issue. This crate depends on the unmaintained
protobufcrate and has unresolved security vulnerabilities. Version 0.29 will be the final release.For Prometheus integration, we strongly recommend using the [OTLP] exporter instead. Prometheus natively supports OTLP, providing a more stable and actively maintained solution. for more details please check https://github.com/open-telemetry/opentelemetry-rust/blob/opentelemetry-0.30.0/opentelemetry-prometheus/README.md and https://github.com/ttys3/axum-otel-metrics/issues/176
Uses the OTLP Exporter to send metrics to OpenTelemetry collector.
You can configure it via environment variables:
OTEL_EXPORTER_OTLP_ENDPOINT or OTEL_EXPORTER_OTLP_METRICS_ENDPOINTOTEL_EXPORTER_OTLP_ENDPOINT default value:
http://localhost:4317http://localhost:4318OTEL_EXPORTER_OTLP_METRICS_ENDPOINT default value:
http://localhost:4317http://localhost:4318/v1/metricsFor 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};
use opentelemetry::global;
let exporter = opentelemetry_otlp::MetricExporter::builder()
.with_http()
.with_temporality(Temporality::default())
.build()
.unwrap();
let reader = PeriodicReader::builder(exporter)
.with_interval(std::time::Duration::from_secs(30))
.build();
let provider = 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);
async fn handler() -> Html<&'static str> {
Html("<h1>Hello, World!</h1>")
}
The following metrics are exported following OpenTelemetry semantic conventions:
http.server.active_requests (UpDownCounter)
http.request.method, url.schemehttp.server.request.duration (Histogram)
http.request.method, http.route, http.response.status_code, server.addresshttp.server.request.body.size (Histogram)
http.request.method, http.route, http.response.status_code, server.addresshttp.server.response.body.size (Histogram)
http.request.method, http.route, http.response.status_code, server.addresshttps://opentelemetry.io/docs/instrumentation/rust/#status-and-releases
| Traces | Metrics | Logs |
|---|---|---|
| Beta | Beta | Beta |
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
https://opentelemetry.io/docs/reference/specification/metrics/sdk_exporters/
where is prometheus exporter?
https://opentelemetry.io/docs/reference/specification/metrics/data-model/