series_metric_fl()

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

series_metric_fl() 函数是一个用户定义的函数 (UDF),它选择并检索通过 Prometheus 监视系统引入到数据库的指标的时序。 此函数假定存储在数据库中的数据是按照 Prometheus 数据模型进行了结构化的数据。 具体而言,每个记录都包含:

  • timestamp
  • 指标名称
  • 指标值
  • 一组可变的标签("key":"value" 对)

Prometheus 按其指标名称和一组非重复的标签来定义时序。 你可以使用 Prometheus 查询语言 (PromQL),通过指定指标名称和时序选择器(一组标签)来检索时序集。

语法

T | invoke series_metric_fl(timestamp_col, name_col, labels_col, value_col, metric_name, labels_selector, lookback, offset)

详细了解语法约定

参数

客户 类型​​ 必需 说明
timestamp_col string ✔️ 包含时间戳的列的名称。
name_col string ✔️ 包含指标名称的列的名称。
labels_col string ✔️ 包含标签字典的列的名称。
value_col string ✔️ 包含指标值的列的名称。
metric_name string ✔️ 要检索的指标时序。
labels_selector string 时序选择器字符串,类似于 PromQL。 它是一个包含 "key":"value" 对列表的字符串,例如 '"key1":"val1","key2":"val2"'。 默认值为空字符串,这意味着不筛选。 请注意,不支持正则表达式。
lookback timespan 要检索的范围向量,类似于 PromQL。 默认值为 10 分钟。
offset datetime 要检索的偏移量(相对于当前时间更早),类似于 PromQL。 数据是从 ago(offset)-lookback 到 ago(offset) 的范围检索的。 默认值为 0,这意味着将检索直至 now() 的数据。

函数定义

可以通过将函数的代码嵌入为查询定义的函数,或将其创建为数据库中的存储函数来定义函数,如下所示:

使用以下 let 语句定义函数。 不需要任何权限。

重要

let 语句不能独立运行。 它必须后跟一个表格表达式语句。 若要运行 series_metric_fl() 的工作示例,请参阅示例

let series_metric_fl=(metrics_tbl:(*), timestamp_col:string, name_col:string, labels_col:string, value_col:string, metric_name:string, labels_selector:string='', lookback:timespan=timespan(10m), offset:timespan=timespan(0))
{
    let selector_d=iff(labels_selector == '', dynamic(['']), split(labels_selector, ','));
    let etime = ago(offset);
    let stime = etime - lookback;
    metrics_tbl
    | extend timestamp = column_ifexists(timestamp_col, datetime(null)), name = column_ifexists(name_col, ''), labels = column_ifexists(labels_col, dynamic(null)), value = column_ifexists(value_col, 0)
    | extend labels = dynamic_to_json(labels)       //  convert to string and sort by key
    | where name == metric_name and timestamp between(stime..etime)
    | order by timestamp asc
    | summarize timestamp = make_list(timestamp), value=make_list(value) by name, labels
    | where labels has_all (selector_d)
};
// Write your query to use the function here.

示例

以下示例使用 invoke 运算符运行函数。

指定选择器时

若要使用查询定义的函数,请在嵌入的函数定义后调用它。

let series_metric_fl=(metrics_tbl:(*), timestamp_col:string, name_col:string, labels_col:string, value_col:string, metric_name:string, labels_selector:string='', lookback:timespan=timespan(10m), offset:timespan=timespan(0))
{
    let selector_d=iff(labels_selector == '', dynamic(['']), split(labels_selector, ','));
    let etime = ago(offset);
    let stime = etime - lookback;
    metrics_tbl
    | extend timestamp = column_ifexists(timestamp_col, datetime(null)), name = column_ifexists(name_col, ''), labels = column_ifexists(labels_col, dynamic(null)), value = column_ifexists(value_col, 0)
    | extend labels = dynamic_to_json(labels)       //  convert to string and sort by key
    | where name == metric_name and timestamp between(stime..etime)
    | order by timestamp asc
    | summarize timestamp = make_list(timestamp), value=make_list(value) by name, labels
    | where labels has_all (selector_d)
};
demo_prometheus
| invoke series_metric_fl('TimeStamp', 'Name', 'Labels', 'Val', 'writes', '"disk":"sda1","host":"aks-agentpool-88086459-vmss000001"', offset=now()-datetime(2020-12-08 00:00))
| render timechart with(series=labels)

输出

此图显示 10 分钟内的磁盘写入指标。

不指定选择器时

以下示例未指定选择器,因此选择了所有 'writes' 指标。 此示例假定此函数已安装并使用另一种可供选择的直接调用语法,将输入表指定为第一个参数:

若要使用查询定义的函数,请在嵌入的函数定义后调用它。

let series_metric_fl=(metrics_tbl:(*), timestamp_col:string, name_col:string, labels_col:string, value_col:string, metric_name:string, labels_selector:string='', lookback:timespan=timespan(10m), offset:timespan=timespan(0))
{
    let selector_d=iff(labels_selector == '', dynamic(['']), split(labels_selector, ','));
    let etime = ago(offset);
    let stime = etime - lookback;
    metrics_tbl
    | extend timestamp = column_ifexists(timestamp_col, datetime(null)), name = column_ifexists(name_col, ''), labels = column_ifexists(labels_col, dynamic(null)), value = column_ifexists(value_col, 0)
    | extend labels = dynamic_to_json(labels)       //  convert to string and sort by key
    | where name == metric_name and timestamp between(stime..etime)
    | order by timestamp asc
    | summarize timestamp = make_list(timestamp), value=make_list(value) by name, labels
    | where labels has_all (selector_d)
};
series_metric_fl(demo_prometheus, 'TimeStamp', 'Name', 'Labels', 'Val', 'writes', offset=now()-datetime(2020-12-08 00:00))
| render timechart with(series=labels, ysplit=axes)

输出

此图显示 10 分钟内所有磁盘的磁盘写入指标。