如何在Grafana(Graphite)中基于两个序列生成未解决缺陷时间序列?
我完全懂你的困扰——Graphite默认函数里确实没有直接“调用前一个数据点”的选项,但咱们可以换个思路,用累计净变化+初始值的方式完美复现你Excel里的公式逻辑,和你要的上期未解决数+当期新增数-当期关闭数完全一致。
核心逻辑拆解
Excel的公式本质是每天计算累计净变化:当天的未解决数 = 初始未解决数 + 所有历史天数的(新增-关闭)之和。Graphite的cumulativeSum函数正好能帮我们实现这个累计求和的操作。
具体实现步骤
假设你的新增缺陷序列是defects.daily.added,关闭缺陷序列是defects.daily.closed,按以下步骤构建查询:
计算每日净变化
先算出每天新增与关闭的差值,这就是当天未解决数的变化量:defects.daily.added - defects.daily.closed累计净变化求和
用cumulativeSum对每日净变化做累加,得到从时间序列起始点开始的累计变化量:cumulativeSum(defects.daily.added - defects.daily.closed)加入初始未解决数(可选但重要)
如果在你的时间序列开始记录之前,已经存在未解决的缺陷,需要把这个初始值加进去。比如初始值是100,就用addSeries函数:addSeries(cumulativeSum(defects.daily.added - defects.daily.closed), 100)处理负数情况(可选)
避免某天关闭的缺陷比新增的多,导致未解决数出现负数,用nonNegative函数确保数值≥0:nonNegative(addSeries(cumulativeSum(defects.daily.added - defects.daily.closed), 100))处理缺失数据(可选)
如果某天没有新增/关闭数据,Graphite会显示null,可能影响计算。用fillNull(0)把null替换为0:nonNegative(addSeries(cumulativeSum(fillNull(defects.daily.added, 0) - fillNull(defects.daily.closed, 0)), 100))
为什么这个方法有效?cumulativeSum会自动把每一天的净变化(新增-关闭)累加起来,等价于每天的未解决数 = 前一天的未解决数 + 当天新增 - 当天关闭,和你Excel里的公式逻辑完全匹配。
内容的提问来源于stack exchange,提问作者user721476

