<commit_before># 说明

这一份文档应该是放在规则仓库中的，所有的路径都是以规则仓库为根目录，也就是项目中的 `satori-rules`。
如果你是在规则仓库中看到的这个文档，这个说明可以忽略。

# 添加规则

规则需要放在 `rules` 文件夹的一个子文件夹中，推荐直接复制一个已有的文件在这之上修改。
规则中的以 `-rules` 结尾的函数（或者 riemann 的流，其实都一样）会自动添加到 riemann 中。

比如，我想添加一个 `foo/bar.clj` 作为 foo 服务下关于 bar 的监控，
那么就随便找一个文件夹中的规则（最外层的不行！），然后修改 ns 和规则的名字
（推荐 Copy & Paste！代码很容易看懂但是写起来可能很麻烦）

```clojure
(ns infra.memcache ; 这里要修改
  (:use riemann.streams
        agent-plugin
        alarm))

(def infra-memcache-rules ; 这里名字要修改
  (where (host #"cache\d+$") ; 规则当然也要改
    (plugin-dir "memcache")
    (plugin-metric "net.port.listen" 30 {:port 11211})

    (where (and (service "net.port.listen")
                #(= (:port %) 11211))
      (by :host
        (set-state-gapped (< 1) (> 0)
          (should-alarm-every 120
            (! {:note "memcache 端口不监听了！"
                :level 0
                :groups [:operation :api]})))))))
```

修改成

```clojure
(ns foo.bar
  (:use riemann.streams
        agent-plugin
        alarm))

(def foo-bar-rules ; 随便叫什么但是一定要以 -rules 结尾
  (where (host "host-which-run-foo-bar")
    (plugin-dir "foo/bar") ; 要运行 foo/bar 目录里的插件
    (plugin-metric "net.port.listen" 30 {:port 12345}) ; 运行 net.port.listen 插件，30秒一次，以及参数

    (where (and (service "net.port.listen")
                #(= (:port %) 12345)) ; 匹配 net.port.listen 插件收集的 metric
      (by :host ; 按照 host 分成子流（这个例子里就只有一个 host 所以并不会分）
        (set-state-gapped (< 1) (> 0)  ; 根据条件设置事件的 :state
          (should-alarm-every 120  ; 如果是 :problem 每120秒发一次报警。<commit_msg>Fix bug in doc<commit_after># 说明

这一份文档应该是放在规则仓库中的，所有的路径都是以规则仓库为根目录，也就是项目中的 `satori-rules`。
如果你是在规则仓库中看到的这个文档，这个说明可以忽略。

# 添加规则

规则需要放在 `rules` 文件夹的一个子文件夹中，推荐直接复制一个已有的文件在这之上修改。
规则中的以 `-rules` 结尾的函数（或者 riemann 的流，其实都一样）会自动添加到 riemann 中。

比如，我想添加一个 `foo/bar.clj` 作为 foo 服务下关于 bar 的监控，
那么就随便找一个文件夹中的规则（最外层的不行！），然后修改 ns 和规则的名字
（推荐 Copy & Paste！代码很容易看懂但是写起来可能很麻烦）

```clojure
(ns infra.memcache ; 这里要修改
  (:use riemann.streams
        agent-plugin
        alarm))

(def infra-memcache-rules ; 这里名字要修改
  (where (host #"cache\d+$") ; 规则当然也要改
    (plugin-dir "memcache")
    (plugin-metric "net.port.listen" 30 {:port 11211})

    (where (and (service "net.port.listen")
                #(= (:port %) 11211))
      (by :host
        (set-state-gapped (< 1) (> 0)
          (should-alarm-every 120
            (! {:note "memcache 端口不监听了！"
                :level 0
                :groups [:operation :api]})))))))
```

修改成

```clojure
(ns foo.bar
  (:use riemann.streams
        agent-plugin
        alarm))

(def foo-bar-rules ; 随便叫什么但是一定要以 -rules 结尾
  (where (host "host-which-run-foo-bar")
    (plugin-dir "foo/bar") ; 要运行 foo/bar 目录里的插件
    (plugin-metric "net.port.listen" 30 {:port 12345}) ; 运行 net.port.listen 插件，30秒一次，以及参数

    (where (and (service "net.port.listen")
                (= (:port event) 12345)) ; 匹配 net.port.listen 插件收集的 metric
      (by :host ; 按照 host 分成子流（这个例子里就只有一个 host 所以并不会分）
        (set-state-gapped (< 1) (> 0)  ; 根据条件设置事件的 :state
          (should-alarm-every 120  ; 如果是 :problem 每120秒发一次报警。
{'fraction_non_alphanumeric': 0.14729194187582562, 'fraction_numerical': 0.026420079260237782, 'mean_word_length': 2.8052763819095476, 'pattern_counts': {'":': 0, '<': 7, '<?xml version=': 0, '>': 7, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '6049610', 'n_tokens_mistral': 1661, 'n_tokens_neox': 1697, 'n_words': 259}