likes
comments
collection
share

通过PM2如何统计当前的活跃请求

作者站长头像
站长
· 阅读数 14

本篇主要是对@pm2/io实现Metrics的原理解析,至于具体使用方式,请查看上篇基于PM2实现的NodeJS无损发布

PM2 Metrics

Metrics 只是@pm2/io 的一部分功能,用于添加一些自定义指标。共有meterhistogramcountergaugemetric五种指标。实现的大体原理都是一致的,区别只是每种指标对象的构建方式不一样。以下内容主要以Counter为主进行解析。

Counter

其核心:每个工作进程都创建一个内存对象,来进行统计计数。最终统一收集到PM2主进程进行缓存。在主进程也是以单独进程保存数据。通过上篇的案例,也很清楚的发现这一点。

通过PM2如何统计当前的活跃请求

源码解读

在这里可以简单理解,@pm2/io用于工作进程的统计上报 ,pm2 主进程用于数据的收集存储。

在下面的代码截图展示中,删除了一些判空逻辑和日志代码,以便更清楚的展示核心流程。

@pm2/io 数据统计上报

  1. 初始化MetricService,并且创建一个Map类型的metrics变量,用于存储每种指标对象。

通过PM2如何统计当前的活跃请求 2. 当业务层面调用counter时,即对Counter的初始化,将创建的对象添加到metrics中,并且返回一个counterInstance。

通过PM2如何统计当前的活跃请求 3. 获取到counterInstance后,通过实例方法进行数据更新。可以看到,Counter本身就是一个简单的计数器。

通过PM2如何统计当前的活跃请求 4. 接下来就是数据的上报,即第一步创建MetricService时的init方法,创建了一个定时器来进行数据的发送。提供了递增、递减以及获取值的方法

通过PM2如何统计当前的活跃请求

疑问:这里的定时器间隔时间为什么设置为990ms, 5. 数据发送,以axm:monitor为事件名称,通过process.send 进行同步

通过PM2如何统计当前的活跃请求

pm2 数据存储

监听axm:monitor消息,进行存储。如下图,创建了一个clusters_db的对象,以pm_id为Key, 记录对应进程的数据。 这里就是上篇文章案例,为何从pm2_env.axm_monitor中获取数据。

通过PM2如何统计当前的活跃请求 pm_id: 进程id, 从0开始进行自增

为何进程单独存储

  1. 每个进程单独展示,更容易观察及发现问题,对于指标的合并没有需求意义

  2. NodeJS进程间不能共享内存,子进程只能通过主进程进行共享,但是涉及到共享需求时,就需要考虑到锁相关的概念,程序更加的复杂

    欢迎各位来指正或者评论自己的见解

@pm2/io VS tx2

在使用Metrics 方面, tx2 功能逻辑是和@pm2/io是一致的,在代码层面做了删减。比如用字面量对象代替了Class 创建对象。

Size
@pm/io204kb
tx212kb

总结

以上主要对Coounter流程进行解读,其他的指标统计也是一样的流程。其核心就是进程间的IPC通信。那么我们是否可以通过Metrics这种方式来记录其他的数据呢?或者说不使用@pm2/io库,自己业务代码中直接通过Process.send上报一些自定义的数据给pm2呢。