Dockerのメトリクス収集方法の調査

## 共通で考えること

・不要となったDockerイメージ、ボリュームの定期的な確認・削除。
　自動削除のジョブだと一時的に停止していたものまで削除してしまう危険がある。
　運用ルールを決めて自動化するか、目視確認して削除するのか決定する。

・Elastcsearch、Fluentdなどを冗長構成にするかどうか

## Prometheus + Grafana

Prometheus はプル型。
Prometheus がExporterの情報を指定した間隔で取得する。
データの可視化はGrafana

**ホストマシンとコンテナのメトリクス情報収集**

| 対象のメトリクス   |ツール名       | 
|:-----------------|:--------------|
| ホストマシン      | [Node Exporter](https://hub.docker.com/r/prom/node-exporter) |
| Dockerコンテナ    | [cAdvisor](https://hub.docker.com/r/google/cadvisor)      |

**Prometheusで収集した情報でアラートを通知するかの検討**

アラート通知するなら、Alertmanager。Dockerイメージも公開されている。
https://hub.docker.com/r/prom/alertmanager
　問題ないのにPrometheusでアラートとなる場合があるので、
　アラートを抑止する設定を行う必要が発生する場合もあります。

**アラート通知でSNMP Trapがある場合**

以下のいずれかで動作確認してどれを使うか検討
[kaija/webhook-snmp](https://github.com/kaija/webhook-snmp)
[chrusty/prometheus_webhook_snmptrapper](https://github.com/chrusty/prometheus_webhook_snmptrapper)
[SUSE/prometheus-webhook-snmp](https://github.com/SUSE/prometheus-webhook-snmp)
[maxwo/snmp_notifier](https://github.com/maxwo/snmp_notifier)

**Prometheusのexporter選定、導入方法の検討**

Dockerコンテナの稼働状況の監視は、Blackbox exporter
https://hub.docker.com/r/prom/blackbox-exporter

(1) その他のミドルウェアのExporterがあるかどうかは、公式サイト参照
https://prometheus.io/docs/instrumenting/exporters/

(2) DockerHubに対象のexporterがあるかの確認、および、動作確認

Dockerイメージが公開されていない場合、直接インストール、または、
自分でDockerイメージ作るかを検討

**Grafanaのダッシュボード選定、アラート機能を使うか検討**
https://grafana.com/grafana/dashboards

　・選択したexporterのダッシュボードが公開されているか
　・なければ自分でダッシュボードを作成することを検討
　・ダッシュボードに表示した値に対してアラートルールを
　　作成してアラート通知することが可能なので、使うかどうか検討

**冗長構成を組むか検討**

冗長構成にする場合、別々に2つのPrometheusを構築して、
同じ構成ファイルで動かす。詳細は、以下のサイトを参照。

[explaining a HA + scalable setup? #1500](https://github.com/prometheus/prometheus/issues/1500)
[Prometheusの冗長化について公式のスタンス](https://sqlazure.jp/r/prometheus/1498/)

**メトリクスを長期保存するかどうかの検討**

・デフォルトでは15日経過時点で削除される
・長期保存する場合は、Remote Storageを利用する
[Remote Endpoints and Storage](https://prometheus.io/docs/operating/integrations/#remote-endpoints-and-storage)
[Prometheus の Remote Storage とは?](https://qiita.com/kkohtaka/items/48acd647155ee0602804)

**参考URL**

[Prometheusで本番環境の監視をして3か月経ちました](https://tech.willgate.co.jp/entry/2019/07/12/180000)
[Kubernetesを監視する方法](https://www.scsk.jp/sp/sysdig/blog/prometheus/prometheus.html)
[大規模なPrometheusを使用した場合における課題](https://www.scsk.jp/sp/sysdig/blog/prometheus/prometheus_1.html)

[Prometheus on Dockerでデータを永続化する方法](https://qiita.com/Yusuke-Shimizu/items/baa08d2e27890a0f7b54)
[入門 Prometheus](https://speakerdeck.com/superbrothers/introduction-to-prometheus)
[Grafana Dashboards as Code](https://www.slideshare.net/takuyosh/grafana-dashboards-as-code)

[データセンターネットワークでのPrometheus活用事例](https://www.slideshare.net/techblogyahoo/prometheus-148831678)
[Micrometer/Prometheusによる大規模システムモニタリング](https://www.slideshare.net/techblogyahoo/micrometerprometheus-jsug-sf26)
[Cookpad and Prometheus](https://speakerdeck.com/rrreeeyyy/cookpad-and-prometheus)
[Prometheus at Preferred Networks](https://www.slideshare.net/pfi/prometheus-at-preferred-networks)
[AbemaTVにPrometheusというモニタリングシステムを導入した話](https://developers.cyberagent.co.jp/blog/archives/3814/)
[Prometheus monitoring from outside of Kubernetes  〜どうして我々はKubernetes上のPrometheusを破壊したのか〜](https://www.slideshare.net/whywaita/prometheus-monitoring-from-outside-of-kubernetes-kubernetesprometheus-prometheustokyo)


## Beats + Elasticsearch + Kibana

Push型
データの可視化は、Kibana

Metricbeatのみ動作確認しましたが、Metricbeatが指定した間隔で、
情報を収集して出力先に指定したElasticsearchに情報を送っているようです。

| やりたいこと            |ツール名        | 
|:-----------------------|:--------------|
| CPU,メモリ等の情報収集   | Metricbeat    |
| パケット情報収集        | Packetbeat    |
| 稼働状況の監視          | Heartbeat     |
| ログファイルの収集      | Filebeat      |
| Windowsのイベントログの収集 | Winlogbeat |
| 監査データの収集        | Auditbeat     |

Elastic社のDockerイメージ
https://hub.docker.com/u/elastic

Metricbeatの設定で、Dockerコンテナ、ミドルウェアの情報を収集することも可能
詳細は、公式サイトを参照
https://www.elastic.co/guide/en/beats/metricbeat/current/metricbeat-modules.html

Beatsのdocker-composeの例や設定ファイル(yaml)は公式のGitHubを参照
[elastic/beats](https://github.com/elastic/beats/tree/master/filebeat)
[beats/deploy/docker/](https://github.com/elastic/beats/tree/master/deploy/docker)
[beats/deploy/kubernetes/](https://github.com/elastic/beats/tree/master/deploy/kubernetes)

[Elastic Stackで簡単！Dockerコンテナ監視ダッシュボード作成](http://acro-engineer.hatenablog.com/entry/2018/12/20/120000)
[Elastic Stack, on Dockerを動かしてみた[Metricbeat編]](https://qiita.com/ryuichi1208/items/c23f3d2b9eba19569433)
[docker上で Filebeat nginx Module を使って nginxのlogをKibanaで表示させた](https://qiita.com/va034600/items/4cf599b3454286f77b6d)
[Elastic StackのAuditbeatで何ができるのかDockerでさくっと確認してみる](https://yomon.hatenablog.com/entry/2018/08/22/213840)
[Packetbeatを使ってみる - Kibanaを立ててみた](http://atsuizo.hatenadiary.jp/entry/2017/08/03/090000)
[Windows のイベントログを Winlogbeat+Elasticsearch+Kibana で可視化する](https://mseeeen.msen.jp/visualize-windows-event-log-winlogbeat-elasticsearch-kibana/)
[Dockerコンテナ上のElasticsearchのデータを永続化する](https://qiita.com/matyahiko2831/items/0b07a7577142c00d50e7)

**検索結果の出力機能が要件にある**

Kibana 6.xからX-Pack Reportingの無償範囲でCSVエクスポート機能が使える

[Kibanaの検索結果をCSVでエクスポートできるように](https://logmi.jp/tech/articles/289009)
[Kibana6.xのReporting CSV Export機能を試してみる](https://designetwork.daichi703n.com/entry/2017/07/17/kibana-6-csv-export)
[ElasticスタックVer 6.0.0を試す](https://designetwork.daichi703n.com/entry/2017/07/17/kibana-6-csv-export)

**KibanaのDashboardをインポートする場合**

[KibanaのSaved Objectsをインポート、エクスポートする方法](https://qiita.com/NAO_MK2/items/487f6bda3738281c9cbd)
[Kibanaの設定をまるっと別のElasticsearchに移したい(改訂版)](https://qiita.com/tsukapah/items/91cb093ddfa6ede10b02)
[Kibana dashboard export and import](https://gist.github.com/hidepin/d320273962cd232198b66385831802b7)

**日本語を検索するシステムで使う場合**

[Elasticsearch 7.2.0 + Kuromoji + Kibana + docker-compose インストールメモ](https://qiita.com/kiyotaman/items/2527defb84a94bde3d7c)
[Elasticsearchを日本語で使う設定のまとめ](https://qiita.com/shin_hayata/items/41c07923dbf58f13eec4)
[Elasticsearchのための新しい形態素解析器 「Sudachi」](https://qiita.com/drafts/1206ed8101d3651465d7/edit)
[nextcloud + Elasticsearch で日本語全文検索が動いたメモ](https://qiita.com/entertvl/items/93d9fe6272defc97b1c4)

**アラート通知方法の検討**

[Elasticsearchのデータを元にアラート通知する方法の調査](https://qiita.com/rururu_kenken/items/6207ab68378b70f408bb)

**Elasticsearchのデータを定期的に削除するかどうかの検討**

Kibana 6.6からIndex Lifecycle Management(ILM)という機能が追加されています。ElasticsearchのIndex管理を行う画面。
[Index Lifecycle Management(ILM)](https://qiita.com/tak7iji/items/6f4df5eeb6c16d8bc987)
[インデックスライフサイクル管理でHot-Warm-Coldアーキテクチャーを実装](https://www.elastic.co/jp/blog/implementing-hot-warm-cold-in-elasticsearch-with-index-lifecycle-management)
[ElasticsearchのIndex Lifecycle Management（ILM）を使って、指定された期間を過ぎたインデックスを削除する](https://kazuhira-r.hatenablog.com/entry/2020/01/09/015059)
[elasticsearch Index lifecycle policiesの使い方](https://ryook.hatenablog.jp/entry/2019/09/25/001210)

Index Lifecycle Management(ILM)は、[FluentdのElasitcsearchプラグインでもサポートされています](https://github.com/uken/fluent-plugin-elasticsearch#enable-index-lifecycle-management)
gemで[elasticsearch-xpack](https://github.com/elastic/elasticsearch-ruby)もFluentdにインストールする必要があります。

[Curator](https://pypi.org/project/elasticsearch-curator/)というツールもあります。詳細は以下のサイトを参照。
削除以外にスナップショットやクローズなどの操作もできるようです。
[CuratorによるElasticsearchのメンテナンス](https://dev.classmethod.jp/server-side/elasticsearch/elastic-curator/)

Dockerイメージはたくさん公開されています。1日1回実行するものやボリュームマウントするcronの設定ファイルの指定で実行間隔を指定できるものがあるようです。
https://hub.docker.com/search?q=elasticsearch-curator&type=image

## Zabbix Server + Zabbix Docker Monitoring

・Zabbix Serverの準備
・監視対象ホストにZabbix Docker Monitoringのコンテナ起動
・Zabbix Serverへの設定

詳細は以下のサイトを参照
[ZabbixでDockerコンテナを簡単に監視する](https://dev.classmethod.jp/cloud/zabbix-docker-monitoring/)
[Zabbix Docker Monitoring を使ってコンテナ監視をしてみた](https://hawksnowlog.blogspot.com/2019/06/monitor-containers-with-zabbix-docker-monitoring.html)