GitHubじゃ!Pythonじゃ!

GitHubからPython関係の優良リポジトリを探したかったのじゃー、でも英語は出来ないから日本語で読むのじゃー、英語社会世知辛いのじゃー

Yelp

elastalert – ElasticSearchによる簡単で柔軟なアラート

投稿日:

ElasticSearchによる簡単で柔軟なアラート https://elastalert.readthedocs.org

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タイプ)
  • 特定のフィールドがブラックリスト/ホワイトリストに一致したときに一致する」( blacklistwhitelistタイプ)
  • 指定されたフィルタに一致するすべてのイベントに一致する “( 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 sentX query hits, 0 matches, 0 alerts sentなかった理由がtypeによって異なります。 type: any場合、すべてのヒットに対して一致が発生します。 type: frequencyを使用している場合、 num_eventsは、一致が発生するように、互いのtimeframe内で発生する必要があります。 異なるルールタイプには異なるルールが適用されます。

X matches, 0 alerts sentが確認さX matches, 0 alerts sentX matches, 0 alerts sentていない場合、これはいくつかの理由で発生する可能性があります。 aggregationを設定すると、アラートはその時間が経過するまで送信されません。 前にこの同じルールの警告を受け取っている場合、そのルールは一定の期間中消されることがあります。 アラート間のデフォルトは1分です。 ルールが消音されている場合は、ログにIgnoring match for silenced ruleとのIgnoring match for silenced ruleれます。

X alerts sentX alerts sentX 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に格納され、 _typesilenceとメモリにもキャッシュされます。

アラートの内容を変更するにはどうすればよいですか?

アラートに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_queryuse_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

ドキュメントを読むのドキュメント読んください

質問ですか? Freenode IRCで#elastalertで削除してください。







-Yelp

執筆者: