You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by ts...@apache.org on 2016/03/29 18:24:46 UTC

wicket git commit: wicket-metrics - refactoring of application lookup

Repository: wicket
Updated Branches:
  refs/heads/master b708e2b47 -> 410815450


wicket-metrics - refactoring of application lookup

Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/41081545
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/41081545
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/41081545

Branch: refs/heads/master
Commit: 41081545066bcf1504a920b177bd915bc474c8c1
Parents: b708e2b
Author: Tobias Soloschenko <ts...@apache.org>
Authored: Tue Mar 29 18:20:46 2016 +0200
Committer: Tobias Soloschenko <ts...@apache.org>
Committed: Tue Mar 29 18:20:46 2016 +0200

----------------------------------------------------------------------
 .../apache/wicket/metrics/WicketMetrics.java    | 174 +++++++------------
 .../wicket/metrics/WicketMetricsSettings.java   |  17 +-
 .../metrics/aspects/WicketFilterInitAspect.java |  47 +++++
 .../aspects/WicketFilterRequestCycleAspect.java |  48 -----
 .../WicketFilterRequestCycleUrlAspect.java      |  64 -------
 .../request/WicketFilterRequestCycleAspect.java |  48 +++++
 .../WicketFilterRequestCycleUrlAspect.java      |  64 +++++++
 .../session/SessionCountListenerAspect.java     |   4 +-
 .../main/resources/wicket-metrics.template.xml  |   8 +-
 .../src/docs/guide/monitoring/monitoring_1.gdoc |  31 ++--
 .../src/docs/guide/monitoring/monitoring_4.gdoc |   9 +-
 11 files changed, 262 insertions(+), 252 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/41081545/wicket-experimental/wicket-metrics/src/main/java/org/apache/wicket/metrics/WicketMetrics.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-metrics/src/main/java/org/apache/wicket/metrics/WicketMetrics.java b/wicket-experimental/wicket-metrics/src/main/java/org/apache/wicket/metrics/WicketMetrics.java
index dd22f6c..3a01dab 100644
--- a/wicket-experimental/wicket-metrics/src/main/java/org/apache/wicket/metrics/WicketMetrics.java
+++ b/wicket-experimental/wicket-metrics/src/main/java/org/apache/wicket/metrics/WicketMetrics.java
@@ -18,6 +18,7 @@ package org.apache.wicket.metrics;
 
 import org.apache.wicket.Application;
 import org.apache.wicket.MetaDataKey;
+import org.apache.wicket.WicketRuntimeException;
 import org.aspectj.lang.ProceedingJoinPoint;
 
 import com.codahale.metrics.Counter;
@@ -33,28 +34,12 @@ import com.codahale.metrics.Timer.Context;
 public class WicketMetrics
 {
 
-	private static final String APPLICATION_NAME_PROPERTY = "wicket.metrics.applicationName";
-
-	private static final String METRICS_STATIC_REGISTRATION = "wicket.metrics.staticRegistration";
 	/**
-	 * if the application has been resolved
+	 * The name of the filter the metrics are going to collect of
 	 */
-	private static boolean applicationResolved;
+	private static String filterName;
 
-	/**
-	 * The application
-	 */
-	private static Application application;
-
-	/**
-	 * Fall back if the application couldn't be resolved the registry is stored static
-	 */
-	private static MetricRegistry metricRegistry;
-
-	/**
-	 * Fall back if the application couldn't be resolved the settings are stored static
-	 */
-	private static WicketMetricsSettings wicketMetricsSettings;
+	private static final String APPLICATION_ERROR = "The application couldn't be resolved, please ensure to apply \"<aspect name=\"org.apache.wicket.metrics.aspects.WicketFilterInitAspect\" />\" to your aspects";
 
 	/** The key for metrics registry **/
 	public static final MetaDataKey<MetricRegistry> METRIC_REGISTRY = new MetaDataKey<MetricRegistry>()
@@ -115,7 +100,7 @@ public class WicketMetrics
 				.time();
 			try
 			{
-				return joinPoint.proceed();
+				return proceedSilent(joinPoint);
 			}
 			finally
 			{
@@ -124,7 +109,21 @@ public class WicketMetrics
 		}
 		else
 		{
-			return joinPoint.proceed();
+			return proceedSilent(joinPoint);
+		}
+	}
+
+	/**
+	 * Stops the context quietly
+	 * 
+	 * @param context
+	 *            the context to stop
+	 */
+	public void stopQuietly(Context context)
+	{
+		if (context != null)
+		{
+			context.stop();
 		}
 	}
 
@@ -145,7 +144,7 @@ public class WicketMetrics
 	}
 
 	/**
-	 * Creates a histogram of the given arguments
+	 * Creates a count of the given arguments
 	 * 
 	 * @param name
 	 *            the name of the meter to be marked
@@ -158,7 +157,7 @@ public class WicketMetrics
 	 * @return the result of the proceeded join point
 	 * @throws Throwable
 	 */
-	public Object counter(String name, ProceedingJoinPoint joinPoint,
+	public Object count(String name, ProceedingJoinPoint joinPoint,
 		CounterOperation counterOperation, Long value) throws Throwable
 	{
 		WicketMetricsSettings settings = getSettings();
@@ -177,11 +176,7 @@ public class WicketMetrics
 				counter.dec(value);
 			}
 		}
-		if (joinPoint != null)
-		{
-			return joinPoint.proceed();
-		}
-		return null;
+		return proceedSilent(joinPoint);
 	}
 
 
@@ -204,25 +199,21 @@ public class WicketMetrics
 		{
 			registry.meter(settings.getPrefix() + name + renderClassName(joinPoint)).mark();
 		}
-		if (joinPoint != null)
-		{
-			return joinPoint.proceed();
-		}
-		return null;
+		return proceedSilent(joinPoint);
 	}
 
 	/**
-	 * Stops the context quietly
+	 * Proceed the join point silent
 	 * 
-	 * @param context
-	 *            the context to stop
+	 * @param joinPoint
+	 *            the join point to proceed
+	 * @return the result of the proceeded join point
+	 * @throws Throwable
+	 *             if the invocation throws an error
 	 */
-	public void stopQuietly(Context context)
+	private Object proceedSilent(ProceedingJoinPoint joinPoint) throws Throwable
 	{
-		if (context != null)
-		{
-			context.stop();
-		}
+		return joinPoint != null ? joinPoint.proceed() : null;
 	}
 
 	/**
@@ -245,29 +236,18 @@ public class WicketMetrics
 	 */
 	public static synchronized MetricRegistry getMetricRegistry()
 	{
-		if (!applicationResolved)
+		Application application = Application.get(getFilterName());
+		if (application == null)
 		{
-			application = getApplication();
-			applicationResolved = true;
+			throw new WicketRuntimeException(APPLICATION_ERROR);
 		}
-		if (application != null && System.getProperty(METRICS_STATIC_REGISTRATION) == null)
+		MetricRegistry metricRegistry = application.getMetaData(METRIC_REGISTRY);
+		if (metricRegistry == null)
 		{
-			MetricRegistry metricRegistry = application.getMetaData(METRIC_REGISTRY);
-			if (metricRegistry == null)
-			{
-				metricRegistry = new MetricRegistry();
-				application.setMetaData(METRIC_REGISTRY, metricRegistry);
-			}
-			return metricRegistry;
-		}
-		else
-		{
-			if (WicketMetrics.metricRegistry == null)
-			{
-				WicketMetrics.metricRegistry = new MetricRegistry();
-			}
-			return WicketMetrics.metricRegistry;
+			metricRegistry = new MetricRegistry();
+			application.setMetaData(METRIC_REGISTRY, metricRegistry);
 		}
+		return metricRegistry;
 	}
 
 	/**
@@ -277,77 +257,39 @@ public class WicketMetrics
 	 */
 	public static synchronized WicketMetricsSettings getSettings()
 	{
-		if (!applicationResolved)
-		{
-			application = getApplication();
-			applicationResolved = true;
-		}
-		if (application != null && System.getProperty(METRICS_STATIC_REGISTRATION) == null)
-		{
-			WicketMetricsSettings wicketMetricsSettings = application.getMetaData(METRIC_SETTINGS);
-			if (wicketMetricsSettings == null)
-			{
-				wicketMetricsSettings = new WicketMetricsSettings();
-				application.setMetaData(METRIC_SETTINGS, wicketMetricsSettings);
-			}
-			return wicketMetricsSettings;
-		}
-		else
+		Application application = Application.get(getFilterName());
+		if (application == null)
 		{
-			if (wicketMetricsSettings == null)
-			{
-				wicketMetricsSettings = new WicketMetricsSettings();
-			}
-			return wicketMetricsSettings;
+			throw new WicketRuntimeException(APPLICATION_ERROR);
 		}
-	}
-
-	/**
-	 * Gets the application. First it tries to resolve the application with Application.get(String)
-	 * - the String is resolved by the system property "wicket.applicationName". If the application
-	 * can't be found by the corresponding name a Application.get() will be invoked to resolve it.
-	 * 
-	 * 
-	 * @return the application or null if the application can't be resolved via get() or get(String)
-	 */
-	private static Application getApplication()
-	{
-		Application application = getApplicationBySystemProperty();
-		if (application == null)
+		WicketMetricsSettings wicketMetricsSettings = application.getMetaData(METRIC_SETTINGS);
+		if (wicketMetricsSettings == null)
 		{
-			application = getApplicationFromThreadLocal();
+			wicketMetricsSettings = new WicketMetricsSettings();
+			wicketMetricsSettings.setPrefix(getFilterName());
+			application.setMetaData(METRIC_SETTINGS, wicketMetricsSettings);
 		}
-		return application;
+		return wicketMetricsSettings;
 	}
 
 	/**
-	 * Gets the application from thread local
+	 * Gets the filter name the application should be resolved with
 	 * 
-	 * @return the application or null if not available
+	 * @return the filter name
 	 */
-	private static Application getApplicationFromThreadLocal()
+	public static String getFilterName()
 	{
-		Application application = null;
-		if (Application.exists())
-		{
-			application = Application.get();
-		}
-		return application;
+		return filterName;
 	}
 
 	/**
-	 * Gets the application by the system property wicket.applicationName
+	 * Sets the filter name the application should be resolved with
 	 * 
-	 * @return the application or null if not available
+	 * @param filterName
+	 *            the filter name
 	 */
-	private static Application getApplicationBySystemProperty()
+	public static void setFilterName(String filterName)
 	{
-		Application application = null;
-		String applicatioName = System.getProperty(APPLICATION_NAME_PROPERTY);
-		if (applicatioName != null)
-		{
-			application = Application.get(applicatioName);
-		}
-		return application;
+		WicketMetrics.filterName = filterName;
 	}
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/41081545/wicket-experimental/wicket-metrics/src/main/java/org/apache/wicket/metrics/WicketMetricsSettings.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-metrics/src/main/java/org/apache/wicket/metrics/WicketMetricsSettings.java b/wicket-experimental/wicket-metrics/src/main/java/org/apache/wicket/metrics/WicketMetricsSettings.java
index 37d5980..c5d3aab 100644
--- a/wicket-experimental/wicket-metrics/src/main/java/org/apache/wicket/metrics/WicketMetricsSettings.java
+++ b/wicket-experimental/wicket-metrics/src/main/java/org/apache/wicket/metrics/WicketMetricsSettings.java
@@ -30,7 +30,7 @@ public class WicketMetricsSettings
 
 	private boolean enabled = true;
 
-	private String prefix = "ApacheWicket/";
+	private String prefix = "application/";
 
 	/**
 	 * If the metrics should be enabled
@@ -64,6 +64,21 @@ public class WicketMetricsSettings
 	}
 
 	/**
+	 * Sets the prefix to be used for the statistics
+	 * 
+	 * @param prefix
+	 *            the prefix to be used
+	 */
+	public void setPrefix(String prefix)
+	{
+		if (!prefix.endsWith("/"))
+		{
+			prefix = prefix + "/";
+		}
+		this.prefix = prefix;
+	}
+
+	/**
 	 * Starts the jmx reporter
 	 */
 	public void startJmxReporter()

http://git-wip-us.apache.org/repos/asf/wicket/blob/41081545/wicket-experimental/wicket-metrics/src/main/java/org/apache/wicket/metrics/aspects/WicketFilterInitAspect.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-metrics/src/main/java/org/apache/wicket/metrics/aspects/WicketFilterInitAspect.java b/wicket-experimental/wicket-metrics/src/main/java/org/apache/wicket/metrics/aspects/WicketFilterInitAspect.java
new file mode 100644
index 0000000..6970616
--- /dev/null
+++ b/wicket-experimental/wicket-metrics/src/main/java/org/apache/wicket/metrics/aspects/WicketFilterInitAspect.java
@@ -0,0 +1,47 @@
+package org.apache.wicket.metrics.aspects;
+
+import javax.servlet.FilterConfig;
+
+import org.apache.wicket.metrics.WicketMetrics;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+
+/**
+ * This aspect applies the application to wicket metrics
+ * 
+ * @author Tobias Soloschenko
+ *
+ */
+@Aspect
+public class WicketFilterInitAspect
+{
+
+	/**
+	 * Gets the filter name during the initialization
+	 * 
+	 * @param joinPoint
+	 *            the join point to be proceed
+	 * @return the proceeded outcome of the join point
+	 * @throws Throwable
+	 *             if something went wrong
+	 */
+	@Around("execution(* org.apache.wicket.protocol.http.WicketFilter.init(..))")
+	public Object aroundInit(ProceedingJoinPoint joinPoint) throws Throwable
+	{
+		Object[] args = joinPoint.getArgs();
+		String filterName = null;
+		if (args.length == 2)
+		{
+			FilterConfig filterConfig = (FilterConfig)args[1];
+			filterName = filterConfig.getFilterName();
+		}
+		else
+		{
+			FilterConfig filterConfig = (FilterConfig)args[0];
+			filterName = filterConfig.getFilterName();
+		}
+		WicketMetrics.setFilterName(filterName);
+		return joinPoint.proceed();
+	}
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/41081545/wicket-experimental/wicket-metrics/src/main/java/org/apache/wicket/metrics/aspects/WicketFilterRequestCycleAspect.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-metrics/src/main/java/org/apache/wicket/metrics/aspects/WicketFilterRequestCycleAspect.java b/wicket-experimental/wicket-metrics/src/main/java/org/apache/wicket/metrics/aspects/WicketFilterRequestCycleAspect.java
deleted file mode 100644
index c19af45..0000000
--- a/wicket-experimental/wicket-metrics/src/main/java/org/apache/wicket/metrics/aspects/WicketFilterRequestCycleAspect.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.wicket.metrics.aspects;
-
-import org.apache.wicket.metrics.WicketMetrics;
-import org.aspectj.lang.ProceedingJoinPoint;
-import org.aspectj.lang.annotation.Around;
-import org.aspectj.lang.annotation.Aspect;
-
-/**
- * Aspect to handle basic web application information
- * 
- * @author Tobias Soloschenko
- */
-@Aspect
-public class WicketFilterRequestCycleAspect extends WicketMetrics
-{
-
-	/**
-	 * Collects the time how long a request took to be processed
-	 * 
-	 * @param joinPoint
-	 *            the joinPoint to be proceed
-	 * @return returns the boolean of the processRequest method
-	 * 
-	 * @throws Throwable
-	 *             might occur while invoking process request
-	 */
-	@Around("execution(* org.apache.wicket.protocol.http.WicketFilter.processRequestCycle(..))")
-	public Object aroundRequestProcessed(ProceedingJoinPoint joinPoint) throws Throwable
-	{
-		return measureTime("core/application/requestCycle", joinPoint);
-	}
-}

http://git-wip-us.apache.org/repos/asf/wicket/blob/41081545/wicket-experimental/wicket-metrics/src/main/java/org/apache/wicket/metrics/aspects/WicketFilterRequestCycleUrlAspect.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-metrics/src/main/java/org/apache/wicket/metrics/aspects/WicketFilterRequestCycleUrlAspect.java b/wicket-experimental/wicket-metrics/src/main/java/org/apache/wicket/metrics/aspects/WicketFilterRequestCycleUrlAspect.java
deleted file mode 100644
index 3cf633e..0000000
--- a/wicket-experimental/wicket-metrics/src/main/java/org/apache/wicket/metrics/aspects/WicketFilterRequestCycleUrlAspect.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.wicket.metrics.aspects;
-
-import javax.servlet.http.HttpServletRequest;
-
-import org.apache.wicket.metrics.WicketMetrics;
-import org.aspectj.lang.ProceedingJoinPoint;
-import org.aspectj.lang.annotation.Around;
-import org.aspectj.lang.annotation.Aspect;
-
-/**
- * Aspect to measure request url time
- * 
- * @author Tobias Soloschenko
- */
-@Aspect
-public class WicketFilterRequestCycleUrlAspect extends WicketMetrics
-{
-	/**
-	 * Collects data how often a request has been made against the webapp and counts the time how
-	 * long the request took. Measures the information with the request url
-	 * 
-	 * @param joinPoint
-	 *            the joinPoint to be proceed
-	 * @return returns the boolean of the processRequest method
-	 * 
-	 * @throws Throwable
-	 *             might occur while invoking process request
-	 */
-	@Around("execution(* org.apache.wicket.protocol.http.WicketFilter.processRequestCycle(..))")
-	public Object aroundRequestProcessedWithURL(ProceedingJoinPoint joinPoint) throws Throwable
-	{
-		Object[] args = joinPoint.getArgs();
-		if (args.length >= 3)
-		{
-			Object requestAsObject = args[2];
-			if (requestAsObject != null && requestAsObject instanceof HttpServletRequest)
-			{
-				HttpServletRequest httpServletRequest = (HttpServletRequest)requestAsObject;
-				String requestUrl = httpServletRequest.getRequestURL().toString();
-				String replacedUrl = requestUrl.replace('/', '_');
-				replacedUrl = replacedUrl.replace('.', '_');
-				replacedUrl = replacedUrl.replaceAll(";jsessionid=.*?(?=\\?|$)", "");
-				return measureTime("core/application/request/" + replacedUrl, joinPoint, false);
-			}
-		}
-		return joinPoint.proceed();
-	}
-}

http://git-wip-us.apache.org/repos/asf/wicket/blob/41081545/wicket-experimental/wicket-metrics/src/main/java/org/apache/wicket/metrics/aspects/request/WicketFilterRequestCycleAspect.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-metrics/src/main/java/org/apache/wicket/metrics/aspects/request/WicketFilterRequestCycleAspect.java b/wicket-experimental/wicket-metrics/src/main/java/org/apache/wicket/metrics/aspects/request/WicketFilterRequestCycleAspect.java
new file mode 100644
index 0000000..d1dd252
--- /dev/null
+++ b/wicket-experimental/wicket-metrics/src/main/java/org/apache/wicket/metrics/aspects/request/WicketFilterRequestCycleAspect.java
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.metrics.aspects.request;
+
+import org.apache.wicket.metrics.WicketMetrics;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+
+/**
+ * Aspect to handle basic web application information
+ * 
+ * @author Tobias Soloschenko
+ */
+@Aspect
+public class WicketFilterRequestCycleAspect extends WicketMetrics
+{
+
+	/**
+	 * Collects the time how long a request took to be processed
+	 * 
+	 * @param joinPoint
+	 *            the joinPoint to be proceed
+	 * @return returns the boolean of the processRequest method
+	 * 
+	 * @throws Throwable
+	 *             might occur while invoking process request
+	 */
+	@Around("execution(* org.apache.wicket.protocol.http.WicketFilter.processRequestCycle(..))")
+	public Object aroundRequestProcessed(ProceedingJoinPoint joinPoint) throws Throwable
+	{
+		return measureTime("core/application/requestCycle", joinPoint);
+	}
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/41081545/wicket-experimental/wicket-metrics/src/main/java/org/apache/wicket/metrics/aspects/request/WicketFilterRequestCycleUrlAspect.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-metrics/src/main/java/org/apache/wicket/metrics/aspects/request/WicketFilterRequestCycleUrlAspect.java b/wicket-experimental/wicket-metrics/src/main/java/org/apache/wicket/metrics/aspects/request/WicketFilterRequestCycleUrlAspect.java
new file mode 100644
index 0000000..f60b4c8
--- /dev/null
+++ b/wicket-experimental/wicket-metrics/src/main/java/org/apache/wicket/metrics/aspects/request/WicketFilterRequestCycleUrlAspect.java
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.metrics.aspects.request;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.wicket.metrics.WicketMetrics;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+
+/**
+ * Aspect to measure request url time
+ * 
+ * @author Tobias Soloschenko
+ */
+@Aspect
+public class WicketFilterRequestCycleUrlAspect extends WicketMetrics
+{
+	/**
+	 * Collects data how often a request has been made against the webapp and counts the time how
+	 * long the request took. Measures the information with the request url
+	 * 
+	 * @param joinPoint
+	 *            the joinPoint to be proceed
+	 * @return returns the boolean of the processRequest method
+	 * 
+	 * @throws Throwable
+	 *             might occur while invoking process request
+	 */
+	@Around("execution(* org.apache.wicket.protocol.http.WicketFilter.processRequestCycle(..))")
+	public Object aroundRequestProcessedWithURL(ProceedingJoinPoint joinPoint) throws Throwable
+	{
+		Object[] args = joinPoint.getArgs();
+		if (args.length >= 3)
+		{
+			Object requestAsObject = args[2];
+			if (requestAsObject != null && requestAsObject instanceof HttpServletRequest)
+			{
+				HttpServletRequest httpServletRequest = (HttpServletRequest)requestAsObject;
+				String requestUrl = httpServletRequest.getRequestURL().toString();
+				String replacedUrl = requestUrl.replace('/', '_');
+				replacedUrl = replacedUrl.replace('.', '_');
+				replacedUrl = replacedUrl.replaceAll(";jsessionid=.*?(?=\\?|$)", "");
+				return measureTime("core/application/request/" + replacedUrl, joinPoint, false);
+			}
+		}
+		return joinPoint.proceed();
+	}
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/41081545/wicket-experimental/wicket-metrics/src/main/java/org/apache/wicket/metrics/aspects/session/SessionCountListenerAspect.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-metrics/src/main/java/org/apache/wicket/metrics/aspects/session/SessionCountListenerAspect.java b/wicket-experimental/wicket-metrics/src/main/java/org/apache/wicket/metrics/aspects/session/SessionCountListenerAspect.java
index 7dc8f04..e8a5c36 100644
--- a/wicket-experimental/wicket-metrics/src/main/java/org/apache/wicket/metrics/aspects/session/SessionCountListenerAspect.java
+++ b/wicket-experimental/wicket-metrics/src/main/java/org/apache/wicket/metrics/aspects/session/SessionCountListenerAspect.java
@@ -44,7 +44,7 @@ public class SessionCountListenerAspect extends WicketMetrics
 	public Object aroundInc(ProceedingJoinPoint joinPoint) throws Throwable
 	{
 		Object count = joinPoint.proceed();
-		counter("core/session/count", null, CounterOperation.INC, 1L);
+		count("core/session/count", null, CounterOperation.INC, 1L);
 		return count;
 	}
 	
@@ -61,7 +61,7 @@ public class SessionCountListenerAspect extends WicketMetrics
 	public Object aroundDec(ProceedingJoinPoint joinPoint) throws Throwable
 	{
 		Object count = joinPoint.proceed();
-		counter("core/session/count", null, CounterOperation.DEC, 1L);
+		count("core/session/count", null, CounterOperation.DEC, 1L);
 		return count;
 	}
 

http://git-wip-us.apache.org/repos/asf/wicket/blob/41081545/wicket-experimental/wicket-metrics/src/main/resources/wicket-metrics.template.xml
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-metrics/src/main/resources/wicket-metrics.template.xml b/wicket-experimental/wicket-metrics/src/main/resources/wicket-metrics.template.xml
index 5ea5b30..632f257 100644
--- a/wicket-experimental/wicket-metrics/src/main/resources/wicket-metrics.template.xml
+++ b/wicket-experimental/wicket-metrics/src/main/resources/wicket-metrics.template.xml
@@ -5,6 +5,10 @@
         <include within="org.apache.wicket..*"/>
     </weaver>
     <aspects>
+    	<!-- required -->
+    	<aspect name="org.apache.wicket.metrics.aspects.WicketFilterInitAspect" />
+    	
+    	<!-- optional -->
 		<aspect name="org.apache.wicket.metrics.aspects.model.LoadableDetachableModelLoadAspect" />
 		<aspect name="org.apache.wicket.metrics.aspects.requesthandler.IRequestHandlerDetachAspect" />
 		<aspect name="org.apache.wicket.metrics.aspects.requesthandler.IRequestHandlerRespondAspect" />
@@ -21,8 +25,8 @@
 		<aspect name="org.apache.wicket.metrics.aspects.ajax.IPartialPageRequestHandlerPrependJavaScriptAspect" />
 		<aspect name="org.apache.wicket.metrics.aspects.resource.ResourceReferenceCreateAspect" />
 		<aspect name="org.apache.wicket.metrics.aspects.markup.WicketTagCreateAspect" />
-		<aspect name="org.apache.wicket.metrics.aspects.WicketFilterRequestCycleUrlAspect" />
-		<aspect name="org.apache.wicket.metrics.aspects.WicketFilterRequestCycleAspect" />
+		<aspect name="org.apache.wicket.metrics.aspects.request.WicketFilterRequestCycleUrlAspect" />
+		<aspect name="org.apache.wicket.metrics.aspects.request.WicketFilterRequestCycleAspect" />
 		<aspect name="org.apache.wicket.metrics.aspects.session.SessionCountListenerAspect" />
     </aspects>
 </aspectj>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/wicket/blob/41081545/wicket-user-guide/src/docs/guide/monitoring/monitoring_1.gdoc
----------------------------------------------------------------------
diff --git a/wicket-user-guide/src/docs/guide/monitoring/monitoring_1.gdoc b/wicket-user-guide/src/docs/guide/monitoring/monitoring_1.gdoc
index 7938368..2ee213e 100644
--- a/wicket-user-guide/src/docs/guide/monitoring/monitoring_1.gdoc
+++ b/wicket-user-guide/src/docs/guide/monitoring/monitoring_1.gdoc
@@ -21,10 +21,14 @@ This is a little example how to setup wicket-metrics within a Apache Tomcat.
         <include within="org.apache.wicket..*"/>
     </weaver>
     <aspects>
+    	<!-- required -->
+    	<aspect name="org.apache.wicket.metrics.aspects.WicketFilterInitAspect" />
+    	
+    	<!-- optional -->
 		<aspect name="org.apache.wicket.metrics.aspects.model.LoadableDetachableModelLoadAspect" />
 		<aspect name="org.apache.wicket.metrics.aspects.requesthandler.IRequestHandlerDetachAspect" />
 		<aspect name="org.apache.wicket.metrics.aspects.requesthandler.IRequestHandlerRespondAspect" />
-		<aspect name="org.apache.wicket.metrics.aspects.resource.IResourceCreateAspect" />
+ 		<aspect name="org.apache.wicket.metrics.aspects.resource.IResourceCreateAspect" />
 		<aspect name="org.apache.wicket.metrics.aspects.behavior.BehaviorCreateAspect" />
 		<aspect name="org.apache.wicket.metrics.aspects.component.ComponentCreateAspect" />
 		<aspect name="org.apache.wicket.metrics.aspects.component.ComponentOnConfigureAspect" />
@@ -37,26 +41,20 @@ This is a little example how to setup wicket-metrics within a Apache Tomcat.
 		<aspect name="org.apache.wicket.metrics.aspects.ajax.IPartialPageRequestHandlerPrependJavaScriptAspect" />
 		<aspect name="org.apache.wicket.metrics.aspects.resource.ResourceReferenceCreateAspect" />
 		<aspect name="org.apache.wicket.metrics.aspects.markup.WicketTagCreateAspect" />
-		<aspect name="org.apache.wicket.metrics.aspects.WicketFilterRequestCycleUrlAspect" />
-		<aspect name="org.apache.wicket.metrics.aspects.WicketFilterRequestCycleAspect" />
+		<aspect name="org.apache.wicket.metrics.aspects.request.WicketFilterRequestCycleUrlAspect" />
+		<aspect name="org.apache.wicket.metrics.aspects.request.WicketFilterRequestCycleAspect" />
 		<aspect name="org.apache.wicket.metrics.aspects.session.SessionCountListenerAspect" />
     </aspects>
 </aspectj>
 {code}
 
-* If you have set wicket-metrics as dependency you can open "wicket-metrics.template.xml" to get a full template of the "aop.xml"
-
-* For the weaver options refer to the "AspectJ LTW configuration documentation":https://eclipse.org/aspectj/doc/next/devguide/ltw-configuration.html
-
 * If you use the SessionCountListenerAspect you have to ensure that metadata-complete="false" is set otherwise you have to add the listener yourself:
 {code}
 <listener>
-	<listener-class>org.apache.wicket.metrics.aspects.session.SessionCountListener</listenerclass>
+	<listener-class>org.apache.wicket.metrics.aspects.session.SessionCountListener</listener-class>
 </listener>
 {code}
 
-You also have to clear the session store if you restart the server - otherwise physically stored session will corrupt the data, because the count is initialized with 0.
-
 (5 - optional) To enable the JMX measurement write the following line into your init method of your Application (Now you are able to connect with jvisualvm to your server and have a look at the data):
 {code}
 WicketMetrics.getSettings().startJmxReporter();
@@ -72,10 +70,9 @@ To disable measurement:
 WicketMetrics.getSettings().setEnabled(false);
 {code}
 
-(6 - optional) There are two system flags which can be applied to the start of the server
-
--Dwicket.metrics.staticRegistration=true - If this argument is set the wicket metrics settings and the metrics registry are stored in static variables within the WicketMetrics class - this might cause problems in an OSGi environment
-
--Dwicket.metrics.applicationName=<filtername> - If this argument is set no ThreadLocal access is required, because the Application is looked up via Application#get(String). This property needs to be set if the active sessions counter should be measured with SessionCountListenerAspect because timed out sessions are invalidated in non-HTTP-worker thread and the Wicket thread locals are not available. Caution: this approach could not be used when there are more than one applications in the same web container!
-
-
+*IMPORTANT INFORMATION*
+** It is only possible to collect metrics for *one wicket filter per webapp* - don't declare more then one if you want to use wicket-metrics
+** The WicketFilterInitAspect is required so that the application can be resolved - otherwise runtime exceptions will be thrown
+** If you use the SessionCountListener you have to clear the session store if you restart the server - otherwise physically stored session will corrupt the data, because the count is initialized with 0.
+** If you have set wicket-metrics as dependency you can open "wicket-metrics.template.xml" to get a full template of the "aop.xml"
+** For the weaver options refer to the AspectJ LTW configuration documentation: https://eclipse.org/aspectj/doc/next/devguide/ltw-configuration.html
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/wicket/blob/41081545/wicket-user-guide/src/docs/guide/monitoring/monitoring_4.gdoc
----------------------------------------------------------------------
diff --git a/wicket-user-guide/src/docs/guide/monitoring/monitoring_4.gdoc b/wicket-user-guide/src/docs/guide/monitoring/monitoring_4.gdoc
index 3e5c608..22bdd3b 100644
--- a/wicket-user-guide/src/docs/guide/monitoring/monitoring_4.gdoc
+++ b/wicket-user-guide/src/docs/guide/monitoring/monitoring_4.gdoc
@@ -22,10 +22,15 @@ There are only a two steps required to write own measurements for life data stat
 <aspectj>
     <weaver options="-nowarn">
     	<include within="org.apache.wicket..*"/>
-        <include within="my.package..*"/>
+        <include within="my.components.package..*"/>
     </weaver>
     <aspects>
-    	<aspect name="my.package.MySpecialAspect" />
+    	<!-- required -->
+    	<aspect name="org.apache.wicket.metrics.aspects.WicketFilterInitAspect" />
+    	
+    	<!-- own aspects -->
+    	<aspect name="my.aspect.package.MySpecialAspect" />
+    	
     	<!-- wickets own metrics -->
     	.....
     </aspects>