mcp_stdio_proxy/server/
telemetry.rs

1use anyhow::Result;
2use opentelemetry::global;
3use opentelemetry_sdk::trace::{RandomIdGenerator, Sampler, SdkTracerProvider};
4
5/// 初始化 OpenTelemetry tracer provider
6///
7/// 这个函数必须在创建 telemetry layer 之前调用
8pub fn init_tracer_provider(_service_name: &str, _service_version: &str) -> Result<()> {
9    // 创建 tracer provider
10    let tracer_provider = SdkTracerProvider::builder()
11        .with_sampler(Sampler::AlwaysOn)
12        .with_id_generator(RandomIdGenerator::default())
13        .build();
14
15    // 设置全局 tracer provider
16    global::set_tracer_provider(tracer_provider);
17
18    Ok(())
19}
20
21/// 创建增强的 OpenTelemetry layer
22///
23/// 这个函数创建一个配置好的 OpenTelemetry layer,可以与现有的 tracing 配置集成
24/// 注意:必须先调用 init_tracer_provider()
25pub fn create_telemetry_layer() -> impl tracing_subscriber::Layer<tracing_subscriber::Registry> {
26    tracing_opentelemetry::layer()
27}
28
29/// 记录服务启动信息
30///
31/// 在 telemetry 系统初始化后调用,记录服务的基本信息
32pub fn log_service_info(service_name: &str, service_version: &str) -> Result<()> {
33    tracing::info!(
34        service_name = %service_name,
35        service_version = %service_version,
36        "Service started with OpenTelemetry tracing enabled"
37    );
38    Ok(())
39}
40
41/// 优雅关闭 OpenTelemetry
42pub fn shutdown_telemetry() {
43    tracing::info!("Shutting down OpenTelemetry");
44    // 注意:在新版本的 OpenTelemetry 中,shutdown 方法可能不同
45    // 这里我们简单地记录关闭信息
46}
47
48#[cfg(test)]
49mod tests {
50    use super::*;
51
52    #[test]
53    fn test_log_service_info() {
54        let result = log_service_info("test-service", "0.1.0");
55        assert!(result.is_ok());
56
57        // 清理
58        shutdown_telemetry();
59    }
60}