Node.js 应用接入 SkyAPM 实现 APAM 侧度量及追踪
2023-11-02 19:06:52
Node.js 应用接入 SkyAPM
如今,微服务架构的广泛使用给应用程序带来了巨大挑战。传统的单体应用程序性能优化手段已不再适用。APM(应用程序性能管理)工具的引入,可以帮助我们轻松地监测和优化微服务架构下的应用程序性能。
本文将带你一步步接入 SkyAPM,一个开源的应用程序性能管理工具,帮助你轻松掌控 Node.js 应用的运行状况。
1. 安装 SkyAPM
首先,你需要在本地机器上为 SkyAPM 做好相关的启动和路径部署。
-
安装 JRE
确保本地已正确,正常地,非容器化地,非 Docker 部署 JRE11+ 环境。
-
安装 SkyAPM
从 SkyAPM 的官网上获取你机器对应的 Java 发行包,并将其解压到一个你易于记忆和访问的目录中(例如:
/opt/skyapm
) -
配置 SkyAPM
复制一份 SkyAPM 根目录中的
config/application.yml
文件,重名为application.yml
,并进行如下基础内容的改写:skyapm.name
:服务实例的唯一名字(不是服务的真实名字)skyapm.token
:用于和 SkyAPM 的 UI 及 Backend 服务的鉴权信息skyapm.storage
:APM 数据存储的方式(本文采用 H2 数据库)skyapm.h2.storage.url
:H2 数据库的连接字符串
完整的
application.yml
配置参考:https://github.com/skyapm/skyapm-java/blob/main/skyapm-sniffer/skyapm-sniffer-core/src/main/deploy/application.yml -
启动 SkyAPM
使用
skyapm/bin/skyapm.sh start
脚本来启动 SkyAPM 组件。
2. SkyAPM 代码接入
-
添加 SkyAPM 关联包
在 Node.js 项目的
package.json
中加入skyapm
关联包:{ "devDependencies": { "skyapm": "3.4.0" } }
-
使用 SkyAPM 进行追踪
在服务启动入口的文件(例如:
app.js
)中,初始化 SkyAPM 组件,并启动追踪中间件:const skyapm = require('skyapm'); const app = express(); const {Tracer, config} = skyapm.start({ // SkyAPM 服务端信息 "profile": { "name": "my-node-app", // 应与 `application.yml` 配置中保持一致 "token": "eyyyyyy", // 应与 `application.yml` 配置中保持一致 } }); app.use( skyapm.tracer.baggageHandler({ // 这个 baggage 用来验证和 header 中传递的 baggage 是否一致 validate: (header, done) => { console.log('in baggage header: %s', header); done(); }, // baggage 加入 header 中进行传递 set: (name, value) => { res.set(name, value); }, }), ); app.use( skyapm.tracer.tracingMiddleware(), );
-
数据采集
上述初始化和启动追踪中间件后,
Tracer
实例将负责:- 记录下入参的
baggage
以便在baggageHandler
中获取 - 拦截异步方法调用,并为其进行追踪和采样
- 记录下调用方法、被调用方法、调用时间、调用堆栈等信息
- 记录下入参的
3. 效果展示
-
仪表盘
skyapm/bin/skyapm.sh dashboard
打开上述 URL 即能查阅接入接接接接接接接接接接接接接入成功的服务
-
调用链路追踪
在仪表盘 Service Map 页面中,你可以查阅服务之间的调用链路,该链路会展示调用服务的耗时、调用堆栈等数据,帮助你优化服务性能。
-
点击仪表盘中 Service Map 中目标服务
-
筛选和定位目标调用链路
-
-
跟查指标和报警
接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接