Riemann と Collectd を使用して、明らかに単純なカスタム構成を実行しようとしています。基本的に、2 つのストリームの比率を計算したいと思います。それを行うために、次のようなことを試しました(Rieamann APIプロジェクトの提案はこちら):
(project [(service "cahe-miss")
(service "cache-all")]
(smap folds/quotient
(with :service "ratio"
index)))
これは明らかに機能しますが、しばらくすると、ミスが計算された結果のいくつかに気付きました。ログのデバッグ後、何が起こっているかを確認して値を確認するために、次の構成を完了しました。
(project [(service "cache-miss")
(service "cache-all")]
(fn [[miss all]]
(if (or (nil? miss) (nil? all))
(do nil)
(do (where (= (:time miss) (:time all))
;to print time marks
(println (:time all))
(println (:time miss))
; to distinguish easily each event
(println "NEW LINE")
))
)
)
)
驚いたことに、collectd から新しいデータを取得するたびに (10 秒ごと)、以前の未使用のデータを再利用するように、作成した関数が 2 回実行されます。 (where (= :time....) clasue.問題は、メトリックを異なるタイムスタンプで分割していることです。前のコードの出力の下:
1445606294
1445606294
NEW LINE -- First time I get data
1445606304
1445606294
NEW LINE
1445606304
1445606304
NEW LINE -- Second time I get data
1445606314
1445606304
NEW LINE
1445606314
1445606314
NEW LINE -- Third time I get data
私が期待したようにフォーマットされたデータを取得する方法についてヒントを与えることができる人はいますか? 「プロジェクト」機能について私が理解していないことがあると思います。または、受信データが riemann で処理される方法に関連するもの。
前もって感謝します!
更新しました
私は自分の問題を解決することができましたが、それでもそれがどのように機能するかについて明確な考えはありませんが、なんとか解決しました。現在、collectd テール プラグイン (nginx ログから) から 2 つの異なるストリームを受信しており、次のようにそれらの間の商を作ることができました。
(where (or (service "nginx/counter-cacheHit") (service "nginx/counter-cacheAll"))
(coalesce
(smap folds/quotient (with :service "cacheHit" (scale (* 1 100) index)))))
私はそれを広くテストしましたが、今のところ正しい結果が得られています。しかし、私はまだいくつかのことを理解していません...まず、合体は両方のイベントが処理された後にのみデータを返すのはどうしてですか。Collectd は両方のストリームのイベントを 2 秒ごとに同じタイム マークで送信します。「合体」の代わりに「プロジェクト」を使用すると、2 秒ごとに 2 つの異なる smap が実行されます (イベントごとに 1 回)。 smap の 2 つのイベントが同じタイム マークで表示されます。これはまさに私が望んでいたことです。
最後に、分子と分母のどちらを選択する基準なのかわかりません。「where」句の「or」句が原因ですか?
とにかく、その背後にいくつかの黒魔術がありましたが、なんとか問題を解決できました ;^)
皆さん、ありがとうございました!