Virtual Datapoints
Last updated - 20 February, 2026
Virtual datapoints extend the visualization capabilities of graphs by enabling you to perform calculations that combine multiple existing datapoints. They help you derive additional insights, such as aggregations or comparisons, without modifying the underlying datapoints. When defined in a DataSource graph, they affect only the module’s graph configuration. When defined in a Custom Graph widget, they are completely independent of the DataSource.
Virtual datapoints are configured directly within a graph and can only reference datapoints that have already been added to that graph’s Datapoints area. You can add virtual datapoints to the following:
- Custom Graph widgets—Enable you to view patterns in historical data at an intersection of datasource instances and a particular datapoint. For more information regarding the requirements and how to configure a virtual datapoint within the Custom Graph widget, see Custom Graph Widget Creation.
- DataSource Graphs—You can visualize the values of various datapoints monitored by a DataSource. For more information, see DataSource Graphs.
Note: Because virtual datapoints are graph-specific calculations, they do not retain historical data and cannot be used for alerting. If you require calculated datapoints that support history tracking or alerts, those calculations must be created as complex datapoints within the DataSource definition. After being defined at the DataSource level, complex datapoints are reusable and available for inclusion in graphs through the Datapoints configuration. For more information on creating complex datapoints, see Complex Datapoints.
Percentile Functions for Virtual Datapoints
Percentile functions are special functions that can be used only in virtual datapoint definitions (within graphs and widgets)—not in complex datapoint expressions.
The following table lists the percentile functions that can be used in virtual datapoint expressions, including their syntax, behavior, and examples:
| Category | Description Syntax | Example |
percent(x,y) | Returns the y percentile value of datapoint x using aggregated data for the displayed time range. The first argument must be a datapoint name, not an expression. | Given hourly values [2,3,7,6,1,3,4,10,2,4], percent(bps,95) returns 10, meaning 95% of samples are below 10 bps. |
| Commonly used to calculate 95th-percentile traffic rates for billing or capacity analysis. Can be combined with conditional logic to select the higher of two percentile values. | 95In = percent(InMaxBits,95)95Percentile = if(gt(95In,95Out),95In,95Out)Note: Calculations must be performed in a separate virtual datapoint if needed (For example, you cannot use percent(InOctets*8,95) as the syntax). x must be a datapoint rather than a mathematical expression. You can create an initial virtual datapoint (for example, InBits) that performs the mathematical conversion from octets to bits. Then, the datapoint can be referenced by the percentile function, such as percent(InBits,95), to calculate the 95th-percentile value over the selected time range. | |
rawpercentile(x,y) | Returns the y percentile value of datapoint x using raw (unaggregated) datapoint samples for the displayed time range. | rawpercentile(bps,95) |
| Useful when exact sample-level percentile calculations are required instead of aggregated rollups. | rawpercentile(InMaxBits,95) |