带有 OpenTelemetry 的 Rust 仪器库

问题描述

我正在学习 tracing in Rustopen-telemetry in Rust。感觉概念太多,板条箱太多(至少在 Rust 中)看不到痕迹。

我编写了一个简单的 lib 应用,它添加了两个 u32

use std::ops::Add;

pub fn add(f: u32,s: u32) -> u32 {
    let span = tracing::info_span!("Add function",?f,?s);
    let _guard = span.enter();
    tracing::info!("Info event");
    f.add(s)
}

然后我在我的 bin 应用程序中使用 lib,如下所示。

use TracedLibrary::add;
use tracing_opentelemetry::OpenTelemetryLayer;
use tracing_subscriber::util::SubscriberInitExt;
use opentelemetry::{global,sdk::propagation::TraceContextPropagator};
use tracing_subscriber::layer::SubscriberExt;
use tracing_subscriber::Registry;

fn main() {
    setup_global_subscriber();
    let sum = add::add(1,2);
}

fn setup_global_subscriber() {
    global::set_text_map_propagator(TraceContextPropagator::new());
    let (tracer,_uninstall) = opentelemetry_jaeger::new_pipeline()
        .with_service_name("trace_demo_2")
        .install().expect("Error initializing Jaeger exporter");
    let telemetry = tracing_opentelemetry::layer().with_tracer(tracer);

    Registry::default()
        .with(telemetry).init();
}

最令人困惑的部分是我的应用Cargo.toml,它看起来像

...
tracing-subscriber = { version = "0.2.15" }
tracing-opentelemetry = { version= "0.11.0"}
opentelemetry = "0.12.0"
opentelemetry-jaeger = {version = "0.11.0" }
...

这些不同的板条箱到底是干什么用的?唯一有意义的板条箱是 opentelemetry-jaeger。其他人还需要吗?

对于我的主要问题:我正在运行 Jaeger 的一体式 Docker 容器。但是当我访问 http://localhost:16686 时......我看不到任何痕迹。 有谁知道发生了什么?

解决方法

好吧..当我在 setup_global_subscriber() 中创建一个 jaeger 管道时......返回的 _uninstall 在方法结束时被丢弃。 当它掉落时,收集器关闭。

为了获得跟踪,我必须将 setup_global_subscriber() 的内容移动到 main() 中。

##$&@(& 我。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...