主機群組
在 Open-Falcon 的監控系統,主機 (host) 可以分成主機群組 (hostgroup)。 告警策略 (alarm strategy) 可以針對不同的主機群組來設置。在 Riemann ,我們也可以用帶有「主機群組」訊息的事件和索引的功能,來簡單地實現這個「根據主機群組來變化告警策略」的設置。
主機群組事件
我們定義一種特殊的事件,「主機群組事件」,它的 service 欄位是 HOSTGROUP_INFO ,然後,對於每一台主機所對應的主機群組: hostgroup1, hostgroup2, ...,我們放到 tags 這個欄位去。
於是「主機」/「主機群組」對應了 host/tags 欄位 。我們透過對 Riemann 發送這種事件,就可以把「主機群組」的資訊放進 Riemann 系統。之後就可以透過索引來查詢。
範例如下:
=> { :service "HOSTGROUP_INFO",
:host "owl-docker"
:tags ["hostgroup1", "hostgroup2"]
:ttl 86400}"
在「串流」中查詢事件對應的「主機群組」
Riemann 的 riemann.index/lookup 函數可以透過 host, service 來查詢索引,取回最新一筆的事件。
event2hostgroup 這個函數的功能是:
- 收到一個事件,先取出它對應的「主機」,將這個「主機」做為
riemann.index/lookup
函數的第一個引數。 - 將 HOSTGROUP_INFO 這個值做為
riemann.index/lookup
函數的第二個引數。 - 如此就可以取到對應的「主機群組事件」
- 再取出這個「主機群組事件」裡的 tags 欄位,就可以傳回。
(defn event2hostgroup
"find out all the hostgroups that contains the host of current event.
HOSTGROUP_INFO event describes hostgroup/host as :tags/:host field
=> { :service \"HOSTGROUP_INFO\",
:host \"owl-docker\"
:tags [\"hostgroup1\", \"hostgroup2\"]}"
[e]
(:tags (riemann.index/lookup (:index @core) (:host e) "HOSTGROUP_INFO")))
將收到的事件以「主機群組」加以分群
下列的範例,對每個接收到的事件,先算出它屬於哪個「主機群組」,然後,將主機群組的資訊存入事件的 group
欄位。(注意: group
也是自定義的欄位。)
最後,將這些事件都發送 (publish) 到 group_channel
這個 channel 。
(streams
; tags event with a group name and publish it to the group channel.
(smap (fn [e]
(when-let [groupv (f/event2hostgroup e)]
; groupv can be nil, [], [hostgroup_OWL hostgroup_CC]
(when (and (not= "HOSTGROUP_INFO" (:service e)) (seq groupv))
; not empty, pass on event to a group channel.
(assoc e :group groupv))))
(publish "group_channel")))
從 channel 中取出事件
下列的範例,從 group_channel
這個 channel 將已經在 group
欄位加上「主機群組」資訊的事件取出。
(subscribe "group_channel" #(info "show scription" %))