オペレーターを介してタプル/秒の数をキャプチャし、ファイルに記録したいと考えています。「Throttle Operator」を使用してタプル レートを自分で設定することはできません。また、もう一度付け加えておきますが、コンソールから情報を取得することについてではなく、SPL アプリケーションを介して情報を取得することについて話しているのです。
1 に答える
「このオペレーターのスループットを教えてください」という直接的な指標はありません。nTuplesProcessed
経時的にメトリックにアクセスし、そこからスループットを計算するプリミティブ オペレーターを実装できます。(利用可能なメトリクスのリスト。)しかし、実際には、次の複合演算子を使用する方がはるかに簡単だと思います。
public composite PeriodicThroughputSink(input In) {
param expression<float64> $period;
expression<rstring> $file;
graph
stream<boolean b> Period = Beacon() {
param period: $period;
}
stream<float64 throughput> Throughput = Custom(In; Period) {
logic state: {
mutable uint64 _count = 0;
float64 _period = $period;
}
onTuple In: {
++_count;
}
onTuple Period: {
if (_count > 0ul) {
submit({throughput=((float64)_count / _period)}, Throughput);
_count = 0ul;
}
}
config threadedPort: queue(Period, Sys.Wait); // ensures that the throughput calculation and file
// writing is on a different thread from the rest
// of the application
}
() as Sink = FileSink(Throughput) {
param file: $file;
format: txt;
flush: 1u;
}
}
その後、コンポジット オペレーターを「スループット タップ」として使用できます。ここでは、スループットを記録するオペレーターからのストリームを消費します。たとえば、次のように使用できます。
stream<Data> Result = OperatorYouCareAbout(In) {}
() as ResultThroughput = PeriodicThroughputSink(Result) {
param period: 5.0;
file: "ResultThroughput.txt";
}
もちろん、Result
アプリケーションの他の場所でストリームを使用することもできます。この方法は、アプリケーションのパフォーマンスに影響を与える可能性があることに注意してください。データ パスをタップしています。ただし、影響は大きくないはずです。特に、PeriodicThroughputSink
タップしているオペレーターと同じ PE にオペレーターが融合されていることを確認した場合はなおさらです。また、期間が短いほど、アプリケーションのパフォーマンスに影響を与える可能性が高くなります。
繰り返しますが、メトリックにアクセスすることで、C++ または Java プリミティブ オペレーターで同様のことを行うことができますがnTuplesProcessed
、上記のアプローチの方がはるかに簡単です。アプリケーションの外部からシステム メトリックを取得することもできます。streamtool capturestate
たとえば、 REST APIを定期的に使用するスクリプトを作成し、出力を解析して、関心nTuplesProcessed
のあるオペレーターのメトリックを見つけ、それを使用してスループットを計算することができます。しかし、この複合演算子の手法ははるかに簡単だと思います。