LogicMonitor + Catchpoint: 自律型ITの新時代へ

さらに詳しく

エージェントなしでカスタム監視を行うためのSNMP Extendの使用方法

標準 MIB が見逃すものを監視できるように、カスタム スクリプトを使用して SNMP を拡張するための実践的なガイドです。
所要時間
2025 年 5 月 1 日

SNMPは数十年前から存在していますが、CPUやメモリ使用量といった標準的なメトリクスの取得には優れていますが、ログファイルのサイズや特定のサービスが稼働しているかどうかを知るためには設計されていませんでした。しかし、あまり知られていないsnmp extendという機能を使えば、SNMPデーモンにこれらの質問に答える機能を与えることができます。

このガイドでは、カスタム スクリプトを SNMP に接続し、セットアップをテストし、その周りに軽量の DataSource を構築して、実際に重要なエッジ ケースを監視できるようにする方法を説明します。

TL; DR

snmp extend を使用すると、Net-SNMP はカスタム スクリプトの出力をリモート監視用の SNMP OID として公開できます。
ファイルサイズ、サービス状態、またはSNMPがデフォルトでカバーしていないスクリプト可能なメトリックを追跡するために使用できます。
適切なスクリプト衛生、高速でクリーンな1行出力は、信頼性の高いSNMP統合の鍵です。
snmp extend と LogicMonitor DataSource を組み合わせることで、カスタム監視が軽量になり、環境間で繰り返し実行できるようになります。

SNMP Extendとは何か、そしてなぜそれが重要なのか

snmp extendは古いものを与えるようなものです SNMP 犬にスリッパを持ってきたり、メールをチェックしたりするように教えるなど、ちょっとしたトリックをいくつか設定できます。これは、SNMPが標準では理解できないような情報をレポートできるように、独自のカスタムスクリプトをプラグインする簡単な方法です。

デフォルトでは、SNMPは事前に定義された質問(CPU使用率、ネットワーク統計、メモリ負荷)に回答しますが、「この特定のファイルのサイズはどれくらいですか?」や「Nginxは動作していますか?」といった質問をすると、SNMPは何も答えません。そこでextendの出番です。

SNMP では、ログ ファイルの大きさを教えない限り、ログ ファイルの大きさを知らせることはできません。

snmp extend を使うと、SNMPデーモンの設定ファイルに独自のコマンドやスクリプトを組み込むことができます。設定が完了すると、他のSNMPオブジェクトと同様に、それらのスクリプトをリモートからクエリできるようになります。確かに古風な方法ですが、それでも非常に便利です。特に以下のような場合に便利です。

  • 監視しています レガシーLinuxシステム エージェントのインストールが選択肢にない場合
  • デフォルトのMIBではカバーされていないニッチなメトリクスを公開する必要がある
  • カスタムコレクターを書かずにエッジケースの動作の可視性を自動化したい

派手な機能ですか?いいえ。でも、ちゃんと機能します。そして、慎重に使用すれば、snmp extend は、環境にとって何が重要かを、強力かつ簡単に可視化してくれます。

SNMP Extendの仕組み

snmp extend の本質は、Net-SNMP デーモン (snmpd) に組み込まれた巧妙なハックです。シェルスクリプト、バイナリ、あるいは du のようなシンプルなコマンドなど、実行するコマンドを指定すると、出力は特別な SNMP OID を通じて公開されます。たったこれだけです。

フローは次のようになります。

  1. snmpd.confファイルでコマンドを定義します

次のような行を追加します。

extend file-check /usr/bin/du /var/log/syslog

これは snmpd に次のように伝えます: 「誰かがこの SNMP オブジェクトにクエリを実行したら、du /var/log/syslog を実行して出力を返します。」

  1. SNMPデーモン(snmpd)を再起動します)

これにより、新しい構成が適用されます。

sudo systemctl restart snmpd 

  1. SNMPは固定サブツリーの下に新しいOIDセットを生成する

すべての拡張エントリは .1.3.6.1.4.1.8072.1.3.2.x にマッピングされます。

心配しないでください。覚える必要はありません。出力がここに保存されるということだけ覚えておいてください。

  1. 結果を見るにはsnmpwalkまたはsnmpgetを使用します

配置が完了したら、他の SNMP メトリックと同様に OID をクエリできます。

snmpwalk -v2c -c public myserver .1.3.6.1.4.1.8072.1.3.2

  1. コマンドの出力が返されます

SNMP では次のいずれかが提供されます。

  • 最初の行のみ (nsExtendOutput1Line)
  • または複数行の場合は完全な出力 (nsExtendOutputFull)

つまり、SNMPは基本的に、実行を指示したコマンドのラッパー(丁寧な仲介役)として機能します。これにより、新しいツールやエージェントを導入することなく、他の方法では実現できないあらゆる種類の監視が可能になります。

PROヒント: これらのコマンドは、snmpd(通常はsnmp)を実行しているユーザーと同じユーザーとして実行されます。そのため、スクリプトが権限、環境変数、またはパスに依存している場合は、それに応じてテストしてください。

snmp extend はスクリプトをSNMPメトリックに変換します。エージェントも手間もかかりません。

構文チートシート: snmpd.conf の例

snmpd.conf を初めて触る場合でも、心配はいりません。extend エントリの追加は驚くほど簡単です。フォーマットは以下のとおりです。

extend <name> <path_to_command> [optional_arguments]

これを平易な英語で表すと次のようになります。

  • 名前 → 後で出力を照会するときに認識するラベル
  • path_to_command → SNMP で実行するコマンドまたはスクリプトのフルパス
  • optional_arguments → コマンドに必要なその他のもの(ファイルパスやフラグなど)

一般的な snmpd.conf の例

ログファイルのサイズを確認する:

extend logsize /usr/bin/du /var/log/syslog

syslogファイルのディスク使用量を返します。ディスクを消費する前に、サイズが大きすぎるログを見つけるのに役立ちます。

サービスが実行中かどうかを確認する:

extend nginx-status /bin/systemctl is-active nginx

これは「アクティブ」または「非アクティブ」を返します。SSH 接続せずにサービスの健全性を確認するのに最適です。

カスタムヘルスチェックスクリプトを実行する:

extend custom-health /usr/local/bin/check_health.sh

ディスク容量、メモリ、API 応答をテストするスクリプトを作成しましたか? これを SNMP 経由で公開する方法は次のとおりです。

設定ファイルの最終更新時刻を取得する:

extend mtime /usr/bin/stat -c %Y /etc/nginx/nginx.conf

ファイルの最終更新日時のUnixタイムスタンプを出力します。設定のドリフト検出に便利です。

心に留めるもの

  • フルパスを使用する すべてのコマンドに対して。SNMP は限定された環境で実行されるため、ユーザーが指示しない限り /bin/du が何であるかを認識できません。
  • snmpユーザーとしてテストする (または SNMP デーモンを実行するユーザー)。権限の問題でつまずくことが多いのが、この部分です。
  • 対話型スクリプトを避けるコマンドがユーザー入力を待機している場合、SNMP はハングするだけです。

設定がうまくいったかテストしたいですか?以下を試してください:

snmpwalk -v2c -c public localhost .1.3.6.1.4.1.8072.1.3.2

これにより、監視可能なすべてのカスタム コマンドと出力が表示されます。

チュートリアル: ファイル サイズの監視 (LogicMonitor の例)

長年のお客様の一人である AppFolioは、私たちに「LogicMonitorを使ってLinuxサーバー上の特定のファイルのサイズを監視できますか?」という、一見簡単なリクエストをしてきました。しかし、標準的な SNMP? 完全ではありません。

LogicMonitorは通常、Linuxシステムの監視にSNMPを使用します。つまり、各サーバーに追加のソフトウェアをインストールする必要がありません。これは大規模環境では大きなメリットです。ただし、SNMPは定義済みのOID(SNMPが回答できる質問のようなもの)のみを公開します。CPU負荷やメモリ使用量は確かにわかりますが、「/var/log/myfile.logのサイズはどれくらいですか?」という質問は、SNMPにあらかじめ用意されている回答ではありません。

コレクターをエージェントとしてデプロイし、スクリプトベースのデータソースを実行してファイルサイズを直接取得することもできますが、これは別のアプローチです(これについては別のブログ記事で詳しく説明します)。今回は、軽量化を図り、SNMPのみを使用することにしました。そこで、あまり知られていないものの強力な機能であるsnmp extendを採用しました。

snmpd.conf を使用してカスタム コマンドで SNMP を拡張する

ここからが楽しいところです。ほとんどのLinuxシステムはNet-SNMPデーモン(snmpd)を使用していますが、嬉しいことにこれは拡張可能です。つまり、特定のファイルのサイズを報告する方法など、新しい機能を追加できるということです。

例えば、/var/spool/rsyslog のサイズを監視したいとします。snmpd.conf ファイルに次の行を追加するだけです。

extend lm-rsyslog-size /usr/bin/du /var/spool/rsyslog

次に、SNMP デーモンを再起動します。

sudo systemctl restart snmpd

これは SNMP に次のように指示します: 「誰かが正しい OID を照会したら、du /var/spool/rsyslog を実行して出力を渡します。」

舞台裏では、SNMPは.1.3.6.1.4.1.8072.1.3.2ツリーに新しいエントリを作成します。しかし、生成されるOIDインデックスの正確な値は少々…分かりにくいです。各拡張エントリは、指定した名前のASCII値に対応するXNUMX進数の長い文字列としてエンコードされます。

拡張されたコマンドを確認するには、次のコマンドを使用します。

snmpwalk -v2c -c public servername .1.3.6.1.4.1.8072.1.3.2.2.1.2

出力例

14.114.97.98.98.105.116.109.113.45.114.101.97.100.121 => /usr/sbin/rabbitmqctl  

15.108.109.45.114.115.121.115.108.111.103.45.115.105.122.101 => /usr/bin/du

あの長いドット付きの文字列は?これは「lm-rsyslog-size」というカスタムラベルをエンコードしたバージョンです。

インデックスがわかったので、SNMPを使って実際に出力をクエリできます。出力の最初の行を取得する方法は次のとおりです(通常はこれで十分です)。

snmpget -v2c -c public servername \

.1.3.6.1.4.1.8072.1.3.2.3.1.1.15.108.109.45.114.115.121.115.108.111.103.45.115.105.122.101

そして、その代わりに次のようなものが得られます:

1025360 /var/spool/rsyslog

du コマンドは3.1.2行しか出力しないため、.XNUMX(フル出力)を使用しても同じ結果が得られます。ただし、複数行の出力を生成するスクリプトでは、この区別が重要になります。

LogicMonitorにデータを取得する

snmpd を拡張してファイル サイズを報告できるようにしたので、そのデータを LogicMonitor に取り込んで視覚化し、アラートを発し、時間の経過に伴う傾向を追跡できるようにします。

フリートを管理している場合は、次のような方法でsnmpd.confの変更をすでに展開している可能性があります。 人形、シェフ、または Ansible(そうでない場合は、自動化に最適なケースです。)

ステップ1: 新しいデータソースを作成する

「設定」→「データソース」に進み、「新しいデータソース」をクリックします。

  • 一般情報セクションに、FileSize_SNMP_Extend のような意味のある名前を入力します。

ステップ2: アクティブ検出を構成する

ここで、「1 つのファイルだけを監視するのに、なぜ Active Discovery を使用するのか」と疑問に思うかもしれません。

いい質問ですね。答えは、すべてのLinuxサーバーにこの機能があるとは限りません。 OID 利用可能です。拡張機能が展開または有効化されていない場合もあります。そのため、Active Discovery を使用して拡張機能の存在をテストします。

コツは、ディスカバリOIDは、先ほどsnmpgetで使用したインデックス全体よりも1セグメント短くすることです。これは、Active Discoveryが直接snmpgetではなくsnmpwalkを実行するため、インスタンスを作成するためにそのパスの下にある少なくとも1つの結果を確認する必要があるためです。

ステップ3: 正規分布データポイントを追加する

検出が設定されたら、実際の値(この場合はファイルサイズ)を取得するための標準データポイントを追加します。

SNMP出力には番号とファイルパス(例:1025360 /var/spool/rsyslog)の両方が含まれるため、番号のみを取得するには正規表現が必要です。例えば、以下のようになります。

^(\d+)

これは行頭の数字だけを取得します。まさに監視に必要な機能です。

ここから、次のことができます。

  • ファイルサイズを時間経過とともに視覚化するグラフを追加します
  • 警告または重大なしきい値を設定する
  • ファイルサイズが許容範囲を超えた場合に警告する

つまり、LogicMonitor に期待されるすべての機能が、シンプルな SNMP 拡張機能によって実現されています。

拡張スクリプトの記述に関するベストプラクティス

snmp extendを使用する場合、スクリプトは監視パイプラインの一部となります。そのため、スクリプトは予測可能で、高速かつクリーンである必要があります。拡張機能を堅牢に保つためのベストプラクティスをいくつかご紹介します。

出力をクリーンに保つ

SNMPは、乱雑な出力や冗長な出力の処理には適していません。スクリプトは、解析しやすい1行(または予測可能な複数行形式)を返す必要があります。

良い出力の例:

1025360 /var/spool/rsyslog

悪い出力の例:

File size is currently: 1025360 bytes

Analyzed at: 2024-12-01 10:45:00

絶対パスを使用する

snmpdがbash、du、python3の場所を知っていると想定しないでください。参照するコマンドはすべてフルパスで指定してください。

#!/bin/bash

/usr/bin/du /var/log/syslog

テスト中に snmp ユーザーとして実行する

SNMP拡張機能は、snmpdサービス(多くの場合snmp)を起動するユーザーと同じユーザーとして実行されます。このユーザーの権限は制限されている場合があります。スクリプトは必ず次のようにテストしてください。

sudo -u snmp /path/to/your/script.sh

速くする

SNMPのタイムアウト時間は短くなっています。スクリプトの実行時間が数秒を超えると、SNMPが処理を中断したり、最悪の場合、監視ワークフロー全体の速度が低下したりする可能性があります。

絶対に必要な場合を除き、ループ、スリープ、または大きな出力は避けてください。

複雑な場合は、結果を一時ファイルにキャッシュし、スクリプトで即座に結果を返すことを検討してください。

優雅に失敗する

ファイルの不足や権限の問題など、何か問題が発生した場合でも、スクリプトは出力行(場合によっては終了コード)を返す必要があります。そうすることで、失敗を捕捉し、ウォーク全体の中断を回避できます。

対話型プロンプトを避ける

読み取り、ユーザー入力、パスワードプロンプトはありません。スクリプトは手動による介入を必要としません。

必要なものだけを出力する

LogicMonitorがフォーマット、グラフ化、アラート出力を行います。あなたの仕事は、正しい数値やステータスを返すことだけです。

開発中にログを追加する

テスト中は、何が起こっているかを確認するために一時ファイルにログを記録すると役立ちます。

echo "$(date) :: Ran extend script" >> /tmp/snmp-extend-debug.log

ただし、本番環境では使用しないでください。特に5分ごとに実行される場合は注意が必要です。

SNMPが本来監視できないものを監視する

snmp extend は昔の回避策のように思えるかもしれませんが、Linux サーバーからカスタムメトリクスを取得できる信頼性の高い方法であり、エージェントは不要です。設定に数行追加し、スクリプトを少し追加するだけで、環境にとって重要な情報を正確に可視化できます。

LogicMonitor にデータが取り込まれたら、グラフ化したり、アラートを生成したり、傾向を分析したりして、日々の業務を続けることができます。

14日間フルアクセス LogicMonitor プラットフォーム