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
では駄目である。