上文中已经介绍了rrd4j的相关名词,本文主要介绍如何使用,画出如下图:
准备工作
下载Jar包,并引用
rrd4j的jar包下载:http://code.google.com/p/rrd4j/
maven的工程 自己构建下就好了,不多说
创建数据库
1 2 3 4 5 6 7 8 9 10 11 12 |
String rrdPath = "/Users/yangengzhe/Desktop/a.rrd"; // 文件路径 String imgPath = "/Users/yangengzhe/Desktop/a.png"; String factory = "FILE"; // 设置文件的保存方式 1.FILE 文件形式 2.SAFE 线程安全 3.NIO 缓冲区 4.MEMORY 内存 RrdDb.setDefaultFactory(factory); //开始创建数据库 RrdDef rrdDef = new RrdDef(rrdPath, start - 1, 60); // 新建一个RRD定义对象,给定路径,开始时间以及时间间隔 rrdDef.setVersion(2); // 文件版本 rrdDef.addDatasource("sun", DsType.GAUGE, 600, 0, Double.NaN); //单一数据源添加到RRD定义通过指定它的数据源名称、源类型DsType包含4个参数 ABSOLUTE COUNTER计数器 DERIVE GAUGE直径、心跳、最小和最大的值。 //ConsolFun 被存储存储数据的平均 TOTAL 总的数据点存储 MAX最大的数据点存储 rrdDef.addArchive(ConsolFun.AVERAGE, 0.5, 1, 80);//consolFun 合并函数 xff: x档案的元素.有效的值在0和1之间。 steps: 数量的存步伐 rows数量的存档行 RrdDb rrdDb = new RrdDb(rrdDef); // 建立好模型 rrdDb.close(); |
注解很详细了,不多解释,这里就想说一下:
RrdDef rrdDef = new RrdDef(rrdPath, start – 1, 60);
这里表示从star-1开始,每60s为一个时间间隔1分
rrdDef.addArchive(ConsolFun.AVERAGE, 0.5, 1, 80);
这里主要是后面两个参数:表示每一笔数据一归档,保存80笔。说白了就是,每1笔数据做一次平均值,保存80笔数据。
结合上面的时间间隔,总的意思是,每笔数据间隔1分钟,1笔数据做一次平均值,保存80笔数据。也就是一共可以保存1小时20分钟的内容。
导入数据
1 2 3 4 5 6 7 8 9 10 |
// 获得数据源 rrdDb = new RrdDb(rrdPath); Sample sample = rrdDb.createSample(); while (t<end) {//循环条件,把所有数据导入即可 sample.setTime(t);//设置本条时间 sample.setValue("sun", value);//和上面创建的数据源名称一致,后面是值 sample.update(); t +=60; } rrdDb.close(); |
画图
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
// 创建图片 RrdGraphDef gDef = new RrdGraphDef(); gDef.setWidth(IMG_WIDTH); gDef.setHeight(IMG_HEIGHT); gDef.setFilename(imgPath); gDef.setStartTime(start); gDef.setEndTime(end); gDef.setTitle("Temperatures in May-June 2010"); gDef.setVerticalLabel("temperature"); gDef.datasource("sun", rrdPath, "sun", ConsolFun.MAX); // name:数据源名称 rrdPath:RRD文件路径 dsName:数据源名称在指定的RRD文件 sonsolFun:整合功能(平均、最小,最大,最后) gDef.datasource("sun-v", "sun,2,*");//创建虚拟数据源,利用rpn表达式 // line 和 area之间的区别是直线和区域描述 gDef.line("sun", Color.BLUE, "sun"); // name:数据源名称 Color: 颜色 legend:注释文本 gDef.area("sun-v", Color.YELLOW, "sun-v"); //srcName:虚拟源名称 color:颜色 legend:注释文本 // 但结果是印在图形本身,下面的图区域 gDef.gprint("sun", ConsolFun.AVERAGE, "avgSun = %.3f%S\\c"); //srcName:虚拟源名称 consolFun整合功能应用到源代码 // format:格式字符串(如“平均= % 10.3 f % s”) gDef.gprint("sun-v", ConsolFun.AVERAGE, "avgsun-v = %.3f%S\\c"); gDef.setImageInfo("<img src='%s' width='%d' height = '%d'>"); // 创建额外的图像信息 gDef.setImageFormat("png"); // 设置图像格式 imageFormat "PNG", "GIF" or "JPG". // create graph finally RrdGraph graph = new RrdGraph(gDef);//创建并保存图片 System.out.println(graph.getRrdGraphInfo().dump()); // 该类,可以采用Rrd4j类实际上创建图表 |
注意:
这里的时间单位都是秒