主機群組

在 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 這個函數的功能是:

  1. 收到一個事件,先取出它對應的「主機」,將這個「主機」做為riemann.index/lookup 函數的第一個引數。
  2. 將 HOSTGROUP_INFO 這個值做為 riemann.index/lookup 函數的第二個引數。
  3. 如此就可以取到對應的「主機群組事件
  4. 再取出這個「主機群組事件」裡的 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" %))

results matching ""

    No results matching ""