用Spring Boot搭建AI成本与稳定性监控看板:Token、预算、429、熔断与降级

发布时间:2026/8/1 0:53:05

用Spring Boot搭建AI成本与稳定性监控看板:Token、预算、429、熔断与降级
文章摘要Spring AI 2.0已经可以通过Micrometer输出模型调用耗时与Token指标但企业要真正控制成本还需要把模型价格、业务场景、租户、预算、重试、Tool Calling和降级事件统一起来。本文实现一个轻量级AI成本与稳定性监控服务从ChatResponse读取Usage计算单次费用写入业务成本表同时用Micrometer记录低基数指标并提供租户月预算、场景成本、429、熔断和降级看板所需的数据模型与PromQL。一、最终要看哪些数据系统健康看板QPS P95/P99延迟 当前并发 错误率 429 超时 熔断 降级成本看板输入Token 输出Token 缓存读写Token 按模型成本 按租户成本 按业务场景成本 单任务平均成本 预算使用率质量辅助完成率 重试次数 工具调用次数 人工接管率二、为什么Prometheus不能单独做财务结算Prometheus适合趋势和告警但不适合最终账单指标可能有采样数据有保留期限实例重启和标签变化会影响序列不适合保存每个用户高基数记录难以做审计和追溯。推荐Micrometer → 实时监控 成本明细表 → 结算与审计三、价格配置模型publicrecordModelPrice(Stringprovider,Stringmodel,BigDecimalinputPerMillion,BigDecimaloutputPerMillion,BigDecimalcacheWritePerMillion,BigDecimalcacheReadPerMillion,LocalDateeffectiveFrom){}价格不能写死在业务代码中。配置表CREATETABLEai_model_price(idBIGINTPRIMARYKEY,providerVARCHAR(64)NOTNULL,modelVARCHAR(128)NOTNULL,input_per_millionDECIMAL(18,8)NOTNULL,output_per_millionDECIMAL(18,8)NOTNULL,cache_write_per_millionDECIMAL(18,8),cache_read_per_millionDECIMAL(18,8),effective_fromDATENOTNULL,effective_toDATE);模型价格变化后保留历史版本。四、请求上下文publicrecordAiCostContext(StringrequestId,StringtenantId,StringuserId,StringbusinessScene,StringpromptVersion,StringmodelTier){}tenantId和userId从认证上下文读取不信任前端直接传值。五、从ChatResponse读取UsageChatResponseresponsechatClient.prompt().user(message).call().chatResponse();Usageusageresponse.getMetadata().getUsage();读取longinputusage.getPromptTokens();longoutputusage.getCompletionTokens();longtotalusage.getTotalTokens();不同Provider的详细缓存Token可以通过统一Usage字段或getNativeUsage()读取。必须允许Usage为空这时标记为COST_UNKNOWN不要默认为0否则财务数据会被低估。六、成本计算器ComponentpublicclassAiCostCalculator{privatestaticfinalBigDecimalMILLIONnewBigDecimal(1000000);publicBigDecimalcalculate(UsageSnapshotusage,ModelPriceprice){BigDecimalinputCostcost(usage.inputTokens(),price.inputPerMillion());BigDecimaloutputCostcost(usage.outputTokens(),price.outputPerMillion());BigDecimalcacheWriteCostcost(usage.cacheWriteTokens(),price.cacheWritePerMillion());BigDecimalcacheReadCostcost(usage.cacheReadTokens(),price.cacheReadPerMillion());returninputCost.add(outputCost).add(cacheWriteCost).add(cacheReadCost);}privateBigDecimalcost(longtokens,BigDecimalperMillion){if(perMillionnull){returnBigDecimal.ZERO;}returnBigDecimal.valueOf(tokens).multiply(perMillion).divide(MILLION,10,RoundingMode.HALF_UP);}}七、成本明细表CREATETABLEai_usage_record(idBIGINTPRIMARYKEY,request_idVARCHAR(64)NOTNULL,tenant_idVARCHAR(64)NOTNULL,user_idVARCHAR(64),business_sceneVARCHAR(64)NOTNULL,providerVARCHAR(64)NOTNULL,modelVARCHAR(128)NOTNULL,prompt_versionVARCHAR(64),input_tokensBIGINT,output_tokensBIGINT,cache_write_tokensBIGINT,cache_read_tokensBIGINT,model_call_countINTNOTNULL,tool_call_countINTNOTNULL,retry_countINTNOTNULL,estimated_costDECIMAL(18,10),cost_statusVARCHAR(32)NOTNULL,duration_msBIGINT,result_statusVARCHAR(32)NOTNULL,created_atTIMESTAMPNOTNULL);索引CREATEINDEXidx_ai_usage_tenant_monthONai_usage_record(tenant_id,created_at);CREATEINDEXidx_ai_usage_scene_monthONai_usage_record(business_scene,created_at);八、为什么要记录model_call_count一次ChatClient请求可能包含第一次模型选择工具 第二次模型读取工具结果 第三次模型修复结构化输出最终Usage可能是累计值但为了分析效率还要记录模型轮次。指标平均每个业务请求模型调用次数如果从1.3突然上升到4.8可能发生Tool循环输出修复重试Agent规划失效。九、Micrometer低基数指标ComponentpublicclassAiMetrics{privatefinalMeterRegistryregistry;publicAiMetrics(MeterRegistryregistry){this.registryregistry;}publicvoidrecordCost(Stringscene,StringmodelTier,BigDecimalcost){registry.counter(enterprise.ai.estimated.cost,scene,scene,model_tier,modelTier).increment(cost.doubleValue());}publicvoidrecordFallback(Stringscene,Stringreason){registry.counter(enterprise.ai.fallback,scene,scene,reason,reason).increment();}}不要把userId requestId conversationId作为Meter标签。十、预算表CREATETABLEai_budget(idBIGINTPRIMARYKEY,scope_typeVARCHAR(32)NOTNULL,scope_idVARCHAR(128)NOTNULL,budget_monthCHAR(7)NOTNULL,warning_amountDECIMAL(18,2)NOTNULL,hard_limit_amountDECIMAL(18,2)NOTNULL,currencyVARCHAR(8)NOTNULL,UNIQUE(scope_type,scope_id,budget_month));范围ORGANIZATION PROJECT TENANT BUSINESS_SCENE十一、预算检查publicBudgetDecisioncheck(StringtenantId,Stringscene,BigDecimalestimatedRequestCost){BigDecimalmonthCostusageRepository.sumMonthCost(tenantId,YearMonth.now());BudgetbudgetbudgetRepository.findTenantBudget(tenantId,YearMonth.now());BigDecimalprojectedmonthCost.add(estimatedRequestCost);if(projected.compareTo(budget.hardLimitAmount())0){returnBudgetDecision.BLOCK;}if(projected.compareTo(budget.warningAmount())0){returnBudgetDecision.WARN;}returnBudgetDecision.ALLOW;}请求前只能估算调用后再用实际Usage结算。十二、预算接近上限如何降级80% → 告警 90% → 默认切换低成本模型 95% → 关闭非核心AI功能 100% → 阻止请求或转规则系统模型路由publicModelTierroute(BudgetDecisiondecision,ModelTierrequested){returnswitch(decision){caseALLOW-requested;caseWARN-requested.downgrade();caseBLOCK-ModelTier.NONE;};}十三、429看板区分rate_limit_exceeded insufficient_quota project_spend_limit指标enterprise_ai_429_total{ reasonrate_limit }不要把所有429合并否则无法判断应该等待重试 还是 立即停止并调整预算十四、熔断与降级指标resilience4j_circuitbreaker_state resilience4j_circuitbreaker_calls_seconds enterprise_ai_fallback_total enterprise_ai_degraded_request_total看板应显示当前熔断状态最近打开次数降级模型比例转人工数量被预算阻止数量。十五、核心PromQL输入Token速率sum by (gen_ai_request_model) ( rate(gen_ai_client_token_usage_total{ gen_ai_token_typeinput }[5m]) )输出Token速率sum by (gen_ai_request_model) ( rate(gen_ai_client_token_usage_total{ gen_ai_token_typeoutput }[5m]) )模型平均耗时sum(rate(gen_ai_client_operation_seconds_sum[5m])) / sum(rate(gen_ai_client_operation_seconds_count[5m]))业务降级速率sum by (scene, reason) ( rate(enterprise_ai_fallback_total[5m]) )十六、日报接口GetMapping(/internal/ai-cost/daily)publicDailyCostReportdaily(RequestParamLocalDatedate){returnreportService.build(date);}返回{date:2026-07-31,totalCost:128.43,totalRequests:45210,costPerSuccess:0.0031,topScenes:[],topTenants:[],fallbackCount:318,rateLimitCount:26}十七、看板布局建议第一行今日费用 月度费用 预算使用率 成功请求 单次成功成本第二行请求趋势 Token趋势 P95延迟 错误率第三行模型成本占比 业务场景成本 租户成本Top10第四行429 熔断 降级 重试 Tool失败十八、需要防止的统计错误1. Tool Calling只算最后一次模型会低估成本。2. Provider未返回Usage时记0应该记未知。3. 价格更新后重算历史历史记录应使用调用当时价格版本。4. Prometheus值作为账单不适合最终审计。5. 把userId作为指标标签造成高基数爆炸。总结一个可用的AI成本看板必须把Spring AI Usage 模型价格 业务上下文 预算 429 熔断 降级组织在一起。Micrometer负责实时健康和趋势数据库明细负责按租户、场景和请求进行成本结算与审计。

相关新闻

看完就会:盘点2026年巅峰之作的的降AIGC网站

看完就会:盘点2026年巅峰之作的的降AIGC网站

2026/8/1 0:53:05

轻松降低论文AI率在2026年已不再是天方夜谭。以下是2026年最炸裂、实测效果显著的降AIGC网站神器,覆盖AI痕迹消除、文本改写润色、降重优化、学术合规检测四大核心场景,帮你稳妥搞定毕业论文。 一、全流程王者:一站式搞定论文全链路 这类工具…

Spring AI遇到429或超时后为什么重复执行工具?重试边界与幂等完整排查

Spring AI遇到429或超时后为什么重复执行工具?重试边界与幂等完整排查

2026/8/1 0:53:05

文章摘要 AI接口出现429、超时或连接中断后,开发者通常会增加自动重试。但在Tool Calling场景中,如果重试包裹了整个Agent流程,退款、发送邮件、创建工单、写数据库等工具可能被重复执行。更隐蔽的情况是模型请求超时,但工具其实已…

从零搭建AI生活工具的技术路线图:基础设施到上线验证

从零搭建AI生活工具的技术路线图:基础设施到上线验证

2026/8/1 0:43:05

从零搭建AI生活工具的技术路线图:基础设施到上线验证 一、路线图总览:6周从0到可运营MVP 技术路线图不是流水账,而是一个分阶段、有决策点的演进路径。每个阶段的结束条件不仅是"功能完成",更是"达到可验证的质量…

虚拟机开机过程中关机,再次开机没有分配 IP

虚拟机开机过程中关机,再次开机没有分配 IP

2026/8/1 2:03:08

目录 问题 懊悔 原因 解决方案 如何防止再次意外停止 问题 不知道大家有没有手欠在虚拟机开机过程中给关机了,结果发现下一次虚拟机打开后,vscode 无法远程虚拟机了,去到虚拟机中一看,结果发现没有 ip,如下&#…

Stata负二项与零膨胀回归:处理过度离散与零值数据的完整指南

Stata负二项与零膨胀回归:处理过度离散与零值数据的完整指南

2026/8/1 2:03:08

1. 项目概述:从泊松回归的局限说起在实证研究的路上,尤其是处理计数数据时,泊松回归往往是我们的第一站。它的假设简洁明了:期望等于方差。但现实数据往往比教科书上的案例“调皮”得多。我处理过不少来自医学、社会学、经济学的数…

足迹交易原则解析:从市场微观结构到实战策略

足迹交易原则解析:从市场微观结构到实战策略

2026/8/1 2:03:08

这次我们来看一个关于足迹交易原则的技术分析项目。足迹交易是金融市场分析中的重要方法,通过分析市场参与者的交易行为痕迹来预测价格走势。这个项目系统性地整理了关键的交易原则和实战应用技巧。 对于量化交易者、技术分析师和金融市场研究者来说,掌…

leetcode 1675. 数组的最小偏移量

leetcode 1675. 数组的最小偏移量

2026/8/1 2:03:08

Problem: 1675. 数组的最小偏移量 https://leetcode.com/problems/minimize-deviation-in-array/solutions/955262/c-intuitions-and-flip-by-votrubac-3bbe/ 不会,挺难的,看了其他人的答案,问了豆包的 这道题的难点是:数字存在…

Python爬虫与数据分析实战:零基础一个月构建数据抓取与分析能力

Python爬虫与数据分析实战:零基础一个月构建数据抓取与分析能力

2026/8/1 2:03:08

如果你在2026年还在犹豫要不要学Python,或者担心自己学不会,这篇文章就是为你准备的。这不是一篇简单的教程罗列,而是一个为你量身定制的、从零到一的Python实战能力构建地图。很多人学Python失败,不是因为笨,而是因为…

Spring Boot企业级事务管理实战与优化

Spring Boot企业级事务管理实战与优化

2026/8/1 1:53:08

1. 企业级事务设计的核心挑战在Spring Boot企业级应用开发中,事务管理就像建筑中的承重墙,看似基础却决定了整个系统的稳定性。我经历过多个日活百万级的电商和金融项目,90%的生产事故都源于事务设计缺陷。以下是典型问题场景:支付…

[具身智能-649]:个人电脑搭建 RTSP 服务完整方案(Windows / Ubuntu 双平台,适配 RDK X5 rtsp2display 调试)

[具身智能-649]:个人电脑搭建 RTSP 服务完整方案(Windows / Ubuntu 双平台,适配 RDK X5 rtsp2display 调试)

2026/7/30 9:53:22

目标:电脑作为RTSP 服务端,循环推送 H264/H265 视频流; RDK X5 通过 rtsp2display 拉流预览,完全不需要在开发板编译 live555。 提供两套成熟方案: ✅ 方案 A:FFmpeg(最简单,优先推…

PDF合并与动态水印的工程化方案:2026国内免费工具实测对比

PDF合并与动态水印的工程化方案:2026国内免费工具实测对比

2026/8/1 0:15:49

一、背景与测试方案 在实际项目交付中,PDF文件合并与版权保护水印的叠加是一个高频但容易被低估的技术需求。典型的处理链路涉及:多源PDF的文件流合并、页面级水印渲染(含透明度混合与图层叠加)、输出文件体积控制。看似简单的操作…

PDF拆分压完图糊了?2026国内免费实测,档案员都在用的组合方案

PDF拆分压完图糊了?2026国内免费实测,档案员都在用的组合方案

2026/7/30 2:52:37

说实话,提到PDF拆分再压缩,我真是被折腾得够呛。 上个月公司年度合同归档,一份300多页的PDF总合同,需要按年份拆分成三个独立文件,再分别压缩到10MB以内方便邮件发送各部门确认。我心想这还不简单?先找个海…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/1 0:03:03

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/1 0:03:03

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/1 0:03:03

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/1 0:03:03

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/1 0:03:03

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/1 0:03:03

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…