clojure Riemann项目集合
我正在尝试使用Riemann和Collectd进行一个显然很简单的自定义配置。基本上我想计算两条流之间的比率。为了做到这一点,我尝试了以下方法(如Riemann API项目建议): 这显然有效,但过了一段时间,我注意到miss计算的一些结果。日志调试后,我完成了以下配置,以便查看发生了什么并输入值:clojure Riemann项目集合,clojure,riemann,Clojure,Riemann,我正在尝试使用Riemann和Collectd进行一个显然很简单的自定义配置。基本上我想计算两条流之间的比率。为了做到这一点,我尝试了以下方法(如Riemann API项目建议): 这显然有效,但过了一段时间,我注意到miss计算的一些结果。日志调试后,我完成了以下配置,以便查看发生了什么并输入值: (project [(service "cache-miss") (service "cache-all")] (fn [[miss all]] (if (or (n
(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秒一次),我创建的函数都会执行两次,就像重用以前未使用的数据一样,而且看起来它根本不关心(其中(=: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 plugin(来自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子句吗
不管怎么说,背后有一些黑魔法,但我设法解决了我的问题;^)
谢谢大家! 以不同速率移动的数据流之间的比率对我来说并不合适。此后,我决定在固定时间间隔或移动时间间隔内计算比率和费率。通过这种方式,您可以捕获时间块中事件的一致快照,并在此期间进行计算。以下是比较服务接收事件的速率与转发事件的速率时省略的代码:
(moving-time-window 30 ;; seconds
(smap (fn [events]
(let [in (or (->> events
(filter #(= (:service %) "event-received"))
count)
0)
out (or (->> events
(filter #(= (:service %) "event-sent"))
count)
0)
flow-rate (float (if (> in 0) (/ out in) 0))]
{:service "flow rate"
:metric flow-rate
:host "All"
:state (if (< flow-rate 0.99) "WARNING" "OK")
:time (:time (last events))
:ttl default-interval}))
(tag ["some" "tags" "here"] index)
(where (and
(< (:metric event) 0.9)
(= (:environment event) "production"))
(throttle 1 3600 send-to-slack))))
(移动时间窗口30;;秒
(smap(fn[事件]
(让[进入(或(->>事件
(过滤器#(=(:服务%“已接收事件”))
计数)
0)
输出(或(->>事件)
(筛选器(=(:服务%“已发送事件”))
计数)
0)
流量(浮动(如果(>输入0)(/输出输入0))]
{:服务“流量”
:公制流速
:主机“全部”
:状态(如果(<流速0.99)“警告”“正常”)
:时间(:时间(上次事件))
:ttl默认间隔})
(标记[“某些”标记“此处”]索引)
(其中)
(<(:公制事件)0.9)
(=(:环境事件)“生产”))
(节气门1 3600发送到松弛位置)))
这将接收固定的事件窗口,计算该块的比率,并发出一个包含该比率作为度量的事件。如果度量值不好,它会叫我松弛 嗨,亚瑟,对不起,我之前无法发表评论。我无法运行您的建议,我有一个例外,我将不得不仔细查看,但是这对我来说并不是真正的功能,因为您正在计算事件,并与该计数器进行比率计算。我的情况略有不同。我试图在两个流的度量范围内建立一个比率,这两个流具有完全相同的时间标记。我试图使两个不同流的商混合形成相同的collectd插件(在这种情况下是tails插件)。谢谢你,你的选择启发了我。
(moving-time-window 30 ;; seconds
(smap (fn [events]
(let [in (or (->> events
(filter #(= (:service %) "event-received"))
count)
0)
out (or (->> events
(filter #(= (:service %) "event-sent"))
count)
0)
flow-rate (float (if (> in 0) (/ out in) 0))]
{:service "flow rate"
:metric flow-rate
:host "All"
:state (if (< flow-rate 0.99) "WARNING" "OK")
:time (:time (last events))
:ttl default-interval}))
(tag ["some" "tags" "here"] index)
(where (and
(< (:metric event) 0.9)
(= (:environment event) "production"))
(throttle 1 3600 send-to-slack))))