通过 OpenTelemetry-JS 方案接入 Node.js 应用

最近更新时间: 2026-06-30 15:06:00

说明:

  • OpenTelemetry 是工具、API 和 SDK 的集合,用来检测、生成、收集和导出遥测数据(指标、日志和跟踪),帮助用户分析软件的性能和行为。关于 OpenTelemetry 的更多信息请参考 OpenTelemetry 官方网站
  • OpenTelemetry 社区活跃,技术更迭迅速,广泛兼容主流编程语言、组件与框架,为云原生微服务以及容器架构的链路追踪能力广受欢迎。

本文将通过相关操作介绍如何通过 OpenTelemetry-JS 方案接入 Node.js 应用。
OpenTelemetry-JS 方案对于 Node.js 系的常用模块和框架,包括 Express、mysql、gRPC 等,提供了自动埋点,在不需要修改代码的情况下就能实现链路信息的上报。其他支持自动埋点的模块和框架请参考 OpenTelemetry 社区提供的 完整列表

示例 Demo

示例代码 main.js 通过 Express 提供3个 HTTP 接口,对应的 MySQL 和 Redis® 服务请自行搭建,或直接创建云产品实例。

"use strict";

const axios = require("axios").default;
const express = require("express");
const redis = require('./utils/redis');
const dbHelper = require("./utils/db"); 
const app = express();

app.get("/remoteInvoke", async (req, res) => {
  const result = await axios.get("http://cloud.example.com");
  return res.status(200).send(result.data);
});

app.get("/redis", async(req, res) => {
  let queryRes = await redis.getKey("foo")
  res.json({ code: 200, result: queryRes})
})

app.get("/mysql", async(req, res) => {
  let select = `select * from table_demo`;
  await dbHelper.query(select);
  res.json({ code: 200, result: "mysql op ended"})
})

app.use(express.json());

app.listen(8080, () => {
  console.log("Listening on http://localhost:8080");
});

前置步骤:获取接入点和 Token

  1. 在左侧菜单栏中选择应用性能监控 > 应用监控,单击应用列表 > 接入应用
  2. 在右侧弹出的数据接入抽屉框中,单击 Node 语言。
  3. 接入 Node 应用页面,选择您所要接入的地域以及业务系统
  4. 选择接入协议类型OpenTelemetry
  5. 获取您的接入点Token

接入 Node.js 应用

步骤1:安装所需的依赖包

npm install --save @opentelemetry/api
npm install --save @opentelemetry/auto-instrumentations-node

步骤2:添加运行参数

通过如下命令启动 Node.js 应用:

export OTEL_TRACES_EXPORTER="otlp" 
export OTEL_RESOURCE_ATTRIBUTES='token=<token>,hostName=<hostName>' 
export OTEL_EXPORTER_OTLP_PROTOCOL='grpc' 
export OTEL_EXPORTER_OTLP_TRACES_ENDPOINT="<endpoint>" 
export OTEL_SERVICE_NAME="<serviceName>"  
export NODE_OPTIONS="--require @opentelemetry/auto-instrumentations-node/register" 
node main.js

对应的字段说明如下:

  • <serviceName> :应用名,多个使用相同 serviceName 接入的应用进程,在 APM 中会表现为相同应用下的多个实例。应用名最长63个字符,只能包含小写字母、数字及分隔符“ - ”,且必须以小写字母开头,数字或小写字母结尾。
  • <token> :前置步骤中拿到业务系统 Token。
  • <hostName>:该实例的主机名,是应用实例的唯一标识,通常情况下可以设置为应用实例的 IP 地址。
  • <endpoint> :前置步骤中拿到的接入点。
    下述内容以应用名为 myService,业务系统 Token 为 myToken,主机名为 192.168.0.10,接入点以 http://pl-demo.ap-*${Region}*.apm.tencentcs.com:4317为例,完整的启动命令为:
export OTEL_TRACES_EXPORTER="otlp" 
export OTEL_RESOURCE_ATTRIBUTES='token=myToken,hostName=192.168.0.10' 
export OTEL_EXPORTER_OTLP_PROTOCOL='grpc' 
export OTEL_EXPORTER_OTLP_TRACES_ENDPOINT="http://pl-demo.ap-${Region}.apm.tencentcs.com:4317" 
export OTEL_SERVICE_NAME="myService"  
export NODE_OPTIONS="--require @opentelemetry/auto-instrumentations-node/register" 
node main.js

接入验证

启动 Node.js 应用后,通过8080端口访问对应的接口,例如 https://localhost:8080/。在有正常流量的情况下,应用性能监控 > 应用监控 > 应用列表 中将展示接入的应用,应用性能监控 > 应用监控 > 应用详情 > 实例监控中将展示接入的应用实例。由于可观测数据的处理存在一定延时,如果接入后在控制台没有查询到应用或实例,请等待30秒左右。

自定义埋点(可选)

当自动埋点不满足您的场景或者需要增加业务层埋点时,您可参照下述内容,使用 OpenTelemetry API 添加自定义埋点。本文仅展示最基本的自定义埋点方式,OpenTelemetry 社区提供了更多灵活的自定义埋点方式,具体使用方法可参考 OpenTelemetry 社区提供的 Javascript 自定义埋点文档

const opentelemetry = require("@opentelemetry/api")

app.get("/attr", async(req, res) => {
  const tracer = opentelemetry.trace.getTracer(
    'my-service-tracer'
  );
  tracer.startActiveSpan('new internal span', span => {
    span.addEvent("Acquiring lock", {
      'log.severity':'error',
      'log.message':'data node found',
    })
    span.addEvent("Got lock, doing work...", {
      'log.severity':'11111',
      'log.message':'2222222',
      'log.message1':'3333333',
    })
    span.addEvent("Unlocking")
    span.end();
  });
  res.json({ code: 200, msg: "success" });
})