diff --git a/modules/metrics/src/main/java/org/springside/modules/metrics/Counter.java b/modules/metrics/src/main/java/org/springside/modules/metrics/Counter.java index 0a84ad15..3f8908d4 100644 --- a/modules/metrics/src/main/java/org/springside/modules/metrics/Counter.java +++ b/modules/metrics/src/main/java/org/springside/modules/metrics/Counter.java @@ -18,16 +18,16 @@ import org.springside.modules.metrics.utils.Clock; public class Counter { public static Clock clock = Clock.DEFAULT; - public CounterMetric snapshot = new CounterMetric(); + public CounterMetric snapshot; - private AtomicLong counter = new AtomicLong(0); + private AtomicLong counter; - private long totalCount = 0L; + private long totalCount; private long startTime; private long lastReportTime; public Counter() { - lastReportTime = clock.getCurrentTime(); + reset(); } public void inc() { @@ -71,6 +71,14 @@ public class Counter { return metric; } + public void reset() { + snapshot = new CounterMetric(); + counter = new AtomicLong(0); + totalCount = 0L; + startTime = clock.getCurrentTime(); + lastReportTime = 0L; + } + @Override public String toString() { return "Counter [counter=" + counter + ", totalCount=" + totalCount + ", startTime=" + startTime diff --git a/modules/metrics/src/main/java/org/springside/modules/metrics/MetricRegistry.java b/modules/metrics/src/main/java/org/springside/modules/metrics/MetricRegistry.java index 8c78ab67..92241041 100644 --- a/modules/metrics/src/main/java/org/springside/modules/metrics/MetricRegistry.java +++ b/modules/metrics/src/main/java/org/springside/modules/metrics/MetricRegistry.java @@ -97,6 +97,12 @@ public class MetricRegistry { } } + public void clearAll() { + counters.clear(); + histograms.clear(); + timers.clear(); + } + private T register(ConcurrentMap metrics, String name, T newMetric) { T existingMetric = metrics.putIfAbsent(name, newMetric); if (existingMetric != null) { diff --git a/modules/metrics/src/main/java/org/springside/modules/metrics/reporter/ConsoleReporter.java b/modules/metrics/src/main/java/org/springside/modules/metrics/reporter/ConsoleReporter.java index 0b5b38c1..a03f90bb 100644 --- a/modules/metrics/src/main/java/org/springside/modules/metrics/reporter/ConsoleReporter.java +++ b/modules/metrics/src/main/java/org/springside/modules/metrics/reporter/ConsoleReporter.java @@ -66,7 +66,8 @@ public class ConsoleReporter implements Reporter { } private void printCounter(CounterMetric counter) { - output.printf(" count = %d%n", counter.totalCount); + output.printf(" last count = %d%n", counter.lastCount); + output.printf(" total count = %d%n", counter.totalCount); output.printf(" last rate = %2.2f/s%n", counter.lastRate); output.printf(" mean rate = %2.2f/s%n", counter.meanRate); } diff --git a/modules/metrics/src/main/java/org/springside/modules/metrics/reporter/GraphiteReporter.java b/modules/metrics/src/main/java/org/springside/modules/metrics/reporter/GraphiteReporter.java index 3bc5194d..11f0211c 100644 --- a/modules/metrics/src/main/java/org/springside/modules/metrics/reporter/GraphiteReporter.java +++ b/modules/metrics/src/main/java/org/springside/modules/metrics/reporter/GraphiteReporter.java @@ -43,6 +43,9 @@ public class GraphiteReporter implements Reporter { private Socket socket; private Writer writer; + // use to only print connection error message once. + private GraphiteConnStatus graphiteConnStatus = GraphiteConnStatus.CONN_OK; + public GraphiteReporter(InetSocketAddress address) { this(address, "metrics"); } @@ -72,8 +75,10 @@ public class GraphiteReporter implements Reporter { } flush(); + + onConnSuccess(); } catch (IOException e) { - logger.warn("Unable to report to Graphite", e); + onConnFail(e); } finally { try { close(); @@ -136,6 +141,10 @@ public class GraphiteReporter implements Reporter { } private void close() throws IOException { + if (writer != null) { + writer.flush(); + } + if (socket != null) { socket.close(); } @@ -154,4 +163,22 @@ public class GraphiteReporter implements Reporter { private String sanitize(String s) { return WHITESPACE.matcher(s).replaceAll("-"); } + + private void onConnFail(Exception exception) { + if (graphiteConnStatus != GraphiteConnStatus.CONN_NOK) { + logger.warn("Unable to report to Graphite", exception); + graphiteConnStatus = GraphiteConnStatus.CONN_NOK; + } + } + + private void onConnSuccess() { + if (graphiteConnStatus != GraphiteConnStatus.CONN_OK) { + logger.info("Graphite connection is recovered."); + graphiteConnStatus = GraphiteConnStatus.CONN_OK; + } + } + + private enum GraphiteConnStatus { + CONN_OK, CONN_NOK + } } diff --git a/modules/metrics/src/main/java/org/springside/modules/metrics/reporter/ReportScheduler.java b/modules/metrics/src/main/java/org/springside/modules/metrics/reporter/ReportScheduler.java index 31f14e95..bc580807 100644 --- a/modules/metrics/src/main/java/org/springside/modules/metrics/reporter/ReportScheduler.java +++ b/modules/metrics/src/main/java/org/springside/modules/metrics/reporter/ReportScheduler.java @@ -51,6 +51,10 @@ public class ReportScheduler { reporters.add(reporter); } + public void removeReporter(Reporter reporter) { + reporters.remove(reporter); + } + public void start(long period, TimeUnit unit) { executor.scheduleAtFixedRate(new Runnable() { @Override