package org.stagemonitor.web.monitor.rum; import org.stagemonitor.configuration.ConfigurationRegistry; import org.stagemonitor.tracing.SpanContextInformation; import org.stagemonitor.web.WebPlugin; import org.stagemonitor.web.monitor.filter.HtmlInjector; import java.util.concurrent.TimeUnit; public class BoomerangJsHtmlInjector extends HtmlInjector { public static final String BOOMERANG_FILENAME = "boomerang-56c823668fc.min.js"; private WebPlugin webPlugin; private String boomerangTemplate; private ConfigurationRegistry configuration; @Override public void init(HtmlInjector.InitArguments initArguments) { this.configuration = initArguments.getConfiguration(); this.webPlugin = initArguments.getConfiguration().getConfig(WebPlugin.class); this.boomerangTemplate = buildBoomerangTemplate(initArguments.getServletContext().getContextPath()); } private String buildBoomerangTemplate(String contextPath) { String beaconUrl = webPlugin.isRealUserMonitoringEnabled() ? " beacon_url: " + "'" + contextPath + "/stagemonitor/public/rum'" + ",\n" : ""; return "<script src=\"" + contextPath + "/stagemonitor/public/static/rum/" + BOOMERANG_FILENAME + "\"></script>\n" + "<script>\n" + " BOOMR.init({\n" + beaconUrl + " log: null\n" + " });\n" + " BOOMR.addVar(\"requestName\", \"${requestName}\");\n" + " BOOMR.addVar(\"serverTime\", ${serverTime});\n" + "</script>"; } @Override public boolean isActive(HtmlInjector.IsActiveArguments isActiveArguments) { // if widget is enabled, inject as well to render page load time statistics in widget // metrics won't be collected in this case, because the beacon_url is then set to null return webPlugin.isRealUserMonitoringEnabled() || webPlugin.isWidgetAndStagemonitorEndpointsAllowed(isActiveArguments.getHttpServletRequest(), configuration); } @Override public void injectHtml(HtmlInjector.InjectArguments injectArguments) { final SpanContextInformation spanContext = injectArguments.getSpanContext(); if (spanContext == null) { return; } injectArguments.setContentToInjectBeforeClosingBody(boomerangTemplate .replace("${requestName}", String.valueOf(spanContext.getOperationName())) .replace("${serverTime}", Long.toString(TimeUnit.NANOSECONDS.toMillis(spanContext.getDurationNanos())))); } }