Zipkin (Opencensus) - 2 个名称相同而不是不同的 Span

Posted

技术标签:

【中文标题】Zipkin (Opencensus) - 2 个名称相同而不是不同的 Span【英文标题】:Zipkin (Opencensus) - 2 Spans with same names instead of different 【发布时间】:2020-04-14 02:48:46 【问题描述】:

先决条件:Node.js 应用程序OpencensusZipkin Exporter 和本地 Zipkin 服务

app.js

    const tracing = require('@opencensus/nodejs');
    const zipkin = require('@opencensus/exporter-zipkin');

    const ZIPKIN_ENDPOINT = process.env.ZIPKIN_ENDPOINT || "http://localhost:9411";

    const options = 
      url: `$ZIPKIN_ENDPOINT/api/v2/spans`,
      serviceName: 'MyApplication'
    
    const exporter = new zipkin.ZipkinTraceExporter(options);

    tracing.start('exporter': exporter);
...

    app.use(..)
...

package.json

 "dependencies": 
    "@opencensus/exporter-zipkin" : "0.0.19",
    "@opencensus/nodejs" : "0.0.19"
...

Zipkin 使用以下命令在本地启动服务器:

docker run -d -p 9411:9411 openzipkin/zipkin

在触发/service1 Zipkin Ui 后显示 2 个 span 对应 2 个不同的请求: 在 Node.js 路由器中配置的第一个 /service1 传入请求 第二个/external_service_2 是对外部服务的后续调用

问题

问题是在触发/service1 后:1. Zipkin UI 显示 2 个名称相同的跨度 MyApplication(见图),但预期有 2 个不同的跨度名称

2. 就 Zipkin UI 显示 2 个同名跨度而言, 服务依赖项页面仅包含一个服务(见图)

【问题讨论】:

我添加了一个答案,有用吗? @Tamas 是的,谢谢 很高兴能帮上忙! 【参考方案1】:

我已经用 github 上的官方 opencensus-node 示例对此进行了测试。

问题一:

Zipkin UI 显示 2 个同名的跨度 MyApplication(见图), 但预计有 2 个不同的跨度名称

需要明确的是,MyApplication 是您在 app.js 中设置的服务名称,而跨度名称是您在图像上选择的名称 /service1/service1/external_service_2

我认为这是预期的行为,您有一个服务 (MyApplication)、一个根跨度 (/service1) 和一个子跨度 (/external_service_2)。 如果您将多个服务连接到同一个 Zipkin 服务器,那么您将拥有多个服务名称。

来自 Zipkin 的documentation:

跨度

对应于特定 RPC 的一组注解和二进制注解。 Spans 包含标识信息,例如 traceId、spanId、parentId 和 RPC 名称。

追踪

一组共享单个根跨度的跨度。 Trace 是通过收集所有共享一个 traceId 的 Span 来构建的。然后根据 spanId 和 parentId 将 span 排列在树中,从而提供请求通过系统的路径的概览。

问题2:

到目前为止,Zipkin UI 显示 2 个具有相同名称、服务依赖项的 span 页面仅包含一项服务(见图)

同样,这是预期的行为,因为您只有一项服务,而您发出的外部请求会通过它。

更改跨度名称:

如果您指的是第一张图片上的框架名称,则顶部仅显示您在上一个屏幕上单击的根跨度。 但是,您可以在代码中稍作更改后编写自定义跨度名称。

来自tracing documentation(带有您的代码):

const options = 
  url: `$ZIPKIN_ENDPOINT/api/v2/spans`,
  serviceName: 'MyApplication'

const tracer = tracing.start(samplingRate: 1).tracer;
tracer.registerSpanEventListener(new zipkin.ZipkinTraceExporter(options));

现在你可以使用tracer.startRootSpan,我在一个请求的快递样本中使用了它:

tracer.startRootSpan(name: 'main', rootSpan => 
  rp('http://localhost:3000/sample').then(data => 
    res.send(data);
    rootSpan.end();
  , err => 
    console.error(`$err.message`);
    rootSpan.end();
  );
);

必须关闭一个跨度。

更多信息,请查看追踪器的test file。

【讨论】:

以上是关于Zipkin (Opencensus) - 2 个名称相同而不是不同的 Span的主要内容,如果未能解决你的问题,请参考以下文章

OpenTelemetry项目中的Observability

opencensus 出口商 - 一个全局或每个线程?

ClassNotFoundException: io.opencensus.trace.propagation.TextFormat 未找到

链路追踪(Tracing)的前世今生(上)

链路追踪(Tracing)的前世今生(上)

Stackdriver 上未显示自定义 OpenCensus 指标