Kapacitor部分节点解释以及使用案例

Kapacitor部分节点解释以及使用案例

前言

  关于kapacitor本人也是一个小白,正在摸索中前进,理解有误请见谅并指正。这也是本人第一次写文章,文本格式如有问题还请海涵。
  之所以写这篇文章,主要是因为influxdata的官网在各个kapacitor节点的说明和节点组合会产生什么效果所言甚少。

示例用influxdb结构

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
.........

STREAM案例

  将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. 我在项目中使用的模式是字符串替换,所以出上面的代码含有$单词都是要渲染的,请按需替换。
  2. yml脚本冒号后面必须由空格;
  3. 目前tick脚本貌似还不支持复杂结构的yml;

解释

  1. from节点的where方法,表示符合lambda条件的数据才会进入此脚本;
  2. groupBy节点单独使用时和from节点的groupBy方法类似,表示按照列举出发字段进行排序,允许使用groupBy(*)形式表示按照标准时间线分组,建议无特殊需求按 * 号书写(不能用双引号,如|groupBy(’*’),这是不对的);
  3. spread是一个 influxQL节点,在STREAM脚本中,表示对当前脚本的数据管道中所有的数据进行函数计算,一般配合window节点,表示计算窗口期period内的数据,向管道追加和节点名称相同的字段(使用as方法则为as指定的名称);
  4. sideload表示到指定文件夹下加载一个yml文件,source方法指明yml所在文件夹路径,order表示具体yml文件路径(source+order的路径即文件完整路径,具体如何分段按需求来),order方法内允许使用{.tag}的形式,动态指定文件名称;field和tag方法表示你需要从yml加载什么字段,并设定默认值,当没有找到文件的时候或者文件没有指定的字段时,将会追加默认值;

那么坑来了
我第一次写的脚本不是这样的,以下是脚本进化历程:
脚本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')
  1. 第一个脚本推出的告警是没有按照时间线分组计算的,所以同一时刻如果有告警,就只会有1条;
  2. 第二个脚本也一样,而且输出除了spread(函数名相同的,其他InfluxdbQL节点一样如此)则不再带有任何原始信息;
  3. 第三个脚本也只会输出一个结果,原始信息到还在;
  4. 脚本N。。。

  试了N多的脚本猜得出这个最终结果,就是一开始示例里面的脚本,只有这可以按照预期在每个周期做出每个时间线一个告警推出;

总结

  1. 单独的influxQL节点不与groupBy节点 直接相连的,会将当前脚本管道里的所有数据一并计算(不分组),并且在计算后,管道中再不会有原始的tag和field;
  2. from节点的groupBy方法不会对后面的influxQL节点、lambda表达式里面的函数造成任何分组作用;
  3. sideload节点必须放在 groupBy节点和influxQL节点的组合的后面,否则sideload加载的附加信息会丢失,(没有实验所以不知道是这两个的那个节点导致的还是他们一起造成的);

后记

  sideload节点在windows下有bug,你不管怎么写,kapacitor都不会认的,都会报错;本人是公司的大佬改了kapacitor的go源码才搞定这个bug。 ==!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值