在 Node.js 性能平台的监控设置中,有两项表达式需要用户进行输入,阈值表达式和报警表达式。
监控系统会根据阈值表达式来进行是否进行报警的判定。当判定完成,决定发送警报时,会使用报警表达式来描述警报的详情。
阈值表达式是由 Node.js 性能平台定义的一个报警判定DSL,处于灵活性和安全的考虑,我们定义了有限的表达方式。
每个应用的开发者可以输入一个阈值表达式,该表达式会被编译为一个等价的JavaScript函数。当监控系统收到当前类型的监控数据时,会将监控数据作为上下文,代入阈值表达式,如果表达式结果为true
,则判定需要发送警报。
一个基本的表达式由三个部分组成:属性、比较操作符、字面量。
属性标识是指上下文对象的属性表示方式,形式为:@xxx
,以@
开头接一个属性名。例如:@load1
、@cpu
、@freemem
。
比较操作符跟普通的编程语言里的符号完全相同:==
、>=
、>
、<=
、<
、!=
。
支持+
、-
、*
、/
、%
运算符,如:@heap_used / @heap_limit
。
字面量是指基本的数值类型和字符串类型。一个基本的表达式类似这样:@load1 > 5
。
include关键字用于属性值中是否包含某个字符串。如:@message include "TypeError"
。
其他的操作符有&&
、||
以及()
。与普通编程语言表达意思相同。如:
@cpu > 0.10 || @load1 > 5
@cpu > 0.10 && @load1 > 5
@cpu > 0.10 && (@load1 > 5 && @load5 > 5)
报警表达式类似于阈值表达式,但是并不用来做判定,更类似于模版语言。以下为简单例子:
I am ${@name}. I am ${@age} years old.
其格式主要由2个部分组成,${}
之外的字符串和${}
内部的表达式。假设有上下文:
{name: "Jackson Tian", age: 18}
那么最终的执行结果就是:
I am Jackson Tian. I am 18 years old.
如果有一个报警的上下文是:
{load1: 5, load5: 2, load15: 2.2}
报警表达式为:
Load1较高,高于3,为${load1},请排查。
那么结果就是:Load1较高,高于3,为5,请排查。
${}内部支持@xxx
属性的方式、简单的+-*%/
以及数值和字符串。
比如内存使用的占比表达如下:
内存占用过高,为${@freemem / @total * 100}%。
每一种监控类型的上下文并不相同。
node_log类型的数据为某个进程的内核数据。
注:V8所申请的内存堆被分配为多个内存空间。
Node v4.0之前的版本还有以下四个空间:
上述4个空间在v4.0之后合并为old_space。
例如判断是否发生内存泄漏,可以配置表达式:@heap_used / @heap_limit > 0.8
。报警表达式为:夭寿啦,估计内存泄漏了,堆上限${@heap_limit},已使用${@heap_used}
。
注意:上述4个数据的值的单位为core,表示占用几个核的CPU。如:0.25。表示占用0.25个核。该数值除以CPU核数,即为占整体的CPU的百分比。
异常日志数据。
例如判断是否发生uncaughtException
,可以在Node中捕获:
process.on('uncaughtException', function(err) {
err.name = "UncaughtExceptionError";
console.log('Caught exception: ' + err);
});
然后配置监控表达式:@type include 'UncaughtExceptionError'
。报警表达式为:夭寿啦,发生UncaughtExceptionError啦,堆栈是:${@stack}
。
进程数量数据。
如果进程数量平常为5个,那么低于5个进程数量就属于不正常。所以可以这样配置监控表达式:@node_count < 5
,报警表达式:Node进程数${@node_count}低于5,请注意
。
版本号数据。
如果对表达式和属性有不清楚的地方,可以咨询钉钉群:11794270 来联系我们。
在文档使用中是否遇到以下问题
更多建议
匿名提交