コード例 #1
0
  /**
   * 获取与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();
    }
  }