Yes, I should have thought about using the model, rather than mucking around 
with Metric classes. But it was a bit more complicated so I got this wrong way.

BTW, I just thought about something.
Convention above configuration is often good, but here the metrics names rely 
on hand writing. So wrong C/Ps or typos can introduce challenging wrong results.
I will see if we can rather grab them from context.
Controllers names might be a challenge. We can alway use the component name but 
it will not be enough, I will see

Jacques

From: "Adrian Crum" <adrian.c...@sandglass-software.com>
> Thanks.
> 
> As you can see, adding metrics to OFBiz is fairly simple. That is why I 
> objected to adding redundant code to the Metrics classes.
> 
> -Adrian
> 
> On 5/23/2013 9:57 AM, Jacques Le Roux wrote:
>> Yes sorry, this was a 1st try I did before changing directly in factory, I 
>> forgot to remove, I will.
>> Always better to have at least 2 pairs of  eyes...
>>
>> Jacques
>>
>> From: "Adrian Crum" <adrian.c...@sandglass-software.com>
>>> This looks good, but please leave the thread-safe fields as final. See
>>> inline comment...
>>>
>>> On 5/23/2013 8:55 AM, jler...@apache.org wrote:
>>>> 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;
>>> Please keep these final.
>>>
>>>> -        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)) {
>>>>
>>>>
>

Reply via email to