VictoriaMetrics increase()函数输出值过高问题求助
1. 时间戳格式是否出错
你用的是毫秒级时间戳,但VictoriaMetrics默认处理的是秒级Unix时间戳。如果直接把毫秒数传入,VM会将其识别为秒数,相当于把样本时间往后推了1000倍,导致窗口计算时包含大量不属于当前周期的样本,甚至同一序列的多周期数据被重复统计,sum后的数值自然会偏高。
验证方式:把时间戳除以1000取整转成秒级再发送,观察sum结果是否回归预期。
2. Counter是否存在隐性重置
虽然你说计数器单调递增,但要逐个确认100个label对应的序列是否都严格递增:
- 有没有CSV读取错误,比如重复行、漏行导致某个序列的counter值突然回落(比如上一次发12,下一次发6)?
- 程序重启或CSV重新加载时,有没有重置某几个序列的counter?
当Counter出现回退时,VM会判定为计数器重置,increase函数会把回退后的数值直接加到增量中(比如从12回退到6,下一次到12时,increase会算成12-0=12,而非12-12=0),多个这类异常序列累加后,sum值会远超预期。
验证方式:用metric{label="xxx"}查看单个label的时间序列,检查数值是否全程单调递增。
3. 暴露格式是否符合规范
检查生成的字符串是否严格遵循Prometheus文本格式:
- label值必须用双引号包裹:
metric_name{label="label_value"},如果漏加双引号,VM可能解析错误,导致label值被截断、识别为语法元素,甚至不同label被合并成同一序列、同一label被拆成多个序列,最终sum时重复统计。 - 数值部分是否为合法的整数/浮点数,有没有多余字符?
- 每行结构是否严格为
metric_name{labels} value timestamp,无多余换行或特殊字符?
验证方式:把生成的暴露字符串用curl直接发送到VM的/api/v1/import/prometheus接口,查看导入后的序列是否正常。
4. 样本是否存在重复或乱序
有没有可能程序发送时,同一时间戳的样本被重复发送(比如网络重试导致同一份样本被VM多次接收)?或者样本时间戳乱序(后发的样本时间戳更早)?这些都会导致Counter时序异常,increase计算时错误累加。
验证方式:通过VM的/api/v1/series接口,检查每个label对应的样本数量是否和发送次数匹配(2分钟应对应12个样本)。
内容的提问来源于stack exchange,提问作者hitesh chavhan

