stylesheet

2018-06-07

Alertmanager (prometheus) の Webhookレシーバーを調べる

AlertmanagerPrometheusでのアラート管理を行うコンポーネント。
現状で以下のレシーバー(通知先)をサポートしている。

  • SMTPメール
  • Hipchat
  • PagerDuty
  • Pushover
  • Slack
  • OpsGenie
  • VictorOps
  • WeChat
  • Webhook

今後はレシーバーの追加は積極的に行わないそうで、Webhookを使って自身で作成して欲しいとのこと。

Webhookレシーバー

設定で指定したエンドポイントに対して、JSONでPOSTリクエストを送出するレシーバー。
POSTリスエストを送るだけなので、その後の処理は利用者側で用意する必要がある。

なんでもできるけど、なんにもできない、そんな感じ。

使用するにはAlertmanagerの設定にwebhookレシーバーを追加してやる。

receivers:
- name: "myreceiver"
  webhook_configs:
  - url: 'http://127.0.0.1:3001/alerts'
    send_resolved: true

Prometheus側のアラートルールでlabelsとannotationsとして受け取るプロパティを追加出来る。

- alert: InstanceDown
    expr: up == 0
    for: 5m
    labels:
      severity: critical
    annotations:
      summary: "Instance {{ $labels.instance }} down"
      description: "{{ $labels.instance }} of job {{ $labels.job }} has bennd down for more than 5 minutes"

Prometheusのアラートはpendingfiringresolvedと状態が遷移する。
この内、webhookで送出されるイベントはfiringresolvedの2つ。

firing状態では次のような構造になる。
同じグループのアラートは配列としてまとめて送られてくる。

{ receiver: 'duino-klutch-webhook-receiver',
  status: 'firing',
  alerts:
   [ { status: 'firing',
       labels:
        { alertname: 'InstanceDown',
          instance: 'localhost:9100',
          job: 'node_exporter',
          severity: 'critical' },
       annotations:
        { description: 'localhost:9100 of job node_exporter has bennd down for more than 5 minutes.',
          summary: 'Instance localhost:9100 down' },
       startsAt: '2018-06-06T18:03:58.765899704+09:00',
       endsAt: '0001-01-01T00:00:00Z',
       generatorURL: 'http://orange:9090/graph?g0.expr=up+%3D%3D+0&g0.tab=1' } ],
  groupLabels: { alertname: 'InstanceDown' },
  commonLabels:
   { alertname: 'InstanceDown',
     instance: 'localhost:9100',
     job: 'node_exporter',
     severity: 'critical' },
  commonAnnotations:
   { description: 'localhost:9100 of job node_exporter has bennd down for more than 5 minutes.',
     summary: 'Instance localhost:9100 down' },
  externalURL: 'http://orange:9093',
  version: '4',
  groupKey: '{}:{alertname="InstanceDown"}' }

設定でsend_resolvedを無効にしていない場合はresolved状態でもPOSTリクエストが送出される。
スキーマはfiringの場合と違いはない。

{ receiver: 'duino-klutch-webhook-receiver',
  status: 'resolved',
  alerts:
   [ { status: 'resolved',
       labels:
        { alertname: 'InstanceDown',
          instance: 'localhost:9100',
          job: 'node_exporter',
          severity: 'critical' },
       annotations:
        { description: 'localhost:9100 of job node_exporter has bennd down for more than 5 minutes.',
          summary: 'Instance localhost:9100 down' },
       startsAt: '2018-06-06T18:03:58.765899704+09:00',
       endsAt: '2018-06-06T18:07:58.765932428+09:00',
       generatorURL: 'http://orange:9090/graph?g0.expr=up+%3D%3D+0&g0.tab=1' } ],
  groupLabels: { alertname: 'InstanceDown' },
  commonLabels:
   { alertname: 'InstanceDown',
     instance: 'localhost:9100',
     job: 'node_exporter',
     severity: 'critical' },
  commonAnnotations:
   { description: 'localhost:9100 of job node_exporter has bennd down for more than 5 minutes.',
     summary: 'Instance localhost:9100 down' },
  externalURL: 'http://orange:9093',
  version: '4',
  groupKey: '{}:{alertname="InstanceDown"}' }

アラートの状態がpendingからfiringに変化しても、実際にリクエストが送出されるまでは多少時間が掛かる。
即応性が必要なものは不向き。

実装例

上記を踏まえて手抜き実装してみたwebhookがこちら

arduinoに繋いだ8x8マトリクスLEDへサマリーをメッセージ表示するもの。
firing状態のアラートを保持してresolvedで破棄するようにしてみた。

2018-06-03

node-red + influxdb + prometheus + grafanaでorange-pi-winへダッシュボードを作る

orangepi-win(armbian x64)を監視用ダッシュボードにするために色々とインストールを行う。
arm64用のパッケージが古かったり提供されてなかったりで色々と面倒。

監視用ダッシュボード

grafanaを使用してウェブブラウザで各種メトリクスデータをグラフ表示するもの。

メトリクスデータは以下のものを収集。

  1. システムのメトリクスデータ
  2. 外部Webサービスの応答速度
  3. websocketやweb apiで収集したセンサー値など

1番、2番に関してはprometheusを使用して収集する。それぞれnode_exporter、blackbox_exporterが追加で必要になる。
3番は、node-redを使用してデータフローを作成して対応する。メトリクスデータの保存にはinfluxdbを使用。

以下、必要となるソフトウェアのインストール方法をメモしていく。
node-redデータフローの内容やgrafanaダッシュボードの作り方は記載しない。

※センサーデータの配信サーバーデバイスを自作してやろうという変人は著作のこちらも参考にどうぞ。 esp8266向けのhttp/websocket apiサーバーです。

influxdb

https://www.influxdata.com/

influxDBは時系列データの扱いに特化したデータベース。
時系列データベースとして採用例が多いgraphiteより後発のもの。

インストールはaptで素直に入る。
ついでにnode-redからの書き込み用のデータベースを作成しておく。

$ sudo apt install influxdb influxdb-client
$ influx
> create database things

http apiで更新可能のためか、簡易なWebUIが付属している。

http://127.0.0.1:8083

prometheus

https://prometheus.io/

prometheusはpull型のサーバー監視ツール。k8s環境で使われることが多い印象。

arm64版のパッケージがレポジトリに登録されていないのでインストールは少し面倒。
公式サイトからバイナリを入手してインストールする必要がある。

$ wget https://github.com/prometheus/prometheus/releases/download/v2.2.1/prometheus-2.2.1.linux-arm64.tar.gz
$ sudo tar xvfz prometheus-2.2.1.linux-arm64.tar.gz -C /opt
$ cd /opt
$ sudo ln -s prometheus-2.2.1.linux-arm64/ prometheus
$ sudo vi /etc/systemd/system/prometheus.service

  [Unit]
  Description=Prometheus
  Wants=network-online.target
  After=network-online.target

  [Service]
  User=root
  Group=root
  Type=simple
  ExecStart=/opt/prometheus/prometheus --config.file /opt/prometheus/prometheus.yml

  [Install]
  WantedBy=multi-user.target

$ sudo systemctl daemon-reload
$ sudo systemctl enable prometheus

また、prometheusではメトリクスデータの収集に各種exporterが必要。
システムメトリクスの収集はnode_exporter、外部サービスの死活監視はblackbox_exporterを使用する。

これらも同じようにインストール。手順はほぼ一緒なので省略。

インストールが完了したら、/opt/prometheus/prometheus.ymlを編集してjobを登録する。

...
scrape_configs:

  ...

  - job_name: 'node_exporter'
    static_configs:
    - targets: ['localhost:9100']

  - job_name: 'blackbox_http'
    metrics_path: /probe
    params:
      module: [http_2xx]
    static_configs:
      - targets:
        - http://example.com
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: 127.0.0.1:9115

最後にsystemdで自動起動を有効にする。

$ sudo systemctl daemon-reload
$ sudo systemctl enable prometheus
$ sudo systemctl enable node_exporter
$ sudo systemctl enable blackbox_exporter

node-red

https://nodered.org/

node-redはビジュアルデータフロープログラミングツール。
"mqttでセンサーデータを受信、influxdbへ保存"みたいなことがマウスでポチポチするだけで出来あがる。

nodejs製のWebアプリなので、インストールにはnpmを使用する。また、daemon化にはpm2を使用した。

$ sudo npm install -g --unsafe-perm node-red
$ sudo npm install -g pm2

プロセス構成を作成してsystemdへ登録する。

$ sudo su
$ pm2 start node-red
$ pm2 save
$ pm2 startup

WebUIはポート1880番を使用。

http://127.0.0.1:1880

WebUIにアクセスし、node-red-contrib-influxdbを設定から追加。

その後、マウスでポチポチしてデータフローを組み上げる。
例えば、以下のようなデータフローを作成する。

websocket接続 -> 受信データのフィルタと成形 -> influxdbへ追加
定期実行 -> httpリクエスト -> レスポンスデータのフィルタと成形 -> influxdbへ追加

grafana

https://grafana.com/

grafanaはwebブラウザ向けのデータビジュアライゼーションツール。kibanaからフォークして誕生した。
ストレージにinfluxdbやprometheusが使用可能。

aptリポジトリ版はUIが壊れた(アイコンが表示されない)不具合のある旧版なので公式パッケージを使用。

$ wget https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana_5.0.4_amd64.deb
$ sudo dpkg -i grafana_5.0.4_amd64.deb

一旦、homepathを指定して起動してやる。

$ sudo grafana-server -homepath /usr/share/grafana

自動起動を有効にする。

$ sudo systemctl enable grafana-server

WebUIはポート3000番を使用。

http://127.0.0.1:3000

初期アカウントはユーザー、パスワード共にadmin
メニューのData Sourcesからinfluxdbとprometheusを追加しておく。

Type: InfluxDB
Url: http://localhost:8086

Type: Prometheus
Url: http://localhost:9090

その後、こちらもマウスでポチポチしてダッシュボードを作成していく。
公開されているものをインポートしてから調整していくと少しは楽できる。

結構大掛かりになったが、以上でセットアップは完了。

メトリクスデータが僅かなこともあって、非力なorange-piでも一応は動作しているが、それなりに負荷はかかっているよう(特にinfluxdb)なので、そのうち破綻しそうな気はする。

都会派のカメはヒキガエルと言うそうです