series_rate_fl()

适用于:✅Azure 数据资源管理器Azure MonitorMicrosoft Sentinel

函数 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() 的工作示例,请参阅示例

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)

输出

此图显示在过去两小时内主磁盘写入指标的每秒速率(差距为 10 个箱)。