将服务跃点与 Zipkin 和 NodeJS 链接起来

Linking Service Hops with Zipkin and NodeJS

我正在尝试 link 将 NodeJS 中的三个 HTTP 服务跃点合并到一个 Zipkin 跟踪中。我有三个服务

service-main
service-hello
service-goodbye

服务service-main调用service-helloservice-hello需要调用service-goodbye才能完成。 Zipkin 可以看到这些调用,但 link 将它们作为两个单独的跟踪记录在一起。 (service-main 调用 service-helloservice-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) {
    //...
})

给了我想要的结果。