nstream.reflect.agent.MetaRouterAgent Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of nstream-reflect Show documentation
Show all versions of nstream-reflect Show documentation
Web Agent introspection runtime
The newest version!
// Copyright 2015-2024 Nstream, inc.
//
// Licensed under the Redis Source Available License 2.0 (RSALv2) Agreement;
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://redis.com/legal/rsalv2-agreement/
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package nstream.reflect.agent;
import nstream.reflect.MetaRouter;
import nstream.reflect.model.ProcessStats;
import nstream.reflect.model.RouterStats;
import nstream.reflect.model.StoreStats;
import nstream.reflect.model.SystemStats;
import swim.api.lane.DemandLane;
import swim.api.lane.function.OnCue;
import swim.api.warp.WarpUplink;
import swim.uri.Uri;
public abstract class MetaRouterAgent extends MetaCellAgent {
protected final RouterStats routerTotal = new RouterStats();
protected final RouterStats routerDelta = new RouterStats();
protected final StoreStats storeTotal = new StoreStats();
protected final StoreStats storeDelta = new StoreStats();
volatile DemandLane routerStats;
volatile DemandLane storeStats;
volatile DemandLane processStats;
volatile DemandLane systemStats;
public MetaRouterAgent() {
// nop
}
@Override
public abstract MetaRouter meta();
@Override
protected void openLanes() {
super.openLanes();
final DemandLane routerStats = demandLane()
.valueForm(RouterStats.form())
.observe(new MetaRouterStatsController(this));
openLane(ROUTER_STATS_URI, routerStats);
this.routerStats = routerStats;
final DemandLane storeStats = demandLane()
.valueForm(StoreStats.form())
.observe(new MetaStoreStatsController(this));
openLane(STORE_STATS_URI, storeStats);
this.storeStats = storeStats;
final DemandLane processStats = demandLane()
.valueForm(ProcessStats.form())
.observe(new MetaProcessStatsController(this));
openLane(PROCESS_STATS_URI, processStats);
this.processStats = processStats;
final DemandLane systemStats = demandLane()
.valueForm(SystemStats.form())
.observe(new MetaSystemStatsController(this));
openLane(SYSTEM_STATS_URI, systemStats);
this.systemStats = systemStats;
}
public RouterStats routerStats() {
return this.routerTotal.get();
}
public void setRouterStats(RouterStats stats) {
stats.supersede(this.routerTotal, this.routerDelta);
didUpdateStats();
}
public void accumulateRouterStats(RouterStats stats) {
this.routerTotal.accumulate(stats);
this.routerDelta.accumulate(stats);
didUpdateStats();
}
protected void bubbleRouterStats() {
final MetaRouter metaParent = meta().metaParent();
if (metaParent != null) {
final MetaRouterAgent parentAgent = metaParent.metaAgent();
parentAgent.accumulateRouterStats(this.routerDelta.getAndReset());
}
}
protected void cueRouterStats() {
final DemandLane routerStats = this.routerStats;
if (routerStats != null) {
routerStats.cue();
}
}
public StoreStats storeStats() {
return this.storeTotal.get();
}
public void storeDidCommit(long commitSize) {
this.storeTotal.didCommit(commitSize);
this.storeDelta.didCommit(commitSize);
didUpdateStats();
}
public void storeDidCompact() {
this.storeTotal.didCompact();
this.storeDelta.didCompact();
didUpdateStats();
}
public void setStoreStats(StoreStats stats) {
stats.supersede(this.storeTotal, this.storeDelta);
didUpdateStats();
}
public void accumulateStoreStats(StoreStats stats) {
this.storeTotal.accumulate(stats);
this.storeDelta.accumulate(stats);
didUpdateStats();
}
protected void bubbleStoreStats() {
final MetaRouter metaParent = meta().metaParent();
if (metaParent != null) {
final MetaRouterAgent parentAgent = metaParent.metaAgent();
parentAgent.accumulateStoreStats(this.storeDelta.getAndReset());
}
}
protected void cueStoreStats() {
final DemandLane storeStats = this.storeStats;
if (storeStats != null) {
storeStats.cue();
}
}
@Override
public void bubbleStats() {
super.bubbleStats();
bubbleStoreStats();
bubbleRouterStats();
}
@Override
public void cueStats() {
super.cueStats();
cueStoreStats();
cueRouterStats();
}
public ProcessStats processStats() {
return meta().processStats();
}
public SystemStats systemStats() {
return meta().systemStats();
}
public void cueSystemStats() {
final DemandLane processStats = this.processStats;
if (processStats != null) {
processStats.cue();
}
final DemandLane systemStats = this.systemStats;
if (systemStats != null) {
systemStats.cue();
}
}
static final Uri ROUTER_STATS_URI = Uri.parse("routerStats");
static final Uri STORE_STATS_URI = Uri.parse("storeStats");
static final Uri PROCESS_STATS_URI = Uri.parse("processStats");
static final Uri SYSTEM_STATS_URI = Uri.parse("systemStats");
}
final class MetaRouterStatsController implements OnCue {
final MetaRouterAgent agent;
MetaRouterStatsController(MetaRouterAgent agent) {
this.agent = agent;
}
@Override
public RouterStats onCue(WarpUplink uplink) {
return this.agent.routerStats();
}
}
final class MetaStoreStatsController implements OnCue {
final MetaRouterAgent agent;
MetaStoreStatsController(MetaRouterAgent agent) {
this.agent = agent;
}
@Override
public StoreStats onCue(WarpUplink uplink) {
return this.agent.storeStats();
}
}
final class MetaProcessStatsController implements OnCue {
final MetaRouterAgent agent;
MetaProcessStatsController(MetaRouterAgent agent) {
this.agent = agent;
}
@Override
public ProcessStats onCue(WarpUplink uplink) {
return this.agent.processStats();
}
}
final class MetaSystemStatsController implements OnCue {
final MetaRouterAgent agent;
MetaSystemStatsController(MetaRouterAgent agent) {
this.agent = agent;
}
@Override
public SystemStats onCue(WarpUplink uplink) {
return this.agent.systemStats();
}
}