配置 FinOps 中心建议

FinOps 中心从多个源收集建议,并将其引入 建议托管数据集 ,以及成本管理导出中的预留建议。 建议源自Azure Resource Graph使用一组可配置的查询来拉取Azure 顾问建议,并根据资源配置确定各种优化方案。 查询在存储中的简单 JSON 文件中进行管理,通过将查询文件上传到中心存储,可以轻松添加自己的自定义建议。


先决条件

在开始之前,您需要具备以下条件:

  • 部署了 FinOps 中心实例
  • 在要查询的管理组或订阅上,将 读取者 角色分配给 Data Factory 托管标识。 必须独立于 FinOps 中心部署配置此权限。

如何处理建议

建议管道每天运行,并处理存储在中心存储中的 配置/查询 文件夹中的查询文件:

  1. queries_DailySchedule触发器每天运行一次。
  2. queries_ExecuteETL管道循环访问配置/查询存储文件夹中的所有查询文件。
  3. queries_ETL_ingestion 管道在 Azure Resource Graph 上执行每个查询,对结果进行去重,并将数据保存为 parquet 格式,存放在 ingestion/Recommendations 文件夹中。
  4. 如果使用 Azure 数据资源管理器,则数据将引入到 Recommendations_raw 表中,并使用 Recommendations_transform_v1_2() 函数进行转换。

中心建议与来自成本管理导出的预留建议合并在同一个建议托管数据集中。 您可以使用 x_SourceType 列来区分不同来源。


内置建议

FinOps 中心提供以下建议。 默认情况下,大多数都已启用。 对于不适用这些建议的组织,可选建议可能会造成干扰,并且可以在部署期间通过指定的模板参数启用。

计算

数据库

管理和治理

网络

存储

Web

若要禁用特定的默认建议,请从中心存储中的 配置/查询 文件夹中删除其查询文件。 管道仅处理存在的查询文件。


添加自定义建议

可以通过将查询文件上传到中心存储中的 配置/查询 文件夹来添加自定义建议。 该流水线会在下一次每日运行时自动获取新的查询文件。

文件命名约定

使用 {dataset}-{provider}-{type}.json 格式命名查询文件:

  • 数据集 - 目标数据集(例如 Recommendations)。
  • Provider — 服务数据的提供方(例如,MicrosoftContoso)。
  • 类型 - 使用 PascalCase 的建议类型标识符(例如,StoppedVMsIdleCosmosDB)。

例如:Recommendations-Contoso-IdleCosmosDB.json

查询文件格式

每个查询文件都是具有以下属性的 JSON 文件:

{
  "dataset": "Recommendations",
  "provider": "Microsoft",
  "query": "<Azure Resource Graph query>",
  "queryEngine": "ResourceGraph",
  "scope": "Tenant",
  "source": "<descriptive source name>",
  "type": "<unique type identifier>",
  "version": "1.0"
}
财产 说明
dataset 必须是 "Recommendations"
provider 提供程序名称(例如,"Microsoft")。
query 要执行的 Azure Resource Graph 单行查询语句。
queryEngine 必须是 "ResourceGraph"
scope 查询范围。 使用 "Tenant" 查询在该租户中 Data Factory 托管标识有权访问的所有订阅。 不支持跨租户查询,但通过Azure Lighthouse委托的资源包含在租户范围查询中。
source 建议源的描述性名称(例如,"Azure 顾问""FinOps hubs")。
type 此建议类型的程序化标识符。 请使用{provider}-{name}格式,且仅包含字母数字字符和连字符(例如:"Contoso-IdleCosmosDB")。 此值用作输出文件名的一部分。
version 架构版本。 使用 "1.0"

必需的输出列

查询必须返回以下列:

说明
ResourceId 资源 ID(小写)。
ResourceName 资源名称(小写)。
SubAccountId 订阅 ID。
SubAccountName 订阅名称。 使用 resourcecontainers 联接以填充此字段。
x_RecommendationCategory 推荐类别。 使用"Cost""HighAvailability""OperationalExcellence""Performance""Security"
x_RecommendationDate 推荐日期(对于时间点查询,请使用 now())。
x_RecommendationDescription 问题的简短说明。
x_RecommendationDetails 包含其他属性的 JSON 字符串。 包括 x_RecommendationProviderx_RecommendationSolutionx_RecommendationTypeIdx_ResourceType,以及该建议特有的任何自定义属性。
x_RecommendationId 建议的唯一标识符(例如资源 ID + 后缀)。
x_ResourceGroupName 资源组名称(小写)。

编写查询的提示

  • 若要填充订阅名称,请在查询末尾加入:resourcecontainers

    | join kind=leftouter (
        resourcecontainers
        | where type == 'microsoft.resources/subscriptions'
        | project SubAccountName=name, SubAccountId=subscriptionId
    ) on SubAccountId
    | project-away SubAccountId1
    
  • 通过将资源 ID 与描述性后缀(例如,x_RecommendationId)组合生成strcat(tolower(id), '-idle')

  • 使用 tostring(bag_pack(...)) 构建 x_RecommendationDetails 以生成 JSON 字符串。 必须用 tostring() 包裹,因为数据管道无法将动态对象序列化为 Parquet;该值必须是字符串。 你还可以使用 strcat() 手动构建 JSON 字符串,但推荐使用 bag_pack(),因为它能够自动处理转义。

  • x_RecommendationTypeId 作为稳定的 GUID 包含进去,以便在多次运行之间唯一标识建议类型。

有关示例,请查看 FinOps 工具包源代码中的内置查询文件


提供反馈

请您给我们一个简短的评价,让我们知道我们做得怎么样。 我们将使用这些评审来改进和扩展 FinOps 工具和资源。

如果您在寻找特定的东西,可以为现有想法投票或者创建新想法。 与他人分享想法,以获得更多的选票。 我们专注于拥有最多选票的想法。