fregate/middleware/tracing/
common.rs

1//! Code for http/grpc requests tracing and logging.
2#[cfg(feature = "tls")]
3use crate::application::tls::RemoteAddr;
4use axum::extract::ConnectInfo;
5use axum::http::HeaderMap;
6use hyper::header::CONTENT_TYPE;
7use hyper::Request;
8use opentelemetry::{global::get_text_map_propagator, Context};
9use opentelemetry_http::HeaderExtractor;
10use std::net::SocketAddr;
11
12/// Extracts remote Ip and Port from [`Request`]
13#[cfg(not(feature = "tls"))]
14pub fn extract_remote_address<B>(request: &Request<B>) -> Option<&SocketAddr> {
15    request
16        .extensions()
17        .get::<ConnectInfo<SocketAddr>>()
18        .map(|ConnectInfo(addr)| addr)
19}
20
21/// Extracts remote Ip and Port from [`Request`]
22#[cfg(feature = "tls")]
23pub fn extract_remote_address<B>(request: &Request<B>) -> Option<&SocketAddr> {
24    request
25        .extensions()
26        .get::<ConnectInfo<RemoteAddr>>()
27        .map(|ConnectInfo(RemoteAddr(addr))| addr)
28}
29
30/// Extracts [`Context`] from [`Request`]
31pub fn extract_context<B>(request: &Request<B>) -> Context {
32    get_text_map_propagator(|propagator| propagator.extract(&HeaderExtractor(request.headers())))
33}
34
35/// Return [`true`] if incoming request [`CONTENT_TYPE`] header value starts with "application/grpc"
36pub fn is_grpc(headers: &HeaderMap) -> bool {
37    headers.get(CONTENT_TYPE).map_or(false, |content_type| {
38        content_type.as_bytes().starts_with(b"application/grpc")
39    })
40}