VPS群をお金だけ払って持て余しているのはもったいないので、以前から検討している監視を行ってみようと思ってます。現時点でPrometheusとZabbixで迷ってまして、とりあえず流行りっぽいPrometheusから試してみました。

やったこと


今回はとりあえず検証ということで、docker-composeで立ち上げてデータを永続化するところまでやりました。Grafanaとの連携とか監視対象にExporterのインストールとかそんなんはやってません。次にやる予定です。

また、今回やったものはこのリポジトリに上げているのですが、このリポジトリはいろいろ弄る予定なので、将来的にこの記事で書いたものとずれる可能性はあります。

環境


  • Prometheus v2.4.0 (公式Dockerイメージを使用)

ディレクトリ構成


下記のようにしました。volumesディレクトリにprometheusで必要なデータをマウントするようにしました。dataディレクトリ配下には後述するデータベースファイルが格納されます。

1
2
3
4
5
6
7
8
9
10
.
├── docker-compose.yml
└── volumes
└── prometheus
├── config
│ └── prometheus.yml
└── data
├── lock
└── wal
└── 00000000

docker-compose.yml


公式イメージがあるのでそれを使用してdocker-compose.ymlを書きます。今回は下記のようにしました。

1
2
3
4
5
6
7
8
9
10
11
version: '3'
services:
prometheus:
image: prom/prometheus:v2.4.0
container_name: prometheus
volumes:
- ./volumes/prometheus/config/prometheus.yml:/etc/prometheus/prometheus.yml
- ./volumes/prometheus/data/:/prometheus
- /etc/localtime:/etc/localtime:ro
ports:
- "9090:9000"

latestを使用してもいいのですが、勝手にバージョンがあがるのが怖いので私は必ずバージョン指定します。今回は現時点最新の2.4.0を指定しました。

データベースとストレージについて


Dockerなのでデータの永続化が必要になりますが、いつも通りホストOSに保存することとします。公式ドキュメントを見るとtime series databaseという時系列DBを使用しているようです。恥ずかしながら時系列DBをしらなかったのですが、独自フォーマットでストレージに保存するようです。

保存先ですが、Dokcerfileを見てみると下記のような記載があります。

1
2
3
4
CMD [ "-config.file=/etc/prometheus/prometheus.yml", \
"-storage.local.path=/prometheus", \
"-web.console.libraries=/etc/prometheus/console_libraries", \
"-web.console.templates=/etc/prometheus/consoles" ]

-storage.local.pathがそれっぽいですね。公式イメージだと/prometheusに該当します。というわけで、前述のdocker-compose.ymlでは永続化するためにそれをvolumesに指定しています。こうすることで、今回の構成であればホストOS側に下記のような感じで保存されます。

1
2
3
4
└── data
├── lock
└── wal
└── 00000000

タイムゾーン


イメージはbusyboxをベースとしており、docker-compose.ymlのenvironmentでタイムゾーンの指定ができません。ですので、今回はホストOSのlocaltimeをマウントすることとしました。

1
2
3
4
volumes:
- ./volumes/prometheus/config/prometheus.yml:/etc/prometheus/prometheus.yml
- ./volumes/prometheus/data/:/prometheus
- /etc/localtime:/etc/localtime:ro

この場合だとDocker for Windowsではエラーで動かない(/etc/localtimeがないので)のですが、どうせ実運用するときはLinuxなのでこれで行くことにします。

設定ファイルを書く


デフォルトをまるまる参考にして、下記のようにします。

1
2
3
4
5
6
7
8
9
global:
scrape_interval: 10s
external_labels:
monitor: 'codelab-monitor'
scrape_configs:
- job_name: 'prometheus'
scrape_interval: 10s
static_configs:
- targets: ['localhost:9090']

ここで注意するのはtargetsですが。localhostを指定しいますが、今回はDockerで動かしているのでDocker内のPrometheusそのものが監視対象になります。ホストOSではありません。

ビルドして立ち上げる


後はdocker-compose upで上げるだけです。

永続化されているか確認してみる


一旦、コンテナを落として、データが永続化されているか確認してみました。下記のような感じでちゃんと、落ちる前のグラフが残っているのでできてますね。

感想


ああ。やっぱDocker楽ですね。あと、DBの構築が不要だったのもよいです。次回はGrafanaとの連携辺りをやる予定です。その前にZabbixも試してみるつもりです。