これはMackerel Advent Calendar 2023 14日目の記事です。昨日はinommmさんでした。
要約
アラート時刻近辺の重量プロセス一覧をMackerelのアラートメモかグラフアノテーションに投稿する、「sabanote」(さばのて)というプラグインを作ったよ。あと、Mackerel Meetup #15やるよ。
前置き
改めまして、はてな社でMackerel CREを務めて1年になる id:kmuto です。SaaS型監視サービスのMackerel。そのユーザーの抱える課題の解決支援を担うCRE(Customer Reliability Engineer)のカスタマーサクセスユニットの一員として、ユーザーと直にMackerelのご利用についてお話しし、ご意見・ご要望をいただく機会が多いです。
そんな日々の中で、最近よく挙がっていたのが「アラートが発生した際のサーバーのプロセス情報を知りたい」というご要望です。
Mackerelはメトリックの監視を主ターゲットにしており、CPUやメモリの使用率といった数値化できるものについては可視化するのが得意です。このほかに状態の異常・正常を見るチェック監視、URL接続性を見る外形監視といったものがあります。
「ある名前のプロセス数がいくつあるか」「特定の名前のプロセスがどのくらい特定のリソースを消費しているか」はメトリック、「プロセスが存在している」「サービス接続できる」はチェックで表現できます。
しかし、「現在ひどくCPUあるいはメモリを消費しているプロセス一覧」となると、突発的に発生しては消えていくプロセスをメトリックの軸で見せるのは無理があります。「プロセス一覧表示を解析し、何かがCPUを大いに消費していればチェック監視エラーにする」というチェック手段は考えられますが、一般的な監視運用は「サービスのパフォーマンスが悪化している(アラート)」→「それはCPU負荷が上がっているからだ(メトリックによる観察)」→「上がっているのはこのプロセスが重いからだ(調査と対策)」というフローをたどるものであり、CPUを消費しているから即何か対応をすべきである、とはならないのではないでしょうか。
どこにプロセス一覧情報を記載すべきか
とはいえ、上記したように、サーバーサービスのパフォーマンス低下、サービス接続の失敗、CPUやメモリの使用率の閾値オーバーといったアラートが発生した際、その時点でのサーバー内のプロセス情報がそのアラートの補足情報として提供されれば、原因の調査・対策に大きな一助となるのも確かです。
そのような補足情報の置き場所としては、以下のような候補が考えられます。
- ローカルまたはS3等のストレージ:(ストレージ容量の上限内で)何でも置ける。MackerelのUIとは紐づかないので、ユーザー側で時刻などをつきあわせて探す必要がある。
- アラートメモ:アラートの補足情報としてプレインテキストで任意に記載できる。アラートと密接に紐づけるという意味では妥当。上限80KB制限、長いとまぁまぁ見にくい、グラフ側で時系列的に見られない。
- グラフアノテーション:サービスグラフの時系列グラフのメモとしてプレインテキストで任意に記載できる。アラート前後も入れておけると時系列変化を見やすい。上限1KB制限、サービスグラフにしか付けられない、サービスグラフ側にはアラートが示されるわけではないので記録との相互関係がわかりにくい。
一長一短ですね。
Mackerelでのアラート発生時にサービスの状態を記録する先駆としては、カヤックmashiikeさんの「prepalert」があります。2022年のMackerel Advent Calendarにも寄稿いただいており、ご覧になった方も多いのではないでしょうか。
prepalertはクラウドサービス向けにアラートの時刻付近の情報をCloudWatch Logs InsightsやS3、Redshiftなどに問い合わせて収集し、アラートメモやグラフアノテーションに書き込む仕掛けです。私もクラウドサービスご利用のユーザーさまに提案することもあります。
ただ、プロセス情報を見たいというケースの場合、対象はオンプレも含めて壁の中の仮想マシンであり、情報を定期的にS3などに送るような仕掛けは構築しづらいと想定されます。サーバーのローカル環境で動作して記録しつつ、必要なときには引き出してMackerelに記録するような仕組みがほしいところです。
作ってみた
もともとそのような仕組みは私が以前からアイデアとして温めていて、Linuxでpsコマンドを呼び出してグラフアノテーションに書き出す簡単なシェルスクリプトで実験はしていました。今回のAdvent Calendar合わせの開発では、Windows Serverでの動作を希望しているユーザーが多いこともあり、学習を兼ねてGo言語で実装しました。仕組みとしては以下の図のようになります。
エージェントのプラグインでこれらを全部処理するのは、プラグイン実行タイムアウトの制約があるので少々気乗りしないところではあるのですが、Windowsでの常駐物まで考えるのはハードなのと、プロセス情報の取得自体は短時間で終わるはずという判断で、このような実装になっています。
アラートメモやグラフアノテーションに書き込む意味を込めつつ、ローマ字読みでsabanote(さばのて)と名付けました。
使い方はREADMEにあるとおりですが、mkr plugin install kmuto/sabanote
(Windowsでパスが通っていない場合は"C:¥Program Files¥Mackerel¥mackerel-agent¥mkr.exe plugin install kmuto/sabanote")でのインストール後、mackerel-agent.confにプラグイン設定をしてmackerel-agentを再起動してください。
アラートメモに書く場合は次のようになります。-m 監視ルールID
は複数指定できます。
[plugin.checks.sabanote] command = ["/opt/mackerel-agent/plugins/bin/check-sabanote", "alert", "-m", "監視ルールID"]
[plugin.checks.sabanote] command = ["plugins\\bin\\check-sabanote.exe", "alert", "-m", "監視ルールID"]
実際にアラートが発生すると、監視ルールIDに該当するか、自身のチェック監視起因のものであれば、直近3分ぶんの重いプロセスの一覧がアラートメモとして書き込まれます。
一方、グラフアノテーションに書く場合は次のようになります。-m 監視ルールID
と -r ロール名
は複数指定できます。
[plugin.checks.sabanote] command = ["/opt/mackerel-agent/plugins/bin/check-sabanote", "annotation", "-m", "監視ルールID", "-s", "サービス名", "-r", "ロール名"]
[plugin.checks.sabanote] command = ["plugins\\bin\\check-sabanote.exe", "annotation", "-m", "監視ルールID", "-s", "サービス名", "-r", "ロール名"]
デフォルトでは前3分・後1分の間で、重いプロセスの一覧がそれぞれグラフアノテーションとして書き込まれます。
挙動はオプションでいろいろと変えることができます。
プロセス一覧処理をGoで完結させるのは大変すぎるので、普通にpsコマンドやPowerShell -GetProcess
コマンドを内部呼び出しし、標準出力の結果を拾っています。Windowsのほうで取得できるCPU使用率としてはもう少し良いものがほしいところですが、調べた限りでは何度もインタラクション問い合わせをする必要があってそれ自体が重い処理になってしまいそうなのと、古めのWindows Serverでも動くようにしておきたいと考えて安全確実に取得できる方法にしました。
代わりに外部コマンドを呼び出すこともできるので、プロセス一覧に限らず活用できるのではないでしょうか。
Mackerel側への書き込みはリソース負荷軽減の観点であくまでもアラート周辺の時刻のみとしていますが、ローカルのデータベースには直近6時間ぶんの記録を残しています。SQLite3形式のデータベースなのでお好みのSQLiteクライアントでアクセスできますが、プラグインに参照用ツールも同梱しています。
ご意見・ご要望に応じて改良なども進められたらと思っておりますので、ぜひsabanoteを利用してのご感想をいただければ幸いです。
Mackerel Advent Calendar 2023、明日はitchynyさんです!
[PR] Mackerel Meetup #15 Tokyoを2023年12月19日(火)に開催します
prepalert作者のmashiikeさんも登壇される「Mackerel Meetup」の開催が迫っています!
「チームとコミュニティで監視を育てる」をテーマに、監視を育てるスタート地点でもあり、考え方でもある「SRE」の概念やその導入方法、具体的な実装について知ることのできるコンテンツを用意しています。Mackerelをお使いの方も、これから使い始めようという方も、明日から自分たちの監視やシステムを育てるヒントにしていただけたら幸いです。ぜひMackerelチームメンバーに会いに来てください!
詳細とご応募はこちらから!