pub use super::span_names::PROXY_AUTH;
pub use super::span_names::PROXY_FORWARD;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ProxySpanOutcome {
Success,
PayloadFailure,
TransportFailure,
Denied,
Bypassed,
}
pub fn forward_span(parent: &tracing::Span, rpc: &'static str) -> tracing::Span {
#[cfg(feature = "otel-traces")]
{
tracing::info_span!(
parent: parent,
PROXY_FORWARD,
rpc,
result = tracing::field::Empty,
)
}
#[cfg(not(feature = "otel-traces"))]
{
let _ = (parent, rpc);
tracing::Span::none()
}
}
pub fn auth_span(parent: &tracing::Span, rpc: &'static str) -> tracing::Span {
#[cfg(feature = "otel-traces")]
{
tracing::info_span!(
parent: parent,
PROXY_AUTH,
rpc,
result = tracing::field::Empty,
)
}
#[cfg(not(feature = "otel-traces"))]
{
let _ = (parent, rpc);
tracing::Span::none()
}
}
pub fn record_outcome(span: &tracing::Span, outcome: ProxySpanOutcome) {
let result = match outcome {
ProxySpanOutcome::Success => "success",
ProxySpanOutcome::PayloadFailure => "payload_failure",
ProxySpanOutcome::TransportFailure => "transport_failure",
ProxySpanOutcome::Denied => "denied",
ProxySpanOutcome::Bypassed => "bypassed",
};
span.record(crate::semantic::labels::RESULT, result);
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn proxy_spans_accept_only_bounded_contract_fields() {
let parent = tracing::Span::none();
let forward = forward_span(&parent, "SendMessage");
let auth = auth_span(&parent, "SendMessage");
record_outcome(&forward, ProxySpanOutcome::Success);
record_outcome(&auth, ProxySpanOutcome::Bypassed);
}
}