/** * 获取与name相对应的统计数据 * * @param application * @param name * @param startTime 开始时间(毫秒) * @param endTime 结束时间(毫秒) * @param step 取样间隔(秒) */ public static List<Data<Long, Double>> getDataList( String application, String name, long startTime, long endTime, long step) { File rrdFile = getStorageRrdFile(application, name); if (!rrdFile.exists()) { return Collections.emptyList(); } try { String dsName = name; if (dsName.length() > 20) { // 貌似是melody中的机制 dsName = dsName.substring(0, 20); } DataProcessor processor = new DataProcessor(startTime / 1000, endTime / 1000); processor.addDatasource("average", rrdFile.getAbsolutePath(), dsName, "AVERAGE"); processor.setStep(step); // poolUsed设为true,会使用read_write模式, // 只有这样,打开rrd文件和调用fileChannel.map方法时的读写模式才会前后一致 processor.setPoolUsed(true); processor.processData(); double[] values = processor.getValues("average"); long[] timestamps = processor.getTimestamps(); assert values.length == timestamps.length; List<Data<Long, Double>> dataList = Lists.newArrayList(); for (int i = 0, l = timestamps.length; i < l; i++) { dataList.add( new Data<Long, Double>() .key(timestamps[i] * 1000) .value(Double.isNaN(values[i]) ? 0D : values[i])); } return dataList; } catch (Exception e) { e.printStackTrace(); return Collections.emptyList(); } }