You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Core 3.1 Azure函数Telemetry Client偶发丢自定义遥测事件排查

Azure Function 中TelemetryClient无异常但自定义事件上报失败排查

你使用的遥测上报参考代码如下:

try
{
    _telemetryClient.TrackEvent("MyCustomEventName",
        new KeyValuePair<string, string>("CustomEvent",
            JsonSerializer.Serialize(customEventObject)));
}
catch (Exception e)
{
    _logger.LogError(e,"Failed to log CustomEventObject");
}

你当前运行环境为.NET Core 3.1,Azure Function Runtime版本为3.1.3.0。

可能的原因

  • TrackEvent本身是异步入队操作:你外层的try/catch只能捕获事件入队阶段的异常,事件后续的后台批量上报、服务端处理环节的错误都不会抛出到业务代码,所以即使上报失败也不会有异常日志。
  • 内存缓冲未及时上报就被销毁:TelemetryClient默认会攒一批事件再批量上报,事件会先存在实例的内存缓冲中。如果是消费计划的Azure Function,函数执行完成后实例可能被快速回收,或者冷启动、弹性缩容时实例被销毁,还没来得及上报的缓冲事件会直接丢失。
  • 采样或配额超限:如果开启了Application Insights的自适应采样,或者达到了服务端的配额上限,超出规则/配额的事件会被服务端或客户端直接丢弃,不会返回错误给调用方。
  • 自定义属性不符合规范:Application Insights要求单个自定义属性的长度不能超过8192字节,如果customEventObject序列化后的字符串长度超限,该事件会被客户端静默过滤,不会上报也不会抛异常。
  • 旧版本SDK已知BUG:.NET Core 3.1和Azure Function Runtime 3.x均已停止官方支持,对应版本的Application Insights SDK存在多个已知的遥测丢失问题,比如并发场景下缓冲队列溢出、瞬断重试不生效等问题,都会导致事件静默丢失。
  • 网络瞬断未触发重试:上报时如果出现网络抖动,旧版本SDK的默认重试策略覆盖场景有限,未命中重试规则的事件会被直接丢弃。

诊断与处理方案

  • 强制刷出缓冲事件:在调用TrackEvent之后,主动调用_telemetryClient.Flush(),消费计划的函数可以在Flush后增加2-3秒的延迟,确保缓冲内的事件完成上报再结束函数执行。
  • 检查采样与配额配置:进入Application Insights控制台的「使用情况和预估成本」页面查看是否存在配额超限,再检查TelemetryConfiguration的采样规则,你可以为重要的自定义事件单独配置排除规则,避免被采样过滤。
  • 增加属性校验逻辑:在序列化customEventObject后增加长度校验,超过8000字节的内容做截断或者拆分多个属性上报,避免因长度超限被过滤。
  • 升级运行时与SDK版本:建议尽快迁移到Azure Function Runtime 4.x和.NET LTS版本,同时将Microsoft.ApplicationInsights相关NuGet包升级到最新稳定版,修复已知的遥测丢失BUG。
  • 开启SDK本地诊断日志:通过函数配置开启Application Insights SDK的诊断日志输出,SDK会将事件过滤、上报失败的具体原因记录到本地日志中,可快速定位丢失根因。
  • 自定义遥测对账逻辑:实现ITelemetryProcessor接口,在事件入队上报前做计数打点,和业务侧的事件触发次数做对账,可以快速统计丢失比例和对应的触发场景。

内容的提问来源于stack exchange,提问作者Prasad Bhokare

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 07:18:03