Rrd4j 无法从 MongoDB 接收样本
Rrd4j not able to receive samples from MongoDB
我已经将 rrd4j (3.1) 与 mongodb (3.2) 集成。但是样本数据在关闭RrdDb然后重新初始化对象后似乎并没有持久化。当调用 rrdDb.close() 时,我看到二进制数据在 mongo 数据库中得到更新。在打开时,正在从 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 工厂 class
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
从另一个小组得到了解决方案。也想在这里发帖。
所以基本上对于每个 运行 你需要在 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;
}
我已经将 rrd4j (3.1) 与 mongodb (3.2) 集成。但是样本数据在关闭RrdDb然后重新初始化对象后似乎并没有持久化。当调用 rrdDb.close() 时,我看到二进制数据在 mongo 数据库中得到更新。在打开时,正在从 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 工厂 class
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
从另一个小组得到了解决方案。也想在这里发帖。
所以基本上对于每个 运行 你需要在 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;
}