比较事件并在黎曼中添加新字段
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))
...然后显示所有事件,特别是重新注入的新事件。此行为可能是您最初期望的行为。
我面临一种情况。假设我要将 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))
...然后显示所有事件,特别是重新注入的新事件。此行为可能是您最初期望的行为。