2022-06-30 13:54:54 +00:00
|
|
|
//! Opentracing middleware implementation for [`reqwest_middleware`].
|
2021-09-28 18:26:03 +00:00
|
|
|
//!
|
|
|
|
//! Attach [`TracingMiddleware`] to your client to automatically trace HTTP requests.
|
2022-06-30 13:54:54 +00:00
|
|
|
//!
|
2022-11-07 13:07:23 +00:00
|
|
|
//! The simplest possible usage:
|
|
|
|
//! ```no_run
|
|
|
|
//! # use reqwest_middleware::Result;
|
|
|
|
//! use reqwest_middleware::{ClientBuilder};
|
|
|
|
//! use reqwest_tracing::TracingMiddleware;
|
|
|
|
//!
|
|
|
|
//! # async fn example() -> Result<()> {
|
|
|
|
//! let reqwest_client = reqwest::Client::builder().build().unwrap();
|
|
|
|
//! let client = ClientBuilder::new(reqwest_client)
|
|
|
|
//! // Insert the tracing middleware
|
|
|
|
//! .with(TracingMiddleware::default())
|
|
|
|
//! .build();
|
|
|
|
//!
|
|
|
|
//! let resp = client.get("https://truelayer.com").send().await.unwrap();
|
|
|
|
//! # Ok(())
|
|
|
|
//! # }
|
|
|
|
//! ```
|
|
|
|
//!
|
|
|
|
//! To customise the span names use [`OtelName`].
|
|
|
|
//! ```no_run
|
|
|
|
//! # use reqwest_middleware::Result;
|
|
|
|
//! use reqwest_middleware::{ClientBuilder, Extension};
|
|
|
|
//! use reqwest_tracing::{
|
|
|
|
//! TracingMiddleware, OtelName
|
|
|
|
//! };
|
|
|
|
//! # async fn example() -> Result<()> {
|
|
|
|
//! let reqwest_client = reqwest::Client::builder().build().unwrap();
|
|
|
|
//! let client = ClientBuilder::new(reqwest_client)
|
|
|
|
//! // Inserts the extension before the request is started
|
|
|
|
//! .with_init(Extension(OtelName("my-client".into())))
|
|
|
|
//! // Makes use of that extension to specify the otel name
|
|
|
|
//! .with(TracingMiddleware::default())
|
|
|
|
//! .build();
|
|
|
|
//!
|
|
|
|
//! let resp = client.get("https://truelayer.com").send().await.unwrap();
|
|
|
|
//!
|
|
|
|
//! // Or specify it on the individual request (will take priority)
|
|
|
|
//! let resp = client.post("https://api.truelayer.com/payment")
|
|
|
|
//! .with_extension(OtelName("POST /payment".into()))
|
|
|
|
//! .send()
|
|
|
|
//! .await
|
|
|
|
//! .unwrap();
|
|
|
|
//! # Ok(())
|
|
|
|
//! # }
|
|
|
|
//! ```
|
|
|
|
//!
|
2022-06-30 13:54:54 +00:00
|
|
|
//! In this example we define a custom span builder to calculate the request time elapsed and we register the [`TracingMiddleware`].
|
2022-11-07 06:51:40 +00:00
|
|
|
//!
|
|
|
|
//! Note that Opentelemetry tracks start and stop already, there is no need to have a custom builder like this.
|
2022-06-30 13:54:54 +00:00
|
|
|
//! ```rust
|
|
|
|
//! use reqwest_middleware::Result;
|
|
|
|
//! use task_local_extensions::Extensions;
|
|
|
|
//! use reqwest::{Request, Response};
|
|
|
|
//! use reqwest_middleware::ClientBuilder;
|
|
|
|
//! use reqwest_tracing::{
|
|
|
|
//! default_on_request_end, reqwest_otel_span, ReqwestOtelSpanBackend, TracingMiddleware
|
|
|
|
//! };
|
|
|
|
//! use tracing::Span;
|
|
|
|
//! use std::time::{Duration, Instant};
|
|
|
|
//!
|
|
|
|
//! pub struct TimeTrace;
|
|
|
|
//!
|
|
|
|
//! impl ReqwestOtelSpanBackend for TimeTrace {
|
|
|
|
//! fn on_request_start(req: &Request, extension: &mut Extensions) -> Span {
|
|
|
|
//! extension.insert(Instant::now());
|
2022-11-07 13:07:23 +00:00
|
|
|
//! reqwest_otel_span!(name="example-request", req, time_elapsed = tracing::field::Empty)
|
2022-06-30 13:54:54 +00:00
|
|
|
//! }
|
|
|
|
//!
|
|
|
|
//! fn on_request_end(span: &Span, outcome: &Result<Response>, extension: &mut Extensions) {
|
|
|
|
//! let time_elapsed = extension.get::<Instant>().unwrap().elapsed().as_millis() as i64;
|
|
|
|
//! default_on_request_end(span, outcome);
|
|
|
|
//! span.record("time_elapsed", &time_elapsed);
|
|
|
|
//! }
|
|
|
|
//! }
|
|
|
|
//!
|
|
|
|
//! let http = ClientBuilder::new(reqwest::Client::new())
|
|
|
|
//! .with(TracingMiddleware::<TimeTrace>::new())
|
|
|
|
//! .build();
|
|
|
|
//! ```
|
2021-09-28 18:26:03 +00:00
|
|
|
|
2021-08-10 16:07:08 +00:00
|
|
|
mod middleware;
|
|
|
|
#[cfg(any(
|
|
|
|
feature = "opentelemetry_0_13",
|
|
|
|
feature = "opentelemetry_0_14",
|
2021-08-30 11:14:06 +00:00
|
|
|
feature = "opentelemetry_0_15",
|
|
|
|
feature = "opentelemetry_0_16",
|
2022-02-16 17:37:54 +00:00
|
|
|
feature = "opentelemetry_0_17",
|
2022-09-20 13:07:32 +00:00
|
|
|
feature = "opentelemetry_0_18",
|
2023-06-20 17:07:12 +00:00
|
|
|
feature = "opentelemetry_0_19",
|
2023-08-23 10:49:15 +00:00
|
|
|
feature = "opentelemetry_0_20",
|
2024-01-19 11:17:54 +00:00
|
|
|
feature = "opentelemetry_0_21",
|
2024-03-11 17:04:51 +00:00
|
|
|
feature = "opentelemetry_0_22",
|
2021-08-10 16:07:08 +00:00
|
|
|
))]
|
|
|
|
mod otel;
|
2022-06-30 13:54:54 +00:00
|
|
|
mod reqwest_otel_span_builder;
|
2021-08-10 16:07:08 +00:00
|
|
|
pub use middleware::TracingMiddleware;
|
2022-06-30 13:54:54 +00:00
|
|
|
pub use reqwest_otel_span_builder::{
|
|
|
|
default_on_request_end, default_on_request_failure, default_on_request_success,
|
2023-06-20 17:07:12 +00:00
|
|
|
default_span_name, DefaultSpanBackend, DisableOtelPropagation, OtelName, OtelPathNames,
|
|
|
|
ReqwestOtelSpanBackend, SpanBackendWithUrl, ERROR_CAUSE_CHAIN, ERROR_MESSAGE, HTTP_HOST,
|
|
|
|
HTTP_METHOD, HTTP_SCHEME, HTTP_STATUS_CODE, HTTP_URL, HTTP_USER_AGENT, NET_HOST_PORT,
|
|
|
|
OTEL_KIND, OTEL_NAME, OTEL_STATUS_CODE,
|
2022-06-30 13:54:54 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
#[doc(hidden)]
|
|
|
|
pub mod reqwest_otel_span_macro;
|