本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
唯一的维度值
你可能有一个用例,即你有仪表板,你想使用维度的唯一值作为变量,深入研究与特定数据片段对应的指标。下面的快照是一个示例,其中仪表板预先填充了多个维度的唯一值,例如区域、单元、孤岛、微服务和 availability_zone。在这里,我们展示了一个示例,说明如何使用计划查询来显著加快计算这些变量与所跟踪指标的不同值的速度。
在原始数据上
您可以使用 SELECT DISTINCT 来计算从数据中看到的不同值。例如,如果要获取 region 的不同值,则可以使用此表单的查询。
SELECT DISTINCT region FROM "raw_data"."devops" WHERE time > ago(1h) ORDER BY 1
您可能正在跟踪数百万台设备和数十亿个时间序列。但是,在大多数情况下,这些有趣的变量适用于较低的基数维度,其中有几到几十个值。与原始数据截然不同的计算可能需要扫描大量数据。
预先计算唯一的维度值
您希望这些变量能够快速加载,以便您的仪表板具有交互性。此外,这些变量通常是在每次仪表板加载时计算的,因此您也希望它们具有成本效益。您可以优化使用定时查询查找这些变量并将其具体化到派生表中。
首先,您需要确定需要为哪些维度计算 DISTINCT 值或在计算 DISTINCT 值时将在谓词中使用的 DISTINCT 值或列。
在此示例中,您可以看到仪表板正在为维度区域、单元格、筒仓、availability_zone 和微服务填充不同的值。因此,您可以使用下面的查询来预先计算这些唯一值。
SELECT region, cell, silo, availability_zone, microservice_name, min(@scheduled_runtime) AS time, COUNT(*) as numDataPoints FROM raw_data.devops WHERE time BETWEEN @scheduled_runtime - 15m AND @scheduled_runtime GROUP BY region, cell, silo, availability_zone, microservice_name
这里有一些重要的事情需要注意。
-
您可以使用一个计划计算来预先计算许多不同查询的值。例如,您正在使用前面的查询来预先计算五个不同变量的值。因此,你不需要每个变量都有一个变量。您可以使用相同的模式来识别跨多个面板的共享计算,以优化需要维护的计划查询数量。
-
维度的唯一值本质上并不是时间序列数据。所以你可以使用 @scheduled_runtime 将其转换为时间序列。通过将此数据与 @scheduled_runtime 参数相关联,您还可以跟踪在给定时间点出现了哪些唯一值,从而从中创建时间序列数据。
-
在前面的示例中,您将看到正在跟踪的指标值。此示例使用 COUNT (*)。如果您想为仪表板跟踪其他有意义的聚合,则可以计算出其他有意义的聚合。
以下是使用上一个查询进行计划计算的配置。在此示例中,使用计划表达式 cron (0/15 * * *? 配置为每 15 分钟刷新一次 *)。
{ "Name": "PT15mHighCardPerUniqueDimensions", "QueryString": "SELECT region, cell, silo, availability_zone, microservice_name, min(@scheduled_runtime) AS time, COUNT(*) as numDataPoints FROM raw_data.devops WHERE time BETWEEN @scheduled_runtime - 15m AND @scheduled_runtime GROUP BY region, cell, silo, availability_zone, microservice_name", "ScheduleConfiguration": { "ScheduleExpression": "cron(0/15 * * * ? *)" }, "NotificationConfiguration": { "SnsConfiguration": { "TopicArn": "******" } }, "TargetConfiguration": { "TimestreamConfiguration": { "DatabaseName": "derived", "TableName": "hc_unique_dimensions_pt15m", "TimeColumn": "time", "DimensionMappings": [ { "Name": "region", "DimensionValueType": "VARCHAR" }, { "Name": "cell", "DimensionValueType": "VARCHAR" }, { "Name": "silo", "DimensionValueType": "VARCHAR" }, { "Name": "availability_zone", "DimensionValueType": "VARCHAR" }, { "Name": "microservice_name", "DimensionValueType": "VARCHAR" } ], "MultiMeasureMappings": { "TargetMultiMeasureName": "count_multi", "MultiMeasureAttributeMappings": [ { "SourceColumn": "numDataPoints", "MeasureValueType": "BIGINT" } ] } } }, "ErrorReportConfiguration": { "S3Configuration" : { "BucketName" : "******", "ObjectKeyPrefix": "errors", "EncryptionOption": "SSE_S3" } }, "ScheduledQueryExecutionRoleArn": "******" }
计算派生表中的变量
一旦定时计算预先实现了派生表 hc_unique_dimensions_pt15m 中的唯一值,您就可以使用派生表有效地计算维度的唯一值。以下是示例查询,说明如何计算唯一值,以及如何在这些唯一值查询中使用其他变量作为谓词。
区域
SELECT DISTINCT region FROM "derived"."hc_unique_dimensions_pt15m" WHERE time > ago(1h) ORDER BY 1
细胞
SELECT DISTINCT cell FROM "derived"."hc_unique_dimensions_pt15m" WHERE time > ago(1h) AND region = '${region}' ORDER BY 1
筒仓
SELECT DISTINCT silo FROM "derived"."hc_unique_dimensions_pt15m" WHERE time > ago(1h) AND region = '${region}' AND cell = '${cell}' ORDER BY 1
微服务
SELECT DISTINCT microservice_name FROM "derived"."hc_unique_dimensions_pt15m" WHERE time > ago(1h) AND region = '${region}' AND cell = '${cell}' ORDER BY 1
可用区
SELECT DISTINCT availability_zone FROM "derived"."hc_unique_dimensions_pt15m" WHERE time > ago(1h) AND region = '${region}' AND cell = '${cell}' AND silo = '${silo}' ORDER BY 1