将服务跃点与 Zipkin 和 NodeJS 链接起来
Linking Service Hops with Zipkin and NodeJS
我正在尝试 link 将 NodeJS 中的三个 HTTP 服务跃点合并到一个 Zipkin 跟踪中。我有三个服务
service-main
service-hello
service-goodbye
服务service-main
调用service-hello
,service-hello
需要调用service-goodbye
才能完成。 Zipkin 可以看到这些调用,但 link 将它们作为两个单独的跟踪记录在一起。 (service-main
调用 service-hello
,service-hello
调用 service-goodbye
。
服务在 express
中实现,通过 node-fetch
进行获取。
我创建了一个检测服务获取器,代码如下所示
const createFetcher = (remoteServiceName, tracer) => {
const wrapFetch = require('zipkin-instrumentation-fetch');
return wrapFetch(fetch,
{
tracer:tracer,
remoteServiceName:remoteServiceName
}
);
}
我使用如下代码检测 express
app.use(zipkinMiddleware({tracer}));
最后,我使用如下所示的代码创建跟踪器
const createTracer = (localServiceName) => {
const tracer = new Tracer({
ctxImpl: new CLSContext('zipkin'),
recorder: new BatchRecorder({
logger: new HttpLogger({
endpoint: 'http://localhost:9411/api/v2/spans',
jsonEncoder: JSON_V2
})
}),
localServiceName: localServiceName // name of this application
});
return tracer;
}
您可以在 the following github repository.
的上下文中查看以上代码
我通过 cargo-culting 从 zipkin github 存储库中提取代码示例来完成所有这些工作,但我对 zipkin 的实现知之甚少,无法进一步诊断。
如何让 zipkin 将 service-main
-> service-hello
-> service-goodbye
调用链视为单个跟踪?
貌似和https://github.com/openzipkin/zipkin-js/pull/498有关,能不能用zipkin-context-cls@0.19.2-alpha.7试试把ctxImpl
改成ctxImpl = new CLSContext('zipkin', true);
?
问题最终不在 Zipkin 端,而是在我如何检测 express 服务器上。
app.get('/main', async function (req, res) {
//...
})
app.use(zipkinMiddleware({tracer}));
我在 调用 app.get
之后添加了 zipkin 中间件 。 Express 按顺序执行中间件,并且不区分命名路由的中间件与通过 app.use
添加的内容。
做这样的事情
app.use(zipkinMiddleware({tracer}));
app.get('/main', async function (req, res) {
//...
})
给了我想要的结果。
我正在尝试 link 将 NodeJS 中的三个 HTTP 服务跃点合并到一个 Zipkin 跟踪中。我有三个服务
service-main
service-hello
service-goodbye
服务service-main
调用service-hello
,service-hello
需要调用service-goodbye
才能完成。 Zipkin 可以看到这些调用,但 link 将它们作为两个单独的跟踪记录在一起。 (service-main
调用 service-hello
,service-hello
调用 service-goodbye
。
服务在 express
中实现,通过 node-fetch
进行获取。
我创建了一个检测服务获取器,代码如下所示
const createFetcher = (remoteServiceName, tracer) => {
const wrapFetch = require('zipkin-instrumentation-fetch');
return wrapFetch(fetch,
{
tracer:tracer,
remoteServiceName:remoteServiceName
}
);
}
我使用如下代码检测 express
app.use(zipkinMiddleware({tracer}));
最后,我使用如下所示的代码创建跟踪器
const createTracer = (localServiceName) => {
const tracer = new Tracer({
ctxImpl: new CLSContext('zipkin'),
recorder: new BatchRecorder({
logger: new HttpLogger({
endpoint: 'http://localhost:9411/api/v2/spans',
jsonEncoder: JSON_V2
})
}),
localServiceName: localServiceName // name of this application
});
return tracer;
}
您可以在 the following github repository.
的上下文中查看以上代码我通过 cargo-culting 从 zipkin github 存储库中提取代码示例来完成所有这些工作,但我对 zipkin 的实现知之甚少,无法进一步诊断。
如何让 zipkin 将 service-main
-> service-hello
-> service-goodbye
调用链视为单个跟踪?
貌似和https://github.com/openzipkin/zipkin-js/pull/498有关,能不能用zipkin-context-cls@0.19.2-alpha.7试试把ctxImpl
改成ctxImpl = new CLSContext('zipkin', true);
?
问题最终不在 Zipkin 端,而是在我如何检测 express 服务器上。
app.get('/main', async function (req, res) {
//...
})
app.use(zipkinMiddleware({tracer}));
我在 调用 app.get
之后添加了 zipkin 中间件 。 Express 按顺序执行中间件,并且不区分命名路由的中间件与通过 app.use
添加的内容。
做这样的事情
app.use(zipkinMiddleware({tracer}));
app.get('/main', async function (req, res) {
//...
})
给了我想要的结果。