私は特定のリモートマシンを監視する監視ツールのようなものを書いています。 マシンが稼動しているかどうか、IISがそこで実行されているかどうか、さらにいくつかのパラメータを取得します。
マシンのアップ/ダウン状態を3分ごとに監視できます。 IISの状態は〜1分ごとに監視できます。
これらのパラメータの一部が変更された場合、変更がログに記録されます(DistinctUntilChanged
)。同じであれば何もしません。他のものがいくつかの値を出している間に観測可能なものを1つだけ放出する
私はマシンの状態とIISステータスのための1つの観測可能性を作成しました。 マシンがダウンしている場合は、他のリモートパラメータを監視する必要はありません(GetIisState
に電話する必要はありません)。
SkipUntil
とTakeUntil
を使用しようとしました - マシンがダウンしている間にポーズIisObservable
をソートしようとしました。 しかし、私はそれが欲しいとはうまくいきません。ここで
は、私のマシンの状態が観測可能である:
machineStateObservable = Observable.Interval(TimeSpan.FromSeconds(180))
.StartWith(-1)
.Select(async it => new {Order = it, State = await GetMachineStateAsync(machine)})
.Switch()
.Do(it =>
{
if (it.Order == -1) // write initial state 1st time
{
var state = it.State ? "up" : "down";
var msg = $"{machine.Name}: Machine initial state: {state}";
Log.Info(msg);
}
})
.Select(it => it.State);
machineStateObservable
.DistinctUntilChanged()
.Buffer(2, 1).Where(it => it.Count == 2)
.Subscribe(it => Log.Info($"{machine.Name}: MachineState got changed from {it[0]} to: {it[1]}")
, ex => Log.Error(ex, "Unhandled exception!"));
にはどうすればmachineStateObservable
は、マシンがダウンしていることを示している間、それが通知を発しないであろう(その結果GetIisState
を呼び出すことはありません)というIisObservable
を定義する必要がありますか?
更新:
ここでは、私が@Enigmativityの助けを借りに来たソリューションです:
IisStateObservable = MachineStateObservable
.Select(state => state
? Observable.Interval(TimeSpan.FromSeconds(2)).StartWith(0)
.SelectMany(it => Readings.GetServiceStateAsync())
: Observable.Never<string>())
.Switch()
.Publish();
「GetIisState」の呼び出しはどこですか? – Enigmativity
これは、IISの状態を返すための非同期メソッドです。 – IgorStack