JRobin是一个很强大的存储和用图形展示基于时间序列数据的工具.doc_第1页
JRobin是一个很强大的存储和用图形展示基于时间序列数据的工具.doc_第2页
JRobin是一个很强大的存储和用图形展示基于时间序列数据的工具.doc_第3页
JRobin是一个很强大的存储和用图形展示基于时间序列数据的工具.doc_第4页
JRobin是一个很强大的存储和用图形展示基于时间序列数据的工具.doc_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

JRobin是一个很强大的存储和用图形展示基于时间序列数据的工具。只要有合适的需求,能够提供提供满足这些需求的数据,JRobin就能合理地存储这些数据,并且生成非常漂亮的图形。 在基于JRobin的应用中,最主要的工具并不在于JRobin,而是如何设计应用和使用Java代码采用相应的手段获取感兴趣的数据。通过在Java中执行外部命令来获取Ping的响应时间。本文的应用旨在对计算机CPU的使用率进行监视,因为如何在Windows和Linux上获取CPU的使用率就成为了关键要解决的问题。 1、在Windows上获取CPU使用率: WMI提供了在Windows上获取计算机各种有用信息的接口,尤其可以利用WMI来获取计算机性能有关的数据。可以用通过 Win32_Processor对象来获取CPU的使用率,该对象LoadPercentage属性保存了相应CPU的负载情况。在本例中,将计算机上各 个CPU使用率进行简单平均,既是该计算机CPU的使用率。脚本如下: strComputer = . Set objWMIService = GetObject(winmgmts: _ & impersonationLevel=impersonate! & strComputer & rootcimv2) Set colItems = objWMIService.ExecQuery(Select * from Win32_Processor ,48) load = 0 n = 0 For Each objItem in colItems load = load + objItem.LoadPercentage n = n + 1 Next Wscript.Echo (load/n) 该最后脚本输出CPU平均使用率,Java程序可以执行该脚本获取标准输出,得到CPU平均使用率。 2、在Linux上获取CPU使用率: Linux操作系统的/proc文件系统提供了与系统和进程有关的信息。通过访问/proc/stat就可以获取CPU的使用情况。其bash脚本如下: user=cat /proc/stat | head -n 1 | awk print $2 nice=cat /proc/stat | head -n 1 | awk print $3 system=cat /proc/stat | head -n 1 | awk print $4 idle=cat /proc/stat | head -n 1 | awk print $5 iowait=cat /proc/stat | head -n 1 | awk print $6 irq=cat /proc/stat | head -n 1 | awk print $7 softirq=cat /proc/stat | head -n 1 | awk print $8 let used=$user+$nice+$system+$iowait+$irq+$softirq let total=$used+$idle echo $used $total 该脚本最后输出自机器启动以来,CPU总共使用的时间和总共运行时间。要想获取CPU使用率,还需要作进行一步处理。处理步骤如下: (1)运行脚本,得到相应数据:1000 10000 (2)sleep 60秒 (3)运行脚本,得到相应数据:7000 70000 (4)那么在这段时间内,CPU的使用率就等于:(7000 - 1000)/(70000 - 10000)= 10%。 (5)定时运行脚本,就可以得到每个时段CPU的使用率。 3、与获取Ping响应时间代码的异同: 这两个程序实现的功能基本类似,就是获取数据,利用JRobin保存和画图。其中利用JRobin保存和画图的功能除了保存的数据源、显示的文本信息不同以外,其他都是相同的。他们最大的不同在于获取和处理数据的方式。 在WIndows下,Ping程序利用Ping命令来获取数据,而CPU监视程序则使用VBScript利用WMI接口通过CScript.EXE执行脚本来实现。 在Linux下,不能直接获取CPU使用率信息,需要在下一次获取到CPU使用信息时,对数据进行进一步出来才能得到。 4、看看成果: 5、事例代码: 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.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 CPUMonitor public static String execute(String commands) String strs = null; File scriptFile = null; try List cmdList = new ArrayList(); String osName = System.getProperty(); 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(commandsi); 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 stdoutList = new ArrayList(); while (line = stdout.readLine() != null) stdoutList.add(line); BufferedReader stderr = new BufferedReader(new InputStreamReader(p .getErrorStream(); List stderrList = new ArrayList(); while (line = stderr.readLine() != null) stderrList.add(line); strs = stdoutList.toArray(new String0); catch (Exception e) e.printStackTrace(); finally if (scriptFile != null) scriptFile.delete(); return strs; private String dataFormat = %3f; private Logger logger = Logger.getLogger(this.getClass().getName(); private String monitorName = cpu; private String dataDir = .; private int step = 10; private String rrdPath = ; private Timer timer = new Timer(); private long timeStart = 0; protected int width = 600; protected int height = 150; public CPUMonitor(String dataDir, int step) this.dataDir = dataDir; this.step = step; this.rrdPath = this.dataDir + File.separator + monitorName + .rrd; public String generateGraph() long timeCur = org.jrobin.core.Util.getTimestamp(); return generateGraph(timeStart, timeCur); public String generateGraph(long start, long end) RrdDb rrdDb = null; try Color colors = new Color Color.GREEN, Color.BLUE, Color.MAGENTA, Color.YELLOW, Color.RED, Color.CYAN, Color.ORANGE, Color.PINK, Color.BLACK ; String graphPath = this.dataDir + File.separator + monitorName + .png; / create graph (Creating graph); RrdGraphDef gDef = new RrdGraphDef(); gDef.setWidth(width); gDef.setHeight(height); gDef.setFilename(graphPath); gDef.setStartTime(start); gDef.setEndTime(end); gDef.setTitle(CPU Usage); gDef.setVerticalLabel(%); String dsNames = null; rrdDb = new RrdDb(rrdPath); dsNames = rrdDb.getDsNames(); for (int i = 0; i dsNames.length; i+) String dsName = dsNamesi; String legend = dsName; if (legend = null | legend.equals() legend = dsName; gDef.datasource(dsName, rrdPath, dsName, AVERAGE); gDef.line(dsName, colorsi % colors.length, legend, 2); gDef.gprint(dsName, MIN, dataFormat + Min); gDef.gprint(dsName, AVERAGE, dataFormat + Avg); gDef.gprint(dsName, MAX, dataFormat + Max); gDef.gprint(dsName, LAST, dataFormat + Lastr); gDef.print(dsName, MIN, min + dsName + = %.3f); gDef.print(dsName, AVERAGE, avg + dsName + = %.3f); gDef.print(dsName, MAX, max + dsName + = %.3f); gDef.print(dsName, LAST, last + dsName + = %.3f); gDef.setImageInfo(); gDef.setPoolUsed(false); gDef.setImageFormat(png); gDef.setSmallFont(new Font(Monospaced, Font.PLAIN, 11); gDef.setLargeFont(new Font(SansSerif, Font.BOLD, 14); / gDef.setAltYMrtg(true); / create graph finally RrdGraph graph = new RrdGraph(gDef); / (graph.getRrdGraphInfo().dump(); (Graph created); return graph.getRrdGraphInfo().getFilename(); catch (Exception e) logger.warning(Error in generating graph: + e.getMessage(); finally if (rrdDb != null) try rrdDb.close(); catch (IOException e) e.printStackTrace(); return null; private long lastUsed = 0; private long lastTotal = 0; private double getCPUUsage(String strs) double value = Double.NaN; String osName = System.getProperty(); if (osName.indexOf(Windows) -1) String strValue = strs0; value = Double.parseDouble(strValue); else String strValue = strs0; String values = strValue.split( ); if (values.length = 2) long used = Long.parseLong(values0); long total = Long.parseLong(values1); if (lastUsed 0 & lastTotal 0) long deltaUsed = used - lastUsed; long deltaTotal = total - lastTotal; if (deltaTotal 0) value = (long) (deltaUsed * 100) / deltaTotal) * 10) / 10; lastUsed = used; lastTotal = total; return value; /* * Return a HashMap which contains the current value of each data source. * * return the current value of each data source.*/ public double getValue(String dsName) String commands = new String0; String osName = System.getProperty(); if (osName.indexOf(Windows) -1) commands = new String strComputer = ., Set objWMIService = GetObject(winmgmts: _, & impersonationLevel=impersonate! & strComputer & rootcimv2), Set colItems = objWMIService.ExecQuery(Select * from Win32_Processor ,48), load = 0, n = 0, For Each objItem in colItems, load = load + objItem.LoadPercentage, n = n + 1, Next, Wscript.Echo (load/n) ; else commands = new String user=cat /proc/stat | head -n 1 | awk print $2, nice=cat /proc/stat | head -n 1 | awk print $3, system=cat /proc/stat | head -n 1 | awk print $4, idle=cat /proc/stat | head -n 1 | awk print $5, iowait=cat /proc/stat | head -n 1 | awk print $6, irq=cat /proc/stat | head -n 1 | awk print $7, softirq=cat /proc/stat | head -n 1 | awk print $8, let used=$user+$nice+$system+$iowait+$irq+$softirq, let total=$used+$idle, echo $used $total ; return getCPUUsage(execute(commands); /* * Initialization. */ public void initialize() throws Exception RrdDb rrdDb = null; try rrdDb = new RrdDb(rrdPath); catch (Exception e) if (rrdDb = null) (RRD data is not located in + rrdPath + , create a new one); RrdDef rrdDef = new RrdDef(rrdPath, timeStart - 1, step); rrdDef.addDatasource(cpu, GAUGE, 2 * step, 0, Double.NaN); rrdDef.addArchive(AVERAGE, 0.5, 1, 24 * 3600 / step); rrdDef.addArchive(AVERAGE, 0.5, 300 / step, 7 * 288); (Estimated file size: + rrdDef.getEstimatedSize(); rrdDb = new RrdDb(rrdDef); (RRD file created.); (monitorName + RRD Db Defs: + rrdDb.getRrdDef().dump(); if (rrdDb != null) rrdDb.close(); /* * Start monitor. * * return true if succeed, else false. */ public boolean start() (start to monitor + monitorName); try timeStart = org.jrobin.core.Util.getTimestamp(); initialize(); timer.scheduleAtFixedRate(new TimerTask() public void run() try updateData(); catch (Exception e) e.printStackTrace(); logger.severe(Timer running error: + e.getMessage(); , 0, step * 1000); return true; catch (Exception e) e.printStackTrace(); return false; /* * Stop monitor. */ public void stop() timer.cancel(); private void updateData() throws Exception RrdDb rrdDb = null;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论