/**
*
*/
package nl.ipo.cds.admin.ba.controller;
import java.security.Principal;
import java.util.ArrayList;
import java.util.List;
import nl.idgis.commons.jobexecutor.AbstractJob;
import nl.idgis.commons.jobexecutor.Job;
import nl.idgis.commons.jobexecutor.JobLogger.LogLevel;
import nl.ipo.cds.admin.reporting.ReportConfiguration;
import nl.idgis.commons.velocity.ToolContext;
import nl.ipo.cds.dao.ManagerDao;
import nl.ipo.cds.domain.Bronhouder;
import nl.ipo.cds.domain.DatasetType;
import nl.ipo.cds.domain.EtlJob;
import nl.ipo.cds.etl.reporting.DefaultLogWriterContext;
import nl.ipo.cds.etl.reporting.LogWriterContext;
import nl.ipo.cds.etl.reporting.velocity.VelocityJobFaseLogWriter;
import nl.ipo.cds.nagios.NagiosStatusService;
import nl.ipo.cds.nagios.ast.HostStatusNode;
import nl.ipo.cds.nagios.ast.ServiceStatusNode;
import org.apache.velocity.app.VelocityEngine;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.view.velocity.VelocityConfigurer;
/**
* @author Rob
*
*/
@Controller
@RequestMapping("/ba/monitoring")
public class MonitoringController {
private int statusData = 3;
private int statusServices = 3;
// service statuses 0,1,2,3 stand for OK, WARNING, CRITICAL and UNKNOWN respectively
private static String [] statusColor = new String[]{"GREEN","YELLOW","RED","RED"};
private static String [] statusString = new String[]{"OK","WARNING","CRITICAL","UNKNOWN"};
@Autowired
private VelocityConfigurer velocityConfigurer;
@Autowired
private ReportConfiguration reportConfiguration;
@Autowired
private MonitoringConfiguration monitoringConfiguration;
@Autowired
private ManagerDao managerDao;
@Autowired
private NagiosStatusService nagiosStatusService;
@ModelAttribute("roleFunction")
String getRoleFunction(){
return "beheerder";
}
@RequestMapping(method = RequestMethod.GET)
public String index (Model model) {
System.err.println("monitoring");
model.addAttribute("StatusData", getStatusLight(statusData));
model.addAttribute("StatusServices", getStatusLight(statusServices));
String statusDataTitle =
"Aborted ETL Jobs: UNKNOWN, ETL Job Age: UNKNOWN, Service jars: UNKNOWN, Database replication: UNKNOWN";
model.addAttribute("StatusDataTitle", statusDataTitle);
String statusServicesTitle =
"WFS Availability: UNKNOWN, WMS Availability: UNKNOWN, WMS Performance: UNKNOWN";
model.addAttribute("StatusServicesTitle", statusServicesTitle);
// Build a list of awstats service urls and names
List<AWstats> awstatsList = new ArrayList<AWstats>();
String[] awstatsUrls = monitoringConfiguration.getAwstatsUrls();
String[] awstatsNames = monitoringConfiguration.getAwstatsNames();
for (int i=0;i<Math.min(awstatsUrls.length, awstatsNames.length);i++){
AWstats awstats = new AWstats(awstatsUrls[i], awstatsNames[i]);
awstatsList.add(awstats);
System.err.println(awstats);
}
model.addAttribute("nagiosService", monitoringConfiguration.getNagiosUrl());
model.addAttribute("muninService", monitoringConfiguration.getMuninUrl());
model.addAttribute("awstatsServices", awstatsList);
model.addAttribute("nagiosHosts", monitoringConfiguration.getNagiosHosts());
// add nagiosCDSHost for WFS/ WMS availability.
// For dev there is only one host, for prod there will be three
String[] nagiosHosts = monitoringConfiguration.getNagiosHosts();
switch (nagiosHosts.length) {
case 1:
model.addAttribute("nagiosCDSHost", nagiosHosts[0]);
break;
case 3:
model.addAttribute("nagiosCDSHost", nagiosHosts[2]);
break;
default:
model.addAttribute("nagiosCDSHost", "");
break;
}
model.addAttribute("nagiosHostgroup", monitoringConfiguration.getNagiosHostgroup());
return "/ba/monitoring";
}
private String getStatusLight(int status) {
//statuses 0,1,2,3 stand for OK, WARNING, CRITICAL and UNKNOWN respectively
return statusColor[(status % 4)];
}
private String getStatusString(int status) {
//statuses 0,1,2,3 stand for OK, WARNING, CRITICAL and UNKNOWN respectively
return statusString[(status % 4)];
}
@RequestMapping(value ="getTrafficLights/", method = RequestMethod.GET)
public void getTrafficLight (Model model) {
String nagiosHostDb, nagiosHostEtl,nagiosHostCds;
String[] nagiosHosts;
ServiceStatusNode hostServiceAbortedEtlJobs = null;
ServiceStatusNode hostServiceEtlJobAge = null;
ServiceStatusNode hostServiceServiceJars = null;
ServiceStatusNode hostServiceWfsAvailability = null;
ServiceStatusNode hostServiceWmsAvailability = null;
ServiceStatusNode hostServiceWmsPerformance = null;
nagiosHosts = monitoringConfiguration.getNagiosHosts();
switch (nagiosHosts.length) {
case 1:
nagiosHostDb = nagiosHosts[0];
nagiosHostEtl = nagiosHosts[0];
nagiosHostCds = nagiosHosts[0];
break;
case 3:
nagiosHostDb = nagiosHosts[0];
nagiosHostEtl = nagiosHosts[1];
nagiosHostCds = nagiosHosts[2];
break;
default: // This should not happen, will give nullpointer exceptions
// below
nagiosHostDb = "";
nagiosHostEtl = "";
nagiosHostCds = "";
break;
}
// the array nagiosHosts should be cleared and have only one valu nagiosHostsCds
HostStatusNode hostAStatus = nagiosStatusService.getHostStatus (nagiosHostDb);
hostServiceAbortedEtlJobs = nagiosStatusService.getServiceStatus (nagiosHostDb, "Aborted ETL jobs");
hostServiceEtlJobAge = nagiosStatusService.getServiceStatus (nagiosHostDb, "ETL Job age");
hostServiceServiceJars = nagiosStatusService.getServiceStatus (nagiosHostEtl, "Service JARS");
hostServiceWfsAvailability = nagiosStatusService.getServiceStatus (nagiosHostCds, "WFS availability");
hostServiceWmsAvailability = nagiosStatusService.getServiceStatus (nagiosHostCds, "WMS availability");
hostServiceWmsPerformance = nagiosStatusService.getServiceStatus (nagiosHostCds, "WMS performance");
// System.out.println("Hosts: [" + nagiosStatusService.getAvailableHosts() + "]");
// System.out.println("Services: [" + nagiosStatusService.getAvailableServices() + "]");
/** Bepaal de 'traffic light' status
* Voor elk onderdeel het gemiddelde van de score per host
* Eind score is het maximum van de afzonderlijke scores
*/
// status Data
int serviceAbortedEtlJobs = hostServiceAbortedEtlJobs.getCurrentState();
int serviceEtlJobAge = hostServiceEtlJobAge.getCurrentState();
int serviceServiceJars = hostServiceServiceJars.getCurrentState() ;
// int serviceDatabaseReplication = Math.max(hostAServiceDatabaseReplication.getCurrentState(), hostBServiceDatabaseReplication.getCurrentState());
statusData = Math.max(Math.max(serviceAbortedEtlJobs, serviceEtlJobAge), serviceServiceJars);
model.addAttribute("StatusData", getStatusLight(statusData));
String statusDataTitle = "Aborted ETL Jobs: " + getStatusString(serviceAbortedEtlJobs) +
", ETL Job Age: " + getStatusString(serviceEtlJobAge) +
", Service jars: " + getStatusString(serviceServiceJars) ;
model.addAttribute("StatusDataTitle", statusDataTitle);
// status Services
int serviceWfsAvailabilityStatus = hostServiceWfsAvailability.getCurrentState();
int serviceWmsAvailabilityStatus = hostServiceWmsAvailability.getCurrentState() ;
int serviceWmsPerformanceStatus = hostServiceWmsPerformance.getCurrentState();
statusServices = Math.max(Math.max(serviceWfsAvailabilityStatus, serviceWmsAvailabilityStatus), serviceWmsPerformanceStatus);
model.addAttribute("StatusServices", getStatusLight(statusServices));
String statusServicesTitle =
"WFS Availability status: " + getStatusString(serviceWfsAvailabilityStatus) +
", WMS Availability status: " + getStatusString(serviceWmsAvailabilityStatus) +
", WMS Performance status: " + getStatusString(serviceWmsPerformanceStatus);
model.addAttribute("StatusServicesTitle", statusServicesTitle);
}
@RequestMapping("status/{hostName}")
@ResponseBody
public HostStatusNode hostStatusAction (final @PathVariable String hostName) {
return nagiosStatusService.getHostStatus (hostName);
}
@RequestMapping ("status/{hostName}/{serviceDescription}")
@ResponseBody
public ServiceStatusNode serviceStatusAction (final @PathVariable String hostName, final @PathVariable String serviceDescription) {
return nagiosStatusService.getServiceStatus (hostName, serviceDescription);
}
@RequestMapping ("jobs/")
@ResponseBody
public List<EtlJob> getJobs() {
List<EtlJob> jobs = this.managerDao.getJobsByStatus(Job.Status.ABORTED);
jobs.addAll(this.managerDao.getJobsByStatus(Job.Status.STARTED));
jobs.addAll(this.managerDao.getJobsByStatus(Job.Status.CREATED));
return jobs;
}
@RequestMapping (value = "jobs/{jobId}", method = RequestMethod.GET)
public String showBronhouderDatasetJob (
@PathVariable long jobId,
Model model,
Principal principal) {
final AbstractJob abstractJob = managerDao.getJob (jobId);
if (abstractJob == null || !(abstractJob instanceof EtlJob)) {
model.asMap ().clear ();
return "redirect:/ba/monitoring";
}
final EtlJob job = (EtlJob)abstractJob;
final Bronhouder bronhouder = job.getBronhouder();
final DatasetType datasetType = job.getDatasetType();
// Setup the log writer. Use the velocity engine for the current web application context:
final VelocityEngine velocityEngine = velocityConfigurer.getVelocityEngine ();
final VelocityJobFaseLogWriter writer = new VelocityJobFaseLogWriter (velocityEngine);
writer.setDefaultContext ("html");
writer.setDefaultEncoding ("UTF-8");
writer.setDefaultTemplate ("default");
writer.setTemplatePath ("ba/joblog");
writer.setContextClass (ToolContext.class);
final LogWriterContext writerContext = new DefaultLogWriterContext (managerDao.findJobLog(job));
final long errorCount = managerDao.getJobLogCount (job, LogLevel.ERROR);
final long warningCount = managerDao.getJobLogCount (job, LogLevel.WARNING);
model.addAttribute ("bronhouder", bronhouder);
model.addAttribute ("datasetType", datasetType);
model.addAttribute ("job", job);
model.addAttribute ("lastJob", managerDao.getLastSuccessfullImportJob (job));
model.addAttribute ("writer", writer);
model.addAttribute ("writerContext", writerContext);
model.addAttribute ("pgrBaseUrl", reportConfiguration.getPgrBaseUrl ());
model.addAttribute ("messageCount", errorCount + warningCount);
model.addAttribute ("errorCount", errorCount);
model.addAttribute ("warningCount", warningCount);
return "/ba/jobdetails";
}
}