package org.spotter.ext.measurement.database; import java.io.IOException; import java.io.OutputStream; import java.util.Properties; import java.util.concurrent.Future; import javax.ws.rs.core.MediaType; import org.aim.api.exceptions.MeasurementException; import org.aim.api.measurement.AbstractRecord; import org.aim.api.measurement.MeasurementData; import org.aim.api.measurement.collector.AbstractDataSource; import org.aim.api.measurement.collector.CollectorFactory; import org.aim.artifacts.measurement.collector.FileDataSource; import org.aim.artifacts.measurement.collector.MemoryDataSource; import org.aim.description.InstrumentationDescription; import org.aim.description.sampling.SamplingDescription; import org.lpe.common.config.GlobalConfiguration; import org.lpe.common.extension.IExtension; import org.lpe.common.util.system.LpeSystemUtils; import org.lpe.common.util.web.LpeWebUtils; import org.spotter.core.measurement.AbstractMeasurementAdapter; import com.sun.jersey.api.client.Client; import com.sun.jersey.api.client.WebResource; public class DummyDBMeasurement extends AbstractMeasurementAdapter implements Runnable { public static Integer instanceId = 1; private AbstractDataSource dataSource; private Future<?> measurementTask; private boolean running; private long delay; private String host; private String port; private boolean samplerActivated = false; protected static final long DEFAULT_DELAY = 500; private Client client; private WebResource webResource; public DummyDBMeasurement(IExtension<?> provider) { super(provider); client = LpeWebUtils.getWebClient(); client.setConnectTimeout(1000 * 60 * 60); client.setReadTimeout(1000 * 60 * 60); } @Override public void enableMonitoring() throws MeasurementException { if (samplerActivated) { measurementTask = LpeSystemUtils.submitTask(this); } } @Override public void disableMonitoring() throws MeasurementException { if (samplerActivated) { try { running = false; measurementTask.get(); } catch (Exception e) { throw new MeasurementException(e); } } } @Override public MeasurementData getMeasurementData() throws MeasurementException { if (samplerActivated) { return dataSource.read(); } else { return new MeasurementData(); } } @Override public void pipeToOutputStream(OutputStream oStream) throws MeasurementException { if (samplerActivated) { dataSource.pipeToOutputStream(oStream); }else{ try { oStream.close(); } catch (IOException e) { throw new MeasurementException(e); } } } @Override public void initialize() throws MeasurementException { host = getHost(); port = getPort(); webResource = client.resource("http://" + host + ":" + port + "/").path("dummyDB").path("getStatistics"); Properties collectorProperties = GlobalConfiguration.getInstance().getProperties(); synchronized (instanceId) { collectorProperties.setProperty(FileDataSource.ADDITIONAL_FILE_PREFIX_KEY, "DummyDBSampler-" + instanceId); instanceId++; } dataSource = CollectorFactory.createDataSource(MemoryDataSource.class.getName(), collectorProperties); } @Override public long getCurrentTime() { return System.currentTimeMillis(); } @Override public void run() { running = true; try { dataSource.enable(); while (running) { sampleStatistics(); try { Thread.sleep(delay); } catch (InterruptedException ie) { running = false; } } dataSource.disable(); } catch (MeasurementException e) { throw new RuntimeException(e); } } private void sampleStatistics() { String recStr = webResource.accept(MediaType.APPLICATION_JSON).get(String.class); dataSource.newRecord(AbstractRecord.fromString(recStr)); } @Override public void storeReport(String path) throws MeasurementException { // nothing to do here } @Override public void prepareMonitoring(InstrumentationDescription monitoringDescription) throws MeasurementException { for (SamplingDescription sDescr : monitoringDescription.getSamplingDescriptions()) { if (sDescr.getResourceName().equals(SamplingDescription.SAMPLER_DATABASE_STATISTICS)) { samplerActivated = true; delay = sDescr.getDelay(); break; } } } @Override public void resetMonitoring() throws MeasurementException { samplerActivated = false; } }