新卒SREが監視のありがたみを知って自宅サーバーにも監視を導入した話

この記事はGMOペパボエンジニア Advent Calendar 2021の22日目の記事です。

昨日は、kurehajimeさんの「新言語『TypoScript』を作った」でした。Typoを許容する言語を作られたということで”もっとおもしろくできる”を体現したような記事でした。自分もTypoしまくってコンパイラ・インタプリタ・CIなどもろもろに怒られまくっているのでたまにはTypoScriptのように許してほしいです。


はじめに

少し前の記事で念願のエンジニアになったよみたいな話をチョロっと書いたのですが、その時は配属先が決まっておらず何エンジニアになるんだろうなぁみたいな感じでした。現在はタイトルの通りSREエンジニアということで頑張らせていただいてます。

SREなので仕事でサーバーの監視とかもやっていて、監視のありがたみを身を持って感じていたので自宅にも監視入れたいよなぁとぼんやり思いつつ生活してました。そんな時….

ということで、自宅にPrometheus + Grafanaというよくある構成で監視とそれをグラフィカルに表示するやつを導入してみました。


目次

  • Rasspberry Piのセットアップ
  • Prometheusの導入
  • 監視対象へNode Exporterの導入
  • Grafanaの導入
  • Grafanaからアラートを飛ばしてみる

RaspberryPiのセットアップ

用意したもの

  • 転がってたRaspberryPi3 B+
  • ↑に刺さってたmicroSDカード 8GB
  • FiioX5 3rd Gen

Raspberry Pi OSのイメージを焼く

もともと刺さってたmicroSDにもRaspbianが突っ込まれていたが、全然使ってなかったので古いのが入ってると読んで焼き直すことに。

なんか、今はRaspbianではなくRaspberry Pi OSという名前に変わったらしく、それのLite版(軽いやつ)を落としてきました。あと、SDカードリーダライタがなかったのでAndroidが入ってるFiio X5 3rd Genにその役割を担ってもらいました。

FiioX5 3rd Gen (DAPです)

SSHの許可とかIPアドレスの固定とか

Raspberry Pi OSはデフォルトではSSHを許可されていないので許可してあげます。

許可をするには/boot/以下に空のsshという名前のファイルを作って再起動するだけ。

# Raspberry Pi

$ touch /boot/ssh
$ sudo reboot

IPアドレスの固定はdhcpcd.confを編集した上でdhcpcdを再起動することで可能になります。

# Raspberry Pi

$ sudo  vi /etc/dhcpcd.conf

static ip_address=<static ip address>
static routers=<router ip address>
static domain_name_servers=<dns ip address>


$ sudo systemctl restart dhcpcd


Prometheusの導入

公式からバイナリを落としてきて展開します。今回はRaspberryPiを使っているのでarmv7用のバイナリを使います。
https://prometheus.io/download/

# Raspberry Pi

$ wget https://github.com/prometheus/prometheus/releases/download/v2.32.1/prometheus-2.32.1.linux-armv7.tar.gz
$ tar -xzvf prometheus-2.32.1.linux-armv7.tar.gz

展開したディレクトリに移動してPrometheusを起動してみます。

# Raspberry Pi

$ ./prometheus-2.32.1.linux-armv7/prometheus --config.file=prometheus.yml

起動すると、9090番でHTTPを待ち受けるようになるのでブラウザでシュッとアクセスしてみるとPrometheusのいい感じなGUIが表示されます。

†ダークモード†にしてます

察しの良い方は実行コマンドを見ただけで「はいはいなるほどね」となったかもしれませんがprometheus.ymlにいろいろ設定を書くことで監視対象を追加したりできるみたいです。


監視対象へNode Exporterの導入

今回は、あなたが今見ているこのブログを支えているサーバーを監視したいと思います。

監視をするために、対象のサーバーにPrometheus Exporterをインストールをします。Prometheus Exporterには様々な種類があり、欲しいメトリック合わせて適切なものをインストールする必要があるのですが今回は一般的なCPU使用率やメモリ使用量を取ることができるNode Exporterを入れました。

まず、Node Exporterが使用する9100番を開けます。ここではfirewalldを使用しています。

# 監視対象サーバー 

$ sudo firewall-cmd --add-port=9100/tcp --zone=public --permanent
$ sudo firewall-cmd --reload

次に、公式サイトからNode Exporterを落としてきます。
(自分は最初間違えて、Raspberry Piのときと同様にarmv7を落としてしまって動かなかったりしたので注意)
https://prometheus.io/download/

# 監視対象サーバー

$ wget https://github.com/prometheus/node_exporter/releases/download/v1.3.1/node_exporter-1.3.1.linux-amd64.tar.gz
$ tar -xzvf node_exporter-1.3.1.linux-amd64.tar.gz

Node Exporterを実行してみます。

# 監視対象サーバー

$ ./node_exporter-1.3.1.linux-amd64/node_exporter

実行して動かしているサーバーの9100番へアクセスするとなんだか人生で初めて作ったWebサイトみたいなページが出てきます。これがNode Exporterです。

中学生の時に作った黒歴史のようなWebサイトを思い出します

Metricsリンクを踏むとメトリクスがplaintextで表示されます。以下は一部抜粋しているものを貼っていますがCPU使用率を返してくれている感じがありますね。PrometheusはPull型の監視ツールなのでこの値を見に来てPromeheusのGUIに表示します。

# HELP node_cpu_guest_seconds_total Seconds the CPUs spent in guests (VMs) for each mode.
# TYPE node_cpu_guest_seconds_total counter
node_cpu_guest_seconds_total{cpu="0",mode="nice"} 0
node_cpu_guest_seconds_total{cpu="0",mode="user"} 0
# HELP node_cpu_seconds_total Seconds the CPUs spent in each mode.
# TYPE node_cpu_seconds_total counter
node_cpu_seconds_total{cpu="0",mode="idle"} 204862.31
node_cpu_seconds_total{cpu="0",mode="iowait"} 20.25
node_cpu_seconds_total{cpu="0",mode="irq"} 0
node_cpu_seconds_total{cpu="0",mode="nice"} 0.16
node_cpu_seconds_total{cpu="0",mode="softirq"} 17.69
node_cpu_seconds_total{cpu="0",mode="steal"} 0
node_cpu_seconds_total{cpu="0",mode="system"} 19057.56
node_cpu_seconds_total{cpu="0",mode="user"} 26489.73

Node Exporterが動いたので、Prometheus側ではどう表示されるのか軽く見てみようと思いますが、その前にPrometheusに監視対象を追加します。

Prometheusに監視対象を追加するには実行時に引数に渡していたprometheus.yml内のstatic_configs.targetに監視対象のIPアドレスを追加することで可能になります。

# Raspberry Pi

$ vim ./prometheus-2.32.1.linux-armv7/prometheus.yml 

static_configs:
  - targets: ["localhost:9090", <監視対象 IP Address>]

PrometheusのGUIに戻り、検索窓にnode_cpu_seconds_totalと書いてみました。(先程のNode ExporterのMetricsにあったもの)

idle, user, systemなど各種取れてる

いい感じに取れてそうですね。

ちなみに、Prometheusでメトリクスを参照するのに使う言語はPromQLと呼ばれる独自のものらしいです。


Grafanaの導入

今回、GrafanaはPrometheusと同じRaspberry Piに入れておくことにしました。

Grafanaの公式サイトにインストール手順が書いてあるのでそれに従いインストールを進めていきます。Raspberry Pi OSはDebianベースなのでdevを使います。

# Raspberry Pi

$ sudo apt-get install -y adduser libfontconfig1
$ wget https://dl.grafana.com/oss/release/grafana_8.3.3_amd64.deb
$ sudo dpkg -i grafana_8.3.3_amd64.deb

そのまま起動します。

$ sudo systemctl enable grafana-server
$ sudo systemctl start grafana-server

今度は3000番にアクセスするとGrafanaが上がっているはずです。ログインを求められますが、デフォルト値のユーザー名、パスワードともにadminで入れます。

インストール直後のスクショ取り忘れちゃった

次に、Grafanaのデータソースの設定をします。左にある歯車のアイコン > Data sources > Add data source > Prometheus で必要な情報を入力し保存します。これによりGrafanaからPrometheusのデータを参照することができるようになりました。

さっそくGrafanaでCPU使用率をグラフにしてみます。左側の+ > Dashboard > Add a new panel で移動します。

遷移先で、Metrics browserに以下のクエリを書き込みます。このクエリは監視対象のCPUのidleの値を100から引くことで全体のCPU使用率を求めています。

100 - rate(node_cpu_seconds_total{instance=<監視対象IPアドレス>,mode="idle"}[5m]) * 100

UnitやTitleなどをそれっぽく変更するとカッコいいグラフが表示されます。


Grafanaからアラートを飛ばしてみる

Grafanaには特定条件を満たすとメールやSlack、Discordなど様々な任意の場所に通知してくれる機能があるのでそれを使ってみます。

まず、どこに通知するかを設定します。左側のベルマーク > Notification Channel > New channel で遷移した先で各種情報を入力していきます。

今回はSlackに通知したいのでTypeをSlackにしてWebhookのURL等を設定しました。

個人のSlackChannelに飛ばした

一番下のTestをクリックすると実際にテストアラートが送信されます。

次に、グラフを作成する際に使用したページ(左側の+ > Dashboard > Add a new panel)のAlertタブに遷移します。ここでアラートを発砲させたい条件を入れていきます。

今回の場合はCPU使用率が3分間90%を超えたら発砲するようにしてみます。Send toには先程設定したNotification Channelを指定しましょう。

設定が完了するとグラフタイトルの横に緑色のハートマークが表示されるようになります。

ちなみに、別のアラートですが失敗するとこのようにハートマークが赤くなり、何時何分からアラートが発砲したか分かるようになります。


終わりに

今回はよくあるPrometheus + Grafanaの導入の話を書きました。本当はBlackBox Exporterの話やPrometheus Exporterの自作とかもしたかったのですが、想像以上に1本目で分量が出てしまったのでそれはまたどこかでやってみて執筆できたらなと思ってます。

監視を入れたことで、この記事を書いている途中実際に謎のCPU使用率上昇に気がつくことができました。すごい!便利!監視最高!みんなも監視しよう!!!!

以上です。ここまでご覧いただきありがとうございました。


Advent Calendar 23日目はtick-takuさんです!よろしくお願いします!

コメントを残す

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

CAPTCHA