/*
* Copyright 2013 Cloud4SOA, www.cloud4soa.eu
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* 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 eu.cloud4soa.governance.monitoring.task;
import java.io.IOException;
import java.util.Date;
import java.util.TimerTask;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import eu.cloud4soa.adapter.rest.AdapterClient;
import eu.cloud4soa.adapter.rest.auth.Credentials;
import eu.cloud4soa.adapter.rest.auth.CustomerCredentials;
import eu.cloud4soa.adapter.rest.common.HttpStatus;
import eu.cloud4soa.adapter.rest.conversion.RequestFactory;
import eu.cloud4soa.adapter.rest.exception.AdapterClientException;
import eu.cloud4soa.adapter.rest.request.ExtendedMonitorRequest;
import eu.cloud4soa.adapter.rest.request.MonitorDetailRequest;
import eu.cloud4soa.adapter.rest.response.ExtendedMonitorResponse;
import eu.cloud4soa.adapter.rest.response.MonitorDetailResponse;
import eu.cloud4soa.adapter.rest.response.model.Metric;
import eu.cloud4soa.api.governance.monitoring.IMonitoringJob;
import eu.cloud4soa.api.governance.monitoring.IMonitoringMetric.MetricKey;
import eu.cloud4soa.relational.datamodel.MonitoringJob;
import eu.cloud4soa.relational.datamodel.MonitoringMetric;
import eu.cloud4soa.relational.datamodel.MonitoringStatistic;
import eu.cloud4soa.relational.persistence.MonitoringMetricRepository;
import eu.cloud4soa.relational.persistence.MonitoringStatisticRepository;
import eu.cloud4soa.relational.persistence.ApplicationInstanceRepository;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.UnknownHostException;
import java.util.List;
import java.util.logging.Level;
/**
*
* @author denisneuling <dn@cloudcontrol.de>
*
*/
public class MonitoringTask extends TimerTask implements IMonitoringTask, Runnable {
protected final Logger logger = LoggerFactory.getLogger(getClass());
private AdapterClient adapterClient;
private MonitoringStatisticRepository monitoringStatisticRepository;
private MonitoringMetricRepository monitoringMetricRepository;
private ApplicationInstanceRepository applicationInstanceRepository;
private IMonitoringJob monitoringJob;
private Date called;
public MonitoringTask(MonitoringStatisticRepository monitoringStatisticRepository, MonitoringMetricRepository monitoringMetricRepository, ApplicationInstanceRepository applicationInstanceRepository, AdapterClient adapterClient, IMonitoringJob monitoringJob) {
this.monitoringJob = monitoringJob;
this.adapterClient = adapterClient;
this.monitoringStatisticRepository = monitoringStatisticRepository;
this.monitoringMetricRepository = monitoringMetricRepository;
this.applicationInstanceRepository = applicationInstanceRepository;
}
@Override
public void setMonitoringJob(IMonitoringJob monitoringJob) {
this.monitoringJob = monitoringJob;
}
public void setAdapterClient(AdapterClient adapterClient) {
this.adapterClient = adapterClient;
}
@Override
public void run() {
logger.debug("mondebug MonitoringTask - run");
called = new Date();
MonitorDetailRequest request = RequestFactory.createMonitorDetailRequest(monitoringJob);
String appUrl = "";
try {
List<eu.cloud4soa.relational.datamodel.ApplicationInstance> applicationlist = applicationInstanceRepository.findBy("uriID", monitoringJob.getApplicationInstanceUriId());
if (applicationlist.size() > 0) {
eu.cloud4soa.relational.datamodel.ApplicationInstance appInstance = applicationlist.get(0);
appUrl = appInstance.getAppurl();
}
} catch (Exception e) {
logger.debug("Failed to grab appUrl");
}
URI uri = null;
try {
uri = new URI(appUrl);
logger.debug("-------------appUrl: " + uri.getAuthority());
} catch (URISyntaxException ex) {
java.util.logging.Logger.getLogger(MonitoringTask.class.getName()).log(Level.SEVERE, null, ex);
}
logger.debug("pgouvas: MonitoringTask before creation");
MonitoringStatistic monitoringStatistic = new MonitoringStatistic();
Credentials credentials = new CustomerCredentials("apikey", "secretkey");
try {
MonitorDetailResponse response = adapterClient.send(request, credentials);
monitoringStatistic = toMonitoringStatistic(response);
} catch (IOException e) {
monitoringStatistic.setMonitoringJobId(monitoringJob.getId());
monitoringStatistic.setResponseTime(-1);
monitoringStatistic.setResponseCode(HttpStatus.Conflict.ordinal());
monitoringStatistic.setMessage("error");
}
monitoringStatistic.setDate(called);
monitoringStatisticRepository.store(monitoringStatistic);
try {
ExtendedMonitorRequest extendedMonitorRequest = RequestFactory.createExtendedMonitorRequest(monitoringJob, uri.getAuthority());
ExtendedMonitorResponse extendedMonitorResponse = adapterClient.send(extendedMonitorRequest, credentials);
toMonitoringMetric(extendedMonitorResponse);
monitoringMetricRepository.flush();
logger.debug("------------Collected Monitoring Metrics. Flushing...");
} catch (AdapterClientException ex) {
java.util.logging.Logger.getLogger(MonitoringTask.class.getName()).log(Level.WARNING, "Failed to collect extended metrics. Possible lack of support from the selected provider.");
} catch (UnknownHostException ex) {
java.util.logging.Logger.getLogger(MonitoringTask.class.getName()).log(Level.SEVERE, null, ex);
}
monitoringJob.setLastExecuted(called);
}
private MonitoringStatistic toMonitoringStatistic(MonitorDetailResponse response) {
MonitoringStatistic monitoringStatistic = new MonitoringStatistic();
monitoringStatistic.setMonitoringJobId(monitoringJob.getId());
final long responseTime = response.getResponseTime();
monitoringStatistic.setResponseTime(responseTime);
monitoringStatistic.setMessage(response.getMessage());
final int statusCode = response.getStatusCode().ordinal();
monitoringStatistic.setResponseCode(statusCode);
MonitoringMetric monitoringMetricResponseTime = new MonitoringMetric();
monitoringMetricResponseTime.setMetricKey(MetricKey.responseTime);
monitoringMetricResponseTime.setMetricValue(responseTime);
monitoringMetricResponseTime.setDate(called);
monitoringMetricResponseTime.setMonitoringJob((MonitoringJob) monitoringJob);
monitoringMetricRepository.store(monitoringMetricResponseTime);
MonitoringMetric monitoringMetricStatusCode = new MonitoringMetric();
monitoringMetricStatusCode.setMetricKey(MetricKey.statusCode);
monitoringMetricStatusCode.setMetricValue(statusCode);
monitoringMetricStatusCode.setDate(called);
monitoringMetricStatusCode.setMonitoringJob((MonitoringJob) monitoringJob);
monitoringMetricRepository.store(monitoringMetricStatusCode);
return monitoringStatistic;
}
private void toMonitoringMetric(ExtendedMonitorResponse extendedMonitorResponse) {
Metric[] metrics = extendedMonitorResponse.getMetrics();
logger.debug("------------Collected Monitoring Metrics. Storing...");
logger.debug("------------Metrics list size: " + metrics.length);
for (Metric metric : metrics) {
try {
logger.debug("------------Storing Monitoring Metric " + metric.getMetricName() + ":" + metric.getValue());
MonitoringMetric monitoringMetric = new MonitoringMetric();
monitoringMetric.setMetricKey(MetricKey.valueOf(metric.getMetricName()));
monitoringMetric.setMetricValue(Double.parseDouble(metric.getValue()));
monitoringMetric.setDate(called);
monitoringMetric.setMonitoringJob((MonitoringJob) monitoringJob);
monitoringMetricRepository.store(monitoringMetric);
logger.debug("------------Monitoring Metric " + metric.getMetricName() + " stored");
} catch (Exception e) {
java.util.logging.Logger.getLogger(MonitoringTask.class.getName()).log(Level.WARNING, "Failed to collect metric", metric.getMetricName());
}
}
logger.debug("------------Collected Monitoring Metrics. Stored");
}
}