Zipkin (Opencensus) - 2 个具有相同名称而不是不同名称的跨度
Zipkin (Opencensus) - 2 Spans with same names instead of different
先决条件:
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"
...
Zipkin 服务器在本地使用命令启动:
docker run -d -p 9411:9411 openzipkin/zipkin
触发后 /service1
Zipkin Ui 为 2 个不同的请求显示 2 个跨度:
在 Node.js 路由器
中配置的第一个 /service1
传入请求
第二个 /external_service_2
是对外部服务的后续调用
问题
问题是触发后/service1
:
1. Zipkin UI 显示 2 个具有相同名称的 span MyApplication
(见图),
但预期有 2 个不同的 span 名称
2. 目前 Zipkin UI 显示 2 个具有相同名称的跨度,
服务依赖项页面仅包含一个服务(见图)
我已经在 github.
上使用官方 opencensus-node 示例对此进行了测试
问题 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 服务器,那么您将有多个服务名称。
来自 Zipkin 的 documentation:
跨度
一组与特定 RPC 相对应的注释和二进制注释。跨度包含标识信息,例如 traceId、spanId、parentId 和 RPC 名称。
追踪
共享单个根跨度的一组跨度。跟踪是通过收集共享一个 traceId 的所有 Span 来构建的。然后基于 spanId 和 parentId 将 span 排列在树中,从而提供请求通过系统的路径概览。
问题 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 sample中用了一个请求:
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
申请
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"
...
Zipkin 服务器在本地使用命令启动:
docker run -d -p 9411:9411 openzipkin/zipkin
触发后 /service1
Zipkin Ui 为 2 个不同的请求显示 2 个跨度:
在 Node.js 路由器
中配置的第一个 /service1
传入请求
第二个 /external_service_2
是对外部服务的后续调用
问题
问题是触发后/service1
:
1. Zipkin UI 显示 2 个具有相同名称的 span MyApplication
(见图),
但预期有 2 个不同的 span 名称
2. 目前 Zipkin UI 显示 2 个具有相同名称的跨度,
服务依赖项页面仅包含一个服务(见图)
我已经在 github.
上使用官方 opencensus-node 示例对此进行了测试问题 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 服务器,那么您将有多个服务名称。
来自 Zipkin 的 documentation:
跨度
一组与特定 RPC 相对应的注释和二进制注释。跨度包含标识信息,例如 traceId、spanId、parentId 和 RPC 名称。
追踪
共享单个根跨度的一组跨度。跟踪是通过收集共享一个 traceId 的所有 Span 来构建的。然后基于 spanId 和 parentId 将 span 排列在树中,从而提供请求通过系统的路径概览。
问题 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 sample中用了一个请求:
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。