series_rate_fl()
函数 series_rate_fl()
是一个用户定义的函数 (UDF),用于计算指标的每秒平均增加率。 其逻辑遵循 PromQL rate() 函数。 该函数应该用于由 Prometheus 监视系统引入到数据库并由 series_metric_fl() 检索的计数器指标的时序。
语法
T | invoke series_rate_fl(
[ n_bins [,
fix_reset ]])
T
是从 series_metric_fl() 返回的表。 其架构包括 (timestamp:dynamic, name:string, labels:string, value:dynamic)
。
详细了解语法约定。
参数
客户 | 类型 | 必需 | 说明 |
---|---|---|---|
n_bins | int |
箱的数量,用于指定为计算速率而提取的指标值之间的差距。 该函数计算当前样本与前一个 n_bins 之差,并将此差值除以二者各自时间戳(以秒为单位)之差。 默认值为一个 bin。 该默认设置计算 PromQL 瞬时速率函数 irate()。 | |
fix_reset | bool |
控制是否检查计数器重置以及是否像 PromQL rate() 函数一样对计数器进行更正。 默认为 true 。 请将此参数设置为 false ,以节省冗余分析,这样是为了应对无需检查重置的情况。 |
函数定义
可以通过将函数的代码嵌入为查询定义的函数,或将其创建为数据库中的存储函数来定义函数,如下所示:
使用以下 let 语句定义函数。 不需要任何权限。
let series_rate_fl=(tbl:(timestamp:dynamic, value:dynamic), n_bins:int=1, fix_reset:bool=true)
{
tbl
| where fix_reset // Prometheus counters can only go up
| mv-apply value to typeof(double) on
( extend correction = iff(value < prev(value), prev(value), 0.0) // if the value decreases we assume it was reset to 0, so add last value
| extend cum_correction = row_cumsum(correction)
| extend corrected_value = value + cum_correction
| summarize value = make_list(corrected_value))
| union (tbl | where not(fix_reset))
| extend timestampS = array_shift_right(timestamp, n_bins), valueS = array_shift_right(value, n_bins)
| extend dt = series_subtract(timestamp, timestampS)
| extend dt = series_divide(dt, 1e7) // converts from ticks to seconds
| extend dv = series_subtract(value, valueS)
| extend rate = series_divide(dv, dt)
| project-away dt, dv, timestampS, value, valueS
};
// Write your query to use the function here.
示例
以下示例使用 invoke 运算符运行函数。
计算指标的平均增加率
若要使用查询定义的函数,请在嵌入的函数定义后调用它。
let series_rate_fl=(tbl:(timestamp:dynamic, value:dynamic), n_bins:int=1, fix_reset:bool=true)
{
tbl
| where fix_reset // Prometheus counters can only go up
| mv-apply value to typeof(double) on
( extend correction = iff(value < prev(value), prev(value), 0.0) // if the value decreases we assume it was reset to 0, so add last value
| extend cum_correction = row_cumsum(correction)
| extend corrected_value = value + cum_correction
| summarize value = make_list(corrected_value))
| union (tbl | where not(fix_reset))
| extend timestampS = array_shift_right(timestamp, n_bins), valueS = array_shift_right(value, n_bins)
| extend dt = series_subtract(timestamp, timestampS)
| extend dt = series_divide(dt, 1e7) // converts from ticks to seconds
| extend dv = series_subtract(value, valueS)
| extend rate = series_divide(dv, dt)
| project-away dt, dv, timestampS, value, valueS
};
//
demo_prometheus
| invoke series_metric_fl('TimeStamp', 'Name', 'Labels', 'Val', 'writes', offset=now()-datetime(2020-12-08 00:00))
| invoke series_rate_fl(2)
| render timechart with(series=labels)
输出
选择两个主机的主磁盘
下面的示例选择两个主机的主磁盘,并假定已安装该函数。 此示例使用替代的直接调用语法,将输入表指定为第一个参数:
若要使用查询定义的函数,请在嵌入的函数定义后调用它。
let series_rate_fl=(tbl:(timestamp:dynamic, value:dynamic), n_bins:int=1, fix_reset:bool=true)
{
tbl
| where fix_reset // Prometheus counters can only go up
| mv-apply value to typeof(double) on
( extend correction = iff(value < prev(value), prev(value), 0.0) // if the value decreases we assume it was reset to 0, so add last value
| extend cum_correction = row_cumsum(correction)
| extend corrected_value = value + cum_correction
| summarize value = make_list(corrected_value))
| union (tbl | where not(fix_reset))
| extend timestampS = array_shift_right(timestamp, n_bins), valueS = array_shift_right(value, n_bins)
| extend dt = series_subtract(timestamp, timestampS)
| extend dt = series_divide(dt, 1e7) // converts from ticks to seconds
| extend dv = series_subtract(value, valueS)
| extend rate = series_divide(dv, dt)
| project-away dt, dv, timestampS, value, valueS
};
//
series_rate_fl(series_metric_fl(demo_prometheus, 'TimeStamp', 'Name', 'Labels', 'Val', 'writes', '"disk":"sda1"', lookback=2h, offset=now()-datetime(2020-12-08 00:00)), n_bins=10)
| render timechart with(series=labels)
输出