You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by hl...@apache.org on 2013/05/17 00:00:08 UTC
[2/5] git commit: Strip out the metrics support
Strip out the metrics support
Project: http://git-wip-us.apache.org/repos/asf/tapestry-5/repo
Commit: http://git-wip-us.apache.org/repos/asf/tapestry-5/commit/4fda4c80
Tree: http://git-wip-us.apache.org/repos/asf/tapestry-5/tree/4fda4c80
Diff: http://git-wip-us.apache.org/repos/asf/tapestry-5/diff/4fda4c80
Branch: refs/heads/master
Commit: 4fda4c803dc40bb164dff4203d8358c0e3996c85
Parents: 53443f2
Author: Howard M. Lewis Ship <hl...@apache.org>
Authored: Thu May 16 14:34:07 2013 -0700
Committer: Howard M. Lewis Ship <hl...@apache.org>
Committed: Thu May 16 14:34:07 2013 -0700
----------------------------------------------------------------------
.../apache/tapestry5/corelib/pages/AppMetrics.java | 48 --
.../tapestry5/modules/RootMetricsFilter.java | 52 ---
.../apache/tapestry5/modules/TapestryModule.java | 2 +-
.../apache/tapestry5/modules/WebMetricsModule.java | 34 --
.../apache/tapestry5/corelib/pages/AppMetrics.tml | 6 -
tapestry-ioc/build.gradle | 2 -
.../services/metrics/MetricCollectorImpl.java | 358 ---------------
.../tapestry5/ioc/modules/MetricsModule.java | 29 --
.../tapestry5/ioc/modules/TapestryIOCModule.java | 3 +-
.../tapestry5/ioc/services/metrics/Metric.java | 106 -----
.../ioc/services/metrics/MetricCollector.java | 32 --
.../ioc/services/metrics/MetricsSymbols.java | 10 -
12 files changed, 2 insertions(+), 680 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/4fda4c80/tapestry-core/src/main/java/org/apache/tapestry5/corelib/pages/AppMetrics.java
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/pages/AppMetrics.java b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/pages/AppMetrics.java
deleted file mode 100644
index d57b75c..0000000
--- a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/pages/AppMetrics.java
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright 2013 The Apache Software Foundation
-//
-// Licensed 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.tapestry5.corelib.pages;
-
-import org.apache.tapestry5.annotations.WhitelistAccessOnly;
-import org.apache.tapestry5.beaneditor.BeanModel;
-import org.apache.tapestry5.ioc.Messages;
-import org.apache.tapestry5.ioc.annotations.Inject;
-import org.apache.tapestry5.ioc.services.metrics.Metric;
-import org.apache.tapestry5.ioc.services.metrics.MetricCollector;
-import org.apache.tapestry5.services.BeanModelSource;
-
-import java.util.List;
-
-@WhitelistAccessOnly
-/**
- * Contributes to the {@link T5Dashboard} page, providing application metrics from the {@link org.apache.tapestry5.ioc.services.metrics.MetricCollector}.
- */
-public class AppMetrics
-{
- @Inject
- MetricCollector collector;
-
- @Inject
- BeanModelSource beanModelSource;
-
- @Inject
- private Messages messages;
-
- public final BeanModel<Metric> metricModel = beanModelSource.createDisplayModel(Metric.class, messages);
-
- public List<Metric> getRootMetrics()
- {
- return collector.getRootMetrics();
- }
-}
http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/4fda4c80/tapestry-core/src/main/java/org/apache/tapestry5/modules/RootMetricsFilter.java
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/modules/RootMetricsFilter.java b/tapestry-core/src/main/java/org/apache/tapestry5/modules/RootMetricsFilter.java
deleted file mode 100644
index 3d08f30..0000000
--- a/tapestry-core/src/main/java/org/apache/tapestry5/modules/RootMetricsFilter.java
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright 2013 The Apache Software Foundation
-//
-// Licensed 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.tapestry5.modules;
-
-import org.apache.tapestry5.ioc.services.metrics.Metric;
-import org.apache.tapestry5.ioc.services.metrics.MetricCollector;
-import org.apache.tapestry5.services.HttpServletRequestFilter;
-import org.apache.tapestry5.services.HttpServletRequestHandler;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-
-public class RootMetricsFilter implements HttpServletRequestFilter
-{
-
- private final Metric count, requestTime;
-
- public RootMetricsFilter(MetricCollector collector)
- {
- count = collector.createRootMetric("request-count", Metric.Type.TOTAL, Metric.Units.COUNTER);
- requestTime = collector.createRootMetric("request-time", Metric.Type.RATE, Metric.Units.MILLISECONDS);
- }
-
- public boolean service(HttpServletRequest request, HttpServletResponse response, HttpServletRequestHandler handler) throws IOException
- {
- long start = System.currentTimeMillis();
-
- boolean handled = handler.service(request, response);
-
- // We don't count the unhandled requests
-
- if (handled) {
- count.increment();
- requestTime.accumulate(System.currentTimeMillis() - start);
- }
-
- return handled;
- }
-}
http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/4fda4c80/tapestry-core/src/main/java/org/apache/tapestry5/modules/TapestryModule.java
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/modules/TapestryModule.java b/tapestry-core/src/main/java/org/apache/tapestry5/modules/TapestryModule.java
index 4f567b9..0dbe078 100644
--- a/tapestry-core/src/main/java/org/apache/tapestry5/modules/TapestryModule.java
+++ b/tapestry-core/src/main/java/org/apache/tapestry5/modules/TapestryModule.java
@@ -108,7 +108,7 @@ import java.util.regex.Pattern;
*/
@Marker(Core.class)
@SubModule(
- {InternalModule.class, AssetsModule.class, PageLoadModule.class, JavaScriptModule.class, CompatibilityModule.class, DashboardModule.class, WebMetricsModule.class})
+ {InternalModule.class, AssetsModule.class, PageLoadModule.class, JavaScriptModule.class, CompatibilityModule.class, DashboardModule.class})
public final class TapestryModule
{
private final PipelineBuilder pipelineBuilder;
http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/4fda4c80/tapestry-core/src/main/java/org/apache/tapestry5/modules/WebMetricsModule.java
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/modules/WebMetricsModule.java b/tapestry-core/src/main/java/org/apache/tapestry5/modules/WebMetricsModule.java
deleted file mode 100644
index 7778e94..0000000
--- a/tapestry-core/src/main/java/org/apache/tapestry5/modules/WebMetricsModule.java
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2013 The Apache Software Foundation
-//
-// Licensed 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.tapestry5.modules;
-
-import org.apache.tapestry5.ioc.OrderedConfiguration;
-import org.apache.tapestry5.ioc.annotations.Contribute;
-import org.apache.tapestry5.services.HttpServletRequestFilter;
-import org.apache.tapestry5.services.HttpServletRequestHandler;
-
-/**
- * Responsible for contributing filters in various places, to handle metrics collection.
- *
- * @since 5.4
- */
-public class WebMetricsModule
-{
- @Contribute(HttpServletRequestHandler.class)
- public static void addRootFilter(OrderedConfiguration<HttpServletRequestFilter> configuration)
- {
- configuration.addInstance("RootMetrics", RootMetricsFilter.class, "before:GZip");
- }
-}
http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/4fda4c80/tapestry-core/src/main/resources/org/apache/tapestry5/corelib/pages/AppMetrics.tml
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/resources/org/apache/tapestry5/corelib/pages/AppMetrics.tml b/tapestry-core/src/main/resources/org/apache/tapestry5/corelib/pages/AppMetrics.tml
deleted file mode 100644
index 736698a..0000000
--- a/tapestry-core/src/main/resources/org/apache/tapestry5/corelib/pages/AppMetrics.tml
+++ /dev/null
@@ -1,6 +0,0 @@
-<t:block id="content" xmlns:t="http://tapestry.apache.org/schema/tapestry_5_3.xsd"
- >
-
- <t:grid source="rootMetrics" model="metricModel"/>"
-
-</t:block>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/4fda4c80/tapestry-ioc/build.gradle
----------------------------------------------------------------------
diff --git a/tapestry-ioc/build.gradle b/tapestry-ioc/build.gradle
index b08f585..e890f7e 100644
--- a/tapestry-ioc/build.gradle
+++ b/tapestry-ioc/build.gradle
@@ -17,8 +17,6 @@ dependencies {
testCompile "org.spockframework:spock-core:${versions.spock}"
testCompile "commons-lang:commons-lang:2.6"
- compile "org.rrd4j:rrd4j:2.1.1"
-
provided "org.testng:testng:${versions.testng}", { transitive = false }
}
http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/4fda4c80/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/metrics/MetricCollectorImpl.java
----------------------------------------------------------------------
diff --git a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/metrics/MetricCollectorImpl.java b/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/metrics/MetricCollectorImpl.java
deleted file mode 100644
index 51cf1c9..0000000
--- a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/metrics/MetricCollectorImpl.java
+++ /dev/null
@@ -1,358 +0,0 @@
-// Copyright 2013 The Apache Software Foundation
-//
-// Licensed 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.tapestry5.ioc.internal.services.metrics;
-
-import org.apache.tapestry5.func.F;
-import org.apache.tapestry5.ioc.annotations.PostInjection;
-import org.apache.tapestry5.ioc.annotations.PreventServiceDecoration;
-import org.apache.tapestry5.ioc.annotations.Symbol;
-import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
-import org.apache.tapestry5.ioc.internal.util.InternalUtils;
-import org.apache.tapestry5.ioc.internal.util.LockSupport;
-import org.apache.tapestry5.ioc.services.cron.IntervalSchedule;
-import org.apache.tapestry5.ioc.services.cron.PeriodicExecutor;
-import org.apache.tapestry5.ioc.services.metrics.Metric;
-import org.apache.tapestry5.ioc.services.metrics.MetricCollector;
-import org.apache.tapestry5.ioc.services.metrics.MetricsSymbols;
-import org.apache.tapestry5.ioc.util.ExceptionUtils;
-import org.rrd4j.ConsolFun;
-import org.rrd4j.DsType;
-import org.rrd4j.core.*;
-import org.slf4j.Logger;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.atomic.AtomicReference;
-
-@PreventServiceDecoration
-public class MetricCollectorImpl extends LockSupport implements MetricCollector, Runnable
-{
- private final boolean inMemory;
-
- private final RrdBackendFactory factory;
-
- private final Logger logger;
-
- private final String dbDir;
-
- private final List<Runnable> updates = CollectionFactory.newThreadSafeList();
-
- public static final int HEARTBEAT = 10; // seconds
-
- public static final String DS_NAME = "data";
-
- public class MetricImpl extends LockSupport implements Metric, Comparable<MetricImpl>, Runnable
- {
- private final MetricImpl parent;
-
- private final Map<String, Metric> children = new HashMap<String, Metric>();
-
- private final String name;
-
- private final String path;
-
- private final Type type;
-
- private final Units units;
-
- private final RrdDb db;
-
- // TODO: May want to initialize this from stored data for Type.TOTAL
-
- private final AtomicReference<Double> accumulator = new AtomicReference<Double>(0d);
-
- MetricImpl(MetricImpl parent, String name, Type type, Units units)
- {
- this.name = name;
- assert InternalUtils.isNonBlank(name);
- assert type != null;
- assert units != null;
-
- this.parent = parent;
-
- // Parent may be null for a root Metric
- this.path = parent == null ? name : parent.getPath() + "/" + name;
-
- this.type = type;
- this.units = units;
-
- try
- {
- this.db = createDb();
- } catch (IOException ex)
- {
- throw new RuntimeException(String.format("Unable to create RrdDb for '%s': %s",
- path,
- ExceptionUtils.toMessage(ex)), ex);
- }
-
- updates.add(this);
- }
-
- private RrdDb createDb() throws IOException
- {
-
- if (inMemory)
- {
- return new RrdDb(createDef(path), factory);
- }
-
- // TODO: If we want to support other options, such as Mongo or Berkley, we'll need
- // to abstract the RRDb factory a bit further!
-
- String filePath = dbDir + "/" + path + ".rrdb";
-
- File dbFile = new File(filePath);
- dbFile.getParentFile().mkdirs();
-
- if (dbFile.exists())
- {
- return new RrdDb(filePath, factory);
- }
-
- return new RrdDb(createDef(filePath), factory);
- }
-
- private RrdDef createDef(String filePath)
- {
- RrdDef result = new RrdDef(filePath, HEARTBEAT);
-
- result.addDatasource(DS_NAME, DsType.COUNTER, HEARTBEAT, 0, Double.NaN);
- // One archive: average for each new data point, 10 minutes worth.
- result.addArchive(new ArcDef(ConsolFun.AVERAGE, .5, 1, 60));
-
- return result;
- }
-
- public int compareTo(MetricImpl o)
- {
- return this.name.compareTo(o.name);
- }
-
- public Metric createChild(String name)
- {
- assert InternalUtils.isNonBlank(name);
-
- try
- {
- acquireReadLock();
-
- Metric child = children.get(name);
-
- if (child == null)
- {
- try
- {
- upgradeReadLockToWriteLock();
-
- // Could be a race ...
-
- child = children.get(name);
-
- if (child == null)
- {
- child = new MetricImpl(this, name, type, units);
-
- children.put(name, child);
- }
- } finally
- {
- downgradeWriteLockToReadLock();
- }
- }
-
- return child;
-
- } finally
- {
- releaseReadLock();
- }
- }
-
- public String getPath()
- {
- return path;
- }
-
- public Type getType()
- {
- return type;
- }
-
- public Units getUnits()
- {
- return units;
- }
-
- public void increment()
- {
- accumulate(1);
- }
-
- public void accumulate(double value)
- {
- while (true)
- {
- Double current = accumulator.get();
- Double updated = current + value;
-
- // This is where an Atomic is better than a simple volatile, we can detect
- // when a race condition would have caused the loss of data by overlapping
- // read-and-increment operations. Still miss Clojure's approach, of course.
-
- if (accumulator.compareAndSet(current, updated))
- {
- break;
- }
- }
-
- if (parent != null)
- {
- parent.accumulate(value);
- }
- }
-
- public List<Metric> getChildren()
- {
- try
- {
- acquireReadLock();
-
- return F.flow(children.values()).sort().toList();
- } finally
- {
- releaseReadLock();
- }
- }
-
- public Date getLastUpdateTime()
- {
- try
- {
- return new Date(db.getLastUpdateTime());
- } catch (IOException ex)
- {
- return null;
- }
- }
-
- public void run()
- {
- try
- {
- db.createSample().setValue(DS_NAME, accumulator.getAndSet(0d)).update();
- } catch (IOException ex)
- {
- logger.error(String.format("Unable to update database for metric '%s': %s",
- path,
- ExceptionUtils.toMessage(ex)), ex);
- }
- }
- }
-
- private final Map<String, Metric> rootMetrics = new HashMap<String, Metric>();
-
- public MetricCollectorImpl(Logger logger, @Symbol(MetricsSymbols.RRD_DB_DIR) String dbDir)
- {
- this.logger = logger;
- this.dbDir = dbDir;
-
- inMemory = dbDir.equals("");
-
- factory = inMemory ? new RrdMemoryBackendFactory() : new RrdNioBackendFactory();
-
- logger.info(String.format("Collecting metrics %s.",
- inMemory ? "in memory" : (" to" + dbDir)));
- }
-
-
- public Metric createRootMetric(String name, Metric.Type type, Metric.Units units)
- {
-
- try
- {
- acquireReadLock();
-
- Metric result = rootMetrics.get(name);
-
- if (result == null)
- {
- try
- {
- upgradeReadLockToWriteLock();
-
- // There's a window where another thread may create the metric instead.
-
- result = rootMetrics.get(name);
-
- // But in the normal case, that won't happen and this thread has the exclusive
- // write lock to create and cache the new metric.
- if (result == null)
- {
-
- result = new MetricImpl(null, name, type, units);
-
- rootMetrics.put(name, result);
- }
- } finally
- {
- downgradeWriteLockToReadLock();
- }
- }
-
- if (result.getType() != type || result.getUnits() != units)
- {
- throw new IllegalArgumentException(String.format("Metric %s already exists and is type %s, units %s.",
- result.getPath(),
- result.getType().name(),
- result.getUnits().name()));
- }
-
- return result;
-
- } finally
- {
- releaseReadLock();
- }
-
- }
-
- /**
- * Invoked every few seconds to make all the active metrics update their dbs.
- */
- public void run()
- {
- for (Runnable r : updates)
- {
- r.run();
- }
- }
-
- @PostInjection
- public void activatePeriodicUpdates(PeriodicExecutor executor)
- {
- executor.addJob(new IntervalSchedule(HEARTBEAT * 1000),
- "UpdateMetrics", this);
- }
-
- public List<Metric> getRootMetrics()
- {
- return F.flow(rootMetrics.values()).sort().toList();
- }
-}
http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/4fda4c80/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/modules/MetricsModule.java
----------------------------------------------------------------------
diff --git a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/modules/MetricsModule.java b/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/modules/MetricsModule.java
deleted file mode 100644
index 38b2732..0000000
--- a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/modules/MetricsModule.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package org.apache.tapestry5.ioc.modules;
-
-import org.apache.tapestry5.ioc.MappedConfiguration;
-import org.apache.tapestry5.ioc.ServiceBinder;
-import org.apache.tapestry5.ioc.annotations.Contribute;
-import org.apache.tapestry5.ioc.annotations.Marker;
-import org.apache.tapestry5.ioc.internal.services.metrics.MetricCollectorImpl;
-import org.apache.tapestry5.ioc.services.Builtin;
-import org.apache.tapestry5.ioc.services.FactoryDefaults;
-import org.apache.tapestry5.ioc.services.SymbolProvider;
-import org.apache.tapestry5.ioc.services.metrics.MetricCollector;
-import org.apache.tapestry5.ioc.services.metrics.MetricsSymbols;
-
-@Marker(Builtin.class)
-public class MetricsModule
-{
-
- public static void bind(ServiceBinder binder)
- {
- binder.bind(MetricCollector.class, MetricCollectorImpl.class);
- }
-
- @Contribute(SymbolProvider.class)
- @FactoryDefaults
- public static void provideDefaults(MappedConfiguration<String, Object> configuration)
- {
- configuration.add(MetricsSymbols.RRD_DB_DIR, "");
- }
-}
http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/4fda4c80/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/modules/TapestryIOCModule.java
----------------------------------------------------------------------
diff --git a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/modules/TapestryIOCModule.java b/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/modules/TapestryIOCModule.java
index 178edf2..7f95181 100644
--- a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/modules/TapestryIOCModule.java
+++ b/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/modules/TapestryIOCModule.java
@@ -1,4 +1,4 @@
-// Copyright 2006-2012 The Apache Software Foundation
+// Copyright 2006-2013 The Apache Software Foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -43,7 +43,6 @@ import static org.apache.tapestry5.ioc.OrderConstraintBuilder.before;
*/
@SuppressWarnings("all")
@Marker(Builtin.class)
-@SubModule(MetricsModule.class)
public final class TapestryIOCModule
{
public static void bind(ServiceBinder binder)
http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/4fda4c80/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/metrics/Metric.java
----------------------------------------------------------------------
diff --git a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/metrics/Metric.java b/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/metrics/Metric.java
deleted file mode 100644
index 71cda59..0000000
--- a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/metrics/Metric.java
+++ /dev/null
@@ -1,106 +0,0 @@
-// Copyright 2013 The Apache Software Foundation
-//
-// Licensed 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.tapestry5.ioc.services.metrics;
-
-import java.util.Date;
-import java.util.List;
-
-/**
- * @since 5.4
- */
-public interface Metric
-{
- enum Type
- {
- /**
- * Storing a value accumulates into an ever increasing total. Example:
- * number of burgers served.
- */
- TOTAL,
-
- /**
- * Storing a value accumulates just for the current time interval. Example:
- * burgers served per second.
- */
- RATE
- }
-
-
- /**
- * Primarily used when reporting to indicate the types of values.
- */
- enum Units
- {
- /**
- * Appropriate when measuring bytes transferred, etc.
- */
- BYTES,
- /**
- * Useful when measuring the time to produce a result, such as processing some kind of request.
- */
- MILLISECONDS,
- /**
- * Placeholder for all other kinds of units, such as "pages viewed" or "messages processed".
- */
- COUNTER
- }
-
- /**
- * Creates a child metric with the same type and units.
- * Values posted to the child are also posted to the container (this
- * bubbling up can occur across several levels).
- *
- * @param name
- * child's extension to this Metric's name
- * @return the child with the given name (creating it if necessary).
- */
- Metric createChild(String name);
-
- /**
- * Returns the path to this metric: the metric's name appended (after a slash) to the parent
- * metric's path.
- */
- String getPath();
-
- Type getType();
-
- Units getUnits();
-
- /**
- * Accumulates a value of 1; useful when the metric's type is {@link Units#COUNTER}.
- */
- void increment();
-
- /**
- * Adds the provided value to the current time interval's value. This may be called multiple times during
- * a time interval, and the values will accumulate. In addition, {@link #accumulate(double)}
- * propagates the value up to the parent metrics, if any, all the way up to the root metric.
- *
- * @param value
- */
- void accumulate(double value);
-
- /**
- * Returns the children of this metric, sorted by name.
- */
- List<Metric> getChildren();
-
- /**
- * Returns the last time the archive was updated (this happens a regular intervals called heartbeats).
- *
- * @return archive update time, or null if there is an exception accessing the time
- */
- Date getLastUpdateTime();
-}
http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/4fda4c80/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/metrics/MetricCollector.java
----------------------------------------------------------------------
diff --git a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/metrics/MetricCollector.java b/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/metrics/MetricCollector.java
deleted file mode 100644
index e5c168f..0000000
--- a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/metrics/MetricCollector.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package org.apache.tapestry5.ioc.services.metrics;
-
-import java.util.List;
-
-/**
- * Central hub for creating or obtaining {@link Metric}s.
- *
- * @since 5.4
- */
-public interface MetricCollector
-{
- /**
- * Creates a root metric, or returns an existing one.
- *
- * @param name
- * name of the metric to create
- * @param type
- * used when creating the metric
- * @param units
- * used when creating the metric
- * @return the metric
- * @throws IllegalMonitorStateException
- * if an existing root metric with that name is present, but does
- * not have the matching type and units.
- */
- Metric createRootMetric(String name, Metric.Type type, Metric.Units units);
-
- /**
- * Returns root metrics, sorted by name.
- */
- List<Metric> getRootMetrics();
-}
http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/4fda4c80/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/metrics/MetricsSymbols.java
----------------------------------------------------------------------
diff --git a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/metrics/MetricsSymbols.java b/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/metrics/MetricsSymbols.java
deleted file mode 100644
index 39c9bb1..0000000
--- a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/metrics/MetricsSymbols.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package org.apache.tapestry5.ioc.services.metrics;
-
-public class MetricsSymbols
-{
- /**
- * The directory in which RRDb database files are stored. If blank (the default),
- * then RRD is set up for in-memory databases only (re-created on each launch of the application).
- */
- public static final String RRD_DB_DIR = "tapestry.rrd-dir";
-}
Re: [2/5] git commit: Strip out the metrics support
Posted by Howard Lewis Ship <hl...@gmail.com>.
It became obvious that I didn't have a real plan, or the time, to get this
into 5.4. I can't even communicate a design ... too busy with other stuff.
I'm trying to lock down 5.4 pretty soon; my last two major items are
- wro4j support (CoffeeScript, Less, CSS and JS minimization)
- websocket/server-push/comet.d -- something to fascilitate easy server push
On Fri, May 17, 2013 at 2:51 AM, Massimo Lusetti <ml...@gmail.com> wrote:
> On Fri, May 17, 2013 at 9:36 AM, Ulrich Stärk <ul...@spielviel.de> wrote:
>
> Why?
> >
> >
> Don't know if it's related but the last version of rrd4j requires java6 ...
> BTW the deps was on 2.1.x which still run on java5
>
> --
> Massimo Lusetti
>
--
Howard M. Lewis Ship
Creator of Apache Tapestry
The source for Tapestry training, mentoring and support. Contact me to
learn how I can get you up and productive in Tapestry fast!
(971) 678-5210
http://howardlewisship.com
Re: [2/5] git commit: Strip out the metrics support
Posted by Massimo Lusetti <ml...@gmail.com>.
On Fri, May 17, 2013 at 9:36 AM, Ulrich Stärk <ul...@spielviel.de> wrote:
Why?
>
>
Don't know if it's related but the last version of rrd4j requires java6 ...
BTW the deps was on 2.1.x which still run on java5
--
Massimo Lusetti
Re: [2/5] git commit: Strip out the metrics support
Posted by Ulrich Stärk <ul...@spielviel.de>.
Why?
On 17.05.2013 00:00, hlship@apache.org wrote:
> Strip out the metrics support
>
>
> Project: http://git-wip-us.apache.org/repos/asf/tapestry-5/repo
> Commit: http://git-wip-us.apache.org/repos/asf/tapestry-5/commit/4fda4c80
> Tree: http://git-wip-us.apache.org/repos/asf/tapestry-5/tree/4fda4c80
> Diff: http://git-wip-us.apache.org/repos/asf/tapestry-5/diff/4fda4c80
>
> Branch: refs/heads/master
> Commit: 4fda4c803dc40bb164dff4203d8358c0e3996c85
> Parents: 53443f2
> Author: Howard M. Lewis Ship <hl...@apache.org>
> Authored: Thu May 16 14:34:07 2013 -0700
> Committer: Howard M. Lewis Ship <hl...@apache.org>
> Committed: Thu May 16 14:34:07 2013 -0700
>
> ----------------------------------------------------------------------
> .../apache/tapestry5/corelib/pages/AppMetrics.java | 48 --
> .../tapestry5/modules/RootMetricsFilter.java | 52 ---
> .../apache/tapestry5/modules/TapestryModule.java | 2 +-
> .../apache/tapestry5/modules/WebMetricsModule.java | 34 --
> .../apache/tapestry5/corelib/pages/AppMetrics.tml | 6 -
> tapestry-ioc/build.gradle | 2 -
> .../services/metrics/MetricCollectorImpl.java | 358 ---------------
> .../tapestry5/ioc/modules/MetricsModule.java | 29 --
> .../tapestry5/ioc/modules/TapestryIOCModule.java | 3 +-
> .../tapestry5/ioc/services/metrics/Metric.java | 106 -----
> .../ioc/services/metrics/MetricCollector.java | 32 --
> .../ioc/services/metrics/MetricsSymbols.java | 10 -
> 12 files changed, 2 insertions(+), 680 deletions(-)
> ----------------------------------------------------------------------
>
>
> http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/4fda4c80/tapestry-core/src/main/java/org/apache/tapestry5/corelib/pages/AppMetrics.java
> ----------------------------------------------------------------------
> diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/pages/AppMetrics.java b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/pages/AppMetrics.java
> deleted file mode 100644
> index d57b75c..0000000
> --- a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/pages/AppMetrics.java
> +++ /dev/null
> @@ -1,48 +0,0 @@
> -// Copyright 2013 The Apache Software Foundation
> -//
> -// Licensed 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.tapestry5.corelib.pages;
> -
> -import org.apache.tapestry5.annotations.WhitelistAccessOnly;
> -import org.apache.tapestry5.beaneditor.BeanModel;
> -import org.apache.tapestry5.ioc.Messages;
> -import org.apache.tapestry5.ioc.annotations.Inject;
> -import org.apache.tapestry5.ioc.services.metrics.Metric;
> -import org.apache.tapestry5.ioc.services.metrics.MetricCollector;
> -import org.apache.tapestry5.services.BeanModelSource;
> -
> -import java.util.List;
> -
> -@WhitelistAccessOnly
> -/**
> - * Contributes to the {@link T5Dashboard} page, providing application metrics from the {@link org.apache.tapestry5.ioc.services.metrics.MetricCollector}.
> - */
> -public class AppMetrics
> -{
> - @Inject
> - MetricCollector collector;
> -
> - @Inject
> - BeanModelSource beanModelSource;
> -
> - @Inject
> - private Messages messages;
> -
> - public final BeanModel<Metric> metricModel = beanModelSource.createDisplayModel(Metric.class, messages);
> -
> - public List<Metric> getRootMetrics()
> - {
> - return collector.getRootMetrics();
> - }
> -}
>
> http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/4fda4c80/tapestry-core/src/main/java/org/apache/tapestry5/modules/RootMetricsFilter.java
> ----------------------------------------------------------------------
> diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/modules/RootMetricsFilter.java b/tapestry-core/src/main/java/org/apache/tapestry5/modules/RootMetricsFilter.java
> deleted file mode 100644
> index 3d08f30..0000000
> --- a/tapestry-core/src/main/java/org/apache/tapestry5/modules/RootMetricsFilter.java
> +++ /dev/null
> @@ -1,52 +0,0 @@
> -// Copyright 2013 The Apache Software Foundation
> -//
> -// Licensed 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.tapestry5.modules;
> -
> -import org.apache.tapestry5.ioc.services.metrics.Metric;
> -import org.apache.tapestry5.ioc.services.metrics.MetricCollector;
> -import org.apache.tapestry5.services.HttpServletRequestFilter;
> -import org.apache.tapestry5.services.HttpServletRequestHandler;
> -
> -import javax.servlet.http.HttpServletRequest;
> -import javax.servlet.http.HttpServletResponse;
> -import java.io.IOException;
> -
> -public class RootMetricsFilter implements HttpServletRequestFilter
> -{
> -
> - private final Metric count, requestTime;
> -
> - public RootMetricsFilter(MetricCollector collector)
> - {
> - count = collector.createRootMetric("request-count", Metric.Type.TOTAL, Metric.Units.COUNTER);
> - requestTime = collector.createRootMetric("request-time", Metric.Type.RATE, Metric.Units.MILLISECONDS);
> - }
> -
> - public boolean service(HttpServletRequest request, HttpServletResponse response, HttpServletRequestHandler handler) throws IOException
> - {
> - long start = System.currentTimeMillis();
> -
> - boolean handled = handler.service(request, response);
> -
> - // We don't count the unhandled requests
> -
> - if (handled) {
> - count.increment();
> - requestTime.accumulate(System.currentTimeMillis() - start);
> - }
> -
> - return handled;
> - }
> -}
>
> http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/4fda4c80/tapestry-core/src/main/java/org/apache/tapestry5/modules/TapestryModule.java
> ----------------------------------------------------------------------
> diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/modules/TapestryModule.java b/tapestry-core/src/main/java/org/apache/tapestry5/modules/TapestryModule.java
> index 4f567b9..0dbe078 100644
> --- a/tapestry-core/src/main/java/org/apache/tapestry5/modules/TapestryModule.java
> +++ b/tapestry-core/src/main/java/org/apache/tapestry5/modules/TapestryModule.java
> @@ -108,7 +108,7 @@ import java.util.regex.Pattern;
> */
> @Marker(Core.class)
> @SubModule(
> - {InternalModule.class, AssetsModule.class, PageLoadModule.class, JavaScriptModule.class, CompatibilityModule.class, DashboardModule.class, WebMetricsModule.class})
> + {InternalModule.class, AssetsModule.class, PageLoadModule.class, JavaScriptModule.class, CompatibilityModule.class, DashboardModule.class})
> public final class TapestryModule
> {
> private final PipelineBuilder pipelineBuilder;
>
> http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/4fda4c80/tapestry-core/src/main/java/org/apache/tapestry5/modules/WebMetricsModule.java
> ----------------------------------------------------------------------
> diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/modules/WebMetricsModule.java b/tapestry-core/src/main/java/org/apache/tapestry5/modules/WebMetricsModule.java
> deleted file mode 100644
> index 7778e94..0000000
> --- a/tapestry-core/src/main/java/org/apache/tapestry5/modules/WebMetricsModule.java
> +++ /dev/null
> @@ -1,34 +0,0 @@
> -// Copyright 2013 The Apache Software Foundation
> -//
> -// Licensed 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.tapestry5.modules;
> -
> -import org.apache.tapestry5.ioc.OrderedConfiguration;
> -import org.apache.tapestry5.ioc.annotations.Contribute;
> -import org.apache.tapestry5.services.HttpServletRequestFilter;
> -import org.apache.tapestry5.services.HttpServletRequestHandler;
> -
> -/**
> - * Responsible for contributing filters in various places, to handle metrics collection.
> - *
> - * @since 5.4
> - */
> -public class WebMetricsModule
> -{
> - @Contribute(HttpServletRequestHandler.class)
> - public static void addRootFilter(OrderedConfiguration<HttpServletRequestFilter> configuration)
> - {
> - configuration.addInstance("RootMetrics", RootMetricsFilter.class, "before:GZip");
> - }
> -}
>
> http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/4fda4c80/tapestry-core/src/main/resources/org/apache/tapestry5/corelib/pages/AppMetrics.tml
> ----------------------------------------------------------------------
> diff --git a/tapestry-core/src/main/resources/org/apache/tapestry5/corelib/pages/AppMetrics.tml b/tapestry-core/src/main/resources/org/apache/tapestry5/corelib/pages/AppMetrics.tml
> deleted file mode 100644
> index 736698a..0000000
> --- a/tapestry-core/src/main/resources/org/apache/tapestry5/corelib/pages/AppMetrics.tml
> +++ /dev/null
> @@ -1,6 +0,0 @@
> -<t:block id="content" xmlns:t="http://tapestry.apache.org/schema/tapestry_5_3.xsd"
> - >
> -
> - <t:grid source="rootMetrics" model="metricModel"/>"
> -
> -</t:block>
> \ No newline at end of file
>
> http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/4fda4c80/tapestry-ioc/build.gradle
> ----------------------------------------------------------------------
> diff --git a/tapestry-ioc/build.gradle b/tapestry-ioc/build.gradle
> index b08f585..e890f7e 100644
> --- a/tapestry-ioc/build.gradle
> +++ b/tapestry-ioc/build.gradle
> @@ -17,8 +17,6 @@ dependencies {
> testCompile "org.spockframework:spock-core:${versions.spock}"
> testCompile "commons-lang:commons-lang:2.6"
>
> - compile "org.rrd4j:rrd4j:2.1.1"
> -
> provided "org.testng:testng:${versions.testng}", { transitive = false }
> }
>
>
> http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/4fda4c80/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/metrics/MetricCollectorImpl.java
> ----------------------------------------------------------------------
> diff --git a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/metrics/MetricCollectorImpl.java b/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/metrics/MetricCollectorImpl.java
> deleted file mode 100644
> index 51cf1c9..0000000
> --- a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/metrics/MetricCollectorImpl.java
> +++ /dev/null
> @@ -1,358 +0,0 @@
> -// Copyright 2013 The Apache Software Foundation
> -//
> -// Licensed 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.tapestry5.ioc.internal.services.metrics;
> -
> -import org.apache.tapestry5.func.F;
> -import org.apache.tapestry5.ioc.annotations.PostInjection;
> -import org.apache.tapestry5.ioc.annotations.PreventServiceDecoration;
> -import org.apache.tapestry5.ioc.annotations.Symbol;
> -import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
> -import org.apache.tapestry5.ioc.internal.util.InternalUtils;
> -import org.apache.tapestry5.ioc.internal.util.LockSupport;
> -import org.apache.tapestry5.ioc.services.cron.IntervalSchedule;
> -import org.apache.tapestry5.ioc.services.cron.PeriodicExecutor;
> -import org.apache.tapestry5.ioc.services.metrics.Metric;
> -import org.apache.tapestry5.ioc.services.metrics.MetricCollector;
> -import org.apache.tapestry5.ioc.services.metrics.MetricsSymbols;
> -import org.apache.tapestry5.ioc.util.ExceptionUtils;
> -import org.rrd4j.ConsolFun;
> -import org.rrd4j.DsType;
> -import org.rrd4j.core.*;
> -import org.slf4j.Logger;
> -
> -import java.io.File;
> -import java.io.IOException;
> -import java.util.Date;
> -import java.util.HashMap;
> -import java.util.List;
> -import java.util.Map;
> -import java.util.concurrent.atomic.AtomicReference;
> -
> -@PreventServiceDecoration
> -public class MetricCollectorImpl extends LockSupport implements MetricCollector, Runnable
> -{
> - private final boolean inMemory;
> -
> - private final RrdBackendFactory factory;
> -
> - private final Logger logger;
> -
> - private final String dbDir;
> -
> - private final List<Runnable> updates = CollectionFactory.newThreadSafeList();
> -
> - public static final int HEARTBEAT = 10; // seconds
> -
> - public static final String DS_NAME = "data";
> -
> - public class MetricImpl extends LockSupport implements Metric, Comparable<MetricImpl>, Runnable
> - {
> - private final MetricImpl parent;
> -
> - private final Map<String, Metric> children = new HashMap<String, Metric>();
> -
> - private final String name;
> -
> - private final String path;
> -
> - private final Type type;
> -
> - private final Units units;
> -
> - private final RrdDb db;
> -
> - // TODO: May want to initialize this from stored data for Type.TOTAL
> -
> - private final AtomicReference<Double> accumulator = new AtomicReference<Double>(0d);
> -
> - MetricImpl(MetricImpl parent, String name, Type type, Units units)
> - {
> - this.name = name;
> - assert InternalUtils.isNonBlank(name);
> - assert type != null;
> - assert units != null;
> -
> - this.parent = parent;
> -
> - // Parent may be null for a root Metric
> - this.path = parent == null ? name : parent.getPath() + "/" + name;
> -
> - this.type = type;
> - this.units = units;
> -
> - try
> - {
> - this.db = createDb();
> - } catch (IOException ex)
> - {
> - throw new RuntimeException(String.format("Unable to create RrdDb for '%s': %s",
> - path,
> - ExceptionUtils.toMessage(ex)), ex);
> - }
> -
> - updates.add(this);
> - }
> -
> - private RrdDb createDb() throws IOException
> - {
> -
> - if (inMemory)
> - {
> - return new RrdDb(createDef(path), factory);
> - }
> -
> - // TODO: If we want to support other options, such as Mongo or Berkley, we'll need
> - // to abstract the RRDb factory a bit further!
> -
> - String filePath = dbDir + "/" + path + ".rrdb";
> -
> - File dbFile = new File(filePath);
> - dbFile.getParentFile().mkdirs();
> -
> - if (dbFile.exists())
> - {
> - return new RrdDb(filePath, factory);
> - }
> -
> - return new RrdDb(createDef(filePath), factory);
> - }
> -
> - private RrdDef createDef(String filePath)
> - {
> - RrdDef result = new RrdDef(filePath, HEARTBEAT);
> -
> - result.addDatasource(DS_NAME, DsType.COUNTER, HEARTBEAT, 0, Double.NaN);
> - // One archive: average for each new data point, 10 minutes worth.
> - result.addArchive(new ArcDef(ConsolFun.AVERAGE, .5, 1, 60));
> -
> - return result;
> - }
> -
> - public int compareTo(MetricImpl o)
> - {
> - return this.name.compareTo(o.name);
> - }
> -
> - public Metric createChild(String name)
> - {
> - assert InternalUtils.isNonBlank(name);
> -
> - try
> - {
> - acquireReadLock();
> -
> - Metric child = children.get(name);
> -
> - if (child == null)
> - {
> - try
> - {
> - upgradeReadLockToWriteLock();
> -
> - // Could be a race ...
> -
> - child = children.get(name);
> -
> - if (child == null)
> - {
> - child = new MetricImpl(this, name, type, units);
> -
> - children.put(name, child);
> - }
> - } finally
> - {
> - downgradeWriteLockToReadLock();
> - }
> - }
> -
> - return child;
> -
> - } finally
> - {
> - releaseReadLock();
> - }
> - }
> -
> - public String getPath()
> - {
> - return path;
> - }
> -
> - public Type getType()
> - {
> - return type;
> - }
> -
> - public Units getUnits()
> - {
> - return units;
> - }
> -
> - public void increment()
> - {
> - accumulate(1);
> - }
> -
> - public void accumulate(double value)
> - {
> - while (true)
> - {
> - Double current = accumulator.get();
> - Double updated = current + value;
> -
> - // This is where an Atomic is better than a simple volatile, we can detect
> - // when a race condition would have caused the loss of data by overlapping
> - // read-and-increment operations. Still miss Clojure's approach, of course.
> -
> - if (accumulator.compareAndSet(current, updated))
> - {
> - break;
> - }
> - }
> -
> - if (parent != null)
> - {
> - parent.accumulate(value);
> - }
> - }
> -
> - public List<Metric> getChildren()
> - {
> - try
> - {
> - acquireReadLock();
> -
> - return F.flow(children.values()).sort().toList();
> - } finally
> - {
> - releaseReadLock();
> - }
> - }
> -
> - public Date getLastUpdateTime()
> - {
> - try
> - {
> - return new Date(db.getLastUpdateTime());
> - } catch (IOException ex)
> - {
> - return null;
> - }
> - }
> -
> - public void run()
> - {
> - try
> - {
> - db.createSample().setValue(DS_NAME, accumulator.getAndSet(0d)).update();
> - } catch (IOException ex)
> - {
> - logger.error(String.format("Unable to update database for metric '%s': %s",
> - path,
> - ExceptionUtils.toMessage(ex)), ex);
> - }
> - }
> - }
> -
> - private final Map<String, Metric> rootMetrics = new HashMap<String, Metric>();
> -
> - public MetricCollectorImpl(Logger logger, @Symbol(MetricsSymbols.RRD_DB_DIR) String dbDir)
> - {
> - this.logger = logger;
> - this.dbDir = dbDir;
> -
> - inMemory = dbDir.equals("");
> -
> - factory = inMemory ? new RrdMemoryBackendFactory() : new RrdNioBackendFactory();
> -
> - logger.info(String.format("Collecting metrics %s.",
> - inMemory ? "in memory" : (" to" + dbDir)));
> - }
> -
> -
> - public Metric createRootMetric(String name, Metric.Type type, Metric.Units units)
> - {
> -
> - try
> - {
> - acquireReadLock();
> -
> - Metric result = rootMetrics.get(name);
> -
> - if (result == null)
> - {
> - try
> - {
> - upgradeReadLockToWriteLock();
> -
> - // There's a window where another thread may create the metric instead.
> -
> - result = rootMetrics.get(name);
> -
> - // But in the normal case, that won't happen and this thread has the exclusive
> - // write lock to create and cache the new metric.
> - if (result == null)
> - {
> -
> - result = new MetricImpl(null, name, type, units);
> -
> - rootMetrics.put(name, result);
> - }
> - } finally
> - {
> - downgradeWriteLockToReadLock();
> - }
> - }
> -
> - if (result.getType() != type || result.getUnits() != units)
> - {
> - throw new IllegalArgumentException(String.format("Metric %s already exists and is type %s, units %s.",
> - result.getPath(),
> - result.getType().name(),
> - result.getUnits().name()));
> - }
> -
> - return result;
> -
> - } finally
> - {
> - releaseReadLock();
> - }
> -
> - }
> -
> - /**
> - * Invoked every few seconds to make all the active metrics update their dbs.
> - */
> - public void run()
> - {
> - for (Runnable r : updates)
> - {
> - r.run();
> - }
> - }
> -
> - @PostInjection
> - public void activatePeriodicUpdates(PeriodicExecutor executor)
> - {
> - executor.addJob(new IntervalSchedule(HEARTBEAT * 1000),
> - "UpdateMetrics", this);
> - }
> -
> - public List<Metric> getRootMetrics()
> - {
> - return F.flow(rootMetrics.values()).sort().toList();
> - }
> -}
>
> http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/4fda4c80/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/modules/MetricsModule.java
> ----------------------------------------------------------------------
> diff --git a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/modules/MetricsModule.java b/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/modules/MetricsModule.java
> deleted file mode 100644
> index 38b2732..0000000
> --- a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/modules/MetricsModule.java
> +++ /dev/null
> @@ -1,29 +0,0 @@
> -package org.apache.tapestry5.ioc.modules;
> -
> -import org.apache.tapestry5.ioc.MappedConfiguration;
> -import org.apache.tapestry5.ioc.ServiceBinder;
> -import org.apache.tapestry5.ioc.annotations.Contribute;
> -import org.apache.tapestry5.ioc.annotations.Marker;
> -import org.apache.tapestry5.ioc.internal.services.metrics.MetricCollectorImpl;
> -import org.apache.tapestry5.ioc.services.Builtin;
> -import org.apache.tapestry5.ioc.services.FactoryDefaults;
> -import org.apache.tapestry5.ioc.services.SymbolProvider;
> -import org.apache.tapestry5.ioc.services.metrics.MetricCollector;
> -import org.apache.tapestry5.ioc.services.metrics.MetricsSymbols;
> -
> -@Marker(Builtin.class)
> -public class MetricsModule
> -{
> -
> - public static void bind(ServiceBinder binder)
> - {
> - binder.bind(MetricCollector.class, MetricCollectorImpl.class);
> - }
> -
> - @Contribute(SymbolProvider.class)
> - @FactoryDefaults
> - public static void provideDefaults(MappedConfiguration<String, Object> configuration)
> - {
> - configuration.add(MetricsSymbols.RRD_DB_DIR, "");
> - }
> -}
>
> http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/4fda4c80/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/modules/TapestryIOCModule.java
> ----------------------------------------------------------------------
> diff --git a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/modules/TapestryIOCModule.java b/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/modules/TapestryIOCModule.java
> index 178edf2..7f95181 100644
> --- a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/modules/TapestryIOCModule.java
> +++ b/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/modules/TapestryIOCModule.java
> @@ -1,4 +1,4 @@
> -// Copyright 2006-2012 The Apache Software Foundation
> +// Copyright 2006-2013 The Apache Software Foundation
> //
> // Licensed under the Apache License, Version 2.0 (the "License");
> // you may not use this file except in compliance with the License.
> @@ -43,7 +43,6 @@ import static org.apache.tapestry5.ioc.OrderConstraintBuilder.before;
> */
> @SuppressWarnings("all")
> @Marker(Builtin.class)
> -@SubModule(MetricsModule.class)
> public final class TapestryIOCModule
> {
> public static void bind(ServiceBinder binder)
>
> http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/4fda4c80/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/metrics/Metric.java
> ----------------------------------------------------------------------
> diff --git a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/metrics/Metric.java b/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/metrics/Metric.java
> deleted file mode 100644
> index 71cda59..0000000
> --- a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/metrics/Metric.java
> +++ /dev/null
> @@ -1,106 +0,0 @@
> -// Copyright 2013 The Apache Software Foundation
> -//
> -// Licensed 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.tapestry5.ioc.services.metrics;
> -
> -import java.util.Date;
> -import java.util.List;
> -
> -/**
> - * @since 5.4
> - */
> -public interface Metric
> -{
> - enum Type
> - {
> - /**
> - * Storing a value accumulates into an ever increasing total. Example:
> - * number of burgers served.
> - */
> - TOTAL,
> -
> - /**
> - * Storing a value accumulates just for the current time interval. Example:
> - * burgers served per second.
> - */
> - RATE
> - }
> -
> -
> - /**
> - * Primarily used when reporting to indicate the types of values.
> - */
> - enum Units
> - {
> - /**
> - * Appropriate when measuring bytes transferred, etc.
> - */
> - BYTES,
> - /**
> - * Useful when measuring the time to produce a result, such as processing some kind of request.
> - */
> - MILLISECONDS,
> - /**
> - * Placeholder for all other kinds of units, such as "pages viewed" or "messages processed".
> - */
> - COUNTER
> - }
> -
> - /**
> - * Creates a child metric with the same type and units.
> - * Values posted to the child are also posted to the container (this
> - * bubbling up can occur across several levels).
> - *
> - * @param name
> - * child's extension to this Metric's name
> - * @return the child with the given name (creating it if necessary).
> - */
> - Metric createChild(String name);
> -
> - /**
> - * Returns the path to this metric: the metric's name appended (after a slash) to the parent
> - * metric's path.
> - */
> - String getPath();
> -
> - Type getType();
> -
> - Units getUnits();
> -
> - /**
> - * Accumulates a value of 1; useful when the metric's type is {@link Units#COUNTER}.
> - */
> - void increment();
> -
> - /**
> - * Adds the provided value to the current time interval's value. This may be called multiple times during
> - * a time interval, and the values will accumulate. In addition, {@link #accumulate(double)}
> - * propagates the value up to the parent metrics, if any, all the way up to the root metric.
> - *
> - * @param value
> - */
> - void accumulate(double value);
> -
> - /**
> - * Returns the children of this metric, sorted by name.
> - */
> - List<Metric> getChildren();
> -
> - /**
> - * Returns the last time the archive was updated (this happens a regular intervals called heartbeats).
> - *
> - * @return archive update time, or null if there is an exception accessing the time
> - */
> - Date getLastUpdateTime();
> -}
>
> http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/4fda4c80/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/metrics/MetricCollector.java
> ----------------------------------------------------------------------
> diff --git a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/metrics/MetricCollector.java b/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/metrics/MetricCollector.java
> deleted file mode 100644
> index e5c168f..0000000
> --- a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/metrics/MetricCollector.java
> +++ /dev/null
> @@ -1,32 +0,0 @@
> -package org.apache.tapestry5.ioc.services.metrics;
> -
> -import java.util.List;
> -
> -/**
> - * Central hub for creating or obtaining {@link Metric}s.
> - *
> - * @since 5.4
> - */
> -public interface MetricCollector
> -{
> - /**
> - * Creates a root metric, or returns an existing one.
> - *
> - * @param name
> - * name of the metric to create
> - * @param type
> - * used when creating the metric
> - * @param units
> - * used when creating the metric
> - * @return the metric
> - * @throws IllegalMonitorStateException
> - * if an existing root metric with that name is present, but does
> - * not have the matching type and units.
> - */
> - Metric createRootMetric(String name, Metric.Type type, Metric.Units units);
> -
> - /**
> - * Returns root metrics, sorted by name.
> - */
> - List<Metric> getRootMetrics();
> -}
>
> http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/4fda4c80/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/metrics/MetricsSymbols.java
> ----------------------------------------------------------------------
> diff --git a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/metrics/MetricsSymbols.java b/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/metrics/MetricsSymbols.java
> deleted file mode 100644
> index 39c9bb1..0000000
> --- a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/metrics/MetricsSymbols.java
> +++ /dev/null
> @@ -1,10 +0,0 @@
> -package org.apache.tapestry5.ioc.services.metrics;
> -
> -public class MetricsSymbols
> -{
> - /**
> - * The directory in which RRDb database files are stored. If blank (the default),
> - * then RRD is set up for in-memory databases only (re-created on each launch of the application).
> - */
> - public static final String RRD_DB_DIR = "tapestry.rrd-dir";
> -}
>
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tapestry.apache.org
For additional commands, e-mail: dev-help@tapestry.apache.org