ぶていのログでぶログ

思い出したが吉日

Mackerelでサーバインベントリを取得する / mipsel向けのmackerel-agentを作った

この記事はMackerel Advent Calendar 2022の12/21の記事です。 昨日はid:stefafafanさんのMackerelのサービスメトリックを簡単に投稿するためのGitHub Actionsを作ったでした。 GitHub Actionsを使ってMackerelにサービスメトリックを投稿するという内容でした。 実際のユースケースやGitHub Actionsでテクニックが紹介されいてとても参考になる記事でした! 明日はid:genkiroidさんです!


業務においてサーバインベントリを収集する必要性が出てきた。 サーバインベントリを収集する方法はいくつか考えられるが、今回はちょうどよく対象のサーバ群にMackerelがインストールされていたので、Mackerelを使ってインベントリを収集しようということになった。

mkr_inventory.rb

gist.github.com

使い方は以下の通り。

export MACKEREL_APIKEY=<APIキーを入れる>
ruby mkr_inventory.rb

このスクリプトを実行すると以下の情報がCSV形式で出力される。

  1. Server Name
  2. vCPUs
  3. RAM(GB)
  4. CPU Utilization Peak (%)
  5. RAM Utilization Peak (%)
  6. Operation System
  7. Provisioned Storage (GB)

Mackerelに登録されているサーバがLinuxであれば正しく取れることを確認しているが、その他の環境においては確認していない。

実装について

mackerel-ruby-clientを使って、各ホストのmetadataとメトリックをとっている。 なおこの時、CPU情報やメモリ情報がない場合はサーバインスタンスではない*1として除外している。 CPU使用率、メモリ使用率は先月分*2のメトリックの中から最大値を取得している。 最大値を取得しているのは、そういう要件だったというだけである。

ディスク使用率も取りたかった

CPU使用率とメモリ使用率はあるのにディスク使用率がないのは物足りない気がすると思う。 なぜ実装していないというと、metadataで取れるストレージの情報とメトリックの紐づけがめんどくさかったというのが理由だ。 前者はブロックストレージ単位だが、後者はファイルシステム単位になっていて取得しているレイヤが違うために、どのブロックストレージがどのメトリックであるかを類推するのが煩雑になるためである*3。 ・・・まぁ、実装できなくはないのだが、今回は実装の早さも要件の1つだったので最低限のみ取得してあとは人力で収集するという方式をとったのであった。

まとめ

Mackerel APIを使ってMackerelで管理しているサーバ群のインベントリを取得するスクリプトを作った。 mackerel-ruby-clientのおかげで、APIをある程度理解していればこういうスクリプトをサクッと作れるのがMackerelの魅力だと思う。 なお、私が試した限り大丈夫であったが、APIをかなりの回数をたたくのでもしかしたらMackerel側に負荷がかかっているかもしれない 今のところAPIのレートリミットはない?(要出典)と思われるのだが、過度にAPIを叩くと怒られるかもしれないので注意…。

おまけ: mipsel向けのmackerel-agentを作った

github.com

サーバインベントリの話とは全く違う話題なのだが、mipsel向けのmackerel-agentを作ったのでせっかくなので一緒に紹介する。 目的としては数年前に買ったEdgeRouter-Xを引っ張りだして使い始めたため、それを監視するためにmackerel-agentが欲しかったのだった。 EdgeRouter-X(ER-X)はUbiquiti社が販売している小型で廉価なLinuxルーターである。 詳しくはググってほしい。

んで、このER-XはMIPSアーキテクチャのCPUを積んでいる。 公式のmackerel-agentパッケージにはMIPS向けのものもあるのだが、なんとER-XはMIPSの中でもリトルエンディアンを採用したCPUになっている。 Linux上でuname -rするとmipselとして表示される Linuxではmipselとmipsでは別のアーキテクチャとしてL区別されるために、さきのMIPS向けのパッケージはインストールできないのであった(エラーになる)。

困った困ったっと[EdgeRouter-X mackerel-agent]で検索すると、id:papixさんの以下の記事にたどり着いた。

papix.hatenablog.com

ここに書いてある手順でばっちり動作して最高!!!っとなったのだが、せっかくだったらdebパッケージが欲しいと思ったのでそれを作れるようにしてみたというのが、先に貼ったリポジトリである。 このリポジトリに現時点で最新バージョンである0.74.0のdebパッケージを配置している。 以下のコマンドをER-X上で実行するとインストールできると思われる。

curl -LO https://github.com/buty4649/mackerel-agent-mipsel/releases/download/v0.74.0/mackerel-agent_0.74.0-1.systemd_mipsel.deb
sudo apt install -y ./mackerel-agent_0.74.0-1.systemd_mipsel.deb

私が必要だったのはdebパッケージのみなので、RPM等が欲しい人はPRお待ちしています :pray:

*1:例えばCloudFrontなホストが混ざっていることを想定している

*2:私の用途的に先月分を集計すれば要件を満たしていた

*3:disk.readsメトリックが取れれば深いこと考える必要ないんだけどなぁ