- 浏览: 544871 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
wa114d:
楼主工作几年了,好厉害
一个面试官对面试问题的分析 -
wobuxiaole:
Good,非常好
30岁前男人需要完成的事 -
小逗逗:
Good,非常好
30岁前男人需要完成的事 -
invincibleLiu:
好帖,要顶!(别投我隐藏啊,这是对BBS最原始一种支持)
Java:synchronized修饰符在静态方法与非静态方法上的区别 -
fayedShih:
第三题,不知道对不对
import java.util.con ...
企业牛逼面试题目 高手进来讨论答题
link:http://hongliangpan.iteye.com/blog/243149
安全监控 , 网络技术 GgNET 08月 22nd. 2008, 12:39am
在网络环境下,Ping是一个很重要的命令,通常用来检测远程的机器是否能够连通以及连接的质量如何。如果定时Ping一些机器,然后将响应时间在时间轴上画成图像,那就能非常直观的显示出网络信息,达到减脂网络的目的。
JRobin是一个很好的存储和用图形展示基于时间序列数据的工具。可以使用Java编写代码将操作系统中的Ping命令与JRobin结合起来,通过Ping命令获取数据信息,用JRobin保存和以图形方式显示Ping的响应时间,从而开发出一个简单的网络监视工具。
1、Ping
Ping命令的用法很简单,一般在其后接目标机器的域名或IP地址。不过Windows和Linux下的用法有所不同:
(1)在Windows下,执行 ping www.baidu.com 命令后,连续Ping四次,然后返回结果;在Linux下,执行同样的命令好,一直Ping下去,直到使用Ctrl+C终止该命令。
(2)在Windows下,通过 -n 来指定Ping的次数;在Linux下,使用 -c 选项。
2、JRobin
JRobin的介绍可以参考:
(1)JRobin网站:http://www.jrobin.org/
(2)JRobin简介:http://hi.baidu.com/li_zhongnan/blog/item/6fef0499a408940d6e068cbf.html
3、在Java中的实现机制:
(1)获取Ping响应时间:通过ProcessBuilder创建一个代表外部Ping命令的Process,启动Process执行Ping命令,获取Ping命令的标准输出,对标准输出进行解析,取出响应时间数据。如果需要能在Windows和Linux平台上执行,可以通过环境变量判断平台然后选择针对不同的平台、带不同的参数、执行不同的命令、用不同的方法解析命令输出,最终输出相同的结果。
在Java中执行外部命令可以参考:http://hi.baidu.com/li_zhongnan/blog/item/318effa9611d2bf91f17a26a.html
(2)保存历史数据:使用JRobin的机制来保存Ping的历史数据。
(3)定时执行:将执行Ping命令获取响应时间、保存相应时间数据到JRobin封装在一个函数,在TimerTask中调用该函数,通过Timer调度来定时执行。
(4)生成图形:使用JRobin来生成Ping响应时间图形。
(5)扩展性考虑:
a. 通过参数设置多个需要监视的对象,可以对多个域名或IP地址进行监视并将数据画在衣服图上;
b. 可以指定数据和图形的保存目录;
c. 提供启动和停止监视的功能;
d. 可以随时调用生成图形的操作,从而可以实现实时监控的功能。
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 PingMonitor { public static String[] execute(String command) { String[] strs = null; File scriptFile = null; try { List<String> cmdList = new ArrayList<String>(); String osName = System.getProperty(”os.name”); if (osName.indexOf(”Windows”) > -1) { cmdList.add(”CMD.EXE”); cmdList.add(”/C”); cmdList.add(command); } else { scriptFile = File.createTempFile(”monitor”, “.sh”); cmdList.add(”/bin/bash”); String fileName = scriptFile.getCanonicalPath(); PrintWriter writer = new PrintWriter(scriptFile); writer.println(command); 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 ArrayList<String>(); while ((line = stdout.readLine()) != null) { stdoutList.add(line); } BufferedReader stderr = new BufferedReader(new InputStreamReader(p .getErrorStream())); List<String> stderrList = new ArrayList<String>(); while ((line = stderr.readLine()) != null) { stderrList.add(line); } strs = stdoutList.toArray(new String[0]); } catch (Exception e) { e.printStackTrace(); } finally { if (scriptFile != null) scriptFile.delete(); } return strs; } private String dataFormat = “%5.1f ms”; private Logger logger = Logger.getLogger(this.getClass().getName()); private String monitorName = “ping”; private String[] hosts = null; 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 PingMonitor(String[] hosts, String dataDir, int step) { this.hosts = hosts; 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 logger.info(”Creating graph”); RrdGraphDef gDef = new RrdGraphDef(); gDef.setWidth(width); gDef.setHeight(height); gDef.setFilename(graphPath); gDef.setStartTime(start); gDef.setEndTime(end); gDef.setTitle(”Ping 命令响应时间”); gDef.setVerticalLabel(”毫秒”); String[] dsNames = null; rrdDb = new RrdDb(rrdPath); dsNames = rrdDb.getDsNames(); for (int i = 0; i < dsNames.length; i++) { String dsName = dsNames[i]; String legend = 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”); gDef.gprint(dsName, “AVERAGE”, dataFormat + ” Avg”); gDef.gprint(dsName, “MAX”, dataFormat + ” Max”); gDef.gprint(dsName, “LAST”, dataFormat + ” Last\\r”); 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(”<img src=’%s’ width=’%d’ height = ‘%d’>”); 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); // logger.info(graph.getRrdGraphInfo().dump()); logger.info(”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 double getReplyTime(String[] strs) { double value = Double.NaN; if (strs != null) { for (int j = 0; j < strs.length; j++) { String str = strs[j]; int n1 = str.indexOf(”time=”); int n2 = str.indexOf(”ms”, n1); if (n1 > 0 && n2 > n1) { String s = str.substring(n1 + “time=”.length(), n2).trim(); try { value = Double.parseDouble(s); } catch (Exception e) { } break; } } } 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 host) { String command = “”; String osName = System.getProperty(”os.name”); if (osName.indexOf(”Windows”) > -1) { command = “ping ” + host + ” -n 1″; } else { command = “ping ” + host + ” -c 1″; } return getReplyTime(execute(command)); } /** * Initialization. */ public void initialize() throws Exception { RrdDb rrdDb = null; try { rrdDb = new RrdDb(rrdPath); } catch (Exception e) { } if (rrdDb == null) { logger.info(”RRD data is not located in ” + rrdPath + “, create a new one”); RrdDef rrdDef = new RrdDef(rrdPath, timeStart - 1, step); for (int i = 0; i < hosts.length; i++) rrdDef .addDatasource(hosts[i], “GAUGE”, 2 * step, 0, Double.NaN); rrdDef.addArchive(”AVERAGE”, 0.5, 1, 24 * 3600 / step); rrdDef.addArchive(”AVERAGE”, 0.5, 300 / step, 7 * 288); logger.info(”Estimated file size: ” + rrdDef.getEstimatedSize()); rrdDb = new RrdDb(rrdDef); logger.info(”RRD file created.”); } logger.info(monitorName + ” RRD Db Defs: ” + rrdDb.getRrdDef().dump()); if (rrdDb != null) rrdDb.close(); } /** * Start monitor. * * @return true if succeed, else false. */ public boolean start() { logger.info(”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; try { logger.info(”update rrd data for ” + monitorName); rrdDb = new RrdDb(rrdPath); String[] dsNames = rrdDb.getDsNames(); long lastUpdateTime = rrdDb.getLastUpdateTime(); long t = org.jrobin.core.Util.getTimestamp(); if (t > lastUpdateTime) { rrdDb.setInfo(”T=” + t); Sample sample = rrdDb.createSample(); sample.setTime(t); for (int i = 0; i < dsNames.length; i++) { String dsName = dsNames[i]; Double value = getValue(dsName); logger.fine(dsName + ” = ” + value); if (value == null) value = Double.NaN; sample.setValue(dsName, value); } sample.update(); } else { logger.warning(”Bad sample time ” + t + “(” + new Date(t * 1000L) + “)” + new Date() + “, the last update time was ” + lastUpdateTime + “(” + new Date(lastUpdateTime * 1000L) + “) - ” + monitorName); } } finally { if (rrdDb != null) try { rrdDb.close(); } catch (IOException e) { e.printStackTrace(); } } } public static void main(String[] args) { String[] hosts = new String[] { “ www.baidu.com “, “ www.google.cn ” }; PingMonitor p = new PingMonitor(hosts, “.”, 10); p.start(); try { Thread.sleep(10 * 60 * 1000); } catch (InterruptedException e) { e.printStackTrace(); } p.stop(); p.generateGraph(); } }
发表评论
-
JRobin简介
2011-03-31 14:17 1405link:http://harry.iteye.com ... -
SVN的标准目录结构:trunk、branches、tags
2011-03-23 16:31 2067我们在一些著名开源项 ... -
从HTTP GET和POST的区别说起
2011-02-24 12:59 1013面试时得到的回答大多 ... -
如何减少网页的内存与CPU占用(zz)
2011-02-24 12:37 1539http://justjavac.iteye.com/blog ... -
开发时候,怎么debug依赖包源码
2011-02-21 16:01 1272编码的时候, 最好把JDK 的DOC/SRC 都纳入到ECLI ... -
利用 iText 实现 PDF 报表下载 (转)
2010-12-10 15:15 1517很久没更新 blog 了,工作和一些事情占用了大部分精力,实在 ... -
httpclient 4
2010-11-24 17:38 10691. HttpClient4.0.1应用指南 ... -
转Java程序命令行下的执行
2010-11-04 12:30 1402IED用惯了,基础都快忘记了 javac 先不说了,环境变 ... -
通过Ssh协议连接到服务器执行执行的指令
2010-11-03 16:28 1771通过Ssh协议连接到服务器执行执行的指令。echo $?这条命 ... -
eclipse remote debug
2010-09-01 12:01 892$TOMCAT_HOME/ bin/ catalina.sh/ ... -
CATALINA_OPTS v JAVA_OPTS - What is the difference?
2010-08-31 19:06 1198There are two environment varia ... -
java.lang.OutOfMemoryError: PermGen space及其解决方法
2010-08-31 18:43 1021SUN JDK+Tomcat 运行服务的时候遇到问题,服 ... -
Tomcat多站点配置方法
2010-07-13 18:03 2559Tomcat多站点配置方法 A. ... -
myeclipse中文乱码 解决方案
2010-06-25 10:32 3350昨晚在Myeclipse导入一个项目,有中文乱码问题,所以郁闷 ... -
WebService之Axis2
2010-04-07 13:18 885http://www.jobedu.com.cn/archiv ... -
utf-8 中文乱码解决方案
2009-12-29 13:56 23811.java类: CharacterEncodingFilte ... -
telnet \socket \ httpproxy 三种客户端实现
2009-11-20 17:41 35431.socket实现方式: public class Tes ... -
书籍推荐
2009-11-17 15:08 1262《现代操作系统概论》《数据库系统概念》《算法与数据结构》《计算 ... -
ant使用
2009-11-05 13:13 993Ant是一种专为java量身订做的构建工具,基础已经了java ... -
web.xml 中的listener、 filter、servlet 加载顺序及其详解
2009-07-17 14:48 1021在项目中总会遇到一些关于加载的优先级问题,近期也同样遇到过类似 ...
相关推荐
**Jrobin流量监控代码详解** ...总的来说,"jrobin流量监控代码"为我们提供了一个高效、灵活的解决方案,用于管理和分析时序流量数据。通过深入理解并定制这段代码,我们可以构建出适应不同业务场景的监控系统。
"JRobin简介.html"和"基于JRobin的CPU使用率监控.html"、"基于JRobin的网络监控管理.html"深入介绍了JRobin的使用方法,包括如何监控CPU使用率和网络状态。JRobin的文件结构和工作原理在"JRobin简介_files"中有所...
Mrtg(Multi Router Traffic Grapher)是网络流量监控的先驱工具,而 JRobin 可以视为 Mrtg 在 Java 平台上的一个替代品。它们都支持 RRDTool(Round Robin Database Tool)的数据格式,使得从 Mrtg 迁移到 JRobin ...
- **自定义监控**:任何需要记录和分析性能指标的应用都可以考虑使用JRobin,如数据库性能监控、网络服务响应时间追踪等。 5. **源代码学习路径** 开发者可以首先从主类和关键接口入手,理解数据的存储和读取流程...
网络管理系统(Network Management System, NMS)是一种用于监控、管理和维护网络设备的软件工具。基于Web的网络管理系统将这种功能与Web技术相结合,使得管理员可以通过Web浏览器远程访问和控制网络设备,无需安装...
赠送jar包:jrobin-1.5.9.jar; 赠送原API文档:jrobin-1.5.9-javadoc.jar; 赠送源代码:jrobin-1.5.9-sources.jar; 赠送Maven依赖信息文件:jrobin-1.5.9.pom; 包含翻译后的API文档:jrobin-1.5.9-javadoc-API...
赠送jar包:jrobin-1.5.9.jar; 赠送原API文档:jrobin-1.5.9-javadoc.jar; 赠送源代码:jrobin-1.5.9-sources.jar; 赠送Maven依赖信息文件:jrobin-1.5.9.pom; 包含翻译后的API文档:jrobin-1.5.9-javadoc-API...
学习用jrobin绘图的绝佳例子程序 学习用jrobin绘图的绝佳例子程序
它集成了JRobin,一个高效的数据存储库,用于收集和展示监控数据。本篇将深入探讨JavaMelody和JRobin的核心功能以及它们在Java运行时监控中的作用。 JavaMelody的核心功能主要包括以下几个方面: 1. **性能指标...
总之,`javamelody-core-1.52.0.jar`和`jrobin-1.5.9.jar`是JavaMelody监控解决方案的重要组成部分,它们共同为Java Web应用提供了详尽的性能监控和数据分析能力。通过集成这两个JAR,开发者可以轻松地对应用进行...
jrobin-1.5.9.1.jar则是用于存储和读取监控数据的库,它是基于Rrdtool(Round Robin Database Tool)的一个Java实现。Rrdtool是一种高效的数据存储方案,特别适合于长期保存时间序列数据,如性能监控数据。jrobin库...
另外,它还能够监控系统级别的指标,如CPU使用率、磁盘空间和网络I/O,这些信息对于系统运维人员来说非常宝贵。 集成JavaMelody到你的JAVA Web项目中十分简便。通常只需要在web.xml配置文件中添加相关的监听器和...
JRobin是RRDTool的100%纯Java替代品,具有几乎完全相同的规格。 如果向RRDTool和JRobin提供相同的数据,则将获得完全相同的结果和图形。 支持所有标准RRDTool操作。
6. **会话监控**:跟踪会话的创建、修改、过期和销毁,帮助了解会话管理是否合理。 7. **邮件服务监控**:如果应用有邮件发送功能,JavaMelody可以记录邮件发送的详情,如发送成功、失败等。 8. **自定义监控**:...
总的来说,开源的Tomcat性能查看工具通过集成JavaMelody和JRobin,为管理员提供了一个强大且易用的监控平台,帮助提升Tomcat的运行效率,降低故障率,保障业务的连续性。对于任何使用Tomcat的企业或开发者来说,掌握...
监控器需要的jar,需在web.xml中配置 <filter-name>monitoring <filter-class>net.bull.javamelody.MonitoringFilter</filter-class> <filter-name>monitoring <url-pattern>/* <listener-class>...
3. 将javamelody.zip中的两个jar文件(javamelody.jar和jrobin-x.jar)复制到Web应用的WEB-INF/lib目录下,或通过Maven添加javamelody-core的依赖。 4. 修改Web应用的web.xml配置文件。对于Servlet API 3.0以上的...
JavaMelody利用JRobin来持久化监控数据,如内存、CPU使用率等,以便后续分析。 3. **javamelody.war**: 这是一个预打包的Web应用,可以独立部署在支持Servlet容器(如Tomcat、Jetty等)上。当你不想或不能将Java...
- 将`javamelody.jar`和`jrobin-x.jar`两个文件从提供的`javamelody.zip`压缩包根目录下复制到待监控Web应用的`WEB-INF/lib`目录中。 - 如果使用Maven构建工具,可以通过添加`javamelody-core`依赖项简化安装流程...
RRD(Round Robin Database)是一种特殊类型的数据库,主要用于存储时间序列数据,如系统监控、网络流量统计、服务器性能指标等。RRD的核心理念是通过有限的磁盘空间,以固定的时间间隔存储数据点,实现对历史数据的...