旧自宅サーバー設定保存計画RRDTOOL編。
RRDTOOLとは言ったもののログの記録は基本的にMRTGにおまかせしていて、 グラフの描画のみRRDTOOLで行っていたので、とりあえずログ保存に関してはMRTGをサルベージする。
項目 | コマンド、SNMPアドレス | 備考 |
---|---|---|
転送速度 | IF-MIB::ifOutOctets.2 & IF-MIB::ifInOctets.2 | |
CPU温度&M/B温度 | 1.3.6.1.4.1.2021.8.1.101.1 & 1.3.6.1.4.1.2021.8.1.101.1 | |
CPUロードアベレージ | 1.3.6.1.4.1.2021.10.1.3.1 & 1.3.6.1.4.1.2021.10.1.3.2 & 1.3.6.1.4.1.2021.10.1.3.3 | 1分毎/5分毎/15分毎 |
共有メモリ | 1.3.6.1.4.1.2021.4.13.0 | |
バッファメモリ | 1.3.6.1.4.1.2021.4.14.0 | |
キャッシュメモリ | 1.3.6.1.4.1.2021.4.15.0 | |
物理メモリ | 1.3.6.1.4.1.2021.8.1.101.3 | |
ユーザ領域 | 1.3.6.1.4.1.2021.8.1.101.4 | |
実メモリ | 1.3.6.1.4.1.2021.4.5.0 & 1.3.6.1.4.1.2021.4.6.0 | 総容量/使用可能 |
スワップメモリ | 1.3.6.1.4.1.2021.4.3.0 & 1.3.6.1.4.1.2021.4..0 | 総容量/使用可能 |
ディスクIO数 | 1.3.6.1.4.1.2021.13.15.1.1.3.1 & 1.3.6.1.4.1.2021.13.15.1.1.4.1 | |
ディスクIOバイト | 1.3.6.1.4.1.2021.13.15.1.1.5.1 & 1.3.6.1.4.1.2021.13.15.1.1.6.1 | |
UPS電圧 | apcstat.sh LINEV | |
UPS最小電圧 | apcstat.sh LOTRANS | |
UPS最大電圧 | apcstat.sh HITRANS | |
バッテリ残量 | apcstat.sh BCHARGE | |
シャットダウン残量 | apcstat.sh MBATTCHG | |
残り駆動時間 | apcstat.sh TIMELEFT | |
UPS負荷率 | apcstat.sh LOADPCT | |
HDD温度 | 1.3.6.1.4.1.2021.8.1.101.5 |
apcstat.sh はこんな感じでAPCのUPSから状態を読み取る。
#!/bin/sh
apcaccess | grep ^$1 | awk -F ':' '{print $2}'
データの更新は次のスクリプトでRRDに書き込み。 設定リストを用意しておけばSMNPからでもシェルスクリプトからでも値を追加できる優れもの。
#!/usr/bin/perl
# 設定ファイル
# rrdfilename
# data1
# data2
# ...
# データの書式
# SNMP: dataname community@hostname mib
# Shell Script: dataname '@' sciptfilename
my $rrdupdate = "/usr/local/rrdtool-1.2/rrdupdate";
foreach(@ARGV) {
my $cfg_file = $_;
if(!open(IN, "<$cfg_file")) {
print "Error config file: $cfg_file\n";
next;
}
my $rrd = <IN>;
$rrd =~ s/(^\s+|\s+$)//g;
my $time = time;
my $ds_str;
my $data_str;
while() {
my @str = split(/[ \t\r\n]/);
my $dname = shift(@str);
my $comm = shift(@str);
my ($mib, $cmd, $data, $dtype);
my ($cname, $host) = split(/@/, $comm);
if ($comm eq '@') {
$cmd = join(' ', @str);
open (DATA, "$cmd |") || next;
$data = <DATA>;
$data = $data + 0.0;
close(DATA)
} else {
$mib = shift(@str);
open(SNMP, "/usr/local/bin/snmpget -v 1 -c $cname -Ov $host $mib |") || next;
my $snmp = <SNMP>;
($dtype, $data) = split(/[:\r\n]/, $snmp);
$data =~ s/(^\s+|\s+$)//g;
close(SNMP);
# print "$mib\n$dname:$data\n";
}
$ds_str .= "$dname:";
$data_str .= "$data:";
}
$ds_str =~ s/:$//;
$data_str =~ s/:$//;
# print "$ds_str\n";
# print "$data_str\n";
system("$rrdupdate $rrd -t $ds_str $time:$data_str");
close(IN);
}]]>
こんなスクリプト作ってたなんて、俺意外と頑張ってたんだな。
コメントする