JRobin简介

来源:互联网 发布:tcpip网络层协议 编辑:程序博客网 时间:2024/05/17 06:18

JRobin简介

作者:终南   <li.zhongnan@hotmail.com>

做过网络管理的人,对于MRTG应该不算陌生。MRTG可以不断收集来自SNMP的数据,保存这些数据,并且按照日、周、月、年的方式生成4幅图像及相关说明,很直观的显示出要检测数据的趋势信息。

MRTG是比较早的技术了,后来又出现了RRD技术,是在MRTG技术的基础上发展起来的,更加灵活、更加方便。其应用也不在局限在主要监测网络数据上了。你可以通过RRD提供的强大功能收集各种各样的信息,并且生成更加复杂的图像。你也可以在自己的应用程序中使用它,因为它提供了丰富接口,方便应用程序调用。

JRobin是RRD的java版本,其原理是一致的。假如你打算监测计算机的CPU使用率,除了查看当前时刻的数据外,你可能也关心计算机在过去的一天、一周,甚至一个月、一年的CPU使用率,也就是以前一段时间的数据。对于这个要求,需要考虑以下一些问题:

1、数据的采集

获取数据是监测的第一步,根据监测对象的不同,采集数据的方法也不一样,可以通过SNMP获取数据、可以通过外部程序获取数据、可以通过脚本得到数据、也可以采用Java编写代码来取得数据。这些提供数据的方式,或者说是程序,可以看成是JRobin的数据源。我们不是时时刻刻的采集数据,出于性能和成本的考虑,通常在每次采集数据之间都会有一个间隔,也就是说在采集一次数据后,等待几秒或几分钟,然后再次采集数据,将这些多次采集的离散数据用图像方式展示出来,就成了好看直观的曲线。MRTG的采集间隔是300秒,RRD较为灵活,可以以秒为单位自由设置。

2、数据的保存

在每次采集数据后,我们可以将这些数据和采集数据的时刻保存下来,这样方便以后绘制图像。假如每300秒采集一次数据,那么一天需要采集288次数据。如果打算保存一年的数据,那么数据的个数就是 365 * 288。这样的数据不算多,但是没有大多必要,因为我们对数据关心的程度与采集数据的时间远近成比例,越近的数据越关心。另外,当把这些数据显示在固定大小的图像上时,并不是数据越多就越清晰。

JRobin采用了所谓的RRD的存储方式。比如,我们打算用四个图像显示一日、一周、一月和一年内的数据,那么我们可以这么保存数据:

(1)保存最近的288个数据,也就是最近一天的数据;

(2)每7个数据保存一个,保存288个,也就是最近一周时间内的的一些数据;

(3)每30个数据保存一个,保存288个,也就是最近一月时间内的的一些数据;

(4)每365个数据保存一个,保存288个,也就是最近一年时间内的的一些数据。

实际处理时,可能并不是简单隔几个保存一个,而是应用一些简单或复杂的算法。比如或许会对多个数据作一个平均,然后保存为一个。

以这种方式保存数据在JRobin中称之为归档(Archive)。数据源于归档的关系可以用下图来简要说明:

3、数据格式

为了达到以上目的,JRobin采用自己的格式来保存数据,这种格式是平台无关的,与RRD的格式不兼容。

JRobin还提供强大的绘制图像的功能,利用其提供的接口,可以很方便的根据数据生成各种样式图像。

举例:

1、定义保存的数据格式,创建数据文件


   long end = Util.getTime(), start = end - 7 * 86400;             //截至时间为当前时间,起始时间为一周前
   String rrdFile = "demo.rrd";


   // 创建数据文件定义,保存日数据与周数据
   RrdDef rrdDef = new RrdDef(rrdFile, start - 1, 300);                           //数据间隔为300秒
   rrdDef.addDatasource("value1", "GAUGE", 600, Double.NaN, Double.NaN);   //定义数据源,可以定义多个

//以下定义归档数据,即如何保存数据
   rrdDef.addArchive("AVERAGE", 0.5, 1, 288);             //输入给数据源的数据每一个都保存下来,保存288笔数据,即保存最近一天的数据
   rrdDef.addArchive("AVERAGE", 0.5, 7, 288);             //每7笔数据,取平均值,然后保存,保存288笔数据,即保存最近一周的数据
   RrdDb rrdDb = new RrdDb(rrdDef);                             //根据数据定义创建数据文件

对于月和年的数据,可以用相同的方式处理。

2、更新数据

采用三角函数生成数据。

   for (long t = start; t < end; t += 300) {
    Sample sample = rrdDb.createSample(t);
    sample.setValue("value1", Math.sin(2 * Math.PI * (t / 86400.0)) * 50 + 50);
    sample.update();
   }

3、生成图形

   String pngFile = "";
   RrdGraphDef gDef = null;
  

//生成最近一天的图形
   pngFile = "demoday.png";
   gDef = new RrdGraphDef();
   gDef.setFilename(pngFile);
   gDef.setWidth(450);
   gDef.setHeight(250);
   gDef.setImageFormat("png");
   gDef.setTimeSpan(end - 86400, end);
   gDef.setTitle("JRobin Demo");
  
   gDef.datasource("demo", rrdFile, "value1", "AVERAGE");
   gDef.line("demo", Color.GREEN, "real");
   gDef.gprint("demo", "MIN", "%5.1lf Min");
   gDef.gprint("demo", "AVERAGE", "%5.1lf Avg");
   gDef.gprint("demo", "MAX", "%5.1lf Max");
  
   gDef.setSmallFont(new Font("Monospaced", Font.PLAIN, 11));
   gDef.setLargeFont(new Font("SansSerif", Font.BOLD, 14));
   new RrdGraph(gDef);
  

//生成最近一周的图形
   pngFile = "demoweek.png";
   gDef = new RrdGraphDef();
   gDef.setFilename(pngFile);
   gDef.setWidth(450);
   gDef.setHeight(250);
   gDef.setImageFormat("png");
   gDef.setTimeSpan(end - 7 * 86400, end);
   gDef.setTitle("JRobin Demo");
  
   gDef.datasource("demo", rrdFile, "value1", "AVERAGE");
   gDef.line("demo", Color.GREEN, "real");
   gDef.gprint("demo", "MIN", "%5.1lf Min");
   gDef.gprint("demo", "AVERAGE", "%5.1lf Avg");
   gDef.gprint("demo", "MAX", "%5.1lf Max");
  

   //如果需要显示中文,以下两条语句比较重要
   gDef.setSmallFont(new Font("Monospaced", Font.PLAIN, 11));
   gDef.setLargeFont(new Font("SansSerif", Font.BOLD, 14));  
   new RrdGraph(gDef);

4、生成的图形如下所示:

(1)按日生成的图形

(2)按周生成的图形

参考:http://hi.baidu.com/li_zhongnan/blog/item/6fef0499a408940d6e068cbf.html