/** * {@inheritDoc} */ @Override public void beforeBody(long methodId, long sensorTypeId, Object object, Object[] parameters, RegisteredSensorConfig rsc) { if (!REF_MARKER.isMarkerSet()) { // get requestAdapter and handle AsyncClientRequestAdapter<?> adapter = asyncClientAdapterProvider.getAsyncClientRequestAdapter(object, parameters, rsc); if (null != adapter) { SpanImpl span = clientInterceptor.handleAsyncRequest(adapter); if (null != span) { span.setTag(ExtraTags.INSPECTT_METHOD_ID, methodId); span.setTag(ExtraTags.INSPECTT_SENSOR_ID, sensorTypeId); asyncSpanContextListener.asyncSpanContextCreated(span.context()); if (LOG.isDebugEnabled()) { LOG.debug("Remote async client hook before body span " + span); } } } } REF_MARKER.markCall(); }
@Test public void consecutiveCalls() throws Exception { SpanStore spanStore = mock(SpanStore.class); Object[] parameters = new Object[] { spanStore }; SpanBuilderImpl builder = mock(SpanBuilderImpl.class); SpanImpl span = mock(SpanImpl.class); SpanContextImpl spanContext = mock(SpanContextImpl.class); when(span.context()).thenReturn(spanContext); when(tracer.buildSpan(null, References.FOLLOWS_FROM, true)).thenReturn(builder); when(builder.build()).thenReturn(span); when(tracer.isCurrentContextExisting()).thenReturn(true); hook.beforeBody(1L, 2L, targetObject, parameters, rsc); hook.firstAfterBody(1L, 2L, targetObject, parameters, result, false, rsc); hook.secondAfterBody(null, 1L, 2L, targetObject, parameters, spanContext, false, rsc); hook.beforeBody(1L, 2L, targetObject, parameters, rsc); hook.firstAfterBody(1L, 2L, targetObject, parameters, result, false, rsc); hook.secondAfterBody(null, 1L, 2L, targetObject, parameters, spanContext, false, rsc); verify(tracer, times(2)).buildSpan(null, References.FOLLOWS_FROM, true); verify(builder, times(2)).withTag(ExtraTags.PROPAGATION_TYPE, PropagationType.PROCESS.toString()); verify(builder, times(2)).withTag(Tags.SPAN_KIND.getKey(), Tags.SPAN_KIND_SERVER); verify(builder, times(2)).withTag(ExtraTags.INSPECTT_METHOD_ID, 1L); verify(builder, times(2)).withTag(ExtraTags.INSPECTT_SENSOR_ID, 2L); verify(builder, times(2)).build(); verify(spanStore, times(2)).storeSpan(span); verify(asyncListener, times(2)).asyncSpanContextCreated(spanContext); verifyNoMoreInteractions(tracer, builder, spanStore, asyncListener); } }
@Test public void successful() throws Exception { SpanStore spanStore = mock(SpanStore.class); Object[] parameters = new Object[] { spanStore }; SpanBuilderImpl builder = mock(SpanBuilderImpl.class); SpanImpl span = mock(SpanImpl.class); SpanContextImpl spanContext = mock(SpanContextImpl.class); when(span.context()).thenReturn(spanContext); when(tracer.buildSpan(null, References.FOLLOWS_FROM, true)).thenReturn(builder); when(builder.build()).thenReturn(span); when(tracer.isCurrentContextExisting()).thenReturn(true); hook.beforeBody(1L, 2L, targetObject, parameters, rsc); hook.firstAfterBody(1L, 2L, targetObject, parameters, result, false, rsc); hook.secondAfterBody(null, 1L, 2L, targetObject, parameters, spanContext, false, rsc); verify(tracer).buildSpan(null, References.FOLLOWS_FROM, true); verify(builder).withTag(ExtraTags.PROPAGATION_TYPE, PropagationType.PROCESS.toString()); verify(builder).withTag(Tags.SPAN_KIND.getKey(), Tags.SPAN_KIND_SERVER); verify(builder).withTag(ExtraTags.INSPECTT_METHOD_ID, 1L); verify(builder).withTag(ExtraTags.INSPECTT_SENSOR_ID, 2L); verify(builder).build(); verify(spanStore).storeSpan(span); verify(asyncListener).asyncSpanContextCreated(spanContext); verifyNoMoreInteractions(tracer, builder, spanStore, asyncListener); }
@Test public void happyPath() throws Exception { // ids boolean exception = RandomUtils.nextBoolean(); long methodId = 7l; long sensorId = 13l; long spanId = 17l; // interceptor Object[] parameters = new String[] { "blah", "bla" }; doReturn(requestAdapter).when(adapterProvider).getAsyncClientRequestAdapter(object, parameters, rsc); SpanContextImpl context = mock(SpanContextImpl.class); when(context.getId()).thenReturn(spanId); SpanImpl spanImpl = mock(SpanImpl.class); when(spanImpl.context()).thenReturn(context); when(spanImpl.isClient()).thenReturn(true); when(clientInterceptor.handleAsyncRequest(requestAdapter)).thenReturn(spanImpl); // execute calls hook.beforeBody(methodId, sensorId, object, parameters, rsc); hook.firstAfterBody(methodId, sensorId, object, parameters, result, exception, rsc); hook.secondAfterBody(coreService, methodId, sensorId, object, parameters, result, exception, rsc); verify(asyncContextListener).asyncSpanContextCreated(context); verify(spanImpl).setTag(ExtraTags.INSPECTT_METHOD_ID, methodId); verify(spanImpl).setTag(ExtraTags.INSPECTT_SENSOR_ID, sensorId); // verify timer, interceptor and adapters verify(clientInterceptor).handleAsyncRequest(requestAdapter); verify(adapterProvider).getAsyncClientRequestAdapter(object, parameters, rsc); verifyNoMoreInteractions(adapterProvider, clientInterceptor, coreService, asyncContextListener); }
hook.secondAfterBody(coreService, methodId, sensorId, object, parameters, result, false, rsc); verify(asyncContextListener).asyncSpanContextCreated(context); verify(spanImpl).setTag(ExtraTags.INSPECTT_METHOD_ID, methodId); verify(spanImpl).setTag(ExtraTags.INSPECTT_SENSOR_ID, sensorId);
@Test public void nestedCalls() throws Exception { SpanStore spanStore = mock(SpanStore.class); Object[] parameters = new Object[] { spanStore }; SpanBuilderImpl builder = mock(SpanBuilderImpl.class); SpanImpl span = mock(SpanImpl.class); SpanContextImpl spanContext = mock(SpanContextImpl.class); when(span.context()).thenReturn(spanContext); when(tracer.buildSpan(null, References.FOLLOWS_FROM, true)).thenReturn(builder); when(builder.build()).thenReturn(span); when(tracer.isCurrentContextExisting()).thenReturn(true); hook.beforeBody(1L, 2L, targetObject, parameters, rsc); hook.beforeBody(1L, 2L, targetObject, parameters, rsc); hook.firstAfterBody(1L, 2L, targetObject, parameters, result, false, rsc); hook.secondAfterBody(null, 1L, 2L, targetObject, parameters, spanContext, false, rsc); hook.firstAfterBody(1L, 2L, targetObject, parameters, result, false, rsc); hook.secondAfterBody(null, 1L, 2L, targetObject, parameters, spanContext, false, rsc); verify(tracer).buildSpan(null, References.FOLLOWS_FROM, true); verify(builder).withTag(ExtraTags.PROPAGATION_TYPE, PropagationType.PROCESS.toString()); verify(builder).withTag(Tags.SPAN_KIND.getKey(), Tags.SPAN_KIND_SERVER); verify(builder).withTag(ExtraTags.INSPECTT_METHOD_ID, 1L); verify(builder).withTag(ExtraTags.INSPECTT_SENSOR_ID, 2L); verify(builder).build(); verify(spanStore).storeSpan(span); verify(asyncListener).asyncSpanContextCreated(spanContext); verifyNoMoreInteractions(tracer, builder, spanStore, asyncListener); }
/** * {@inheritDoc} */ @Override public void beforeBody(long methodId, long sensorTypeId, Object object, Object[] parameters, RegisteredSensorConfig rsc) { if (!REF_MARKER.isMarkerSet()) { if ((parameters.length > 0) && (parameters[0] instanceof SpanStore)) { SpanBuilderImpl builder = tracer.buildSpan(null, References.FOLLOWS_FROM, true); builder.withTag(ExtraTags.PROPAGATION_TYPE, PropagationType.PROCESS.toString()); builder.withTag(Tags.SPAN_KIND.getKey(), Tags.SPAN_KIND_SERVER); builder.withTag(ExtraTags.INSPECTT_METHOD_ID, methodId); builder.withTag(ExtraTags.INSPECTT_SENSOR_ID, sensorTypeId); SpanImpl span = builder.build(); SpanStore spanStore = (SpanStore) parameters[0]; spanStore.storeSpan(span); asyncSpanContextListener.asyncSpanContextCreated(span.context()); } } REF_MARKER.markCall(); }