Kapacitorをinfluxdbおよびcollectdセットアップと統合しようとしています。しかし、うまくいかないようで、その理由がわかりません。
CollectedとInfluxdbは正しく実行されており、Kapacitorはinfluxdbに接続できると思います。 kapacitorログにこれが表示されます:
[influxdb] 2016/04/22 09:46:42 I! started UDP listener for collectd_db default
これは、collectdがメトリックを記録しているinfluxdbデータベースの名前です。
次のティックファイルを作成し、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
Kapacitorの作者はこちら...
Kapacitorラムダ式では、一重引用符と二重引用符の意味が異なります。
この式.where(lambda: "type" == "percent")
は、type
フィールドまたはタグの値がpercent
フィールドまたはタグの値と等しいデータポイントのみを保持することを意味します。エラーによると
[cpu_alert:stream1] 2016/04/28 13:00:51 E! WHERE式の評価中にエラーが発生しました:名前「パーセント」が未定義です。スコープ内の名前: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
録音がない理由については、録音をどのように作成しようとしたかについて、これ以上のコンテキストがないと答えられません。