gpt4 book ai didi

node.js - Zipkin (Opencensus) - 2 个具有相同名称而不是不同名称的 Span

转载 作者:行者123 更新时间:2023-12-01 04:24:35 24 4
gpt4 key购买 nike

先决条件:Node.js应用Opencensus图书馆Zipkin 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"
...

zipper 服务器使用以下命令在本地启动:
docker run -d -p 9411:9411 openzipkin/zipkin

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

问题

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

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

最佳答案

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

问题1:

Zipkin UI displays 2 spans with same name MyApplication(see image), but expected 2 different span names



为了清楚起见, MyApplication是您在 app.js 中设置的服务名称,跨度名称是您在图像中选择的名称 /service1 , /service1 , /external_service_2 .

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

OpenCensus example

来自 Zipkin 的 documentation :

跨度

一组对应于特定 RPC 的 Annotations 和 BinaryAnnotations。 Span 包含标识信息,例如 traceId、spanId、parentId 和 RPC 名称。

跟踪

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

问题2:

As far Zipkin UI displays 2 spans with same name, service dependencies page contains one Service only(see image)



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

更改跨度名称:

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

来自 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 ,我在带有请求的 express 样本中使用了它:
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示踪剂。

关于node.js - Zipkin (Opencensus) - 2 个具有相同名称而不是不同名称的 Span,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59444729/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com