Estou tentando integrar o Kapacitor com nossa configuração influxdb e collectd. No entanto, não parece funcionar e não entendo o porquê.
Collectd e Influxdb estão funcionando corretamente e acho que o Kapacitor pode se conectar ao influxdb. No log do kapacitor, vejo isso:
[influxdb] 2016/04/22 09:46:42 I! started UDP listener for collectd_db default
Este é o nome do banco de dados influxdb onde o collectd está registrando as métricas.
Eu criei o seguinte tick-file, carreguei-o no kapacitor e o habilitei:
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')
Este foi apenas um script de teste, que esperamos produzir alguma saída.
O script está ativado:
Name Type Enabled Executing Databases and Retention Policies
cpu_tick stream true true ["collectd_db"."default"]
No entanto, não vejo nenhuma gravação:
[centos@ip-xx-xx-xx-xx tmp]$ kapacitor list recordings
ID Type Size Created
"cpu_value" é uma medida válida em meu banco de dados.
Isso é o que recebo no meu log de erros:
[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
Autor de Kapacitor aqui...
Em Kapacitor, as expressões lambda entre aspas simples e aspas duplas têm significados diferentes.
Esta expressão
.where(lambda: "type" == "percent")
está dizendo apenas para manter os pontos de dados cujo valor detype
campo ou tag é igual ao valor dopercent
campo ou tag. De acordo com o erroO
percent
campo ou tag não existe.Você precisa usar aspas simples se quiser filtrar pontos cujo valor do tipo é igual ao
percent
literal..where(lambda: "type" == 'percent')
O mesmo provavelmente também é verdade para sua próxima expressão.
.where(lambda: "type_instance" == 'idle')
Além disso, você pode
AND
usar expressões juntas, se desejar.where(lambda: "type" == 'percent' AND "type_instance" == 'idle')
Quando o Kapacitor encontra várias
where
instruções adjacentes, ele as converte em uma expressão And'ed sob o capô.Aqui estão documentos relevantes que explicam as diferenças de cotações https://docs.influxdata.com/kapacitor/v0.12/introduction/getting_started/#keep-the-quotes-in-mind
Quanto ao motivo de não haver gravações, não posso responder sem mais contexto sobre como você tentou criar uma gravação.