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

f:id:riosu:20200423184008p:plain

趣味のサービスを運用しているが、何らかの監視をしたい。 しかし、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_headerAuthorization を空文字にしておく必要がある。 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

参考サイト

github.com

監視対象サーバの設定

NodeExporterはDockerではなくUbuntu上でそのまま動かす。 下記のサイトのやり方をそのまま踏襲した。

www.tmp1024.com

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

f:id:riosu:20200423183509p:plain
Grafana Datasource