Author: jleroux Date: Thu May 23 07:55:14 2013 New Revision: 1485601 URL: http://svn.apache.org/r1485601 Log: Add a mean to collect and show the Requests Events durations using Metrics https://issues.apache.org/jira/browse/OFBIZ-5198 Fulfill the goal with some more: * makes the Metrics main parameters (estimationSize, estimationTime and smoothing) dynamically changeable (added in serverstats.properties) * there is no threshold handling for event metrics
Modified: ofbiz/trunk/framework/base/src/org/ofbiz/base/metrics/Metrics.java ofbiz/trunk/framework/base/src/org/ofbiz/base/metrics/MetricsFactory.java ofbiz/trunk/framework/webapp/config/serverstats.properties ofbiz/trunk/framework/webapp/dtd/site-conf.xsd ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ConfigXMLReader.java ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/RequestHandler.java Modified: ofbiz/trunk/framework/base/src/org/ofbiz/base/metrics/Metrics.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/org/ofbiz/base/metrics/Metrics.java?rev=1485601&r1=1485600&r2=1485601&view=diff ============================================================================== --- ofbiz/trunk/framework/base/src/org/ofbiz/base/metrics/Metrics.java (original) +++ ofbiz/trunk/framework/base/src/org/ofbiz/base/metrics/Metrics.java Thu May 23 07:55:14 2013 @@ -28,6 +28,7 @@ */ package org.ofbiz.base.metrics; + /** * An object that tracks service metrics. * <p>This interface and its default implementation are based on the @@ -36,11 +37,6 @@ package org.ofbiz.base.metrics; * @see <a href="http://www.eecs.harvard.edu/~mdw/proj/seda/">SEDA</a> */ public interface Metrics { - - public static final int ESTIMATION_SIZE = 100; - public static final long ESTIMATION_TIME = 1000; - public static final double SMOOTHING = 0.7; - /** * Returns the name of the metric. */ Modified: ofbiz/trunk/framework/base/src/org/ofbiz/base/metrics/MetricsFactory.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/org/ofbiz/base/metrics/MetricsFactory.java?rev=1485601&r1=1485600&r2=1485601&view=diff ============================================================================== --- ofbiz/trunk/framework/base/src/org/ofbiz/base/metrics/MetricsFactory.java (original) +++ ofbiz/trunk/framework/base/src/org/ofbiz/base/metrics/MetricsFactory.java Thu May 23 07:55:14 2013 @@ -34,6 +34,7 @@ import java.util.TreeSet; import org.ofbiz.base.lang.LockedBy; import org.ofbiz.base.lang.ThreadSafe; import org.ofbiz.base.util.Assert; +import org.ofbiz.base.util.UtilProperties; import org.ofbiz.base.util.cache.UtilCache; import org.w3c.dom.Element; @@ -42,7 +43,6 @@ import org.w3c.dom.Element; */ @ThreadSafe public final class MetricsFactory { - private static final UtilCache<String, Metrics> METRICS_CACHE = UtilCache.createUtilCache("base.metrics", 0, 0); /** * A "do-nothing" <code>Metrics</code> instance. @@ -73,17 +73,17 @@ public final class MetricsFactory { Assert.notEmpty("name attribute", name); Metrics result = METRICS_CACHE.get(name); if (result == null) { - int estimationSize = Metrics.ESTIMATION_SIZE; + int estimationSize = UtilProperties.getPropertyAsInteger("serverstats", "metrics.estimation.size", 100); String attributeValue = element.getAttribute("estimation-size"); if (!attributeValue.isEmpty()) { estimationSize = Integer.parseInt(attributeValue); } - long estimationTime = Metrics.ESTIMATION_TIME; + long estimationTime = UtilProperties.getPropertyAsLong("serverstats", "metrics.estimation.time", 1000); attributeValue = element.getAttribute("estimation-time"); if (!attributeValue.isEmpty()) { estimationTime = Long.parseLong(attributeValue); } - double smoothing = Metrics.SMOOTHING; + double smoothing = UtilProperties.getPropertyNumber("serverstats", "metrics.smoothing.factor", 0.7); attributeValue = element.getAttribute("smoothing"); if (!attributeValue.isEmpty()) { smoothing = Double.parseDouble(attributeValue); @@ -151,9 +151,9 @@ public final class MetricsFactory { @LockedBy("this") private long cumulativeEvents; private final String name; - private final int estimationSize; - private final long estimationTime; - private final double smoothing; + private int estimationSize; + private long estimationTime; + private double smoothing; private final double threshold; private MetricsImpl(String name, int estimationSize, long estimationTime, double smoothing, double threshold) { Modified: ofbiz/trunk/framework/webapp/config/serverstats.properties URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/webapp/config/serverstats.properties?rev=1485601&r1=1485600&r2=1485601&view=diff ============================================================================== --- ofbiz/trunk/framework/webapp/config/serverstats.properties (original) +++ ofbiz/trunk/framework/webapp/config/serverstats.properties Thu May 23 07:55:14 2013 @@ -50,3 +50,11 @@ stats.persist.SERVICE.hit=false # Specify whether a proxy sits in front of this app server # This allows VisitHandler to collect the client's real ip stats.proxy.enabled=false + +### Metric parameters (moving average) +# size of the considered subset (defines the window size) +metrics.estimation.size=100 +# minimum time considered between 2 samplings for taking a record or not (must be > to metrics.estimation.time) +metrics.estimation.time=1000 +# used to smooth the differences between calculations. A value of "1" disables smoothing +metrics.smoothing.factor=0.7 Modified: ofbiz/trunk/framework/webapp/dtd/site-conf.xsd URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/webapp/dtd/site-conf.xsd?rev=1485601&r1=1485600&r2=1485601&view=diff ============================================================================== --- ofbiz/trunk/framework/webapp/dtd/site-conf.xsd (original) +++ ofbiz/trunk/framework/webapp/dtd/site-conf.xsd Thu May 23 07:55:14 2013 @@ -342,8 +342,8 @@ under the License. <xs:element name="metric"> <xs:annotation> <xs:documentation> - Calculate and maintain an average response time for this request. Request metrics can be used - for monitoring and reporting. Metrics can also be used to trigger an alternate + Calculate and maintain a moving average response time for a Request or Event. Request Metrics can be used + for monitoring and reporting, Event Metrics only for reporting. Request Metrics can also be used to trigger an alternate response if the optional threshold attribute is used. The metric works by gathering statistics until a configurable maximum is reached (number of @@ -402,6 +402,9 @@ under the License. </xs:documentation> </xs:annotation> <xs:complexType> + <xs:sequence> + <xs:element minOccurs="0" ref="metric"/> + </xs:sequence> <xs:attributeGroup ref="attlist.event"/> </xs:complexType> </xs:element> Modified: ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ConfigXMLReader.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ConfigXMLReader.java?rev=1485601&r1=1485600&r2=1485601&view=diff ============================================================================== --- ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ConfigXMLReader.java (original) +++ ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ConfigXMLReader.java Thu May 23 07:55:14 2013 @@ -588,12 +588,18 @@ public class ConfigXMLReader { public String path; public String invoke; public boolean globalTransaction = true; + public Metrics metrics = null; public Event(Element eventElement) { this.type = eventElement.getAttribute("type"); this.path = eventElement.getAttribute("path"); this.invoke = eventElement.getAttribute("invoke"); this.globalTransaction = !"false".equals(eventElement.getAttribute("global-transaction")); + // Get metrics. + Element metricsElement = UtilXml.firstChildElement(eventElement, "metric"); + if (metricsElement != null) { + this.metrics = MetricsFactory.getInstance(metricsElement); + } } public Event(String type, String path, String invoke, boolean globalTransaction) { Modified: ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/RequestHandler.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/RequestHandler.java?rev=1485601&r1=1485600&r2=1485601&view=diff ============================================================================== --- ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/RequestHandler.java (original) +++ ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/RequestHandler.java Thu May 23 07:55:14 2013 @@ -170,6 +170,7 @@ public class RequestHandler { } ConfigXMLReader.RequestMap originalRequestMap = requestMap; // Save this so we can update the correct performance metrics. + boolean interruptRequest = false; // Check for chained request. @@ -416,6 +417,10 @@ public class RequestHandler { // run the request event eventReturn = this.runEvent(request, response, requestMap.event, requestMap, "request"); + + if (requestMap.event.metrics != null) { + requestMap.event.metrics.recordServiceRate(1, System.currentTimeMillis() - startTime); + } // save the server hit for the request event if (this.trackStats(request)) {