clojure Riemann项目集合

clojure Riemann项目集合,clojure,riemann,Clojure,Riemann,我正在尝试使用Riemann和Collectd进行一个显然很简单的自定义配置。基本上我想计算两条流之间的比率。为了做到这一点,我尝试了以下方法(如Riemann API项目建议): 这显然有效,但过了一段时间,我注意到miss计算的一些结果。日志调试后,我完成了以下配置,以便查看发生了什么并输入值: (project [(service "cache-miss") (service "cache-all")] (fn [[miss all]] (if (or (n

我正在尝试使用Riemann和Collectd进行一个显然很简单的自定义配置。基本上我想计算两条流之间的比率。为了做到这一点,我尝试了以下方法(如Riemann API项目建议):

这显然有效,但过了一段时间,我注意到miss计算的一些结果。日志调试后,我完成了以下配置,以便查看发生了什么并输入值:

(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))))