Prometheusという運用監視ツールを導入して死活監視を試した

Auther: Xande0812

Prometheusという運用監視ツールがいい感じらしいので導入して死活監視を試した

最近、運用監視ツールについて検討する機会があったので色々運用監視ツールを比較していたらProtmeteusというものを知りました。何やら面白そうだったので自社に導入して簡単な死活監視をしてみたのでその結果を書きます。

本記事では、このPrometheusを導入してExpoterを使って自社サイト(本ページ)の死活監視してみるところまでやってみたいと思います。

Prometheusとは

どうやらこのPrometheusは元Googleのエンジニアが、Google社内で利用されていた運用監視ツールを元にして作成したものらしいです。オライリーのSRE本でもチロっと紹介されていて最近のクラウド環境やdockerの監視、kubernetesとの親和性など、最近のシステム開発事情に最適化された運用監視ツールとのことです。

この記事を書いている3日前(2017/11/05)にバージョン2のrc3がリリースされていて、バージョン2がそろそろリリースされるのではないかと言われていますが、本記事では1.8.2を使います。バージョン2がリリースされたら、その記事も書いていきたいと思います。

Prometheusを導入する

本体をインストール

本体をインストールするところから始めます。Dockerのコンテナとしてインストール・運用する手法が多く紹介されていますが、今回はサーバ内に直接設置する手法で進めたいと思います。

wgetなどで直接バイナリをダウンロードしてサーバ内に設置します。バイナリのダウンロードURLは公式のダウンロードページから取得できます。

cd /path/to/src
# ダウンロード
wget ダウンロードURL
ls -al
~~~~~
-rw-r--r--  1 root   root   17748716 Nov  4 16:55 prometheus-1.8.2.linux-amd64.tar.gz
~~~~~

# 解凍
tar zxvf prometheus-1.8.2.linux-amd64.tar.gz
cd prometheus-1.8.2.linux-amd64
ls -al
total 71124
drwxrwxr-x 4 1000 1000     4096 Nov  4 16:54 .
drwxrwxrwt 4 root root     4096 Nov  8 01:21 ..
drwxrwxr-x 2 1000 1000     4096 Nov  4 16:07 console_libraries
drwxrwxr-x 2 1000 1000     4096 Nov  4 16:07 consoles
-rw-rw-r-- 1 1000 1000    11357 Nov  4 16:07 LICENSE
-rw-rw-r-- 1 1000 1000     2793 Nov  4 16:07 NOTICE
-rwxr-xr-x 1 1000 1000 60844123 Nov  4 16:10 prometheus
-rw-rw-r-- 1 1000 1000      995 Nov  4 16:07 prometheus.yml
-rwxr-xr-x 1 1000 1000 11945589 Nov  4 16:11 promtool

解凍してみると分かるんですが、Go製なので構成ファイルの数がすごく少ないです。

本体の設定をする

ダウンロードしたファイルを解凍したらprometheus.ymlというyamlファイルがあり、これが設定ファイルになってます。デフォルト状態の設定ファイルの中身も結構短いです。設定項目が短いのは運用が楽なのですごく良いです。

cat prometheus.yml
# my global config
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.
  # scrape_timeout is set to the global default (10s).

  # Attach these labels to any time series or alerts when communicating with
  # external systems (federation, remote storage, Alertmanager).
  external_labels:
      monitor: 'codelab-monitor'

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  # - "first.rules"
  # - "second.rules"

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: 'prometheus'

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
      - targets: ['localhost:9090']

設定ファイルの詳細については別の記事で取り上げたいと思いますので、今回は特に設定はいじらずこのまま進めます。

起動

Prometheusはそのままバイナリを実行するだけで起動できます。上記の設定ファイルと起動する際に指定するflagを設定することで動作を変えることができます。

ちなみに起動するときにメモリを確保しようとするらしく、3GBくらい使われるとか。今回はAWSのEC2でt2.micorを使っているのでそんなにリソースがなくメモリサイズを小さくして起動してみました。

cd /path/to/prometheus

# -storage.local.target-heap-sizeというフラグにメモリサイズをbyteで指定する
# 今回は512MBを指定した
./prometheus -config.file=prometheus.yml -storage.local.target-heap-size=512000000

# 起動したら↓のようなログが出力される
INFO[0000] Starting prometheus (version=1.8.2, branch=HEAD, revision=5211b96d4d1291c3dd1a569f711d3b301b635ecb)  source="main.go:87"
INFO[0000] Build context (go=go1.9.2, user=ユーザー名が書かれる, date=20171104-16:09:14)  source="main.go:88"
INFO[0000] Host details (ホストの状態が記載される)  source="main.go:89"
INFO[0000] Loading configuration file prometheus.yml     source="main.go:254"
INFO[0000] Listening on :9090                            source="web.go:341"
INFO[0000] Loading series map and head chunks...         source="storage.go:428"
INFO[0000] 0 series loaded.                              source="storage.go:439"
INFO[0000] Server is Ready to receive requests.          source="main.go:230"
INFO[0000] Starting target manager...                    source="targetmanager.go:63"

起動したら起動ログがズラッと出てきて正常に起動完了したことがわかります。

Prometheusがインストールされているサーバの状態を確認する

ここまできたらPrometheusがインストールされているサーバの監視もできていますのでGUIから確認してみましょう。

デフォルトの状態であればhttp://localhost:9090/graphにアクセスするとメトリクスが見られます。試しにメモリ使用率を表示したもののキャプチャが下記の通りです。
prometheusのダッシュボードでメモリ使用率を表示しているブラウザ画面

ただ、どうやらこのメトリクスは、サーバリソースのメトリクスではなく。Prometheus自身のCPU使用率だったり、メモリ使用率だったりするようです。
デフォルトの状態でこれだけのメトリクスを見ることができます。
prometheusのダッシュボードでデフォルト状態で確認できるメトリクス

PrometheusのExpoterを使う

PrometheusにはExpoterというプラグインのようなものがあります。このExpoterを使うと様々な監視項目を追加することができます。
今回はWebページの死活監視をしてみたいと思います。

blackbox_exporterを使ってWebページの死活監視をする

Webページの死活監視をするためにはblackbox_exporterというExpoterがあって、そのblackbox_exporterを使うとWebページの死活監視をすることができるようになります。
今回はLibetrada.comの死活監視をしたいと思います。

blackbox_exporterをインストールする

blackbox_exporterをインストールするにはgithubの公式リポジトリからcloneしてmakeすればインストール可能です。
ExpoterもGo製なのでgo getで取得していきます。

go get github.com/prometheus/blackbox_exporter
cd $GOPATH/src/github.com/prometheus/blackbox_exporter
make
# makeが完了すればblackbox_exporterというバイナリが出来上がります

blackbox_exporterを起動する

blackbox_exporterもPrometheusと同じようにyamlファイルと起動時のflagで設定をするようなものになります。詳しい設定方法はcloneしてきたディレクトリにexample.ymlというファイルがあるのでそれを見れば色々書いてあ ります。今回は最小限の設定をして進めて行きます。

cd $GOPATH/src/github.com/prometheus/blackbox_exporter
nvim config.yml # 色々書く

cat config.yml
modules:
  http_2xx:
    prober: http
    timeout: 5s
    http:

こんな感じで最低限の設定をしてみました。詳細は別の機会に説明するとして、このまま進めていきます。

設定ファイルの記述が終わったら起動します。

./blackbox_exporter --config.file=./config.yml

これで起動されます。blackbox_exporterが起動すると9115ポートをリッスンした状態になります。Prometheusとblackbox_exporterのやり取りがこのポートでされるという感じになります。

Prometheus側のblackbox_exporter用の設定をする

Prometheusからblackbox_exporterへRESTでアクセスするための設定をしなければならないためPrometheusのconfig.ymlをいじる。

cd /path/to/prometheus
nvim prometheus.yml

# scrape_configsという項目にblackbox_httpという名前のjobを追加した
cat prometheus.yml
~~~略~~~
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: 'prometheus'

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
      - targets: ['localhost:9090']
  - job_name: 'blackbox_http'        # ここからが追加したもの
    metrics_path: /probe
    params:
      module: [http_2xx]
    static_configs:
      - targets:
        - http://libetrada.com    # 死活監視対象のURL
        - https://libetrada.com   # 死活監視対象のURL
    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  # Blackbox exporter.

ここでtargetsという欄にhttp://libetrada.comとhttps://libetrada.comを追加しました。
追加後、Prometheusを再起動すれば設定が反映されます。

PrometheusのメトリクスでWebページの死活監視を確認する

メトリクス画面に「probe_ほにゃらら」という項目が幾つか追加されています。
prometheusにblackbox_expoterを導入したあとに選択できるメトリクス

そのうちのprobe_successというのが死活監視の結果が見られるメトリクスです。
Prometheusとblackbox_expoterを使ってwebページの死活監視結果をダッシュボードで確認した結果

この画面をみるとlibetrada.comへのhttpとhttpsの死活監視結果がみられます。
1がOKで0がNGという表示になってます。

さらに、blackbox_exporterを導入しただけで、ssl証明書の期限を監視してくれたり、httpリクエストの返答速度まで見てくれます。

Prometheusの導入からWebページの死活監視についてのまとめ

ここまででPrometheusの導入をして、blackbox_exporterを設定し、Webページの死活監視をするところまで設定してみました。

Prometheus本体やExpoterであるblackbox_exporterなどの設定項目が非常に少なくて設定しやすい印象でした。
Prometheus本体とExpoterとのやり取りはRESTで行われるため、Protmeteus本体のサーバとExpoterを設置するサーバを分けることも可能ですし、起動するパーミッションを気にする必要がないのもいいなーと思いました。もちろんdockerコンテナで動作することが前提に作られているので、dockerで運用することも非常に簡単だと思います。

今のところ導入したものすべてがGo製なので、ビルドしてしまえばバイナリ1個とyamlの設定ファイルがあれば動作させることができ、オンプレミスなどでも動作させることができるので、様々なシステム構成に合わせて監視できるんじ ゃないかと思いました。

次回以降ではもっと細かい監視設定やアラートの発砲などを試したいと思います。

Libetrada LLC
03-6869-7148
107-0062
東京都 港区 南青山2-15-5 FARO 1F
Who We Are
私達は、システム開発・アプリ開発・ホームページ作成・CMS構築・サーバー開発・広告運用等を、最少人数&ワンストップで行う事ができる会社です。
人数は少数ですが、サーバーサイドを専門とするエンジニアとWebデザインを得意とするクリエイターが居りますので、それぞれの強みを活かした専任サポートが可能です。

© 2017 Libetrada.LLC. All Rights Reserved.