       (fn [[ev' ev]] (assoc ev' :metric (- (:metric ev') (:metric ev))))
       (map vector (rest l) l)))
     children))
+
+
+(defn |>| [& args] (apply > (map #(Math/abs %) args)))
+(defn |<| [& args] (apply < (map #(Math/abs %) args)))
+
+(defn maxpdiff
+  "计算最大变化率，与 aggregate 搭配使用(MAX Percentage DIFFerence)"
+  [& m]
+  (let [r (last m)]
+    (->> (map #(/ (- r %) r) m)
+         (reduce (fn [v v'] (if (> (Math/abs v') (Math/abs v)) v' v))))))
 
 
 (defn feed-dog

  创建一个发送报警的流，流经这个流的事件都会被发到 alarm 产生报警。
  接受一个 map 做参数，map 中需要可以指定如下的参数

  (! {:note \"报警标题，标题对于一个特定的报警是不能变的（不要把报警的数据编码在这里面）\"
      :level 1  ;报警级别, 0最高，6最小。报警级别影响报警方式。
      :event? false  ; 可选，是不是事件（而不是状态）。默认 false。如果是事件的话，只会发报警，不会记录状态（alarm插件里看不到）。
      :expected 233  ; 可选，期望值，暂时没用到)
      :outstanding-tags [:region :mount]  ; 可选，相关的tag，写在这里的 tag 会用于区分不同的事件，以及显示在报警内容中, 不填的话默认是所有的tag
      :groups [:operation]})  ; groups 是在规则仓库的 alarm 配置里管理的)
  "

  [from to & children]
  (apply smap #(assoc % to (from %)) children))

(defn ->difference
  "接受事件的数组，变换成另外一个事件数组。
   新的事件数组中，每一个事件的 metric 是之前相邻两个事件 metric 的差。
