/*
*
* * RHQ Management Platform
* * Copyright (C) 2005-2012 Red Hat, Inc.
* * All rights reserved.
* *
* * This program is free software; you can redistribute it and/or modify
* * it under the terms of the GNU General Public License, version 2, as
* * published by the Free Software Foundation, and/or the GNU Lesser
* * General Public License, version 2.1, also as published by the Free
* * Software Foundation.
* *
* * This program is distributed in the hope that it will be useful,
* * but WITHOUT ANY WARRANTY; without even the implied warranty of
* * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* * GNU General Public License and the GNU Lesser General Public License
* * for more details.
* *
* * You should have received a copy of the GNU General Public License
* * and the GNU Lesser General Public License along with this program;
* * if not, write to the Free Software Foundation, Inc.,
* * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
package org.rhq.metrics.simulator.plan;
import java.io.File;
import java.net.InetAddress;
import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonParser.Feature;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.joda.time.Minutes;
import org.joda.time.Seconds;
import org.rhq.metrics.simulator.MinutesDateTimeService;
import org.rhq.metrics.simulator.SecondsDateTimeService;
import org.rhq.metrics.simulator.SimulatedDateTimeService;
import org.rhq.metrics.simulator.plan.SimulationPlan.SimulationType;
import org.rhq.server.metrics.DateTimeService;
import org.rhq.server.metrics.MetricsConfiguration;
/**
* @author John Sanda
*/
public class SimulationPlanner {
public SimulationPlan create(File jsonFile) throws Exception {
JsonFactory jsonFactory = new JsonFactory();
jsonFactory.enable(Feature.ALLOW_COMMENTS);
ObjectMapper mapper = new ObjectMapper(jsonFactory);
JsonNode root = mapper.readTree(jsonFile);
SimulationPlan simulation = new SimulationPlan();
simulation.setIntervalType(SimulationPlan.IntervalType.fromText(getString(root.get("intervalType"), "minutes")));
DateTimeService dateTimeService;
switch (simulation.getIntervalType()) {
case SECONDS:
simulation.setCollectionInterval(getLong(root.get("collectionInterval"), 20L));
simulation.setAggregationInterval(getLong(root.get("aggregationInterval"), 2500L));
simulation.setMetricsServerConfiguration(createSecondsConfiguration());
simulation.setMetricsReportInterval(getInt(root.get("metricsReportInterval"), 30));
simulation.setSimulationRate(1440);
dateTimeService = new SecondsDateTimeService();
break;
case MINUTES:
simulation.setCollectionInterval(getLong(root.get("collectionInterval"), 1250L));
simulation.setAggregationInterval(getLong(root.get("aggregationInterval"), 150000L));
simulation.setMetricsServerConfiguration(createMinutesConfiguration());
simulation.setMetricsReportInterval(getInt(root.get("metricsReportInterval"), 180));
simulation.setDateTimeService(new MinutesDateTimeService());
simulation.setSimulationRate(2400);
dateTimeService = new MinutesDateTimeService();
break;
default: // HOURS
simulation.setCollectionInterval(getLong(root.get("collectionInterval"), 30000L));
simulation.setAggregationInterval(3600000L);
simulation.setMetricsServerConfiguration(new MetricsConfiguration());
simulation.setMetricsReportInterval(getInt(root.get("metricsReportInterval"), 1200));
simulation.setSimulationRate(1000);
dateTimeService = new DateTimeService();
}
simulation.setSimulationType(SimulationPlan.SimulationType.fromText(getString(root.get("simulationType"),
"threaded")));
if (SimulationType.SEQUENTIAL.equals(simulation.getSimulationType())) {
dateTimeService = new SimulatedDateTimeService();
}
dateTimeService.setConfiguration(simulation.getMetricsServerConfiguration());
simulation.setDateTimeService(dateTimeService);
simulation.setNumMeasurementCollectors(getInt(root.get("numMeasurementCollectors"), 5));
simulation.setNumReaders(getInt(root.get("numReaders"), 1));
simulation.setReaderThreadPoolSize(getInt(root.get("readerThreadPoolSize"), 1));
simulation.setSimulationTime(getInt(root.get("simulationTime"), 10));
simulation.setBatchSize(getInt(root.get("batchSize"), 5000));
String[] nodes;
if (root.get("nodes") == null || root.get("nodes").size() == 0) {
nodes = new String[] {InetAddress.getLocalHost().getHostAddress()};
} else {
nodes = new String[root.get("nodes").size()];
int i = 0;
for (JsonNode node : root.get("nodes")) {
nodes[i++] = node.asText();
}
}
simulation.setNodes(nodes);
simulation.setCqlPort(getInt(root.get("cqlPort"), 9142));
simulation.setAggregationBatchSize(getInt(root.get("aggregationBatchSize"), 250));
simulation.setAggregationType(SimulationPlan.AggregationType.fromText(getString(root.get("aggregationType"),
"sync")));
simulation.setAggregationEnabled(getBoolean(root.get("aggregationEnabled"), true));
return simulation;
}
private MetricsConfiguration createMinutesConfiguration() {
MetricsConfiguration configuration = new MetricsConfiguration();
configuration.setRawTTL(Minutes.minutes(168).toStandardSeconds().getSeconds());
configuration.setRawRetention(Minutes.minutes(168).toStandardDuration());
configuration.setRawTimeSliceDuration(Seconds.seconds(150).toStandardDuration());
configuration.setOneHourTTL(Minutes.minutes(336).toStandardSeconds().getSeconds());
configuration.setOneHourRetention(Minutes.minutes(336));
configuration.setOneHourTimeSliceDuration(Minutes.minutes(15).toStandardDuration());
configuration.setSixHourTTL(Minutes.minutes(744).toStandardSeconds().getSeconds());
configuration.setSixHourRetention(Minutes.minutes(744).toStandardSeconds());
configuration.setSixHourTimeSliceDuration(Minutes.minutes(60).toStandardDuration());
configuration.setTwentyFourHourTTL(Minutes.minutes(8928).toStandardSeconds().getSeconds());
configuration.setTwentyFourHourRetention(Minutes.minutes(8928).toStandardSeconds());
return configuration;
}
private MetricsConfiguration createSecondsConfiguration() {
MetricsConfiguration configuration = new MetricsConfiguration();
configuration.setRawTTL(420);
configuration.setRawRetention(Seconds.seconds(420).toStandardDuration());
configuration.setRawTimeSliceDuration(Seconds.seconds(2).toStandardDuration().plus(500));
configuration.setOneHourTTL(Seconds.seconds(840).getSeconds());
configuration.setOneHourRetention(Seconds.seconds(840));
configuration.setOneHourTimeSliceDuration(Seconds.seconds(15).toStandardDuration());
configuration.setSixHourTTL(Seconds.seconds(1860).getSeconds());
configuration.setSixHourRetention(Seconds.seconds(1860));
configuration.setSixHourTimeSliceDuration(Seconds.seconds(60).toStandardDuration());
configuration.setTwentyFourHourTTL(Minutes.minutes(365).toStandardSeconds().getSeconds());
configuration.setTwentyFourHourRetention(Minutes.minutes(365));
return configuration;
}
private String getString(JsonNode node, String defaultValue) {
if (node == null) {
return defaultValue;
}
return node.asText();
}
private long getLong(JsonNode node, long defaultValue) {
if (node == null) {
return defaultValue;
}
return node.longValue();
}
private int getInt(JsonNode node, int defaultValue) {
if (node == null) {
return defaultValue;
}
return node.intValue();
}
private boolean getBoolean(JsonNode node, boolean defaultValue) {
if (node == null) {
return defaultValue;
}
return node.booleanValue();
}
}