node.js - Zipkin (Opencensus) - 2 个名称相同而不是不同的 Span
问题描述
先决条件:
Node.js
应用程序
Opencensus
库
Zipkin Exporter
和本地 Zipkin 服务
应用程序.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(..)
...
包.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 个具有相同名称的跨度MyApplication
(见图),
但预期有 2 个不同的跨度名称
解决方案
我已经用 github 上的官方opencensus-node示例对此进行了测试。
问题1:
Zipkin UI 显示 2 个名称相同的跨度 MyApplication(见图),但预期有 2 个不同的跨度名称
为了清楚MyApplication
起见,是您在 app.js 中设置的服务名称,跨度名称是您在图像上选择的名称/service1
, /service1
, /external_service_2
.
我认为这是预期的行为,您有一个服务 ( MyApplication
)、一个根跨度 ( /service1
) 和一个子跨度 ( /external_service_2
)。如果您有多个服务连接到同一个 Zipkin 服务器,那么您将有多个服务名称。
从 Zipkin 的文档中:
跨度
对应于特定 RPC 的一组注解和二进制注解。Spans 包含标识信息,例如 traceId、spanId、parentId 和 RPC 名称。
痕迹
一组共享单个根跨度的跨度。Trace 是通过收集所有共享一个 traceId 的 Span 来构建的。然后基于 spanId 和 parentId 将跨度排列在树中,从而提供请求通过系统的路径的概览。
问题2:
就 Zipkin UI 显示 2 个同名跨度而言,服务依赖项页面仅包含一个服务(见图)
同样,这是预期的行为,因为您只有一项服务,而您发出的外部请求会通过它。
更改跨度名称:
如果您指的是第一张图像上的框架名称,则在顶部它仅显示您在上一个屏幕上单击的根跨度。但是,您可以在代码中稍作更改后编写自定义跨度名称。
从跟踪文档(使用您的代码):
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();
});
});
跨度必须闭合。
有关更多信息,请查看跟踪器的测试文件。
推荐阅读
- python - TypeError:尝试获取用户输入时,“元组”对象不可调用
- reactjs - 在 react-router v4 中加载 url 时组件不呈现
- oracle - 将两行合并为一行,其中一列具有不同的值
- c# - 有没有办法在不分配的情况下将通用枚举值转换为 UInt64 值?
- java - 如何将okhttp客户端连接到动态代理列表
- python - TypeError:“AnonymousUser”对象不可迭代
- arrays - 如何从 Kotlin JVM 中的字节数组中获取无符号整数?
- solr - 获取 Solr 结果中匹配项的长度
- vb.net - 从最高值的较低值更改文本框的颜色
- c++ - 现有终端客户端协议的 C++ 终端服务器