spring_opentelemetry/
trace.rs

1mod grpc;
2mod http;
3
4pub use crate::trace::grpc::GrpcLayer;
5pub use crate::trace::http::HttpLayer;
6
7use std::env::VarError;
8
9/// Describes the relationship between the [`Span`] and the service producing the span.
10#[derive(Clone, Copy, Debug)]
11enum SpanKind {
12    /// The span describes a request sent to some remote service.
13    Client,
14    /// The span describes the server-side handling of a request.
15    Server,
16}
17
18impl SpanKind {
19    /// refs: https://opentelemetry.io/docs/zero-code/java/agent/instrumentation/http/
20    fn capture_request_headers(&self) -> Vec<String> {
21        let var = match self {
22            Self::Client => "OTEL_INSTRUMENTATION_HTTP_CLIENT_CAPTURE_REQUEST_HEADERS",
23            Self::Server => "OTEL_INSTRUMENTATION_HTTP_SERVER_CAPTURE_REQUEST_HEADERS",
24        };
25        Self::split_env_headers_value(var)
26    }
27
28    /// refs: https://opentelemetry.io/docs/zero-code/java/agent/instrumentation/http/
29    fn capture_response_headers(&self) -> Vec<String> {
30        let var = match self {
31            Self::Client => "OTEL_INSTRUMENTATION_HTTP_CLIENT_CAPTURE_RESPONSE_HEADERS",
32            Self::Server => "OTEL_INSTRUMENTATION_HTTP_SERVER_CAPTURE_RESPONSE_HEADERS",
33        };
34        Self::split_env_headers_value(var)
35    }
36
37    #[inline]
38    fn split_env_headers_value(var: &str) -> Vec<String> {
39        match std::env::var(var) {
40            Ok(headers) => headers
41                .split(",")
42                .map(|s| s.trim().to_lowercase())
43                .collect(),
44            Err(e) => {
45                if let VarError::NotUnicode(value) = e {
46                    tracing::warn!("{var} contains invalid unicode data:{value:?}")
47                }
48                vec![]
49            }
50        }
51    }
52}