package com.redhat.lightblue.migrator.monitor.HIR; import org.joda.time.DateTime; import com.redhat.lightblue.client.LightblueException; import com.redhat.lightblue.client.Projection; import com.redhat.lightblue.client.Query; import com.redhat.lightblue.client.request.data.DataFindRequest; import com.redhat.lightblue.migrator.MigrationJob; import com.redhat.lightblue.migrator.MigrationJob.JobExecution; import com.redhat.lightblue.migrator.monitor.JobType; import com.redhat.lightblue.migrator.monitor.Monitor; import com.redhat.lightblue.migrator.monitor.MonitorConfiguration; import com.redhat.lightblue.migrator.monitor.Notifier; /** Monitor implementation for {@link JobType#HIGH_INCONSISTENCY_RATE} */ public class HIRMonitor extends Monitor { public HIRMonitor(MonitorConfiguration monitorCfg) { super(monitorCfg); } @Override protected void doRunCheck(final Notifier... notifiers) throws LightblueException { double inconsistencyRate = calculateInconsistencyRate(monitorCfg.getConfigurationName(), 1); String message = "Migration " + monitorCfg.getConfigurationName() + " has a high inconsistency rate of " + inconsistencyRate + "%"; if((monitorCfg.getCriticalThreshold() != null) && (inconsistencyRate >= monitorCfg.getCriticalThreshold())){ onError(message, notifiers); } else if ((monitorCfg.getWarnThreshold() != null) && (inconsistencyRate >= monitorCfg.getWarnThreshold())) { onFailure(message, notifiers); } else { onSuccess(notifiers); } } private double calculateInconsistencyRate(String configurationName, int days) throws LightblueException { DataFindRequest findJobs = new DataFindRequest(MigrationJob.ENTITY_NAME); findJobs.where( Query.and( Query.withValue("configurationName", Query.eq, configurationName), Query.withValue("status", Query.eq, "completed"), Query.withValue("jobExecutions.*.actualEndDate", Query.gte, new DateTime().minusDays(days).toDate()), Query.withValue("generated", Query.eq, true) ) ); findJobs.select( Projection.includeField("jobExecutions.*.processedDocumentCount"), Projection.includeField("jobExecutions.*.overwrittenDocumentCount") ); MigrationJob[] jobs = lightblueClient.data(findJobs, MigrationJob[].class); double processedDocumentCount = 0; double overwrittenDocumentCount = 0; for (MigrationJob job : jobs) { JobExecution execution = job.getJobExecutions().get(0); processedDocumentCount += execution.getProcessedDocumentCount(); overwrittenDocumentCount += execution.getOverwrittenDocumentCount(); } double percent = 0; if(processedDocumentCount != 0){ percent = 100 * (overwrittenDocumentCount / processedDocumentCount); } return percent; } }