mmts1007’s diary

プログラミング関連の技術系ブログです。

Grafana を使ってサーバメモリ使用率、CPU使用率を可視化する

top コマンドや free コマンドなどで確認していたサーバ負荷状況をグラフィカルに見やすできないのかと思い調べたところ、Grafana という可視化ツールがあったので試してみました。

Grafana とは

grafana.org

  • インフラや、アプリケーションの分析データなど時系列データを可視化するためのダッシュボードツール
  • デフォルトで複数のデータストアをサポートしている
    • Graphite
    • Elasticsearch
    • Cloudwatch
    • Prometheus
    • InfluxDB

今回は InfluxDB を利用しました。

構成

VagrantVM を 2個立ち上げて作成しました。

  • 負荷状況を送信するサーバ(CentOS 6.7)
  • Grafana, InfluxDB サーバ(CentOS 6.7)
    • 本来は Grafana と InfluxDB は別サーバにすべきだと思いますが、お試しのため同居させています。

f:id:mmts1007:20170110182941p:plain

  1. 負荷情報を確認したいサーバの CPU, メモリ情報を InfluxDB に送信
  2. InfluxDB は CPU, メモリ情報を DB に格納
  3. ブラウザから Grafana ダッシュボードにアクセス
  4. Grafana はダッシュボードを表示するために必要な情報を InfluxDB から取得し、ダッシュボードを表示する

インストール手順

Grafana のインストール

http://docs.grafana.org/installation/rpm/ を参考に Grafana をインストール

# Grafana のインストール
$ sudo yum install https://grafanarel.s3.amazonaws.com/builds/grafana-4.0.2-1481203731.x86_64.rpm

# Grafana を起動
$ sudo service grafana-server start

http://192.168.33.10:3000/login にブラウザからアクセスし、Grafana のログイン画面が開くことを確認 f:id:mmts1007:20170110190024p:plain

InfluxDB のインストール

https://www.influxdata.com/downloads/ に記載されている「RedHat & CentOS」のとおり実施

f:id:mmts1007:20170110191059p:plain

# influxDB をダウンロード
$ wget https://dl.influxdata.com/influxdb/releases/influxdb-1.1.1.x86_64.rpm

# インストール
$ sudo yum localinstall -y influxdb-1.1.1.x86_64.rpm

# InfluxDB 起動
$ sudo service influxdb start

InfluxDB データベースの作成

https://docs.influxdata.com/influxdb/v1.1/introduction/getting_started/ を参考にデータベースを作成します。

$ influx
Visit https://enterprise.influxdata.com to register for updates, InfluxDB server management, and monitoring.
Connected to http://localhost:8086 version 1.1.1
InfluxDB shell version: 1.1.1
> CREATE DATABASE grafana

# DB が作成されているか確認
> SHOW DATABASES
name: databases
name
----
_internal
grafana

Grafana のセットアップ

Grafana の管理画面から利用するデータストアや、ダッシュボードの設定します。

  1. http://192.168.33.10:3000/login にブラウザからアクセス(admin/admin でログイン)
  2. 左上 Grafana アイコンクリック → 「Data Sources」 をクリック f:id:mmts1007:20170110202657p:plain

  3. 「Add Data Source」をクリック f:id:mmts1007:20170110202952p:plain

  4. InfluxDB の情報を入力、「Add」をクリック f:id:mmts1007:20170110203120p:plain

負荷情報の取得方法

InfluxDB へのデータアクセス方法は、複数サポートしています。
今回は負荷情報を確認したいサーバから InfluxDB の HTTP API を利用して負荷情報を送信します。

CLI

https://docs.influxdata.com/influxdb/v1.1/tools/shell/

$ influx -execute 'SELECT * FROM "h2o_feet" LIMIT 3' -database="NOAA_water_database" -precision=rfc3339
name: h2o_feet
--------------
time                           level description        location         water_level
2015-08-18T00:00:00Z     below 3 feet               santa_monica     2.064
2015-08-18T00:00:00Z     between 6 and 9 feet  coyote_creek  8.12
2015-08-18T00:06:00Z     between 6 and 9 feet  coyote_creek  8.005

HTTP API

https://docs.influxdata.com/influxdb/v1.1/tools/api/

$ curl -i -XPOST "http://localhost:8086/write?db=mydb&precision=s" --data-binary 'mymeas,mytag=1 myfield=90 1463683075'

クライアントライブラリ

https://docs.influxdata.com/influxdb/v1.1/tools/api_client_libraries/

実際に利用したコマンドは以下のとおり

メモリの使用率を取得するスクリプト

while true; do
  curl -i -s -XPOST 'http://192.168.33.10:8086/write?db=grafana' --data-binary "memory,host=serverA,region=jp_east value=`free -t | grep Total | sed 's/[\t ]\+/\t/g' | cut -f3`"
  sleep 5
done

CPU の使用率を取得するスクリプト

while true; do
  idle=`mpstat | tail -n 1 | sed 's/[\t ]\+/\t/g' | cut -f11`
  rate_of_cpu=`echo "100-${idle}" | bc`
  curl -i -s -XPOST 'http://192.168.33.10:8086/write?db=grafana' --data-binary "cup,host=serverA,region=jp_east value=${rate_of_cpu}"
  sleep 5
done

まとめ

ダッシュボードを作成し、以下のような値が取得できるようになりました。 f:id:mmts1007:20170111000020p:plain

過去のデータも確認することができますし、毎回サーバにログインする手間もなくなるので楽になりそうですね。

本番で運用するためには Grafana の admin ユーザのパスワード変更や、InfluxDB の パスワード設定などセキュリティの設定をする必要があります。(今回は Vagrant 上にお試しで作ったのでセキュリティ部分に関しては設定していません)