java.lang.Object
org.rrd4j.data.DataProcessor
- All Implemented Interfaces:
DataHolder
Class which should be used for all calculations based on the data fetched from RRD files. This class supports ordinary DEF datasources (defined in RRD files), CDEF datasources (RPN expressions evaluation), SDEF (static datasources - extension of Rrd4j) and PDEF (plottables, see
Plottable for more information.Typical class usage:
final long t1 = ...
final long t2 = ...
DataProcessor dp = new DataProcessor(t1, t2);
// DEF datasource
dp.addDatasource("x", "demo.rrd", "some_source", "AVERAGE");
// DEF datasource
dp.addDatasource("y", "demo.rrd", "some_other_source", "AVERAGE");
// CDEF datasource, z = (x + y) / 2
dp.addDatasource("z", "x,y,+,2,/");
// ACTION!
dp.processData();
// Dump calculated values
System.out.println(dp.dump());
Field Summary
Modifier and TypeFieldDescriptionstatic final doubleConstantDEFAULT_PERCENTILE=95.0private Def[]Sources defined by a DEF graph definition rather than read from a file.private longResolution of the fetch from each RRD file, in seconds.private longLast rrd archive update timeprivate intPixel countprivate RrdDbPoolThe pool databases are opened through.private booleanWhether the shared database pool is used.Sources by name, in insertion order - a plain HashMap would lose that order.private longTime step in seconds between data points; adjusted during processing to match the archives actually read.private longLast time of the data being processed.private long[]Array of timestamps for the data seriesprivate longFirst time of the data being processed.private TimeZoneTimezone dates are interpreted in.Fields inherited from interface DataHolder
DEFAULT_POOL_USAGE_POLICYModifier and TypeFieldDescriptionstatic final booleanConstant that defines the defaultRrdDbPoolusage policy.Constructor Summary
ConstructorsConstructorDescriptionDataProcessor(long t1, long t2) Creates new DataProcessor object for the given time span.DataProcessor(java.time.temporal.TemporalAmount d) Creates new DataProcessor object for the given time duration.DataProcessor(Calendar gc1, Calendar gc2) Creates new DataProcessor object for the given time span.DataProcessor(Date d1, Date d2) Creates new DataProcessor object for the given time span.Method Summary
Modifier and TypeMethodDescriptionprivate voidAssign timestamps to sourcesprivate voidCalculate non rrd sourcesprivate voidChoose optimal step.private voidCreate timestampsvoiddatasource(String name, String rpnExpression) Adds complex source (CDEF).voiddatasource(String name, String file, String dsName, ConsolFun consolFunc) Adds simple datasource (DEF).voiddatasource(String name, String file, String dsName, ConsolFun consolFunc, RrdBackendFactory backend) Adds simple source (DEF).voiddatasource(String name, String dsName, FetchData fetchData) Adds DEF datasource with datasource values already available in the FetchData object.voiddatasource(String name, String defName, Variable var) Creates a datasource that performs a variable calculation on an another named datasource to yield a single combined timestamp/value.voiddatasource(String name, URI rrdUri, String dsName, ConsolFun consolFunc) Adds simple datasource (DEF).voiddatasource(String name, URI uri, String dsName, ConsolFun consolFunc, RrdBackendFactory backend) Adds simple source (DEF).voiddatasource(String name, FetchData fetchData) Adds DEF datasource with datasource values already available in the FetchData object.voiddatasource(String name, IPlottable plottable) Adds a custom,plottabledatasource (PDEF).dump()Dumps timestamps and values of all datasources in a tabular form.private voidReads each DEF source's values from the RRD file it names.private voidFetch rrd dataprivate voidFix zero ending timestampprivate static StringRight-pad a string with spaces to the requested length.longEnding timestamp.longReturns desired RRD archive step (resolution) in seconds to be used while fetching data from RRD files.longReturns time when last RRD archive was updated (all RRD files are considered).intReturns the number of pixels (target graph width).getPool()Return the RRD database pool, null when none is configured.(package private) SourceDatasource name @return the matching Source.String[]Returns array of datasource names defined in this DataProcessor.longStart of the data time range.longgetStep()Returns the time step used for data processing.long[]/** Returns consolidated timestamps created with theprocessData()method.long[]Calculates timestamps which correspond to individual pixels on the graph based on the graph width set with asetPixelCount(int)method call.long[]getTimestampsPerPixel(int pixelCount) Calculates timestamps which correspond to individual pixels on the graph.Return the time zone timestamps are interpreted in.double[][]Returns an array of all datasource values for all datasources.double[]Returns calculated values for a single datasource.double[]getValuesPerPixel(String sourceName) Method used to calculate datasource values which should be presented on the graph based on the graph width set with asetPixelCount(int)method call.double[]getValuesPerPixel(String sourceName, int pixelCount) Method used to calculate datasource values which should be presented on the graph based on the desired graph width.getVariable(String sourceName) Extract the variable value from an already define Variable datasource (a VDEF)getVariable(String sourceName, Variable var) Returns single aggregated value for a single datasource.booleanReturns boolean value representingRrdDbPoolusage policy.private voidNormalize rrd valuesvoidMethod that should be called once all datasources are defined.voidsetEndTime(long time) Ending timestamp.voidsetFetchRequestResolution(long fetchRequestResolution) Sets desired RRD archive step in seconds to be used internally while fetching data from RRD files.voidsetPixelCount(int pixelCount) Sets the number of pixels (target graph width).voidDefines theRrdDbPoolto use.voidsetPoolUsed(boolean poolUsed) Sets theRrdDbPoolusage policy.voidsetStartTime(long time) Starting timestamp.voidsetStep(long step) Once data are fetched, the step value will be used to generate values.voidsetTimeSpan(long startTime, long endTime) Set the time range to process.voidsetTimeZone(TimeZone tz) Set the time zone timestamps are interpreted in.
Field Details
DEFAULT_PERCENTILE
public static final double DEFAULT_PERCENTILEConstantDEFAULT_PERCENTILE=95.0- See Also:
pixelCount
private int pixelCountPixel countpoolUsed
private boolean poolUsedWhether the shared database pool is used.pool
The pool databases are opened through.tStart
private long tStartFirst time of the data being processed.tEnd
private long tEndLast time of the data being processed.timestamps
private long[] timestampsArray of timestamps for the data serieslastRrdArchiveUpdateTime
private long lastRrdArchiveUpdateTimeLast rrd archive update timestep
private long stepTime step in seconds between data points; adjusted during processing to match the archives actually read.fetchRequestResolution
private long fetchRequestResolutionResolution of the fetch from each RRD file, in seconds.tz
Timezone dates are interpreted in.sources
defSources
Sources defined by a DEF graph definition rather than read from a file.
Constructor Details
DataProcessor
public DataProcessor(long t1, long t2) Creates new DataProcessor object for the given time span. Ending timestamp may be set to zero. In that case, the class will try to find the optimal ending timestamp based on the last update time of RRD files processed with theprocessData()method.- Parameters:
t1- Starting timestamp in seconds without millisecondst2- Ending timestamp in seconds without milliseconds
DataProcessor
Creates new DataProcessor object for the given time span. Ending date may be set to null. In that case, the class will try to find optimal ending date based on the last update time of RRD files processed with theprocessData()method.- Parameters:
d1- start of the range, in seconds since the epochd2- end of the range, in seconds since the epoch; null leaves the end to be chosen from the last update time of the processed files
DataProcessor
Creates new DataProcessor object for the given time span. Ending date may be set to null. In that case, the class will try to find optimal ending date based on the last update time of RRD files processed with theprocessData()method.It use the time zone for starting calendar date.
- Parameters:
gc1- Starting Calendar dategc2- Ending Calendar date
DataProcessor
public DataProcessor(java.time.temporal.TemporalAmount d) Creates new DataProcessor object for the given time duration. The given duration will be subtracted from current time.- Parameters:
d- duration to subtract.
Method Details
isPoolUsed
public boolean isPoolUsed()Returns boolean value representingRrdDbPoolusage policy.- Specified by:
isPoolUsedin interfaceDataHolder- Returns:
- true, if the pool will be used internally to fetch data from RRD files, false otherwise.
setPoolUsed
public void setPoolUsed(boolean poolUsed) Sets theRrdDbPoolusage policy.- Specified by:
setPoolUsedin interfaceDataHolder- Parameters:
poolUsed- true, if the pool should be used to fetch data from RRD files, false otherwise.
getPool
Return the RRD database pool, null when none is configured.- Specified by:
getPoolin interfaceDataHolder- Returns:
- the current pool, or null
setPool
Defines theRrdDbPoolto use. If not defined, but {setPoolUsed(boolean)set to true, the defaultRrdDbPool.getInstance()will be used.- Specified by:
setPoolin interfaceDataHolder- Parameters:
pool- an optional pool to use.
setPixelCount
public void setPixelCount(int pixelCount) Sets the number of pixels (target graph width). This number is used only to calculate pixel coordinates for Rrd4j graphs (methodsgetValuesPerPixel(String)andgetTimestampsPerPixel()), but has influence neither on datasource values calculated with theprocessData()method nor on aggregated values returned fromgetAggregates(String)and similar methods. In other words, aggregated values will not change once you decide to change the dimension of your graph.- Parameters:
pixelCount- The number of pixels. If you process RRD data in order to display it on the graph, this should be the width of your graph.
getPixelCount
public int getPixelCount()Returns the number of pixels (target graph width). SeesetPixelCount(int)for more information.- Returns:
- Target graph width
setStep
public void setStep(long step) Once data are fetched, the step value will be used to generate values. If not defined, or set to 0, a optimal step will be calculated.- Specified by:
setStepin interfaceDataHolder- Parameters:
step- Default to 0.
getStep
public long getStep()Returns the time step used for data processing. Initially, this method returns zero. OnceprocessData()is finished, the method will return the time stamp interval.- Specified by:
getStepin interfaceDataHolder- Returns:
- Step used for data processing.
getFetchRequestResolution
public long getFetchRequestResolution()Returns desired RRD archive step (resolution) in seconds to be used while fetching data from RRD files. In other words, this value will used as the last parameter ofRrdDb.createFetchRequest()method when this method is called internally by this DataProcessor.- Returns:
- Desired archive step (fetch resolution) in seconds.
setFetchRequestResolution
public void setFetchRequestResolution(long fetchRequestResolution) Sets desired RRD archive step in seconds to be used internally while fetching data from RRD files. In other words, this value will used as the last parameter ofRrdDb.createFetchRequest()method when this method is called internally by this DataProcessor. If this method is never called, fetch request resolution defaults to 1 (smallest possible archive step will be chosen automatically).- Parameters:
fetchRequestResolution- Desired archive step (fetch resolution) in seconds.
getTimeZone
Return the time zone timestamps are interpreted in.- Specified by:
getTimeZonein interfaceDataHolder- Returns:
- the time zone
setTimeZone
Set the time zone timestamps are interpreted in.- Specified by:
setTimeZonein interfaceDataHolder- Parameters:
tz- the time zone to set
getTimestamps
public long[] getTimestamps()/** Returns consolidated timestamps created with theprocessData()method.- Returns:
- array of timestamps in seconds
getValues
Returns calculated values for a single datasource. Corresponding timestamps can be obtained from thegetTimestamps()method.- Parameters:
sourceName- Datasource name- Returns:
- an array of datasource values
- Throws:
IllegalArgumentException- Thrown if invalid datasource name is specified, or if datasource values are not yet calculated (methodprocessData()was not called)
getVariable
Extract the variable value from an already define Variable datasource (a VDEF)- Parameters:
sourceName- Datasource name- Returns:
- A combined time and value extracted calculated from the datasource
getVariable
Returns single aggregated value for a single datasource.- Parameters:
sourceName- Datasource namevar- variable that will generate value- Returns:
- A combined time and value extracted calculated from the datasource
getSourceNames
Returns array of datasource names defined in this DataProcessor.- Returns:
- array of datasource names
getValues
public double[][] getValues()Returns an array of all datasource values for all datasources. Each row in this two-dimensional array represents an array of calculated values for a single datasource. The order of rows is the same as the order in which datasources were added to this DataProcessor object.- Returns:
- All datasource values for all datasources. The first index is the index of the datasource, the second index is the index of the datasource value. The number of datasource values is equal to the number of timestamps returned with
getTimestamps()method. - Throws:
IllegalArgumentException- Thrown if invalid datasource name is specified, or if datasource values are not yet calculated (methodprocessData()was not called)
getSource
datasource
Adds a custom,plottabledatasource (PDEF). The datapoints should be made available by a class extendingPlottableclass.- Specified by:
datasourcein interfaceDataHolder- Parameters:
name- source name.plottable- class that extends Plottable class and is suited for graphing.
datasource
Adds complex source (CDEF). Complex sources are evaluated using the suppliedRPNexpression. Complex sourcenamecan be used:- To specify sources for line, area and stack plots.
- To define other complex sources.
Rrd4j does not force you to specify at least one simple source name as RRDTool.
For more details on RPN see RRDTool's rrdgraph man page.
- Specified by:
datasourcein interfaceDataHolder- Parameters:
name- source name.rpnExpression- RPN expression containing comma delimited simple and complex source names, RPN constants, functions and operators.
datasource
Creates a datasource that performs a variable calculation on an another named datasource to yield a single combined timestamp/value.Requires that the other datasource has already been defined; otherwise, it'll end up with no data
- Specified by:
datasourcein interfaceDataHolder- Parameters:
name- - the new virtual datasource namedefName- - the datasource from which to extract the percentile. Must be a previously defined virtual datasourcevar- - a new instance of a Variable used to do the calculation
datasource
Adds simple datasource (DEF). Simple sourcenamecan be used:- To specify sources for line, area and stack plots.
- To define complex sources
- Specified by:
datasourcein interfaceDataHolder- Parameters:
name- source name.file- Path to RRD file.dsName- Datasource name defined in the RRD file.consolFunc- Consolidation function that will be used to extract data from the RRD
datasource
Adds simple datasource (DEF). Simple sourcenamecan be used:- To specify sources for line, area and stack plots.
- To define complex sources
- Specified by:
datasourcein interfaceDataHolder- Parameters:
name- source name.rrdUri- URI to RRD file.dsName- Datasource name defined in the RRD file.consolFunc- Consolidation function that will be used to extract data from the RRD
datasource
public void datasource(String name, String file, String dsName, ConsolFun consolFunc, RrdBackendFactory backend) Adds simple source (DEF). Sourcenamecan be used:- To specify sources for line, area and stack plots.
- To define complex sources
- Specified by:
datasourcein interfaceDataHolder- Parameters:
name- Source name.file- Path to RRD file.dsName- Data source name defined in the RRD file.consolFunc- Consolidation function that will be used to extract data from the RRD file ("AVERAGE", "MIN", "MAX" or "LAST" - these string constants are conveniently defined in theConsolFunclass).backend- Name of the RrdBackendFactory that should be used for this RrdDb.
datasource
public void datasource(String name, URI uri, String dsName, ConsolFun consolFunc, RrdBackendFactory backend) Adds simple source (DEF). Sourcenamecan be used:- To specify sources for line, area and stack plots.
- To define complex sources
- Specified by:
datasourcein interfaceDataHolder- Parameters:
name- Source name.uri- URI to RRD file.dsName- Data source name defined in the RRD file.consolFunc- Consolidation function that will be used to extract data from the RRD file ("AVERAGE", "MIN", "MAX" or "LAST" - these string constants are conveniently defined in theConsolFunclass).backend- Name of the RrdBackendFactory that should be used for this RrdDb.
datasource
Adds DEF datasource with datasource values already available in the FetchData object. This method is used internally by Rrd4j and probably has no purpose outside of it.- Specified by:
datasourcein interfaceDataHolder- Parameters:
name- Source name.fetchData- Fetched data containing values for the given source name.
datasource
Adds DEF datasource with datasource values already available in the FetchData object. This method is used internally by Rrd4j and probably has no purpose outside of it. The values will be extracted from dsName in fetchData.- Specified by:
datasourcein interfaceDataHolder- Parameters:
name- Source name.dsName- Source name in the fetch data.fetchData- Fetched data containing values for the given source name.
processData
Method that should be called once all datasources are defined. Data will be fetched from RRD files, RPN expressions will be calculated, etc.- Throws:
IOException- Thrown in case of I/O error (while fetching data from RRD files)
getValuesPerPixel
Method used to calculate datasource values which should be presented on the graph based on the desired graph width. Each value returned represents a single pixel on the graph. Corresponding timestamp can be found in the array returned fromgetTimestampsPerPixel()method.- Parameters:
sourceName- Datasource namepixelCount- graph width in pixels, retained for later calls- Returns:
- Per-pixel datasource values
- Throws:
IllegalArgumentException- Thrown if datasource values are not yet calculated (methodprocessData()was not called)
getValuesPerPixel
Method used to calculate datasource values which should be presented on the graph based on the graph width set with asetPixelCount(int)method call. Each value returned represents a single pixel on the graph. Corresponding timestamp can be found in the array returned fromgetTimestampsPerPixel(int)method.- Parameters:
sourceName- Datasource name- Returns:
- Per-pixel datasource values
- Throws:
IllegalArgumentException- Thrown if datasource values are not yet calculated (methodprocessData()was not called)
getTimestampsPerPixel
public long[] getTimestampsPerPixel(int pixelCount) Calculates timestamps which correspond to individual pixels on the graph. It also set the timestampsPerPixel value.- Parameters:
pixelCount- graph width in pixels, retained for later calls- Returns:
- Array of timestamps
getTimestampsPerPixel
public long[] getTimestampsPerPixel()Calculates timestamps which correspond to individual pixels on the graph based on the graph width set with asetPixelCount(int)method call.- Returns:
- Array of timestamps
dump
Dumps timestamps and values of all datasources in a tabular form. Very useful for debugging.- Returns:
- Dumped object content.
getLastRrdArchiveUpdateTime
public long getLastRrdArchiveUpdateTime()Returns time when last RRD archive was updated (all RRD files are considered).- Returns:
- Last archive update time for all RRD files in this DataProcessor
extractDefs
private void extractDefs()Reads each DEF source's values from the RRD file it names.fetchRrdData
Fetch rrd data- Throws:
IOException- if an RRD file cannot be read while fetching its datapoints
fixZeroEndingTimestamp
private void fixZeroEndingTimestamp()Fix zero ending timestampchooseOptimalStep
private void chooseOptimalStep()Choose optimal step. Tricky and ugly. Should be redesigned some time in the future.createTimestamps
private void createTimestamps()Create timestampsassignTimestampsToSources
private void assignTimestampsToSources()Assign timestamps to sourcesnormalizeRrdValues
private void normalizeRrdValues()Normalize rrd valuescalculateNonRrdSources
private void calculateNonRrdSources()Calculate non rrd sourcesformat
setEndTime
public void setEndTime(long time) Ending timestamp.- Specified by:
setEndTimein interfaceDataHolder- Parameters:
time- end of the range, in seconds since the epoch
getEndTime
public long getEndTime()Ending timestamp.- Specified by:
getEndTimein interfaceDataHolder- Returns:
- end of the range, in seconds since the epoch
setStartTime
public void setStartTime(long time) Starting timestamp.- Specified by:
setStartTimein interfaceDataHolder- Parameters:
time- start of the range, in seconds since the epoch
getStartTime
public long getStartTime()Start of the data time range.- Specified by:
getStartTimein interfaceDataHolder- Returns:
- Starting timestamp in seconds
setTimeSpan
public void setTimeSpan(long startTime, long endTime) Set the time range to process.- Specified by:
setTimeSpanin interfaceDataHolder- Parameters:
startTime- Starting time in seconds since epochendTime- Ending time in seconds since epoch