首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何重构这个clojure / riemann代码

如何重构这个clojure / riemann代码
EN

Stack Overflow用户
提问于 2015-02-06 21:11:33
回答 1查看 675关注 0票数 2

我正在使用Riemann发现/学习Clojure,并编写了以下代码来聚合每个主机的CPU指标:

代码语言:javascript
复制
(streams
 (by [:host]
     smap (aggregate-cpu-metrics "user" folds/mean)
     smap (aggregate-cpu-metrics "nice" folds/mean)
     smap (aggregate-cpu-metrics "system" folds/mean)
     smap (aggregate-cpu-metrics "idle" folds/mean)
     smap (aggregate-cpu-metrics "wait" folds/mean)
     smap (aggregate-cpu-metrics "interrupt" folds/mean)
     smap (aggregate-cpu-metrics "softirq" folds/mean)
     smap (aggregate-cpu-metrics "steal" folds/mean)))


(defn aggregate-cpu-metrics
  [name, aggr]
  (where (service (re-pattern (str "cpu-[0-9]+ " name)))
      (coalesce 10
          (smap aggr
              (with :service (str "cpu-average " name) reinject)))))

为了稍微解释一下代码,我收到了这样的事件:

  • 服务"cpu-0空闲“:米制58.23
  • 服务"cpu-1空闲“:米制98.11
  • 服务"cpu-2空闲“:公制12.23

我的目标是计算平均值,然后在黎曼再弹出这个事件:

  • 服务“cpu-平均”:米制56.19

起作用了,这不是问题所在。但是,正如您在第3至第10行中所看到的,这里有很多重复的代码。我正在寻找一种方法来重构这段代码,但我被困住了。

我想用我的度量名称定义一个向量:

代码语言:javascript
复制
(def cpu-metrics ["user", "nice", "system", "idle", "interrupt", "softirq", "steal"])

...and使用它来调用smap(聚合-cpu-度量.

但我不知道该怎么做。我试过地图或多塞克,但都没有成功。

你会怎么做?

(更新/解决方案)

这是我在阅读了亚瑟的答案后,重新演绎的版本。

代码语言:javascript
复制
(streams
 (where
  (service #"^cpu-[0-9]+ ")
  (adjust
   [:service #(clojure.string/replace % #"^cpu-[0-9]+" "cpu-average")]
   (by [:host :service]
       (fixed-time-window 10 (smap folds/mean reinject))))))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-06 22:19:00

通过首先提取名称并创建新的服务名称,然后使用服务名称和主机来拆分事件流,我可能会将该函数翻转。

就像这样:

代码语言:javascript
复制
(streams 
   (where (service #"cpu-[0-9]+ ")
     (adjust [:service (fn [service] 
                         (str "cpu-average "
                              (second (clojure.string/split service #"cpu-[0-9]+ "))))]
       (by [:host :service]  ...  )))

这有一个副作用,允许在不更改监视代码的情况下在统计数据中显示任何cpu服务。如果您不想这样做,可以添加另一个where来显式地接受您想要的那些。我这里没有测试这个的设置,所以如果代码坏了,请编辑:-)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28374871

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档