@Test public void dispatchNoConstructorHooks() { int methodId = 3; Object object = mock(Object.class); Object[] parameters = new Object[0]; RegisteredSensorConfig registeredSensorConfig = mock(RegisteredSensorConfig.class); when(registeredSensorConfig.getMethodSensors()).thenReturn(Collections.<IMethodSensor> emptyList()); when(registeredSensorConfig.getMethodSensorsReverse()).thenReturn(Collections.<IMethodSensor> emptyList()); hookDispatcher.addMapping(methodId, registeredSensorConfig); hookDispatcher.dispatchConstructorBeforeBody(methodId, parameters); verify(registeredSensorConfig, times(1)).isStartsInvocation(); verify(registeredSensorConfig, times(1)).getMethodSensorsReverse(); hookDispatcher.dispatchConstructorAfterBody(methodId, object, parameters); verify(registeredSensorConfig, times(2)).isStartsInvocation(); verify(registeredSensorConfig, times(1)).getMethodSensors(); verifyZeroInteractions(object, coreService); verifyNoMoreInteractions(registeredSensorConfig); }
/** * {@inheritDoc} */ @Override public void secondAfterBody(ICoreService coreService, long methodId, long sensorTypeId, Object object, Object[] parameters, Object result, boolean exception, RegisteredSensorConfig rsc) { // NOCHK:8-params if (threadLast.get().booleanValue()) { threadLast.set(Boolean.FALSE); List<String> parameterTypes = rsc.getParameterTypes(); if (METHOD_VALUE_MAP.containsKey(rsc.getTargetMethodName()) && !parameterTypes.isEmpty() && "int".equals(parameterTypes.get(0))) { // subtract one as the index starts at 1, and not at 0 int index = ((Integer) parameters[0]).intValue() - 1; Object value = METHOD_VALUE_MAP.get(rsc.getTargetMethodName()); statementStorage.addParameter(object, index, value); } else if ((parameterTypes.size() >= 2) && "int".equals(parameterTypes.get(0))) { // subtract one as the index starts at 1, and not at 0 int index = ((Integer) parameters[0]).intValue() - 1; Object value = parameters[1]; statementStorage.addParameter(object, index, value); } else if ("clearParameters".equals(rsc.getTargetMethodName())) { statementStorage.clearParameters(object); } } }
@Test public void propertyAccessException() { // set up data long platformId = 1L; long methodId = 3L; long sensorTypeId = 11L; Object object = mock(Object.class); Object[] parameters = new Object[2]; Object result = mock(Object.class); Double firstTimerValue = 1000.453d; Double secondTimerValue = 1323.675d; when(timer.getCurrentTime()).thenReturn(firstTimerValue).thenReturn(secondTimerValue); when(platformManager.getPlatformId()).thenReturn(platformId); when(rsc.isPropertyAccess()).thenReturn(true); invocationSequenceHook.beforeBody(methodId, sensorTypeId, object, parameters, rsc); invocationSequenceHook.firstAfterBody(methodId, sensorTypeId, object, parameters, result, true, rsc); invocationSequenceHook.secondAfterBody(coreService, methodId, sensorTypeId, object, parameters, result, true, rsc); verify(rsc, times(1)).isPropertyAccess(); verify(propertyAccessor, times(1)).getParameterContentData(rsc.getPropertyAccessorList(), object, parameters, result, true); }
ArgumentCaptor<RegisteredSensorConfig> rscCaptor = ArgumentCaptor.forClass(RegisteredSensorConfig.class); verify(hookDispatcherMapper, times(1)).addMapping(eq(rscId), rscCaptor.capture()); assertThat(rscCaptor.getValue().getId(), is(rscId)); assertThat(rscCaptor.getValue().getMethodSensors(), hasSize(1)); assertThat(rscCaptor.getValue().getMethodSensors(), hasItem(methodSensor)); assertThat(rscCaptor.getValue().getTargetClassFqn(), is(methodInstrumentationConfig.getTargetClassFqn())); assertThat(rscCaptor.getValue().getTargetMethodName(), is(methodInstrumentationConfig.getTargetMethodName())); assertThat(rscCaptor.getValue().getReturnType(), is(methodInstrumentationConfig.getReturnType())); assertThat(rscCaptor.getValue().isStartsInvocation(), is(sensorInstrumentationPoint.isStartsInvocation())); assertThat(rscCaptor.getValue().getSettings(), is(sensorInstrumentationPoint.getSettings())); assertThat(rscCaptor.getValue().getPropertyAccessorList(), is(sensorInstrumentationPoint.getPropertyAccessorList())); verifyNoMoreInteractions(hookDispatcherMapper, connection, classHashHelper);
/** * Returns if the given {@link InvocationSequenceData} should be removed due to the exception * constructor delegation. * * @param rsc * {@link RegisteredSensorConfig} * @param invocationSequenceData * {@link InvocationSequenceData} to check. * @return True if the invocation should be removed. */ private boolean removeDueToExceptionDelegation(RegisteredSensorConfig rsc, InvocationSequenceData invocationSequenceData) { List<IMethodSensor> sensors = rsc.getMethodSensors(); if (1 == sensors.size()) { MethodSensorTypeConfig methodSensorTypeConfig = sensors.get(0).getSensorTypeConfig(); if (ExceptionSensor.class.getName().equals(methodSensorTypeConfig.getClassName())) { return CollectionUtils.isEmpty(invocationSequenceData.getExceptionSensorDataObjects()); } } return false; }
if (rsc.isPropertyAccess()) { parameterContentData = propertyAccessor.getParameterContentData(rsc.getPropertyAccessorList(), object, parameters, result, exception); timerData.calculateCpuMin(cpuDuration); boolean charting = Boolean.TRUE.equals(rsc.getSettings().get("charting")); timerData.setCharting(charting);
/** * Gets the message object from the parameters. This method will consult the * {@link RegisteredSensorConfig} in order to find parameter index with the FQN of * {@value JmsMessage#JAVAX_JMS_MESSAGE}. * * @param parameters * Parameters of method invocation. * @param rsc * {@link RegisteredSensorConfig} * @return Message object or <code>null</code> if one can not be located. */ private Object getMessage(Object[] parameters, RegisteredSensorConfig rsc) { int index = rsc.getParameterTypes().indexOf(JmsMessage.JAVAX_JMS_MESSAGE); if (index >= 0) { return parameters[index]; } return null; }
when(platformManager.getPlatformId()).thenReturn(platformId); when(registeredSensorConfig.getSettings()).thenReturn(Collections.<String, Object> singletonMap("charting", Boolean.TRUE)); verify(registeredSensorConfig).isPropertyAccess(); verify(registeredSensorConfig).getSettings();
RegisteredSensorConfig rsc = mappings.get(id); if (rsc.isStartsInvocation()) { for (IMethodSensor methodSensor : rsc.getMethodSensorsReverse()) { IConstructorHook constructorHook = (IConstructorHook) methodSensor.getHook(); constructorHook.beforeConstructor(id, methodSensor.getSensorTypeConfig().getId(), parameters, rsc);
for (IMethodSensor methodSensor : rsc.getMethodSensors()) { IConstructorHook constructorHook = (IConstructorHook) methodSensor.getHook(); for (IMethodSensor methodSensor : rsc.getMethodSensors()) { IConstructorHook constructorHook = (IConstructorHook) methodSensor.getHook(); constructorHook.afterConstructor(coreService, id, methodSensor.getSensorTypeConfig().getId(), object, parameters, rsc); if (rsc.isStartsInvocation()) { invocationSequenceCount.decrement();
Map<String, Object> map = new HashMap<String, Object>(); map.put("minduration", minDuration); when(rsc.getSettings()).thenReturn(map); when(rsc.getMethodSensors()).thenReturn(Collections.singletonList(methodSensor)); when(methodSensor.getSensorTypeConfig()).thenReturn(methodSensorTypeConfig);
/** * {@inheritDoc} */ @Override public void afterConstructor(ICoreService coreService, long methodId, long sensorTypeId, Object object, Object[] parameters, RegisteredSensorConfig rsc) { // getting the actual object class and comparing to the registered sensor config target // class String throwableClass = object.getClass().getName(); String rscTragetClassname = rsc.getTargetClassFqn(); if (throwableClass.equals(rscTragetClassname)) { long platformId = platformManager.getPlatformId(); Timestamp timestamp = new Timestamp(System.currentTimeMillis()); Long identityHash = Long.valueOf(System.identityHashCode(object)); // need to reset the exception handler id exceptionHandlerId.set(null); // getting the actual object with information Throwable throwable = (Throwable) object; // creating the data object ExceptionSensorData data = new ExceptionSensorData(timestamp, platformId, sensorTypeId, methodId); data.setThrowableIdentityHashCode(identityHash.longValue()); data.setExceptionEvent(ExceptionEvent.CREATED); data.setThrowableType(throwable.getClass().getName()); // set the static information of the current object setStaticInformation(data, throwable); // creating the mapping object and setting it on the thread local exceptionDataHolder.set(new IdentityHashToDataObject(identityHash, data)); // adding the data object to the core service coreService.addDefaultData(data); } }
/** * {@inheritDoc} */ @Override public ResponseAdapter getClientResponseAdapter(Object object, Object[] parameters, Object result, boolean exception, RegisteredSensorConfig rsc) { Object urlConnection = object; if ((urlConnection instanceof HttpURLConnection) && GET_INPUT_STREAM_METHOD.equals(rsc.getTargetMethodName())) { HttpResponse response = new UrlConnectionHttpClientRequestResponse((HttpURLConnection) urlConnection); HttpResponseAdapter adapter = new HttpResponseAdapter(response); if (exception) { // we can delegate as we don't depend on result return new ThrowableAwareResponseAdapter(adapter, result.getClass().getSimpleName()); } else { return adapter; } } else { return null; } }
@Test public void charting() { // set up data long platformId = 1L; long methodId = 3L; long sensorTypeId = 11L; Object object = mock(Object.class); Object[] parameters = new Object[2]; Object result = mock(Object.class); Double firstTimerValue = 1000.453d; Double secondTimerValue = 1323.675d; when(timer.getCurrentTime()).thenReturn(firstTimerValue).thenReturn(secondTimerValue); when(platformManager.getPlatformId()).thenReturn(platformId); when(registeredSensorConfig.getSettings()).thenReturn(Collections.<String, Object> singletonMap("charting", Boolean.TRUE)); timerHook.beforeBody(methodId, sensorTypeId, object, parameters, registeredSensorConfig); timerHook.firstAfterBody(methodId, sensorTypeId, object, parameters, result, false, registeredSensorConfig); timerHook.secondAfterBody(coreService, methodId, sensorTypeId, object, parameters, result, false, registeredSensorConfig); ArgumentCaptor<TimerData> captor = ArgumentCaptor.forClass(TimerData.class); verify(coreService).addDefaultData(captor.capture()); TimerData timerData = captor.getValue(); assertThat(timerData.isCharting(), is(true)); }
ArgumentCaptor<RegisteredSensorConfig> rscCaptor = ArgumentCaptor.forClass(RegisteredSensorConfig.class); verify(hookDispatcherMapper, times(1)).addMapping(eq(rscId), rscCaptor.capture()); assertThat(rscCaptor.getValue().getId(), is(rscId)); assertThat(rscCaptor.getValue().getMethodSensors(), hasSize(1)); assertThat(rscCaptor.getValue().getMethodSensors(), hasItem(methodSensor)); assertThat(rscCaptor.getValue().getTargetClassFqn(), is(methodInstrumentationConfig.getTargetClassFqn())); assertThat(rscCaptor.getValue().getTargetMethodName(), is(methodInstrumentationConfig.getTargetMethodName())); assertThat(rscCaptor.getValue().getReturnType(), is(methodInstrumentationConfig.getReturnType())); assertThat(rscCaptor.getValue().isStartsInvocation(), is(sensorInstrumentationPoint.isStartsInvocation())); assertThat(rscCaptor.getValue().getSettings(), is(sensorInstrumentationPoint.getSettings())); assertThat(rscCaptor.getValue().getPropertyAccessorList(), is(sensorInstrumentationPoint.getPropertyAccessorList())); ArgumentCaptor<Map> captor = ArgumentCaptor.forClass(Map.class); verify(connection, times(1)).isConnected();
List<IMethodSensor> sensors = rsc.getMethodSensors(); if ((1 == sensors.size()) || ((2 == sensors.size()) && enhancedExceptionSensor)) { for (IMethodSensor methodSensor : sensors) {
if (rsc.isPropertyAccess()) { List<ParameterContentData> parameterContentData = propertyAccessor.getParameterContentData(rsc.getPropertyAccessorList(), object, parameters, result, exception); } else { if (rsc.getSettings().containsKey("minduration")) { Long minDuration = (Long) rsc.getSettings().get("minduration"); minDurationMap.put(invocationStartId.get(), minDuration.doubleValue()); checkForSavingOrNot(coreService, rsc, invocationSequenceData, startTime, endTime, duration);
@Test public void propertyAccessException() { // set up data long platformId = 1L; long methodId = 3L; long sensorTypeId = 11L; Object object = mock(Object.class); Object[] parameters = new Object[2]; Object result = mock(Object.class); Double firstTimerValue = 1000.453d; Double secondTimerValue = 1323.675d; when(timer.getCurrentTime()).thenReturn(firstTimerValue).thenReturn(secondTimerValue); when(platformManager.getPlatformId()).thenReturn(platformId); when(registeredSensorConfig.isPropertyAccess()).thenReturn(true); timerHook.beforeBody(methodId, sensorTypeId, object, parameters, registeredSensorConfig); timerHook.firstAfterBody(methodId, sensorTypeId, object, parameters, result, true, registeredSensorConfig); timerHook.secondAfterBody(coreService, methodId, sensorTypeId, object, parameters, result, true, registeredSensorConfig); verify(registeredSensorConfig, times(1)).isPropertyAccess(); verify(propertyAccessor, times(1)).getParameterContentData(registeredSensorConfig.getPropertyAccessorList(), object, parameters, result, true); }
@Test public void spanStarting() { when(rsc.getParameterTypes()).thenReturn(Collections.singletonList("javax.jms.Message")); ClientRequestAdapter<TextMap> adapter = sensor.getClientRequestAdapter(object, new Object[] { message }, rsc); assertThat(adapter.startClientSpan(), is(true)); }