我正在尝试使用 Riemann 和 Collectd 进行自定义配置,显然很简单。基本上我想计算两个流之间的比率。为了做到这一点,我尝试了类似的东西(如 Rieamann API 项目建议here):
(project [(service "cahe-miss")
(service "cache-all")]
(smap folds/quotient
(with :service "ratio"
index)))
这显然有效,但过了一段时间我注意到了一些未计算的结果。日志调试后,我完成了以下配置,以查看发生了什么并标记值:
(project [(service "cache-miss")
(service "cache-all")]
(fn [[miss all]]
(if (or (nil? miss) (nil? all))
(do nil)
(do (where (= (:time miss) (:time all))
;to print time marks
(println (:time all))
(println (:time miss))
; to distinguish easily each event
(println "NEW LINE")
))
)
)
)
令我惊讶的是,每次我从 collectd (每 10 秒)获取新数据时,我创建的函数都会执行两次,比如重用以前未使用的数据,而且看起来它根本不关心我在(where (= :time....) clasue。问题是我用不同的时间戳划分指标。下面是前面代码的一些输出:
1445606294
1445606294
NEW LINE -- First time I get data
1445606304
1445606294
NEW LINE
1445606304
1445606304
NEW LINE -- Second time I get data
1445606314
1445606304
NEW LINE
1445606314
1445606314
NEW LINE -- Third time I get data
有没有人可以提示如何按照我的预期格式化数据?我认为我对“项目”功能有些不理解。或者与在 riemann 中如何处理传入数据有关的东西。
提前致谢!
更新
我设法解决了我的问题,但我仍然不清楚它是如何工作的,但是我设法做到了。现在我从 collectd tail 插件(来自 nginx 日志)接收两个不同的流,我设法使它们之间的商如下:
(where (or (service "nginx/counter-cacheHit") (service "nginx/counter-cacheAll"))
(coalesce
(smap folds/quotient (with :service "cacheHit" (scale (* 1 100) index)))))
我已经对它进行了广泛的测试,到目前为止它产生了正确的结果。但是我仍然不明白几件事......首先,在两个事件都被处理后,coalesce 是如何只返回数据的。Collectd 每两秒以相同的时间标记发送两个流的事件,使用“project”而不是“coalesce”导致每两秒执行两次不同的 smap(每个事件执行一次),但是仅通过一次执行合并结果smap 与具有相同时间标记的两个事件,这正是我想要的。
最后,我不知道选择哪个是分子和分母的标准。是因为“where”子句中的“or”子句吗?
无论如何,背后有一些黑魔法,但我设法解决了我的问题;^)
谢谢你们!