Kusto流式摄入异常排查:Azure Functions从Event Hub到ADX部分记录失败
部分Event Hub记录摄入ADX失败,错误码80131500排查方案
针对你遇到的部分记录摄入ADX失败、抛出CreateRowStoreValueFromStream错误码80131500的问题,核心原因大概率是数据类型不匹配或特殊数据结构不兼容,以下是具体排查和解决方向:
1. 检查ADX表testTable的字段类型定义
你的Model中Details字段是object?类型,反序列化后会对应任意JSON结构。如果ADX表中Details列的类型不是dynamic,而是string或其他固定类型,就会导致部分结构复杂的记录无法被ADX解析。
- 执行Kusto命令查看表结构:
.show table testTable schema - 确保
Details列类型为dynamic,如果不是,修改表结构:.alter table testTable alter column Details dynamic
2. 排查Details字段的实际内容差异
虽然反序列化成功,但部分记录的Details可能包含ADX无法处理的内容:
- 嵌套过深的JSON结构
- 包含特殊数值(如NaN、Infinity)
- 非标准JSON格式的.NET对象(比如包含循环引用)
- 在函数中添加日志,输出失败记录的
Details内容,对比成功/失败记录的差异:foreach (EventData eventData in events) { string data = Encoding.UTF8.GetString(eventData.EventBody.ToArray()); var obj = JsonConvert.DeserializeObject<Model>(data); try { await output.AddAsync(obj); } catch (Exception ex) { log.LogError($"Ingestion failed for Id: {obj?.Id}, Details: {JsonConvert.SerializeObject(obj?.Details)}, Error: {ex.Message}"); throw; } }
3. 验证Time字段的时间格式兼容性
ADX对datetime类型的解析有严格要求,部分记录的时间格式可能不符合标准:
- 确保Event Hub中的时间字符串是ISO 8601格式(如
2024-05-20T12:34:56Z) - 反序列化时强制指定时区为UTC,避免时区转换问题:
var obj = JsonConvert.DeserializeObject<Model>(data, new JsonSerializerSettings { DateTimeZoneHandling = DateTimeZoneHandling.Utc });
4. 检查ADX流式摄入的配额限制
流式摄入对单条记录的大小、批次大小有配额限制:
- 单条记录大小不能超过4MB
- 单批次大小不能超过100MB
如果失败记录的Details字段过大,可能触发配额限制,导致摄入失败。
内容的提问来源于stack exchange,提问作者DxG
相关产品推荐
相关产品推荐

