通过PM2如何统计当前的活跃请求
本篇主要是对@pm2/io实现Metrics的原理解析,至于具体使用方式,请查看上篇基于PM2实现的NodeJS无损发布
PM2 Metrics
Metrics 只是@pm2/io 的一部分功能,用于添加一些自定义指标。共有meter
、histogram
、counter
、gauge
、metric
五种指标。实现的大体原理都是一致的,区别只是每种指标对象的构建方式不一样。以下内容主要以Counter为主进行解析。
Counter
其核心:每个工作进程都创建一个内存对象,来进行统计计数。最终统一收集到PM2主进程进行缓存。在主进程也是以单独进程保存数据。通过上篇的案例,也很清楚的发现这一点。
源码解读
在这里可以简单理解,@pm2/io用于工作进程的统计上报 ,pm2 主进程用于数据的收集存储。
在下面的代码截图展示中,删除了一些判空逻辑和日志代码,以便更清楚的展示核心流程。
@pm2/io 数据统计上报
- 初始化MetricService,并且创建一个Map类型的metrics变量,用于存储每种指标对象。
2. 当业务层面调用counter时,即对Counter的初始化,将创建的对象添加到metrics中,并且返回一个counterInstance。
3. 获取到counterInstance后,通过实例方法进行数据更新。可以看到,Counter本身就是一个简单的计数器。
4. 接下来就是数据的上报,即第一步创建MetricService时的init方法,创建了一个定时器来进行数据的发送。提供了递增、递减以及获取值的方法
疑问:这里的定时器间隔时间为什么设置为990ms,
5. 数据发送,以axm:monitor
为事件名称,通过process.send 进行同步
pm2 数据存储
监听axm:monitor消息,进行存储。如下图,创建了一个clusters_db
的对象,以pm_id为Key, 记录对应进程的数据。 这里就是上篇文章案例,为何从pm2_env.axm_monitor
中获取数据。
pm_id: 进程id, 从0开始进行自增
为何进程单独存储
-
每个进程单独展示,更容易观察及发现问题,对于指标的合并没有需求意义
-
NodeJS进程间不能共享内存,子进程只能通过主进程进行共享,但是涉及到共享需求时,就需要考虑到锁相关的概念,程序更加的复杂
欢迎各位来指正或者评论自己的见解
@pm2/io VS tx2
在使用Metrics 方面, tx2 功能逻辑是和@pm2/io是一致的,在代码层面做了删减。比如用字面量对象代替了Class 创建对象。
库 | Size |
---|---|
@pm/io | 204kb |
tx2 | 12kb |
总结
以上主要对Coounter流程进行解读,其他的指标统计也是一样的流程。其核心就是进程间的IPC通信。那么我们是否可以通过Metrics这种方式来记录其他的数据呢?或者说不使用@pm2/io库,自己业务代码中直接通过Process.send上报一些自定义的数据给pm2呢。
转载自:https://juejin.cn/post/7245558239332925495