You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sirona.apache.org by rm...@apache.org on 2013/11/04 09:24:57 UTC

svn commit: r1538521 - in /incubator/sirona/trunk: core/src/main/java/org/apache/sirona/gauges/ src/site/markdown/ web/src/main/java/org/apache/sirona/web/discovery/ web/src/main/java/org/apache/sirona/web/registration/ web/src/main/java/org/apache/sir...

Author: rmannibucau
Date: Mon Nov  4 08:24:57 2013
New Revision: 1538521

URL: http://svn.apache.org/r1538521
Log:
using gauges for http status monitoring

Added:
    incubator/sirona/trunk/web/src/main/java/org/apache/sirona/web/servlet/StatusGauge.java
    incubator/sirona/trunk/web/src/test/resources/sirona.properties
Modified:
    incubator/sirona/trunk/core/src/main/java/org/apache/sirona/gauges/Gauge.java
    incubator/sirona/trunk/src/site/markdown/configuration.md
    incubator/sirona/trunk/web/src/main/java/org/apache/sirona/web/discovery/GaugeDiscoveryListener.java
    incubator/sirona/trunk/web/src/main/java/org/apache/sirona/web/registration/WebMonitoringInitializer.java
    incubator/sirona/trunk/web/src/main/java/org/apache/sirona/web/servlet/MonitoringFilter.java
    incubator/sirona/trunk/web/src/main/java/org/apache/sirona/web/session/SessionGauge.java
    incubator/sirona/trunk/web/src/test/java/org/apache/sirona/test/web/RequestPerformanceTest.java

Modified: incubator/sirona/trunk/core/src/main/java/org/apache/sirona/gauges/Gauge.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/core/src/main/java/org/apache/sirona/gauges/Gauge.java?rev=1538521&r1=1538520&r2=1538521&view=diff
==============================================================================
--- incubator/sirona/trunk/core/src/main/java/org/apache/sirona/gauges/Gauge.java (original)
+++ incubator/sirona/trunk/core/src/main/java/org/apache/sirona/gauges/Gauge.java Mon Nov  4 08:24:57 2013
@@ -20,6 +20,8 @@ import org.apache.sirona.Role;
 import org.apache.sirona.repositories.Repository;
 import org.apache.sirona.spi.SPI;
 
+import java.util.Collection;
+import java.util.Collections;
 import java.util.LinkedList;
 
 public interface Gauge {
@@ -32,9 +34,12 @@ public interface Gauge {
     public static class LoaderHelper {
         private LinkedList<Gauge> gauges = new LinkedList<Gauge>();
 
-        public LoaderHelper(final boolean excludeParent, final String... includedPrefixes) {
+        public LoaderHelper(final boolean excludeParent, final Collection<? extends Gauge> manualGauges, final String... includedPrefixes) {
             final ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
 
+            for (final Gauge g : manualGauges) {
+                addGauge(g);
+            }
             for (final Gauge g : SPI.INSTANCE.find(Gauge.class, classLoader)) {
                 addGaugeIfNecessary(classLoader, g, excludeParent, includedPrefixes);
             }
@@ -45,6 +50,10 @@ public interface Gauge {
             }
         }
 
+        public LoaderHelper(final boolean excludeParent, final String... includedPrefixes) {
+            this(excludeParent, Collections.<Gauge>emptyList(), includedPrefixes);
+        }
+
         private void addGaugeIfNecessary(final ClassLoader classLoader, final Gauge g, final boolean excludeParent, final String... prefixes) {
             final Class<? extends Gauge> gaugeClass = g.getClass();
             if (!excludeParent || gaugeClass.getClassLoader() == classLoader) {
@@ -60,11 +69,15 @@ public interface Gauge {
                         return;
                     }
                 }
-                Repository.INSTANCE.addGauge(g);
-                gauges.add(g);
+                addGauge(g);
             }
         }
 
+        private void addGauge(Gauge g) {
+            Repository.INSTANCE.addGauge(g);
+            gauges.add(g);
+        }
+
         public void destroy() {
             for (final Gauge gauge : gauges) {
                 Repository.INSTANCE.stopGauge(gauge.role());

Modified: incubator/sirona/trunk/src/site/markdown/configuration.md
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/src/site/markdown/configuration.md?rev=1538521&r1=1538520&r2=1538521&view=diff
==============================================================================
--- incubator/sirona/trunk/src/site/markdown/configuration.md (original)
+++ incubator/sirona/trunk/src/site/markdown/configuration.md Mon Nov  4 08:24:57 2013
@@ -68,7 +68,9 @@ or to call manually `Configuration.shutd
 
 * org.apache.sirona.web.activated: if auto deployment of web module is activated
 * org.apache.sirona.web.monitored-urls: the mapping of monitored urls
-* org.apache.sirona.gauge.sessions.period: the gauge period for sessions number monitoring
+* org.apache.sirona.web.gauge.sessions.period: the gauge period for sessions number monitoring
+* org.apache.sirona.web.gauge.status.period: when status monitoring is activated the period for status gauges
+* org.apache.sirona.web.monitored-statuses: the comma separated list of monitored statuses (if not a default list is used)
 
 #### CDI
 

Modified: incubator/sirona/trunk/web/src/main/java/org/apache/sirona/web/discovery/GaugeDiscoveryListener.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/web/src/main/java/org/apache/sirona/web/discovery/GaugeDiscoveryListener.java?rev=1538521&r1=1538520&r2=1538521&view=diff
==============================================================================
--- incubator/sirona/trunk/web/src/main/java/org/apache/sirona/web/discovery/GaugeDiscoveryListener.java (original)
+++ incubator/sirona/trunk/web/src/main/java/org/apache/sirona/web/discovery/GaugeDiscoveryListener.java Mon Nov  4 08:24:57 2013
@@ -16,16 +16,71 @@
  */
 package org.apache.sirona.web.discovery;
 
+import org.apache.sirona.Role;
+import org.apache.sirona.configuration.Configuration;
+import org.apache.sirona.counters.Unit;
 import org.apache.sirona.gauges.Gauge;
+import org.apache.sirona.web.servlet.MonitoringFilter;
+import org.apache.sirona.web.servlet.StatusGauge;
 
 import javax.servlet.ServletContextEvent;
 import javax.servlet.ServletContextListener;
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
+import java.net.HttpURLConnection;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
 
 public class GaugeDiscoveryListener implements ServletContextListener {
+    public static final String STATUS_GAUGES_ATTRIBUTE = "status-gauges";
+    private static final int[] DEFAULT_STATUSES = {
+        HttpURLConnection.HTTP_OK,
+        HttpURLConnection.HTTP_CREATED,
+        HttpURLConnection.HTTP_NO_CONTENT,
+        HttpURLConnection.HTTP_BAD_REQUEST,
+        HttpURLConnection.HTTP_MOVED_PERM,
+        HttpURLConnection.HTTP_MOVED_TEMP,
+        HttpURLConnection.HTTP_FORBIDDEN,
+        HttpURLConnection.HTTP_NOT_FOUND,
+        HttpURLConnection.HTTP_INTERNAL_ERROR
+    };
+
     private Gauge.LoaderHelper helper;
 
     @Override
     public void contextInitialized(final ServletContextEvent sce) {
+        // init status gauges
+        final ConcurrentMap<Integer, StatusGauge> gauges = new ConcurrentHashMap<Integer, StatusGauge>(35);
+        if ("true".equalsIgnoreCase((String) sce.getServletContext().getAttribute(MonitoringFilter.MONITOR_STATUS))) {
+            final String monitoredStatuses = sce.getServletContext().getInitParameter(Configuration.CONFIG_PROPERTY_PREFIX + "web.monitored-statuses");
+            if (monitoredStatuses == null) {
+                for (final int status : DEFAULT_STATUSES) {
+                    gauges.put(status, statusGauge(sce.getServletContext().getContextPath(), gauges, status));
+                }
+                /* we could use it but it defines 25 statuses, surely too much
+                for (final Field f : HttpURLConnection.class.getDeclaredFields()) {
+                    final int modifiers = f.getModifiers();
+                    if (f.getName().startsWith("HTTP_")
+                        && Modifier.isStatic(modifiers) && Modifier.isPublic(modifiers) && Modifier.isFinal(modifiers)) {
+                        try {
+                            final int status = (Integer) f.get(null);
+                            gauges.put(status, statusGauge(sce.getServletContext().getContextPath(), gauges, (Integer) f.get(null)));
+                        } catch (final IllegalAccessException e) {
+                            // no-op
+                        }
+                    }
+                }
+                */
+            } else {
+                for (final String status : monitoredStatuses.split(",")) {
+                    final int statusInt = Integer.parseInt(status.trim());
+                    gauges.put(statusInt, statusGauge(sce.getServletContext().getContextPath(), gauges, statusInt));
+                }
+            }
+            sce.getServletContext().setAttribute(STATUS_GAUGES_ATTRIBUTE, gauges);
+        }
+
+        // discovery registration
         final String prefixesStr = sce.getServletContext().getInitParameter("monitoring.discovery.packages");
         final String[] prefixes;
         if (prefixesStr != null) {
@@ -33,7 +88,7 @@ public class GaugeDiscoveryListener impl
         } else {
             prefixes = null;
         }
-        helper = new Gauge.LoaderHelper("true".equals(sce.getServletContext().getInitParameter("monitoring.discovery.exclude-parent")), prefixes);
+        helper = new Gauge.LoaderHelper("true".equals(sce.getServletContext().getInitParameter("monitoring.discovery.exclude-parent")), gauges.values(), prefixes);
     }
 
     @Override
@@ -42,4 +97,18 @@ public class GaugeDiscoveryListener impl
             helper.destroy();
         }
     }
+
+    private static StatusGauge statusGauge(final String prefix, final ConcurrentMap<Integer, StatusGauge> gauges, final int status) {
+        final StatusGauge gauge = gauges.get(status);
+        if (gauge != null) {
+            return gauge;
+        }
+
+        final StatusGauge newGauge = new StatusGauge(new Role(prefix + "-HTTP-" + Integer.toString(status), Unit.UNARY));
+        final StatusGauge old = gauges.putIfAbsent(status, newGauge);
+        if (old != null) {
+            return old;
+        }
+        return newGauge;
+    }
 }

Modified: incubator/sirona/trunk/web/src/main/java/org/apache/sirona/web/registration/WebMonitoringInitializer.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/web/src/main/java/org/apache/sirona/web/registration/WebMonitoringInitializer.java?rev=1538521&r1=1538520&r2=1538521&view=diff
==============================================================================
--- incubator/sirona/trunk/web/src/main/java/org/apache/sirona/web/registration/WebMonitoringInitializer.java (original)
+++ incubator/sirona/trunk/web/src/main/java/org/apache/sirona/web/registration/WebMonitoringInitializer.java Mon Nov  4 08:24:57 2013
@@ -42,13 +42,15 @@ public class WebMonitoringInitializer im
             return;
         }
 
+        final String monStatus = Boolean.toString(!FALSE.equalsIgnoreCase(ctx.getInitParameter(MonitoringFilter.MONITOR_STATUS)));
+        ctx.setAttribute(MonitoringFilter.MONITOR_STATUS, monStatus);
+
         ctx.addListener(MonitoringSessionListener.class);
         ctx.addListener(GaugeDiscoveryListener.class);
         if (ctx.getClassLoader().equals(Repository.class.getClassLoader())) {
             ctx.addListener(SironaLifecycle.class);
         }
 
-        final String monStatus = Boolean.toString(!FALSE.equalsIgnoreCase(ctx.getInitParameter(MonitoringFilter.MONITOR_STATUS)));
         String ignoredUrls = ctx.getInitParameter(MonitoringFilter.IGNORED_URLS);
         String monitoredUrls = ctx.getInitParameter(Configuration.CONFIG_PROPERTY_PREFIX + "web.monitored-urls");
         if (!"false".equalsIgnoreCase(monitoredUrls)) {

Modified: incubator/sirona/trunk/web/src/main/java/org/apache/sirona/web/servlet/MonitoringFilter.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/web/src/main/java/org/apache/sirona/web/servlet/MonitoringFilter.java?rev=1538521&r1=1538520&r2=1538521&view=diff
==============================================================================
--- incubator/sirona/trunk/web/src/main/java/org/apache/sirona/web/servlet/MonitoringFilter.java (original)
+++ incubator/sirona/trunk/web/src/main/java/org/apache/sirona/web/servlet/MonitoringFilter.java Mon Nov  4 08:24:57 2013
@@ -16,12 +16,11 @@
  */
 package org.apache.sirona.web.servlet;
 
+import org.apache.sirona.MonitoringException;
 import org.apache.sirona.Role;
 import org.apache.sirona.aop.AbstractPerformanceInterceptor;
 import org.apache.sirona.configuration.Configuration;
-import org.apache.sirona.counters.Counter;
-import org.apache.sirona.repositories.Repository;
-import org.apache.sirona.stopwatches.StopWatch;
+import org.apache.sirona.web.discovery.GaugeDiscoveryListener;
 
 import javax.servlet.Filter;
 import javax.servlet.FilterChain;
@@ -32,22 +31,14 @@ import javax.servlet.ServletResponse;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
-import java.lang.reflect.Field;
-import java.lang.reflect.Modifier;
-import java.net.HttpURLConnection;
 import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
 
 public class MonitoringFilter extends AbstractPerformanceInterceptor<MonitoringFilter.Invocation> implements Filter {
     public static final String MONITOR_STATUS = Configuration.CONFIG_PROPERTY_PREFIX + "web.monitored-status";
     public static final String IGNORED_URLS = Configuration.CONFIG_PROPERTY_PREFIX + "web.ignored-urls";
 
-    private static final ConcurrentMap<Integer, Counter.Key> STATUS_KEYS = new ConcurrentHashMap<Integer, Counter.Key>();
-
-    private boolean monitorStatus;
-
     private String[] ignored = new String[0];
+    private Map<Integer, StatusGauge> statusGauges = null;
 
     @Override
     public void init(final FilterConfig filterConfig) throws ServletException {
@@ -57,20 +48,12 @@ public class MonitoringFilter extends Ab
         }
 
         final String monStatus = filterConfig.getInitParameter(MONITOR_STATUS);
-        monitorStatus = monStatus == null || "true".equalsIgnoreCase(monStatus);
-
-        for (final Field f : HttpURLConnection.class.getDeclaredFields()) {
-            final int modifiers = f.getModifiers();
-            if (f.getName().startsWith("HTTP_")
-                && Modifier.isStatic(modifiers) && Modifier.isPublic(modifiers) && Modifier.isFinal(modifiers)) {
-                try {
-                    final int status = (Integer) f.get(null);
-                    STATUS_KEYS.put(status, statusKey((Integer) f.get(null)));
-                } catch (final IllegalAccessException e) {
-                    // no-op
-                }
-            }
+        if ((monStatus == null || "true".equalsIgnoreCase(monStatus))
+                && filterConfig.getServletContext().getAttribute(GaugeDiscoveryListener.STATUS_GAUGES_ATTRIBUTE) == null) {
+            throw new MonitoringException("To monitor status activate " + GaugeDiscoveryListener.class.getName());
         }
+
+        statusGauges = (Map<Integer, StatusGauge>) filterConfig.getServletContext().getAttribute(GaugeDiscoveryListener.STATUS_GAUGES_ATTRIBUTE);
     }
 
     @Override
@@ -98,9 +81,12 @@ public class MonitoringFilter extends Ab
                 }
                 throw new IOException(throwable);
             } finally {
-                if (monitorStatus) {
+                if (statusGauges != null) {
                     final int status = httpResponse.getStatus();
-                    Repository.INSTANCE.getCounter(statusKey(status)).add(1);
+                    final StatusGauge statusGauge = statusGauges.get(status);
+                    if (statusGauge != null) {
+                        statusGauge.incr();
+                    }
                 }
             }
         } else {
@@ -139,20 +125,6 @@ public class MonitoringFilter extends Ab
         return uri.substring(context.length());
     }
 
-    private static Counter.Key statusKey(final int status) {
-        final Counter.Key key = STATUS_KEYS.get(status);
-        if (key != null) {
-            return key;
-        }
-
-        final Counter.Key newKey = new Counter.Key(Role.WEB, "HTTP-" + Integer.toString(status));
-        final Counter.Key old = STATUS_KEYS.putIfAbsent(status, newKey);
-        if (old != null) {
-            return old;
-        }
-        return newKey;
-    }
-
     protected static class Invocation {
         protected final HttpServletRequest request;
         protected final HttpServletResponse response;

Added: incubator/sirona/trunk/web/src/main/java/org/apache/sirona/web/servlet/StatusGauge.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/web/src/main/java/org/apache/sirona/web/servlet/StatusGauge.java?rev=1538521&view=auto
==============================================================================
--- incubator/sirona/trunk/web/src/main/java/org/apache/sirona/web/servlet/StatusGauge.java (added)
+++ incubator/sirona/trunk/web/src/main/java/org/apache/sirona/web/servlet/StatusGauge.java Mon Nov  4 08:24:57 2013
@@ -0,0 +1,58 @@
+/*
+ * 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.sirona.web.servlet;
+
+import org.apache.sirona.Role;
+import org.apache.sirona.configuration.Configuration;
+import org.apache.sirona.gauges.Gauge;
+
+import java.util.concurrent.atomic.AtomicLong;
+
+public class StatusGauge implements Gauge {
+    private static final int PERIOD = Configuration.getInteger(Configuration.CONFIG_PROPERTY_PREFIX + "web.gauge.status.period", 4000);
+
+    private final Role role;
+    private final AtomicLong count = new AtomicLong(0);
+
+    public StatusGauge(final Role role) {
+        this.role = role;
+    }
+
+    @Override
+    public Role role() {
+        return role;
+    }
+
+    @Override
+    public double value() {
+        return count.getAndSet(0);
+    }
+
+    @Override
+    public long period() {
+        return PERIOD;
+    }
+
+    public void incr() {
+        count.incrementAndGet();
+    }
+
+    @Override
+    public String toString() {
+        return "StatusGauge{role=" + role + '}';
+    }
+}

Modified: incubator/sirona/trunk/web/src/main/java/org/apache/sirona/web/session/SessionGauge.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/web/src/main/java/org/apache/sirona/web/session/SessionGauge.java?rev=1538521&r1=1538520&r2=1538521&view=diff
==============================================================================
--- incubator/sirona/trunk/web/src/main/java/org/apache/sirona/web/session/SessionGauge.java (original)
+++ incubator/sirona/trunk/web/src/main/java/org/apache/sirona/web/session/SessionGauge.java Mon Nov  4 08:24:57 2013
@@ -57,6 +57,6 @@ public class SessionGauge implements Gau
 
     @Override
     public long period() {
-        return Configuration.getInteger(Configuration.CONFIG_PROPERTY_PREFIX + "gauge.sessions.period", 4000);
+        return Configuration.getInteger(Configuration.CONFIG_PROPERTY_PREFIX + "web.gauge.sessions.period", 4000);
     }
 }

Modified: incubator/sirona/trunk/web/src/test/java/org/apache/sirona/test/web/RequestPerformanceTest.java
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/web/src/test/java/org/apache/sirona/test/web/RequestPerformanceTest.java?rev=1538521&r1=1538520&r2=1538521&view=diff
==============================================================================
--- incubator/sirona/trunk/web/src/test/java/org/apache/sirona/test/web/RequestPerformanceTest.java (original)
+++ incubator/sirona/trunk/web/src/test/java/org/apache/sirona/test/web/RequestPerformanceTest.java Mon Nov  4 08:24:57 2013
@@ -17,12 +17,11 @@
 package org.apache.sirona.test.web;
 
 import com.gargoylesoftware.htmlunit.TextPage;
-import com.gargoylesoftware.htmlunit.WebAssert;
 import com.gargoylesoftware.htmlunit.WebClient;
-import com.gargoylesoftware.htmlunit.html.HtmlPage;
 import org.apache.catalina.startup.Constants;
 import org.apache.sirona.Role;
 import org.apache.sirona.counters.Counter;
+import org.apache.sirona.counters.Unit;
 import org.apache.sirona.repositories.Repository;
 import org.apache.sirona.web.registration.WebMonitoringInitializer;
 import org.jboss.arquillian.container.test.api.Deployment;
@@ -30,9 +29,9 @@ import org.jboss.arquillian.junit.Arquil
 import org.jboss.arquillian.test.api.ArquillianResource;
 import org.jboss.shrinkwrap.api.Archive;
 import org.jboss.shrinkwrap.api.ShrinkWrap;
+import org.jboss.shrinkwrap.api.asset.StringAsset;
 import org.jboss.shrinkwrap.api.spec.JavaArchive;
 import org.jboss.shrinkwrap.api.spec.WebArchive;
-import org.jboss.shrinkwrap.impl.base.io.IOUtil;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -41,9 +40,9 @@ import javax.servlet.ServletContainerIni
 import java.io.IOException;
 import java.net.HttpURLConnection;
 import java.net.URL;
+import java.util.Map;
 
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
 
 @RunWith(Arquillian.class)
 public class RequestPerformanceTest {
@@ -79,17 +78,21 @@ public class RequestPerformanceTest {
     }
 
     @Test
-    public void monitorStatus200() throws IOException {
+    public void knownStatusIsMonitored() throws IOException, InterruptedException {
+        final Role role = new Role("/sirona-test-HTTP-200", Unit.UNARY);
+        final int before = statusGaugeSum(role);
         final TextPage page = newClient().getPage(base.toExternalForm() + "hit");
         assertEquals(HttpURLConnection.HTTP_OK, page.getWebResponse().getStatusCode());
-        assertEquals(1, Repository.INSTANCE.getCounter(new Counter.Key(Role.WEB, "HTTP-200")).getHits());
+        Thread.sleep(1000);
+        assertEquals(1, statusGaugeSum(role) - before);
     }
 
     @Test
-    public void monitorStatus4567() throws IOException {
+    public void unknownStatusIsIgnored() throws IOException, InterruptedException {
         final TextPage page = newClient().getPage(base.toExternalForm() + "hit?status=4567");
         assertEquals(4567, page.getWebResponse().getStatusCode());
-        assertEquals(1, Repository.INSTANCE.getCounter(new Counter.Key(Role.WEB, "HTTP-4567")).getHits());
+        Thread.sleep(1000);
+        assertEquals(0, statusGaugeSum(new Role("/sirona-test-HTTP-4567", Unit.UNARY)));
     }
 
     private static WebClient newClient() {
@@ -100,4 +103,16 @@ public class RequestPerformanceTest {
         webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
         return webClient;
     }
+
+    private static int statusGaugeSum(final Role role) {
+        return sum(Repository.INSTANCE.getGaugeValues(0, System.currentTimeMillis() + 1000, role));
+    }
+
+    private static int sum(final Map<Long, Double> gaugeValues) {
+        int sum = 0;
+        for (final Double d : gaugeValues.values()) {
+            sum += d.intValue();
+        }
+        return sum;
+    }
 }

Added: incubator/sirona/trunk/web/src/test/resources/sirona.properties
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/web/src/test/resources/sirona.properties?rev=1538521&view=auto
==============================================================================
--- incubator/sirona/trunk/web/src/test/resources/sirona.properties (added)
+++ incubator/sirona/trunk/web/src/test/resources/sirona.properties Mon Nov  4 08:24:57 2013
@@ -0,0 +1,15 @@
+# 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.
+org.apache.sirona.gauge.web.status.period = 150