package rocks.inspectit.agent.java.sensor.platform;
import java.sql.Timestamp;
import java.util.Calendar;
import rocks.inspectit.agent.java.sensor.platform.provider.ThreadInfoProvider;
import rocks.inspectit.agent.java.sensor.platform.provider.factory.PlatformSensorInfoProviderFactory;
import rocks.inspectit.shared.all.communication.SystemSensorData;
import rocks.inspectit.shared.all.communication.data.ThreadInformationData;
/**
* This class provides dynamic information about the thread system through MXBeans.
*
* @author Eduard Tudenhoefner
* @author Max Wassiljew (NovaTec Consulting GmbH)
*/
public class ThreadInformation extends AbstractPlatformSensor {
/** Collector class. */
private ThreadInformationData threadInformationData = new ThreadInformationData();
/** The {@link ThreadInfoProvider} used to retrieve information from the thread system. */
private ThreadInfoProvider threadBean;
/**
* {@inheritDoc}
*/
@Override
public void gather() {
// The timestamp is set in the {@link ThreadInformation#reset()} to avoid multiple renewal.
// It will not be set on the first execution of {@link ThreadInformation#gather()}, but
// shortly before.
int daemonThreadCount = this.getThreadBean().getDaemonThreadCount();
int peakThreadCount = this.getThreadBean().getPeakThreadCount();
int threadCount = this.getThreadBean().getThreadCount();
long totalStartedThreadCount = this.getThreadBean().getTotalStartedThreadCount();
this.threadInformationData.incrementCount();
this.threadInformationData.addDaemonThreadCount(daemonThreadCount);
this.threadInformationData.addPeakThreadCount(peakThreadCount);
this.threadInformationData.addThreadCount(threadCount);
this.threadInformationData.addTotalStartedThreadCount(totalStartedThreadCount);
if (daemonThreadCount < this.threadInformationData.getMinDaemonThreadCount()) {
this.threadInformationData.setMinDaemonThreadCount(daemonThreadCount);
} else if (daemonThreadCount > this.threadInformationData.getMaxDaemonThreadCount()) {
this.threadInformationData.setMaxDaemonThreadCount(daemonThreadCount);
}
if (peakThreadCount < this.threadInformationData.getMinPeakThreadCount()) {
this.threadInformationData.setMinPeakThreadCount(peakThreadCount);
} else if (peakThreadCount > this.threadInformationData.getMaxPeakThreadCount()) {
this.threadInformationData.setMaxPeakThreadCount(peakThreadCount);
}
if (threadCount < this.threadInformationData.getMinThreadCount()) {
this.threadInformationData.setMinThreadCount(threadCount);
} else if (threadCount > this.threadInformationData.getMaxThreadCount()) {
this.threadInformationData.setMaxThreadCount(threadCount);
}
if (totalStartedThreadCount < this.threadInformationData.getMinTotalStartedThreadCount()) {
this.threadInformationData.setMinTotalStartedThreadCount(totalStartedThreadCount);
} else if (totalStartedThreadCount > this.threadInformationData.getMaxTotalStartedThreadCount()) {
this.threadInformationData.setMaxTotalStartedThreadCount(totalStartedThreadCount);
}
}
/**
* {@inheritDoc}
*/
@Override
public SystemSensorData get() {
ThreadInformationData newThreadInformationData = new ThreadInformationData();
newThreadInformationData.setPlatformIdent(this.threadInformationData.getPlatformIdent());
newThreadInformationData.setSensorTypeIdent(this.threadInformationData.getSensorTypeIdent());
newThreadInformationData.setCount(this.threadInformationData.getCount());
newThreadInformationData.setTotalDaemonThreadCount(this.threadInformationData.getTotalDaemonThreadCount());
newThreadInformationData.setMinDaemonThreadCount(this.threadInformationData.getMinDaemonThreadCount());
newThreadInformationData.setMaxDaemonThreadCount(this.threadInformationData.getMaxDaemonThreadCount());
newThreadInformationData.setTotalPeakThreadCount(this.threadInformationData.getTotalPeakThreadCount());
newThreadInformationData.setMinPeakThreadCount(this.threadInformationData.getMinPeakThreadCount());
newThreadInformationData.setMaxPeakThreadCount(this.threadInformationData.getMaxPeakThreadCount());
newThreadInformationData.setTotalThreadCount(this.threadInformationData.getTotalThreadCount());
newThreadInformationData.setMinThreadCount(this.threadInformationData.getMinThreadCount());
newThreadInformationData.setMaxThreadCount(this.threadInformationData.getMaxThreadCount());
newThreadInformationData.setTotalTotalStartedThreadCount(this.threadInformationData.getTotalTotalStartedThreadCount());
newThreadInformationData.setMinTotalStartedThreadCount(this.threadInformationData.getMinTotalStartedThreadCount());
newThreadInformationData.setMaxTotalStartedThreadCount(this.threadInformationData.getMaxTotalStartedThreadCount());
newThreadInformationData.setTimeStamp(this.threadInformationData.getTimeStamp());
return newThreadInformationData;
}
/**
* {@inheritDoc}
*/
@Override
public void reset() {
this.threadInformationData.setCount(0);
this.threadInformationData.setTotalDaemonThreadCount(0);
this.threadInformationData.setMinDaemonThreadCount(Integer.MAX_VALUE);
this.threadInformationData.setMaxDaemonThreadCount(0);
this.threadInformationData.setTotalPeakThreadCount(0);
this.threadInformationData.setMinPeakThreadCount(Integer.MAX_VALUE);
this.threadInformationData.setMaxPeakThreadCount(0);
this.threadInformationData.setTotalThreadCount(0);
this.threadInformationData.setMinThreadCount(Integer.MAX_VALUE);
this.threadInformationData.setMaxThreadCount(0);
this.threadInformationData.setTotalTotalStartedThreadCount(0L);
this.threadInformationData.setMinTotalStartedThreadCount(Long.MAX_VALUE);
this.threadInformationData.setMaxTotalStartedThreadCount(0);
Timestamp timestamp = new Timestamp(Calendar.getInstance().getTimeInMillis());
this.threadInformationData.setTimeStamp(timestamp);
}
/**
* {@inheritDoc}
*/
@Override
protected SystemSensorData getSystemSensorData() {
return this.threadInformationData;
}
/**
* Gets the {@link ThreadInfoProvider}. The getter method is provided for better testability.
*
* @return {@link ThreadInfoProvider}.
*/
private ThreadInfoProvider getThreadBean() {
if (this.threadBean == null) {
this.threadBean = PlatformSensorInfoProviderFactory.getPlatformSensorInfoProvider().getThreadInfoProvider();
}
return this.threadBean;
}
}