【问题标题】:Comparing event and adding new field in Riemann比较事件并在黎曼中添加新字段
【发布时间】:2015-07-16 19:24:48
【问题描述】:

我正面临一种情况。假设我有 3 个事件 A、B 和 C,我将它们传递给 Riemann。

事件 A 有以下字段 :考试编号 3890 :考试成绩通过 :排名 8
事件 B 具有以下字段 :考试编号 3890 :考试成绩通过 :排名 5
事件 C 具有以下字段 :考试编号 3890 :ExamResult 失败 :排名 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
            }
         )))))

因为我是 Riemann 的新手。我无法弄清楚这个问题。

【问题讨论】:

    标签: clojure riemann


    【解决方案1】:

    我从未使用过 Riemann,但由于您想修改现有事件,您可能应该使用 with,如 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))
    

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

    【讨论】:

    • @Magnoski 不应该有一个prn 函数,例如作为smap 的子函数,看看打印了什么事件?我想知道您为了重现测试而进行测试/调试的方法是什么。
    • (let [examindex (default :ttl 300 (update-index (index)))] (streams prnexamindex)) 我正在打印索引知道。那行不通
    • @Mangoski 据我了解,除非您明确reinject 他们,否则新事件将不可见。希望对您有所帮助。
    • 它的工作真棒,但是当我尝试动态添加字段 :Eligible-Status 和 :Gradevalue 但字段的值没有通过而不是我得到字段名称时我的活动。如何动态添加值
    猜你喜欢
    • 1970-01-01
    • 2016-02-14
    • 2016-03-19
    • 1970-01-01
    • 1970-01-01
    • 2015-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多