Kompira

Menu Menu

Enterprise Technical information

外部との連携 Prometheusからの通知をKompiraで受信する

“Prometheus”はOSSのメトリクスベースのシステム監視ツールで、実行ファイルをコピーして設定を入れるだけで導入できるなど、最近、人気が出てきたツールの一つです。

https://prometheus.io/

Prometheusのアーキテクチャーは下図のように、監視を行うPrometheusサーバーとそれらと連携するエコシステムが形成されています。

 

 

 

連携の構成

また稼働環境としては、Ubuntu Server 19をインストールしたLinux機2台を用意し、Prometheusサーバーと監視対象サーバーとします。

インストールしたPrometheusのバージョンはバージョンは 2.7.1です。

Prometheus関連では、本稿では以下の3つのコンポーネントを利用します。

 

名称 説明
prometheus 監視サーバー上で稼働するプログラム

定期的にexporterをポーリングして情報収集を行う。

取得したデータはTSDBなどに記録する。

exporter 監視対象サーバー上で稼働させるプログラム

リクエストに応じてリソース情報を返すAPI
監視対象のリソース事に、それぞれexporterが用意されている。

Alertmanager 監視サーバー上で稼働するプログラム

prometheusで監視中の情報が閾値を超えた場合などのアラートを処理

メール、メッセンジャーソフトなど、アラートの送信先に対して中継する。

 

監視対象サーバーをダウンさせて、Prometheusの監視で検知。障害通知をAlert Managerを通じて、KompiraのREST APIに向けて送信します。

以下はお使いの環境に合わせてコマンドなどを読み替えてください。

 

 

prometheusのインストール

基本的にはPrometheus公式のダウンロードページより、実行ファイルをダウンロードしてPrometheus機にコピーすれば動かす事は可能です。

https://prometheus.io/download/

本稿ではUbuntuを利用しているため、aptコマンドを利用してインストールします。

まずはPrometheusサーバーに以下のプログラムをaptコマンドでインストールします。

 

$ sudo apt install prometheus
$ sudo apt install prometheus-alertmanager

 

この場合、実行ファイルは /usr/bin/prometheusに、設定ファイルなどは /etc/prometheus にコピーされます。

/etc/prometheus/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: ['(監視対象サーバーのIPアドレス):9100']

 

監視のルールは別途にrules.yml を作成しました。監視対象機が5秒以上ダウンした状態が続くと発火して、通知を行います。

 

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"

 

Alert Managerの設定は alertmanager.yml で行いますが、こちらはKompira APIの設定と関係するために後述します。

設定を変更しましたら、それぞれプログラムを再起動して反映させます。

 

$ sudo systemctl restart prometheus
$ sudo systemctl restart prometheus-alertmanager

 

続いて監視対象サーバーにnode exporterをインストールします。

 

$ sudo apt-get install prometheus-node-exporter

 

こちらは /usr/bin/prometheus-node-exporter というプログラムが動いていればOKです。psコマンド等で確認し、もし動作していないようでしたら起動してください。

 

$ sudo systemctl start prometheus-node-exporter

 

ここまで出来ましたらPrometheusは稼働を始め、監視対象サーバーの情報を取得しています。

 

http://(Prometheusサーバーのアドレス):9090/graph

 

このURLで Prometheus の画面にアクセスできますので、”node_load1″や”node_cpu_seconds_total”など、適当なメトリックを指定して”Execute”ボタンをクリックし、値が取得出来ている事を確認してください。

 

 

Kompira REST APIの準備

Prometheusからの通知を受け取るKompira Enterprise側のAPIの設定を行います。本稿ではKompiraはrootアカウントで設定を行っています。

画面右上のroot>ユーザー情報>「編集」ボタンをクリック>(画面下の)「REST API有効化」スイッチをON >「保存」ボタンをクリック

 

 

情報画面の「REST APIトークン」欄の「トークンを表示する」をクリックして、トークンを表示して、トークン文字列を控えておいてください。

 

 

本稿ではデフォルトのAlertチャネルオブジェクトに対するリクエストとして通知を受け取ります。この場合のURLは以下の通りになります。

 

 http://(Kompiraサーバーのアドレス)/system/channels/Alert.send?format=json&token=(REST APIトークン文字列)

 

 

Alert Managerの設定

あらためてAlert Managerの設定を行います。通知の手段としてはメールやWeChatなどのメッセンジャーへの転送など、いろいろな手段が利用出来ますが、ここではWebhookを利用して、PrometheusからKompiraのREST APIを呼び出します。

ここでは receiverを”kompira”と名付け、Prometheusから受け取った通知より KompiraのAPIを呼び出します。

設定は /etc/prometheus/alertmanager.yml に記載します。(この例では実験のためインターバル時間などを極端に短くしています。)

 

global:

route:
 receiver: kompira
 group_wait: 5s
 group_interval: 5s
 repeat_interval: 1m
 group_by: [alertname]

receivers:
- name: "kompira"
  webhook_configs:
    - url: 'http://(Kompiraサーバーのアドレス)/system/channels/Alert.send?format=json&token=(REST APIトークン文字列)'

 

設定を変更しましたら、Alert Managerのプロセスを再起動します。

 

$ sudo systemctl restart prometheus-alertmanager

 

 

通知を受信するジョブフローの作成

Kompira側ではチャネルで受信した通知を表示するジョブフローを作成して実行します。

</system/channels/Alert>
-> print($RESULT)
-> self()

 

 

障害のテスト

さて実際に監視対象サーバーをダウンさせて、Prometheusに検知させます。サーバーが正常時にはPrometheusのAlerts画面がグリーンになっています。

 

 

サーバーをダウンさせた後は、”State”はPENDING → FIRING になり、Alertsは赤に変わります。

 

 

KompiraのAlertチャネルでは、例えば以下のように Prometheusからの通知を受け取ります。

 

 

上記の通りに、JSON形式にて通知を受信できました。

実務上はここからノードの名称やアラート名称などを抽出してから判断させて、以降の処理を記載する必要があります。上記のジョブフローの例では $RESULT 変数の上記のJSONデータが辞書型で格納されています。

例えば、上記の例でアノテーションの詳細(description)のみを表示する場合には、Kompiraの受信ジョブフローは以下の様に記述できます。
 

< /system/channels/Alert >
-> print($RESULT.commonAnnotations.description)
-> self()

 

同様にラベル値などを抽出する事も容易ですので、上記の例では rules.yml で定義した監視の発火条件に合わせて、管理者への通知や監視対象サーバーの情報収集、障害対応の一時処理などを追加してください。

この他、Alert Managerからの通知手段としてはメールなども使えますので、Kompiraからはメールチャネルを経由した連携方法も可能でしょう。(この場合は alertmanager.yml に smtpの設定を行う事になります。)

スタートガイド

Kompiraジョブフローの基礎

ジョブフローの簡単な例

Kompiraの機能

外部との連携