giip
SES 商机登记
7分钟阅读

Azure 成本仪表板指南

介绍如何查看按服务器(LSSN)收集的 Azure 订阅成本,按服务或资源组细分,并了解预计月末成本。

🚀 前往 Azure 成本页面 →

📋 概述

Azure 成本仪表板显示与所选服务器(LSSN)关联的 Azure 订阅的成本状况。它读取成本收集器定期收集并保存到 KVS 的最新快照(kFactor=azure_cost),并通过表格和条形图将成本按服务或资源组的占比可视化。当统计周期为当月累计(MonthToDate)时,还会根据当前的日均值计算出预计月末成本。

🤖 AI/API 快速开始

本节帮助 AI 代理或脚本从外部直接查询并分析与本页面相同的服务器计算结果。页面与公开 API 使用同一个共享查询服务(正本存储过程),因此数值一致。

1. 准备事项

  • CSN:项目编号(例如 47)。
  • LSSN:服务器编号。若不清楚,可用下面的服务器列表 API 查询,它会同时返回默认服务器(default_lssn)。
  • API Key:签发的密钥。仅保存在环境变量(GIIP_API_KEY)中。

2. 认证安全警告 (x-api-key)

  • 仅通过 x-api-key 请求头进行认证。切勿把密钥放入 URL 查询字符串或请求体(会泄漏到日志/代理)。
  • 下面的示例不硬编码任何密钥,仅使用环境变量 GIIP_CSN / GIIP_LSSN / GIIP_API_KEY。

3. 调用顺序 (azureCostServers → azureCost)

  1. 调用 azureCostServers 获取该 CSN 的服务器列表和默认服务器(default_lssn)。
  2. 用所需的 lssn(或 default_lssn)调用 azureCost 获取费用明细。

4. Base URL / Method

APIMethodURL
服务器列表GEThttps://giipfaw.azurewebsites.net/api/azureCostServers?csn={csn}
费用明细GEThttps://giipfaw.azurewebsites.net/api/azureCost?csn={csn}&lssn={lssn}

5. Query / Header

位置名称必填说明
querycsn必填项目编号(整数)
querylssn仅 azureCost 必填服务器编号(整数)
headerx-api-key必填签发的密钥

6. 成功响应示例 + 字段说明

通用信封:{ "rstVal": 200, "message": "OK", "data": { ... } }

azureCostServers 的 data:

{
  "csn": 47,
  "default_lssn": 71197,
  "servers": [
    { "lssn": 71197, "hostname": "example-host", "has_azure_cost_snapshot": true, "latest_collected_at": "2026-09-02T22:26:36" }
  ]
}

azureCost 的 data:

{
  "csn": 47,
  "lssn": 71197,
  "source": { "kfactor": "azure_cost", "snapshot_id": 44344061, "collected_at": "2026-09-02T22:26:36" },
  "subscription": { "subscription_id": "<your-subscription-id>", "subscription_name": "<your-subscription>" },
  "period": { "type": "MonthToDate", "start_date": "2026-09-01", "end_date": "2026-09-02", "currency": "KRW", "is_month_to_date": true },
  "totals": { "pretax_cost": 87993.34, "forecast_month_end": 1319900.03 },
  "by_service": [
    { "name": "Azure App Service", "pretax_cost": 38703.06, "ratio_percent": 43.98, "forecast_month_end": 580545.83 }
  ],
  "by_resource_group": [
    { "name": "rg-example-prod", "pretax_cost": 54988.80, "ratio_percent": 62.49, "forecast_month_end": 824832.00, "mapped_csn": null }
  ]
}

字段说明:

  • totals.pretax_cost:该期间的税前总额。totals.forecast_month_end:月末预测(见 8)。
  • by_service[] / by_resource_group[]:已由服务器按费用从大到小排序。ratio_percent 是占总额的比例(%),forecast_month_end 是该项的月末预测。
  • by_resource_group[].mapped_csn:见 9。

7. 错误表 (HTTP / rstVal)

HTTPrstValmessage 示例原因
400400csn and lssn are required numeric query parameters缺少必填参数或格式错误
401401Missing x-api-key header缺少或无效的密钥
403403Access denied无该 CSN 的访问权限
404404No cost data for this server服务器不属于该 CSN,或近 30 天无快照
429429Too Many Requests调用过多导致限流(见 10)
500500(内部错误消息)服务器错误 — 稍后重试

8. 数值含义(税前·货币·快照·collected_at·MonthToDate·预测)

  • 所有费用均为税前(Pre-tax),货币为 period.currency。
  • 始终基于最新的单条快照(非实时)。采集时间为 source.collected_at。
  • 若 period.type 为 MonthToDate,则为本月 1 日至采集日的累计(is_month_to_date = true)。
  • forecast_month_end 仅在 MonthToDate 时计算。公式为 总额 × (当月总天数 ÷ 采集日),其他期间为 null。
  • 快照没有原始的 period.start_date / end_date,因此按 collected_at 推导。

9. 按服务/按 RG 分析与 mapped_csn

  • by_service 是按 Azure 服务的费用,by_resource_group 是按资源组的费用。
  • mapped_csn 是拥有(映射)该资源组的 CSN,可能与请求的 CSN 不同(当该 RG 归属另一个项目时)。这是归属信息而非隔离违规;未映射时为 null。

10. 429 重试

  • 为防止公开 API 被滥用,调用过多时可能返回 429 Too Many Requests。若响应含 Retry-After 头(秒),等待相应时间后重试;否则使用指数退避(例如 1s → 2s → 4s)。

11. cURL 示例

# 仅使用环境变量,切勿把密钥放入 URL/请求体
export GIIP_CSN=47
export GIIP_LSSN=71197          # 不清楚时可省略,改用下面的 default_lssn
export GIIP_API_KEY=***your_key***

# 1) 服务器列表 + 默认服务器
curl -s "https://giipfaw.azurewebsites.net/api/azureCostServers?csn=${GIIP_CSN}" \
  -H "x-api-key: ${GIIP_API_KEY}"

# 2) 单服务器费用明细
curl -s "https://giipfaw.azurewebsites.net/api/azureCost?csn=${GIIP_CSN}&lssn=${GIIP_LSSN}" \
  -H "x-api-key: ${GIIP_API_KEY}"

12. PowerShell 示例

$csn = $env:GIIP_CSN; $lssn = $env:GIIP_LSSN; $key = $env:GIIP_API_KEY
$h = @{ "x-api-key" = $key }
$base = "https://giipfaw.azurewebsites.net/api"

$servers = Invoke-RestMethod -Uri "$base/azureCostServers?csn=$csn" -Headers $h
$target = if ($lssn) { $lssn } else { $servers.data.default_lssn }

$cost = Invoke-RestMethod -Uri "$base/azureCost?csn=$csn&lssn=$target" -Headers $h
"税前总额: $($cost.data.totals.pretax_cost) $($cost.data.period.currency)"
$cost.data.by_service | Select-Object -First 5 name, pretax_cost, ratio_percent

13. Python 示例(单文件:服务器列表 → 默认 LSSN → 费用查询 → 前 5)

import os, sys, time, json, urllib.request, urllib.error

BASE = "https://giipfaw.azurewebsites.net/api"
CSN = os.environ["GIIP_CSN"]
KEY = os.environ["GIIP_API_KEY"]
LSSN = os.environ.get("GIIP_LSSN")  # 若无则使用 default_lssn

def call(path):
    req = urllib.request.Request(f"{BASE}/{path}", headers={"x-api-key": KEY})
    for attempt in range(4):
        try:
            with urllib.request.urlopen(req, timeout=30) as r:
                return json.load(r)
        except urllib.error.HTTPError as e:
            if e.code == 429:  # 限流 → 等待 Retry-After 后重试
                time.sleep(int(e.headers.get("Retry-After", 2 ** attempt)))
                continue
            sys.exit(f"HTTP {e.code}: {e.read().decode()}")
    sys.exit("429 重试超限")

servers = call(f"azureCostServers?csn={CSN}")
lssn = LSSN or servers["data"]["default_lssn"]
cost = call(f"azureCost?csn={CSN}&lssn={lssn}")["data"]

cur = cost["period"]["currency"]
print(f"税前总额: {cost['totals']['pretax_cost']} {cur} "
      f"(月末预测 {cost['totals']['forecast_month_end']})")
print("前 5 服务:")
for s in cost["by_service"][:5]:
    print(f"  {s['name']}: {s['pretax_cost']} ({s['ratio_percent']:.1f}%)")
print("前 5 资源组:")
for g in cost["by_resource_group"][:5]:
    print(f"  {g['name']}: {g['pretax_cost']} ({g['ratio_percent']:.1f}%) mapped_csn={g['mapped_csn']}")

14. 执行顺序(5 步)

  1. 设置环境变量:GIIP_CSN、GIIP_API_KEY(可选 GIIP_LSSN)。
  2. 调用 azureCostServers → 确认 default_lssn。
  3. 调用 azureCost → 获取 data。
  4. 用 totals / by_service / by_resource_group 分析总额与靠前的项。
  5. 4xx/5xx 按错误表处理,429 用 Retry-After 重试。

🔍 主要组成部分

1. 服务 / 资源组 标签页

页面顶部的两个标签页可将同一数据在按服务和按资源组两种视角之间切换。点击标签页时不会重新加载整个页面,仅更新地址栏中的 ?view= 值(service 或 rg),因此可以直接分享特定视角的链接。

2. 服务器(LSSN)选择

指定要查看成本的目标服务器。

  • 下拉菜单: 属于当前项目(csn)的服务器列表以 主机名 (LSSN) 的形式填充。
  • 直接输入: 如果服务器不在列表中或您已知道 LSSN,可在右侧输入框中直接输入编号并点击 [查询] 或按 Enter 查询。

确定 LSSN 后,会自动查询最新成本数据。

3. 摘要卡片

在查询结果上方以卡片形式显示关键指标。

  • 总成本: 该周期的税前合计(total_pretax_cost)以及货币、周期(period)。当月累计时显示为 MonthToDate。
  • 月末预测: 仅在 MonthToDate 周期时出现,按当前日均值 × 当月总天数计算。
  • 订阅: 订阅名称(subscription_name)和订阅 ID(subscription_id)。
  • 收集时间: 数据收集的时间(collected_at)以及查询的 LSSN。

4. 按项目成本表

根据当前标签页,按服务或按资源组从高到低列出成本。

  • #: 排名
  • 服务 / 资源组: 项目名称
  • 成本: 该项目的税前成本
  • 月末预测: 仅在 MonthToDate 时显示,将整体预测比率应用于该项目的值
  • 占比: 相对于总成本的比例,以条形和百分比显示

5. 为资源组指定 CSN(项目)· 映射 RG 筛选

在资源组标签页中,可直接在每个资源组行指定项目(CSN)。

  • 指定方式: 在该行的 [指定 CSN] 下拉框中选择项目并点击 [应用],该资源组即映射到所选 CSN(内部保存到 tCsnAzureRg)。此后会反映在该 CSN 视角的 Azure 费用视图(映射 RG 筛选与小计)中。
  • 重新指定 / 解除: 将已映射到其他 CSN 的 RG 改到别的项目时,旧映射会自动清理,保持 1 RG = 1 CSN。选择 (未指定) 并应用即可解除映射。
  • 仅显示映射 RG: 若当前项目(CSN)有一个以上映射 RG,将出现 “仅显示 CSN 映射 RG” 开关;开启后会把当前服务器的资源组筛选为已映射 RG 并显示映射小计。无映射时显示全部 RG(非破坏性回退)。
  • 此内联指定与专用管理页面 Azure 资源组管理 共享同一映射数据。包含订阅 ID、备注的精细管理请使用管理页面。

🛠️ 使用技巧

  • 切换视角: 使用服务标签页查看哪些 Azure 服务成本最高,使用资源组标签页查看哪些组最大。
  • 分享链接: 由于 ?view= 和 ?lssn= 的值会反映在地址栏中,可直接分享特定服务器和视角。
  • 利用预测: 只有存在当月累计数据时才会计算预测成本。可用于尽早发现成本骤增。

💡 注意事项

  • 显示的所有成本均以**税前(Pre-tax)**为准。
  • 仪表板始终显示最近收集的单条快照。数值以收集时间为准,并非实时值。
  • 如果没有数据,会显示提示信息。通常表示该服务器的成本收集器尚未运行,或没有已保存的快照。

故障排除

症状原因解决方法
显示"无数据"该 LSSN 没有已收集的 azure_cost 快照确认目标服务器上的 Azure 成本收集器已运行并保存数据。
服务器下拉菜单为空未选择项目(csn),或列表加载失败选择项目后重新打开页面,或在右侧输入框中直接输入 LSSN。
月末预测卡片/列不显示周期不是 MonthToDate预测仅从当月累计数据导出。周期不同时属正常现象。
资源组标签页为空快照中没有 by_resource_group 数据确认收集器是否也收集资源组级别的成本。
[指定 CSN] 下拉框不显示可选项目列表加载失败(无所属/网络)确认是否属于某个项目并重新连接。映射 RG 筛选与查询仍正常。
[应用] 后映射未生效对目标项目(CSN)无权限或 API 失败确认该 CSN 权限,若反复出现请联系管理员。
查询时出现错误信息网络错误或 API 响应失败稍后重试 [查询],如持续出现请联系管理员。

版本: 1.1 最后更新: 2026-07-24 源文件: giipv3/public/help/azure-cost.zh-CN.md