Using kapacitor with influxdb and collectd

collectdkapacitor

I'm trying to integrate Kapacitor with our influxdb and collectd setup. However, It doesn't seem to work, and I don't understand why.

Collectd and Influxdb are running correctly, and I think Kapacitor is able to connect to influxdb. In the kapacitor log I see this:

[influxdb] 2016/04/22 09:46:42 I! started UDP listener for collectd_db default

This is the name of the influxdb database where collectd is recording metrics.

I created the following tick-file, and uploaded it to kapacitor and enabled it:

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')

This was just a test script, which hopefully produces some output.

The script is enabled:

Name                          Type      Enabled   Executing Databases and Retention Policies
cpu_tick                      stream    true      true      ["collectd_db"."default"]

However, I don't see any recordings:

[centos@ip-xx-xx-xx-xx tmp]$ kapacitor list recordings
ID                                      Type    Size      Created      

"cpu_value" is a valid measurement in my database.

This is what I get in my error log:

[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

Best Answer

Author of Kapacitor here...

In Kapacitor lambda expressions single quotes vs double quotes have different meanings.

  • Single quotes indicate a string literal
  • Double quotes are a reference to a field or tag from the data.

This expression .where(lambda: "type" == "percent") is saying only keep data points who's type field or tag value is equal to the value of the percent field or tag. As per the err

[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

The percent field or tag does not exist.

You need to use single quotes if you want to filter points who's type value is equal to the percent literal.

.where(lambda: "type" == 'percent')

The same is probably true for your next expression as well.

.where(lambda: "type_instance" == 'idle')

Also you can AND expressions together if you wish

.where(lambda: "type" == 'percent' AND "type_instance" == 'idle')

When Kapacitor finds multiple where statements adjacent it converts them to an And'ed expression under the hood.

Here is relevant docs explaining the quotes differences https://docs.influxdata.com/kapacitor/v0.12/introduction/getting_started/#keep-the-quotes-in-mind

As for why there are no recordings I cannot answer without more context as to how you tried to create a recording.

Related Topic