我已经将rrd4j(3.1)与mongodb(3.2)集成在一起。但是在关闭RrdDb然后重新初始化对象之后,示例数据似乎并不持久。我看到当调用rrdDb.close()时,mongo db中的二进制数据会更新。在打开时,正在从mongodb查询数据,二进制数据将更新到字节缓冲区。但是在重新连接后转储数据时,所有样本数据都被NaN替换。有人可以帮我解决这个问题。
在关闭之前和重新连接之后,为RrdDb初始化,Mongo Ractory创建和转储输出添加代码。
RrdDb初始化
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 Mongo Factory类
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转储
== 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转储
== 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
答案 0 :(得分:0)
从另一组获得解决方案。想在这里发布这个。
所以基本上每次运行都需要在satrt打开rrdDb连接,并在运行结束时关闭它。
第一次创建RrdDb对象时,需要定义RrdDef和后端工厂。(前面发布的代码片段)。在收集数据的运行结束时,您需要关闭RrdDb连接(rrdDb.close())。只有这样才能将数据写入后端(在本例中为mongo db)。在下一个打开而不是定义rrdDef只是将rrdPath作为属性传递给rrdDb对象时,下面将提到相同的语法,使用mongo进行查询并检索相应的信息。
rrdDB = new RrdDb(rrdPath, rrdMongoShardFactory);
请注意,如果mongo中的路径没有条目,那么上面的命令将抛出一个未找到文件的异常。下面给出的示例代码段
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;
}