在上一篇[《[云监控]AE3-Script AE3脚本引擎》](https://ata.alibaba-inc.com/articles/217887)中介绍了AE3-Script的基本特性。本篇将继续介绍该脚本的一些更加深入的用法。
一、动态算术运算
AE3-Script是一种动态类型的语言,字符串(string)、数值(number)和布尔值(bool)都可以进行数学运算。运算时字符串和布尔值将会被转化为数值。如下面的表达式:
"100" + 50 + true;
// Output: 151
true + false;
// Output: 1
true + true
// Output: 2
具体转换规则如下:
类型 | 转换后 |
---|---|
字符串(string) | 按十进制文本进行转换 |
布尔 true
|
1 |
布尔 false
|
0 |
数学运算的最终结果为数值。
二、动态算术比较运算
当进行比较运算时,如果比较的双方是同类型,且具有可比性,则直接进行比较。如
"A" > "B";
// Output: false
true == true;
// Output: true
true != true
// Output: false
而当双方不是相同类型,或不具可比性时,比较的双方会先转换成数值,再进行比较。如
true > false
// Output: true
根据上一节的转换规则,true为1,false为0,则比较的结果为true。再如:
1 == true
// Output: true
避坑提示 字符串'true'
或'false'
转换数值时将失败,而不是转为布尔值的true
或false
。
'true' == true
将会产生运行时错误:
invalid operation: string == bool (1:8)
| "true" == true
| ............^
比较运算的最终结果为布尔型。
三、赋值
之前介绍了变量,但主要目的是为了引入metric数据的表达。事实上,变量是可以在AE3-Script中被主动创建的。AE3-Script是动态类型语言,变量本身没有类型,被赋值成什么类型,变量就会成为什么类型。变量可以被重复赋值,且可以被赋予不同类型的值。变量必须先赋值后使用,且区分大小写。
A := 100;
// 此时变量A为数值类型
A := 'hello'
// A又成为了字符串类型
当一段代码中需要重复进行计算时,可以先把计算的结果放入变量中。
preValue := LastPeriod(@cpu_total[60]).$Average;
(@cpu_total[60].$Average - preValue) * 100 / preValue
这个是典型的同比计算,计算时需要使用上一周期的$Average
值两次,通过中间变量preValue
有效增强最可读性,同时提升了运行效率。
友情提示 像Java、C++一样,如果是多条语句的话,每条后面一定要有一个英文分号;
。最后一条语句,或单条语句则对分号不做强制要求。
四、字符串
算术和比较运算可以将符串转为数值。相反的,在AE3-Script中也可以将两个非字符串转换为字符串。
4.1 字符相加运算符#
不管#
两边是什么类型,#
会先两将两侧转换为字符串再进行字符串相加操作。
userId := 2
'acs_custom_' # userId;
// Output: acs_custom_2
true # ' ' # 'name'
// Output: true name
4.2 join函数
join
函数是一个内置函数,其原型为join(sep string, args...)
,其中args可以是一个slice,也可以是变长参数。该函数返回以sep
连接的字符串。
join(' ', "My name is", 20);
// Output: My name is 20
list := [1, 2, 3];
join(', ', list)
// Output: 1, 2, 3
五、最佳实践
目前云监控新版控制台已上线多指标报警规则,欢迎体验。
5. 1 创建简单的多指标规则
在创建报警规则界面,通过若干步鼠标点击,可以迅速创建出简单的多指标规则。如下图:
上图创建的规则需要『两个指标同时符合条件』才会报警。等同于如下表达式
@cpu_total[60].$Average >= 80 && @load_1m[60].$Average >= 5
对于初接触云监控,对指标不甚了解的人员,可以通过简单的界面点击,迅速建立一个满足80%应用需求的报警规则。
5.2 复杂的多指标规则
当条件比较复杂时,简单的界面就无法满足要求了,此时可以使用『表达式创建』。比如有三个指标,当其中的两个满足条件时就报警:
表达式:
A := @cpu_total[60].$Average > 80;
B := @load_1m[60].$Average >= 4;
C := @memory_usedutilization[60].$Average > 90;
A + B + C >= 2
目前界面还有一些小瑕疵,无法进行多行编辑。以上四句写在一行也是OK的,只不过可读性上稍微差些。