feat(otel): propagate session.id to spans and log records (#7490)

Signed-off-by: Adrian Cole <adrian@tetrate.io>
This commit is contained in:
Adrian Cole
2026-03-16 13:06:31 +08:00
committed by GitHub
parent 10d597de3b
commit 2631095f20
20 changed files with 193 additions and 126 deletions
@@ -4,9 +4,14 @@ use goose::providers::api_client::{ApiClient, AuthMethod};
use goose::providers::base::Provider;
use goose::providers::openai::OpenAiProvider;
use goose::session_context::SESSION_ID_HEADER;
use opentelemetry::logs::AnyValue;
use opentelemetry::Key;
use opentelemetry_appender_tracing::layer::OpenTelemetryTracingBridge;
use opentelemetry_sdk::logs::{InMemoryLogExporterBuilder, SdkLoggerProvider};
use serde_json::json;
use std::sync::Arc;
use std::sync::Mutex;
use tracing_subscriber::prelude::*;
use wiremock::matchers::{method, path};
use wiremock::{Mock, MockServer, Request, ResponseTemplate};
@@ -104,6 +109,37 @@ async fn make_request(provider: &dyn Provider, session_id: &str) {
.unwrap();
}
#[tokio::test]
async fn test_session_id_propagates_to_log_records() {
let exporter = InMemoryLogExporterBuilder::default().build();
let provider = SdkLoggerProvider::builder()
.with_simple_exporter(exporter.clone())
.build();
let layer = OpenTelemetryTracingBridge::builder(&provider)
.with_span_attribute_allowlist(["session.id"])
.build();
let subscriber = tracing_subscriber::registry().with(layer);
let _guard = tracing::subscriber::set_default(subscriber);
let span = tracing::info_span!("test", session.id = "test-session-42");
let _enter = span.enter();
tracing::info!("hello from test");
drop(_enter);
drop(_guard);
provider.force_flush().unwrap();
let logs = exporter.get_emitted_logs().unwrap();
assert_eq!(logs.len(), 1);
let log = &logs[0];
let has_session_id = log.record.attributes_iter().any(|(k, v)| {
k == &Key::new("session.id")
&& matches!(v, AnyValue::String(s) if s.as_str() == "test-session-42")
});
assert!(has_session_id);
}
#[tokio::test]
async fn test_session_id_propagation_to_llm() {
let (_, capture, provider) = setup_mock_server().await;