如何在Application Insights中按事件最终结果统计函数重试成功率
队列触发函数Application Insights按最终结果统计成功率的解决办法
1. 给同一条队列消息的所有执行加唯一标识
每条队列消息都自带唯一的MessageId,你需要在函数代码里把这个ID注入到Application Insights的遥测属性中,以此关联同一条消息的多次重试执行:
- C#示例:
var telemetry = new TelemetryClient(); telemetry.Context.Properties["QueueMsgId"] = message.Id; // 自动收集或手动打点的遥测数据都会带上这个标识
- Python示例:
def main(msg: QueueMessage): import logging from opencensus.ext.azure.log_exporter import AzureLogHandler logger = logging.getLogger(__name__) logger.addHandler(AzureLogHandler(connection_string="你的AI连接字符串")) # 将消息ID放入自定义维度 logger.info("Processing message", extra={"custom_dimensions": {"QueueMsgId": msg.id}})
2. 用Kusto查询统计最终成功率
在Application Insights的日志查询界面,执行以下Kusto语句,按消息ID分组后取每条消息最后一次执行的结果,以此计算真实成功率:
requests | where cloud_RoleName == "你的函数应用名称" | where operation_Name startswith "你的队列触发函数名称" | extend QueueMsgId = customDimensions.QueueMsgId // 按消息ID分组,提取时间最晚的一次执行的成功状态 | summarize FinalStatus = arg_max(timestamp, success) by QueueMsgId // 统计最终成功数与总消息数,计算成功率 | summarize SuccessTotal = countif(FinalStatus.success == true), TotalMessages = count() | extend SuccessRate = SuccessTotal * 100.0 / TotalMessages | project SuccessRate, SuccessTotal, TotalMessages
这个查询会直接忽略中间的重试失败,只以每条消息的最终处理结果为统计依据。
3. 做成可视化面板(可选)
将上述查询保存为Application Insights的自定义查询,再添加到仪表盘,就能随时查看按最终结果统计的成功率,无需重复执行查询。
4. 过滤重试失败的遥测(进阶可选)
如果不想让重试阶段的失败请求干扰默认的成功率统计,可以编写遥测处理器过滤这类数据:
- C#中实现
ITelemetryProcessor,通过队列消息的DequeueCount(重试次数)判断,若未达到最大重试次数且执行失败,则跳过该条遥测:
public class RetrySkipProcessor : ITelemetryProcessor { private readonly ITelemetryProcessor _next; private const int MaxRetries = 5; // 你的函数重试次数上限 public RetrySkipProcessor(ITelemetryProcessor next) => _next = next; public void Process(ITelemetry item) { if (item is RequestTelemetry req && req.Properties.TryGetValue("QueueDequeueCount", out var countStr) && int.TryParse(countStr, out var dequeueCount)) { // 过滤重试阶段的失败请求 if (dequeueCount < MaxRetries && !req.Success) return; } _next.Process(item); } }
然后在Startup.cs中注册该处理器:
public override void Configure(IFunctionsHostBuilder builder) { builder.Services.AddApplicationInsightsTelemetryProcessor<RetrySkipProcessor>(); }
注意:此方法会删除重试失败的遥测数据,若需要保留这些数据用于调试,建议优先使用查询统计的方案。
内容的提问来源于stack exchange,提问作者myob-hankun
相关产品推荐
相关产品推荐

