PrometheusとGrafanaで複数台のサーバを監視する

趣味のサービスを運用しているが、何らかの監視をしたい。 しかし、DataDogやNewRelic、Mackrelのように有償のサービスを使うほどではない。 けれども、Zabbixはなんか嫌だったので、Prometheus + Grafanaで監視の仕組みを構築した。
構成
- 監視用サーバ Ubuntu16
- nginx
- docker
- Prometheus
- Grafana
- node_exporter
- 監視対象サーバ1 Ubuntu16
- node_exporter
- 監視対象サーバ2 Ubuntu16
- node_exporter
監視用サーバの設定
docker-compose.yml
PrometheusとGrafanaをDockerで構築する。
両方ともデータを永続化するために volumes を作成して、データが保存されるフォルダにマッピングさせている。
今回Grafanaはサブディレクトリ運用をするため、 GF_SERVER_ROOT_URL をこのように設定した。
version: '3'
services:
prometheus:
image: prom/prometheus:v2.17.2
ports:
- 9090:9090
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus_data:/prometheus
grafana:
image: grafana/grafana
ports:
- 3000:3000
environment:
GF_SERVER_DOMAIN: "manage.example.com"
GF_SERVER_ROOT_URL: "https://manage.example.com/grafana"
volumes:
- grafana_data:/var/lib/grafana
volumes:
prometheus_data:
grafana_data:
/etc/nginx/sites-enabled/default
nginxでリバースプロキシする。今回はHTTPSでかつBasic認証を設定した。(これらの設定はこの記事では対象としない)
ただしGrafanaをBasic認証を経由して使う場合は proxy_set_header で Authorization を空文字にしておく必要がある。
Authorization ヘッダーがGrafanaまで届いてしまうと Invalid username or password というエラーが出るためである。
{
listen 443 default_server ssl http2;
server_name manage.example.com;
ssl_certificate /etc/letsencrypt/live/manage.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/manage.example.com/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers AESGCM:HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
ssl_verify_client off;
auth_basic "Secret";
auth_basic_user_file /etc/nginx/global_htpasswd;
charset utf-8;
access_log /var/log/nginx/manage.access.log;
error_log /var/log/nginx/manage.error.log;
location /grafana/ {
proxy_set_header Authorization "";
proxy_pass http://localhost:3000/;
}
}
prometheus.yml
ターゲットとなるIPアドレスは各自の環境に合わせて設定すること。
global:
scrape_interval: 15s
external_labels:
monitor: 'codelab-monitor'
scrape_configs:
- job_name: 'prometheus'
scrape_interval: 5s
static_configs:
- targets:
- prometheus:9090
- job_name: 'node'
scrape_interval: 5s
static_configs:
- targets:
- 192.168.0.2:9100
- 192.168.0.3:9100
- 192.168.0.4:9100
参考サイト
監視対象サーバの設定
NodeExporterはDockerではなくUbuntu上でそのまま動かす。 下記のサイトのやり方をそのまま踏襲した。
wget https://github.com/prometheus/node_exporter/releases/download/v0.18.1/node_exporter-0.18.1.linux-amd64.tar.gz tar -zxvf node_exporter-0.18.1.linux-amd64.tar.gz sudo mv node_exporter-0.18.1.linux-amd64/node_exporter /usr/local/bin/ sudo vim /etc/systemd/system/node_exporter.service sudo systemctl daemon-reload sudo systemctl start node_exporter.service sudo systemctl enable node_exporter.service
/etc/systemd/system/node_exporter.service
[Unit] Description=Node Exporter [Service] Type=simple ExecStart=/usr/local/bin/node_exporter PrivateTmp=false [Install] WantedBy=multi-user.target
Grafanaでのデータソース追加
基本的なGrafanaの使い方はインターネット上の別の記事に任せるが、一点だけ注意する点として、URLを http://prometheus:9090 にする必要がある。Docker上のGrafanaがPrometheusにアクセスする場合、 localhost では駄目である。
