Github: https://github.com/Yelp/elastalert
ElastAlert – ドキュメントを読む 。
Elasticsearchによる簡単で柔軟な警告
ElastAlertは、異常、スパイク、またはElasticsearchのデータからの他の関心のパターンに警告するためのシンプルなフレームワークです。
ElastAlertはすべてのバージョンのElasticsearchで動作します。
Yelpでは、ますます増え続けるデータとログを管理するために、Elasticsearch、Logstash、Kibanaを使用しています。 Kibanaはデータの視覚化とクエリに最適ですが、データの不一致を警告するためのツールが必要であることをすぐに認識しました。 この必要性から、ElastAlertが作成されました。
あなたがリアルタイムでElasticsearchに書き込まれているデータを持っていて、そのデータが特定のパターンと一致したときに警告したい場合は、ElastAlertがあなたのためのツールです。 あなたが木場でそれを見ることができるなら、ElastAlertはそれに警戒することができます。
概要
ElastAlertは、信頼性が高く、モジュール性が高く、設定と構成が容易であるように設計されています。
これは、Elasticsearchと2つのタイプのコンポーネント、ルールの種類とアラートを組み合わせることで機能します。 Elasticsearchは定期的に照会され、データがルール・タイプに渡されます。ルール・タイプは、一致が検出されたときを判別します。 一致が発生すると、それは1つ以上のアラートに与えられ、マッチに基づいてアクションを実行します。
これは、一連のルールによって構成され、各ルールはクエリ、ルールタイプ、アラートのセットを定義します。
ElastAlertには、共通の監視パラダイムを持ついくつかのルールタイプが含まれています。
- 少なくともY時間にX個のイベントが存在するマッチ」(
frequency
タイプ) - イベントの割合が増減したときのマッチ」(
spike
タイプ) - Y時間内にX個未満のイベントがある場合に一致する」(
flatline
タイプ) - 特定のフィールドがブラックリスト/ホワイトリストに一致したときに一致する」(
blacklist
とwhitelist
タイプ) - 指定されたフィルタに一致するすべてのイベントに一致する “(
any
タイプ) - フィールドがある時間内に2つの異なる値を持つ場合に一致する」(
change
タイプ) - 決して前に見られた用語がフィールドに現れたときに一致する “(
new_term
型) - フィールドの一意の値の数がしきい値を上回るまたは下回る場合に一致します(
cardinality
タイプ)
現在、次のアラートタイプのサポートが組み込まれています。
- Eメール
- JIRA
- OpsGenie
- コマンド
- ヒップチャット
- MSチーム
- スラック
- 電報
- AWS SNS
- VictorOps
- PagerDuty
- Exotel
- Twilio
- ジッタ
追加のルールタイプとアラートは簡単にインポートまたは書き込むことができます。
この基本的な使い方に加えて、アラートをより便利にするその他の多くの機能があります。
- 木場ダッシュボードへのアラートリンク
- 任意のフィールドの集計数
- アラートを定期的なレポートにまとめる
- 一意のキーフィールドを使用してアラートを分離する
- マッチデータを傍受して強化する
まず、 Running ElastAlert For The First Time
ドキュメントを参照してください 。
ElastAlertを実行中
$ python elastalert/elastalert.py [--debug] [--verbose] [--start <timestamp>] [--end <timestamp>] [--rule <filename.yaml>] [--config <filename.yaml>]
--debug
は、アラートを抑制するだけでなく、アラートの本文を出力するだけでなく、追加の情報を画面に表示します。 --verbose
互換性がありません。
--verbose
は、アラートを抑制することなく追加情報を表示します。 --debug.
互換性がありません--debug.
--start
は指定されたタイムスタンプでクエリを開始します。 デフォルトで、ElastAlertは現在のクエリを開始します。 タイムスタンプの形式はYYYY-MM-DDTHH-MM-SS[-/+HH:MM]
(日付と時刻の間のTに注意してください)。 例: – --start 2014-09-26T12:00:00
(UTC)または – --start 2014-10-01T07:30:00-05:00
–endを指定すると、ElastAlertは指定されたタイムスタンプでクエリを停止します。 デフォルトでは、ElastAlertは無期限にクエリを続行します。
--rule
は1つのルールしか実行できません。 それはまだルールフォルダになければなりません。 例:– --rule this_rule.yaml
--config
では、設定の場所を指定できます。 デフォルトでは、現在のディレクトリにconfig.yamlがあります。
サードパーティツールとエクストラ
木場プラグイン
ElastAlert Kibanaプラグインリポジトリで利用可能
ドッカー
REST APIを含むElastAlertのDockerizedバージョンは、 master
からbitsensor/elastalert:latest
ビルドです。
git clone https://github.com/bitsensor/elastalert.git; cd elastalert
docker run -d -p 3030:3030 \
-v `pwd`/config/elastalert.yaml:/opt/elastalert/config.yaml \
-v `pwd`/config/config.json:/opt/elastalert-server/config/config.json \
-v `pwd`/rules:/opt/elastalert/rules \
-v `pwd`/rule_templates:/opt/elastalert/rule_templates \
--net="host" \
--name elastalert bitsensor/elastalert:latest
ドキュメンテーション
ローカルのドキュメントのhtml版を構築するには
pip install sphinx_rtd_theme sphinx
cd docs
make html
ブラウザでのbuild / html / index.htmlでの表示
構成
設定の詳細については、config.yaml.exampleを参照してください。
ルールの例
異なるタイプのルールの例はexample_rules /にあります。
-
example_spike.yaml
は「スパイク」ルールタイプの例です。これにより、ある期間にわたって平均化されたイベントの割合が所定の要因で増加すると警告することができます。 この例では、過去2時間のイベント数よりも過去2時間以内に発生したフィルタに一致するイベントが3回ある場合に電子メールアラートを送信します。 -
example_frequency.yaml
は、ある期間内に特定の数のイベントが発生した場合に警告する「頻度」ルールタイプの例です。 この例では、特定のフィルタに一致する50個の文書が4時間以内に発生した場合に電子メールを送信します。 -
example_change.yaml
は、「変更」ルールタイプの例で、2つのドキュメントの特定のフィールドが変更されたときに警告します。 この例では、「username」フィールドは同じで、「country_name」フィールドの値が異なる2つのドキュメントが互いに24時間以内に発生すると、アラート電子メールが送信されます。 -
example_new_term.yaml
は、新しい値が1つまたは複数のフィールドに表示されたときに警告する「新しい用語」ルールタイプの例です。 この例では、ログインログの例で新しい値( “username”、 “computer”)が検出されたときに電子メールが送信されます。
よくある質問
私のルールはヒットしていませんか?
だからあなたはElastAlertを設定し、ルールを書いて実行しましたが、何も起こらないか、 0 query hits
と言い0 query hits
。 まず、コマンドelastalert-test-rule rule.yaml
を使用してデバッグすることをお勧めします。 過去24時間(またはそれ以上、– --help
参照)のフィルタと一致するドキュメントの数を表示し、警告が発生した場合に表示します。 ルールにフィルタがある場合は削除して、もう一度やり直してください。 インデックスが正しく、少なくともいくつかの文書がある場合は、これが表示されます。 キバナにフィルタがあり、それをElastAlertで再作成したい場合は、おそらくクエリ文字列を使用したいと思うでしょう。 フィルタは次のようになります
filter:
- query:
query_string:
query: "foo: bar AND baz: abc*"
Elasticsearchが解析できないというエラーが表示された場合は、YAMLが正しく配置されておらず、フィルタのフォーマットが正しくない可能性があります。 term
などの他のタイプのフィルタを使用している場合、共通の落とし穴は、分析されたトークンを使用する必要があるかもしれないことを認識していません。 Logstashを使用している場合は、これがデフォルトです。 例えば、
filter:
- term:
foo: "Test Document"
foo
の元の値が正確に “Test Document”だったとしても一致しません。 代わりに、 foo.raw
を使いたいと思っています。 ドキュメントが一致しない理由をトラブルシューティングしても問題が解決しない場合は、 – --es_debug_trace /path/to/file.log
ElastAlertを実行してみてください。 これにより、Elasticsearchで行ったクエリが完全にログに記録され、何が起きているのかを正確に把握できます。
私はヒットを得た、なぜ私は警戒を得ていないのですか?
X query hits, 0 matches, 0 alerts sent
ログがある場合X query hits, 0 matches, 0 alerts sent
場合X query hits, 0 matches, 0 alerts sent
、 X query hits, 0 matches, 0 alerts sent
なかった理由がtype
によって異なります。 type: any
場合、すべてのヒットに対して一致が発生します。 type: frequency
を使用している場合、 num_events
は、一致が発生するように、互いのtimeframe
内で発生する必要があります。 異なるルールタイプには異なるルールが適用されます。
X matches, 0 alerts sent
が確認さX matches, 0 alerts sent
、 X matches, 0 alerts sent
ていない場合、これはいくつかの理由で発生する可能性があります。 aggregation
を設定すると、アラートはその時間が経過するまで送信されません。 前にこの同じルールの警告を受け取っている場合、そのルールは一定の期間中消されることがあります。 アラート間のデフォルトは1分です。 ルールが消音されている場合は、ログにIgnoring match for silenced rule
とのIgnoring match for silenced rule
れます。
X alerts sent
たX alerts sent
がX alerts sent
もアラートがX alerts sent
ない場合は、アラート設定に関連している可能性があります。 --debug
フラグを使用している場合、アラートは受信されません。 代わりに、警告テキストがコンソールに書き込まれます。 アラートを防止せずに同じ効果を達成するには、– --verbose
を使用します。 電子メールアラートを使用している場合は、SMTPサーバー用に構成されていることを確認してください。 デフォルトでは、ポート25のlocalhostに接続します。また、 “From:”アドレスとして “elastalert”という語を使用します。 一部のSMTPサーバーはドメインを持たないため、一部のSMTPサーバーはこれを拒否しますが、他のSMTPサーバーは自分のドメインを自動的に追加します。 これを設定する方法については、ドキュメントの電子メールのセクションを参照してください。
なぜ私はいくつかを得ることを期待したときに1つだけの警告を取得しましたか?
同じルールの2つのアラート間の最小時間であるrealert
という設定があります。 この時間内に発生するアラートは、単に破棄されます。 これのデフォルト値は1分です。 1回の試合ごとに警告が表示されるようにするには、1回の試合が直ちに行われても、
realert:
minutes: 0
もちろん、それを高く設定することもできます。
重複アラートを防止するにはどうすればよいですか?
realert
設定することで、一定の時間内に同じルールが2回警告するのを防ぐことができます。
realert:
days: 1
また、 query_key
を使用すると、特定のフィールドに基づいて重複を防ぐこともできます。 たとえば、同じユーザーに対して複数のアラートが表示されないようにするには、
realert:
hours: 8
query_key: user
これは、多くのルールタイプが動作する方法にも影響します。 たとえば、 type: frequency
を使用している場合、アラートが送信される前にquery_key
単一の値に対してquery_key
が発生する必要があります。 このキーには複数のフィールドの複合を使用することもできます。 たとえば、特定のエラーとホスト名に対して一度だけアラートを受信したい場合は、
query_key: [error, hostname]
内部的には、これは、 value1,value2
値を持つfield1,field2
という各ドキュメントの新しいフィールドを作成し、それをquery_key
として使用することによってquery_key
ます。
アラートが再び発生するときのデータは、 elastalert_status
インデックスのElasticsearchに格納され、 _type
のsilence
とメモリにもキャッシュされます。
アラートの内容を変更するにはどうすればよいですか?
アラートにalert_text
フィールドを使用してカスタムテキストを追加することができます。 alert_text_type: alert_text_only
設定すると、アラート全体になります。 また、Pythonスタイルの文字列書式とalert_text_args
を使用して、アラートのさまざまなフィールドを追加することもできます。 例えば
alert_text: "Something happened with {0} at {1}"
alert_text_type: alert_text_only
alert_text_args: ["username", "@timestamp"]
また、 include
を使用して、文書の特定のフィールドのみを含むようにアラートを制限することもできinclude
。
include: ["ip_address", "hostname", "status"]
私のアラートには1つのイベントのデータしか含まれていません。どのようにもっと見ることができますか?
type: frequency
を使用している場合、オプションattach_related: true
を設定すると、すべての文書がアラートに含まれます。 代わりに、すべてのタイプで動作するtop_count_keys
ます。 これにより、特定のフィールドの各値のトップカウントが表示されます。 たとえば、
top_count_keys: ["ip_address", "status"]
あなたのアラートに合った10のドキュメントがあります。
ip_address:
127.0.0.1: 7
10.0.0.1: 2
192.168.0.1: 1
status:
200: 9
500: 1
特定の時刻にアラートを表示するにはどうすればよいですか?
aggregation
機能は、一定期間にわたって発生したすべてのアラートを1つのアラートでまとめて送信します。 cronスタイルの構文を使用して、最後の1回以降に発生したすべてのアラートを
aggregation:
schedule: '2 4 * * mon,fri'
私は多くの文書を持っていて、それは本当に遅いです、どうすればそれをスピードアップできますか?
潜在的にクエリを高速化する方法はいくつかあります。 index: logstash-*
を使用している場合、Elasticsearchは正しいタイムスタンプのデータを含んでいなくても、すべてのシャードを照会します。 代わりに、Pythonの時刻書式文字列を使用してuse_strftime_index
を設定することができます
index: logstash-%Y.%m
use_strftime_index: true
あなたが変更できるもう一つのことはbuffer_time
です。 デフォルトでは、ElastAlertは大規模な重なりウィンドウを照会し、たとえそれらがリアルタイムで索引付けされていても、イベントを見落とさないようにします。 config.yamlでは、 buffer_time
をより小さな数に調整して、最新の数分だけを照会することができます。
buffer_time:
minutes: 5
デフォルトでは、ElastAlertはすべてのドキュメントを処理する前に完全にダウンロードします。 代わりに、ElastAlertに各クエリの間に発生したドキュメントの数を単純にカウントさせることができます。 これを行うには、 use_count_query: true
設定しuse_count_query: true
。 ElastAlertは各文書の内容を知ることができないため、query_keyを使用する場合は使用できません。 これにより、アラートの精度も低下します。これは、各クエリ間で発生するすべてのイベントが単一のタイムスタンプに丸められるためです。
query_key
(複数のキーではなく単一のキー)を使用している場合は、 use_terms_query
を使用できます。 これにより、ElastAlertは、特定のフィールドの各値のカウントを取得するために集計を実行します。 use_terms_query
とuse_count_query
両方とも、 _type
をドキュメントの_type
に設定する必要があります。 それらはすべてのルールタイプと互換性がないかもしれません。
集計はできますか?
現在サポートされている唯一の集約は、 use_terms_query
を設定することによって、用語集合use_terms_query
。
私は@timestampを使用していませんが、私は何をしますか?
timestamp_field
を使用して、ElastAlertがタイムスタンプとして使用するフィールドを変更することができます。 timestamp_type
を使用して、ISO 8601とUNIXのタイムスタンプの間で変更することができます。 ElastAlertが動作するには、何らかのタイムスタンプが必要です。 あなたのイベントがリアルタイムでない場合は、ElastAlertがドキュメントを探すbuffer_time
を調整するためにquery_delayとbuffer_time
を使用することができます。
フラットラインを使用していますが、アラートは表示されません
type: flatline
を使用する場合、ElastAlertは少なくとも1つのドキュメントを見る必要があります。
どのようにして「解決」イベントを得ることができますか?
ElastAlertは現在、ステートフルアラートをサポートしていないか、イベントを解決していません。
警告しきい値を設定することはできますか?
現在、警告しきい値を設定する唯一の方法は、しきい値が低い第2ルールを作成することです。
ライセンス
ElastAlertはApache License、Version 2.0の下でライセンスされています: http : //www.apache.org/licenses/LICENSE-2.0