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

## X-PackのWatcher Alert

開発元：Elastic
有償

[Watcherを始めてみよう](https://www.elastic.co/guide/jp/x-pack/current/watcher-getting-started.html)

[Elasticsearchのアラート検知プラグイン「Watcher」を使ってみた](https://dev.classmethod.jp/cloud/aws/using-elasticsearch-plugin-watcher/)
[Elastic Stack Alertingではまったことと対処方法](https://qiita.com/zon_zone/items/93cda732d6c1ce74b8a3)
[Elastic Stack を使った予兆検知結果の可視化 〜検知した異常の通知〜](https://houwa-js.co.jp/blog/2020/02/20200204/)
[Elasticsearchのプラグイン「Shield」「Watcher」による不正アクセス監査](https://qiita.com/datake914/items/4a0fe7430b1ac3998302)
[Elastic StackのX-Packを試す（Watcher編）](https://dev.classmethod.jp/articles/elastic-stack-x-pack-watcher/)


## [X-PackのAlerting and action settings in Kibana](https://www.elastic.co/guide/en/kibana/current/alert-action-settings-kb.html)

開発元：Elastic

https://www.elastic.co/guide/en/kibana/current/alerting-getting-started.html

## [Kibana alerts](https://www.elastic.co/guide/en/kibana/current/kibana-alerts.html#kibana-alerts)

Elastic StackをPrometheusとFluentdと組み合わせてKubernetesを監視する
https://www.elastic.co/jp/blog/monitoring-kubernetes-with-the-elastic-stack-using-prometheus-and-fluentd
>Prometheusのデプロイでは、Alertmanagerは無効にしていました。Elastic Stackにログ、メトリックを収集した場合、Alertmanagerの代わりにKibana Alertを使ってアラーティングを実装することができます。Prometheusからのメトリックだけではなく、ログでも他のインデックスでも、Elasticsearchに格納されているデータは全て活用することができますし、機械学習を使ったより高度なアラーティングも可能になります。

## [ElastAlert](https://github.com/Yelp/elastalert)

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

・コマンド・設定ファイル(YAML)ベースでの動作のみ。
・0.2.0b2よりElasticsearch 7.xに対応。
・0.2.0よりPython3対応。
・バグ修正や機能追加は今後ありません。
・Python 3.9以降は動きません。
・Elasticsearch 8に対応していません。
[Please don't let this die. ElastAlert usecase is very strong. #2947](https://github.com/Yelp/elastalert/issues/2947)
[Should someone else maintain this? #2946](https://github.com/Yelp/elastalert/issues/2946)
[Status of the elastalert project #2911](https://github.com/Yelp/elastalert/issues/2911)

**AWSのOpenSearch**

- 対応していない。正常に動かない<br>(内部のElasticsearch バージョンは7.10.2だが、バージョンを1.0.0と返してしまう。バージョンチェックでElasticsearch 5の処理にいってしまう)
- ElastAlert2は対応を開始した。

**ElasticsearchのBearer認証**

- 対応していない。
- ElastAlert2は対応してる。

**ElasticsearchのApiKey認証**

- 対応していない。
- ElastAlert2は対応してる。

**ElasticsearchのProxy接続**

[Missing proxy configuration feature](https://github.com/Yelp/elastalert/issues/2017)

- 対応していない。
- ElastAlert2も対応していない。

**Python 3.9以降は動きません。**

[blist no longer works in Python 3.9](https://github.com/Yelp/elastalert/issues/2983)
[Elastalert is broken on python3.9 through blist dependency](https://github.com/Yelp/elastalert/issues/3092)

- ElastAlert2は対応してる。

**AWS SNSは、以下のように書かないと動かない**

```yaml
    alert:
      - sns:
          aws_region: 'us-east-1'
    sns_topic_arn: 'arn:aws:sns:us-east-1:123456789:somesnstopic'
    aws_access_key_id: 'XXXXXXXXXXXXXXXXXX'
    aws_secret_access_key: 'YYYYYYYYYYYYYYYYYYYY'
```

**検索結果が 10,000 件を超える場合、検索結果画面での件数表示は 10,000 件以上と表示**

track_total_hitsをtrueに設定すると10,000hits以上を検索できるようになるが、現在の実装ではtrack_total_hitをtrueにする設定変更をサポートしていない

[Elasticsearchを7.Xにアップグレードしたら、hitsが10,000 になってた](https://qiita.com/take333/items/b615bd6b5a6aebde82e3)

**blacklist、whitelistに1024の制限がある**

[Blacklist filter with 10.000+ terms is extremely slow](https://github.com/Yelp/elastalert/issues/1867)
["Failed to parse query" for blacklist rule when file contains more than 1024 entries](https://github.com/Yelp/elastalert/issues/2704)
[blacklist line limit](https://github.com/Yelp/elastalert/issues/3015)

**Emailアラートの制限**

- Microsoft 365(旧名称Office 365)はfrom_addrに設定に対応していません。to,cc,bccに指定は問題無し。
- Gmailをfrom_addrに設定する場合、Googleの設定で安全性の低いアプリのアクセスを有効にしないとメールの送信ができません。

**KibanaのDashboard関連は正常に動きません**

内部のロジックで`kibana-int`というインデックスを参照していますが、現在のElaticsearchでは`.kibana*`という名前なのでプログラムを修正しないと動きません。
それとDashboard関係のロジックがElasticsearch 7対応していません。

- elastalert-rule-from-kibana
- use_kibana_dashboard
- use_kibana4_dashboard
- kibana4_start_timedelta
- kibana4_end_timedelta
- download_dashboard

download_dashboardのドキュメントに不備があります。
https://elastalert.readthedocs.io/en/latest/recipes/writing_filters.html#loading-filters-directly-from-kibana-3
https://github.com/Yelp/elastalert/issues/1481

現在の記載

```
filter:
  download_dashboard: "My Dashboard Name"
```

正しい記載

```
filter:
  - term:
      download_dashboard: "My Dashboard Name"
```

#### ElastAlertのアラート通知先
https://elastalert.readthedocs.io/en/latest/ruletypes.html#alerts

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

#### ElastAlert Server Dockerイメージ

ElastAlert Serverが今後もメンテナンスされるのか不安がある。
[bitsensor/elastalert](https://github.com/bitsensor/elastalert)はメンテナンスしていない状況。
[johnsusek/elastalert-server](https://github.com/johnsusek/elastalert-server)をforkして独自でメンテナンスしていくことが発生することも考えて採用を考えたほうがいいと思います。
・新しいNode.jsへの対応。
・Elasticserachメジャーバージョンアップ対応(直近だと8.x)
・ElastAlert2を使う場合、praecoapp/elastalert-serverとkarql/elastalert2-server以外の選択肢はない。

| Dockerイメージ名    | タグ | ElastAlert |    備考    |
|:-------------------|:----:|:----------:|:-----------|
|[bitsensor/elastalert](https://hub.docker.com/r/bitsensor/elastalert/)|2.0.1 |0.1.39|Elastcserach 7.xで問題が発生|
|[bitsensor/elastalert](https://hub.docker.com/r/bitsensor/elastalert/)|lastet|0.1.39|Elastcserach 7.xで問題が発生|
|[bitsensor/elastalert](https://hub.docker.com/r/bitsensor/elastalert/)|3.0.0-beta.0|0.2.0b2||
|[bitsensor/elastalert](https://hub.docker.com/r/bitsensor/elastalert/)|3.0.0-beta.1|未確認||
|[servercentral/elastalert](https://hub.docker.com/r/servercentral/elastalert)|latest|0.2.1|bitsensor/elastalertフォーク|
|[daichi703n/elastalert](https://hub.docker.com/r/daichi703n/elastalert)|0.2.1-dev2|0.2.1+bugfix|servercentral/elastalertフォーク<br>jfcantu/elastalert:v0.1.1のイメージ使用？。その他のバグ修正は以下のサイトを参照。<br>[Praeco + ElastAlert2.0 + ES7.x 構成の不具合対応方法](https://designetwork.daichi703n.com/entry/2020/02/10/praeco-elastalert-issue-with-es7)<br>[daichi703n/elastalert-server (GitHub)](https://github.com/daichi703n/elastalert-server)|
|[karql/elastalert2-server](https://hub.docker.com/r/karql/elastalert2-server)|latest|ElastAlert2 2.15.0|bitsensor/elastalertフォーク<br>node.jsからTypeScriptに変更している|
|[praecoapp/elastalert-server](https://hub.docker.com/r/praecoapp/elastalert-server)|latest|ElastAlert2 2.15.0|servercentral/elastalertフォーク<br>Praeco用ElastAlert Serverの最新版<br>Elasticsearch 8対応|

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

circuit_breaking_exceptionが発生することがある
→ElasticSearchのヒープサイズ変更
→ElasticSearch
indices.breaker.total.limit変更
→ElasticSearchのIndexデータ削除、or 不要Indexデータのクローズ
[Elasticsearchのインデックス開きすぎによるヒープメモリ枯渇](http://n-agetsuma.hatenablog.com/entry/2017/12/06/000000)
[elastalert feels very unhappy (circuit_breaking_exception, Data too large) #2485](https://github.com/Yelp/elastalert/issues/2485)
[circuit_breaking_exception, Data too large #349](https://github.com/Cyb3rWard0g/HELK/issues/349)
[After Upgrade to 6.2.4 Circuitbreaker Exception Data too large #31197](https://github.com/elastic/elasticsearch/issues/31197)
[Elastalert deployment failed](https://stackoverflow.com/questions/59014095/elastalert-deployment-failed)

#### 参考URL

[Elastic StackによるKubernetesモニタリングシステムの紹介](https://developers.freee.co.jp/entry/monitoring-kubernetes-elastic-stack)
[ElastAlert による Elasticsearch のインデックス監視・通知](https://dev.classmethod.jp/server-side/elasticsearch/elastalert/)
[elastalertでアプリの異常を自動検知して通知したい](https://qiita.com/AknYk416/items/e9e0e2132f6996735ec9)
[elastalert – ElasticSearchによる簡単で柔軟なアラート](https://githubja.com/yelp/elastalert)
[ElastAlertでカスタムルールを作成する](https://qiita.com/perceptron01/items/994e01b1fc0ad121c27b)
[ElasticSearch + Elastalertでエラーログ検出時に通知したい](https://qiita.com/iaoiui/items/ea512336c4dd738bf45a)
[ElastAlertの監視ルールを拡張してすこしだけ幸せになる](https://qiita.com/ihsiek/items/e8e89b274e99e48067a2)
[Elasticsearchを活用したサービス監視ですこしだけ幸せになる](https://qiita.com/ihsiek/items/9ff4f4c56280aa99760b)
[AWS ElasticSearch ServiceのログをElastAlertで監視する](https://qiita.com/Morix1500/items/d7c2c54b8914c7144ec3)
[twitter -> fluentd -> elasticsearch -> elastalert -> slackで、エゴサをしたい人生だった。](https://qiita.com/jumitaka/items/a482e1d1b25f0c62c4c1)
[elastalertを利用したslackへのアラート](https://qiita.com/sakoken/items/98349e6f765bb17906e7)
[Alerting on Kubernetes Events with EFK Stack](https://akomljen.com/alerting-on-kubernetes-events-with-efk-stack/)
[ElastAlert: Alerting At Scale With Elasticsearch, Part 1](https://engineeringblog.yelp.com/2015/10/elastalert-alerting-at-scale-with-elasticsearch.html)
[Using Elastalert to monitor disk growth](https://medium.com/gamma-analytics-engineering/using-elastalert-to-monitor-disk-growth-ebf4b7e11d12)

#### サンプル

[elastalert/example_rules](https://github.com/Yelp/elastalert/tree/master/example_rules)
[andromedarabbit/elastalert-rule.yaml](https://gist.github.com/andromedarabbit/4bcd790f2eca7bca6ddf54c7b49e5f35)
[elastalertを利用したslackへのアラート](https://gist.github.com/sakoken/db41b3892fbe537f4ae66bf6e08dc016)

[Elastalert rule for CPU usage in percentage](https://stackoverflow.com/questions/52833182/elastalert-rule-for-cpu-usage-in-percentage/52834750#52834750)
[Elastalert-Regel ausgeführt: IOError: [Errno 2] Keine solche Datei oder Verzeichnis: 'config.yaml'](https://de.switch-case.com/68304550)
[ELK: ElastAlert for alerting based on data from ElasticSearch](https://fabianlee.org/2017/04/16/elk-elastalert-for-alerting-based-on-data-from-elasticsearch/)
[manankalra/elastalert-tutorial](https://github.com/manankalra/elastalert-tutorial/tree/master/rules)
 ・elastalert_cpu_watch.yaml
 ・elastalert_filesystem_watch.yaml
 ・elastalert_memory_watch.yaml

## ElastAlertのフォーク

**[BigDataBoutique/elastalert](https://github.com/BigDataBoutique/elastalert)**

- ElastAlert 0.2.4ベース
- crontrigger, must_notなどを追加している。
- Python 3.9以降は動きません。
- Elasticsearch 8に対応していません。

**[auto1-oss/elastalert](https://github.com/auto1-oss/elastalert)**

- ElastAlert 0.2.1ベース
- auto resolve alert、generate_kibana6_linkなどを追加している。
- Python 3.9以降は動きません。
- Elasticsearch 8に対応していません。

**[sherifabdlnaby/elastalert](https://github.com/sherifabdlnaby/elastalert)**
[v0.4.0](https://github.com/sherifabdlnaby/elastalert/commits/v0.4.0)

- ElastAlert 0.2.1ベース
- Jinja2 Optionsなどを追加している。
- Python 3.9以降は動きません。
- Elasticsearch 8に対応していません。

**[JasperJuergensen/elastalert](https://github.com/JasperJuergensen/elastalert)**

- ElastAlert 0.2.4ベース
- Python 3.9以降は動きません。
- Elasticsearch 8に対応していません。

v0.3.0 (2020/6/20)
https://github.com/JasperJuergensen/elastalert/blob/master/changelog.md

>Restructure
>　Ruletypes in their own module instead of one file
>　Alerter in their own module instead of one file
>　Enhancements in their own module instead of one file
>　Loaders in their own module instead of one file
>　New global config Object instead of a dictionary
>Added
>　MAAS rule
>　New metrics for spike and spike metric aggregation rule
>　Correlation rule
>　Queries
>　Rule class which covers some functionality previously the elastalerter object had
>　EARuntimeException for exceptions during the execution of a rule
>　EAConfigExceptions for exceptions raised during the configuration phase of a rule
>Fixed
>　Fixed spike metric aggregation rule windows

[jsonar/elastalert](https://github.com/jsonar/elastalert)

- ElastAlert 0.1.35ベース
- Python 3.8、elasticsearch-pyバージョンアップなど
- Python 3.9以降は動きません。
- Elasticsearch 8に対応していません。

## [ElastAlert2](https://github.com/jertel/elastalert2)

メンテナー：Jason Ertel
オリジナルのYelp/elastalertに無い機能があります。
ライセンスは、Apache License 2.0
2.15.0 (2023/11/25)
https://pypi.org/project/elastalert2/

・コードのリファクタリング、テストコードの追加。
・Python 3.9以降に対応している。
・Elasticsearch 7, 8, Opensearchに対応
・アラート通知先にDatadog、Discord、Chartwork、Dingtalk、Rocket.Chat、Amazon SES、Tencent SMS、Alertmanager、HTTP POST 2などが追加されている。
・多数のバグ修正(Line Notify、Stomp、Zabbix、Pagertreeは正常に動作。AWS SNSのバグ修正など)
・Dockerイメージ、 Helm chartも提供しています。

https://elastalert2.readthedocs.io/en/latest/

## [ElastAlert Kibana Plugin](https://github.com/bitsensor/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について思っていること

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

#### Kibana 6.8.1～6.8.10、7.5.1～7.9.3、7.10.0～8.5.3

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](https://github.com/bitsensor/elastalert-kibana-plugin/issues/117)
[Can't install elastalert-kibana-plugin-1.0.3-6.8.0.zip to Kibana 6.8.3 #123](https://github.com/bitsensor/elastalert-kibana-plugin/issues/123)

#### Kibana 7.5.1～7.8.1で動きます

[elastalert-kibana-plugin-1.1.0-7.5.0.zip](https://github.com/bitsensor/elastalert-kibana-plugin/releases/download/1.1.0/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の差し替えも必要です。

[Plugin elastalert-kibana-plugin [7.5.0] is incompatible with Kibana [7.5.1] #139](https://github.com/bitsensor/elastalert-kibana-plugin/issues/139)
[Plugin is incompatible with Kibana 7.6.0 #141](https://github.com/bitsensor/elastalert-kibana-plugin/issues/141)
[[Legacy] Route payload must be set to 'parse' when payload validation enabled #57777](https://github.com/elastic/kibana/issues/57777)
[update elasticsearch to 7.6.2; also, fix issue idaholab#119](https://github.com/mmguero-dev/Malcolm/commit/b38ddb7f0d4c5b03e6f8ccad58a656644e113b19)

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

Kibana 7.5.1～7.8.1のDockerイメージの作成方法は別記事を書きました
[elastalert-kibana-pluginをインストールした状態のDockerイメージを作成する方法](https://qiita.com/rururu_kenken/items/e53a0cb264c76341ba85)

#### 以下は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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208807/4c9b86f4-973a-9623-4140-adf476888044.png)
![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208807/23ce2a33-d09d-2d4c-c549-92e1e5c8899a.png)
「Save」ボタンをクリックすると elastalert/rulesディレクトリに
Rule nameのyamlファイル(ここではtest.yaml)が作成されます。
![3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208807/3b3c4209-ca3a-e874-20e1-f3221d719b24.png)
![4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208807/825f3ece-3626-0f06-8159-3853644ed4d9.png)
Delete ruleボタンを押すと確認ダイアログが出ますので
OKを押すとelastalert/rulesディレクトリから該当の
ルールファイルが削除されます。
![5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208807/15840530-5352-9c2f-0231-af9edc0299ce.png)
削除確認ダイアログ
![6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208807/8f1d01ce-55c1-d190-e8a0-7eaa0fc953ca.png)

## [Praeco](https://github.com/johnsusek/praeco)

メンテナー：John Susek、Naoyuki Sano
ライセンスは、GNU General Public License v3.0
1.8.18 (2024/01/04)

[Praeco (ElastAlert GUI) を Helm で Kubernetes にインストールする (Beta)](https://designetwork.daichi703n.com/entry/2020/02/24/praeco-helm-kubernetes)
[Praeco + ElastAlert2.0 + ES7.x 構成の不具合対応方法](https://designetwork.daichi703n.com/entry/2020/02/10/praeco-elastalert-issue-with-es7)
[Praeco (ElastAlert GUI)でElasticsearchログアラートする](https://designetwork.daichi703n.com/entry/2019/03/24/Praeco-ElastAlert-GUI)
[Praeco、ElastAlertServer、Hiveなど(英語)](https://medium.com/@ibrahim.ayadhi/hello-and-welcome-to-our-new-article-which-will-be-covering-the-alerting-part-in-our-socaas-136cf6258c49)

・Praecoでは、ElastAlert Kibana Pluginの開発元のBitSensorが開発した[ElastAlert Server](https://github.com/bitsensor/elastalert)をForkした[johnsusek/elastalert-server](https://github.com/johnsusek/elastalert-server)を使用している。
・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, Datadog、AWS SES、Rocket.Chatの設定がある
・Rule Typeは、Percentage MatchとSpike Aggregationは対応しない。
[Add "Percentage Match" rule type #82](https://github.com/johnsusek/praeco/issues/82)
[Add "Spike Aggregation" rule type #228](https://github.com/johnsusek/praeco/issues/228)
・ElastAlert Serverが、Amazon Elasticsearch Serviceの接続に対応できていない。

#### Dockerイメージ

| Dockerイメージ名    | タグ | Praeco |    備考    |
|:-------------------|:----:|:----------:|:-----------|
|[praecoapp/praeco](https://hub.docker.com/r/praecoapp/praeco)|latest|1.8.11||

```console
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208807/4cf80b2a-6a0c-982f-51d4-0b00d75f3158.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

## [OpenSearch](https://opensearch.org/)

2.4.1 (2022/12/03)
開発元：AWS

[AmazonはElasticsearchのフォークをOpenSearchにブランド変更](https://www.infoq.com/jp/news/2021/05/amazon-opensearch/)
[AWS、ElasticsearchとKibanaのフォークによる「OpenSearch」プロジェクトを発表。Elasticとの溝は埋まらないまま](https://www.publickey1.jp/blog/21/awselasticsearchkibanaopensearchelastic.html)
[ElasticのクライアントライブラリがAWS OpenSearchへの接続を排除。AWSは仕方なくクライアントライブラリのフォークを発表](https://www.publickey1.jp/blog/21/elasticaws_opensearchaws.html)

## [Open Distro for Elasticsearch](https://opendistro.github.io/for-elasticsearch/)

>Open Distro for Elasticsearch development has moved to OpenSearch. The ODFE plugins will continue to work with legacy versions of Elasticsearch OSS, but we recommend upgrading to OpenSearch to take advantage of the latest features and improvements.


■google翻訳
Elasticsearch開発用のOpenDistroはOpenSearchに移動しました。 ODFEプラグインはElasticsearchOSSのレガシーバージョンで引き続き機能しますが、最新の機能と改善点を利用するには、OpenSearchにアップグレードすることをお勧めします。
https://opendistro.github.io/for-elasticsearch-docs/


開発元：AWS
ライセンスは、Apache License 2.0
「Elasticsearch」の独自ディストリビューション
1.13.2 (2021/04/07。ElastcsearchとKibanaのバージョンは7.10.2)
[amazon/opendistro-for-elasticsearch](https://hub.docker.com/r/amazon/opendistro-for-elasticsearch)
[amazon/opendistro-for-elasticsearch-kibana](https://hub.docker.com/r/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を監視してみた](https://qiita.com/hssh2_bin/items/06550d437ceb095a139c)

・CSV/PDFファイルに出力機能は、まだ実装されていない
[PDF Generation and reporting #16](https://github.com/opendistro-for-elasticsearch/community/issues/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](https://discuss.opendistrocommunity.dev/t/fluentd-support/462)
[Self-signed Certificate verify failed (Fluend + Open Distro for Elasticsearch) #597](https://github.com/uken/fluent-plugin-elasticsearch/issues/597)

Beats
[Trying out Open Distro for Elasticsearch with Logstash](https://medium.com/@sjoerdsmink/trying-out-open-distro-for-elasticsearch-with-logstash-8cc8be3e1e84)[Filebeat connection issue](https://discuss.opendistrocommunity.dev/t/filebeat-connection-issue/437)
[Integration with beats](https://discuss.opendistrocommunity.dev/t/integration-with-beats/236)
[Unable to index filebeat logs with LogStash #136](https://github.com/opendistro-for-elasticsearch/community/issues/136)
[filebeat 6.5.4 output to elasticsearch #21](https://github.com/opendistro/for-elasticsearch-docs/issues/21)
[Metricbeat User Permission](https://discuss.opendistrocommunity.dev/t/metricbeat-user-permission/291)
[Configuring OSS Beats (File/Metric) with opendistro](https://discuss.opendistrocommunity.dev/t/configuring-oss-beats-file-metric-with-opendistro/1349)
[Alerting using metricbeat parameters #13](https://github.com/opendistro-for-elasticsearch/alerting-kibana-plugin/issues/13)
[Logstash intergration](https://discuss.opendistrocommunity.dev/t/logstash-intergration/501/4)

[新登場 – Open Distro for Elasticsearch](https://aws.amazon.com/jp/blogs/news/new-open-distro-for-elasticsearch/)
[AWSのOpen Distro for Elasticsearchに異議を唱えるベンダたち](https://www.infoq.com/jp/news/2019/08/open-distro-elasticsearch/)
[AWSがElasticsearchの新ディストリビューションをApacheライセンスで公開](https://dev.classmethod.jp/cloud/aws/open-distro-for-elasticsearch/)
[Open Distro for Elasticsearchを作ってみた！](https://qiita.com/hssh2_bin/items/4024a830db6676ad74d1)
[Open Distro for Elasticsearch Kickstart guide](https://devopstar.com/2019/03/13/open-distro-for-elasticsearch-kickstart-guide/)
[[アップデート] Amazon Elasticsearch Service でアラート機能がサポートされました](https://dev.classmethod.jp/cloud/aws/amazon-elasticsearch-service-support-alert/)

## [Grafana](https://grafana.com/)

読み方は、グラファナ
開発元：Grafana Labs
ライセンスは、Apache License 2.0
9.3.2  (2022-12-16)

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

[Alerting]
(https://grafana.com/docs/grafana/latest/alerting/)
[Alert Notifications](https://grafana.com/docs/grafana/latest/alerting/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](https://community.grafana.com/t/creating-alert-that-can-send-snmp-trap-as-a-notification/3042)
>That is not supported right now

**Email**
[Grafanaでアラート時通知を設定する](http://rennnosukesann.hatenablog.com/entry/2019/01/29/183645)
[Grafana Eメール通知設定](https://techexpert.tips/ja/grafana-ja/grafana-e%E3%83%A1%E3%83%BC%E3%83%AB%E9%80%9A%E7%9F%A5%E8%A8%AD%E5%AE%9A/)
[Grafanaのメール設定で詰まった話](https://qiita.com/shinfrom/items/46b6174879e97dcab568)
[Grafana でメール通知](https://tech-lab.sios.jp/archives/16759)

**Slack**
[BLE経由で取得したデータの 可視化(Grafana) & アラート通知(Slack) を実施](https://www.n-novice.com/entry/2019/01/16/000000)
[Grafana で Elasticserch に蓄積したサーバーメトリクスの可視化+アラートのSlack通知環境を構築してみた (ニフクラ)](https://data.nifcloud.com/blog/grafana-connectiong-to-an-elasticsearch/)
[Prometheus+Grafanaでパフォーマンス監視をしています](http://blog.keepdata.jp/entry/2018/05/08/103540)

**Discord**
[Grafana5.2.0+でElasticsearch内のデータに対するAlertingを実行し、Discordに通知する](https://qiita.com/j-yama/items/93fa16389f73e05981b8)

**Teams**
[Prometheusのすすめ - Grafana で AlertをTeamsに通知するのは簡単です](https://qiita.com/nekoneck/items/fe3253280d79254d919e)

**webhook**
[Prometheus2とGrafana6によるシステム監視 GrafanaのAlertを使う](https://gato.intaa.net/archives/20703)

## [Elastalert UI](https://github.com/steelheaddigital/elastalert-ui)

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