我正在尝试将 Kapacitor 与我们的 influxdb 和 collectd 设置集成。但是,它似乎不起作用,我不明白为什么。
Collectd 和 Influxdb 运行正常,我认为 Kapacitor 能够连接到 influxdb。在 kapacitor 日志中我看到以下内容:
[influxdb] 2016/04/22 09:46:42 I! started UDP listener for collectd_db default
这是 collectd 记录指标的 influxdb 数据库的名称。
我创建了以下 tick 文件,并将其上传到 kapacitor 并启用它:
stream
.from().measurement('cpu_value')
.where(lambda: "type" == "percent")
.where(lambda: "type_instance" == "idle")
.alert()
.crit(lambda: "value" < 100)
// Whenever we get an alert write it to a file.
.log('/tmp/alerts.log')
这只是一个测试脚本,希望能够产生一些输出。
脚本已启用:
Name Type Enabled Executing Databases and Retention Policies
cpu_tick stream true true ["collectd_db"."default"]
但是,我没有看到任何记录:
[centos@ip-xx-xx-xx-xx tmp]$ kapacitor list recordings
ID Type Size Created
“cpu_value” 是我的数据库中的有效测量值。
这是我在错误日志中得到的内容:
[cpu_alert:stream1] 2016/04/28 13:00:51 E! error while evaluating WHERE expression: name "percent" is undefined. Names in scope: time,value,host,instance,type,type_instance
答案1
Kapacitor 的作者在这里...
在 Kapacitor lambda 表达式中,单引号和双引号具有不同的含义。
- 单引号表示字符串文字
- 双引号是对数据中字段或标签的引用。
此表达式.where(lambda: "type" == "percent")
表示仅保留type
字段或标签值等于percent
字段或标签值的数据点。根据错误
[cpu_alert:stream1] 2016/04/28 13:00:51 E!评估 WHERE 表达式时出错:名称“percent”未定义。范围内的名称:time、value、host、instance、type、type_instance
该percent
字段或标签不存在。
如果要筛选类型值等于percent
文字的点,则需要使用单引号。
.where(lambda: "type" == 'percent')
您的下一个表达可能也同样如此。
.where(lambda: "type_instance" == 'idle')
AND
如果你愿意,你也可以一起表达
.where(lambda: "type" == 'percent' AND "type_instance" == 'idle')
当 Kapacitor 发现多个where
相邻的语句时,它会在后台将它们转换为 And'ed 表达式。
以下是解释引号差异的相关文档https://docs.influxdata.com/kapacitor/v0.12/introduction/getting_started/#keep-the-quotes-in-mind
至于为什么没有录音,如果没有更多关于您如何尝试录音的背景信息,我无法回答。