nidus-http 1.0.3

Axum and Tower HTTP integration, controllers, middleware, health, metrics, and server defaults for Nidus.
Documentation
#![cfg(feature = "otel")]

use http::HeaderValue;
use nidus_http::otel::{OtelConfig, TraceContext, extract_trace_context, inject_trace_context};

#[test]
fn otel_config_carries_otlp_endpoint_and_resource_attributes() {
    let config = OtelConfig::new("users-api")
        .version("1.2.3")
        .environment("test")
        .with_otlp_endpoint("http://collector:4317")
        .resource_attribute("region", "local");

    assert_eq!(config.service_name(), "users-api");
    assert_eq!(config.otlp_endpoint(), Some("http://collector:4317"));
    assert_eq!(config.resource_attributes()["service.name"], "users-api");
    assert_eq!(config.resource_attributes()["service.version"], "1.2.3");
    assert_eq!(
        config.resource_attributes()["deployment.environment"],
        "test"
    );
    assert_eq!(config.resource_attributes()["region"], "local");
}

#[test]
fn otel_trace_context_extracts_and_injects_traceparent_headers() {
    let mut headers = http::HeaderMap::new();
    headers.insert(
        "traceparent",
        HeaderValue::from_static("00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01"),
    );

    let context = extract_trace_context(&headers).unwrap();
    assert_eq!(context.trace_id(), "4bf92f3577b34da6a3ce929d0e0e4736");
    assert_eq!(context.span_id(), "00f067aa0ba902b7");
    assert!(context.sampled());

    let mut injected = http::HeaderMap::new();
    inject_trace_context(&mut injected, &context);
    assert_eq!(
        injected.get("traceparent").unwrap(),
        "00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01"
    );

    assert!(TraceContext::parse("not-a-traceparent").is_none());
}