通过Jaeger上报Node.js应用数据

通过Jaeger为应用埋点并上报链路数据至可观测链路 OpenTelemetry 版后,可观测链路 OpenTelemetry 版即可开始监控应用,您可以查看应用拓扑、调用链路、异常事务、慢事务和SQL分析等一系列监控数据。本文介绍如何使用Jaeger客户端埋点并上报Node.js应用数据。

重要

为获得更丰富的功能、更先进的链路追踪能力,以及最佳使用体验,建议您使用OpenTelemetry协议将应用接入可观测链路 OpenTelemetry 版

我们为您提供了详细的OpenTelemetry接入指南和最佳实践,帮助您快速上手可观测链路 OpenTelemetry 版。更多信息,请参见接入应用

前提条件

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

    "dependencies": {
        "jaeger-client": "^3.12.0"
      }
  • 获取接入点信息

    新版控制台

    1. 登录可观测链路 OpenTelemetry 版控制台,在左侧导航栏单击接入中心

    2. 开源框架区域单击Jaeger卡片。

    3. 在弹出的Jaeger面板中选择数据需要上报的地域。

      说明

      初次接入的地域将会自动进行资源初始化。

    4. 选择连接方式上报方式,然后复制接入点信息。

      • 连接方式:若您的服务部署在阿里云上,且所属地域与选择的接入地域一致,推荐使用阿里云内网方式,否则选择公网方式。

      • 上报方式:根据客户端支持的协议类型选择HTTP或gRPC协议上报数据。

      image

    旧版控制台

    1. 登录可观测链路 OpenTelemetry 版控制台

    2. 在左侧导航栏单击集群配置,然后在右侧页面单击接入点信息页签。

    3. 在页面顶部选择需要接入的地域,然后在集群信息区域打开显示Token开关。

    4. 客户端采集工具区域单击Jaeger

      相关信息列中,获取接入点信息。jager中国.jpg

      说明

      如果应用部署于阿里云生产环境,则选择阿里云VPC网络接入点,否则选择公网接入点。

背景信息

数据是如何上报的?

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

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

    image

操作步骤

  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. 登录可观测链路 OpenTelemetry 版控制台并查看调用链。

基于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');
});