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

前提条件

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

"dependencies": {
    "jaeger-client": "^3.12.0"
  }
获取接入点信息
  1. 登录ARMS控制台,在左侧导航栏选择应用监控 > 应用列表
  2. 应用列表页面顶部选择目标地域,然后单击目标链路追踪应用名称。
    说明 语言列显示Java图标图标的应用为接入应用监控的应用,显示-图标的应用为接入链路追踪的应用。
  3. 在弹出的页面中,单击左侧导航栏上方的返回图标图标,返回上一层。
  4. 在左侧导航栏单击集群配置,然后在右侧页面单击接入点信息页签。
  5. 在页面顶部选择需要接入的地域,然后在集群信息区域打开显示Token开关。
  6. 客户端采集工具区域单击需要使用的链路数据采集客户端。

    在下方表格的相关信息列中,获取接入点信息。

    Jaeger/Zipkin接入点信息
    说明
    • 对于ACK集群应用,建议通过ARMS OpenTelemetry Collector上报应用数据。ARMS OpenTelemetry Collector支持本地集群内的链路采样与指标无损统计,在降低链路传输、存储成本的同时,不影响监控或告警指标的准确性。更多信息,请参见ARMS OpenTelemetry Collector
    • 如果应用部署于阿里云生产环境,则选择私网接入点,否则选择公网接入点。对于Zipkin,一般情况下请使用v2版接入点,v1版接入点仅限对Zipkin十分了解的高阶用户使用。

背景信息

数据是如何上报的?
  • 不通过Jaeger Agent而直接上报数据的原理如下图所示。不通过Jaeger Agent而直接上报
  • 通过Jaeger Agent上报数据的原理如下图所示。通过Jaeger 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');
});