关于kapacitor本人也是一个小白,正在摸索中前进,理解有误请见谅并指正。这也是本人第一次写文章,文本格式如有问题还请海涵。
之所以写这篇文章,主要是因为influxdata的官网在各个kapacitor节点的说明和节点组合会产生什么效果所言甚少。
INSERT cpu,host=serverA,port=8080,region=us_west value=0.64
INSERT cpu,host=serverA,port=8081,region=us_west value=0.58
INSERT cpu,host=serverB,port=8081,region=us_noth value=0.72
INSERT cpu,host=serverB,port=8082,region=us_noth value=0.12
.........
将15分钟内serverB的数据缓存入窗口,每5分钟窗口将当前所存的数据发送出去,按时间线进行分组计算减差值,读取server.yml,判断每个时间线(如服务器A的8080端口,region为west)减差值spread是否大于yml设定值,如果是则alert。要求alert带有关键的原始数据。
脚本 server.tick:
dbrp "$db"."$rp"
stream
|from()
.database('$db')
.retentionPolicy('$rp')
.measurement('monitoringDataHistory')
.where(lambda: "host"=='serverB')
|window()
.period(15m)
.every(5m)
|groupBy(*)
|spread('value')
|sideload()
.source('file:///$dest/yml')
.order('{{.server}}.yml')
.field('data_abnormity', 10.0)
|alert()
.warn(lambda: "spread" > "data_abnormity")
.log('E:/kapacitor-1.5.3-1/alert.log')
.post('http://127.0.0.1:8090/seem/kapacitor/receivealert')
serverA.yml:
data_abnormity: 0.2
注意:
那么坑来了
我第一次写的脚本不是这样的,以下是脚本进化历程:
脚本1
dbrp "$db"."$rp"
stream
|from()
.database('$db')
.retentionPolicy('$rp')
.measurement('monitoringDataHistory')
.where(lambda: "host"=='serverB')
|sideload()
.source('file:///$dest/yml')
.order('{{.server}}.yml')
.field('data_abnormity', 10.0)
|window()
.period(15m)
.every(5m)
|alert()
.warn(lambda: spread("value") > "data_abnormity")
.log('E:/kapacitor-1.5.3-1/alert.log')
.post('http://127.0.0.1:8090/seem/kapacitor/receivealert')
脚本2
dbrp "$db"."$rp"
stream
|from()
.database('$db')
.retentionPolicy('$rp')
.measurement('monitoringDataHistory')
.where(lambda: "host"=='serverB')
|sideload()
.source('file:///$dest/yml')
.order('{{.server}}.yml')
.field('data_abnormity', 10.0)
|window()
.period(15m)
.every(5m)
|spread('value')
|alert()
.warn(lambda: "spread"> "data_abnormity")
.log('E:/kapacitor-1.5.3-1/alert.log')
.post('http://127.0.0.1:8090/seem/kapacitor/receivealert')
脚本3
dbrp "$db"."$rp"
stream
|from()
.database('$db')
.retentionPolicy('$rp')
.measurement('monitoringDataHistory')
.where(lambda: "host"=='serverB')
|sideload()
.source('file:///$dest/yml')
.order('{{.server}}.yml')
.field('data_abnormity', 10.0)
|window()
.period(15m)
.every(5m)
|groupBy(*)
|alert()
.warn(lambda: spread("value")> "data_abnormity")
.log('E:/kapacitor-1.5.3-1/alert.log')
.post('http://127.0.0.1:8090/seem/kapacitor/receivealert')
试了N多的脚本猜得出这个最终结果,就是一开始示例里面的脚本,只有这可以按照预期在每个周期做出每个时间线一个告警推出;
直接
相连的,会将当前脚本管道里的所有数据一并计算(不分组),并且在计算后,管道中再不会有原始的tag和field;sideload节点在windows下有bug,你不管怎么写,kapacitor都不会认的,都会报错;本人是公司的大佬改了kapacitor的go源码才搞定这个bug。 ==!