Prometheusによるメトリクス監視

はじめに

技術部基盤グループの川島です。 主にDBをメインとしてその関連業務を行っています。 監視ツールとしてPrometheusを実装したのでご紹介です。

Prometheusとは?

Google 社内監視ツール Borgmon にインスパイアされて作成されたOSSです。 prometheusサーバーから監視対象のサーバーに配置したexporterに対して定期的にポーリングを行い様々な情報を収集するPull型の監視ソフトとなっています。

Grafanaとは?

Grafana は Grafana Labs が公開しているログ・データ可視化のためのツールです 対応しているデータソースの例として以下があります。 - Graphite - Prometheus - InfluxDB - OpenTSDB - Elasticsearch - Loki - MySQL - PostgreSQL - AWS Cloudwatch

メトリクス収集の流れ

exporter

監視対象にexporterというエージェントを入れ、HTTPでpullして時系列データを取得。 - メトリック名とkey/valueの組み合わせによる時系列データで保存 - 閾値を超えた場合にアラート設定

Prometheusサーバー

  • 監視サーバーのプログラム定期的に全ての exporter をポーリングしてリソース情報を収集する
  • 監視したデータは prometheus 内の DB に保持される

採用背景

Prometheusを採用した背景としては以下があります。
①システムの大規模な移行・マイグレーション案件において、旧環境のメトリクス収集を行い、新環境と比較するためやDBA用の監視システムのために設置。

②監視に関しての課題
各監視対象を横断する統一的な閲覧方法がない。
各監視対象について、監視粒度がバラバラとなっている。

③他部署にサーバ状態の共有

後ほど説明しますが導入も非常に簡単なので今回実装を試みました。

導入手順

Prometheus本体、exporterともに導入が非常に簡単です。 バイナリファイルをダウンロードし、解凍、起動するだけで使用できます。 このままだと端末を閉じると停止してしまうのでサービスファイルを作成しサービスとして起動・停止できるようにしています。

Prometheus

このままですとコンソールを立ち上げ続ける必要があるのでデーモンとして起動します。 - サービスファイルの作成

vim /etc/lib/systemd/system/prometheus.service

以下を追記

[Unit]
Description=Prometheus - Monitoring system and time series database
Documentation=https://prometheus.io/docs/introduction/overview/
After=network-online.target
After=network-online.target

[Service]
Type=simple
ExecStart=/usr/local/src/prometheus/2.16.0/prometheus -- config.file=/usr/local/src/prometheus/2.16.0/prometheus.yml --storage.tsdb.retention 21d
Restart=always
ExecReload=/bin/kill -HUP $MAINPID

[Install]
WantedBy=multi-user.target

  • サービス起動

    systemctl daemon-reload
    systemctl start prometheus.service

node_exporter

こちらも同様にデーモン起動します。 - サービスファイルの作成

vim /etc/lib/systemd/system/node_exporter.service

以下を追記

[Unit]
Description=Node Exporter

[Service]
Type=simple
ExecStart=/usr/local/src/node_exporter/0.18.1/node_exporter \
--collector.buddyinfo
PrivateTmp=false

[Install]
WantedBy=multi-user.target

  • サービス起動

    systemctl daemon-reload systemctl start prometheus.service

grafanaがデータソースとしてPrometheusに対応しているので連携しいけてるダッシュボードを作成できます。 exporterによっては有志の方がテンプレートを公開しています。

ダッシュボード

作成したダッシュボードの一部を紹介いたします。

f:id:Yuichi1020:20201204144730p:plain
node_exporter

f:id:Yuichi1020:20201204144600p:plain
windows_exporter

気になるところ

  • Pull型なのでService Discoveryを使わないと新規に構築したサーバのメトリクスが取得できない。
    →監視対象を増やす・減らすたびに設定ファイルの修正が必要となる。

  • データの長期保存には適していない?
    →(みんなどうしているのか知りたい・・・)

認証周り・他工夫

  • ID/PW管理 GrafanaがOpenIDConnect可能なのでAzureADと連携しID/PW管理の管理を行っています。   参考URL:
    Azure AD OAuth2 authentication

f:id:Yuichi1020:20201204121240p:plain
ログイン画面

  • SFPモジュールの光量監視 snmp_exporterを用いてsfp光量を監視を行っています。

    f:id:Yuichi1020:20201204121418p:plain
    SFP光量_ダッシュボード

  • Teams連携 AlertManagerとTeamsを連携し、通知をアラート要チャネルに通知しています。 その会話の中で誰が対応しているか、何を確認したなどが確認でき便利です。

    f:id:Yuichi1020:20201204121323p:plain
    Teams連携

良かったポイント

  • ダッシュボードを各サーバで使いまわせるのでメトリクスを取得したいサーバにエクスポーターを設置するだけでダッシュボード化できる。
  • AlertManagerからの通知をteamsに連携するようにしたので外出先でもアラートを確認できる。

課題

監視対象の追加

Service Discoveryを使用していないのでサーバの追加・削除を手動で行っている。
都度作業が必要で面倒+設定ファイルがどんどん見難くなっている。

監視項目

どの項目を監視対象としてアラートを出すかが決まっていない。
現状、エクスポーターとの疎通、CPU使用率、ディスク使用率、SFP光量を監視しているがこれで十分なのか?

今後の展望

  • Service Discoveryの利用 現在サーバーの追加削除を手動で行っているのでnode_exporterに関しては
    Service Discoveryを使用してサーバの追加・削除を簡易化したい。

  • OracleやMysqlの監視 ORAエラーの監視など、DBの各種エラーの吸い上げ(AWS含む)