首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rrd4j无法接收来自MongoDB的样本

Rrd4j无法接收来自MongoDB的样本
EN

Stack Overflow用户
提问于 2017-03-03 10:41:15
回答 1查看 78关注 0票数 0

我已经将rrd4j (3.1)与mongodb (3.2)集成了。但是,在关闭RrdDb然后重新初始化对象之后,示例数据似乎并不是持久的。我看到在调用rrdDb.close()时,mongo中的二进制数据正在更新。打开时,从mongodb查询数据,二进制数据被更新为字节缓冲区。但在重新连接后转储数据时,所有的样本数据都由NaN替换。有人能帮我一下吗?

在关闭之前和重新连接之后,添加用于RrdDb intialising、Mongo创建和转储输出的代码。

RrdDb不等式

代码语言:javascript
复制
RrdDef rrdDef = new RrdDef(rrdPath,(System.currentTimeMillis() - TimeUnit.DAYS.toMillis(300))/1000,10);
rrdDef.addDatasource(dsName, DsType.GAUGE ,  20, 1d, Double.MAX_VALUE);

int secondUnitStep = (int)(TimeUnit.MINUTES.toSeconds(1)/10);
int secondUnitRows = (int)(TimeUnit.HOURS.toSeconds(1)/TimeUnit.MINUTES.toSeconds(1));

rrdDef.addArchive(ConsolFun.TOTAL, 0.5, 6, 60); 

RrdDb rrdDB = new RrdDb(rrdDef,rrdMongoFactory);

Rrd蒙戈工厂级

代码语言:javascript
复制
package mx.july.jmx.proximity.util;

public class RrdMongoFactory extends RrdBackendFactory {

    private String name;
    private final DBCollection rrdCollection;

    public RrdMongoFactory(String name, DBCollection rrdCollection) {
        this.name = name;
        this.rrdCollection = rrdCollection;
        this.rrdCollection.createIndex(new BasicDBObject("path", 1), "path_idx");
        RrdBackendFactory.registerAndSetAsDefaultFactory(this);
    }

   public void setName(String name) {
       this.name = name;
   }


    public String getName() {
        return name;
    }

    /** {@inheritDoc} */
    @Override
    protected RrdBackend open(String path, boolean readOnly) throws IOException {
        return new RrdMongoDBBackend(path, rrdCollection);
    }



    /** {@inheritDoc} */
    @Override
    protected boolean exists(String path) throws IOException {
        BasicDBObject query = new BasicDBObject();
        query.put("path", path);
        return rrdCollection.findOne(query) != null;
    }

    /** {@inheritDoc} */
    @Override
    protected boolean shouldValidateHeader(String path) throws IOException {
        return false;
    }




}

关闭RrdDb转储之前关闭

代码语言:javascript
复制
== HEADER ==
signature:RRD4J, version 0.2 lastUpdateTime:1488536144 step:10 dsCount:1 arcCount:3
== DATASOURCE ==
DS:320:GAUGE:20:1.0:1.7976931348623157E308
lastValue:8.0 nanSeconds:0 accumValue:32.0
== ARCHIVE ==
RRA:TOTAL:0.5:6:60
interval [1488532560, 1488536100]
accumValue:117.0 nanSteps:0
Robin 5/60: NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN +1.7860000000E02 NaN +1.7130000000E02 +1.6600000000E02 

RrdDb转储后重新连接

代码语言:javascript
复制
== HEADER ==
signature:RRD4J, version 0.2 lastUpdateTime:1462616268 step:10 dsCount:1 arcCount:3
== DATASOURCE ==
DS:320:GAUGE:20:1.0:1.7976931348623157E308
lastValue:NaN nanSeconds:8 accumValue:0.0
== ARCHIVE ==
RRA:TOTAL:0.5:6:60
interval [1462612680, 1462616220]
accumValue:NaN nanSteps:4
Robin 0/60: NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-13 11:40:07

从另一个小组那里得到了解决方案。我也想把这个贴在这里。

因此,对于每次运行,您都需要在satrt打开rrdDb连接,并在运行结束时关闭它。

当第一次创建RrdDb对象时,您需要定义RrdDef和后端工厂(前面发布的相同的代码片段)。在运行结束时,当收集数据时,需要关闭RrdDb连接(rrdDb.close())。只有这样,数据才会被写入后端(在本例中是mongo )。在下一次打开时,不是定义rrdDef,而是将rrdPath作为属性传递给rrdDb对象,下面将提到相同的语法,使用该语法进行查询并检索相应的信息。

代码语言:javascript
复制
rrdDB = new RrdDb(rrdPath, rrdMongoShardFactory);

请注意,如果在mongo中没有路径条目,那么上面的命令将抛出一个未找到异常的文件。下面给出的示例片段

代码语言:javascript
复制
 public RRDInfo openRrdDB() throws IOException {
    try{
        rrdDB = new RrdDb(rrdPath, rrdMongoShardFactory);
    }catch(FileNotFoundException e) {
        rrdDef = new RrdDef(rrdPath,(System.currentTimeMillis() - TimeUnit.DAYS.toMillis(300))/1000,Configurator.RRD_STEP_INTERVAL);
        rrdDef.addDatasource(dsName, DsType.GAUGE ,  Configurator.RRD_STEP_INTERVAL*2, 1d, Double.MAX_VALUE);

        int secondUnitStep = (int)(TimeUnit.MINUTES.toSeconds(1)/Configurator.RRD_STEP_INTERVAL);
        int secondUnitRows = (int)(TimeUnit.HOURS.toSeconds(1)/TimeUnit.MINUTES.toSeconds(1));

        int hourUnitStep = (int)(TimeUnit.HOURS.toSeconds(1)/Configurator.RRD_STEP_INTERVAL);
        int hourUnitRows = (int)(TimeUnit.DAYS.toSeconds(2)/TimeUnit.HOURS.toSeconds(1));

        int dayUnitStep = (int)(TimeUnit.DAYS.toSeconds(1)/Configurator.RRD_STEP_INTERVAL);
        int dayUnitRows = (int)(TimeUnit.DAYS.toSeconds(365)/TimeUnit.DAYS.toSeconds(1));

        rrdDef.addArchive(ConsolFun.TOTAL, 0.5, secondUnitStep, secondUnitRows); 
        rrdDef.addArchive(ConsolFun.TOTAL, 0.5, hourUnitStep, hourUnitRows); 
        rrdDef.addArchive(ConsolFun.TOTAL, 0.5, dayUnitStep, dayUnitRows);
        rrdDB = new RrdDb(rrdDef,rrdMongoShardFactory);
    }
    return this;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42576700

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档