/** * {@inheritDoc} */ @Override protected void processData(DefaultData defaultData, EntityManager entityManager) { diagnosisService.diagnose((InvocationSequenceData) defaultData, baseline); }
/** * {@inheritDoc} */ @Override public boolean diagnose(InvocationSequenceData invocation, double baseline) { try { return queue.offer(new DiagnosisInput(invocation, baseline), timeOut, TimeUnit.MILLISECONDS); } catch (InterruptedException e) { LOG.info("Specified waiting of time of BlockingQueue for DiagnosisService elapses before space is available"); return false; } }
@Test(expectedExceptions = IllegalArgumentException.class) public void cannotBeDiagnosedWithInvocationSequenceDataNull() { double baseline = 1000; diagnosisService = new DiagnosisService(problemOccurrenceConsumer, new ArrayList<String>() { private static final long serialVersionUID = 1L; { add("rocks.inspectit.server.diagnosis.service.rules.testrules"); } }, 2, 50L, 2); diagnosisService.diagnose(null, baseline); }
@Test(expectedExceptions = RuntimeException.class) public void collectProblemInstancesWithRuntimeExceptionGlobalContext() { CauseStructure causeStructure = new CauseStructure(CauseType.SINGLE, SourceType.TIMERDATA); AggregatedDiagnosisData aggregatedInvocationSequenceData = null; aggregatedInvocationSequenceData = DiagnosisDataAggregator.getInstance().getAggregatedDiagnosisData(secondChildSequence); DiagnosisDataAggregator.getInstance().aggregate(aggregatedInvocationSequenceData, secondChildSequence); Multimap<String, Tag> tagMap = ArrayListMultimap.create(); Tag tagOne = new Tag(RuleConstants.DIAGNOSIS_TAG_GLOBAL_CONTEXT, "Test", Tags.rootTag(secondChildSequence)); Tag tagTwo = new Tag(RuleConstants.DIAGNOSIS_TAG_PROBLEM_CONTEXT, new CauseCluster(secondChildSequence), tagOne); Tag tagThree = new Tag(RuleConstants.DIAGNOSIS_TAG_PROBLEM_CAUSE, aggregatedInvocationSequenceData, tagTwo); Tag tagFour = new Tag(RuleConstants.DIAGNOSIS_TAG_CAUSE_STRUCTURE, causeStructure, tagThree); tagMap.put("D", tagFour); when(sessionContext.getInput()).thenReturn(secondChildSequence); when(sessionContext.getStorage()).thenReturn(storage); when(storage.mapTags(TagState.LEAF)).thenReturn(tagMap); ProblemOccurrenceResultCollector problemInstanceResultCollector = new ProblemOccurrenceResultCollector(); List<ProblemOccurrence> problemOccurrence = problemInstanceResultCollector.collect(sessionContext); assertThat(problemOccurrence, hasSize(0)); }
@Test public void initAndShutDown() { diagnosisService = new DiagnosisService(problemOccurrenceConsumer, new ArrayList<String>() { private static final long serialVersionUID = 1L; { add("rocks.inspectit.server.diagnosis.service.rules.testrules"); } }, 2, 50L, 2); diagnosisService.init(); diagnosisService.shutdown(true); assertThat(diagnosisService.isShutdown(), is(true)); } }
@Test(expectedExceptions = IllegalArgumentException.class) public void cannotBeDiagnosedWithNullAndNegativeBaseline() { diagnosisService = new DiagnosisService(problemOccurrenceConsumer, new ArrayList<String>() { private static final long serialVersionUID = 1L; { add("rocks.inspectit.server.diagnosis.service.rules.testrules"); } }, 2, 50L, 2); diagnosisService.diagnose(null, -1); } }
@Test(expectedExceptions = IllegalArgumentException.class) public void cannotBeDiagnosedWithBaselineNegative() { diagnosisService = new DiagnosisService(problemOccurrenceConsumer, new ArrayList<String>() { private static final long serialVersionUID = 1L; { add("rocks.inspectit.server.diagnosis.service.rules.testrules"); } }, 2, 50L, 2); InvocationSequenceData invocationSequenceData = new InvocationSequenceData(); invocationSequenceData.setDuration(5000d); diagnosisService.diagnose(invocationSequenceData, -1); }
@Test public void canBeDiagnosed() { double baseline = 1000; diagnosisService = new DiagnosisService(problemOccurrenceConsumer, new ArrayList<String>() { private static final long serialVersionUID = 1L; { add("rocks.inspectit.server.diagnosis.service.rules.testrules"); } }, 2, 50L, 2); InvocationSequenceData invocationSequenceData = new InvocationSequenceData(); invocationSequenceData.setDuration(5000d); boolean canBeDiagnosed = diagnosisService.diagnose(invocationSequenceData, baseline); assertThat(canBeDiagnosed, equalTo(true)); }
@Test public void initSuccessfully() { diagnosisService = new DiagnosisService(problemOccurrenceConsumer, new ArrayList<String>() { private static final long serialVersionUID = 1L; { add("rocks.inspectit.server.diagnosis.service.rules.testrules"); } }, 2, 50L, 2); assertThat(diagnosisService.init(), is(true)); }
@Test public void initFailureWithoutRules() { diagnosisService = new DiagnosisService(problemOccurrenceConsumer, new ArrayList<String>() { private static final long serialVersionUID = 1L; { add("rocks.inspectit.shared.all"); } }, 2, 50L, 2); InvocationSequenceData invocationSequenceData = new InvocationSequenceData(); invocationSequenceData.setDuration(5000d); assertThat(diagnosisService.init(), is(false)); }
Set<Class<?>> ruleClasses = readDiagnosisRuleClasses(); if (ruleClasses.isEmpty()) { if (LOG.isInfoEnabled()) { configuration.setNumSessionWorkers(numberOfSessionWorker); configuration.addRuleClasses(ruleClasses); configuration.setResultCollector(new ProblemOccurrenceResultCollector()); configuration.addSessionCallback(new DelegatingResultHandler());
@Test(expectedExceptions = IllegalArgumentException.class) public void initFailureWithNegativeNumberOfSessionWorkers() { diagnosisService = new DiagnosisService(problemOccurrenceConsumer, new ArrayList<String>() { private static final long serialVersionUID = 1L; { add("rocks.inspectit.server.diagnosis.service.rules.testrules"); } }, -2, 50L, 2); InvocationSequenceData invocationSequenceData = new InvocationSequenceData(); invocationSequenceData.setDuration(5000d); assertThat(diagnosisService.init(), is(false)); }
@Test public void initFailureWithRulesInPackageWithMultipleActionTag() { diagnosisService = new DiagnosisService(problemOccurrenceConsumer, new ArrayList<String>() { private static final long serialVersionUID = 1L; { add("rocks.inspectit.server.diagnosis.engine.testrules"); } }, 2, 50L, 2); InvocationSequenceData invocationSequenceData = new InvocationSequenceData(); invocationSequenceData.setDuration(5000d); assertThat(diagnosisService.init(), is(false)); }
@Test public void runDiagnosis() throws DiagnosisEngineException { double baseline = 1000; InvocationSequenceData invocationSequenceData = new InvocationSequenceData(); invocationSequenceData.setDuration(5000d); verify(engine, times(0)).analyze(invocationSequenceData, Collections.singletonMap(RuleConstants.DIAGNOSIS_VAR_BASELINE, baseline)); verify(diagnosisServiceExecutor, times(0)).execute(diagnosisService); diagnosisService.diagnose(invocationSequenceData, baseline); diagnosisService.diagnose(invocationSequenceData, baseline); diagnosisService.diagnose(invocationSequenceData, baseline); diagnosisService.run(); diagnosisService.run(); diagnosisService.run(); verify(engine, times(3)).analyze(invocationSequenceData, Collections.singletonMap(RuleConstants.DIAGNOSIS_VAR_BASELINE, baseline)); verify(diagnosisServiceExecutor, times(3)).execute(diagnosisService); }
@BeforeMethod private void init() throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException { InvocationSequenceData invocationSequenceData = new InvocationSequenceData(); invocationSequenceData.setDuration(5000d); diagnosisService = new DiagnosisService(problemOccurrenceConsumer, new ArrayList<String>() { private static final long serialVersionUID = 1L; { add("rocks.inspectit.server.diagnosis.service.rules.testrules"); } }, 2, 50L, 3); Field fieldEngine; fieldEngine = DiagnosisService.class.getDeclaredField("engine"); fieldEngine.setAccessible(true); fieldEngine.set(diagnosisService, engine); Field fieldDiagnosisServiceExecutor = DiagnosisService.class.getDeclaredField("diagnosisServiceExecutor"); fieldDiagnosisServiceExecutor.setAccessible(true); fieldDiagnosisServiceExecutor.set(diagnosisService, diagnosisServiceExecutor); }
/** * Gets the diagnosis service initializing it with the configurations established. * * @param processor * Diagnosis CMR processor. * @return Returns the diagnosis service. */ @Autowired @Bean public IDiagnosisService getDiagnosisService(DiagnosisCmrProcessor processor) { List<String> rulesPackages = new ArrayList<>(); rulesPackages.add(RULES_PACKAGE); IDiagnosisService diagnosisService = new DiagnosisService(this, rulesPackages, 2, 10L, 2); processor.setDiagnosisService(diagnosisService); return diagnosisService; }
/** * {@inheritDoc} */ @Override public void run() { try { DiagnosisInput diagnosisInput = queue.take(); engine.analyze(diagnosisInput.getInvocation(), Collections.singletonMap(RuleConstants.DIAGNOSIS_VAR_BASELINE, diagnosisInput.getBaseline())); } catch (DiagnosisEngineException e) { LOG.warn("During analyzing of DiagnosisEngine an exception occurred", e); } catch (InterruptedException e) { Thread.interrupted(); } finally { if (!diagnosisServiceExecutor.isShutdown()) { diagnosisServiceExecutor.execute(this); } } }
@Test public void processData() { cmrProcessor.setBaseline(1000); InvocationSequenceData invocationSequenceRoot = new InvocationSequenceData(); cmrProcessor.processData(invocationSequenceRoot, entityManager); verifyZeroInteractions(entityManager); verify(diagnosisService).diagnose(invocationSequenceRoot, 1000); } }
@Test(expectedExceptions = RuntimeException.class) public void collectProblemInstancesWithRuntimeExceptionProblemContext() { CauseStructure causeStructure = new CauseStructure(CauseType.SINGLE, SourceType.TIMERDATA); AggregatedDiagnosisData aggregatedInvocationSequenceData = null; aggregatedInvocationSequenceData = DiagnosisDataAggregator.getInstance().getAggregatedDiagnosisData(secondChildSequence); DiagnosisDataAggregator.getInstance().aggregate(aggregatedInvocationSequenceData, secondChildSequence); Multimap<String, Tag> tagMap = ArrayListMultimap.create(); Tag tagOne = new Tag(RuleConstants.DIAGNOSIS_TAG_GLOBAL_CONTEXT, secondChildSequence, Tags.rootTag(secondChildSequence)); Tag tagTwo = new Tag(RuleConstants.DIAGNOSIS_TAG_PROBLEM_CONTEXT, "Test", tagOne); Tag tagThree = new Tag(RuleConstants.DIAGNOSIS_TAG_PROBLEM_CAUSE, aggregatedInvocationSequenceData, tagTwo); Tag tagFour = new Tag(RuleConstants.DIAGNOSIS_TAG_CAUSE_STRUCTURE, causeStructure, tagThree); tagMap.put("D", tagFour); when(sessionContext.getInput()).thenReturn(secondChildSequence); when(sessionContext.getStorage()).thenReturn(storage); when(storage.mapTags(TagState.LEAF)).thenReturn(tagMap); ProblemOccurrenceResultCollector problemInstanceResultCollector = new ProblemOccurrenceResultCollector(); List<ProblemOccurrence> problemOccurrence = problemInstanceResultCollector.collect(sessionContext); assertThat(problemOccurrence, hasSize(0)); }
@Test public void stopDiagnosis() throws DiagnosisEngineException { double baseline = 1000; InvocationSequenceData invocationSequenceData = new InvocationSequenceData(); when(diagnosisServiceExecutor.isShutdown()).thenReturn(true); diagnosisService.diagnose(invocationSequenceData, baseline); diagnosisService.run(); verify(engine, times(1)).analyze(invocationSequenceData, Collections.singletonMap(RuleConstants.DIAGNOSIS_VAR_BASELINE, baseline)); verify(diagnosisServiceExecutor, times(0)).execute(diagnosisService); } }