最近、運用監視ツールについて検討する機会があったので色々運用監視ツールを比較していたら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自身のCPU使用率だったり、メモリ使用率だったりするようです。
デフォルトの状態でこれだけのメトリクスを見ることができます。
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_ほにゃらら」という項目が幾つか追加されています。
そのうちのprobe_successというのが死活監視の結果が見られるメトリクスです。
この画面をみると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の設定ファイルがあれば動作させることができ、オンプレミスなどでも動作させることができるので、様々なシステム構成に合わせて監視できるんじ ゃないかと思いました。
次回以降ではもっと細かい監視設定やアラートの発砲などを試したいと思います。