JRobin是一个很强大的存储和用图形展示基于时间序列数据的工具Word格式文档下载.docx
《JRobin是一个很强大的存储和用图形展示基于时间序列数据的工具Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《JRobin是一个很强大的存储和用图形展示基于时间序列数据的工具Word格式文档下载.docx(12页珍藏版)》请在冰豆网上搜索。
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-n1|awk'
{print$2}'
`
nice=`cat/proc/stat|head-n1|awk'
{print$3}'
system=`cat/proc/stat|head-n1|awk'
{print$4}'
idle=`cat/proc/stat|head-n1|awk'
{print$5}'
iowait=`cat/proc/stat|head-n1|awk'
{print$6}'
irq=`cat/proc/stat|head-n1|awk'
{print$7}'
softirq=`cat/proc/stat|head-n1|awk'
{print$8}'
letused=$user+$nice+$system+$iowait+$irq+$softirq
lettotal=$used+$idle
echo$used$total
该脚本最后输出自机器启动以来,CPU总共使用的时间和总共运行时间。
要想获取CPU使用率,还需要作进行一步处理。
处理步骤如下:
(1)运行脚本,得到相应数据:
100010000
(2)sleep60秒
(3)运行脚本,得到相应数据:
700070000
(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、事例代码:
importjava.awt.Color;
importjava.awt.Font;
importjava.io.BufferedReader;
importjava.io.File;
importjava.io.IOException;
importjava.io.InputStreamReader;
importjava.io.PrintWriter;
importjava.util.ArrayList;
importjava.util.Date;
importjava.util.List;
importjava.util.Timer;
importjava.util.TimerTask;
importjava.util.logging.Logger;
importorg.jrobin.core.RrdDb;
importorg.jrobin.core.RrdDef;
importorg.jrobin.core.Sample;
importorg.jrobin.graph.RrdGraph;
importorg.jrobin.graph.RrdGraphDef;
publicclassCPUMonitor{
publicstaticString[]execute(String[]commands){
String[]strs=null;
FilescriptFile=null;
try{
List<
String>
cmdList=newArrayList<
();
StringosName=System.getProperty("
os.name"
);
if(osName.indexOf("
Windows"
)>
-1){
scriptFile=File.createTempFile("
monitor"
"
.vbs"
cmdList.add("
CMD.EXE"
/C"
CSCRIPT.EXE"
//NoLogo"
}else{
.sh"
/bin/bash"
}
StringfileName=scriptFile.getCanonicalPath();
PrintWriterwriter=newPrintWriter(scriptFile);
for(inti=0;
i<
commands.length;
i++){
writer.println(commands[i]);
writer.flush();
writer.close();
cmdList.add(fileName);
ProcessBuilderpb=newProcessBuilder(cmdList);
Processp=pb.start();
p.waitFor();
Stringline=null;
BufferedReaderstdout=newBufferedReader(newInputStreamReader(p
.getInputStream()));
stdoutList=newArrayList<
while((line=stdout.readLine())!
=null){
stdoutList.add(line);
BufferedReaderstderr=newBufferedReader(newInputStreamReader(p
.getErrorStream()));
stderrList=newArrayList<
while((line=stderr.readLine())!
stderrList.add(line);
strs=stdoutList.toArray(newString[0]);
}catch(Exceptione){
e.printStackTrace();
}finally{
if(scriptFile!
=null)
scriptFile.delete();
returnstrs;
privateStringdataFormat="
%3f"
;
privateLoggerlogger=Logger.getLogger(this.getClass().getName());
privateStringmonitorName="
cpu"
privateStringdataDir="
privateintstep=10;
privateStringrrdPath="
privateTimertimer=newTimer();
privatelongtimeStart=0;
protectedintwidth=600;
protectedintheight=150;
publicCPUMonitor(StringdataDir,intstep){
this.dataDir=dataDir;
this.step=step;
this.rrdPath=this.dataDir+File.separator+monitorName+"
.rrd"
publicStringgenerateGraph(){
longtimeCur=org.jrobin.core.Util.getTimestamp();
returngenerateGraph(timeStart,timeCur);
publicStringgenerateGraph(longstart,longend){
RrdDbrrdDb=null;
Color[]colors=newColor[]{Color.GREEN,Color.BLUE,
Color.MAGENTA,Color.YELLOW,Color.RED,Color.CYAN,
Color.ORANGE,Color.PINK,Color.BLACK};
StringgraphPath=this.dataDir+File.separator+monitorName
+"
.png"
//creategraph
logger.info("
Creatinggraph"
RrdGraphDefgDef=newRrdGraphDef();
gDef.setWidth(width);
gDef.setHeight(height);
gDef.setFilename(graphPath);
gDef.setStartTime(start);
gDef.setEndTime(end);
gDef.setTitle("
CPUUsage"
gDef.setVerticalLabel("
%"
String[]dsNames=null;
rrdDb=newRrdDb(rrdPath);
dsNames=rrdDb.getDsNames();
dsNames.length;
StringdsName=dsNames[i];
Stringlegend=dsName;
if(legend==null||legend.equals("
))
legend=dsName;
gDef.datasource(dsName,rrdPath,dsName,"
AVERAGE"
gDef.line(dsName,colors[i%colors.length],legend,2);
gDef.gprint(dsName,"
MIN"
dataFormat+"
Min"
Avg"
MAX"
Max"
LAST"
Last\\r"
gDef.print(dsName,"
min"
+dsName+"
=%.3f"
avg"
max"
last"
gDef.setImageInfo("
<
imgsrc='
%s'
width='
%d'
height='
>
gDef.setPoolUsed(false);
gDef.setImageFormat("
png"
gDef.setSmallFont(newFont("
Monospaced"
Font.PLAIN,11));
gDef.setLargeFont(newFont("
SansSerif"
Font.BOLD,14));
//gDef.setAltYMrtg(true);
//creategraphfinally
RrdGraphgraph=newRrdGraph(gDef);
//logger.info(graph.getRrdGraphInfo().dump());
Graphcreated"
returngraph.getRrdGraphInfo().getFilename();
logger.warning("
Erroringeneratinggraph:
+e.getMessage());
if(rrdDb!
rrdDb.close();
}catch(IOExceptione){
returnnull;
privatelonglastUsed=0;
privatelonglastTotal=0;
privatedoublegetCPUUsage(String[]strs){
doublevalue=Double.NaN;
StringstrValue=strs[0];
value=Double.parseDouble(strValue);
String[]values=strValue.split("
if(values.length==2){
longused=Long.parseLong(values[0]);
longtotal=Long.parseLong(values[1]);
if(lastUsed>
0&
lastTotal>
0){
longdeltaUsed=used-lastUsed;
longdeltaTotal=total-lastTotal;
if(deltaTotal>
value=((long)(((deltaUsed*100)/deltaTotal)*10))/10;
lastUsed=used;
lastTotal=total;
returnvalue;
/**
*ReturnaHashMapwhichcontainsthecurrentvalueofeachdatasource.
*
*@returnthecurrentvalueofeachdatasource.
*/
publicdoublegetValue(StringdsName){
String[]commands=newString[0];
commands=newString[]{
strComputer=\"
.\"
SetobjWMIService=GetObject(\"
\"
_"
\"
\\\\\"
\\root\\cimv2\"
)"
SetcolItems=objWMIService.ExecQuery(\"
Select*fromWin32_Processor\"
,48)"
load=0"
n=0"
ForEachobjItemincolItems"
load=load+objItem.LoadPercentage"
n=n+1"
Next"
Wscript.Echo(load/n)"
};
`"
letused=$user+$nice+$system+$iowait+$irq+$softirq"
lettotal=$used+$idle"
echo\"
$used$total\"
returngetCPUUsage(execute(commands));
*Initialization.
publicvoidinitialize()throwsException{
if(rrdDb==null){
RRDdataisnotlocatedin"
+rrdPath
createanewone"
RrdDefrrdDef=newRrdDef(rrdPath,timeStart-1,step);
rrdDef.addDatasource("
GAUGE"
2*step,0,Double.NaN);
rrdDef.addArchive("
0.5,1,24*3600/step);
0.5,300/step,7*288);
Estimatedfilesize:
+rrdDef.getEstimatedSize());
rrdDb=newRrdDb(rrdDef);
RRDfilecreated."
logger.info(monitorName+"
RRDDbDefs:
+rrdDb.getRrdDef().dump());
*Startmonitor.
*@returntrueifsucceed,elsefalse.
publicbooleanstart(){
starttomonitor"
+monitorName);
timeStart=org.jrobin.core.Util.getTimestamp();
initialize();
timer.scheduleAtFixedRate(n