因表存储并发异常导致的Application Insights依赖项失败问题
解决Application Insights中已处理409异常仍标记为失败的方法
方法1:手动修改依赖项跟踪状态
捕获到409异常并完成业务处理后,手动更新Application Insights的依赖项跟踪,将其标记为成功。同时可以添加自定义属性,方便后续区分已处理的预期异常和真正的失败。
以C#为例的代码示例:
try { // 执行表存储更新操作 } catch (StorageException ex) when (ex.RequestInformation.HttpStatusCode == 409) { // 处理409异常的业务逻辑(比如重试、状态同步等) var telemetryClient = new TelemetryClient(); var dependencyTelemetry = new DependencyTelemetry { Name = "TableStorage-UpdateOperation", Target = "你的表存储账户名", Data = "更新操作的具体参数", Duration = TimeSpan.FromMilliseconds(150), Success = true, ResultCode = "409" }; // 添加自定义属性标记该异常已处理 dependencyTelemetry.Properties.Add("HandledExceptionType", "409-PreConditionFailed"); telemetryClient.TrackDependency(dependencyTelemetry); // 若SDK自动收集了失败的跟踪,可通过配置禁用该请求的自动收集,避免重复上报 }
方法2:用遥测处理器修改或过滤已处理的409依赖项
创建自定义的ITelemetryProcessor,在遥测数据发送到Application Insights之前,拦截并修改符合条件的依赖项状态:
- 实现自定义处理器:
public class Handled409DependencyProcessor : ITelemetryProcessor { private readonly ITelemetryProcessor _nextProcessor; public Handled409DependencyProcessor(ITelemetryProcessor nextProcessor) { _nextProcessor = nextProcessor; } public void Process(ITelemetry item) { if (item is DependencyTelemetry dependency) { // 判断是否是表存储的409响应,且已被业务处理 if (dependency.ResultCode == "409" && dependency.Properties.TryGetValue("Handled409Exception", out _)) { dependency.Success = true; } } _nextProcessor.Process(item); } }
- 在应用初始化时注册处理器:
var telemetryConfig = TelemetryConfiguration.CreateDefault(); telemetryConfig.TelemetryProcessorChainBuilder .Use(next => new Handled409DependencyProcessor(next)) .Build(); var telemetryClient = new TelemetryClient(telemetryConfig);
方法3:调整自动收集的失败状态码规则
如果使用Azure存储SDK自动收集依赖项,可以通过配置移除409的失败判定。这种方式适合所有409异常都属于业务预期处理场景的情况:
在应用配置文件中添加:
"ApplicationInsights": { "Dependencies": { "Storage": { "FailedStatusCodes": [400, 401, 403, 500] // 移除409,将其排除在失败判定外 } } }
注意事项
- 建议保留409异常的上下文信息(比如自定义属性标记),不要直接过滤掉跟踪数据,方便后续排查问题时区分预期异常和真实故障。
- 异步操作场景下,要确保遥测跟踪的上下文正确传递,避免丢失业务处理的标记。
内容的提问来源于stack exchange,提问作者user155489
相关产品推荐
相关产品推荐

