/*
* 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;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import eu.cloud4soa.api.repository.ApplicationProfilesRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import eu.cloud4soa.adapter.rest.auth.Credentials;
import eu.cloud4soa.adapter.rest.auth.CustomerCredentials;
import eu.cloud4soa.api.datamodel.core.ApplicationInstance;
import eu.cloud4soa.api.governance.monitoring.IMonitoringJob;
import eu.cloud4soa.api.governance.monitoring.IMonitoringMetric;
import eu.cloud4soa.api.governance.monitoring.IMonitoringMetric.MetricKey;
import eu.cloud4soa.api.governance.monitoring.IMonitoringStatistic;
import eu.cloud4soa.governance.monitoring.factory.MonitoringModelFactory;
import eu.cloud4soa.governance.monitoring.worker.MonitoringWorker;
import eu.cloud4soa.relational.datamodel.MonitoringJob;
import eu.cloud4soa.relational.persistence.ApplicationInstanceRepository;
import eu.cloud4soa.relational.persistence.MonitoringJobRepository;
import eu.cloud4soa.relational.persistence.MonitoringMetricRepository;
import eu.cloud4soa.relational.persistence.MonitoringStatisticRepository;
import org.apache.commons.lang.NotImplementedException;
/**
* Properties which have to been set before running the application
*
* eu.cloud4soa.governance.monitoring.spawnlookup.cron=*\/5 * * * * * means that
* threads will be spawned every 5 seconds if monitoring of that application is
* enabled and the monitor is not polling yet
*
* eu.cloud4soa.governance.monitoring.poll.interval.seconds=10 means that every
* 10 seconds metrics/statistics will be polled from the PaaS provider
*
*
* @author vincenzo
* @author Denis Neuling (dn@cloudcontrol.de)
*/
@Component
public class MonitoringModule implements eu.cloud4soa.api.governance.MonitoringModule {
final Logger logger = LoggerFactory.getLogger(MonitoringModule.class);
/**
* FIXME retrieve the credentials from the applicationInstance but there is
* no repository what i could use to persist those data
*/
private Credentials adapterCredentials = new CustomerCredentials(
"86168c87685da592b857cdf1b5379b73b967b31c59516c93d824f1e734163e062441af21f4445c9b84599d10befd258d",
"1d6459840547b1e0ef83f463b5eaf2bf0248d1ae68cbb3e84234af08db3337136ecfd741a0a6a74b1f81c75be44dc921");
@Autowired
private MonitoringStatisticRepository monitoringStatisticRepository;
@Autowired
private MonitoringMetricRepository monitoringMetricRepository;
@Autowired
private MonitoringJobRepository monitoringJobRepository;
@Qualifier("applicationProfilesRepository")
@Autowired
private ApplicationProfilesRepository applicationProfilesRepository;
@Autowired
ApplicationInstanceRepository applicationInstanceRepository;
@Autowired
@SuppressWarnings("unused")
private MonitoringWorker monitoringWorker;
public void startMonitoringJob(ApplicationInstance applicationInstance) {
logger.info("Starting monitoring for applicationInstance " + applicationInstance.getUriId());
MonitoringJob retrievedJob = (MonitoringJob) getMonitoringJob(applicationInstance.getUriId());
if (retrievedJob == null) {
retrievedJob = MonitoringModelFactory.toMonitoringJob(applicationInstance);
// updateAdapterCredentials(applicationInstance, retrievedJob);
addMonitoringJob(retrievedJob);
logger.info("MonitoringJob created.");
} else {
logger.info("MonitoringJob already found.");
}
retrievedJob.setEnabled(true);
retrievedJob.setCheckUrl(applicationInstance.getAdapterUrl());
//application has not been stored to db yet
List<eu.cloud4soa.relational.datamodel.ApplicationInstance> applicationlist = applicationInstanceRepository.findBy("uriID", applicationInstance.getUriId());
if (applicationlist.size() > 0) {
eu.cloud4soa.relational.datamodel.ApplicationInstance appInstance = applicationlist.get(0);
retrievedJob.setApplicationInstance(appInstance);
}
monitoringJobRepository.flush();
}
public void stopMonitoring(String applicationUriId) {
logger.info("Stopping monitoring for applicationInstance " + applicationUriId);
MonitoringJob retrievedJob = (MonitoringJob) getMonitoringJob(applicationUriId);
if (retrievedJob != null) {
retrievedJob.setEnabled(false);
monitoringJobRepository.flush();
}
}
public void UpdateMonitoringApplicationInstance(String applicationUriId) {
logger.info("Update ApplicationInstance Id for applicationInstance " + applicationUriId);
//application has not been stored to db yet
MonitoringJob retrievedJob = (MonitoringJob) getMonitoringJob(applicationUriId);
List<eu.cloud4soa.relational.datamodel.ApplicationInstance> applicationlist = applicationInstanceRepository.findByUriIdNoCheck(applicationUriId);
if (applicationlist.size() > 0 && retrievedJob != null) {
eu.cloud4soa.relational.datamodel.ApplicationInstance appInstance = applicationlist.get(0);
retrievedJob.setApplicationInstance(appInstance);
monitoringJobRepository.flush();
}
}
public IMonitoringJob getMonitoringJob(String applicationUriId) {
MonitoringJob retrievedJob = monitoringJobRepository.retrieveByApplicationUriId(applicationUriId);
if (retrievedJob != null) {
// updateAdapterCredentials(applicationInstance, retrievedJob);
}
return retrievedJob;
}
@SuppressWarnings("unchecked")
public List<IMonitoringStatistic> getMonitoringStatistics(String applicationUriId) {
MonitoringJob monitoringJob = (MonitoringJob) getMonitoringJob(applicationUriId);
List<IMonitoringStatistic> statistics = new LinkedList<IMonitoringStatistic>();
if (monitoringJob != null) {
statistics = (List<IMonitoringStatistic>) (List<?>) monitoringStatisticRepository.retrieveAllMonitoringStatistics(monitoringJob);
}
return statistics;
}
@SuppressWarnings("unchecked")
public List<IMonitoringStatistic> getMonitoringStatisticsWhithinRange(String applicationUriId, Date start, Date end) {
MonitoringJob monitoringJob = (MonitoringJob) getMonitoringJob(applicationUriId);
List<IMonitoringStatistic> statistics = new LinkedList<IMonitoringStatistic>();
if (monitoringJob != null) {
statistics = (List<IMonitoringStatistic>) (List<?>) monitoringStatisticRepository.retrieveAllInRange(monitoringJob, start, end);
}
return statistics;
}
@Deprecated
@Override
public List<IMonitoringStatistic> getMonitoringStatisticsWhithinRangeLimited(String applicationUriId, Date start, Date end, int maxResults) {
MonitoringJob monitoringJob = (MonitoringJob) getMonitoringJob(applicationUriId);
List<IMonitoringStatistic> statistics = new LinkedList<IMonitoringStatistic>();
if (monitoringJob != null) {
statistics = (List<IMonitoringStatistic>) (List<?>) monitoringStatisticRepository.retrieveAllInRangeLimited(monitoringJob, start, end, maxResults);
}
return statistics;
}
@Override
public List<IMonitoringMetric> getMonitoringMetricsWhithinRangeLimited(String applicationUriId, MetricKey metricKey, Date start, Date end, int maxResults) {
MonitoringJob monitoringJob = (MonitoringJob) getMonitoringJob(applicationUriId);
List<IMonitoringMetric> metrics = new LinkedList<IMonitoringMetric>();
if (monitoringJob != null) {
metrics = (List<IMonitoringMetric>) (List<?>) monitoringMetricRepository.retrieveAllInRangeforMetric(monitoringJob, metricKey, start, end, maxResults);
}
return metrics;
}
private void addMonitoringJob(MonitoringJob monitoringJob) {
monitoringJobRepository.store(monitoringJob);
}
// private Credentials inquireCredentials(ApplicationInstance applicationInstance) {
// /**
// * TODO && FIXME
// */
// return adapterCredentials;
// }
/*
* private void updateAdapterCredentials(ApplicationInstance
* applicationInstance, MonitoringJob monitoringJob) { if (monitoringJob !=
* null && applicationInstance != null) { Credentials credentials =
* inquireCredentials(applicationInstance); if (monitoringJob.getApiKey() ==
* null || !monitoringJob.getApiKey().equals(credentials.getApiKey())) {
* monitoringJob.setApiKey(credentials.getApiKey()); } if
* (monitoringJob.getSecretKey() == null ||
* !monitoringJob.getSecretKey().equals(credentials.getApiKey())) {
* monitoringJob.setSecretKey(credentials.getSecretKey()); }
* monitoringJobRepository.saveOrUpdate(monitoringJob); } }
*/
@Override
public void startMonitoring(String applicationUriId) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
}