reqwest_tracing/
lib.rs

1//! Opentracing middleware implementation for [`reqwest_middleware`].
2//!
3//! Attach [`TracingMiddleware`] to your client to automatically trace HTTP requests.
4//!
5//! The simplest possible usage:
6//! ```no_run
7//! # use reqwest_middleware::Result;
8//! use reqwest_middleware::{ClientBuilder};
9//! use reqwest_tracing::TracingMiddleware;
10//!
11//! # async fn example() -> Result<()> {
12//! let reqwest_client = reqwest::Client::builder().build().unwrap();
13//! let client = ClientBuilder::new(reqwest_client)
14//!    // Insert the tracing middleware
15//!    .with(TracingMiddleware::default())
16//!    .build();
17//!
18//! let resp = client.get("https://truelayer.com").send().await.unwrap();
19//! # Ok(())
20//! # }
21//! ```
22//!
23//! To customise the span names use [`OtelName`].
24//! ```no_run
25//! # use reqwest_middleware::Result;
26//! use reqwest_middleware::{ClientBuilder, Extension};
27//! use reqwest_tracing::{
28//!     TracingMiddleware, OtelName
29//! };
30//! # async fn example() -> Result<()> {
31//! let reqwest_client = reqwest::Client::builder().build().unwrap();
32//! let client = ClientBuilder::new(reqwest_client)
33//!    // Inserts the extension before the request is started
34//!    .with_init(Extension(OtelName("my-client".into())))
35//!    // Makes use of that extension to specify the otel name
36//!    .with(TracingMiddleware::default())
37//!    .build();
38//!
39//! let resp = client.get("https://truelayer.com").send().await.unwrap();
40//!
41//! // Or specify it on the individual request (will take priority)
42//! let resp = client.post("https://api.truelayer.com/payment")
43//!     .with_extension(OtelName("POST /payment".into()))
44//!    .send()
45//!    .await
46//!    .unwrap();
47//! # Ok(())
48//! # }
49//! ```
50//!
51//! In this example we define a custom span builder to calculate the request time elapsed and we register the [`TracingMiddleware`].
52//!
53//! Note that Opentelemetry tracks start and stop already, there is no need to have a custom builder like this.
54//! ```rust
55//! use reqwest_middleware::Result;
56//! use http::Extensions;
57//! use reqwest::{Request, Response};
58//! use reqwest_middleware::ClientBuilder;
59//! use reqwest_tracing::{
60//!     default_on_request_end, reqwest_otel_span, ReqwestOtelSpanBackend, TracingMiddleware
61//! };
62//! use tracing::Span;
63//! use std::time::{Duration, Instant};
64//!
65//! pub struct TimeTrace;
66//!
67//! impl ReqwestOtelSpanBackend for TimeTrace {
68//!     fn on_request_start(req: &Request, extension: &mut Extensions) -> Span {
69//!         extension.insert(Instant::now());
70//!         reqwest_otel_span!(name="example-request", req, time_elapsed = tracing::field::Empty)
71//!     }
72//!
73//!     fn on_request_end(span: &Span, outcome: &Result<Response>, extension: &mut Extensions) {
74//!         let time_elapsed = extension.get::<Instant>().unwrap().elapsed().as_millis() as i64;
75//!         default_on_request_end(span, outcome);
76//!         span.record("time_elapsed", &time_elapsed);
77//!     }
78//! }
79//!
80//! let http = ClientBuilder::new(reqwest::Client::new())
81//!     .with(TracingMiddleware::<TimeTrace>::new())
82//!     .build();
83//! ```
84
85mod middleware;
86#[cfg(any(
87    feature = "opentelemetry_0_20",
88    feature = "opentelemetry_0_21",
89    feature = "opentelemetry_0_22",
90    feature = "opentelemetry_0_23",
91    feature = "opentelemetry_0_24",
92    feature = "opentelemetry_0_25",
93    feature = "opentelemetry_0_26",
94    feature = "opentelemetry_0_27",
95    feature = "opentelemetry_0_28",
96))]
97mod otel;
98mod reqwest_otel_span_builder;
99pub use middleware::TracingMiddleware;
100pub use reqwest_otel_span_builder::{
101    default_on_request_end, default_on_request_failure, default_on_request_success,
102    default_span_name, DefaultSpanBackend, DisableOtelPropagation, OtelName, OtelPathNames,
103    ReqwestOtelSpanBackend, SpanBackendWithUrl, ERROR_CAUSE_CHAIN, ERROR_MESSAGE,
104    HTTP_REQUEST_METHOD, HTTP_RESPONSE_STATUS_CODE, OTEL_KIND, OTEL_NAME, OTEL_STATUS_CODE,
105    SERVER_ADDRESS, SERVER_PORT, URL_FULL, URL_SCHEME, USER_AGENT_ORIGINAL,
106};
107
108#[cfg(feature = "deprecated_attributes")]
109pub use reqwest_otel_span_builder::{
110    HTTP_HOST, HTTP_METHOD, HTTP_SCHEME, HTTP_STATUS_CODE, HTTP_URL, HTTP_USER_AGENT, NET_HOST_PORT,
111};
112
113#[doc(hidden)]
114pub mod reqwest_otel_span_macro;