i3geek.com
闫庚哲的个人博客

rrd4j通过Demo介绍如何绘图

上文中已经介绍了rrd4j的相关名词,本文主要介绍如何使用,画出如下图:

 

准备工作

下载Jar包,并引用

rrd4j的jar包下载:http://code.google.com/p/rrd4j/

maven的工程 自己构建下就好了,不多说

创建数据库

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分钟的内容。

导入数据

// 获得数据源
        rrdDb = new RrdDb(rrdPath);
        Sample sample = rrdDb.createSample();
        while (t<end) {//循环条件,把所有数据导入即可
            sample.setTime(t);//设置本条时间
            sample.setValue("sun", value);//和上面创建的数据源名称一致,后面是值
            sample.update();
            t +=60;
        }
        rrdDb.close();

画图

        // 创建图片
        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类实际上创建图表

注意:

这里的时间单位都是秒

赞(0)
未经允许不得转载:爱上极客 » rrd4j通过Demo介绍如何绘图
分享到: 更多 (0)

评论 2

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. #1

    你的网站怎么没有联盟广告呢?还想帮你点击点击呢!【高佣居】来学习了!

    高佣金4年前 (2016-02-26)回复
  2. #2

    感觉影响体验 给取消了

    yan4年前 (2016-02-26)回复