物理サーバー、仮想マシン、コンテナー、コンテナー内で動作するサービスのメトリックスストレージ、視覚化、アラートを提供できるオープンソースのセルフホスト監視ソリューションを探していました。 Elastic Beats、Graphite、およびPrometheusをテストした後、私はPrometheusに決めました。 まず、多次元メトリックとシンプルなクエリ言語のサポートに魅了されました。 グラフィックイメージと通知に同じ言語を使用する機能により、監視タスクが大幅に簡素化されます。 Prometheusはブラックボックステストとホワイトボックステストの両方を実行します。つまり、インフラストラクチャをテストし、アプリケーションの内部状態を監視することもできます。
なぜ選択がプロメテウスにかかったのか
- スタック全体は、コンテナを使用して展開できます。
- 分散システムおよびインフラストラクチャ向けに設計されています。
- 分散ストレージに依存しないスケーラブルなデータ収集。
- 柔軟なサービス検出システム(Kubernetes、Consul、EC2、Azureの組み込みサポート)。
- HAProxy、MySQL、PostgreSQL、Memcached、Redisなどのサービスのターゲットエクスポーター
プロメテウスのエコシステムは巨大です。 つまり、データベース、MQ、HTTPサーバーから、IoTやIPMIなどのハードウェア関連システムまで、さまざまなシステムのメトリックエクスポーターを見つけることができます。 ホワイトボックステストも優れたカバレッジを備えています。 Go、Java、Python、Ruby、.NET、PHP、およびその他のプログラミング言語用のPrometheusクライアントライブラリがあります。
Prometheusとdockerを使い始める
Prometheusスタックを試してみたい場合は、GitHubのdockpromリポジトリをご覧ください。 監視ソリューションの開始点としてdockpromを使用できます。 これにより、Prometheus、Grafana、cAdvisor、NodeExporter、AlertManagerの1つのコマンドでスタック全体を管理できます。
設置
dockpromリポジトリをdockerホストにコピーし、dockpromディレクトリに移動して、compose upを実行します。
$ git clone https://github.com/stefanprodan/dockprom $ cd dockprom $ docker-compose up -d
コンテナ:
- プロメテウス(メトリックデータベース)
http://<host-ip>:9090
- AlertManager(アラート管理)
http://<host-ip>:9093
- Grafana(メトリックの視覚化)
http://<host-ip>:3000
- NodeExporter(ホストメトリックコレクタ);
- cAdvisor(コンテナーメトリックコレクター)。
Gafanaが認証をサポートしている場合、PrometheusおよびAlertManagerサービスにはこの機能がありません。 PrometheusおよびAlertManagerの基本認証を使用すると、ポートマッピングをdocker-composeファイルから削除し、NGINXをリバースプロキシサーバーとして使用できます。
Grafanaをインストールする
http://<host-ip>:3000
に移動し、 adminユーザー名とchangemeパスワードを使用してログインします。 Grafana UIを使用するか、 user.configファイルを変更することにより、パスワードを変更できます。
Grafanaメニューから[データソース]を選択し、[データソースの追加]をクリックします。 Prometheusコンテナーをデータソースとして追加するには、次の値を使用します。
- 名前:プロメテウス
- タイプ:プロメテウス
- URL:
http://prometheus:9090
- アクセス:プロキシ
Grafanaディレクトリからコントロールパネルテンプレートをインポートできるようになりました。 Grafanaメニューから[コントロールパネル]を選択し、[インポート]をクリックします。
Dockerコントロールパネル
ドッカーコントロールパネルには、サーバーのリソースの使用を監視するための主要な指標が表示されます。
- サーバーのアップタイム、CPUダウンタイムの割合、CPUコアの数、使用可能なメモリ、スワップ、ストレージ。
- 平均システム負荷のグラフ、完了およびブロックされたIOプロセスのスケジュール、中断のスケジュール。
- ゲスト、アイドル、iowait、irq、nice、softirq、steal、システム、ユーザーモードでのCPU使用のスケジュール。
- 配布ごとのメモリ使用量のスケジュール(使用済み、空き、バッファ、キャッシュ)。
- IO使用のスケジュール(読み取りBps、読み取りBpsおよびIO時間)。
- デバイス(着信Bps、発信Bps)によるネットワーク使用のスケジュール。
- スワップおよびアクティビティグラフィックスを使用します。
Dockerコンテナーコントロールパネル
Dockerコンテナーコントロールパネルには、使用済みコンテナーを監視するための主要なメトリックが表示されます。
- CPUコンテナの合計負荷、メモリ、およびストレージの使用量。
- 使用されているコンテナのグラフ、システム負荷のグラフ、IO使用率のグラフ。
- CPUコンテナの使用スケジュール。
- コンテナのメモリ使用量グラフ。
- スケジュールされたキャッシュメモリ使用量。
- 着信コンテナネットワークの使用スケジュール。
- コンテナネットワークの使用率のアウトバウンドグラフ。
パネルには、監視スタックの一部であるコンテナは表示されません。
監視サービスコントロールパネル
監視サービスコントロールパネルには、監視スタックを構成するコンテナを監視するための主要なメトリックが表示されます。
- Prometheusコンテナランタイム、スタックメモリ使用量の合計監視、Prometheusローカルストレージフラグメントおよびシリーズ。
- CPUコンテナの使用スケジュール。
- コンテナのメモリ使用量グラフ。
- プロメテウススニペットチャートとストレージの緊急度。
- プロメテウスフラグメント操作グラフとチェックポイント期間。
- 使用されたPrometheusテンプレートの割合、ターゲットの読み取り、読み取り時間のグラフ。
- プロメテウスHTTPリクエストグラフ。
- プロメテウス通知スケジュール。
メモリのローカルストレージフラグメントをアタッチすることにより、Prometheusのメモリ使用量を制御できます。 docker-compose.ymlでフラグメントの最大値を変更できます。 storage.local.memory-chunks
値を100,000に設定すると、10個のコンテナーを監視する場合、Prometheusは約2 GBのRAMを使用します。
通知の定義
3つの通知構成ファイルをインストールしました。
- 監視サービスtargets.rulesの通知。
- Dockerホスト通知hosts.rules;
- Dockerコンテナー通知containers.rules。
HTTP POSTリクエストを使用して、通知ルールを変更し、リロードできます。
curl -X POST http://<host-ip>:9090/-/reload
監視サービス通知
ターゲットの1つ(node-exporterとcAdvisor)が30秒以上応答しない場合、通知を有効にします。
ALERT monitor_service_down IF up == 0 FOR 30s LABELS { severity = "critical" } ANNOTATIONS { summary = "Monitor service non-operational", description = "{{ $labels.instance }} service is down.", }
Dockerホスト通知
DockerホストCPUが30秒以上にわたって高負荷になっている場合、通知を有効にします。
ALERT high_cpu_load IF node_load1 > 1.5 FOR 30s LABELS { severity = "warning" } ANNOTATIONS { summary = "Server under high load", description = "Docker host is under high load, the avg load 1m is at {{ $value}}. Reported by instance {{ $labels.instance }} of job {{ $labels.job }}.", }
CPUコアの数と一致するように負荷しきい値を変更します。
Dockerホストのメモリがいっぱいの場合、通知を有効にします。
ALERT high_memory_load IF (sum(node_memory_MemTotal) - sum(node_memory_MemFree + node_memory_Buffers + node_memory_Cached) ) / sum(node_memory_MemTotal) * 100 > 85 FOR 30s LABELS { severity = "warning" } ANNOTATIONS { summary = "Server memory is almost full", description = "Docker host memory usage is {{ humanize $value}}%. Reported by instance {{ $labels.instance }} of job {{ $labels.job }}.", }
Dockerホストストレージがいっぱいの場合、通知を有効にします。
ALERT hight_storage_load IF (node_filesystem_size{fstype="aufs"} - node_filesystem_free{fstype="aufs"}) / node_filesystem_size{fstype="aufs"} * 100 > 85 FOR 30s LABELS { severity = "warning" } ANNOTATIONS { summary = "Server storage is almost full", description = "Docker host storage usage is {{ humanize $value}}%. Reported by instance {{ $labels.instance }} of job {{ $labels.job }}.", }
Dockerコンテナー通知
コンテナが30秒以内に応答しない場合は、通知を有効にします
ALERT jenkins_down IF absent(container_memory_usage_bytes{name="jenkins"}) FOR 30s LABELS { severity = "critical" } ANNOTATIONS { summary= "Jenkins down", description= "Jenkins container is down for more than 30 seconds." }
コンテナがCPUコアの10%を30秒以上使用している場合、通知を有効にします。
ALERT jenkins_high_cpu IF sum(rate(container_cpu_usage_seconds_total{name="jenkins"}[1m])) / count(node_cpu{mode="system"}) * 100 > 10 FOR 30s LABELS { severity = "warning" } ANNOTATIONS { summary= "Jenkins high CPU usage", description= "Jenkins CPU usage is {{ humanize $value}}%." }
コンテナーが1.2 GBを超えるRAMを30秒間使用する場合、通知を有効にします。
ALERT jenkins_high_memory IF sum(container_memory_usage_bytes{name="jenkins"}) > 1200000000 FOR 30s LABELS { severity = "warning" } ANNOTATIONS { summary = "Jenkins high memory usage", description = "Jenkins memory consumption is at {{ humanize $value}}.", }
通知を設定する
AlertManagerは、Prometheusサーバーに通知を送信します。 AlertManagerは、webhookインターフェースを使用して、電子メール、プッシュオーバー、Slack、HipChatなどのシステムを介して通知を送信できます。
ここで、通知を表示またはオフにできます: http://<host-ip>:9093
。
通知の受信は、alertmanager / config.ymlファイルで設定できます。
Slackから通知を受信するには、アプリケーションページで[送信ネットワークバインディング]を選択して統合を構成する必要があります。
api_urlフィールドにSlack Webhook URLをコピーし、Slackチャネルを定義します。
route: receiver: 'slack' receivers: - name: 'slack' slack_configs: - send_resolved: true text: "{{ .CommonAnnotations.description }}" username: 'Prometheus' channel: '#<channel>' api_url: 'https://hooks.slack.com/services/<webhook-id>'
システム拡張の監視
複数のdockerホストをカバーするには、Grafana Dockpromコントロールパネルを展開します。さらにホストを制御するには、各ホストにエクスポーターノードとcAdvisorコンテナーを配置し、読み取り用のPrometheusサーバーを指定する必要があります。
データセンター/ゾーンを介してPrometheusスタックを有効にし、統合機能を使用して、インフラストラクチャの一般的な概要となるPrometheusプログラムの特定のコピーのすべてのメトリックを結合する必要があります。 したがって、ゾーンまたはゾーンの結合に関係するプロメテウスプログラムのコピーが失敗した場合、監視システムは残りのゾーンで利用可能になります。
各ゾーンで2つの同一のサーバーを実行することにより、Prometheusの復元力を高めることもできます。 複数のサーバーがAlertmanagerに通知を送信する場合、Alertmanagerは重複排除を実行するため、これにより冗長データが表示されることはありません。