clojure Riemann项目收集

时间:2015-10-23 14:02:35

标签: clojure riemann

我正在尝试使用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执行(每个事件一次),但是只有一次执行才能合并结果这两个事件的时间标记相同,这正是我想要的。

最后,我不知道选择哪个是分子和分母的标准。它是否属于“where”条款中的“或”条款?

无论如何,背后有一些blackmagic,但我设法解决了我的问题; ^)

谢谢大家!

1 个答案:

答案 0 :(得分:0)

采用不同速率移动的流之间的比率对我来说不起作用。我已经决定在固定时间间隔或移动时间间隔内计算比率和比率。这样,您可以捕获时间块中事件的一致快照并对其进行计算。以下是将服务接收事件的速率与转发事件的速率进行比较的一些省略代码:

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

这会占用固定的事件窗口,计算该块的比率,并发出包含该比率的事件作为其指标。然后,如果度量标准是坏的,它会让我松懈。