java rrd 读取_rrd4j的使用详解1–数据保存入rrd文件 | 学步园
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文件 | 学步园相关推荐
- Java开源项目Hibernate包作用详解
Java开源项目Hibernate包作用详解 本文引自:http://hi.baidu.com/nick6610/blog/item/70b58afa0d0eab9259ee90f7.html Jav ...
- Java内存模型(JMM)详解-可见性volatile
这里写自定义目录标题 Java内存模型(JMM)详解-可见性 什么是JMM JMM存在的意义 为什么示例demo中不会打印 i 的值 如何解决可见性问题 **深入理解JMM内存模型** JAVA内存模 ...
- Java网络编程 Socket、ServerSocket 详解,方法介绍及完整代码示例
Java网络编程 Socket.ServerSocket 详解,方法介绍及完整代码示例 概念 什么是网络编程? 网络编程是指编写运行在多个设备(计算机)的程序,这些设备通过网络连接起来.当这些通过网络 ...
- 牛客网 Java 工程师能力评估 20 题 - 详解
牛客网 Java 工程师能力评估 20 题 - 详解 不知在看博客的你是否知道 牛客网,不知道就太落后了,分享给你 : 牛客网 此 20 题,绝对不只是 20 题! 免责声明:本博客为学习笔记,如有侵 ...
- java集合框架史上最详解(list set 以及map)
title: Java集合框架史上最详解(list set 以及map) tags: 集合框架 list set map 文章目录 一.集合框架总体架构 1.1 集合框架在被设计时需满足的目标 1.2 ...
- java多线程中的join方法详解
java多线程中的join方法详解 方法Join是干啥用的? 简单回答,同步,如何同步? 怎么实现的? 下面将逐个回答. 自从接触Java多线程,一直对Join理解不了.JDK是这样说的:join p ...
- Java中的异常和处理详解
Java中的异常和处理详解 参考文章: (1)Java中的异常和处理详解 (2)https://www.cnblogs.com/lulipro/p/7504267.html 备忘一下.
- java string()函数_转载java String.split()函数的用法详解
转载java String.split()函数的用法详解 如果您发现本文排版有问题,可以先点击下面的链接切换至老版进行查看!!!在java.lang包中有String.split()方法的原型是: p ...
- 2015年 第06届 蓝桥杯 Java B组 决赛真题详解及小结
蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[2013年(第4届)~2020年(第11届)] 第11届 蓝桥杯-第1.2次模拟(软件类)真题-(2020年3月.4月)-官方讲解视频 说明:大部 ...
- 2016年 第07届 蓝桥杯 Java B组 决赛真题详解及小结
蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[2013年(第4届)~2020年(第11届)] 第11届 蓝桥杯-第1.2次模拟(软件类)真题-(2020年3月.4月)-官方讲解视频 说明:大部 ...
最新文章
- php is_null 判断,PHP判断null,别再=了,你真控制不住
- 福利继续:赠书《Spring Cloud微服务-全栈技术与案例解析》
- SAP Fiori应用中事务锁的实现 - Transaction Lock实现机制
- 【POJ - 2226】Muddy Fields(匈牙利算法 或 网络流dinic,二分图匹配,最小点覆盖,矩阵中优秀的建图方式 )
- vmware linux ens32,修改Centos7的网卡ens32 改为eth0
- css3书页翻转,CSS3实现3D翻书效果
- 数据结构与算法 | 来来来,让我们重新认识一下什么是树
- Fisher线性判别(*)
- 苹果css攻击,研究人员设计了一种新的CSS和HTML攻击 导致iPhone重启或冻结Mac
- 图像局部特征(一)--概述
- CenterCrop的Video View
- 计算机无法使用64位itunes,电脑itunes读iphone不了的解决方法
- python爬取豆瓣电影250_python爬取豆瓣电影top250数据存入数据库
- JavaWeb实训项目案例开发之在线图书网站开发【非常适合初学者】
- bug解决:如何解决浏览器显示乱码问题?
- 关于睡眠检测自定义VIEW
- 水果店开业活动策划,水果店开业怎么搞活动
- oracle获取当前时间
- 别踩坑了,细数嵌入式板卡设计的常见问题
- 【postman简介】
热门文章
- 兜兜转转,华为与李一男终于在汽车行业重逢,两者将展开决战?
- windows x64和x86区别
- Vue绘制业务流程图(附源码)
- 机器学习PAI为你自动写歌词,妈妈再也不用担心我的freestyle了
- Grunt 的简单使用
- 底部菜单控件BottomNavigationView的使用
- Resize operation completed for file#
- android启动接受不到boot_complete广播,android-BOOT_COMPLETED从未收到
- 1v1微信聊天测试点
- linux版本石器时代,石器时代私服架设教程LINUX版