easy-monitor源码分析

2021-03-18  本文已影响0人  RiverSouthMan

前言

笔者之前有使用轻量级的easy-monitor2.0对项目进行内存泄漏的排查;

本文主要是对2.0版本的源码学习和笔记整理。目的是为了个人的技术提升,想去了解一个nodejs监控的整体实现。如果哪里有理解不对的地方欢迎读者指出。

本文底部会有原作者在cnode原文章的链接;

整体架构

这里引用一下原文中的架构图


image.png

整体上分为了三个模块:

下面从源码层面对各模块进行分析;

初始化

这个库对外暴露的是一个方法。

'use strict';
const easyMonitor = require('easy-monitor');
easyMonitor('Mercury');
const express = require('express');
const app = express();

app.get('/hello', function (req, res, next) {
    res.send('hello');
});

app.listen(8082);

入口文件index.js引入根目录的dispatch.js

dispatch.png

这个文件主要做了以下工作:

//获取基础配置, pre 表示预先加载的文件,params 表示对应的参数
const common = _common({ pre: ['config', 'logger', 'utils', 'cache'], param: { config: options } });
yield common.utils.commonInitP(common);
function (common, config, logger, utils, cache) { ... }
//非 cluster 模式下,embrace 嵌入业务进程,dashboard 以 fork 形式启动
embrace.start(config, common);
common.utils.forkNode(path.join(rootPath, 'dashboard/_fork.js'), [JSON.stringify(options)]);

关于RPC

这里插入一下RPC的概念,方便理解下面的embracedashboard之间的通信

这里引用一段网络上的解释:原文
RPC (Remote Procedure Call:远程过程调用):一种进程间通信方式。允许像调用本地服务一样调用远程服务

RPC架构:
包含四个核心组件

image.png

其实源码中embrace模块对应的就是Clientdashboard模块对应的就是Server,基于TCP链接实现的通信;

embrace模块

embrace模块暴露出的start方法将上文中初始化后完整的config对象和common对象作为了参数传入;

embrace.png

这里主要进行的工作是:

//获取 embrace 的 dispatch 信息
const dispatch = _require('embrace/dispatch');
const controller = dispatch.controller(config, common, dbl);
//启动 tcp 客户端
const tcpClient = dispatch.tcp;
tcpClient.apply({ controller }, [config, common, dbl]);

embrace/dispatch模块

上文中引入的embrace/dispatch模块对外暴露了上文中用到的两个方法

//和服务器建立链接
const client = new net.Socket();
client.connect(config.embrace.tcp_port, config.embrace.tcp_host, _callbackListener);
//处理 tcp 数据
client.on('data', socketUtils.onData.bind(ctx, client));

这里的socketUtils.onDatacommon/common.scoket.js模块中暴露出的方法,目的是为了统一处理tcp句柄中的 data 事件;
dashboard模块中创建的tcp服务端的回调函数中会再次用到该方法;目的是对相同格式的消息数据格式统一处理;

dashboard模块

dashboard模块初始化和启动的逻辑与embrace模块异曲同工,稍有不同的是区分为了两部分:

overview

这里以overview为例子走一遍完整的流程

首页

image.png

overview页面:此页面可以看到服务器的 CPU 使用率,以及被选中进程的 Memory 占用情况,其中内存占用展示了三类:

image.png

整个过程笔者使用了一个简易的流程图来示意;(如果不容易理解,请还参考原作者的架构图)


image.png

上述过程在web端是启动了setInterval定时器每一秒中请求一次,而且在客户端每一次都将上一次的数据做了缓存,绘制出了实时的折线图效果

具体获取cpumem数据是通过下面的方法:

//获取本进程的 cpu 使用率和 memory 占用信息
const memoryUsage = common.overview.computeMemoryUsage();
const cpuUsage = common.overview.computeCpuUsage();

computeMemoryUsage的计算方法比较直接:process_memoryusage

mem.png

computeMemoryUsage使用到的Nodejs API:os_cpus并进行了简单计算

cpu.png

CPU 数据采集分析函数运算瓶颈

image.png

这个功能是对CPU-Profiling,然后进行分析,展示结果包含:

感谢大佬的开源精神
easy-monitor作者原文链接
easy-monitor3.0已经发布。

上一篇 下一篇

猜你喜欢

热点阅读