教程:编写有效查询以载入指标数据

Important

从 2023 年 9 月 21 日起,将无法创建新的指标顾问资源。 截至 2026 年 3 月 31 日,指标顾问门户已禁用。 指标顾问服务将于 2026 年 10 月 1 日停用。

建议使用以下替代方法:

  1. Azure Monitor,作为官方Azure 3P 产品,通过多个接口提供异常检测和分析功能。
  2. 开源异常检测器,此开源项目提供与 Kensho、Azure 指标顾问和 Azure 异常检测器在后端中相同的异常检测功能。

本教程中,您将学习如何:

  • 如何编写有效的数据加入查询
  • 常见错误及其规避方法

先决条件

创建“指标顾问”资源

若要了解指标顾问的功能,可能需要在Azure门户中创建指标顾问资源来部署指标顾问实例。

数据架构要求

Azure AI 指标顾问是用于时序异常情况检测、诊断和分析的服务。 作为由 AI 提供支持的服务,它使用你的数据来训练所使用的模型。 服务接受具有以下各列的聚合数据表:

  • 度量值(必需):度量值是一个基本术语或单位特定的术语,是指标的可量化值。 它指一个或多个包含数值的列。
  • 时间戳(可选):可以有零列或一列,其类型为 DateTimeString。 如果未设置此列,则时间戳将设置为每个引入周期的开始时间。 设置时间戳的格式,如下所示:yyyy-MM-ddTHH:mm:ssZ
  • 维度(可选):维度是一个或多个分类值。 这些值的组合标识特定的单变量时序(例如国家/地区、语言、租户等)。 维度列可以是任意数据类型。 处理大量的列和值时要格外小心,应避免处理过多的维度。

如果使用数据源(如Azure Data Lake Storage或Azure Blob 存储),则可以聚合数据,使其与预期的指标架构保持一致。 这是因为这些数据源使用文件作为指标输入。

如果使用数据源(如Azure SQL或Azure 数据资源管理器),则可以使用聚合函数将数据聚合到预期的架构中。 这是因为这些数据源支持通过运行查询来从源获取指标数据。

“指标顾问”中的数据引入原理

将指标接入指标顾问通常有两种方法:

  • 将指标预先聚合到预期的架构中,并将数据存储到某些文件中。 在加入过程中填写路径模板,“指标顾问”将从该路径持续获取新文件,并对指标执行检测。 这是数据源(如Azure Data Lake和Azure Blob 存储)的常见做法。
  • 如果要从 Azure SQL Server、Azure 数据资源管理器 或其他支持使用查询脚本的数据源引入数据,则需要确保正确构造查询。 本文将指导如何编写有效的查询以按预期加入指标数据。

什么是时间间隔?

根据业务需求,指标需要以某种精确度进行监视。 例如,业务关键绩效指标 (KPI) 以天为单位进行监控。 但是,服务性能指标常常按分钟/小时的粒度进行监视。 因此,从源收集指标数据的频率各有不同。

“指标顾问”按每个时间间隔持续收集指标数据,该时间间隔等同于指标的粒度。指标顾问每次会在此特定时间间隔内运行您编写的查询,以摄取数据。 根据此数据引入机制,查询脚本不应返回数据库中存在的所有指标数据,而需将结果限制为单个时间间隔内。

描述时间间隔的图示

如何编写有效查询?

Use @IntervalStart and @IntervalEnd to limit query results

为了帮助实现这一点,提供两个在查询中使用的参数:@IntervalStart 和 @IntervalEnd。

每次运行查询时,都会将 @IntervalStart 和 @IntervalEnd 自动更新为最新的时间间隔时间戳并获取相应的指标数据。 @IntervalEnd 始终被定义为 @IntervalStart + 1 粒度。

下面是在 Azure SQL Server中正确使用这两个参数的示例:

SELECT [timestampColumnName] AS timestamp, [dimensionColumnName], [metricColumnName] FROM [sampleTable] WHERE [timestampColumnName] >= @IntervalStart and [timestampColumnName] < @IntervalEnd;

采用这种方式编写查询脚本后,指标的时间戳应在每个查询结果的时间间隔内。 “指标顾问”会自动将时间戳与指标粒度对齐。

使用聚合函数来聚合指标

通常情况下,客户数据源中包含许多列,但并不是所有列都可以作为维度去监视或纳入。 客户可以使用聚合函数来聚合指标并仅包含有意义的列作为维度。

在下面的示例中,客户的数据源包含超过 10 列的数据,但只有少量列有意义且需要包含并聚合到要监视的指标中。

TS 市场 设备操作系统 类别 ... Measure1 Measure2 Measure3
2020-09-18T12:23:22Z 纽约 iOS 太阳眼镜 ... 43242 322 54546
2020-09-18T12:27:34Z Beijing Android 包包 ... 3333 126 67677
...

如果客户想要按小时粒度监视“Measure1”,并选择“Market”和“Category”作为维度,以下示例介绍了如何正确使用聚合函数来实现此目的:

  • SQL 示例:

        SELECT dateadd(hour, datediff(hour, 0, TS),0) as NewTS
        ,Market
        ,Category
        ,sum(Measure1) as M1
        FROM [dbo].[SampleTable] where TS >= @IntervalStart and TS < @IntervalEnd
        group by Market, Category, dateadd(hour, datediff(hour, 0, TS),0)
    
  • Azure 数据资源管理器示例:

        SampleTable
        | where TS >= @IntervalStart and TS < @IntervalEnd
        | summarize M1 = sum(Measure1) by Market, Category, NewTS = startofhour(TS)
    

注释

在上例中,客户想要以小时为粒度监视指标,但原始时间戳 (TS) 未对齐。 在聚合语句中,需要对时间戳执行一个过程使其按小时对齐,并生成一个名为“NewTS”的新时间戳列。

加入过程中的常见错误

  • 错误: 在查询结果中找到多个时间戳值

    这是常见错误,原因是未将查询结果限制在某个时间间隔内。 例如,如果您正在以天为单位的粒度监控指标,当查询返回的结果如下所示时,就会出现此错误:

    显示返回的多个时间戳值的屏幕截图

    包含多个时间戳值,且这些值不在指标的同一个时间间隔中(一天)。 请查看“指标顾问”中的数据引入原理,了解“指标顾问”将获取每个指标时间间隔内的指标数据。 然后,请确保在查询中使用 @IntervalStart 和 @IntervalEnd,以将结果限制在一个时间间隔内。 查看 Use @IntervalStart and @IntervalEnd to limit query results 以了解详细指南和示例。

  • 错误: 在一个指标时间间隔内的同一个维度组合中发现重复的指标值

    在一个时间间隔内,Metrics Advisor 期望同一维度组合只有一个指标值。 例如,如果您正在以天为单位的粒度监控指标,当查询返回的结果如下所示时,就会出现此错误:

    显示返回的重复值的屏幕截图

    有关详细指导和示例,请参阅使用聚合函数来聚合指标

后续步骤

转到下一篇文章,了解如何创建。