normalian blog

Let's talk about Microsoft Azure, ASP.NET and Java!

Application Insight の Java モジュールの拡張ポイントを弄ってみる

前回の記事で Java アプリケーション向けに Application Insight を動作させる方法を紹介したが、こちらに対してイベント処理を追加することができる。拡張に利用することのできるクラスは以下の二つだ。

  • applicationinsights-core-0.9.1.jar に含まれる TelemetryModule.java
  • applicationinsights-web-0.9.1.jar に含まれる WebTelemetryModule.java

拡張ポイントについて

TelemetryModule.java と WebTelemetryModule.java はそれぞれインターフェースであり、コードは以下になる。

package com.microsoft.applicationinsights.extensibility;
import com.microsoft.applicationinsights.TelemetryConfiguration;
public abstract interface TelemetryModule
{
  public abstract void initialize(TelemetryConfiguration paramTelemetryConfiguration);
}
package com.microsoft.applicationinsights.web.extensibility.modules;

import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public abstract interface WebTelemetryModule
{
  public abstract void onBeginRequest(ServletRequest paramServletRequest, ServletResponse paramServletResponse);
  
  public abstract void onEndRequest(ServletRequest paramServletRequest, ServletResponse paramServletResponse);
}

眺めて頂けば察しがつくと思うが、モジュール初期化時、リクエスト前後で処理が追加できることが分かる。

拡張コードと設定

以下のクラスを作成した。

package com.mydomain.applicationinsightmodule;

import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import com.microsoft.applicationinsights.TelemetryConfiguration;
import com.microsoft.applicationinsights.extensibility.TelemetryModule;
import com.microsoft.applicationinsights.web.extensibility.modules.WebTelemetryModule;

public class MyTelemetryModule implements WebTelemetryModule, TelemetryModule {

	@Override
	public void initialize(TelemetryConfiguration initializer) {
		System.out.println("@@@@InstrumentationKey="
				+ initializer.getInstrumentationKey());
	}

	@Override
	public void onBeginRequest(ServletRequest paramServletRequest,
			ServletResponse paramServletResponse) {
		System.out
				.println("@@@@onBeginRequest at " + this.getClass().getName());
	}

	@Override
	public void onEndRequest(ServletRequest paramServletRequest,
			ServletResponse paramServletResponse) {
		System.out.println("@@@@onEndRequest at " + this.getClass().getName());
	}

}

さらに ApplicationInsights.xml に設定を追記した。

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<ApplicationInsights
	xmlns="http://schemas.microsoft.com/ApplicationInsights/2013/Settings"
	schemaVersion="2014-05-30">
	<InstrumentationKey><自分のキー>
	</InstrumentationKey>
	<ContextInitializers>
	</ContextInitializers>
	<TelemetryInitializers>
		<Add
			type="com.microsoft.applicationinsights.web.extensibility.initializers.WebOperationIdTelemetryInitializer" />
		<Add
			type="com.microsoft.applicationinsights.web.extensibility.initializers.WebOperationNameTelemetryInitializer" />
	</TelemetryInitializers>
	<TelemetryModules>
		<Add
			type="com.microsoft.applicationinsights.web.extensibility.modules.WebRequestTrackingTelemetryModule" />
		<Add
			type="com.microsoft.applicationinsights.web.extensibility.modules.WebSessionTrackingTelemetryModule" />
		<Add
			type="com.microsoft.applicationinsights.web.extensibility.modules.WebUserTrackingTelemetryModule" />
		<Add type="com.mydomain.applicationinsightmodule.MyTelemetryModule" />
	</TelemetryModules>
	<Channel>
		<!-- Setting DeveloperMode to true will enable immediate transmission of 
			the telemetry events, which can be helpful during the development process. 
			Make sure to turn this off on production servers due to performance considerations. -->
		<DeveloperMode>false</DeveloperMode>
	</Channel>
	<DisableTelemetry>false</DisableTelemetry>
</ApplicationInsights>

拡張が完了したので、Java Web アプリケーションを起動すると以下の様にログが出力されていることが確認できる(ホントは slf4j とか使った方がいいのは置いといて)。

情報: Starting Servlet Engine: Apache Tomcat/8.0.9
3 15, 2015 12:47:44 午後 org.apache.jasper.servlet.TldScanner scanJars
情報: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
@@@@InstrumentationKey=<自分のキー>
3 15, 2015 12:47:44 午後 org.apache.coyote.AbstractProtocol start
情報: Starting ProtocolHandler ["http-nio-8080"]
3 15, 2015 12:47:44 午後 org.apache.coyote.AbstractProtocol start
情報: Starting ProtocolHandler ["ajp-nio-8009"]
3 15, 2015 12:47:44 午後 org.apache.catalina.startup.Catalina start
情報: Server startup in 1987 ms
@@@@onBeginRequest at com.mydomain.applicationinsightmodule.MyTelemetryModule
@@@@onEndRequest at com.mydomain.applicationinsightmodule.MyTelemetryModule
@@@@onBeginRequest at com.mydomain.applicationinsightmodule.MyTelemetryModule
@@@@onEndRequest at com.mydomain.applicationinsightmodule.MyTelemetryModule