package org.radargun.stages.monitor;
import org.radargun.DistStageAck;
import org.radargun.config.Property;
import org.radargun.config.Stage;
import org.radargun.reporting.Timeline;
import org.radargun.stages.AbstractDistStage;
import org.radargun.state.MasterState;
import org.radargun.sysmonitor.AbstractMonitors;
import org.radargun.sysmonitor.CpuUsageMonitor;
import org.radargun.sysmonitor.GcMonitor;
import org.radargun.sysmonitor.InternalsMonitor;
import org.radargun.sysmonitor.MasterMonitors;
import org.radargun.sysmonitor.MemoryUsageMonitor;
import org.radargun.sysmonitor.NetworkBytesMonitor;
import org.radargun.sysmonitor.OpenFilesMonitor;
import org.radargun.sysmonitor.SlaveMonitors;
import org.radargun.traits.InjectTrait;
import org.radargun.traits.InternalsExposition;
import org.radargun.traits.JmxConnectionProvider;
import org.radargun.utils.TimeConverter;
/**
*
* Starts collecting JVM statistics locally on master and each slave node.
* {@link SlaveMonitors}
*
* @author Alan Field <afield@redhat.com>
*/
@Stage(doc = "Starts collecting statistics locally on master and each slave node.", deprecatedName = "jvm-monitor-start")
public class MonitorStartStage extends AbstractDistStage {
@Property(doc = "Specifies the network interface where statistics are gathered. "
+ "If not specified, then statistics are not collected.")
private String interfaceName;
@Property(doc = "Period of statistics collection. The default is 1 second.", converter = TimeConverter.class)
private long period = 1000;
@InjectTrait
private JmxConnectionProvider jmxConnectionProvider;
@InjectTrait
private InternalsExposition internalsExposition;
@Override
public void initOnMaster(MasterState masterState) {
super.initOnMaster(masterState);
MasterMonitors masterMonitors = masterState.get(MasterMonitors.MONITORS) == null ? new MasterMonitors(masterState, period)
: (MasterMonitors) masterState.get(MasterMonitors.MONITORS);
addMonitors(masterMonitors, masterState.getTimeline());
masterMonitors.start();
}
@Override
public DistStageAck executeOnSlave() {
SlaveMonitors slaveMonitors = slaveState.get(SlaveMonitors.MONITORS) == null ? new SlaveMonitors(slaveState, period)
: (SlaveMonitors) slaveState.get(SlaveMonitors.MONITORS);
addMonitors(slaveMonitors, slaveState.getTimeline());
if (internalsExposition != null) {
slaveMonitors.addMonitor(new InternalsMonitor(internalsExposition, slaveState.getTimeline()));
}
slaveMonitors.start();
return successfulResponse();
}
private void addMonitors(AbstractMonitors monitors, Timeline timeline) {
monitors.addMonitor(new CpuUsageMonitor(jmxConnectionProvider, timeline));
monitors.addMonitor(new MemoryUsageMonitor(jmxConnectionProvider, timeline));
monitors.addMonitor(new GcMonitor(jmxConnectionProvider, timeline));
monitors.addMonitor(new OpenFilesMonitor(jmxConnectionProvider, timeline));
if (interfaceName != null) {
monitors.addMonitor(NetworkBytesMonitor.createReceiveMonitor(interfaceName, timeline));
monitors.addMonitor(NetworkBytesMonitor.createTransmitMonitor(interfaceName, timeline));
}
}
}