比较事件并在黎曼中添加新字段

Comparing event and adding new field in Riemann

我面临一种情况。假设我要将 3 个事件 A、B 和 C 传递给黎曼。

事件 A 有以下字段 :考试编号 3890 :考试成绩合格 :等级 8
事件 B 有以下字段 :考试编号 3890 :考试成绩合格 :等级 5
事件 C 有以下字段 :考试编号 3890 :考试成绩不及格 :等级0

我需要比较基于 ExamNo 的事件,每当 ExamResult 发生变化时,我需要向事件 {:Eligible, :Grade} 添加一个新字段。我编写了代码来比较事件,但新字段没有添加到事件中。

(let [examindex (default :ttl 300 (update-index (index)))]
  (streams
    prn
    examindex))

(streams
  (where (service "Result")
    (smap
          (fn [events]
        (by[:ExamNo]
        (changed :ExamResult))
        (event
            {    :Eligible :Eligible-Status
                 :Grade     :GradeValue
            }
         )))))

由于我是黎曼新手。我无法弄清楚这个问题。

我从来没有用过黎曼,但既然你想修改现有的事件,你可能应该使用 with, as explained here,而不是 event。顺便说一下,事件是不可变的,因此您实际上是在旧值的基础上创建新值。

您应该尝试缩进您的代码:请注意 (event ...) 表单未包含在 (changed ...) 下,尽管它可能应该包含在内。

测试

我在配置文件中只使用了这个streams声明:

(streams
 (where (service "Result")
    (by :ExamNo
      (changed :ExamResult
        (with {:Eligible :Eligible-Status
               :Grade    :GradeValue  }
          prn)))))))

我删除了 smap 并添加了 prn 语句。 为了对此进行测试,我连接到 nREPL 客户端并从那里触发事件。首先,让我们定义一个 TCP 客户端。

(def tcp-client (riemann.client/tcp-client))

然后,发送第一个没有 :ExamResult 值的事件:

(riemann.client/send-event tcp-client
  (riemann.common/event {:service "Result" :ExamNo "4"}))

服务器未打印任何内容。然后,我为相同的 ExamNo 发送一个新事件,结果为:

(riemann.client/send-event tcp-client
  (riemann.common/event {:service "Result" :ExamNo "4" :ExamResult "result"}))

由于自上次活动以来考试编号“4”的结果发生变化,我们建立了一个新活动。 运行 Riemann 服务器在其标准输出中输出以下内容:

#riemann.codec.Event{:host "localhost", :service "Result", :state nil, 
:description nil, :metric nil, :tags nil, :time 1437035833,
:ttl nil, :Grade :GradeValue, :Eligible :Eligible-Status, 
:ExamNo "4", :ExamResult "x"}

重新注入

如果我使用 reinject 而不是 prn,并且如果我恢复之前省略的行:

(let [examindex (default :ttl 300 (update-index (index)))]
  (streams
    prn
    examindex))

...然后显示所有事件,特别是重新注入的新事件。此行为可能是您最初期望的行为。