みーのぺーじ

みーが趣味でやっているPCやソフトウェアについて.Python, Javascript, Processing, Unityなど.

Ubuntu Serverの通信量を監視する

Ubuntu Serverの通信量を監視するために,Node exporterを使って情報を集め,Prometheusで記録し,Grafanaで表示するようにしてみました.

Node exporter

ハードウェアとOSの情報を取得するためのソフトウエアです.デフォルトで9100 ポートで動作し,/metricsにHTTPでアクセスすればデータが帰ってきます.とてもシンプルな設計です.

GitHub - prometheus/node_exporter: Exporter for machine metrics

Dockerで管理できれば簡単なのですが,コンテナに接続された仮想のeth0の情報しか取得できないので,ホストにインストールします*1

以下のリンクから最新版のNode exporterをダウンロードします.

https://github.com/prometheus/node_exporter/releases

展開するとnode_exporterという名前のファイルが入っているので,これを例えば/usr/local/binに保存します.ひとまずこれで起動するようになりました.

Ubuntu Serverなので,systemctlで管理することにします.

/usr/lib/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

以下のコマンドでサービスが起動するか確認します.

systemctl start node_exporter.service

問題なければ有効にします.

systemctl enable node_exporter.service

http://localhost:9100/metrics にアクセスすればデータを取得できます.

PrometheusとGrafana

Prometheus - Monitoring system & time series database

Grafana: The open observability platform | Grafana Labs

これらはDockerで管理することにします.

docker-compose.yaml

version: "3"

services:
  prometheus:
    image: prom/prometheus:latest
    container_name: prometheus
    restart: unless-stopped
    volumes:
      - ./prometheus.yaml:/etc/prometheus/prometheus.yaml
      - prometheus_data:/prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yaml'
      - '--storage.tsdb.path=/prometheus'
      - '--web.console.libraries=/etc/prometheus/console_libraries'
      - '--web.console.templates=/etc/prometheus/consoles'
      - '--web.enable-lifecycle'
    ports:
      - 9090:9090
    extra_hosts:
      - host.docker.internal:host-gateway
      
  grafana:
    image: grafana/grafana
    container_name: grafana
    restart: unless-stopped
    volumes:
      - grafana_data:/var/lib/grafana
    ports:
      - 3000:3000

volumes:
  prometheus_data: {}
  grafana_data: {}

Installation | Prometheus

node_exporterがホストで動作しているため,Prometheusがホストにアクセスできるように,host.docker.internal:host-gatewayを追加しています*2

prometheus.yaml

global:
  scrape_interval: 15s

scrape_configs:
  - job_name: "prometheus"
    scrape_interval: 5s
    static_configs:
    - targets: ["localhost:9090"]

  - job_name: "node"
    static_configs:
    - targets: ["host.docker.internal:9100"] 

Prometheusの情報収集とNode exporterの情報収集をするよう設定します.

以下のコマンドで起動します.

docker-compose up -d

以下のリンクからPrometheusとGrafanaにアクセスできるようになります.

http://localhost:9090/

http://localhost:3000/

なお,restart: unless-stoppedを設定しているので,今後はDockerにより自動的に起動されます.

ファイアウォールの設定

ufwで設定している場合は,host.docker.internal:host-gatewayが使えるように9100ポートを許可します.

sudo ufw accept 9100

必要に応じて9090ポートと3000ポートも許可しておきます.

sudo ufw enable

How To Set Up a Firewall with UFW on Ubuntu 18.04 | DigitalOcean

Grafanaの設定

Prometheusをデータソースとして追加します.docker-composeで起動している9090ポートのPrometheusにGrafanaからアクセスするために,http://prometheus:9090と指定します.

f:id:atsuhiro-me:20220414033808p:plain

f:id:atsuhiro-me:20220414033812p:plain

f:id:atsuhiro-me:20220414033816p:plain

通信量を確認

Node Exporter Quickstart and Dashboard dashboard for Grafana | Grafana Labsをインポートしてみたところ,CPUやメモリー,ディスク,ネットワークの情報が表示されました.

f:id:atsuhiro-me:20220414031441p:plain

試しに少し大きめのファイルをインターネットからダウンロードしてみたところ,Network RecievedとNetwork Transmittedに大きな山ができましたので,正しくデータが取得できているように思われました.

あとはサーバーをつけっぱなしにしておけば,Node exporterとPrometheusが自動的にデータを記録してくれます.Grafanaのダッシュボードをいい感じにカスタマイズして完成です.

*1:https://github.com/prometheus/node_exporter に, The node_exporter is designed to monitor the host system. It's not recommended to deploy it as a Docker container because it requires access to the host system. と記載あり.Prometheus node_exporter in docker: Host networking vs hostnames - Stack Overflowに同様の質問あり.

*2:How to connect to the Docker host from inside a Docker container? | by Tim van Baarsen | Mediumに詳細あり.