基于JRobin的磁盘IO监控
作者:终南 <li.zhongnan@hotmail.com>
先列以下以前写过的文章作为参考:
1。JRobin简介
2。基于JRobin的网络监控管理,以及基于JRobin的CPU使用率监控
这些文章介绍了JRobin、利用JRobin以及WIndows脚本技术监控网络和CPU使用率,以及如何获取Linux以及Windows下磁盘IO性能数据。将这些结合在一起,于是就有了使用Java语言写成的基于JRobin的磁盘IO监控代码。
监控程序的代码与利用ping监控网络和监控CPU基本类似,但是还是有一些不同:
1。由于可能有多个逻辑磁盘,因此需要先获取磁盘列表,然后才即每个磁盘的IO数据。
2。出于性能考虑,特别是在Windows下,在获取磁盘IO数据时,可以在执行脚本时一次性采集这些数据,根据磁盘名称保存,不用分别获取,这样可以提高性能。
3。数据的单位和显示在图形上的格式不同。
4。JRobin对数据源名称及其程度有要求,因此需要对磁盘名称进行一定的变更。
成果:
Java代码:
import java.awt.Color;
import java.awt.Font;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import java.util.logging.Logger;
import org.jrobin.core.RrdDb;
import org.jrobin.core.RrdDef;
import org.jrobin.core.Sample;
import org.jrobin.graph.RrdGraph;
import org.jrobin.graph.RrdGraphDef;
public class DiskIoMonitor {
String[] disks = null;
public static String[] execute(String[] commands) {
String[] strs = null;
File scriptFile = null;
try {
List<String> cmdList = new ArrayList<String>();
String osName = System.getProperty("os.name");
if (osName.indexOf("Windows") > -1) {
scriptFile = File.createTempFile("monitor", ".vbs");
cmdList.add("CMD.EXE");
cmdList.add("/C");
cmdList.add("CSCRIPT.EXE");
cmdList.add("//NoLogo");
} else {
scriptFile = File.createTempFile("monitor", ".sh");
cmdList.add("/bin/bash");
}
String fileName = scriptFile.getCanonicalPath();
PrintWriter writer = new PrintWriter(scriptFile);
for (int i = 0; i < commands.length; i++) {
writer.println(commands[i]);
}
writer.flush();
writer.close();
cmdList.add(fileName);
writer.flush();
writer.close();
cmdList.add(fileName);
ProcessBuilder pb = new ProcessBuilder(cmdList);
Process p = pb.start();
p.waitFor();
String line = null;
BufferedReader stdout = new BufferedReader(new InputStreamReader(p
.getInputStream()));
List<String> stdoutList = new Arr