/** * {@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); } } } }
/** * Handles teh arrival of a new PageLoadRequest. * * @param plr * the received pageloadrequest */ private void newPageLoadRequestReceived(PageLoadRequest plr) { Long sessionID = plr.getOwningSpan().getSessionId(); Long tabID = plr.getOwningSpan().getTabId(); Pair<Long, Long> plrSessionTabId = new Pair<Long, Long>(sessionID, tabID); pageLoadRequestCache.put(plrSessionTabId, plr); Iterator<AbstractEUMSpanDetails> it = missingPageLoadRequestsMap.get(plrSessionTabId).iterator(); while (it.hasNext()) { AbstractEUMSpanDetails next = it.next(); it.remove(); tryPointBuildingForPendingElement(next); } }
/** * Sets teh details object. Should only be called once! * * @param eumDetails * the details. */ void setDetails(AbstractEUMSpanDetails eumDetails) { this.details = eumDetails; eumDetails.setOwningSpan(this); if (eumDetails.isAsyncCall() && !isRoot()) { setReferenceType(References.FOLLOWS_FROM); } else { setReferenceType(References.CHILD_OF); } this.setPropagationType(eumDetails.getPropagationType()); }
@Test public void testAllDataAvailable() throws IOException { ObjectNode node = buildEventListenerRecord(); EUMSpan span = performDeserialization(node); assertThat(span.getDetails(), instanceOf(JSEventListenerExecution.class)); assertThat(span.getSpanIdent().getId(), equalTo(ELEMENT_ID)); assertThat(span.getSpanIdent().getTraceId(), equalTo(TRACE_ID)); assertThat(span.getParentSpanId(), equalTo(PARENT_ID)); assertThat(span.getTimeStamp().getTime(), equalTo(ENTER_TIMESTAMP)); assertThat(span.getDuration(), equalTo(DURATION)); JSEventListenerExecution exec = (JSEventListenerExecution) span.getDetails(); assertThat(exec.getFunctionName(), equalTo(FUNCTION_NAME)); assertThat(exec.getEventType(), equalTo(EVENT_TYPE)); }
@BeforeMethod public void initMocks() { super.initMocks(request); when(request.getOwningSpan().getTimeStamp()).thenReturn(new Timestamp(ENTER_TIMESTAMP)); when(request.getOwningSpan().getDuration()).thenReturn(DURATION); when(request.getTransferSize()).thenReturn(TRANSFER_SIZE); when(request.getInitiatorType()).thenReturn(INITIATOR_TYPE); when(request.getBaseUrl()).thenReturn(PAGELOAD_URL); }
EUMSpan span = (EUMSpan) element; boolean isBrowserInfoCaptured = span.getActiveAgentModules().contains(String.valueOf(JSAgentModule.BROWSERINFO_MODULE.getIdentifier())); AbstractEUMSpanDetails details = span.getDetails(); if (details != null) { if (details instanceof PageLoadRequest) { UserSessionInfo sessInfo = null; Long sessId = span.getSessionId(); Long tabId = span.getTabId(); Pair<Long, Long> plrSessionTabId = new Pair<Long, Long>(sessId, tabId);
@BeforeMethod public void initMocks() { doAnswer(new Answer<ScheduledFuture<Void>>() { @Override public ScheduledFuture<Void> answer(InvocationOnMock invocation) throws Throwable { ((Runnable) invocation.getArguments()[0]).run(); return null; } }).when(scheduledExecutor).schedule(any(Runnable.class), anyLong(), any()); when(backEndSpan.getPropagationType()).thenReturn(PropagationType.HTTP); when(backEndSpan.isRoot()).thenReturn(true); when(backEndSpan.getSpanIdent()).thenReturn(backEndIdent); when(frontEndSpan.getPropagationType()).thenReturn(PropagationType.HTTP); when(frontEndSpan.isRoot()).thenReturn(true); PageLoadRequest details = mock(PageLoadRequest.class); when(frontEndSpan.getDetails()).thenReturn(details); when(frontEndSpan.getDetails()).thenReturn(spanDetails); when(frontEndSpan.getSpanIdent()).thenReturn(frontEndIdent); }
@BeforeMethod public void setup() { subBuilder = new DummyPointBuilder(); builder = new EUMCachingParentPointBuilder(Collections.<AbstractEUMPointBuilder<?>> singletonList(subBuilder)); when(sessionInfo.getSessionId()).thenReturn(SESSION_ID); EUMSpan plrSpan = Mockito.mock(EUMSpan.class); when(plrSpan.getDetails()).thenReturn(pageLoadRequest); when(pageLoadRequest.getOwningSpan()).thenReturn(plrSpan); when(plrSpan.getTabId()).thenReturn(TAB_ID); when(plrSpan.getSessionId()).thenReturn(SESSION_ID); }
/** * {@inheritDoc} */ @Override public boolean canBeProcessed(DefaultData data) { if (data instanceof EUMSpan) { AbstractEUMSpanDetails details = ((EUMSpan) data).getDetails(); if (details instanceof PageLoadRequest) { return true; } } return false; }
@Test public void testDefaultTraceId() throws IOException { ObjectNode node = buildEventListenerRecord(); node.remove("traceId"); EUMSpan span = performDeserialization(node); assertThat(span.getDetails(), instanceOf(JSEventListenerExecution.class)); assertThat(span.getSpanIdent().getId(), equalTo(ELEMENT_ID)); assertThat(span.getSpanIdent().getTraceId(), equalTo(ELEMENT_ID)); assertThat(span.getParentSpanId(), equalTo(PARENT_ID)); assertThat(span.getTimeStamp().getTime(), equalTo(ENTER_TIMESTAMP)); assertThat(span.getDuration(), equalTo(DURATION)); JSEventListenerExecution exec = (JSEventListenerExecution) span.getDetails(); assertThat(exec.getFunctionName(), equalTo(FUNCTION_NAME)); assertThat(exec.getEventType(), equalTo(EVENT_TYPE)); }
@BeforeMethod public void initMocks() { super.initMocks(request); when(request.getOwningSpan().getTimeStamp()).thenReturn(new Timestamp(ENTER_TIMESTAMP)); when(request.getOwningSpan().getDuration()).thenReturn(DURATION); when(request.getBaseUrl()).thenReturn(PAGELOAD_URL); when(request.getMethod()).thenReturn(HTTP_METHOD); when(request.getStatus()).thenReturn(HTTP_STATUS); }
protected Beacon generateBeacon(AbstractEUMSpanDetails elementToSend, boolean containsSessionInfo, boolean containsPLR, String modules) { ArrayList<EUMBeaconElement> data = new ArrayList<>(); if (containsSessionInfo) { data.add(sessionInfo); } if (containsPLR) { data.add(pageLoadRequest.getOwningSpan()); when(pageLoadRequest.getOwningSpan().getActiveAgentModules()).thenReturn(modules); } if (elementToSend != null) { EUMSpan span = Mockito.mock(EUMSpan.class); when(span.getTabId()).thenReturn(TAB_ID); when(span.getSessionId()).thenReturn(SESSION_ID); when(span.getDetails()).thenReturn(elementToSend); if (elementToSend instanceof DummyBeaconElement) { ((DummyBeaconElement) elementToSend).owner = span; } else { when(elementToSend.getOwningSpan()).thenReturn(span); } when(span.getActiveAgentModules()).thenReturn(modules); data.add(span); } return new Beacon(SESSION_ID, TAB_ID, modules, data); }
protected void initMocks(AbstractRequest targetElement) { when(pageLoadRequestSpan.getDetails()).thenReturn(pageLoadRequest); when(pageLoadRequest.getOwningSpan()).thenReturn(pageLoadRequestSpan); when(sessionInfo.getSessionId()).thenReturn(SESSION_ID); when(pageLoadRequestSpan.getSessionId()).thenReturn(SESSION_ID); when(pageLoadRequestSpan.getTabId()).thenReturn(TAB_ID); if (targetElement != null) { EUMSpan span = Mockito.mock(EUMSpan.class); when(span.getDetails()).thenReturn(targetElement); when(targetElement.getOwningSpan()).thenReturn(span); when(span.getSessionId()).thenReturn(SESSION_ID); when(span.getTabId()).thenReturn(TAB_ID); when(targetElement.getUrl()).thenReturn(URL); } // assign data when(sessionInfo.getBrowser()).thenReturn(BROWSER); when(sessionInfo.getDevice()).thenReturn(DEVICE); when(sessionInfo.getLanguage()).thenReturn(LANGUAGE); when(pageLoadRequest.getUrl()).thenReturn(PAGELOAD_URL); }
/** * {@inheritDoc} */ @Override public EUMSpan read(Kryo kryo, Input input, Class<EUMSpan> type) { EUMSpan read = super.read(kryo, input, type); read.getDetails().setOwningSpan(read); return read; } }, nextRegistrationId++);
@Test public void testDefaultParentId() throws IOException { ObjectNode node = buildEventListenerRecord(); node.remove("parentId"); EUMSpan span = performDeserialization(node); assertThat(span.getDetails(), instanceOf(JSEventListenerExecution.class)); assertThat(span.getSpanIdent().getId(), equalTo(ELEMENT_ID)); assertThat(span.getSpanIdent().getTraceId(), equalTo(TRACE_ID)); assertThat(span.getParentSpanId(), equalTo(0L)); assertThat(span.getTimeStamp().getTime(), equalTo(ENTER_TIMESTAMP)); assertThat(span.getDuration(), equalTo(DURATION)); JSEventListenerExecution exec = (JSEventListenerExecution) span.getDetails(); assertThat(exec.getFunctionName(), equalTo(FUNCTION_NAME)); assertThat(exec.getEventType(), equalTo(EVENT_TYPE)); }
/** * {@inheritDoc} */ @Override public Collection<Builder> build(UserSessionInfo sessionInfo, PageLoadRequest plr, ResourceLoadRequest res) { Builder builder = Point.measurement(Series.EumResourceLoad.NAME); super.addBasicRequestData(builder, sessionInfo, res); builder.tag(Series.EumResourceLoad.TAG_INITIATOR_URL, res.getBaseUrl()); builder.tag(Series.EumResourceLoad.TAG_INITIATOR_TYPE, res.getInitiatorType()); builder.time(res.getOwningSpan().getTimeStamp().getTime(), TimeUnit.MILLISECONDS); builder.addField(Series.EumAjax.FIELD_DURATION, res.getOwningSpan().getDuration()); builder.addField(Series.EumResourceLoad.FIELD_TRANSFER_SIZE, res.getTransferSize()); return Collections.singleton(builder); }
@Test public void testNoAjaxCorrelation() throws InterruptedException { when(frontEndSpan.getDetails()).thenReturn(mock(AjaxRequest.class)); processor.process(Collections.singleton(frontEndSpan), mock(EntityManager.class)); verify(spanDao, never()).get(any()); } }
@SuppressWarnings("unchecked") @Override public void onRemoval(RemovalNotification<AbstractEUMSpanDetails, Pair<Boolean, AbstractEUMPointBuilder>> notification) { AbstractEUMSpanDetails element = notification.getKey(); synchronized (element) { AbstractEUMPointBuilder builder = notification.getValue().getSecond(); Long sessId = element.getOwningSpan().getSessionId(); Long tabId = element.getOwningSpan().getTabId(); Pair<Long, Long> plrSessionTabId = new Pair<Long, Long>(sessId, tabId); missingSessionInfosMap.remove(sessId, element); missingPageLoadRequestsMap.remove(plrSessionTabId, element); // Force a write even if data is still missing in case of an cache // eviction because of the timeout if (notification.getCause() != RemovalCause.EXPLICIT) { PageLoadRequest plr = pageLoadRequestCache.getIfPresent(plrSessionTabId); UserSessionInfo sessionInfo = sessionInfoCache.getIfPresent(sessId); dataPointsToWrite.addAll(builder.build(sessionInfo, plr, element)); } } } }).build();
/** * {@inheritDoc} */ @Override public Collection<Builder> build(UserSessionInfo sessionInfo, PageLoadRequest plr, AjaxRequest ajax) { Builder builder = Point.measurement(Series.EumAjax.NAME); addBasicRequestData(builder, sessionInfo, ajax); builder.tag(Series.EumAjax.TAG_BASE_URL, ajax.getBaseUrl()); builder.time(ajax.getOwningSpan().getTimeStamp().getTime(), TimeUnit.MILLISECONDS); builder.addField(Series.EumAjax.FIELD_DURATION, ajax.getOwningSpan().getDuration()); builder.addField(Series.EumAjax.FIELD_METHOD, ajax.getMethod()); builder.addField(Series.EumAjax.FIELD_STATUS, ajax.getStatus()); return Collections.singleton(builder); }
UserSessionInfo sessInfo = null; Long sessId = element.getOwningSpan().getSessionId(); Long tabId = element.getOwningSpan().getTabId(); Pair<Long, Long> plrSessionTabId = new Pair<Long, Long>(sessId, tabId);