Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
16
Help us understand the problem. What is going on with this article?
@rururu_kenken

Elasticsearchのデータを基にアラート通知する方法の調査

X-PackのWatcher Alert

開発元:Elastic
有償

Watcherを始めてみよう

Elasticsearchのアラート検知プラグイン「Watcher」を使ってみた
Elastic Stack Alertingではまったことと対処方法
Elastic Stack を使った予兆検知結果の可視化 〜検知した異常の通知〜
Elasticsearchのプラグイン「Shield」「Watcher」による不正アクセス監査
Elastic StackのX-Packを試す(Watcher編)

X-PackのAlerting and action settings in Kibana

開発元:Elastic

Alerts and Actions
Managing Alerts
Alert details
Managing Connectors

ElastAlert

開発元:Yelp
Pythonで作られている。
Pythonライブラリの「elasticsearch」を使用している。
https://pypi.org/project/elasticsearch/
ライセンスは、Apache License 2.0
0.2.4 (2020/04/17)

・コマンド・設定ファイル(YAML)ベースでの動作のみ。
・0.2.0b2よりElasticsearch 7.xに対応。
・0.2.0よりPython3対応。

ElastAlertは積極的なバグ修正・機能追加を行っていない状態
メンテナーの交代の進捗が全く進んでいない状態

Please don't let this die. ElastAlert usecase is very strong. #2947
Should someone else maintain this? #2946
Status of the elastalert project #2911

フォークでメンテナンスしているリポジトリ

jertel/elastalert

・オリジナルのYelp/elastalertに無い機能があります。
・アラート通知先にDiscord、Chartwork、Dingtalkなども。
・多数のバグ修正
 (Line Notify、Stomp、Zabbix、Pagertreeは正常に動作。AWS SNSのバグ修正)
https://github.com/jertel/elastalert
https://elastalert2.readthedocs.io/en/latest/
https://github.com/jertel/elastalert-docker

アラート通知先

アラート通知先 備考
Command アラート通知確認済
Email アラート通知確認済。gmailまたはoffice365でうまくいかないというissueを見かける問題ありそう。gmailまたはoffice365はfrom_addrに指定しなければ大丈夫
JIRA 以下のものがドキュメントに記載し忘れている
・jira_assignee
カスタムフィールドで正常に動かない情報あり
Jira customfield not taking argument #3073
Trying to assign Epic Link to Jira ticket #3108
OpsGenie 以下のものがドキュメントに記載し忘れている
・opsgenie_addr
・opsgenie_proxy
・opsgenie_details
AWS SNS ドキュメントの記載が古い
・aws_access_key→aws_access_key_id
・aws_secret_key→aws_secret_access_key
・profile→aws_profile
HipChat HipChatは2019/02にサービス終了している
Stride Strideは2019/02にサービス終了している
MS Teams アラート通知確認済
Slack アラート通知確認済
Mattermost アラート通知確認済
Telegram アラート通知確認済
以下のものがドキュメントに記載し忘れている
・telegram_proxy_login
・telegram_proxy_pass
GoogleChat
PagerDuty
PagerTree 最新の0.2.4で正常に動作しない
以下のものがドキュメントに記載し忘れている
・pagertree_proxy
Exotel Exotelは日本でサポート外のため未確認
Twilio アラート通知確認済
VictorOps アラート通知確認済
Gitter アラート通知確認済
ServiceNow アラート通知確認済
Debug
Stomp 最新の0.2.4で正常に動作しない
Alerta アラート通知は動いているという情報あり
以下のものがドキュメントに記載し忘れている
・alerta_api_skip_ssl
HTTP POST
Line Notify 最新の0.2.4で正常に動作しない
TheHive アラート通知は動いているという情報あり
以下のものがドキュメントに記載し忘れている
・hive_verify
Zabbix ドキュメントで「zbx_item」という記載されているのは「zbx_key」。zbx_itemと書くと「Missing required option(s): zbx_key」のエラーが出る。
・設定を追加して動かすとエラーが出る。バグがあるようです。
(expected 2, got 1)Could not import module zabbix: not enough values to unpack
Zabbix alert #2601
Zabbix alert module error #2621
Elastalet fails if alerter type zabbix is used: "ValueError: not enough values to unpack" [bug] #2586
以下の対応で正常に動作します。動作確認手伝いました
Bugfix and better error handling on zabbix alerter #2640

Dockerイメージ

ElastAlert Serverが今後もメンテナンスされるのか不安がある。
bitsensor/elastalertはメンテナンスしていない状況。
johnsusek/elastalert-server[メンテナー:John Susek、Naoyuki Sano]をforkして独自でメンテナンスしていくことが発生することも考えて採用を考えたほうがいいと思います。
・非推奨のライブラリ(request、request-promise-native)の置き換えが行われるのか。
・新しいNode.jsへの対応。
・Elasticserachメジャーバージョンアップ対応(直近だと8.x)

Dockerイメージ名 タグ ElastAlert 備考
bitsensor/elastalert 2.0.1 0.1.39 Elastcserach 7.xで問題が発生
bitsensor/elastalert lastet 0.1.39 Elastcserach 7.xで問題が発生
bitsensor/elastalert 3.0.0-beta.0 0.2.0b2
bitsensor/elastalert 3.0.0-beta.1 未確認
karql/elastalert 4.0.0 最新のmaster
(コミットID指定)
bitsensor/elastalertフォーク
Python 3.8
npmのライブラリは古いままでバージョン上げていないので中途半端
servercentral/elastalert latest 0.2.1 bitsensor/elastalertフォーク
daichi703n/elastalert 0.2.1-dev2 0.2.1+bugfix servercentral/elastalertフォーク
jfcantu/elastalert:v0.1.1のイメージ使用?。その他のバグ修正は以下のサイトを参照。
Praeco + ElastAlert2.0 + ES7.x 構成の不具合対応方法
daichi703n/elastalert-server (GitHub)
praecoapp/elastalert-server latest 0.2.4+bugfix servercentral/elastalertフォーク
Praeco用ElastAlert Serverの最新版
ライブラリ最新化。Babel 6→7など
アラートログが表示されない問題修正

インデックスのオープンしすぎによるJavaヒープメモリ枯渇

circuit_breaking_exceptionが発生することがある
→ElasticSearchのヒープサイズ変更
→ElasticSearch
indices.breaker.total.limit変更
→ElasticSearchのIndexデータ削除、or 不要Indexデータのクローズ
Elasticsearchのインデックス開きすぎによるヒープメモリ枯渇
elastalert feels very unhappy (circuit_breaking_exception, Data too large) #2485
circuit_breaking_exception, Data too large #349
After Upgrade to 6.2.4 Circuitbreaker Exception Data too large #31197
Elastalert deployment failed

参考URL

Elastic StackによるKubernetesモニタリングシステムの紹介
ElastAlert による Elasticsearch のインデックス監視・通知
elastalertでアプリの異常を自動検知して通知したい
elastalert – ElasticSearchによる簡単で柔軟なアラート
ElastAlertでカスタムルールを作成する
ElasticSearch + Elastalertでエラーログ検出時に通知したい
ElastAlertの監視ルールを拡張してすこしだけ幸せになる
Elasticsearchを活用したサービス監視ですこしだけ幸せになる
AWS ElasticSearch ServiceのログをElastAlertで監視する
twitter -> fluentd -> elasticsearch -> elastalert -> slackで、エゴサをしたい人生だった。
elastalertを利用したslackへのアラート
Alerting on Kubernetes Events with EFK Stack
ElastAlert: Alerting At Scale With Elasticsearch, Part 1
Using Elastalert to monitor disk growth

サンプル

elastalert/example_rules
andromedarabbit/elastalert-rule.yaml
elastalertを利用したslackへのアラート

Elastalert rule for CPU usage in percentage
Elastalert-Regel ausgeführt: IOError: [Errno 2] Keine solche Datei oder Verzeichnis: 'config.yaml'
ELK: ElastAlert for alerting based on data from ElasticSearch
manankalra/elastalert-tutorial
・elastalert_cpu_watch.yaml
・elastalert_filesystem_watch.yaml
・elastalert_memory_watch.yaml

ElastAlert Kibana Plugin

開発元:BitSensor
ライセンスは、The 3-clause BSD license (Modified)
1.1.0 (2019/07/22)

・ElastAlert ルールファイルエディタ
・ElastAlertをKibanaのタブとして組み込める。
・アラートルールディレクトリの直下のファイルしか管理できない
・Kibana 7.2.0~7.5.0に対応している。
・Praecoと一緒に使わないことをおすすめする。
<理由>
Praecoで対応していない設定で編集した場合、Praecoでアラートルールの有効・無効に変更したりした時に書いた設定が消えたりするからです。
なお、この動きは使用者が誤った使い方をしたことにより発生することであり、仕様だと思います。

ElastAlert Kibana Pluginについて思っていること(2020/8/23現在)

最新のKibanaで使えない(公式ではKibana 7.5.0までサポート)ので採用をおすすめできない状況
今後動かなくなっても最新のKibanaで動くように改修できるなら採用していいと思います。
なお、非公式サポートとなりますが、私がGitHubのリポジトリをForkして最新のKibanaに対応しています。

Kibana 6.8.1~6.8.10、7.7.1~7.9.3、7.10.0~

Kibana 7.10.0~
https://github.com/karql/elastalert-kibana-plugin
Kibana 6.8.1~6.8.10、7.5.1~7.9.3対応
https://github.com/nsano-rururu/elastalert-kibana-plugin/releases

Kibana 6.8.xでも動く?

kibana 6.8.1 support #117
Can't install elastalert-kibana-plugin-1.0.3-6.8.0.zip to Kibana 6.8.3 #123

Kibana 7.5.1~7.8.1で動きます

elastalert-kibana-plugin-1.1.0-7.5.0.zipをダウンロードしてきて、
kibana/elastalert-kibana-plugin/package.jsonの
Kibanaのバージョンを更新してzipファイルに圧縮すれば
Kibana 7.5.1、7.5.2で動きます。
Kibana 7.6.0~7.8.1については、package.jsonのKibanaのバージョン更新以外にelastalert.jsの差し替えも必要です。

ちなみに、Kibana 7.6.x対応については、公式サイトでプルリクエストが上がっています(2020/04/07確認)
manually disabling payload validation on the routes to fix for Kibana 7.6.0 #148

Plugin elastalert-kibana-plugin [7.5.0] is incompatible with Kibana [7.5.1] #139
Plugin is incompatible with Kibana 7.6.0 #141
[Legacy] Route payload must be set to 'parse' when payload validation enabled #57777
update elasticsearch to 7.6.2; also, fix issue idaholab#119

KibanaにElastAlertのプラグインをインストールしたDockerイメージを作る場合

Kibana 7.5.1~7.8.1のDockerイメージの作成方法は別記事を書きました
elastalert-kibana-pluginをインストールした状態のDockerイメージを作成する方法

以下はdocker-composeのcommandでElastAlertのプラグインをインストールする場合

# (参考情報)elastalert-kibana-plugin-1.1.0-7.5.1.zip作成
cd /tmp
curl -L -O https://github.com/bitsensor/elastalert-kibana-plugin/releases/download/1.1.0/elastalert-kibana-plugin-1.1.0-7.5.0.zip
mv elastalert-kibana-plugin-1.1.0-7.5.0.zip elastalert-kibana-plugin-1.1.0-7.5.1.zip
unzip elastalert-kibana-plugin-1.1.0-7.5.1.zip kibana/elastalert-kibana-plugin/package.json
sed -i "s/7\.5\.0/7\.5\.1/g" kibana/elastalert-kibana-plugin/package.json
zip elastalert-kibana-plugin-1.1.0-7.5.1.zip kibana/elastalert-kibana-plugin/package.json
rm -rf kibana

# elastalert-kibana-plugin-1.1.0-7.5.2.zip作成
cd /tmp
curl -L -O https://github.com/bitsensor/elastalert-kibana-plugin/releases/download/1.1.0/elastalert-kibana-plugin-1.1.0-7.5.0.zip
mv elastalert-kibana-plugin-1.1.0-7.5.0.zip elastalert-kibana-plugin-1.1.0-7.5.2.zip
unzip elastalert-kibana-plugin-1.1.0-7.5.2.zip kibana/elastalert-kibana-plugin/package.json
sed -i "s/7\.5\.0/7\.5\.2/g" kibana/elastalert-kibana-plugin/package.json
zip elastalert-kibana-plugin-1.1.0-7.5.2.zip kibana/elastalert-kibana-plugin/package.json
rm -rf kibana

# (参考情報)elastalert-kibana-plugin-1.1.0-7.6.0.zip作成
cd /tmp
curl -L -O https://github.com/bitsensor/elastalert-kibana-plugin/releases/download/1.1.0/elastalert-kibana-plugin-1.1.0-7.5.0.zip
# [update elasticsearch to 7.6.2; also, fix issue idaholab#119](https://github.com/mmguero-dev/Malcolm/commit/b38ddb7f0d4c5b03e6f8ccad58a656644e113b19)
curl -L -O https://raw.githubusercontent.com/mmguero-dev/Malcolm/development/kibana/elastalert-kibana-plugin/server/routes/elastalert.js
mv elastalert.js elastalert-server-routes.js
mv elastalert-kibana-plugin-1.1.0-7.5.0.zip elastalert-kibana-plugin-1.1.0-7.6.0.zip
unzip elastalert-kibana-plugin-1.1.0-7.6.0.zip kibana/elastalert-kibana-plugin/package.json
sed -i "s/7\.5\.0/7\.6\.0/g" kibana/elastalert-kibana-plugin/package.json
mkdir -p kibana/elastalert-kibana-plugin/server/routes/
cp /tmp/elastalert-server-routes.js kibana/elastalert-kibana-plugin/server/routes/elastalert.js
zip elastalert-kibana-plugin-1.1.0-7.6.0.zip kibana/elastalert-kibana-plugin/package.json kibana/elastalert-kibana-plugin/server/routes/elastalert.js
rm -rf kibana
rm elastalert-server-routes.js

# (参考情報)elastalert-kibana-plugin-1.1.0-7.6.1.zip作成
cd /tmp
curl -L -O https://github.com/bitsensor/elastalert-kibana-plugin/releases/download/1.1.0/elastalert-kibana-plugin-1.1.0-7.5.0.zip
# [update elasticsearch to 7.6.2; also, fix issue idaholab#119](https://github.com/mmguero-dev/Malcolm/commit/b38ddb7f0d4c5b03e6f8ccad58a656644e113b19)
curl -L -O https://raw.githubusercontent.com/mmguero-dev/Malcolm/development/kibana/elastalert-kibana-plugin/server/routes/elastalert.js
mv elastalert.js elastalert-server-routes.js
mv elastalert-kibana-plugin-1.1.0-7.5.0.zip elastalert-kibana-plugin-1.1.0-7.6.1.zip
unzip elastalert-kibana-plugin-1.1.0-7.6.1.zip kibana/elastalert-kibana-plugin/package.json
sed -i "s/7\.5\.0/7\.6\.1/g" kibana/elastalert-kibana-plugin/package.json
mkdir -p kibana/elastalert-kibana-plugin/server/routes/
cp /tmp/elastalert-server-routes.js kibana/elastalert-kibana-plugin/server/routes/elastalert.js
zip elastalert-kibana-plugin-1.1.0-7.6.1.zip kibana/elastalert-kibana-plugin/package.json kibana/elastalert-kibana-plugin/server/routes/elastalert.js
rm -rf kibana
rm elastalert-server-routes.js

# (参考情報)elastalert-kibana-plugin-1.1.0-7.6.2.zip作成
cd /tmp
curl -L -O https://github.com/bitsensor/elastalert-kibana-plugin/releases/download/1.1.0/elastalert-kibana-plugin-1.1.0-7.5.0.zip
# [update elasticsearch to 7.6.2; also, fix issue idaholab#119](https://github.com/mmguero-dev/Malcolm/commit/b38ddb7f0d4c5b03e6f8ccad58a656644e113b19)
curl -L -O https://raw.githubusercontent.com/mmguero-dev/Malcolm/development/kibana/elastalert-kibana-plugin/server/routes/elastalert.js
mv elastalert.js elastalert-server-routes.js
mv elastalert-kibana-plugin-1.1.0-7.5.0.zip elastalert-kibana-plugin-1.1.0-7.6.2.zip
unzip elastalert-kibana-plugin-1.1.0-7.6.2.zip kibana/elastalert-kibana-plugin/package.json
sed -i "s/7\.5\.0/7\.6\.2/g" kibana/elastalert-kibana-plugin/package.json
mkdir -p kibana/elastalert-kibana-plugin/server/routes/
cp /tmp/elastalert-server-routes.js kibana/elastalert-kibana-plugin/server/routes/elastalert.js
zip elastalert-kibana-plugin-1.1.0-7.6.2.zip kibana/elastalert-kibana-plugin/package.json kibana/elastalert-kibana-plugin/server/routes/elastalert.js
rm -rf kibana
rm elastalert-server-routes.js

# (参考情報)elastalert-kibana-plugin-1.1.0-7.7.0.zip作成
cd /tmp
curl -L -O https://github.com/bitsensor/elastalert-kibana-plugin/releases/download/1.1.0/elastalert-kibana-plugin-1.1.0-7.5.0.zip
# [update elasticsearch to 7.7.0; also, fix issue idaholab#119](https://github.com/mmguero-dev/Malcolm/commit/b38ddb7f0d4c5b03e6f8ccad58a656644e113b19)
curl -L -O https://raw.githubusercontent.com/mmguero-dev/Malcolm/development/kibana/elastalert-kibana-plugin/server/routes/elastalert.js
mv elastalert.js elastalert-server-routes.js
mv elastalert-kibana-plugin-1.1.0-7.5.0.zip elastalert-kibana-plugin-1.1.0-7.7.0.zip
unzip elastalert-kibana-plugin-1.1.0-7.7.0.zip kibana/elastalert-kibana-plugin/package.json
sed -i "s/7\.5\.0/7\.7\.0/g" kibana/elastalert-kibana-plugin/package.json
mkdir -p kibana/elastalert-kibana-plugin/server/routes/
cp /tmp/elastalert-server-routes.js kibana/elastalert-kibana-plugin/server/routes/elastalert.js
zip elastalert-kibana-plugin-1.1.0-7.7.0.zip kibana/elastalert-kibana-plugin/package.json kibana/elastalert-kibana-plugin/server/routes/elastalert.js
rm -rf kibana
rm elastalert-server-routes.js

# (参考情報)elastalert-kibana-plugin-1.1.0-7.7.1.zip作成
cd /tmp
curl -L -O https://github.com/bitsensor/elastalert-kibana-plugin/releases/download/1.1.0/elastalert-kibana-plugin-1.1.0-7.5.0.zip
# [update elasticsearch to 7.7.1; also, fix issue idaholab#119](https://github.com/mmguero-dev/Malcolm/commit/b38ddb7f0d4c5b03e6f8ccad58a656644e113b19)
curl -L -O https://raw.githubusercontent.com/mmguero-dev/Malcolm/development/kibana/elastalert-kibana-plugin/server/routes/elastalert.js
mv elastalert.js elastalert-server-routes.js
mv elastalert-kibana-plugin-1.1.0-7.5.0.zip elastalert-kibana-plugin-1.1.0-7.7.1.zip
unzip elastalert-kibana-plugin-1.1.0-7.7.1.zip kibana/elastalert-kibana-plugin/package.json
sed -i "s/7\.5\.0/7\.7\.1/g" kibana/elastalert-kibana-plugin/package.json
mkdir -p kibana/elastalert-kibana-plugin/server/routes/
cp /tmp/elastalert-server-routes.js kibana/elastalert-kibana-plugin/server/routes/elastalert.js
zip elastalert-kibana-plugin-1.1.0-7.7.1.zip kibana/elastalert-kibana-plugin/package.json kibana/elastalert-kibana-plugin/server/routes/elastalert.js
rm -rf kibana
rm elastalert-server-routes.js

# (参考情報)elastalert-kibana-plugin-1.1.0-7.8.0.zip作成
cd /tmp
curl -L -O https://github.com/bitsensor/elastalert-kibana-plugin/releases/download/1.1.0/elastalert-kibana-plugin-1.1.0-7.5.0.zip
# [update elasticsearch to 7.8.0; also, fix issue idaholab#119](https://github.com/mmguero-dev/Malcolm/commit/b38ddb7f0d4c5b03e6f8ccad58a656644e113b19)
curl -L -O https://raw.githubusercontent.com/mmguero-dev/Malcolm/development/kibana/elastalert-kibana-plugin/server/routes/elastalert.js
mv elastalert.js elastalert-server-routes.js
mv elastalert-kibana-plugin-1.1.0-7.5.0.zip elastalert-kibana-plugin-1.1.0-7.8.0.zip
unzip elastalert-kibana-plugin-1.1.0-7.8.0.zip kibana/elastalert-kibana-plugin/package.json
sed -i "s/7\.5\.0/7\.8\.0/g" kibana/elastalert-kibana-plugin/package.json
mkdir -p kibana/elastalert-kibana-plugin/server/routes/
cp /tmp/elastalert-server-routes.js kibana/elastalert-kibana-plugin/server/routes/elastalert.js
zip elastalert-kibana-plugin-1.1.0-7.8.0.zip kibana/elastalert-kibana-plugin/package.json kibana/elastalert-kibana-plugin/server/routes/elastalert.js
rm -rf kibana
rm elastalert-server-routes.js

ディレクトリ構成

./elastalert/rules、./elastalert/rule_templates、./es/dataは chmodで777設定

ElastAlertのファイルは以下のサイトの物を使用。一部の値を修正
https://github.com/bitsensor/elastalert

/home/ユーザー名/dkwork/es/
|--docker-compose.yml
|--Dockerfiles
|  |--Dockerfile.elastalert
|
|--es
|  |--config
|  |  |--elasticsearch.yml
|  |--data
|
|--kibana
|  |--config
|  |  |--kibana.yml
|  |--plugin
|  |  |--elastalert-kibana-plugin-1.1.0-7.7.0.zip
|
|--elastalert
|  |--bin
|  |  |--elastalert-start.sh
|  |  |--elastic_search_status.sh
|  |--config
|  |  |--config.json
|  |  |--elastalert-test.yaml
|  |  |--elastalert.yaml
|  |--rule_templates
|  |--rules
docker-compose.yml
version: "3.7"
services:
  elasticsearch:
    container_name: elasticsearch
    image: docker.elastic.co/elasticsearch/elasticsearch:7.7.0
    ports:
      - 9200:9200
      - 9300:9300
    environment:
      - ES_JAVA_OPTS=-Xms256m -Xmx512m
      - discovery.type=single-node
    restart: always
    volumes:
      - ./es/data:/usr/share/elasticsearch/data
      - ./es/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
    healthcheck:
        test: ["CMD-SHELL", "curl -f http://localhost:9200 || exit 1"]
        interval: 30s
        timeout: 15s
        retries: 3
        start_period: 180s

  kibana:
    container_name: kibana
    image: docker.elastic.co/kibana/kibana:7.7.0
    command: sh -c './bin/kibana-plugin list | grep elastalert-kibana-plugin@1.1.0; result=`echo $$?`; if [ $$result = 1 ]; then  ./bin/kibana-plugin install file:///usr/share/kibana/work/elastalert-kibana-plugin-1.1.0-7.7.0.zip && exec /usr/local/bin/kibana-docker; else exec /usr/local/bin/kibana-docker; fi'
    ports:
      - 5601:5601
    depends_on:
      - elasticsearch
    restart: always
    volumes:
      - ./kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml
      - ./kibana/plugin:/usr/share/kibana/work
    healthcheck:
        test: ["CMD-SHELL", "curl -f http://localhost:5601/api/status || exit 1"]
        interval: 30s
        timeout: 15s
        retries: 3
        start_period: 200s

  elastalert:
    container_name: elastalert
    build:
      context: .
      dockerfile: Dockerfiles/Dockerfile.elastalert
    image: elastalert:3.0.0-beta.0
    ports:
      - 3030:3030
      - 3333:3333
    depends_on:
      - elasticsearch
      - kibana
    restart: always
    volumes:
      - ./elastalert/config/elastalert.yaml:/opt/elastalert/config.yaml
      - ./elastalert/config/elastalert-test.yaml:/opt/elastalert/config-test.yaml
      - ./elastalert/config/config.json:/opt/elastalert-server/config/config.json
      - ./elastalert/rules:/opt/elastalert/rules
      - ./elastalert/rule_templates:/opt/elastalert/rule_templates
    healthcheck:
        test: ["CMD-SHELL", "curl -f http://localhost:3030 || exit 1"]
        interval: 30s
        timeout: 15s
        retries: 3
        start_period: 200s
Dockerfiles/Dockerfile.elastalert
FROM bitsensor/elastalert:3.0.0-beta.0

USER root

RUN apk update && \
    apk add bash curl && \
    rm -rf /var/cache/apk/*

ADD elastalert/bin/elastalert-start.sh /usr/local/bin/
ADD elastalert/bin/elastic_search_status.sh /usr/local/bin/

RUN chmod +x /usr/local/bin/elastalert-start.sh 
RUN chmod +x /usr/local/bin/elastic_search_status.sh

USER node

ENTRYPOINT ["/usr/local/bin/elastalert-start.sh"]
elastalert/bin/elastic_search_status.sh
#!/bin/bash

set -e

if [ $# -gt 0 ]; then
  ES_URL="$1"
elif [[ -n $ELASTICSEARCH_URL ]]; then
  ES_URL="$ELASTICSEARCH_URL"
elif [[ -n $ES_HOST ]] && [[ -n $ES_PORT ]]; then
  ES_URL="http://$ES_HOST:$ES_PORT"
else
  ES_URL="http://elasticsearch:9200"
fi

until [[ "$(curl -fsSL "$ES_URL/_cat/health?h=status" | sed -r 's/^[[:space:]]+|[[:space:]]+$//g')" =~ ^(yellow|green)$ ]]; do
  # printf '+' >&2
  sleep 1
done

echo "Elasticsearch is up and healthy at "$ES_URL"" >&2
elastalert/bin/elastalert-start.sh
#!/bin/bash

set -e

echo "Giving Elasticsearch at $ELASTICSEARCH_URL time to start..."

elastic_search_status.sh

echo "Starting ElastAlert!"
npm start
es/config/elasticsearch.yml
cluster.name: "docker-cluster"
network.host: 0.0.0.0
discovery.zen.minimum_master_nodes: 1
kibana/config/kibana.yml
server.name: kibana
server.host: "0"
elasticsearch.hosts: http://elasticsearch:9200
xpack.monitoring.ui.container.elasticsearch.enabled: true

# elastalert-kibana-plugin
elastalert-kibana-plugin.serverHost: elastalert
elastalert-kibana-plugin.serverPort: 3030
elastalert/config/config.json
{
  "appName": "elastalert-server",
  "port": 3030,
  "wsport": 3333,
  "elastalertPath": "/opt/elastalert",
  "verbose": false,
  "es_debug": false,
  "debug": false,
  "rulesPath": {
    "relative": true,
    "path": "/rules"
  },
  "templatesPath": {
    "relative": true,
    "path": "/rule_templates"
  },
  "es_host": "elasticsearch",
  "es_port": 9200,
  "writeback_index": "elastalert_status"
}

es_hostの値を「localhost」から「elasticsearch」に変更

elastalert/config/elastalert-test.yml
# NOTE: This config is used when testing a rule

# The elasticsearch hostname for metadata writeback
# Note that every rule can have its own elasticsearch host
es_host: elasticsearch

# The elasticsearch port
es_port: 9200

# This is the folder that contains the rule yaml files
# Any .yaml file will be loaded as a rule
rules_folder: rules

# How often ElastAlert will query elasticsearch
# The unit can be anything from weeks to seconds
run_every:
  seconds: 5

# ElastAlert will buffer results from the most recent
# period of time, in case some log sources are not in real time
buffer_time:
  minutes: 1

# Optional URL prefix for elasticsearch
#es_url_prefix: elasticsearch

# Connect with TLS to elasticsearch
#use_ssl: True

# Verify TLS certificates
#verify_certs: True

# GET request with body is the default option for Elasticsearch.
# If it fails for some reason, you can pass 'GET', 'POST' or 'source'.
# See http://elasticsearch-py.readthedocs.io/en/master/connection.html?highlight=send_get_body_as#transport
# for details
#es_send_get_body_as: GET

# Option basic-auth username and password for elasticsearch
#es_username: someusername
#es_password: somepassword

# The index on es_host which is used for metadata storage
# This can be a unmapped index, but it is recommended that you run
# elastalert-create-index to set a mapping
writeback_index: elastalert_status

# If an alert fails for some reason, ElastAlert will retry
# sending the alert until this time period has elapsed
alert_time_limit:
  days: 2

es_hostの値を「localhost」から「elasticsearch」に変更

elastalert/config/elastalert.yml
# The elasticsearch hostname for metadata writeback
# Note that every rule can have its own elasticsearch host
es_host: elasticsearch

# The elasticsearch port
es_port: 9200

# This is the folder that contains the rule yaml files
# Any .yaml file will be loaded as a rule
rules_folder: rules

# How often ElastAlert will query elasticsearch
# The unit can be anything from weeks to seconds
run_every:
  seconds: 5

# ElastAlert will buffer results from the most recent
# period of time, in case some log sources are not in real time
buffer_time:
  minutes: 1

# Optional URL prefix for elasticsearch
#es_url_prefix: elasticsearch

# Connect with TLS to elasticsearch
#use_ssl: True

# Verify TLS certificates
#verify_certs: True

# GET request with body is the default option for Elasticsearch.
# If it fails for some reason, you can pass 'GET', 'POST' or 'source'.
# See http://elasticsearch-py.readthedocs.io/en/master/connection.html?highlight=send_get_body_as#transport
# for details
#es_send_get_body_as: GET

# Option basic-auth username and password for elasticsearch
#es_username: someusername
#es_password: somepassword

# The index on es_host which is used for metadata storage
# This can be a unmapped index, but it is recommended that you run
# elastalert-create-index to set a mapping
writeback_index: elastalert_status

# If an alert fails for some reason, ElastAlert will retry
# sending the alert until this time period has elapsed
alert_time_limit:
  days: 2

1.PNG
2.PNG
「Save」ボタンをクリックすると elastalert/rulesディレクトリに
Rule nameのyamlファイル(ここではtest.yaml)が作成されます。
3.PNG
4.PNG
Delete ruleボタンを押すと確認ダイアログが出ますので
OKを押すとelastalert/rulesディレクトリから該当の
ルールファイルが削除されます。
5.PNG
削除確認ダイアログ
6.PNG

Praeco

メンテナー:John Susek、Naoyuki Sano
ライセンスは、GNU General Public License v3.0
1.8.2 (2021/03/19)

Praeco (ElastAlert GUI) を Helm で Kubernetes にインストールする (Beta)
Praeco + ElastAlert2.0 + ES7.x 構成の不具合対応方法
Praeco (ElastAlert GUI)でElasticsearchログアラートする
Praeco、ElastAlertServer、Hiveなど(英語)

・Praecoでは、ElastAlert Kibana Pluginの開発元のBitSensorが開発したElastAlert ServerをForkしたjohnsusek/elastalert-serverを使用している。Python3 + ElastAlert 0.2.4対応や独自の修正をしているようです。
・Praecoを使用することでGUIベースでElastAlertを操作して、
 Elasticsearchのログからアラート通知設定ができる。
・アラートルール設定
・アラート履歴
 → 1.0.1では何も表示されません。1.1.0で修正されました(2020/6/17確認)
・クエリ履歴
・一定期間のアラートルールの無効化
・Elasticsearch 7対応(0.4.2~)
・アラート通知先はSlack、Email、HTTP POST、Telegram、Jira、MS Teams、Mattermost、Command、Line Notify、Gitter、Zabbix、SNS、Twilio、PagerTree、Exotel、GoogleChat、Stomp、VictorOps、ServiceNow、Chatwork、Discord、TheHive、Alertaの設定がある
・Rule Typeは、Percentage MatchとSpike Aggregationは対応しない。
Add "Percentage Match" rule type #82
Add "Spike Aggregation" rule type #228

Dockerイメージ

Dockerイメージ名 タグ Praeco 備考
praecoapp/praeco latest 1.8.2
daichi703n/praeco 0.3.5 1.0.1 daichi703n/praeco (GitHub)
mkdir Dockerfiles
touch Dockerfiles/Dockerfile.elastalert
mkdir -p es/config
touch es/config/elasticsearch.yml
mkdir -p es/data
chmod 777 es/data
mkdir -p kibana/config
touch kibana/config/kibana.yml
mkdir -p praeco/bin
touch praeco/bin/elastalert-start.sh
touch praeco/bin/elastic_search_status.sh
mkdir -p praeco/config
mkdir -p praeco/nginx_config
mkdir -p praeco/public
mkdir -p praeco/public/js
mkdir -p praeco/rule_templates
chmod 777 praeco/rule_templates
mkdir -p praeco/rules
chmod 777 praeco/rules
cd praeco/rules
wget https://raw.githubusercontent.com/johnsusek/praeco/master/rules/BaseRule.config
cd ../
cd praeco/config
wget https://raw.githubusercontent.com/johnsusek/praeco/master/config/api.config.json
wget https://raw.githubusercontent.com/johnsusek/praeco/master/config/elastalert.yaml
cd ../
cd nginx_config
wget https://raw.githubusercontent.com/johnsusek/praeco/master/nginx_config/default.conf
wget https://raw.githubusercontent.com/johnsusek/praeco/master/nginx_config/nginx.conf
cd ../
cd public
wget https://raw.githubusercontent.com/johnsusek/praeco/master/public/praeco.config.json
cd ../../

docker-compose up -d

praeco.PNG

/home/ユーザー名/dkwork/es/
|--docker-compose.yml
|--Dockerfiles
|  |--Dockerfile.elastalert
|--es
|  |--config
|  |  |--elasticsearch.yml
|  |--data
|
|--kibana
|  |--config
|  |  |--kibana.yml
|
|--praeco
| |--bin
| |  |--elastalert-start.sh
| |  |--elastic_search_status.sh
| |--config
| |  |--api.config.json
| |  |--elastalert.yaml
| |--public
| |  |--praeco.config.json
| |--rule_templates
| |--rules
| |  |--BaseRule.config
Dockerfiles/Dockerfile.elastalert
FROM johnsusek/elastalert-server:latest

USER root

RUN apk update && \
    apk add bash curl && \
    rm -rf /var/cache/apk/*

ADD praeco/bin/elastalert-start.sh /usr/local/bin/
ADD praeco/bin/elastic_search_status.sh /usr/local/bin/

RUN chmod +x /usr/local/bin/elastalert-start.sh 
RUN chmod +x /usr/local/bin/elastic_search_status.sh

USER node

ENTRYPOINT ["/usr/local/bin/elastalert-start.sh"]
praeco/bin/elastic_search_status.sh
#!/bin/bash

set -e

if [ $# -gt 0 ]; then
  ES_URL="$1"
elif [[ -n $ELASTICSEARCH_URL ]]; then
  ES_URL="$ELASTICSEARCH_URL"
elif [[ -n $ES_HOST ]] && [[ -n $ES_PORT ]]; then
  ES_URL="http://$ES_HOST:$ES_PORT"
else
  ES_URL="http://elasticsearch:9200"
fi

until [[ "$(curl -fsSL "$ES_URL/_cat/health?h=status" | sed -r 's/^[[:space:]]+|[[:space:]]+$//g')" =~ ^(yellow|green)$ ]]; do
  # printf '+' >&2
  sleep 1
done

echo "Elasticsearch is up and healthy at "$ES_URL"" >&2
praeco/bin/elastalert-start.sh
#!/bin/bash

set -e

echo "Giving Elasticsearch at $ELASTICSEARCH_URL time to start..."

elastic_search_status.sh

echo "Starting ElastAlert!"
npm start
es/config/elasticsearch.yml
cluster.name: "docker-cluster"
network.host: 0.0.0.0
discovery.zen.minimum_master_nodes: 1
kibana/config/kibana.yml
server.name: kibana
server.host: "0"
elasticsearch.hosts: http://elasticsearch:9200
xpack.monitoring.ui.container.elasticsearch.enabled: true
docker-compose.yml
version: "3.7"
services:
  elasticsearch:
    container_name: elasticsearch
    image: docker.elastic.co/elasticsearch/elasticsearch:7.7.0
    ports:
      - 9200:9200
      - 9300:9300
    environment:
      - ES_JAVA_OPTS=-Xms256m -Xmx512m
      - discovery.type=single-node
    restart: always
    volumes:
      - ./es/data:/usr/share/elasticsearch/data
      - ./es/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
    healthcheck:
        test: ["CMD-SHELL", "curl -f http://localhost:9200 || exit 1"]
        interval: 30s
        timeout: 15s
        retries: 3
        start_period: 180s

  kibana:
    container_name: kibana
    image: docker.elastic.co/kibana/kibana:7.7.0
    ports:
      - 5601:5601
    depends_on:
      - elasticsearch
    restart: always
    volumes:
      - ./kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml
    healthcheck:
        test: ["CMD-SHELL", "curl -f http://localhost:5601/api/status || exit 1"]
        interval: 30s
        timeout: 15s
        retries: 3
        start_period: 200s

  elastalert:
    container_name: elastalert
    build:
      context: .
      dockerfile: Dockerfiles/Dockerfile.elastalert
    image: elastalert-server:1.1.0
    ports:
      - 3030:3030
      - 3333:3333
    depends_on:
      - elasticsearch
    restart: always
    volumes:
      - ./praeco/config/elastalert.yaml:/opt/elastalert/config.yaml
      - ./praeco/config/api.config.json:/opt/elastalert-server/config/config.json
      - ./praeco/rules:/opt/elastalert/rules
      - ./praeco/rule_templates:/opt/elastalert/rule_templates
    healthcheck:
        test: ["CMD-SHELL", "curl -f http://localhost:3030 || exit 1"]
        interval: 30s
        timeout: 15s
        retries: 3
        start_period: 200s

  praeco:
    container_name: praeco
    image: johnsusek/praeco:latest
    ports:
      - 8080:8080
    depends_on:
      - elastalert
    restart: always
    volumes:
      - ./praeco/public/praeco.config.json:/var/www/html/praeco.config.json
    healthcheck:
        test: ["CMD-SHELL", "curl -f http://localhost:8080 || exit 1"]
        interval: 30s
        timeout: 15s
        retries: 3
        start_period: 200s

以下のファイルはPraecoのサイトの物を使用
https://github.com/johnsusek/praeco
・praeco/config/api.config.json
・praeco/config/elastalert.yaml
・praeco/public/praeco.config.json
・praeco/rules/BaseRule.config

Open Distro for Elasticsearch

開発元:AWS
ライセンスは、Apache License 2.0
「Elasticsearch」の独自ディストリビューション
1.13.1 (2021/03/04。ElastcsearchとKibanaのバージョンは7.10.2)
amazon/opendistro-for-elasticsearch
amazon/opendistro-for-elasticsearch-kibana

画面を動かしてみて気づいた点(バージョン1.3.0)

・ログイン画面がある
 初期ユーザー/パスワードは、admin/admin

・X-PackのIndex managementのように画面でIndexの削除するのは、現在のバージョンではできない?

・X-PackのIndex Lifecycle Management(ILM)のような機能は設定するyamlを画面で編集できる機能のようです。

・アラートの設定を画面でできる
Amazon Elasticsearch ServiceのAlertingを使ってAWS ConsoleLoginを監視してみた

・CSV/PDFファイルに出力機能は、まだ実装されていない
PDF Generation and reporting #16

以下は、まだ未確認

・Elastic社のKibana 7.4.2で作成したダッシュボードをImportできるか。また7.4.2より上のバージョンの場合はどうなるか。

・FluentdのElastcsearchプラグインの設定で、Index Lifecycle Management(ILM)に関する設定は利用できないはずなので設定がある場合はコメントにして動作確認する必要がありそう

・FluentdのX-Packに関するプラグインはアンインストールして動作確認する必要がありそう

・Fluentd、Metricbeat、Filebeat、Heartbeat、Logstashは、まだ情報が少ないので情報をもとに動く設定を調査して使用するかよく検討する必要がありそう。

Security
https://opendistro.github.io/for-elasticsearch-docs/docs/security-configuration/
https://opendistro.github.io/for-elasticsearch-docs/docs/security-access-control/
https://opendistro.github.io/for-elasticsearch-docs/docs/security-audit-logs/

Alerting
https://opendistro.github.io/for-elasticsearch-docs/docs/alerting/

SQL
https://opendistro.github.io/for-elasticsearch-docs/docs/sql/

Index State Management(ISM)
X-PackのIndex Lifecycle Management(ILM)のような機能
https://opendistro.github.io/for-elasticsearch-docs/docs/ism/

KNN
https://opendistro.github.io/for-elasticsearch-docs/docs/knn/

Anomaly Detection (Alpha)
https://opendistro.github.io/for-elasticsearch-docs/docs/ad/

Performance Analyzer
https://opendistro.github.io/for-elasticsearch-docs/docs/pa/

Root Cause Analysis (Alpha)
https://opendistro.github.io/for-elasticsearch-docs/docs/rca/

Fluentd
Fluentd support
Self-signed Certificate verify failed (Fluend + Open Distro for Elasticsearch) #597

Beats
Trying out Open Distro for Elasticsearch with LogstashFilebeat connection issue
Integration with beats
Unable to index filebeat logs with LogStash #136
filebeat 6.5.4 output to elasticsearch #21
Metricbeat User Permission
Configuring OSS Beats (File/Metric) with opendistro
Alerting using metricbeat parameters #13
Logstash intergration

新登場 – Open Distro for Elasticsearch
AWSのOpen Distro for Elasticsearchに異議を唱えるベンダたち
AWSがElasticsearchの新ディストリビューションをApacheライセンスで公開
Open Distro for Elasticsearchを作ってみた!
Open Distro for Elasticsearch Kickstart guide
[アップデート] Amazon Elasticsearch Service でアラート機能がサポートされました

Grafana

読み方は、グラファナ
開発元:Grafana Labs
ライセンスは、Apache License 2.0
7.4.5 (2021/03/18)

5.2.0からElasticsearch内のデータに対するアラート通知が可能になっている。

Alerting
Alert Notifications
DingDing
Discord
Email
Google Hangouts Chat
Hipchat
Kafka
Line
Microsoft Teams
OpsGenie
Pagerduty
Prometheus Alertmanager
Pushover
Sensu
Slack
Squadcast
Telegram
Threema
VictorOps
Webhook
Creating alert that can send SNMP Trap as a notification

That is not supported right now

Email
Grafanaでアラート時通知を設定する
Grafana Eメール通知設定
Grafanaのメール設定で詰まった話
Grafana でメール通知

Slack
BLE経由で取得したデータの 可視化(Grafana) & アラート通知(Slack) を実施
Grafana で Elasticserch に蓄積したサーバーメトリクスの可視化+アラートのSlack通知環境を構築してみた (ニフクラ)
Prometheus+Grafanaでパフォーマンス監視をしています

Discord
Grafana5.2.0+でElasticsearch内のデータに対するAlertingを実行し、Discordに通知する

Teams
Prometheusのすすめ - Grafana で AlertをTeamsに通知するのは簡単です

webhook
Prometheus2とGrafana6によるシステム監視 GrafanaのAlertを使う

7. Elastalert UI

ライセンスは、Apache License 2.0
メンテナンス終了。GitHubの最終更新日は2018/02/12

16
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
16
Help us understand the problem. What is going on with this article?