2

我正在尝试使用 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”子句吗?

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

谢谢你们!

4

1 回答 1

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

这接受一个固定的事件窗口,计算该块的比率并发出一个包含该比率作为度量的事件。那么如果指标不好,它就会叫我松懈。

于 2015-10-23T21:04:58.473 回答