调用TelemetryClient的GetMetric方法报维度数量不匹配错误如何解决
错误成因
你遇到的报错 Attempted to get a metric series by specifying 2 dimension(s), but this metric has 3 dimensions 由Microsoft.ApplicationInsights组件的指标维度缓存机制触发:TelemetryClient.GetMetric 方法会对同一个metricId的维度配置做进程内全局缓存,首次调用某个metricId的GetMetric方法时传入的维度数量会被固定为该指标的维度数,后续所有同metricId的调用必须传入相同数量的维度名称,否则就会抛出维度不匹配错误。
常见触发场景包括:
- 项目内其他代码已经用相同的
metricId调用过GetMetric,且首次调用时传入了3个维度名称,你当前代码仅传2个维度就会触发报错 - 之前运行的程序进程没有完全退出,旧的维度缓存仍驻留在内存中,修改代码后重新运行时复用了旧的缓存配置
- 项目对
TelemetryClient做了二次封装,通用逻辑默认给所有指标追加了第三个隐藏维度(比如环境标识、服务名等),你手动传入的2个维度加上自动追加的维度总数为3,和声明的2个维度冲突
排查解决步骤
- 全局搜索项目内所有使用报错
metricId的GetMetric调用,核对所有调用传入的维度名称数量是否统一:如果存在其他调用传入了3个维度,可统一调整为相同的2个维度,或在当前代码中补充缺少的第三个维度即可
- 完全停止当前运行的程序/调试进程,清理项目编译缓存后重新启动运行,排除旧缓存导致的偶发问题
- 检查项目中
TelemetryClient的二次封装逻辑,确认是否存在自动追加额外维度的逻辑,如果有需要在调用GetMetric时显式声明所有维度(包括自动追加的维度) - 如果需要动态调整指标维度,可改用
TrackMetric方法直接上报遥测,绕过维度缓存校验,参考代码如下:
public virtual void GetMetric(string metricId, double metricValue, string source = "", string cId = "") { var metricTelemetry = new MetricTelemetry(metricId, metricValue); metricTelemetry.Properties["Source"] = string.IsNullOrEmpty(source) ? "NA" : source; metricTelemetry.Properties["CorrelationId"] = string.IsNullOrEmpty(cId) ? "NA" : cId; this.TelemetryClient.TrackMetric(metricTelemetry); }
内容的提问来源于stack exchange,提问作者n1k1
相关产品推荐
相关产品推荐

