首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用锈菌tracing_distributed

如何使用锈菌tracing_distributed
EN

Stack Overflow用户
提问于 2022-02-25 00:31:33
回答 1查看 247关注 0票数 0

我正在尝试使用锈菌tracing_distributed包,但是在使用它时,我会遇到奇怪和无用的错误,我假设我使用它是错误的,但是没有文档,也没有关于如何使用它的例子。下面是我试图做的事情的一个例子:

代码语言:javascript
复制
let trace = tracing_distributed::register_dist_tracing_root(traceId, remote_parent_span_id));
println!("trace value: {:?}", trace);

// the result of trace is: Err(NoEnabledSpan)

我尝试以traceID和remote_parent_span_id的形式传递一些内容,包括:

代码语言:javascript
复制
traceId = remote_parent_span_id = Some(tracing::Span::current())

以及:

代码语言:javascript
复制
traceId = Some(tracing::Span::current())
remote_parent_span_id = ~someParentRequestIdGeneratedUpstream~

我知道,当前的跨度不会因为尝试而被禁用:

代码语言:javascript
复制
let span = tracing::Span::current();
if span.is_disabled() {
    println!("CURRENT SPAN DISABELED");
}

因此,这使我认为问题来自没有正确设置订阅者。我正在尝试将订阅服务器设置为init函数,该函数在此函数之前调用,如下所示:

代码语言:javascript
复制
let subscriber = tracing_subscriber::registry() // provide underlying span data store
        .with(
            tracing_subscriber::fmt::layer()
                .json()
                .with_span_events(FmtSpan::ACTIVE)
                .event_format(stackdriver::StackDriverEventFormat::default())
                .with_filter(tracing_subscriber::filter::dynamic_filter_fn(
                    move |m, c| filter_layer.enabled(m, c.to_owned()),
                )),
        );

    let _ = tracing::subscriber::set_global_default(subscriber)
        .map_err(|_err| eprintln!("Unable to set global default subscriber"));

有人愿意给我举一个如何使用这个图书馆的例子吗?或者有人能看到我做错了什么吗?我已经试过了我能想到的一切。

EN

回答 1

Stack Overflow用户

发布于 2022-04-05 20:06:42

tracing-distributed有一个测试,它演示如何创建和使用TelemetryLayer

我做了一个基于它的演示。在这个演示中,NoEnabledSpan可能是由于缺少#[instrument]而引起的,它为函数foo创建了一个Span。希望这能帮你找到真正的原因。

另外,tracing-honeycombtracing-distributed的一个很好的用例,最好检查一下。

代码语言:javascript
复制
use std::sync::{Arc, Mutex};

use tracing::{Id, info};
use tracing::instrument;
use tracing_distributed::{Event, Span, Telemetry, TelemetryLayer};
use tracing_subscriber::layer::SubscriberExt;
use tracing_subscriber::registry;

#[derive(Default, Debug)]
pub struct BlackholeVisitor;

#[derive(PartialEq, Eq, Hash, Copy, Clone, Debug)]
pub struct TraceId(pub(crate) u128);

type SpanId = tracing::Id;

impl tracing::field::Visit for BlackholeVisitor {
    fn record_debug(&mut self, _: &tracing::field::Field, _: &dyn std::fmt::Debug) {}
}

/// Mock telemetry capability
pub struct TestTelemetry {
    spans: Arc<Mutex<Vec<Span<BlackholeVisitor, SpanId, TraceId>>>>,
    events: Arc<Mutex<Vec<Event<BlackholeVisitor, SpanId, TraceId>>>>,
}

impl TestTelemetry {
    pub fn new(
        spans: Arc<Mutex<Vec<Span<BlackholeVisitor, SpanId, TraceId>>>>,
        events: Arc<Mutex<Vec<Event<BlackholeVisitor, SpanId, TraceId>>>>,
    ) -> Self {
        TestTelemetry { spans, events }
    }
}

impl Telemetry for TestTelemetry {
    type Visitor = BlackholeVisitor;
    type TraceId = TraceId;
    type SpanId = SpanId;

    fn mk_visitor(&self) -> Self::Visitor {
        BlackholeVisitor
    }

    fn report_span(&self, span: Span<BlackholeVisitor, SpanId, TraceId>) {
        // succeed or die. failure is unrecoverable (mutex poisoned)
        let mut spans = self.spans.lock().unwrap();
        spans.push(span);
    }

    fn report_event(&self, event: Event<BlackholeVisitor, SpanId, TraceId>) {
        // succeed or die. failure is unrecoverable (mutex poisoned)
        let mut events = self.events.lock().unwrap();
        events.push(event);
    }
}

#[instrument]
fn foo() {
    let trace = tracing_distributed::register_dist_tracing_root(TraceId(123), Option::<Id>::None);
    println!("trace value: {:?}", trace);
    info!("test");
}

fn main() {
    let spans = Arc::new(Mutex::new(Vec::new()));
    let events = Arc::new(Mutex::new(Vec::new()));

    let cap = TestTelemetry::new(spans.clone(), events.clone());

    let telemetry_layer = TelemetryLayer::new("test_svc_name", cap, |x| x);
    let subscriber = registry::Registry::default()
        .with(tracing_subscriber::fmt::Layer::default())
        .with(telemetry_layer);
    // dbg!(&subscriber);
    tracing::subscriber::set_global_default(subscriber).expect("setting global default failed");
    foo();
    dbg!(&spans);
    dbg!(&events);
}

机箱版本:

代码语言:javascript
复制
tracing = "0.1.32"
tracing-distributed = "0.4.0"
tracing-subscriber = "0.3.10"
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71259760

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档