“Prometheus” は OSS のメトリクスベースのシステム監視ツールで、実行ファイルをコピーして設定を入れるだけで導入できる点などから、最近人気が出てきたツールの一つです。
Prometheus のアーキテクチャーは下図のように、監視を行う Prometheus サーバーとそれらと連携する各種システムから形成されています。
本稿では、Prometheus からの通知を Kompira Enterprise のアラートチャネルで受信するまでの手順を紹介します。
※本稿では Prometheus が既にインストールしてあり、各種 exporter はインストールしていない状態を想定しています。
動作確認環境
ソフトウェア | バージョン |
---|---|
Kompira Enterprise | 1.5.5.post11 |
OS | CentOS 7.8.2003 |
Prometheus | 2.27.1 |
または
ソフトウェア | バージョン |
---|---|
Kompira Enterprise | 1.6.2.post4 |
OS | CentOS 7.8.2003 |
Prometheus | 2.27.1 |
連携の構成
Prometheus 関連では、本稿では以下の3つのコンポーネントを利用します。
名称 | 説明 |
Prometheus | 定期的に exporter をポーリングして情報収集を行う。
取得したデータは TSDB などに記録する。 |
exporter | リクエストに応じてリソース情報を返す API。 監視対象のリソースごとに、それぞれ exporter が用意されている。 |
Alertmanager | Prometheus で監視中の情報が閾値を超えた場合などのアラート処理を行う。
メール、メッセンジャーソフトなど、アラートの送信先に対して中継する。 |
本稿では node exporter をダウンさせ、それを Prometheus の監視で検知し、 Alertmanager を通じて障害通知を Kompira Enterprise の REST API に送信します。
以下はお使いの環境に合わせてコマンドなどを読み替えてください。
Prometheus の設定変更
/etc/prometheus/prometheus.yml に用意されているサンプルファイルを以下のように書き換えます。
prometheus.yml
global: scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute. evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute. external_labels: monitor: 'example' alerting: alertmanagers: - static_configs: - targets: - 'localhost:9093' rule_files: - "rules.yml" scrape_configs: - job_name: 'prometheus' scrape_interval: 5s scrape_timeout: 5s static_configs: - targets: - 'localhost:9090' - job_name: node static_configs: - targets: - 'localhost:9100'
※本稿では簡単にするために Prometheus をインストールするサーバーと node exporter をインストールする監視対象サーバーを同一のものとしています。別のサーバーを監視したい場合には ‘localhost:9100’ の部分を ‘(監視対象の IP アドレス):9100’ に書き換えてください。
監視のルールは rules.yml を別途作成して記述しました。監視対象機が5秒以上ダウンした状態が続くと通知を行います。
rules.yml
groups: - name: example rules: - alert: InstanceDown expr: up{job='node'} == 0 for: 5s labels: severity: critical annotations: summary: "Instance {{ $labels.instance }} down" description: "{{ $labels.instance }} of job {{ $labels.job }} is down"
Alertmanager の設定は etc/alertmanager/alertmanager.yml に記述しますが、こちらは Kompira Enterprise API の設定と関係するため後述します。
設定を変更したら、それぞれプログラムを再起動して反映させます。
$ sudo systemctl restart prometheus $ sudo systemctl restart prometheus-alertmanager
続いて node exporter をインストールします。
$ sudo yum install prometheus-node-exporter
こちらは /usr/bin/prometheus-node-exporter というプログラムが動いていれば OK です。ps コマンド等で確認し、もし動作していないようでしたら以下のように起動してください。
$ sudo systemctl start prometheus-node-exporter
ここまでできたら Prometheus は稼働を始め、監視対象サーバーの情報を取得しています。以下の URL で Prometheus の画面にアクセスできるので、画面上部の Status から Targets を選択し、Prometheus と node exporter の State が up になっていることを確認してください。
http://(Prometheus サーバーのアドレス):9090
Kompira REST APIの準備
Prometheus からの通知を受け取る Kompira Enterprise 側の REST API の設定を行います。本稿では Kompira Enterprise は root アカウントで設定を行っています。
画面右上の root > ユーザー情報からユーザー情報画面に移動して、画面右の「編集」ボタンをクリックしてください。その後画面下の「REST API有効化」にチェックを入れて、「保存」ボタンをクリックしてください。
ユーザー情報画面の「REST APIトークン」欄の「トークンを表示する」をクリックして、表示されたトークン文字列を控えておいてください。
本稿ではデフォルトの Alert チャネルオブジェクトに対するリクエストとして通知を受け取ります。この場合の URL は以下の通りになります。
※本稿では Kompira Enterprise を http モードでインストールした場合で検証しています。
http モードでインストールしていない場合は、Kompira Enterprise に SSL 証明書を設定して、以降の URL の http を https に読み替えてください。
http://(Kompira Enterprise サーバーのアドレス)/system/channels/Alert.send?format=json&token=(REST API トークン文字列)
Alertmanager の設定
あらためて Alertmanager の設定を行います。メールや WeChat などのメッセンジャーへの転送など、いろいろな通知手段が利用できますが、ここでは Webhook を利用して、Prometheus からKompira Enterprise の REST API を呼び出します。
ここでは receiver を “kompira” と名付け、Prometheus から受け取った通知より Kompira Enterprise の API を呼び出します。
設定は /etc/prometheus/alertmanager.yml に記載します。この例では実験のためインターバル時間などを極端に短くしています。
alertmanager.yml
global: route: receiver: kompira group_wait: 5s group_interval: 5s repeat_interval: 1m group_by: [alertname] receivers: - name: "kompira" webhook_configs: - http_config: follow_redirects: false url: 'http://(Kompira Enterprise サーバーのアドレス)/system/channels/Alert.send?format=json&token=(REST API トークン文字列)'
設定を変更したら、Alertmanager のプロセスを再起動します。
$ sudo systemctl restart prometheus-alertmanager
通知を受信するジョブフローの作成
Kompira Enterprise 側ではチャネルで受信した通知を表示するジョブフローを作成して実行します。
</system/channels/Alert> -> print($RESULT) -> self()
障害のテスト
さて、実際に node exporter をダウンさせて、Prometheus に検知させます。
サーバーが正常時には以下のように Prometheus の Alerts は Inactive になっています。
サーバーをダウンさせた後、Alerts は Pending → Firing と変わります。
Kompira Enterprise では、以下のように JSON 形式で Prometheus からの通知を受け取ります。
実務上はここからノードの名称やアラート名称などを抽出してから判断させて、以降の処理を記載する必要があります。
例えば、上記の例でアノテーションの詳細 (description) のみを表示する場合、Kompira Enterprise の受信ジョブフローは以下のように記述できます。
</system/channels/Alert> -> print($RESULT.commonAnnotations.description) -> self()
同様にラベル値などを抽出することも容易ですので、上記の例では rules.yml で定義した監視の発火条件に合わせて、管理者への通知や監視対象サーバーの情報収集、障害対応の一時処理などを追加してください。
また、Alertmanager からの通知手段としてはメールなども使えますので、Kompira Enterprise のメールチャネルを経由した連携も可能です。この場合は alertmanager.yml に smtp の設定を行うことになります。