核心觀念
設置檔 (configuration)
Riemann 的設置檔,本身就是 clojure programm。 Riemann 透過了這種「設置檔即為程式原始碼」(configuration-as-code) 的設計,極小化了所有模板架構程式碼 (bolierplate) ,同時也提供了極高的彈性。
事件 (event)
事件 (event) 在 Riemann 中是用 clojure 語言的 immutable map 來表現。
基本欄位 | 意義 |
---|---|
host | 主機名稱。 e.g. "api1", "foo.com" |
service | 服務名稱。e.g. "API port 8000 reqs/sec" |
state | 任何少於 255bytes 的字串。e.g. "ok", "warning", "critical" |
time | 時間。使用 unix epoch seconds |
description | 自由形式的字串 |
tags | 字串的 list 。例如:["rate", "fooproduct", "transient"] |
metric | 事件的數值。e.g. the number of reqs/sec |
ttl | 單位為秒。這個事件「有效」的期間。逾時的話,事件可能會被從索引移除。 |
串流 (streams)
串流 (stream) 在 Riemann 中是用 clojure 語言的 function 來表現。你可以利用 Riemann 內建的各式各樣的「串流函數」(streams ...)
,或是寫你自己需要的「串流函數」
值得注意的一點是:如果你去看 Riemann 的 API 文件,去看各種串流函數的實作,這些串流函數(streams ...)
往往都會傳回一個 lambda function,而這個 lambda function 的定義通常是如下的形式:
(fn stream [event]
(call-rescue event (cons child children)))
在本文中,理解 stream 時,讀者需要去分清楚,此時所講的 stream 是哪一種語意?一種語意是 API 文件中的「串流函數」,本身常常可以接收其它串流函數,會傳回一個 lambda 。另一種語意則是如上述的 lambda 。
你可以想象 (streams)
是最高層次的「串流」,所有的事件 (event) 都會從它流過。在後續的文件中,我們常常省去「串流」不寫,視它為理所當然。
streams 比對條件、寄信範例
這邊有一個簡單的串流範例,它會對任何service
以"riak"
開頭的事件,送出「狀態(state
)」為critical
的事件,到 "[email protected]"
這個電子郵件信箱。
(streams
(where (and (service #"^riak")
(state "critical"))
(email "[email protected]")))
streams 分流範例
(by [:host :service])
streams 偵測狀態改變範例
(by [:host :service]
(changed :state))
streams 避免過多告警範例
(by [:host :service]
(changed :state
(rollup 5 3600
(email "[email protected]"))))