本文介绍了如何将 Node.js 应用接入链路追踪。

前提条件

在 Node 工程的 Package 中配置对 Jaeger Client 的依赖。

"dependencies": {
    "jaeger-client": "^3.12.0"
  }

  1. 登录链路追踪控制台,在概览页面的 Region对应信息区域打开查看Token 开关。
  2. 客户端采集工具区域单击需要使用的链路数据采集客户端。
  3. 在下方表格中相应地域的相关信息列中,单击接入点信息末尾的复制按钮。

Tracing Analysis Endpoint Section

提示:如果应用部署于阿里云生产环境,则选择内网接入点,否则选择公网接入点。对于 Zipkin,一般情况下请使用 v2 版接入点,v1 版接入点仅限对 Zipkin 十分了解的高阶用户使用。

背景信息

不通过 Agent 而直接上报数据的原理如下图所示。

Report Tracing Data Directly

通过 Agent 上报数据的原理如下图所示。

Report Tracing Data By Agent

操作步骤

  1. 初始化配置。
    注意 请将 <endpoint> 替换成链路追踪控制台概览页面上相应客户端和相应地域的接入点。关于获取接入点信息的方法,请参见前提条件中的获取接入点信息
    const initTracer = require("jaeger-client").initTracer;
    
    const config = {
        serviceName: 'node-service',
        sampler: {
            type: "const",
            param: 1
        },
        reporter: {
            collectorEndpoint: "<endpoint>"
        },
    };
  2. 创建 Tracer 实例对象。
    const tracer = initTracer(config);
  3. 创建 Span 实例对象。
    const span = tracer.startSpan("say-hello");
    
    // 设置标签(可选,支持多个)
    span.setTag("tagKey-01", "tagValue-01");
    
    // 设置事件(可选,支持多个)
    span.log({event: "timestamp", value: Date.now()});
    
    // 标记 Span 结束
    span.finish();
  4. 登录链路追踪控制台并查看调用链。

基于 Express 的完整示例

const express = require("express");
const initTracer = require("jaeger-client").initTracer;
const app = express();

const config = {
    serviceName: 'node-service',
    sampler: {
        type: "const",
        param: 1
    },
    reporter: {
        collectorEndpoint: "<endpoint>"
    },
};
const tracer = initTracer(config);

app.all('*', function (req, res, next) {
    req.span = tracer.startSpan("say-hello");
    next();
});

app.get("/api", function (req, res) {
    const span = req.span;
    span.log({event: "timestamp", value: Date.now()});
    req.span.finish();
    res.send({code: 200, msg: "success"});
});

app.listen(3000, '127.0.0.1', function () {
    console.log('start');
});

更多信息