rrd4j与mongoDB的整合

本文介绍了如何将rrd4j (2.1.1) 集成到mongoDB,通过RrdMongoDBBackend和RrdMongoDBBackendFactory实现数据存储。在使用时,需要手动插入初始数据,因为绘图操作依赖平均值计算,要求更精细的粒度。虽然rrd文件路径指定为F: est1.rrd,但实际上文件并未在F盘找到。当update代码被注释,程序仍能绘制出有数据的图表,推测rrd文件已存储在mongoDB中。通过客户端验证,运行前后数据条数变化证实了这一猜测。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值