📄 fetchdata.java
字号:
for(int i = 0; i < getRowCount(); i++) {
System.out.println(getRow(i).dump());
}
}
/**
* Returns string representing fetched data in a RRDTool-like form.
* @return Fetched data as a string in a rrdfetch-like output form.
*/
public String toString() {
final DecimalFormat df = new DecimalFormat("+0.0000000000E00");
// print header row
StringBuffer buff = new StringBuffer();
buff.append(padWithBlanks("", 10));
buff.append(" ");
for(int i = 0; i < dsNames.length; i++) {
buff.append(padWithBlanks(dsNames[i], 18));
}
buff.append("\n \n");
for(int i = 0; i < timestamps.length; i++) {
buff.append(padWithBlanks("" + timestamps[i], 10));
buff.append(":");
for(int j = 0; j < dsNames.length; j++) {
double value = values[j][i];
String valueStr = Double.isNaN(value)? "nan": df.format(value);
buff.append(padWithBlanks(valueStr, 18));
}
buff.append("\n");
}
return buff.toString();
}
private static String padWithBlanks(String input, int width) {
StringBuffer buff = new StringBuffer("");
int diff = width - input.length();
while(diff-- > 0) {
buff.append(' ');
}
buff.append(input);
return buff.toString();
}
/**
* Returns aggregated value from the fetched data for a single datasource.
* @param dsName Datasource name
* @param consolFun Consolidation function to be applied to fetched datasource values.
* Valid consolidation functions are MIN, MAX, LAST and AVERAGE
* @return MIN, MAX, LAST or AVERAGE value calculated from the fetched data
* for the given datasource name
* @throws RrdException Thrown if the given datasource name cannot be found in fetched data.
*/
public double getAggregate(String dsName, String consolFun) throws RrdException {
return getAggregate(dsName, consolFun, null);
}
/**
* Returns aggregated value from the fetched data for a single datasource.
* Before applying aggrregation functions, specified RPN expression is applied to fetched
* data. For example, if you have a gauge datasource named 'foots' but you wont to
* find the maximum fetched value in meters use something like:</p>
* <code>getAggregate("foots", "MAX", "value,0.3048,*");</code>
* Note that 'value' in the RPN expression is a reserved word and stands for the
* original value (value fetched from RRD)</p>
* @param dsName Datasource name
* @param consolFun Consolidation function to be applied to fetched datasource values.
* Valid consolidation functions are MIN, MAX, LAST and AVERAGE
* @return MIN, MAX, LAST or AVERAGE value calculated from the fetched data
* for the given datasource name
* @throws RrdException Thrown if the given datasource name cannot be found in fetched data.
*/
public double getAggregate(String dsName, String consolFun, String rpnExpression)
throws RrdException {
if(consolFun.equals("MAX")) {
return getMax(dsName, rpnExpression);
}
else if(consolFun.equals("MIN")) {
return getMin(dsName, rpnExpression);
}
else if(consolFun.equals("LAST")) {
return getLast(dsName, rpnExpression);
}
else if(consolFun.equals("AVERAGE")) {
return getAverage(dsName, rpnExpression);
}
else {
throw new RrdException("Unsupported consolidation function [" + consolFun + "]");
}
}
private double getMax(String dsName, String rpnExpression) throws RrdException {
RpnCalculator rpnCalculator = null;
if(rpnExpression != null) {
rpnCalculator = new RpnCalculator(rpnExpression);
}
double vals[] = getValues(dsName), max = Double.NaN;
for(int i = 0; i < vals.length - 1; i++) {
double value = vals[i + 1];
if(rpnCalculator != null) {
rpnCalculator.setValue(value);
value = rpnCalculator.calculate();
}
max = Util.max(max, value);
}
return max;
}
private double getMin(String dsName, String rpnExpression) throws RrdException {
RpnCalculator rpnCalculator = null;
if(rpnExpression != null) {
rpnCalculator = new RpnCalculator(rpnExpression);
}
double vals[] = getValues(dsName), min = Double.NaN;
for(int i = 0; i < vals.length - 1; i++) {
double value = vals[i + 1];
if(rpnCalculator != null) {
rpnCalculator.setValue(value);
value = rpnCalculator.calculate();
}
min = Util.min(min, value);
}
return min;
}
private double getLast(String dsName, String rpnExpression) throws RrdException {
RpnCalculator rpnCalculator = null;
if(rpnExpression != null) {
rpnCalculator = new RpnCalculator(rpnExpression);
}
double vals[] = getValues(dsName);
double value = vals[vals.length - 1];
if(rpnCalculator != null) {
rpnCalculator.setValue(value);
value = rpnCalculator.calculate();
}
return value;
}
private double getAverage(String dsName, String rpnExpression) throws RrdException {
RpnCalculator rpnCalculator = null;
if(rpnExpression != null) {
rpnCalculator = new RpnCalculator(rpnExpression);
}
double vals[] = getValues(dsName);
double totalVal = 0;
long totalSecs = 0;
for(int i = 0; i < vals.length - 1; i++) {
long t1 = Math.max(request.getFetchStart(), timestamps[i]);
long t2 = Math.min(request.getFetchEnd(), timestamps[i + 1]);
double value = vals[i + 1];
if(rpnCalculator != null) {
rpnCalculator.setValue(value);
value = rpnCalculator.calculate();
}
if(!Double.isNaN(value)) {
totalSecs += (t2 - t1);
totalVal += (t2 - t1) * value;
}
}
return totalSecs > 0? totalVal / totalSecs: Double.NaN;
}
/**
* Dumps fetch data to output stream in XML format.
* @param outputStream Output stream to dump fetch data to
* @throws IOException Thrown in case of I/O error
*/
public void exportXml(OutputStream outputStream) throws IOException {
XmlWriter writer = new XmlWriter(outputStream);
writer.startTag("fetch_data");
writer.startTag("request");
writer.writeTag("file", request.getParentDb().getPath());
writer.writeComment(Util.getDate(request.getFetchStart()));
writer.writeTag("start", request.getFetchStart());
writer.writeComment(Util.getDate(request.getFetchEnd()));
writer.writeTag("end", request.getFetchEnd());
writer.writeTag("resolution", request.getResolution());
writer.writeTag("cf", request.getConsolFun());
writer.closeTag(); // request
writer.startTag("datasources");
for(int i = 0; i < dsNames.length; i++) {
writer.writeTag("name", dsNames[i]);
}
writer.closeTag(); // datasources
writer.startTag("data");
for(int i = 0; i < timestamps.length; i++) {
writer.startTag("row");
writer.writeComment(Util.getDate(timestamps[i]));
writer.writeTag("timestamp", timestamps[i]);
writer.startTag("values");
for(int j = 0; j < dsNames.length; j++) {
writer.writeTag("v", values[j][i]);
}
writer.closeTag(); // values
writer.closeTag(); // row
}
writer.closeTag(); // data
writer.closeTag(); // fetch_data
writer.flush();
}
/**
* Dumps fetch data to file in XML format.
* @param filepath Path to destination file
* @throws IOException Thrown in case of I/O error
*/
public void exportXml(String filepath) throws IOException {
OutputStream outputStream = null;
try {
outputStream = new FileOutputStream(filepath);
exportXml(outputStream);
}
finally {
if(outputStream != null) {
outputStream.close();
}
}
}
/**
* Dumps fetch data in XML format.
* @return String containing XML formatted fetch data
* @throws IOException Thrown in case of I/O error
*/
public String exportXml() throws IOException {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
exportXml(outputStream);
return outputStream.toString();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -