rrd4j (2.1.1) 里面有两个类,RrdMongoDBBackend、 RrdMongoDBBackendFactory 的定义是为了支持mongoDB的存储方式。
具体使用方法代码如下:
static String rrdFile = "F:\\test1.rrd";
static String pngFile = "E:\\rrds\\test1.png";
//从mongo中取数据
Mongo mongo = new Mongo( "localhost" , 27017 );
DB db = mongo.getDB("rrd4j");
DBCollection collection = db.getCollection( "test" );
BasicDBObject basicDbObject = new BasicDBObject("time",1);
RrdMongoDBBackendFactory factory = new RrdMongoDBBackendFactory(collection);
//创建rrd
RrdDef rrdDef = new RrdDef(rrdFile,1341991058L,100000L);
rrdDef.addArchive(ConsolFun.AVERAGE,0.5,1,300);
rrdDef.addArchive(ConsolFun.AVERAGE,0.5,12,300);
rrdDef.addArchive(ConsolFun.MIN,0.5,12,300);
rrdDef.addArchive(ConsolFun.MAX,0.5,12,300);
rrdDef.addDatasource(new DsDef("value", DsType.DERIVE, 100000, 0, 1));
RrdDb rrdDb = new RrdDb(rrdDef, factory);
然后便可使用这个rrdDb来绘图了,但是,在首次创建这个rrdDb时,只是将这个mongoDb里面的一个collection与rrdDb关联了,但是具体怎么插入数据
还需要手工的进行,否则rrdDb不知道如何利用这个collection插入数据,因此在首次使用这个rrdDb时需要手工向其中插入数据。
具体代码如下:
DBCursor cursor = collection.find().sort(basicDbObject);
while(cursor.hasNext()){
DBObject object = cursor.next();
if(object.get("time")!=null){
Long time = (Long) object.get("time");
Double value = (Double) object.get("value");
Sample sample = rrdDb.createSample(time+1);
sample.setValue("value", value);
sample.update();
}
}
rrdDb.close();
这样就可以将mongo的数据按照需求插入rrdDb中。注意:rrdDb.close()是必须的,否则里面还是没有数据。下面的代码就是绘图了:
RrdGraphDef gDef = new RrdGraphDef();
gDef.setFilename(pngFile);
gDef.setWidth(450);
gDef.setHeight(250);
gDef.setImageFormat("png");
gDef.setTimeSpan(1341991058L, 1351991058L );
gDef.setTitle("Test RRD4J and MongoDB demo");
gDef.datasource("a", rrdFile, "value", ConsolFun.AVERAGE);
gDef.datasource("b", rrdFile, "value", ConsolFun.MIN);
gDef.datasource("c", rrdFile, "value", ConsolFun.MAX);
gDef.setStep(12*100000L);
gDef.area("a", Color.decode("0xb6e4"), "real");
gDef.line("b", Color.decode("0x22e9"), "min");
gDef.line("c", Color.decode("0xee22"), "max");
new RrdGraph(gDef);
终于绘出图来:
之所以是这样,是因为绘图的时候用了
gDef.setStep(12*100000L);
意思是按照上面的12个数据合并的Archieve来绘图,如果不加这句代码:
求平均值的时候粒度更细了。
接着上面的话题,我们的rrd的文件路径为:F:\test1.rrd。但是在F盘中却找不到这个文件,当然不是隐藏了,
这个文件到哪儿去了?
更奇怪的是当我将update这段代码注释掉,即将
DBCursor cursor = collection.find().sort(basicDbObject);
while(cursor.hasNext()){
DBObject object = cursor.next();
if(object.get("time")!=null){
Long time = (Long) object.get("time");
Double value = (Double) object.get("value");
Sample sample = rrdDb.createSample(time+1);
sample.setValue("value", value);
sample.update();
}
}
rrdDb.close();
这段代码注释掉,再次运行整个绘图程序的时候,仍然绘出有数据的图片。仍然是利用这个rrd文件来绘图的,不可能是用其他的文件绘图的,
但是这个文件存到哪儿呢?
(注:rrdDb.close()也要注释掉否则声称没有数据的图片)。因此我怀疑这个文件是存在mongoDb中。
到mongoDB的客户端中测试,发现运行绘图程序前collection里面的数据时1001条,运行之后是1002条,这多一条数据很
可能就是rrd文件。果然:
