rrd4j与mongoDB的整合

来源:互联网 发布:外文检索数据库 编辑:程序博客网 时间:2024/05/23 12:24

   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文件。果然: