Prometheusについて書いてみる

現状のモニタリング、監視の仕組みにあまり満足していない部分があって、別のツールないかなあと思ってたらふとしたきっかけでPrometheusを知りました。これちょっと面白そうなんで書いときます。

https://prometheus.io

日本語の記事だと【入門】PrometheusでサーバやDockerコンテナのリソース監視 | Pocketstudio.jp log3が参考になります。

ちなみに現状の不満点は何かと言えば、下記の通りです。

  • モニタリングと監視が完全に分かれている
  • HDD使用率などの汎用的なメトリクスをモニタリングするツール(例:Kurado)とミドルウェア、アプリケーション固有のメトリクスをモニタリングするツール(例:Growthforecast)が分かれている

Prometheusはモニタリングと監視が統合されたツールで各種メトリクスも統一的に扱えます。ただし監視に関してはまだexperimentalという扱いです。

Prometheusは音楽のSNSサービスを提供しているSoundCloud社によって2012年から開発されています。
開発言語はGoです。SoundCloud社内で使われている他には、Kubernetesのモニタリングに使われているようです。

Googleな人がBorgmon(Borgのモニタリングソフト?)にインスパイアされて作ったそうです。
Prometheus: A Next Generation Monitoring System (FOSDEM 2016) - YouTube


https://changelog.com/168/
でしゃべっているのを聞いた限りでは既存のOSSモニタリングソフトに満足できなかったから作った。プロメテウス (映画) - Wikipediaは見たこと無いし無関係だそうです。


Prometheusで特長的なのはPull型であることとクエリを持っていることです。

Pull vs PushのPros/Consに関しては上記Podcasthttp://www.boxever.com/push-vs-pull-for-monitoringでも述べられています。

おそらくほとんどのモニタリングソフトはPush型だと思います。
モニタリング対象サーバーにエージェントを仕込んで中央のサーバーにメトリクスをpushするというモデルです。Kuradoとかそうですよね。

Push型のメリットはモニタリング対象ホストが増えても中央のサーバーは何もしなくてよいことです。その代りモニタリング対象でないホストがメトリクスをpushしても受け入れてしまいますし、メトリクスをpushしてこない場合にそれが障害なのか単にpushを止めただけなのかを判断することはできません。


Pull型の話をする前にまずPrometheusのアーキテクチャは下記の通りです。

https://prometheus.io/docs/introduction/overview/

PrometheusではエージェントのことをExporterと呼びます。中央のサーバーがPrometheus Serverです。

ExporterはHTTPサーバーにもなっていて、Prometheus ServerからメトリクスをPullするというモデルです。いろんなExporterがありますが、汎用的なメトリクスだったらGitHub - prometheus/node_exporter: Exporter for machine metricsを使います。

Pull型モデルのメリットはモニタリング対象ホストを完全にコントロールできることですが、モニタリング対象ホストが増えるたびにPrometheus Serverの設定ファイルに対象ホストを追加してリロードする必要があります。またモニタリング対象ホストでlistenすることになるのでfirewallの制限がある場合は難しいかもしれません。


次にクエリですが、これは収集した各種メトリクスをクエリ書いて集計することができるというものです。

クエリの例は https://prometheus.io/docs/querying/examples/ にあります。

直近5分間での毎秒HTTPリクエスト数だったら

rate(http_requests_total[5m])

のように書きます。
http_requests_totalだけだと累計なので差分を求めるためにrateを使います。


収集したメトリクスはPrometheus Server上のローカルのファイルシステムに保存します。
なので例えばHBaseのようなストレージを別途用意する必要はなく簡単に試せます。

Macで試すならこんな感じ。

まずPrometheus Serverをセットアップします。

wget https://github.com/prometheus/prometheus/releases/download/0.16.2/prometheus-0.16.2.darwin-amd64.tar.gz
tar zxvf prometheus-0.16.2.darwin-amd64.tar.gz
cd prometheus-0.16.2.darwin-amd64
vim prometheus.yml
./prometheus -config.file=prometheus.yml

prometheus.ymlは https://prometheus.io/docs/introduction/getting_started/ にあるようにすれば良いと思います。

起動して、http://localhost:9090/ にアクセスすればWeb UIがでてきます。

http_requests_totalを選択してExecuteボタンを押すとこんな感じになります。GMT表示なのは残念。

node_exporterはgit cloneしてmakeして起動すればOKです。
http://localhost:9100/metrics にアクセスすれば動作確認できます。
Push型と違ってPull型なのでメトリクスがちゃんと送れるかのでデバッグはしやすいかも。

prometheus.ymlに下記を追加して、SIGHUPを送れば反映されます。

  - job_name: 'node'
    target_groups:
      - targets: ['localhost:9100']

たぶんPrometheusだけだとグラフ見るのが辛いのでPromdashかGrafanaのようなダッシュボードツールを使うのが王道だと思います。
alertに関しては https://github.com/prometheus/alertmanager を使うようです。

fluentdとの連携に関してはfluent-plugin-prometheusをリリースしましたが参考になります。fluentdのバッファのモニタリングには良いかも。