mcp-stdio-proxy 0.2.9

MCP (Model Context Protocol) proxy server and CLI tool for protocol conversion and remote service access
use anyhow::Result;
use opentelemetry::global;
use opentelemetry_sdk::trace::{RandomIdGenerator, Sampler, SdkTracerProvider};

/// 初始化 OpenTelemetry tracer provider
///
/// 这个函数必须在创建 telemetry layer 之前调用
pub fn init_tracer_provider(_service_name: &str, _service_version: &str) -> Result<()> {
    // 创建 tracer provider
    let tracer_provider = SdkTracerProvider::builder()
        .with_sampler(Sampler::AlwaysOn)
        .with_id_generator(RandomIdGenerator::default())
        .build();

    // 设置全局 tracer provider
    global::set_tracer_provider(tracer_provider);

    Ok(())
}

/// 创建增强的 OpenTelemetry layer
///
/// 这个函数创建一个配置好的 OpenTelemetry layer,可以与现有的 tracing 配置集成
/// 注意:必须先调用 init_tracer_provider()
pub fn create_telemetry_layer() -> impl tracing_subscriber::Layer<tracing_subscriber::Registry> {
    tracing_opentelemetry::layer()
}

/// 记录服务启动信息
///
/// 在 telemetry 系统初始化后调用,记录服务的基本信息
pub fn log_service_info(service_name: &str, service_version: &str) -> Result<()> {
    tracing::info!(
        service_name = %service_name,
        service_version = %service_version,
        "Service started with OpenTelemetry tracing enabled"
    );
    Ok(())
}

/// 优雅关闭 OpenTelemetry
pub fn shutdown_telemetry() {
    tracing::info!("Shutting down OpenTelemetry");
    // 注意:在新版本的 OpenTelemetry 中,shutdown 方法可能不同
    // 这里我们简单地记录关闭信息
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_log_service_info() {
        let result = log_service_info("test-service", "0.1.0");
        assert!(result.is_ok());

        // 清理
        shutdown_telemetry();
    }
}