alinode官方地址:https://help.aliyun.com/product/60298.html?spm=a2c4g.60418.0.0.710343961QetaC
介绍
阿里官方提供的nodejs性能平台面向所有 Node.js 应用,提供 性能监控、安全提醒、故障排查、性能优化 等服务的整体性解决方案,尤其适合业务发展迅速、应用发布频繁、流量上升明显的 Node.js 应用。
Node.js 性能平台特别适合业务发展迅速、应用发布频繁、流量上升明显的 Node.js 应用。
平台全部功能免费使用
Node.js性能平台使用指南
使用
创建应用
- 登录阿里云官网 https://www.aliyun.com/。
- 前往 Node.js性能平台控制台
创建新应用输入应用名,记录下App ID和App Secret,后面可以从应用界面的设置中查看该设置。
服务器部署 Node.js 性能平台
安装 Node.js 性能平台所需组件
版本管理工具 tnvm github地址:https://github.com/aliyun-node/tnvm
问题记录:
- 官方提供了多种平台安装方式,alpine/centos等,但我在Debian环境下测试遇到了问题
但我在Debian环境下测试遇到了问题
在Debian系统中,默认的shell是dash shell,而不是Bash shell。因此,如果在Debian系统中使用
source命令而没有指定shell类型,它将默认使用dash shell,而不是Bash shell。这可能导致脚本无法正确执行或产生错误。因此,需要在Debian系统中使用source命令时指定Bash shell类型,即使用/bin/bash -c "source xxx"的方式。在CentOS系统中,默认的shell是Bash shell,因此可以直接使用
source命令来执行脚本文件。
- 采集性能指标数据出现调用错误等问题
官方也没给出回答,但是目前发现在节点资源比较吃紧的时候,采集性能指标会出现问题
- 服务器无法访问外网环境
可以将
https://raw.githubusercontent.com/aliyun-node/tnvm/master/install.sh脚本文件下载至本地,然后使用git方式下载tnvm资源,修改脚本文件中的NVM_SOURCE_URL,如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 tnvm_source() {
local NVM_METHOD
NVM_METHOD="$1"
local NVM_SOURCE_URL
NVM_SOURCE_URL="$NVM_SOURCE"
if [ -z "$NVM_SOURCE_URL" ]; then
if [ "_$NVM_METHOD" = "_script" ]; then
# 修改git地址为国内网络环境允许的位置
NVM_SOURCE_URL="https://gitee.com/xiaowu_wang/tnvm/raw/master/tnvm.sh"
elif [ "_$NVM_METHOD" = "_git" ] || [ -z "$NVM_METHOD" ]; then
# 修改git地址为国内网络环境允许的位置
NVM_SOURCE_URL="https://gitee.com/xiaowu_wang/tnvm.git"
else
echo >&2 "Unexpected value \"$NVM_METHOD\" for \$NVM_METHOD"
return 1
fi
fi
echo "$NVM_SOURCE_URL"
}
- agenthub未启动成功
- 确保启动时是配置了
ENABLE_NODE_LOG=YES的- 使用
agenthub list检查列表中服务是否成功启动- 使用debug的方式启动agenthub
DEBUG=* agenthub start yourconfig.json,检查~/.agenthub.log日志文件是否正常- 确保
which pm2或which nope等which指令显示的路径,是包含了.tnvm的- 确保在平台上检查进程当中,这些都是打了勾的
- 其他问题
参考:https://help.aliyun.com/document_detail/60418.html?spm=a2c4g.60418.0.0.16e51a2en0PAf1
alinode.config.json
配置中可以使用
#YYYY#、#MM#、#DD#、#HH#这类通配符数组字段都可以指定多个值
1 | { |
完整Dockerfile
1 | FROM centos:centos7.9.2009 |
docker build -f Dockerfile -t ${REGISTRY_ADDRESS}/${IMAGE} .
K8S环境下的处理
为了使平台能有充足的时间去进行一些profile分析或者堆栈快照处理,可以将
livenessProbe的失败时间或者次数设置的大一些,或者完全将将健康检查完全关闭,当问题找到后再还原
处理多个副本
官方未直接给出k8s环境下的使用样例,但针对一台服务器多实例给的建议是创建不同的应用:https://help.aliyun.com/document_detail/60418.html?spm=a2c4g.60317.0.0.7ecb4fa7oVzKAn#h2-u5982u4F55u5904u7406u4E00u53F0u670Du52A1u5668u90E8u7F72u591Au4E2Au5E94u75287
单个副本的情况
因为平台是将pod的hostname作为实例名称的,而k8s默认为pod名附上一个随机后缀,并将其作为hostname
但如果针对一个副本,我们完全可以为其指定hostname(同时为了防止有其他地方使用到hostname,我们将podname赋值给环境变量POD_NAME),这样就避免了实例过多问题
1 | apiVersion: apps/v1 |
Trace 链路追踪
使用 @alicloud/opentracing 埋点
安装
1 | npm install @alicloud/opentracing |
使用
公共类:Tracer(name[, option][, reporter])
参数:
- name String - tracer 的名称
- option Object - 可选
- limit Number - 每分钟限制记录落盘的数据条数限制,防止大量异常的情况下大量日志写入文件造成磁盘溢出
- logger Object - 日志句柄,最小需要实现 info、log、warn 和 error 方法,默认采用 console
- reporter Object - 自定义发送方法,需要实现 report 方法,入参为 span
成员方法:startSpan(spanName[, option])
- spanName String - span 的名称,用来标记此 span 下的异步调用
- option Object - 可选
- childOf Object - 传入当前 span 的父级 span 实例
- 返回值 Object - 返回内置的类 Span 的实例
内置类:Span
成员方法:setTag(tag, value)
- tag String - Tag 名称,可以自定义,一般从 opentracing.Tags 中获取(里面定义了常见的 host、url、statusCode 等链路信息 Key)
- value String - Tag 名称对应的值
成员方法:log(key, value)
- key String - 自定义的日志键
- value String - 自定义的日志值
成员方法:finish(req)
- req Object - http 请求的 request 对象
koa代码整合样例
1 | import opentracing from '@alicloud/opentracing'; |
在浏览器请求 http://localhost:3000/delay, 等待约 1min 后,可以在控制台的相应 Tab 页看到:

点击 请求信息 栏下面对应的字符串或者长条可以看到开发者自行记录的当前请求详情,比如例子中在随机延迟中分别用 tag 和 log 记录了当前延迟 ms 数和定时器名称,那么点开 子模块1 对应的请求信息栏中的长条后可以看到如下内容:

关于Node.js 性能平台运行时是否会影响性能
来自官方回答
- Node.js 性能平台运行时每分钟在主线程将监控数据写到内存中,通过额外的日志线程写日志到文件,因此对性能影响可以忽略。
- 做故障诊断时,执行诊断功能 3 分钟,随后自动切回到正常运行状态。