/** * {@inheritDoc} */ @Override protected void processData(DefaultData defaultData, EntityManager entityManager) { InvocationSequenceData invocSequence = (InvocationSequenceData) defaultData; assignBusinessContext(invocSequence); }
/** * {@inheritDoc} */ @Override protected void processData(DefaultData defaultData, EntityManager entityManager) { connectErrorMessagesInExceptionData((ExceptionSensorData) defaultData); }
/** * {@inheritDoc} */ @Override protected void processData(DefaultData defaultData, EntityManager entityManager) { InvocationSequenceData invocation = (InvocationSequenceData) defaultData; extractDataFromInvocation(entityManager, invocation, invocation); }
@Test public void dataIsNotProcessedWhenInfluxIsNotActive() { DefaultData invocationSequenceRoot = mock(DefaultData.class); cmrProcessor.setBaseline(1000); cmrProcessor.setDiagnosisEnabled(true); cmrProcessor.setInfluxActive(false); boolean canBeProcessed = cmrProcessor.canBeProcessed(invocationSequenceRoot); assertThat("Data cannot be processed if influx is not active.", canBeProcessed, is(false)); }
@Test public void dataIsNotProcessedWhenIsNotAnInvocationSequenceDataInstance() { DefaultData invocationSequenceRoot = mock(DefaultData.class); cmrProcessor.setDiagnosisEnabled(true); cmrProcessor.setInfluxActive(true); boolean canBeProcessed = cmrProcessor.canBeProcessed(invocationSequenceRoot); assertThat("Data cannot be processed if ther is not a InvocationSequenceData.", canBeProcessed, is(false)); }
/** * Process all the exceptions in the invData and passes exceptions to the chained processors. * <br> * <br> * Note also that only exception data with CREATED event are processed, since the PASSED and * HANDLED should be connected as children to the CREATED one. * * @param entityManager * {@link EntityManager} needed for DB persistence. * @param invData * Invocation data to be processed. * @param topInvocationParent * Top invocation object. */ private void processExceptionSensorData(EntityManager entityManager, InvocationSequenceData invData, InvocationSequenceData topInvocationParent) { if (CollectionUtils.isNotEmpty(invData.getExceptionSensorDataObjects())) { for (ExceptionSensorData exceptionData : invData.getExceptionSensorDataObjects()) { if (exceptionData.getExceptionEvent() == ExceptionEvent.CREATED) { // only if created exception is in invocation set to the parent topInvocationParent.setNestedExceptions(Boolean.TRUE); // we need to directly call Exception message processor, cause it can not be // chained exceptionMessageCmrProcessor.process(exceptionData, entityManager); exceptionData.addInvocationParentId(topInvocationParent.getId()); passToChainedProcessors(exceptionData, entityManager); } } } }
/** * {@inheritDoc} */ @Override protected void processData(DefaultData defaultData, EntityManager entityManager) { if (defaultData instanceof HttpTimerData) { try { HttpTimerData original = (HttpTimerData) defaultData; HttpInfo httpInfo = getHttpInfo(original, entityManager); HttpTimerData clone = getClone(original); clone.setHttpInfo(httpInfo); entityManager.persist(clone); } catch (SerializationException e) { log.warn("TimerDataChartingCmrProcessor failed to clone the given HttpTimerData", e); } } else { timerDataAggregator.processTimerData((TimerData) defaultData); } }
/** * {@inheritDoc} */ @Override protected void processData(DefaultData data, EntityManager entityManager) { if (data instanceof EUMSpan) { EUMSpan frontEndSpan = (EUMSpan) data; AbstractEUMSpanDetails details = frontEndSpan.getDetails(); if (details instanceof PageLoadRequest) { long traceId = frontEndSpan.getSpanIdent().getTraceId(); long eumSpanId = frontEndSpan.getSpanIdent().getId(); // if the ids are equal no correlation takes place, e.g. because the html was // cached. if (traceId != eumSpanId) { EumSpanCorrelationTask correlationTask = new EumSpanCorrelationTask(traceId, eumSpanId); correlationTask.schedule(true); } } } }
/** * Tests the {@link CacheIdGeneratorCmrProcessor}. */ @Test public void cacheIdProcessor() { CacheIdGeneratorCmrProcessor processor = new CacheIdGeneratorCmrProcessor(); processor.cacheIdGenerator = cacheIdGenerator; // don't fail on null processor.process((DefaultData) null, entityManager); verifyZeroInteractions(cacheIdGenerator, entityManager); // assign Id otherwise DefaultData defaultData = mock(DefaultData.class); processor.process(defaultData, entityManager); verify(cacheIdGenerator, times(1)).assignObjectAnId(defaultData); verifyZeroInteractions(entityManager); }
/** * Tests the {@link TimerDataChartingCmrProcessor} when influx is active. */ @Test public void chartingProcessorInfluxActive() throws CloneNotSupportedException, SerializationException { TimerDataChartingCmrProcessor processor = new TimerDataChartingCmrProcessor(); processor.timerDataAggregator = timerDataAggregator; processor.serializationManager = serializationManager; processor.influxActive = true; // don't write TimerData timerData = new TimerData(); timerData.setCharting(true); processor.process(timerData, entityManager); verifyZeroInteractions(timerDataAggregator, entityManager); }
@Test public void processData() { cmrProcessor.setBaseline(1000); InvocationSequenceData invocationSequenceRoot = new InvocationSequenceData(); cmrProcessor.processData(invocationSequenceRoot, entityManager); verifyZeroInteractions(entityManager); verify(diagnosisService).diagnose(invocationSequenceRoot, 1000); } }
/** * Process SQL statement if one exists in the invData object and passes it to the chained * processors. * * @param entityManager * {@link EntityManager} needed for DB persistence. * @param invData * Invocation data to be processed. * @param topInvocationParent * Top invocation object. */ private void processSqlStatementData(EntityManager entityManager, InvocationSequenceData invData, InvocationSequenceData topInvocationParent) { SqlStatementData sqlStatementData = invData.getSqlStatementData(); if (null != sqlStatementData) { topInvocationParent.setNestedSqlStatements(Boolean.TRUE); sqlStatementData.addInvocationParentId(topInvocationParent.getId()); passToChainedProcessors(sqlStatementData, entityManager); } }
/** * {@inheritDoc} */ @Override public boolean canBeProcessed(DefaultData defaultData) { return influxDbDao.isConnected() && builderMap.containsKey(defaultData.getClass()) && isValidData(defaultData); }
@Test public void invalidInputData() { TimerData invalidInput = new TimerData(); processor.process(invalidInput, entityManager); verifyNoMoreInteractions(ciService); }
@Override public void run() { boolean reschedule = true; try { SpanIdent backEndSpanIdent = new SpanIdent(traceId, traceId); AbstractSpan backEndSpan = spanDao.get(backEndSpanIdent); if (backEndSpan != null) { backEndSpan.setParentSpanId(eumSpanId); reschedule = false; } } finally { if (reschedule) { schedule(false); // retry later } } }
@Test public void dataIsNotProcessedWhenDiagnosisIsNotEnabled() { DefaultData invocationSequenceRoot = mock(DefaultData.class); cmrProcessor.setBaseline(1000); cmrProcessor.setDiagnosisEnabled(false); cmrProcessor.setInfluxActive(true); boolean canBeProcessed = cmrProcessor.canBeProcessed(invocationSequenceRoot); assertThat("Data cannot be processed if diagnosis is not enabled.", canBeProcessed, is(false)); }
/** * Connects exception message between linked exception data. * * @param exceptionSensorData * Parent exception data, thus the one that has exception event CREATED. */ private void connectErrorMessagesInExceptionData(ExceptionSensorData exceptionSensorData) { ExceptionSensorData child = exceptionSensorData.getChild(); if (null != child) { child.setErrorMessage(exceptionSensorData.getErrorMessage()); connectErrorMessagesInExceptionData(child); } }
/** * Process timer data if one exists in the invData object and passes it to the chained * processors. * * @param entityManager * {@link EntityManager} needed for DB persistence. * @param invData * Invocation data to be processed. * @param topInvocationParent * Top invocation object. * @param exclusiveDurationDelta * Duration to subtract from timer duration to get the exclusive duration. */ private void processTimerData(EntityManager entityManager, InvocationSequenceData invData, InvocationSequenceData topInvocationParent, double exclusiveDurationDelta) { TimerData timerData = invData.getTimerData(); if (null != timerData) { double exclusiveTime = invData.getTimerData().getDuration() - exclusiveDurationDelta; timerData.setExclusiveCount(1L); timerData.setExclusiveDuration(exclusiveTime); timerData.calculateExclusiveMax(exclusiveTime); timerData.calculateExclusiveMin(exclusiveTime); timerData.addInvocationParentId(topInvocationParent.getId()); passToChainedProcessors(invData.getTimerData(), entityManager); } }
@Test public void dataIsNotProcessedWhenTheTimeLowerThanTheBaseline() { InvocationSequenceData invocationSequenceRoot = new InvocationSequenceData(); invocationSequenceRoot.setId(1); invocationSequenceRoot.setDuration(500d); cmrProcessor.setBaseline(1000); cmrProcessor.setDiagnosisEnabled(true); cmrProcessor.setInfluxActive(true); boolean canBeProcessed = cmrProcessor.canBeProcessed(invocationSequenceRoot); assertThat("Data cannot be processed when time is lower than the set in the baseline.", canBeProcessed, is(false)); }
@Test public void dataIsProcessedWhenAllTheConditionsAreFulfilled() { InvocationSequenceData invocationSequenceRoot = new InvocationSequenceData(); invocationSequenceRoot.setId(1); invocationSequenceRoot.setDuration(1500d); cmrProcessor.setBaseline(1000); cmrProcessor.setDiagnosisEnabled(true); cmrProcessor.setInfluxActive(true); boolean canBeProcessed = cmrProcessor.canBeProcessed(invocationSequenceRoot); assertThat("Data must be processed when all the conditions are fulfilled. ", canBeProcessed, is(true)); } }