Cloud Functions删除log-based metric时报指标被修改错误如何解决
报错原因
- 直接遍历
client_metric.list_metrics()返回的懒加载迭代器执行删除是核心诱因:该迭代器采用分页拉取逻辑,不会一次性拉取全量指标生成本地快照。遍历过程中执行的删除操作会修改远程指标集合的版本,后续分页请求触发API的一致性校验,就会抛出FAILED_PRECONDITION状态码,提示资源在请求过程中被修改。 - 次要触发场景为GCP监控API的内置一致性延迟:log-based metric的状态变更存在毫秒级的后台同步窗口,删除请求刚好命中同步窗口时也会触发该冲突。
解决方案
- 先全量拉取指标生成本地快照,再遍历执行删除,避免迭代过程中触发远程分页请求。代码修改示例:
# 先拉取所有指标到本地列表,切断迭代和远程API的动态关联 metrics = list(client_metric.list_metrics()) for metric in metrics: if metric.name not in item_list: metric.delete() print('delete {}'.format(metric.name))
- 针对
FailedPrecondition异常增加指数退避重试逻辑,适配API侧的同步延迟,示例如下:
from google.api_core.exceptions import FailedPrecondition import time def delete_metric_with_retry(metric, max_retry=3): retry_count = 0 while retry_count < max_retry: try: metric.delete() return True except FailedPrecondition: retry_count +=1 time.sleep(2 ** retry_count) # 指数退避等待 raise Exception(f"删除指标{metric.name}重试{max_retry}次后仍失败") # 调用逻辑 metrics = list(client_metric.list_metrics()) for metric in metrics: if metric.name not in item_list: delete_metric_with_retry(metric) print('delete {}'.format(metric.name))
- 排查是否存在其他进程、定时任务同时操作同项目下的log-based metric,避免并发修改引发的冲突。
内容的提问来源于stack exchange,提问作者Simon Breton
相关产品推荐
相关产品推荐

