For anyone who stumbles upon this in the future, here's how I have done it:
First, you need an Appender created.
import java.util.Dictionary;
import java.util.Hashtable;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceRegistration;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Deactivate;
import org.osgi.service.component.propertytypes.ServiceRanking;
import com.microsoft.applicationinsights.TelemetryClient;
import com.microsoft.applicationinsights.TelemetryConfiguration;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.Appender;
import ch.qos.logback.core.AppenderBase;
@Component(immediate = true)
@ServiceRanking(Integer.MIN_VALUE)
public class AppInsightsAppender extends AppenderBase<ILoggingEvent>{
TelemetryClient client = new TelemetryClient();
private static String INSTRUMENTATION_KEY = "<your instrumentation key here>";
private ServiceRegistration sr;
public AppInsightsAppender() {
setName("AppInsightsAppender");
}
@9944223
protected void append(ILoggingEvent e) {
// todo: handle all types of events in a more graceful way
client.trackTrace(e.getMessage());
}
@580286
private void activate(BundleContext bundleContext){
TelemetryConfiguration.getActive().setInstrumentationKey(INSTRUMENTATION_KEY);
TelemetryConfiguration.getActive().setTrackingIsDisabled(false);
Dictionary<String,Object> props = new Hashtable<String, Object>();
String[] loggers = {
"<your root package name here>"
};
props.put("loggers",loggers);
sr = bundleContext.registerService(Appender.class.getName(),this,props);
}
@3038739
private void deactivate(){
if(sr != null){
sr.unregister();
}
}
}
The idea behind this appender is that the `append` method is invoked any time a log message is written.
Secondarily, if you want to track http calls, you can set up something like this:
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.propertytypes.ServiceRanking;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.microsoft.applicationinsights.TelemetryConfiguration;
import com.microsoft.applicationinsights.extensibility.TelemetryInitializer;
import com.microsoft.applicationinsights.extensibility.TelemetryModule;
import com.microsoft.applicationinsights.web.extensibility.initializers.WebOperationIdTelemetryInitializer;
import com.microsoft.applicationinsights.web.extensibility.initializers.WebOperationNameTelemetryInitializer;
import com.microsoft.applicationinsights.web.extensibility.initializers.WebSessionTelemetryInitializer;
import com.microsoft.applicationinsights.web.extensibility.initializers.WebUserAgentTelemetryInitializer;
import com.microsoft.applicationinsights.web.extensibility.initializers.WebUserTelemetryInitializer;
import com.microsoft.applicationinsights.web.extensibility.modules.WebRequestTrackingTelemetryModule;
import com.microsoft.applicationinsights.web.internal.WebRequestTrackingFilter;
@Component(immediate = true, service = { Filter.class },
property = { "sling.filter.scope=request" })
@ServiceRanking(Integer.MIN_VALUE)
public class AppInsightsFilter implements Filter {
private static final Logger LOG = LoggerFactory.getLogger(AppInsightsFilter.class);
private WebRequestTrackingFilter webRequestTrackingFilter;
private static String INSTRUMENTATION_KEY = "<your instrumentation key here>";
@9944223
public void destroy() {
webRequestTrackingFilter.destroy();
}
@9944223
public void doFilter(final ServletRequest servletRequest, final ServletResponse servletResponse, final FilterChain filterChain) throws IOException, ServletException {
webRequestTrackingFilter.doFilter(servletRequest, servletResponse, filterChain);
}
@9944223
public void init(final FilterConfig arg0) throws ServletException {
webRequestTrackingFilter = new WebRequestTrackingFilter("<your package name here>");
TelemetryConfiguration.getActive().setInstrumentationKey(INSTRUMENTATION_KEY);
TelemetryConfiguration.getActive().setTrackingIsDisabled(false);
List<TelemetryInitializer> initializers = new ArrayList<>();
initializers.add(new WebOperationIdTelemetryInitializer());
initializers.add(new WebOperationNameTelemetryInitializer());
initializers.add(new WebSessionTelemetryInitializer());
initializers.add(new WebUserTelemetryInitializer());
initializers.add(new WebUserAgentTelemetryInitializer());
TelemetryConfiguration.getActive().getTelemetryInitializers().addAll(initializers);
TelemetryModule module = new WebRequestTrackingTelemetryModule();
module.initialize(TelemetryConfiguration.getActive());
TelemetryConfiguration.getActive().getTelemetryModules().add(module);
webRequestTrackingFilter.init(arg0);
}
}
Both of these classes present within the code appears to be enough. Update your pom.xml dependencies:
<dependency>
<groupId>com.microsoft.azure</groupId>
<artifactId>applicationinsights-web</artifactId>
<version>2.5.0</version>
<scope>compile</scope>
</dependency>