You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust Web应用对接Application Insights三类问题求助

Rust对接Application Insights常见问题解决方案

1. 正确对接Application Insights的步骤

使用tracing生态对接Application Insights的核心是通过opentelemetry-application-insights创建导出器,结合tracing-opentelemetry将tracing事件转发到Application Insights。示例代码如下:

use opentelemetry::global;
use opentelemetry_application_insights::TelemetryClient;
use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt, EnvFilter};

fn init_telemetry() {
    // 从环境变量读取Application Insights Instrumentation Key
    let instrumentation_key = std::env::var("APPINSIGHTS_INSTRUMENTATIONKEY").unwrap();
    // 创建Application Insights客户端
    let client = TelemetryClient::new(instrumentation_key);
    // 初始化OpenTelemetry tracer
    let tracer = client.tracer().unwrap();
    // 将tracer注册为全局tracer
    global::set_tracer_provider(tracer.provider().clone());

    // 构建tracing subscriber
    tracing_subscriber::registry()
        // 添加OpenTelemetry层,转发tracing事件到Application Insights
        .with(tracing_opentelemetry::layer().with_tracer(tracer))
        // 添加控制台输出层
        .with(tracing_subscriber::fmt::layer())
        // 初始化subscriber
        .init();
}

确保Cargo.toml中依赖版本兼容,推荐使用最新稳定版避免冲突:

[dependencies]
tracing = "0.1"
tracing-subscriber = "0.3"
opentelemetry = "0.21"
opentelemetry-application-insights = "0.21"
tracing-opentelemetry = "0.22"

2. 解决样本遥测"Not supported by this Agent/SDK version"问题

该错误多因使用了SDK不支持的遥测类型或API,解决方式如下:

  • 升级opentelemetry-application-insights到最新稳定版,旧版本可能缺失部分遥测支持。
  • 使用SDK兼容的方式发送样本遥测,通过tracing的span和事件传递数据,而非直接调用底层未支持的API:
use tracing::{info, span, Level};

fn send_sample_telemetry() {
    // 创建span,自动作为遥测发送到Application Insights
    let root_span = span!(Level::INFO, "root_operation", operation_type = "sample");
    let _enter = root_span.enter();
    
    info!(user_id = "test_user", "Sample telemetry event");
    
    // 添加自定义属性
    tracing::Span::current().record("custom_attribute", "custom_value");
}

若需发送指标类遥测,使用SDK支持的metrics API:

use opentelemetry::metrics::Meter;

fn send_sample_metric() {
    let meter = global::meter("sample_meter");
    let counter = meter.u64_counter("sample_counter").init();
    counter.add(1, &[opentelemetry::KeyValue::new("category", "test")]);
}

3. 隐藏DEBUG/TRACE日志的正确方式

直接使用.with_max_level报错是因为tracing-opentelemetry的Layer不支持该方法,需通过过滤功能分别控制控制台和Application Insights的日志级别:

控制控制台输出级别

给控制台层添加级别过滤,仅输出指定级别及以上日志:

tracing_subscriber::registry()
    .with(tracing_opentelemetry::layer().with_tracer(tracer))
    // 控制台只输出INFO及以上级别
    .with(tracing_subscriber::fmt::layer().with_filter(EnvFilter::new("info")))
    .init();

控制Application Insights的遥测级别

给OpenTelemetry层添加过滤,仅转发指定级别以上的事件:

use tracing_subscriber::filter::LevelFilter;

tracing_subscriber::registry()
    // 只转发INFO及以上级别的事件到Application Insights
    .with(tracing_opentelemetry::layer().with_tracer(tracer).with_filter(LevelFilter::INFO))
    .with(tracing_subscriber::fmt::layer().with_filter(EnvFilter::new("info")))
    .init();

环境变量动态控制

通过RUST_LOG环境变量灵活控制级别,代码中适配:

let env_filter = EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("info"));

tracing_subscriber::registry()
    .with(tracing_opentelemetry::layer().with_tracer(tracer).with_filter(env_filter.clone()))
    .with(tracing_subscriber::fmt::layer().with_filter(env_filter))
    .init();

内容的提问来源于stack exchange,提问作者Emanuel Balaban

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 08:22:42