1.说明

rrd:A high performance data logging and graphing system for time series data.

本例子是官方网站上的Demo

2.官方网站上的源码Demo

import org.rrd4j.core.*;

import org.rrd4j.graph.RrdGraph;

import org.rrd4j.graph.RrdGraphDef;

import java.awt.*;

import java.io.BufferedOutputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.PrintWriter;

import java.util.Random;

import static org.rrd4j.ConsolFun.*;

import static org.rrd4j.DsType.GAUGE;

/**

* Simple demo just to check that everything is OK with this library. Creates two files in your

* $HOME/rrd4j-demo directory: demo.rrd and demo.png.

*/

public class RrdDemo {

static final long SEED = 1909752002L;

static final Random RANDOM = new Random(SEED);

//文件名称

static final String FILE = "demo";

static final long START = Util.getTimestamp(2010, 4, 1);

static final long END = Util.getTimestamp(2010, 6, 1);

static final int MAX_STEP = 300;

//生成图片的宽度高度

static final int IMG_WIDTH = 500;

static final int IMG_HEIGHT = 300;

/**

*

To start the demo, use the following command:

*

* java -cp rrd4j-{version}.jar org.rrd4j.demo.Demo

*

*

* @param args the name of the backend factory to use (optional)

* @throws IOException Thrown

*/

public static void main(String[] args) throws IOException {

println("== Starting demo");

long startMillis = System.currentTimeMillis();

if (args.length > 0) {

println("Setting default backend factory to " + args[0]);

RrdDb.setDefaultFactory(args[0]);

}

long start = START;

long end = END;

//文件路径

String rrdPath = Util.getRrd4jDemoPath(FILE + ".rrd");

String xmlPath = Util.getRrd4jDemoPath(FILE + ".xml");

String rrdRestoredPath = Util.getRrd4jDemoPath(FILE + "_restored.rrd");

String imgPath = Util.getRrd4jDemoPath(FILE + ".png");

String logPath = Util.getRrd4jDemoPath(FILE + ".log");

PrintWriter log = new PrintWriter(new BufferedOutputStream(new FileOutputStream(logPath, false)));

// first, define the RRD 新建一个RRD定义对象,给定路径,开始时间以及时间间隔

RrdDef rrdDef = new RrdDef(rrdPath, start - 1, 300);

rrdDef.setVersion(2);

//添加数据源到RRD,通过指定它的数据源名称、源类型、心跳、最小和最大的值。

//DsType参数 ABSOLUTE COUNTER DERIVE GAUGE

rrdDef.addDatasource("sun", GAUGE, 600, 0, Double.NaN);

rrdDef.addDatasource("shade", GAUGE, 600, 0, Double.NaN);

rrdDef.addArchive(AVERAGE, 0.5, 1, 600);// 1 step, 600 rows

rrdDef.addArchive(AVERAGE, 0.5, 6, 700);// 6 steps, 700 rows

rrdDef.addArchive(AVERAGE, 0.5, 24, 775);

rrdDef.addArchive(AVERAGE, 0.5, 288, 797);

rrdDef.addArchive(TOTAL, 0.5, 1, 600);

rrdDef.addArchive(TOTAL, 0.5, 6, 700);

rrdDef.addArchive(TOTAL, 0.5, 24, 775);

rrdDef.addArchive(TOTAL, 0.5, 288, 797);

rrdDef.addArchive(MAX, 0.5, 1, 600);

rrdDef.addArchive(MAX, 0.5, 6, 700);

rrdDef.addArchive(MAX, 0.5, 24, 775);

rrdDef.addArchive(MAX, 0.5, 288, 797);

println(rrdDef.dump());

log.println(rrdDef.dump());

println("Estimated file size: " + rrdDef.getEstimatedSize());

RrdDb rrdDb = new RrdDb(rrdDef);

println("== RRD file created.");

if (rrdDb.getRrdDef().equals(rrdDef)) {

println("Checking RRD file structure... OK");

} else {

println("Invalid RRD file created. This is a serious bug, bailing out");

return;

}

rrdDb.close();

println("== RRD file closed.");

// update database

GaugeSource sunSource = new GaugeSource(1200, 20);

GaugeSource shadeSource = new GaugeSource(300, 10);

println("== Simulating one month of RRD file updates with step not larger than " +

MAX_STEP + " seconds (* denotes 1000 updates)");

long t = start;

int n = 0;

// then, create a RrdDb from the definition and start adding data

rrdDb = new RrdDb(rrdPath);

Sample sample = rrdDb.createSample();

while (t <= end + 172800L) {

sample.setTime(t);

sample.setValue("sun", sunSource.getValue());

sample.setValue("shade", shadeSource.getValue());

log.println(sample.dump());

sample.update();

t += RANDOM.nextDouble() * MAX_STEP + 1;

if (((++n) % 1000) == 0) {

System.out.print("*");

}

}

rrdDb.close();

println("");

println("== Finished. RRD file updated " + n + " times");

//rrdDb.close();

// test read-only access!

rrdDb = new RrdDb(rrdPath, true);

println("File reopen in read-only mode");

println("== Last update time was: " + rrdDb.getLastUpdateTime());

println("== Last info was: " + rrdDb.getInfo());

// fetch data

println("== Fetching data for the whole month");

FetchRequest request = rrdDb.createFetchRequest(AVERAGE, start, end);

println(request.dump());

log.println(request.dump());

FetchData fetchData = request.fetchData();

println("== Data fetched. " + fetchData.getRowCount() + " points obtained");

println(fetchData.toString());

println("== Dumping fetched data to XML format");

println(fetchData.exportXml());

println("== Fetch completed");

// dump to XML file

println("== Dumping RRD file to XML file " + xmlPath + " (can be restored with RRDTool)");

rrdDb.exportXml(xmlPath);

println("== Creating RRD file " + rrdRestoredPath + " from XML file " + xmlPath);

RrdDb rrdRestoredDb = new RrdDb(rrdRestoredPath, xmlPath);

// close files

println("== Closing both RRD files");

rrdDb.close();

println("== First file closed");

rrdRestoredDb.close();

println("== Second file closed");

// create graph

println("Creating graph " + Util.getLapTime());

println("== Creating graph from the second file");

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", rrdRestoredPath, "sun", AVERAGE);

gDef.datasource("shade", rrdRestoredPath, "shade", AVERAGE);

//创建一个新的虚拟数据源通过评估一个数学表达式. name:数据源名称 rpnExpression:RPN表达式

//平均值

gDef.datasource("median", "sun,shade,+,2,/");

//差值

gDef.datasource("diff", "sun,shade,-,ABS,-1,*");

gDef.datasource("sine", "TIME," + start + ",-," + (end - start) + ",/,2,PI,*,*,SIN,1000,*");

//name:数据源名称 Color: 颜色 legend:注释文本

//line:直线 area:区域

gDef.line("sun", Color.GREEN, "sun temp");

gDef.line("shade", Color.BLUE, "shade temp");

gDef.line("median", Color.MAGENTA, "median value");

gDef.area("diff", Color.YELLOW, "difference");

gDef.line("diff", Color.RED, null);

gDef.line("sine", Color.CYAN, "sine fun");

gDef.hrule(2568, Color.GREEN, "hrule");

gDef.vrule((start + 2 * end) / 3, Color.MAGENTA, "vrule\\c");

gDef.comment("\\r");

gDef.gprint("sun", MAX, "maxSun = %.3f%s");

gDef.gprint("sun", AVERAGE, "avgSun = %.3f%S\\c");

gDef.gprint("shade", MAX, "maxShade = %.3f%S");

gDef.gprint("shade", AVERAGE, "avgShade = %.3f%S\\c");

gDef.setImageInfo("");

gDef.setPoolUsed(false);

gDef.setImageFormat("png");

println("Rendering graph " + Util.getLapTime());

// create graph finally

RrdGraph graph = new RrdGraph(gDef);

println(graph.getRrdGraphInfo().dump());

println("== Graph created " + Util.getLapTime());

// locks info

println("== Locks info ==");

println(RrdSafeFileBackend.getLockInfo());

// demo ends

log.close();

println("== Demo completed in " +

((System.currentTimeMillis() - startMillis) / 1000.0) + " sec");

}

static void println(String msg) {

System.out.println(msg);

}

static void print(String msg) {

System.out.print(msg);

}

static class GaugeSource {

private double value;

private double step;

GaugeSource(double value, double step) {

this.value = value;

this.step = step;

}

long getValue() {

double oldValue = value;

double increment = RANDOM.nextDouble() * step;

if (RANDOM.nextDouble() > 0.5) {

increment *= -1;

}

value += increment;

if (value <= 0) {

value = 0;

}

return Math.round(oldValue);

}

}

}

3.程序运行结果

java rrd 读取_rrd4j的使用详解1–数据保存入rrd文件 | 学步园相关推荐

  1. Java开源项目Hibernate包作用详解

    Java开源项目Hibernate包作用详解 本文引自:http://hi.baidu.com/nick6610/blog/item/70b58afa0d0eab9259ee90f7.html Jav ...

  2. Java内存模型(JMM)详解-可见性volatile

    这里写自定义目录标题 Java内存模型(JMM)详解-可见性 什么是JMM JMM存在的意义 为什么示例demo中不会打印 i 的值 如何解决可见性问题 **深入理解JMM内存模型** JAVA内存模 ...

  3. Java网络编程 Socket、ServerSocket 详解,方法介绍及完整代码示例

    Java网络编程 Socket.ServerSocket 详解,方法介绍及完整代码示例 概念 什么是网络编程? 网络编程是指编写运行在多个设备(计算机)的程序,这些设备通过网络连接起来.当这些通过网络 ...

  4. 牛客网 Java 工程师能力评估 20 题 - 详解

    牛客网 Java 工程师能力评估 20 题 - 详解 不知在看博客的你是否知道 牛客网,不知道就太落后了,分享给你 : 牛客网 此 20 题,绝对不只是 20 题! 免责声明:本博客为学习笔记,如有侵 ...

  5. java集合框架史上最详解(list set 以及map)

    title: Java集合框架史上最详解(list set 以及map) tags: 集合框架 list set map 文章目录 一.集合框架总体架构 1.1 集合框架在被设计时需满足的目标 1.2 ...

  6. java多线程中的join方法详解

    java多线程中的join方法详解 方法Join是干啥用的? 简单回答,同步,如何同步? 怎么实现的? 下面将逐个回答. 自从接触Java多线程,一直对Join理解不了.JDK是这样说的:join p ...

  7. Java中的异常和处理详解

    Java中的异常和处理详解 参考文章: (1)Java中的异常和处理详解 (2)https://www.cnblogs.com/lulipro/p/7504267.html 备忘一下.

  8. java string()函数_转载java String.split()函数的用法详解

    转载java String.split()函数的用法详解 如果您发现本文排版有问题,可以先点击下面的链接切换至老版进行查看!!!在java.lang包中有String.split()方法的原型是: p ...

  9. 2015年 第06届 蓝桥杯 Java B组 决赛真题详解及小结

    蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[2013年(第4届)~2020年(第11届)] 第11届 蓝桥杯-第1.2次模拟(软件类)真题-(2020年3月.4月)-官方讲解视频 说明:大部 ...

  10. 2016年 第07届 蓝桥杯 Java B组 决赛真题详解及小结

    蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[2013年(第4届)~2020年(第11届)] 第11届 蓝桥杯-第1.2次模拟(软件类)真题-(2020年3月.4月)-官方讲解视频 说明:大部 ...

最新文章

  1. php is_null 判断,PHP判断null,别再=了,你真控制不住
  2. 福利继续:赠书《Spring Cloud微服务-全栈技术与案例解析》
  3. SAP Fiori应用中事务锁的实现 - Transaction Lock实现机制
  4. 【POJ - 2226】Muddy Fields(匈牙利算法 或 网络流dinic,二分图匹配,最小点覆盖,矩阵中优秀的建图方式 )
  5. vmware linux ens32,修改Centos7的网卡ens32 改为eth0
  6. css3书页翻转,CSS3实现3D翻书效果
  7. 数据结构与算法 | 来来来,让我们重新认识一下什么是树
  8. Fisher线性判别(*)
  9. 苹果css攻击,研究人员设计了一种新的CSS和HTML攻击 导致iPhone重启或冻结Mac
  10. 图像局部特征(一)--概述
  11. CenterCrop的Video View
  12. 计算机无法使用64位itunes,电脑itunes读iphone不了的解决方法
  13. python爬取豆瓣电影250_python爬取豆瓣电影top250数据存入数据库
  14. JavaWeb实训项目案例开发之在线图书网站开发【非常适合初学者】
  15. bug解决:如何解决浏览器显示乱码问题?
  16. 关于睡眠检测自定义VIEW
  17. 水果店开业活动策划,水果店开业怎么搞活动
  18. oracle获取当前时间
  19. 别踩坑了,细数嵌入式板卡设计的常见问题
  20. 【postman简介】

热门文章

  1. 兜兜转转,华为与李一男终于在汽车行业重逢,两者将展开决战?
  2. windows x64和x86区别
  3. Vue绘制业务流程图(附源码)
  4. 机器学习PAI为你自动写歌词,妈妈再也不用担心我的freestyle了
  5. Grunt 的简单使用
  6. 底部菜单控件BottomNavigationView的使用
  7. Resize operation completed for file#
  8. android启动接受不到boot_complete广播,android-BOOT_COMPLETED从未收到
  9. 1v1微信聊天测试点
  10. linux版本石器时代,石器时代私服架设教程LINUX版