トップ 差分 一覧 ソース 検索 ヘルプ RSS ログイン

MRTGをQLogic InfiniBandスイッチに対応させる

概要

MRTGでトラフィック量などの統計を取りたい場合、通常、装置がSNMPで統計情報を応答する必要がある。
しかし、QLogic InfiniBandスイッチにはパケット転送数やワード転送数等の統計情報をSNMPで応答する機能がない。
そこで、SNMPによらない方法で統計情報を得て、MRTGを動かす。

 実証例

TCBラボで動作している例を示す。

 MRTGの外部プログラム呼び出し

MRTGは、SNMPのほかに、外部プログラムからデータを取り込むことができる。
外部プログラムは、MRTGのコンフィギュレーションに次のように記述することで呼び出されるようになる。

Target[172.16.100.201_24D]: `/html/mrtg/rxp-txp9024port 24`

rxp-txp9024port というのが呼び出される外部プログラムである。
外部プログラムは次の4行で値を返すことをMRTGに求められている。

  • IN値
  • OUT値
  • uptime
  • 機器名

24というポート番号をパラメータとして受け取り、port24の統計情報をスイッチから取得して
上記の形で返すスクリプトを記述すればよい。

 スイッチ統計情報取得スクリプト

前述の統計情報を取得するスクリプトは、以下のようになる。

  • /html/mrtg/rxp-txp9024port
#!/usr/bin/perl

$port = shift(@ARGV);
die "Usage: rxp-txp9024port %d (%d: 1-24)\n" if (($port < 1) || ($port > 24));

open(UPTIME, "curl --stderr ./ibcableportview9k.log -u uname:passwd http://172.16.100.201/chassis/chassisSystem.html?tab=1 |") || die "obtaining switch uptime failed.";
open(CURL, "/usr/bin/curl --stderr ./ibcableportview9k.log -u uname:passwd http://172.16.100.201/switcha/ibcableportview9k.html |") || die "obtaining switch status failed.";

$TCDHeader = "<TD class=TableCellData>";
$TCDHeaderR = "<TD CLASS=TableCellDataAlignRight>";
$TCDHeaderZ = "<TD ALIGN=RIGHT>";
$TCDFooter = "</TD>";
$TCDStart = sprintf("%sCable%2s$s", $TCDHeader, $port, $TCDFooter);
$TCDindex = -1;

while (<CURL>)
{
    if ($TCDindex >= 0) {
        if (/$TCDHeader([^<>]*)$TCDFooter/) {
            $TCD[$TCDindex++] = $1;
        } elsif (/$TCDHeaderR([^<>]*)$TCDFooter/) {
            $TCD[$TCDindex++] = $1;
        } elsif (/$TCDHeaderZ/) {
            last;
        }
    } elsif (/$TCDStart/) {
        $TCDindex = 0;
    }
}

while (<UPTIME>) {
    if (/<INPUT TYPE=TEXT CLASS=frminputRO NAME=icsChassisMib_icsChassisSystemUpTime ID=icsChassisMib_icsChassisSystemUpTime VALUE="([^\"]*)" READONLY>/) {
        $uptime = $1;
    }
}

if ($TCDindex > 0) {
    print $TCD[13] . "\n";
    print $TCD[12] . "\n";
    print $uptime . "\n";
    print "QLogic9024\n";
} else {
    printf("No match with %s.\n", $TCDStart);
}