Prometheus+Grafanaなサーバ監視ことはじめ (導入編)

はじめに

こんにちは、さのじです。
さっきまで、沖縄にいて、今日帰ってきました。
四国寒すぎて泣いてます。沖縄に帰りたい。

これは、SLP KBIT Advent Calendar 2018の6日目の記事です。

最近、自身が大学で管理するサーバ台数が増えてきました。
たぶん、合計すると20台くらいでしょうか。
いままでは3台そこらだったんで、適当に管理していた(アカン)わけですが…
もうそろそろ、さすがに限界ということで、
最近流行りのPrometheusを使ってみることにしました。
ついで、Grafanaで可視化とアラートもやってみました。結構いい感じ🎉

本編は導入とお試し利用のみのイントロ編です😋  活用方法は次回以降で。

Prometheusとは?

そもそもPrometheusとはなんだという話で。

Prometheusは、サーバ等の監視と通知のためのツールです。
開発はGo言語で行われていて、OSSとして開発が続いているらしい。
元々は音声共有サービスのSoundCloudが開発を始めたよう。

一般的な監視ツール同様に、データの収集、アラート、
メトリクス値やグラフの表示ができます。
それだけではなく、PromQLという独自のクエリ言語が利用でき、
データの取り出しや平均化、評価などなど、様々な処理が行えます。
実際使ってみると、とても便利なクエリ言語です。

Prometheusは、大きく以下の2つのサービスがあります。

  • Prometheus
    • 監視サーバで動かす
    • Exporterから出力されるリソースの情報を収集する
    • 収集した情報をDBに保存する
    • クエリによるデータの集計などを行う
  • Exporter
    • 監視対象ノードで動かす
    • 監視の対象ノードのリソース情報を収集する
例えば、メモリの使用率とかもこんな感じ

Grafanaとは?

次にGrafanaとはなんぞという話です。

Grafanaは、ログやデータの可視化ツールです。結構いろいろなサービスに対応していて、Prometheusはもちろん、InfluxDBやElasticsearchなどにも対応しています。Alertも出せて、Slackなどはもちろんのこと、LINEにも対応していたりします。

Prometheusとの連携では、GrafanaからPromQLのクエリを発行して、データを抽出し、可視化する手順を踏みます。これらの手順はWeb GUI上で行えるため、非常に簡単です。

こんな感じで可視化できる

Prometheusを導入する

それでは早速、Prometheusを導入してみましょう。
なお、これはLinuxへの導入例です。Darwinなどへの導入のさいは、
バイナリのダウンロード元を変更してください。

監視サーバを導入する


はじめに、監視サーバであるPrometheusを導入します。
今回は、実行バイナリとsystemdを使った導入方法を紹介します。

まず、実行バイナリをダウンロードし、/usr/sbin/あたりに移動しておきます。
さらに、設定ファイルも、/etcの以下に移動しておきます。
なお、Prometheusは、単バイナリで動作します。

$ wget https://github.com/prometheus/prometheus/releases/download/v2.5.0/prometheus-2.5.0.linux-amd64.tar.gz
$ tar xvf prometheus-2.5.0.linux-amd64.tar.gz
$ cd prometheus-2.5.0.linux-amd64
$ sudo mv prometheus /usr/sbin
$ sudo mkdir /etc/prometheus
$ sudo mv prometheus.yml /etc/prometheus

次に、Systemdに登録して、デーモンとして起動できるようにします。
/etc/systemd/system/prometheus.service を作成し、以下を追記します。

[Unit]
Description=Prometheus

[Service]
ExecStart=/usr/sbin/prometheus --config.file /etc/prometheus/prometheus.yml \
    --storage.tsdb.path /var/lib/prometheus/ \
    --web.console.templates=/etc/prometheus/consoles/ \
    --web.console.libraries=/etc/prometheus/console_libraries/

[Install]
WantedBy=multi-user.target

最後に、systemdでprometheusを起動します。

$ sudo systemctl daemon-reload
$ sudo systemctl enable prometheus
$ sudo systemctl start prometheus

これで、Prometheusの導入自体は終了です。
この状態では、認証なしで誰でもPrometheusを利用できてしまうため、
必要に応じて、NginxなどでBasic認証を掛けてやる必要があります。

監視対象ノードにExporterを導入する

次に、監視対象のノードにExporterを導入します。
今回は、ハードウェアの監視を行うため、Node Exporterを導入します。
実際の導入手順は、Prometheusを導入する方法と、あまり変わりません。

はじめに、Node Exporterをダウンロードし、
実行バイナリを/usr/sbin/あたりに移動しておきます。
Exporterも、Prometheus同様に単バイナリで動作します。

$ wget https://github.com/prometheus/node_exporter/releases/download/v0.17.0/node_exporter-0.17.0.linux-amd64.tar.gz
$ tar xvf node_exporter-0.17.0.linux-amd64.tar.gz
$ cd node_exporter-0.17.0.linux-amd64
$ sudo mv node_exporter /usr/sbin

次に、Systemdへの登録です。etc/systemd/system/node_exporter.service を
作成し、以下を追記します。

[Unit]
Description=Node Exporter

[Service]
ExecStart=/usr/sbin/node_exporter

[Install]
WantedBy=multi-user.target

これを追加したら、Systemdを使い、Node Exporterを起動します。

$ sudo systemctl daemon-reload
$ sudo systemctl enable node_exporter
$ sudo systemctl start node_exporter

最後に、Prometheusから、Node Exporterを監視するように設定します。
Node Exporterは、標準で9100番ポートで可動します。
今回は、LocalhostにNode Exporterを設置したと想定して、
設定ファイルを記述します。

それでは、以下のように、/etc/prometheus/prometheus.ymlを編集して、
監視対象を追加しましょう。

global:
  scrape_interval:     5s 
  evaluation_interval: 5s 
  external_labels:
      monitor: 'codelab-monitor'

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: 
        - 'localhost:9090'
  - job_name: 'node'
    static_configs:
      - targets:
        - 'localhost:9100'

注目してほしいのは、

  - job_name: 'node'
    static_configs:
      - targets:
        - 'localhost:9100'

ここの部分です。targetsとしてlocalhost:9100を追加しているのがわかります。これが終わったら、systemdを使い、prometheusを再起動しましょう。

Prometheusを使ってみる

これが終われば、最低限Prometheusが使えるようになっているはずです。
Prometheusは9090番ポートで動作します。
Webブラウザで、監視サーバの9090番ポートにアクセスしてみましょう。
以下のように表示されていれば成功です🎉

PromQLを試す

試しに、PromQLを発行してみましょう。
PromQLは、テキストエリアに入力し、Executeボタンで実行されます。
今回は、監視対象ノードのメモリ使用率を取ってみます。
insert metric at cursorリストを開くと、標準的なクエリが一覧で出てきます。

この中で、ノードのメモリ総量を取得する node_memory_MemTotal_bytes を
選択してみます。Executeボタンを押し、以下のようになればOKです。

なお、Graphタブを選択すると、グラフが表示されます。
次に、テキストエリアの中身を消去して、再びリストを開きます。
この中から、フリーなメモリ量を取得できる
node_memory_MemTotal_bytesを選択して、Executeします。
Valueに注目しながら、Executeを何度も押してみてください。
値が時々で変化しているのが確認できるはずです。

なお、これらのクエリのあとに、{instance=”localhost:9100″,job=”node”}
をつけて、ノードを特定します。
複数のノードがひとつのPrometheusに監視されている場合、Elementには
複数のノードがリストされます。
これらから、特定のノードを特定するために、行います。

では、この2つのクエリを使って、メモリの使用率をグラフにしてみましょう。
PromQLは、四則演算にも対応しています。
現在、メモリの総量と、フリーなメモリ量が取得できています。
つまり、以下の計算を行えば、メモリの100分率の使用率がわかるはずです。

(メモリの総量フリーなメモリ量) / メモリの総量 * 100

これを具体的に、PromQLにすると、以下のようになるはずです。

(node_memory_MemTotal_bytes{instance="localhost:9100",job="node"} 
- node_memory_MemFree_bytes{instance="localhost:9100",job="node"})
/ node_memory_MemTotal_bytes{instance="localhost:9100",job="node"}
* 100

ちょっと長いですね。でも、これでメモリの使用率が取得できます。
このクエリを入力し、実行してみましょう。
更に、Graphタブを選択すると、時系列で使用率を監視することができます。

メモリの使用率がこんな感じで取れたらOK!

このような感じで、ディスクやCPU、ネットワーク使用状況など取得できます。
これらの活用方法は、次回以降に詳しく。

Grafanaを導入する

次に、可視化ツールとして、Grafanaを導入してみましょう。
Grafanaの導入はDocker Composeを用いてやってみます。
そのため、この作業を行う前に、DockerとDocker Composeを
導入しておいてください。

まず、docker-compose.ymlを作成します。
任意のディレクトリで、次のような内容のdocker-compose.ymlを
作成してください。

なお、今回は公開ポートを3000番にしていますが、
環境に応じて変更してください。

grafana:
  image: grafana/grafana
  ports:
    - "9900:3000"

これが終わったら、以下のコマンドでGrafanaを起動します。
-dオプションでデーモナイズするのもお忘れなく。

$ docker-compose up -d 

これで、Grafanaは導入完了です。

おわりに

今回は、PrometheusとGrafanaの導入と、PromQLのお試しをやってみました
次回からは、連携の方法やPromQLの詳細な利用方法を紹介します。
更に、Blackbox Exporterを使ったHTTPサーバの監視も扱う予定です。

参考

余談

高松から沖縄って、神戸空港経由だったらめちゃくちゃ安くいけるんですね

ほんとは、Grafanaの連携も書こうとしたけど、時間なかった()

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です