Return-Path: Delivered-To: apmail-hadoop-common-commits-archive@www.apache.org Received: (qmail 93370 invoked from network); 15 Mar 2011 16:27:48 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.3) by minotaur.apache.org with SMTP; 15 Mar 2011 16:27:48 -0000 Received: (qmail 45505 invoked by uid 500); 15 Mar 2011 16:27:48 -0000 Delivered-To: apmail-hadoop-common-commits-archive@hadoop.apache.org Received: (qmail 45480 invoked by uid 500); 15 Mar 2011 16:27:48 -0000 Mailing-List: contact common-commits-help@hadoop.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: common-dev@hadoop.apache.org Delivered-To: mailing list common-commits@hadoop.apache.org Received: (qmail 45383 invoked by uid 99); 15 Mar 2011 16:27:48 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 15 Mar 2011 16:27:48 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 15 Mar 2011 16:27:43 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id DA41C238896F; Tue, 15 Mar 2011 16:27:20 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1081840 [2/3] - in /hadoop/common/branches/branch-0.20-security-203: ./ src/core/org/apache/hadoop/classification/ src/core/org/apache/hadoop/log/ src/core/org/apache/hadoop/log/metrics/ src/core/org/apache/hadoop/metrics/ src/core/org/apa... Date: Tue, 15 Mar 2011 16:27:20 -0000 To: common-commits@hadoop.apache.org From: omalley@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20110315162720.DA41C238896F@eris.apache.org> Added: hadoop/common/branches/branch-0.20-security-203/src/core/org/apache/hadoop/metrics/jvm/JvmMetrics.java URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.20-security-203/src/core/org/apache/hadoop/metrics/jvm/JvmMetrics.java?rev=1081840&view=auto ============================================================================== --- hadoop/common/branches/branch-0.20-security-203/src/core/org/apache/hadoop/metrics/jvm/JvmMetrics.java (added) +++ hadoop/common/branches/branch-0.20-security-203/src/core/org/apache/hadoop/metrics/jvm/JvmMetrics.java Tue Mar 15 16:27:19 2011 @@ -0,0 +1,201 @@ +/** + * 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.hadoop.metrics.jvm; + +import java.lang.management.ManagementFactory; +import java.lang.management.MemoryMXBean; +import java.lang.management.MemoryUsage; +import java.lang.management.ThreadInfo; +import java.lang.management.ThreadMXBean; + +import org.apache.hadoop.classification.InterfaceAudience; +import org.apache.hadoop.classification.InterfaceStability; +import org.apache.hadoop.metrics.MetricsContext; +import org.apache.hadoop.metrics.MetricsRecord; +import org.apache.hadoop.metrics.MetricsUtil; +import org.apache.hadoop.metrics.Updater; + +import static java.lang.Thread.State.*; +import java.lang.management.GarbageCollectorMXBean; +import java.util.List; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +/** + * Singleton class which reports Java Virtual Machine metrics to the metrics API. + * Any application can create an instance of this class in order to emit + * Java VM metrics. + * @deprecated in favor of org.apache.hadoop.metrics2 usage. + */ +@Deprecated +@InterfaceAudience.Private +@InterfaceStability.Evolving +public class JvmMetrics implements Updater { + + private static final float M = 1024*1024; + private static JvmMetrics theInstance = null; + private static Log log = LogFactory.getLog(JvmMetrics.class); + + private MetricsRecord metrics; + + // garbage collection counters + private long gcCount = 0; + private long gcTimeMillis = 0; + + // logging event counters + private long fatalCount = 0; + private long errorCount = 0; + private long warnCount = 0; + private long infoCount = 0; + + public synchronized static JvmMetrics init(String processName, String sessionId) { + return init(processName, sessionId, "metrics"); + } + + public synchronized static JvmMetrics init(String processName, String sessionId, + String recordName) { + if (theInstance != null) { + log.info("Cannot initialize JVM Metrics with processName=" + + processName + ", sessionId=" + sessionId + + " - already initialized"); + } + else { + log.info("Initializing JVM Metrics with processName=" + + processName + ", sessionId=" + sessionId); + theInstance = new JvmMetrics(processName, sessionId, recordName); + } + return theInstance; + } + + /** Creates a new instance of JvmMetrics */ + private JvmMetrics(String processName, String sessionId, + String recordName) { + MetricsContext context = MetricsUtil.getContext("jvm"); + metrics = MetricsUtil.createRecord(context, recordName); + metrics.setTag("processName", processName); + metrics.setTag("sessionId", sessionId); + context.registerUpdater(this); + } + + /** + * This will be called periodically (with the period being configuration + * dependent). + */ + public void doUpdates(MetricsContext context) { + doMemoryUpdates(); + doGarbageCollectionUpdates(); + doThreadUpdates(); + doEventCountUpdates(); + metrics.update(); + } + + private void doMemoryUpdates() { + MemoryMXBean memoryMXBean = + ManagementFactory.getMemoryMXBean(); + MemoryUsage memNonHeap = + memoryMXBean.getNonHeapMemoryUsage(); + MemoryUsage memHeap = + memoryMXBean.getHeapMemoryUsage(); + Runtime runtime = Runtime.getRuntime(); + + metrics.setMetric("memNonHeapUsedM", memNonHeap.getUsed()/M); + metrics.setMetric("memNonHeapCommittedM", memNonHeap.getCommitted()/M); + metrics.setMetric("memHeapUsedM", memHeap.getUsed()/M); + metrics.setMetric("memHeapCommittedM", memHeap.getCommitted()/M); + metrics.setMetric("maxMemoryM", runtime.maxMemory()/M); + } + + private void doGarbageCollectionUpdates() { + List gcBeans = + ManagementFactory.getGarbageCollectorMXBeans(); + long count = 0; + long timeMillis = 0; + for (GarbageCollectorMXBean gcBean : gcBeans) { + count += gcBean.getCollectionCount(); + timeMillis += gcBean.getCollectionTime(); + } + metrics.incrMetric("gcCount", (int)(count - gcCount)); + metrics.incrMetric("gcTimeMillis", (int)(timeMillis - gcTimeMillis)); + + gcCount = count; + gcTimeMillis = timeMillis; + } + + private void doThreadUpdates() { + ThreadMXBean threadMXBean = + ManagementFactory.getThreadMXBean(); + long threadIds[] = + threadMXBean.getAllThreadIds(); + ThreadInfo[] threadInfos = + threadMXBean.getThreadInfo(threadIds, 0); + + int threadsNew = 0; + int threadsRunnable = 0; + int threadsBlocked = 0; + int threadsWaiting = 0; + int threadsTimedWaiting = 0; + int threadsTerminated = 0; + + for (ThreadInfo threadInfo : threadInfos) { + // threadInfo is null if the thread is not alive or doesn't exist + if (threadInfo == null) continue; + Thread.State state = threadInfo.getThreadState(); + if (state == NEW) { + threadsNew++; + } + else if (state == RUNNABLE) { + threadsRunnable++; + } + else if (state == BLOCKED) { + threadsBlocked++; + } + else if (state == WAITING) { + threadsWaiting++; + } + else if (state == TIMED_WAITING) { + threadsTimedWaiting++; + } + else if (state == TERMINATED) { + threadsTerminated++; + } + } + metrics.setMetric("threadsNew", threadsNew); + metrics.setMetric("threadsRunnable", threadsRunnable); + metrics.setMetric("threadsBlocked", threadsBlocked); + metrics.setMetric("threadsWaiting", threadsWaiting); + metrics.setMetric("threadsTimedWaiting", threadsTimedWaiting); + metrics.setMetric("threadsTerminated", threadsTerminated); + } + + private void doEventCountUpdates() { + long newFatal = EventCounter.getFatal(); + long newError = EventCounter.getError(); + long newWarn = EventCounter.getWarn(); + long newInfo = EventCounter.getInfo(); + + metrics.incrMetric("logFatal", (int)(newFatal - fatalCount)); + metrics.incrMetric("logError", (int)(newError - errorCount)); + metrics.incrMetric("logWarn", (int)(newWarn - warnCount)); + metrics.incrMetric("logInfo", (int)(newInfo - infoCount)); + + fatalCount = newFatal; + errorCount = newError; + warnCount = newWarn; + infoCount = newInfo; + } +} Added: hadoop/common/branches/branch-0.20-security-203/src/core/org/apache/hadoop/metrics/package.html URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.20-security-203/src/core/org/apache/hadoop/metrics/package.html?rev=1081840&view=auto ============================================================================== --- hadoop/common/branches/branch-0.20-security-203/src/core/org/apache/hadoop/metrics/package.html (added) +++ hadoop/common/branches/branch-0.20-security-203/src/core/org/apache/hadoop/metrics/package.html Tue Mar 15 16:27:19 2011 @@ -0,0 +1,160 @@ + + + + + + org.apache.hadoop.metrics + + +

Note, this package is deprecated in favor of + org.apache.hadoop.metrics2 usage.

+

This package defines an API for reporting performance metric information.

+

The API is abstract so that it can be implemented on top of +a variety of metrics client libraries. The choice of +client library is a configuration option, and different +modules within the same application can use +different metrics implementation libraries.

+

+Sub-packages: +

+
org.apache.hadoop.metrics.spi
+
The abstract Server Provider Interface package. Those wishing to + integrate the metrics API with a particular metrics client library should + extend this package.
+ +
org.apache.hadoop.metrics.file
+
An implementation package which writes the metric data to + a file, or sends it to the standard output stream.
+ +
org.apache.hadoop.metrics.ganglia
+
An implementation package which sends metric data to + Ganglia.
+
+ +

Introduction to the Metrics API

+ +Here is a simple example of how to use this package to report a single +metric value: +
+    private ContextFactory contextFactory = ContextFactory.getFactory();
+    
+    void reportMyMetric(float myMetric) {
+        MetricsContext myContext = contextFactory.getContext("myContext");
+        MetricsRecord myRecord = myContext.getRecord("myRecord");
+        myRecord.setMetric("myMetric", myMetric);
+        myRecord.update();
+    }
+
+ +In this example there are three names: +
+
myContext
+
The context name will typically identify either the application, or else a + module within an application or library.
+ +
myRecord
+
The record name generally identifies some entity for which a set of + metrics are to be reported. For example, you could have a record named + "cacheStats" for reporting a number of statistics relating to the usage of + some cache in your application.
+ +
myMetric
+
This identifies a particular metric. For example, you might have metrics + named "cache_hits" and "cache_misses". +
+
+ +

Tags

+ +In some cases it is useful to have multiple records with the same name. For +example, suppose that you want to report statistics about each disk on a computer. +In this case, the record name would be something like "diskStats", but you also +need to identify the disk which is done by adding a tag to the record. +The code could look something like this: +
+    private MetricsRecord diskStats =
+            contextFactory.getContext("myContext").getRecord("diskStats");
+            
+    void reportDiskMetrics(String diskName, float diskBusy, float diskUsed) {
+        diskStats.setTag("diskName", diskName);
+        diskStats.setMetric("diskBusy", diskBusy);
+        diskStats.setMetric("diskUsed", diskUsed);
+        diskStats.update();
+    }
+
+ +

Buffering and Callbacks

+ +Data is not sent immediately to the metrics system when +MetricsRecord.update() is called. Instead it is stored in an +internal table, and the contents of the table are sent periodically. +This can be important for two reasons: +
    +
  1. It means that a programmer is free to put calls to this API in an + inner loop, since updates can be very frequent without slowing down + the application significantly.
  2. +
  3. Some implementations can gain efficiency by combining many metrics + into a single UDP message.
  4. +
+ +The API provides a timer-based callback via the +registerUpdater() method. The benefit of this +versus using java.util.Timer is that the callbacks will be done +immediately before sending the data, making the data as current as possible. + +

Configuration

+ +It is possible to programmatically examine and modify configuration data +before creating a context, like this: +
+    ContextFactory factory = ContextFactory.getFactory();
+    ... examine and/or modify factory attributes ...
+    MetricsContext context = factory.getContext("myContext");
+
+The factory attributes can be examined and modified using the following +ContextFactorymethods: +
    +
  • Object getAttribute(String attributeName)
  • +
  • String[] getAttributeNames()
  • +
  • void setAttribute(String name, Object value)
  • +
  • void removeAttribute(attributeName)
  • +
+ +

+ContextFactory.getFactory() initializes the factory attributes by +reading the properties file hadoop-metrics.properties if it exists +on the class path. + +

+A factory attribute named: +

+contextName.class
+
+should have as its value the fully qualified name of the class to be +instantiated by a call of the CodeFactory method +getContext(contextName). If this factory attribute is not +specified, the default is to instantiate +org.apache.hadoop.metrics.file.FileContext. + +

+Other factory attributes are specific to a particular implementation of this +API and are documented elsewhere. For example, configuration attributes for +the file and Ganglia implementations can be found in the javadoc for +their respective packages. + + Added: hadoop/common/branches/branch-0.20-security-203/src/core/org/apache/hadoop/metrics/spi/AbstractMetricsContext.java URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.20-security-203/src/core/org/apache/hadoop/metrics/spi/AbstractMetricsContext.java?rev=1081840&view=auto ============================================================================== --- hadoop/common/branches/branch-0.20-security-203/src/core/org/apache/hadoop/metrics/spi/AbstractMetricsContext.java (added) +++ hadoop/common/branches/branch-0.20-security-203/src/core/org/apache/hadoop/metrics/spi/AbstractMetricsContext.java Tue Mar 15 16:27:19 2011 @@ -0,0 +1,483 @@ +/* + * AbstractMetricsContext.java + * + * 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.hadoop.metrics.spi; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.Timer; +import java.util.TimerTask; +import java.util.TreeMap; +import java.util.Map.Entry; + +import org.apache.hadoop.classification.InterfaceAudience; +import org.apache.hadoop.classification.InterfaceStability; +import org.apache.hadoop.metrics.ContextFactory; +import org.apache.hadoop.metrics.MetricsContext; +import org.apache.hadoop.metrics.MetricsException; +import org.apache.hadoop.metrics.MetricsRecord; +import org.apache.hadoop.metrics.Updater; + +/** + * The main class of the Service Provider Interface. This class should be + * extended in order to integrate the Metrics API with a specific metrics + * client library.

+ * + * This class implements the internal table of metric data, and the timer + * on which data is to be sent to the metrics system. Subclasses must + * override the abstract emitRecord method in order to transmit + * the data.

+ * @deprecated in favor of org.apache.hadoop.metrics2 usage. + */ +@Deprecated +@InterfaceAudience.Public +@InterfaceStability.Evolving +public abstract class AbstractMetricsContext implements MetricsContext { + + private int period = MetricsContext.DEFAULT_PERIOD; + private Timer timer = null; + + private Set updaters = new HashSet(1); + private volatile boolean isMonitoring = false; + + private ContextFactory factory = null; + private String contextName = null; + + @InterfaceAudience.Private + public static class TagMap extends TreeMap { + private static final long serialVersionUID = 3546309335061952993L; + TagMap() { + super(); + } + TagMap(TagMap orig) { + super(orig); + } + /** + * Returns true if this tagmap contains every tag in other. + */ + public boolean containsAll(TagMap other) { + for (Map.Entry entry : other.entrySet()) { + Object value = get(entry.getKey()); + if (value == null || !value.equals(entry.getValue())) { + // either key does not exist here, or the value is different + return false; + } + } + return true; + } + } + + @InterfaceAudience.Private + public static class MetricMap extends TreeMap { + private static final long serialVersionUID = -7495051861141631609L; + MetricMap() { + super(); + } + MetricMap(MetricMap orig) { + super(orig); + } + } + + static class RecordMap extends HashMap { + private static final long serialVersionUID = 259835619700264611L; + } + + private Map bufferedData = new HashMap(); + + + /** + * Creates a new instance of AbstractMetricsContext + */ + protected AbstractMetricsContext() { + } + + /** + * Initializes the context. + */ + public void init(String contextName, ContextFactory factory) + { + this.contextName = contextName; + this.factory = factory; + } + + /** + * Convenience method for subclasses to access factory attributes. + */ + protected String getAttribute(String attributeName) { + String factoryAttribute = contextName + "." + attributeName; + return (String) factory.getAttribute(factoryAttribute); + } + + /** + * Returns an attribute-value map derived from the factory attributes + * by finding all factory attributes that begin with + * contextName.tableName. The returned map consists of + * those attributes with the contextName and tableName stripped off. + */ + protected Map getAttributeTable(String tableName) { + String prefix = contextName + "." + tableName + "."; + Map result = new HashMap(); + for (String attributeName : factory.getAttributeNames()) { + if (attributeName.startsWith(prefix)) { + String name = attributeName.substring(prefix.length()); + String value = (String) factory.getAttribute(attributeName); + result.put(name, value); + } + } + return result; + } + + /** + * Returns the context name. + */ + public String getContextName() { + return contextName; + } + + /** + * Returns the factory by which this context was created. + */ + public ContextFactory getContextFactory() { + return factory; + } + + /** + * Starts or restarts monitoring, the emitting of metrics records. + */ + public synchronized void startMonitoring() + throws IOException { + if (!isMonitoring) { + startTimer(); + isMonitoring = true; + } + } + + /** + * Stops monitoring. This does not free buffered data. + * @see #close() + */ + public synchronized void stopMonitoring() { + if (isMonitoring) { + stopTimer(); + isMonitoring = false; + } + } + + /** + * Returns true if monitoring is currently in progress. + */ + public boolean isMonitoring() { + return isMonitoring; + } + + /** + * Stops monitoring and frees buffered data, returning this + * object to its initial state. + */ + public synchronized void close() { + stopMonitoring(); + clearUpdaters(); + } + + /** + * Creates a new AbstractMetricsRecord instance with the given recordName. + * Throws an exception if the metrics implementation is configured with a fixed + * set of record names and recordName is not in that set. + * + * @param recordName the name of the record + * @throws MetricsException if recordName conflicts with configuration data + */ + public final synchronized MetricsRecord createRecord(String recordName) { + if (bufferedData.get(recordName) == null) { + bufferedData.put(recordName, new RecordMap()); + } + return newRecord(recordName); + } + + /** + * Subclasses should override this if they subclass MetricsRecordImpl. + * @param recordName the name of the record + * @return newly created instance of MetricsRecordImpl or subclass + */ + protected MetricsRecord newRecord(String recordName) { + return new MetricsRecordImpl(recordName, this); + } + + /** + * Registers a callback to be called at time intervals determined by + * the configuration. + * + * @param updater object to be run periodically; it should update + * some metrics records + */ + public synchronized void registerUpdater(final Updater updater) { + if (!updaters.contains(updater)) { + updaters.add(updater); + } + } + + /** + * Removes a callback, if it exists. + * + * @param updater object to be removed from the callback list + */ + public synchronized void unregisterUpdater(Updater updater) { + updaters.remove(updater); + } + + private synchronized void clearUpdaters() { + updaters.clear(); + } + + /** + * Starts timer if it is not already started + */ + private synchronized void startTimer() { + if (timer == null) { + timer = new Timer("Timer thread for monitoring " + getContextName(), + true); + TimerTask task = new TimerTask() { + public void run() { + try { + timerEvent(); + } + catch (IOException ioe) { + ioe.printStackTrace(); + } + } + }; + long millis = period * 1000; + timer.scheduleAtFixedRate(task, millis, millis); + } + } + + /** + * Stops timer if it is running + */ + private synchronized void stopTimer() { + if (timer != null) { + timer.cancel(); + timer = null; + } + } + + /** + * Timer callback. + */ + private void timerEvent() throws IOException { + if (isMonitoring) { + Collection myUpdaters; + synchronized (this) { + myUpdaters = new ArrayList(updaters); + } + // Run all the registered updates without holding a lock + // on this context + for (Updater updater : myUpdaters) { + try { + updater.doUpdates(this); + } + catch (Throwable throwable) { + throwable.printStackTrace(); + } + } + emitRecords(); + } + } + + /** + * Emits the records. + */ + private synchronized void emitRecords() throws IOException { + for (String recordName : bufferedData.keySet()) { + RecordMap recordMap = bufferedData.get(recordName); + synchronized (recordMap) { + Set> entrySet = recordMap.entrySet (); + for (Entry entry : entrySet) { + OutputRecord outRec = new OutputRecord(entry.getKey(), entry.getValue()); + emitRecord(contextName, recordName, outRec); + } + } + } + flush(); + } + + /** + * Retrieves all the records managed by this MetricsContext. + * Useful for monitoring systems that are polling-based. + * @return A non-null collection of all monitoring records. + */ + public synchronized Map> getAllRecords() { + Map> out = new TreeMap>(); + for (String recordName : bufferedData.keySet()) { + RecordMap recordMap = bufferedData.get(recordName); + synchronized (recordMap) { + List records = new ArrayList(); + Set> entrySet = recordMap.entrySet(); + for (Entry entry : entrySet) { + OutputRecord outRec = new OutputRecord(entry.getKey(), entry.getValue()); + records.add(outRec); + } + out.put(recordName, records); + } + } + return out; + } + + /** + * Sends a record to the metrics system. + */ + protected abstract void emitRecord(String contextName, String recordName, + OutputRecord outRec) throws IOException; + + /** + * Called each period after all records have been emitted, this method does nothing. + * Subclasses may override it in order to perform some kind of flush. + */ + protected void flush() throws IOException { + } + + /** + * Called by MetricsRecordImpl.update(). Creates or updates a row in + * the internal table of metric data. + */ + protected void update(MetricsRecordImpl record) { + String recordName = record.getRecordName(); + TagMap tagTable = record.getTagTable(); + Map metricUpdates = record.getMetricTable(); + + RecordMap recordMap = getRecordMap(recordName); + synchronized (recordMap) { + MetricMap metricMap = recordMap.get(tagTable); + if (metricMap == null) { + metricMap = new MetricMap(); + TagMap tagMap = new TagMap(tagTable); // clone tags + recordMap.put(tagMap, metricMap); + } + + Set> entrySet = metricUpdates.entrySet(); + for (Entry entry : entrySet) { + String metricName = entry.getKey (); + MetricValue updateValue = entry.getValue (); + Number updateNumber = updateValue.getNumber(); + Number currentNumber = metricMap.get(metricName); + if (currentNumber == null || updateValue.isAbsolute()) { + metricMap.put(metricName, updateNumber); + } + else { + Number newNumber = sum(updateNumber, currentNumber); + metricMap.put(metricName, newNumber); + } + } + } + } + + private synchronized RecordMap getRecordMap(String recordName) { + return bufferedData.get(recordName); + } + + /** + * Adds two numbers, coercing the second to the type of the first. + * + */ + private Number sum(Number a, Number b) { + if (a instanceof Integer) { + return Integer.valueOf(a.intValue() + b.intValue()); + } + else if (a instanceof Float) { + return new Float(a.floatValue() + b.floatValue()); + } + else if (a instanceof Short) { + return Short.valueOf((short)(a.shortValue() + b.shortValue())); + } + else if (a instanceof Byte) { + return Byte.valueOf((byte)(a.byteValue() + b.byteValue())); + } + else if (a instanceof Long) { + return Long.valueOf((a.longValue() + b.longValue())); + } + else { + // should never happen + throw new MetricsException("Invalid number type"); + } + + } + + /** + * Called by MetricsRecordImpl.remove(). Removes all matching rows in + * the internal table of metric data. A row matches if it has the same + * tag names and values as record, but it may also have additional + * tags. + */ + protected void remove(MetricsRecordImpl record) { + String recordName = record.getRecordName(); + TagMap tagTable = record.getTagTable(); + + RecordMap recordMap = getRecordMap(recordName); + synchronized (recordMap) { + Iterator it = recordMap.keySet().iterator(); + while (it.hasNext()) { + TagMap rowTags = it.next(); + if (rowTags.containsAll(tagTable)) { + it.remove(); + } + } + } + } + + /** + * Returns the timer period. + */ + public int getPeriod() { + return period; + } + + /** + * Sets the timer period + */ + protected void setPeriod(int period) { + this.period = period; + } + + /** + * If a period is set in the attribute passed in, override + * the default with it. + */ + protected void parseAndSetPeriod(String attributeName) { + String periodStr = getAttribute(attributeName); + if (periodStr != null) { + int period = 0; + try { + period = Integer.parseInt(periodStr); + } catch (NumberFormatException nfe) { + } + if (period <= 0) { + throw new MetricsException("Invalid period: " + periodStr); + } + setPeriod(period); + } + } +} Added: hadoop/common/branches/branch-0.20-security-203/src/core/org/apache/hadoop/metrics/spi/CompositeContext.java URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.20-security-203/src/core/org/apache/hadoop/metrics/spi/CompositeContext.java?rev=1081840&view=auto ============================================================================== --- hadoop/common/branches/branch-0.20-security-203/src/core/org/apache/hadoop/metrics/spi/CompositeContext.java (added) +++ hadoop/common/branches/branch-0.20-security-203/src/core/org/apache/hadoop/metrics/spi/CompositeContext.java Tue Mar 15 16:27:19 2011 @@ -0,0 +1,205 @@ +/** + * 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.hadoop.metrics.spi; + +import java.io.IOException; +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import java.util.ArrayList; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.apache.hadoop.classification.InterfaceAudience; +import org.apache.hadoop.classification.InterfaceStability; +import org.apache.hadoop.metrics.ContextFactory; +import org.apache.hadoop.metrics.MetricsContext; +import org.apache.hadoop.metrics.MetricsException; +import org.apache.hadoop.metrics.MetricsRecord; +import org.apache.hadoop.metrics.MetricsUtil; +import org.apache.hadoop.metrics.Updater; + +/** + * @deprecated in favor of org.apache.hadoop.metrics2 usage. + */ +@Deprecated +@InterfaceAudience.Public +@InterfaceStability.Evolving +public class CompositeContext extends AbstractMetricsContext { + + private static final Log LOG = LogFactory.getLog(CompositeContext.class); + private static final String ARITY_LABEL = "arity"; + private static final String SUB_FMT = "%s.sub%d"; + private final ArrayList subctxt = + new ArrayList(); + + @InterfaceAudience.Private + public CompositeContext() { + } + + @InterfaceAudience.Private + public void init(String contextName, ContextFactory factory) { + super.init(contextName, factory); + int nKids; + try { + String sKids = getAttribute(ARITY_LABEL); + nKids = Integer.valueOf(sKids); + } catch (Exception e) { + LOG.error("Unable to initialize composite metric " + contextName + + ": could not init arity", e); + return; + } + for (int i = 0; i < nKids; ++i) { + MetricsContext ctxt = MetricsUtil.getContext( + String.format(SUB_FMT, contextName, i), contextName); + if (null != ctxt) { + subctxt.add(ctxt); + } + } + } + + @InterfaceAudience.Private + @Override + public MetricsRecord newRecord(String recordName) { + return (MetricsRecord) Proxy.newProxyInstance( + MetricsRecord.class.getClassLoader(), + new Class[] { MetricsRecord.class }, + new MetricsRecordDelegator(recordName, subctxt)); + } + + @InterfaceAudience.Private + @Override + protected void emitRecord(String contextName, String recordName, + OutputRecord outRec) throws IOException { + for (MetricsContext ctxt : subctxt) { + try { + ((AbstractMetricsContext)ctxt).emitRecord( + contextName, recordName, outRec); + if (contextName == null || recordName == null || outRec == null) { + throw new IOException(contextName + ":" + recordName + ":" + outRec); + } + } catch (IOException e) { + LOG.warn("emitRecord failed: " + ctxt.getContextName(), e); + } + } + } + + @InterfaceAudience.Private + @Override + protected void flush() throws IOException { + for (MetricsContext ctxt : subctxt) { + try { + ((AbstractMetricsContext)ctxt).flush(); + } catch (IOException e) { + LOG.warn("flush failed: " + ctxt.getContextName(), e); + } + } + } + + @InterfaceAudience.Private + @Override + public void startMonitoring() throws IOException { + for (MetricsContext ctxt : subctxt) { + try { + ctxt.startMonitoring(); + } catch (IOException e) { + LOG.warn("startMonitoring failed: " + ctxt.getContextName(), e); + } + } + } + + @InterfaceAudience.Private + @Override + public void stopMonitoring() { + for (MetricsContext ctxt : subctxt) { + ctxt.stopMonitoring(); + } + } + + /** + * Return true if all subcontexts are monitoring. + */ + @InterfaceAudience.Private + @Override + public boolean isMonitoring() { + boolean ret = true; + for (MetricsContext ctxt : subctxt) { + ret &= ctxt.isMonitoring(); + } + return ret; + } + + @InterfaceAudience.Private + @Override + public void close() { + for (MetricsContext ctxt : subctxt) { + ctxt.close(); + } + } + + @InterfaceAudience.Private + @Override + public void registerUpdater(Updater updater) { + for (MetricsContext ctxt : subctxt) { + ctxt.registerUpdater(updater); + } + } + + @InterfaceAudience.Private + @Override + public void unregisterUpdater(Updater updater) { + for (MetricsContext ctxt : subctxt) { + ctxt.unregisterUpdater(updater); + } + } + + private static class MetricsRecordDelegator implements InvocationHandler { + private static final Method m_getRecordName = initMethod(); + private static Method initMethod() { + try { + return MetricsRecord.class.getMethod("getRecordName", new Class[0]); + } catch (Exception e) { + throw new RuntimeException("Internal error", e); + } + } + + private final String recordName; + private final ArrayList subrecs; + + MetricsRecordDelegator(String recordName, ArrayList ctxts) { + this.recordName = recordName; + this.subrecs = new ArrayList(ctxts.size()); + for (MetricsContext ctxt : ctxts) { + subrecs.add(ctxt.createRecord(recordName)); + } + } + + public Object invoke(Object p, Method m, Object[] args) throws Throwable { + if (m_getRecordName.equals(m)) { + return recordName; + } + assert Void.TYPE.equals(m.getReturnType()); + for (MetricsRecord rec : subrecs) { + m.invoke(rec, args); + } + return null; + } + } + +} Added: hadoop/common/branches/branch-0.20-security-203/src/core/org/apache/hadoop/metrics/spi/MetricValue.java URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.20-security-203/src/core/org/apache/hadoop/metrics/spi/MetricValue.java?rev=1081840&view=auto ============================================================================== --- hadoop/common/branches/branch-0.20-security-203/src/core/org/apache/hadoop/metrics/spi/MetricValue.java (added) +++ hadoop/common/branches/branch-0.20-security-203/src/core/org/apache/hadoop/metrics/spi/MetricValue.java Tue Mar 15 16:27:19 2011 @@ -0,0 +1,59 @@ +/* + * MetricValue.java + * + * 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.hadoop.metrics.spi; + +import org.apache.hadoop.classification.InterfaceAudience; +import org.apache.hadoop.classification.InterfaceStability; + +/** + * A Number that is either an absolute or an incremental amount. + * @deprecated in favor of org.apache.hadoop.metrics2 usage. + */ +@Deprecated +@InterfaceAudience.Public +@InterfaceStability.Evolving +public class MetricValue { + + public static final boolean ABSOLUTE = false; + public static final boolean INCREMENT = true; + + private boolean isIncrement; + private Number number; + + /** Creates a new instance of MetricValue */ + public MetricValue(Number number, boolean isIncrement) { + this.number = number; + this.isIncrement = isIncrement; + } + + public boolean isIncrement() { + return isIncrement; + } + + public boolean isAbsolute() { + return !isIncrement; + } + + public Number getNumber() { + return number; + } + +} Added: hadoop/common/branches/branch-0.20-security-203/src/core/org/apache/hadoop/metrics/spi/MetricsRecordImpl.java URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.20-security-203/src/core/org/apache/hadoop/metrics/spi/MetricsRecordImpl.java?rev=1081840&view=auto ============================================================================== --- hadoop/common/branches/branch-0.20-security-203/src/core/org/apache/hadoop/metrics/spi/MetricsRecordImpl.java (added) +++ hadoop/common/branches/branch-0.20-security-203/src/core/org/apache/hadoop/metrics/spi/MetricsRecordImpl.java Tue Mar 15 16:27:19 2011 @@ -0,0 +1,283 @@ +/* + * MetricsRecordImpl.java + * + * 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.hadoop.metrics.spi; + +import java.util.LinkedHashMap; +import java.util.Map; + +import org.apache.hadoop.classification.InterfaceAudience; +import org.apache.hadoop.classification.InterfaceStability; +import org.apache.hadoop.metrics.MetricsException; +import org.apache.hadoop.metrics.MetricsRecord; +import org.apache.hadoop.metrics.spi.AbstractMetricsContext.TagMap; + +/** + * An implementation of MetricsRecord. Keeps a back-pointer to the context + * from which it was created, and delegates back to it on update + * and remove(). + * @deprecated in favor of org.apache.hadoop.metrics2 usage. + */ +@Deprecated +@InterfaceAudience.Public +@InterfaceStability.Evolving +public class MetricsRecordImpl implements MetricsRecord { + + private TagMap tagTable = new TagMap(); + private Map metricTable = new LinkedHashMap(); + + private String recordName; + private AbstractMetricsContext context; + + + /** Creates a new instance of FileRecord */ + protected MetricsRecordImpl(String recordName, AbstractMetricsContext context) + { + this.recordName = recordName; + this.context = context; + } + + /** + * Returns the record name. + * + * @return the record name + */ + public String getRecordName() { + return recordName; + } + + /** + * Sets the named tag to the specified value. + * + * @param tagName name of the tag + * @param tagValue new value of the tag + * @throws MetricsException if the tagName conflicts with the configuration + */ + public void setTag(String tagName, String tagValue) { + if (tagValue == null) { + tagValue = ""; + } + tagTable.put(tagName, tagValue); + } + + /** + * Sets the named tag to the specified value. + * + * @param tagName name of the tag + * @param tagValue new value of the tag + * @throws MetricsException if the tagName conflicts with the configuration + */ + public void setTag(String tagName, int tagValue) { + tagTable.put(tagName, Integer.valueOf(tagValue)); + } + + /** + * Sets the named tag to the specified value. + * + * @param tagName name of the tag + * @param tagValue new value of the tag + * @throws MetricsException if the tagName conflicts with the configuration + */ + public void setTag(String tagName, long tagValue) { + tagTable.put(tagName, Long.valueOf(tagValue)); + } + + /** + * Sets the named tag to the specified value. + * + * @param tagName name of the tag + * @param tagValue new value of the tag + * @throws MetricsException if the tagName conflicts with the configuration + */ + public void setTag(String tagName, short tagValue) { + tagTable.put(tagName, Short.valueOf(tagValue)); + } + + /** + * Sets the named tag to the specified value. + * + * @param tagName name of the tag + * @param tagValue new value of the tag + * @throws MetricsException if the tagName conflicts with the configuration + */ + public void setTag(String tagName, byte tagValue) { + tagTable.put(tagName, Byte.valueOf(tagValue)); + } + + /** + * Removes any tag of the specified name. + */ + public void removeTag(String tagName) { + tagTable.remove(tagName); + } + + /** + * Sets the named metric to the specified value. + * + * @param metricName name of the metric + * @param metricValue new value of the metric + * @throws MetricsException if the metricName or the type of the metricValue + * conflicts with the configuration + */ + public void setMetric(String metricName, int metricValue) { + setAbsolute(metricName, Integer.valueOf(metricValue)); + } + + /** + * Sets the named metric to the specified value. + * + * @param metricName name of the metric + * @param metricValue new value of the metric + * @throws MetricsException if the metricName or the type of the metricValue + * conflicts with the configuration + */ + public void setMetric(String metricName, long metricValue) { + setAbsolute(metricName, Long.valueOf(metricValue)); + } + + /** + * Sets the named metric to the specified value. + * + * @param metricName name of the metric + * @param metricValue new value of the metric + * @throws MetricsException if the metricName or the type of the metricValue + * conflicts with the configuration + */ + public void setMetric(String metricName, short metricValue) { + setAbsolute(metricName, Short.valueOf(metricValue)); + } + + /** + * Sets the named metric to the specified value. + * + * @param metricName name of the metric + * @param metricValue new value of the metric + * @throws MetricsException if the metricName or the type of the metricValue + * conflicts with the configuration + */ + public void setMetric(String metricName, byte metricValue) { + setAbsolute(metricName, Byte.valueOf(metricValue)); + } + + /** + * Sets the named metric to the specified value. + * + * @param metricName name of the metric + * @param metricValue new value of the metric + * @throws MetricsException if the metricName or the type of the metricValue + * conflicts with the configuration + */ + public void setMetric(String metricName, float metricValue) { + setAbsolute(metricName, new Float(metricValue)); + } + + /** + * Increments the named metric by the specified value. + * + * @param metricName name of the metric + * @param metricValue incremental value + * @throws MetricsException if the metricName or the type of the metricValue + * conflicts with the configuration + */ + public void incrMetric(String metricName, int metricValue) { + setIncrement(metricName, Integer.valueOf(metricValue)); + } + + /** + * Increments the named metric by the specified value. + * + * @param metricName name of the metric + * @param metricValue incremental value + * @throws MetricsException if the metricName or the type of the metricValue + * conflicts with the configuration + */ + public void incrMetric(String metricName, long metricValue) { + setIncrement(metricName, Long.valueOf(metricValue)); + } + + /** + * Increments the named metric by the specified value. + * + * @param metricName name of the metric + * @param metricValue incremental value + * @throws MetricsException if the metricName or the type of the metricValue + * conflicts with the configuration + */ + public void incrMetric(String metricName, short metricValue) { + setIncrement(metricName, Short.valueOf(metricValue)); + } + + /** + * Increments the named metric by the specified value. + * + * @param metricName name of the metric + * @param metricValue incremental value + * @throws MetricsException if the metricName or the type of the metricValue + * conflicts with the configuration + */ + public void incrMetric(String metricName, byte metricValue) { + setIncrement(metricName, Byte.valueOf(metricValue)); + } + + /** + * Increments the named metric by the specified value. + * + * @param metricName name of the metric + * @param metricValue incremental value + * @throws MetricsException if the metricName or the type of the metricValue + * conflicts with the configuration + */ + public void incrMetric(String metricName, float metricValue) { + setIncrement(metricName, new Float(metricValue)); + } + + private void setAbsolute(String metricName, Number metricValue) { + metricTable.put(metricName, new MetricValue(metricValue, MetricValue.ABSOLUTE)); + } + + private void setIncrement(String metricName, Number metricValue) { + metricTable.put(metricName, new MetricValue(metricValue, MetricValue.INCREMENT)); + } + + /** + * Updates the table of buffered data which is to be sent periodically. + * If the tag values match an existing row, that row is updated; + * otherwise, a new row is added. + */ + public void update() { + context.update(this); + } + + /** + * Removes the row, if it exists, in the buffered data table having tags + * that equal the tags that have been set on this record. + */ + public void remove() { + context.remove(this); + } + + TagMap getTagTable() { + return tagTable; + } + + Map getMetricTable() { + return metricTable; + } +} Added: hadoop/common/branches/branch-0.20-security-203/src/core/org/apache/hadoop/metrics/spi/NoEmitMetricsContext.java URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.20-security-203/src/core/org/apache/hadoop/metrics/spi/NoEmitMetricsContext.java?rev=1081840&view=auto ============================================================================== --- hadoop/common/branches/branch-0.20-security-203/src/core/org/apache/hadoop/metrics/spi/NoEmitMetricsContext.java (added) +++ hadoop/common/branches/branch-0.20-security-203/src/core/org/apache/hadoop/metrics/spi/NoEmitMetricsContext.java Tue Mar 15 16:27:19 2011 @@ -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.hadoop.metrics.spi; + +import org.apache.hadoop.classification.InterfaceAudience; +import org.apache.hadoop.classification.InterfaceStability; +import org.apache.hadoop.metrics.ContextFactory; +import org.apache.hadoop.metrics.MetricsServlet; + +/** + * A MetricsContext that does not emit data, but, unlike NullContextWithUpdate, + * does save it for retrieval with getAllRecords(). + * + * This is useful if you want to support {@link MetricsServlet}, but + * not emit metrics in any other way. + * @deprecated in favor of org.apache.hadoop.metrics2 usage. + */ +@Deprecated +@InterfaceAudience.Public +@InterfaceStability.Evolving +public class NoEmitMetricsContext extends AbstractMetricsContext { + + private static final String PERIOD_PROPERTY = "period"; + + /** Creates a new instance of NullContextWithUpdateThread */ + @InterfaceAudience.Private + public NoEmitMetricsContext() { + } + + @InterfaceAudience.Private + public void init(String contextName, ContextFactory factory) { + super.init(contextName, factory); + parseAndSetPeriod(PERIOD_PROPERTY); + } + + /** + * Do-nothing version of emitRecord + */ + @InterfaceAudience.Private + protected void emitRecord(String contextName, String recordName, + OutputRecord outRec) { + } +} Added: hadoop/common/branches/branch-0.20-security-203/src/core/org/apache/hadoop/metrics/spi/NullContext.java URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.20-security-203/src/core/org/apache/hadoop/metrics/spi/NullContext.java?rev=1081840&view=auto ============================================================================== --- hadoop/common/branches/branch-0.20-security-203/src/core/org/apache/hadoop/metrics/spi/NullContext.java (added) +++ hadoop/common/branches/branch-0.20-security-203/src/core/org/apache/hadoop/metrics/spi/NullContext.java Tue Mar 15 16:27:19 2011 @@ -0,0 +1,70 @@ +/* + * NullContext.java + * 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.hadoop.metrics.spi; + +import org.apache.hadoop.classification.InterfaceAudience; +import org.apache.hadoop.classification.InterfaceStability; + +/** + * Null metrics context: a metrics context which does nothing. Used as the + * default context, so that no performance data is emitted if no configuration + * data is found. + * + * @deprecated in favor of org.apache.hadoop.metrics2 usage. + */ +@Deprecated +@InterfaceAudience.Public +@InterfaceStability.Evolving +public class NullContext extends AbstractMetricsContext { + + /** Creates a new instance of NullContext */ + @InterfaceAudience.Private + public NullContext() { + } + + /** + * Do-nothing version of startMonitoring + */ + @InterfaceAudience.Private + public void startMonitoring() { + } + + /** + * Do-nothing version of emitRecord + */ + @InterfaceAudience.Private + protected void emitRecord(String contextName, String recordName, + OutputRecord outRec) + {} + + /** + * Do-nothing version of update + */ + @InterfaceAudience.Private + protected void update(MetricsRecordImpl record) { + } + + /** + * Do-nothing version of remove + */ + @InterfaceAudience.Private + protected void remove(MetricsRecordImpl record) { + } +} Added: hadoop/common/branches/branch-0.20-security-203/src/core/org/apache/hadoop/metrics/spi/NullContextWithUpdateThread.java URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.20-security-203/src/core/org/apache/hadoop/metrics/spi/NullContextWithUpdateThread.java?rev=1081840&view=auto ============================================================================== --- hadoop/common/branches/branch-0.20-security-203/src/core/org/apache/hadoop/metrics/spi/NullContextWithUpdateThread.java (added) +++ hadoop/common/branches/branch-0.20-security-203/src/core/org/apache/hadoop/metrics/spi/NullContextWithUpdateThread.java Tue Mar 15 16:27:19 2011 @@ -0,0 +1,79 @@ +/* + * 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.hadoop.metrics.spi; + +import org.apache.hadoop.classification.InterfaceAudience; +import org.apache.hadoop.classification.InterfaceStability; +import org.apache.hadoop.metrics.ContextFactory; +import org.apache.hadoop.metrics.MetricsException; + +/** + * A null context which has a thread calling + * periodically when monitoring is started. This keeps the data sampled + * correctly. + * In all other respects, this is like the NULL context: No data is emitted. + * This is suitable for Monitoring systems like JMX which reads the metrics + * when someone reads the data from JMX. + * + * The default impl of start and stop monitoring: + * is the AbstractMetricsContext is good enough. + * + * @deprecated in favor of org.apache.hadoop.metrics2 usage. + */ +@Deprecated +@InterfaceAudience.Public +@InterfaceStability.Evolving +public class NullContextWithUpdateThread extends AbstractMetricsContext { + + private static final String PERIOD_PROPERTY = "period"; + + /** Creates a new instance of NullContextWithUpdateThread */ + @InterfaceAudience.Private + public NullContextWithUpdateThread() { + } + + @InterfaceAudience.Private + public void init(String contextName, ContextFactory factory) { + super.init(contextName, factory); + parseAndSetPeriod(PERIOD_PROPERTY); + } + + + /** + * Do-nothing version of emitRecord + */ + @InterfaceAudience.Private + protected void emitRecord(String contextName, String recordName, + OutputRecord outRec) + {} + + /** + * Do-nothing version of update + */ + @InterfaceAudience.Private + protected void update(MetricsRecordImpl record) { + } + + /** + * Do-nothing version of remove + */ + @InterfaceAudience.Private + protected void remove(MetricsRecordImpl record) { + } +} Added: hadoop/common/branches/branch-0.20-security-203/src/core/org/apache/hadoop/metrics/spi/OutputRecord.java URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.20-security-203/src/core/org/apache/hadoop/metrics/spi/OutputRecord.java?rev=1081840&view=auto ============================================================================== --- hadoop/common/branches/branch-0.20-security-203/src/core/org/apache/hadoop/metrics/spi/OutputRecord.java (added) +++ hadoop/common/branches/branch-0.20-security-203/src/core/org/apache/hadoop/metrics/spi/OutputRecord.java Tue Mar 15 16:27:19 2011 @@ -0,0 +1,96 @@ +/* + * OutputRecord.java + * + * 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.hadoop.metrics.spi; + +import java.util.Collections; +import java.util.Map; +import java.util.Set; +import java.util.TreeMap; +import java.util.Map.Entry; + +import org.apache.hadoop.classification.InterfaceAudience; +import org.apache.hadoop.classification.InterfaceStability; +import org.apache.hadoop.metrics.spi.AbstractMetricsContext.MetricMap; +import org.apache.hadoop.metrics.spi.AbstractMetricsContext.TagMap; + +/** + * Represents a record of metric data to be sent to a metrics system. + * @deprecated in favor of org.apache.hadoop.metrics2 usage. + */ +@Deprecated +@InterfaceAudience.Public +@InterfaceStability.Evolving +public class OutputRecord { + + private TagMap tagMap; + private MetricMap metricMap; + + /** Creates a new instance of OutputRecord */ + OutputRecord(TagMap tagMap, MetricMap metricMap) { + this.tagMap = tagMap; + this.metricMap = metricMap; + } + + /** + * Returns the set of tag names + */ + public Set getTagNames() { + return Collections.unmodifiableSet(tagMap.keySet()); + } + + /** + * Returns a tag object which is can be a String, Integer, Short or Byte. + * + * @return the tag value, or null if there is no such tag + */ + public Object getTag(String name) { + return tagMap.get(name); + } + + /** + * Returns the set of metric names. + */ + public Set getMetricNames() { + return Collections.unmodifiableSet(metricMap.keySet()); + } + + /** + * Returns the metric object which can be a Float, Integer, Short or Byte. + */ + public Number getMetric(String name) { + return metricMap.get(name); + } + + + /** + * Returns a copy of this record's tags. + */ + public TagMap getTagsCopy() { + return new TagMap(tagMap); + } + + /** + * Returns a copy of this record's metrics. + */ + public MetricMap getMetricsCopy() { + return new MetricMap(metricMap); + } +} Added: hadoop/common/branches/branch-0.20-security-203/src/core/org/apache/hadoop/metrics/spi/Util.java URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.20-security-203/src/core/org/apache/hadoop/metrics/spi/Util.java?rev=1081840&view=auto ============================================================================== --- hadoop/common/branches/branch-0.20-security-203/src/core/org/apache/hadoop/metrics/spi/Util.java (added) +++ hadoop/common/branches/branch-0.20-security-203/src/core/org/apache/hadoop/metrics/spi/Util.java Tue Mar 15 16:27:19 2011 @@ -0,0 +1,72 @@ +/* + * Util.java + * + * 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.hadoop.metrics.spi; + +import java.net.InetSocketAddress; +import java.net.SocketAddress; +import java.util.ArrayList; +import java.util.List; + +import org.apache.hadoop.classification.InterfaceAudience; +import org.apache.hadoop.classification.InterfaceStability; + +/** + * Static utility methods + */ +@InterfaceAudience.Public +@InterfaceStability.Evolving +public class Util { + + /** + * This class is not intended to be instantiated + */ + private Util() {} + + /** + * Parses a space and/or comma separated sequence of server specifications + * of the form hostname or hostname:port. If + * the specs string is null, defaults to localhost:defaultPort. + * + * @return a list of InetSocketAddress objects. + */ + public static List parse(String specs, int defaultPort) { + List result = new ArrayList(1); + if (specs == null) { + result.add(new InetSocketAddress("localhost", defaultPort)); + } + else { + String[] specStrings = specs.split("[ ,]+"); + for (String specString : specStrings) { + int colon = specString.indexOf(':'); + if (colon < 0 || colon == specString.length() - 1) { + result.add(new InetSocketAddress(specString, defaultPort)); + } else { + String hostname = specString.substring(0, colon); + int port = Integer.parseInt(specString.substring(colon+1)); + result.add(new InetSocketAddress(hostname, port)); + } + } + } + return result; + } + +} Added: hadoop/common/branches/branch-0.20-security-203/src/core/org/apache/hadoop/metrics/spi/package.html URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.20-security-203/src/core/org/apache/hadoop/metrics/spi/package.html?rev=1081840&view=auto ============================================================================== --- hadoop/common/branches/branch-0.20-security-203/src/core/org/apache/hadoop/metrics/spi/package.html (added) +++ hadoop/common/branches/branch-0.20-security-203/src/core/org/apache/hadoop/metrics/spi/package.html Tue Mar 15 16:27:19 2011 @@ -0,0 +1,38 @@ + + + + + + + org.apache.hadoop.metrics.spi + + +

Note, this package is deprecated in favor of + org.apache.hadoop.metrics2 usage.

+

The Service Provider Interface for the Metrics API. This package provides +an interface allowing a variety of metrics reporting implementations to be +plugged in to the Metrics API. Examples of such implementations can be found +in the packages org.apache.hadoop.metrics.file and +org.apache.hadoop.metrics.ganglia.

+ +

Plugging in an implementation involves writing a concrete subclass of +AbstractMetricsContext. The subclass should get its + configuration information using the getAttribute(attributeName) + method.

+ + Added: hadoop/common/branches/branch-0.20-security-203/src/core/org/apache/hadoop/metrics/util/MBeanUtil.java URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.20-security-203/src/core/org/apache/hadoop/metrics/util/MBeanUtil.java?rev=1081840&view=auto ============================================================================== --- hadoop/common/branches/branch-0.20-security-203/src/core/org/apache/hadoop/metrics/util/MBeanUtil.java (added) +++ hadoop/common/branches/branch-0.20-security-203/src/core/org/apache/hadoop/metrics/util/MBeanUtil.java Tue Mar 15 16:27:19 2011 @@ -0,0 +1,92 @@ +/** + * 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.hadoop.metrics.util; + +import java.lang.management.ManagementFactory; + +import javax.management.InstanceNotFoundException; +import javax.management.MBeanServer; +import javax.management.MalformedObjectNameException; +import javax.management.ObjectName; +import javax.management.InstanceAlreadyExistsException; + +import org.apache.hadoop.classification.InterfaceAudience; + + +/** + * This util class provides a method to register an MBean using + * our standard naming convention as described in the doc + * for {@link #registerMBean(String, String, Object)} + * + * @deprecated in favor of {@link org.apache.hadoop.metrics2.util.MBeans}. + */ +@Deprecated +@InterfaceAudience.LimitedPrivate({"HDFS", "MapReduce"}) +public class MBeanUtil { + + /** + * Register the MBean using our standard MBeanName format + * "hadoop:service=,name=" + * Where the and are the supplied parameters + * + * @param serviceName + * @param nameName + * @param theMbean - the MBean to register + * @return the named used to register the MBean + */ + static public ObjectName registerMBean(final String serviceName, + final String nameName, + final Object theMbean) { + final MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); + ObjectName name = getMBeanName(serviceName, nameName); + try { + mbs.registerMBean(theMbean, name); + return name; + } catch (InstanceAlreadyExistsException ie) { + // Ignore if instance already exists + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + static public void unregisterMBean(ObjectName mbeanName) { + final MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); + if (mbeanName == null) + return; + try { + mbs.unregisterMBean(mbeanName); + } catch (InstanceNotFoundException e ) { + // ignore + } catch (Exception e) { + e.printStackTrace(); + } + } + + static private ObjectName getMBeanName(final String serviceName, + final String nameName) { + ObjectName name = null; + try { + name = new ObjectName("hadoop:" + + "service=" + serviceName + ",name=" + nameName); + } catch (MalformedObjectNameException e) { + e.printStackTrace(); + } + return name; + } +} Added: hadoop/common/branches/branch-0.20-security-203/src/core/org/apache/hadoop/metrics/util/MetricsBase.java URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.20-security-203/src/core/org/apache/hadoop/metrics/util/MetricsBase.java?rev=1081840&view=auto ============================================================================== --- hadoop/common/branches/branch-0.20-security-203/src/core/org/apache/hadoop/metrics/util/MetricsBase.java (added) +++ hadoop/common/branches/branch-0.20-security-203/src/core/org/apache/hadoop/metrics/util/MetricsBase.java Tue Mar 15 16:27:19 2011 @@ -0,0 +1,51 @@ +/** + * 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.hadoop.metrics.util; + +import org.apache.hadoop.classification.InterfaceAudience; +import org.apache.hadoop.metrics.MetricsRecord; + +/** + * + * This is base class for all metrics + * + * @deprecated in favor of org.apache.hadoop.metrics2 usage. + */ +@Deprecated +@InterfaceAudience.Private +public abstract class MetricsBase { + public static final String NO_DESCRIPTION = "NoDescription"; + final private String name; + final private String description; + + protected MetricsBase(final String nam) { + name = nam; + description = NO_DESCRIPTION; + } + + protected MetricsBase(final String nam, final String desc) { + name = nam; + description = desc; + } + + public abstract void pushMetric(final MetricsRecord mr); + + public String getName() { return name; } + public String getDescription() { return description; }; + +} Added: hadoop/common/branches/branch-0.20-security-203/src/core/org/apache/hadoop/metrics/util/MetricsDynamicMBeanBase.java URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.20-security-203/src/core/org/apache/hadoop/metrics/util/MetricsDynamicMBeanBase.java?rev=1081840&view=auto ============================================================================== --- hadoop/common/branches/branch-0.20-security-203/src/core/org/apache/hadoop/metrics/util/MetricsDynamicMBeanBase.java (added) +++ hadoop/common/branches/branch-0.20-security-203/src/core/org/apache/hadoop/metrics/util/MetricsDynamicMBeanBase.java Tue Mar 15 16:27:19 2011 @@ -0,0 +1,229 @@ +/** + * 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.hadoop.metrics.util; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.management.Attribute; +import javax.management.AttributeList; +import javax.management.AttributeNotFoundException; +import javax.management.DynamicMBean; +import javax.management.InvalidAttributeValueException; +import javax.management.MBeanAttributeInfo; +import javax.management.MBeanException; +import javax.management.MBeanInfo; +import javax.management.MBeanOperationInfo; +import javax.management.ReflectionException; + +import org.apache.hadoop.classification.InterfaceAudience; +import org.apache.hadoop.metrics.MetricsUtil; + + + +/** + * This abstract base class facilitates creating dynamic mbeans automatically from + * metrics. + * The metrics constructors registers metrics in a registry. + * Different categories of metrics should be in differnt classes with their own + * registry (as in NameNodeMetrics and DataNodeMetrics). + * Then the MBean can be created passing the registry to the constructor. + * The MBean should be then registered using a mbean name (example): + * MetricsHolder myMetrics = new MetricsHolder(); // has metrics and registry + * MetricsTestMBean theMBean = new MetricsTestMBean(myMetrics.mregistry); + * ObjectName mbeanName = MBeanUtil.registerMBean("ServiceFoo", + * "TestStatistics", theMBean); + * + * @deprecated in favor of org.apache.hadoop.metrics2 usage. + */ +@Deprecated +@InterfaceAudience.LimitedPrivate({"HDFS", "MapReduce"}) +public abstract class MetricsDynamicMBeanBase implements DynamicMBean { + private final static String AVG_TIME = "AvgTime"; + private final static String MIN_TIME = "MinTime"; + private final static String MAX_TIME = "MaxTime"; + private final static String NUM_OPS = "NumOps"; + private final static String RESET_ALL_MIN_MAX_OP = "resetAllMinMax"; + private MetricsRegistry metricsRegistry; + private MBeanInfo mbeanInfo; + private Map metricsRateAttributeMod; + private int numEntriesInRegistry = 0; + private String mbeanDescription; + + protected MetricsDynamicMBeanBase(final MetricsRegistry mr, final String aMBeanDescription) { + metricsRegistry = mr; + mbeanDescription = aMBeanDescription; + createMBeanInfo(); + } + + private void updateMbeanInfoIfMetricsListChanged() { + if (numEntriesInRegistry != metricsRegistry.size()) + createMBeanInfo(); + } + + private void createMBeanInfo() { + metricsRateAttributeMod = new HashMap(); + boolean needsMinMaxResetOperation = false; + List attributesInfo = new ArrayList(); + MBeanOperationInfo[] operationsInfo = null; + numEntriesInRegistry = metricsRegistry.size(); + + for (MetricsBase o : metricsRegistry.getMetricsList()) { + + if (MetricsTimeVaryingRate.class.isInstance(o)) { + // For each of the metrics there are 3 different attributes + attributesInfo.add(new MBeanAttributeInfo(o.getName() + NUM_OPS, "java.lang.Integer", + o.getDescription(), true, false, false)); + attributesInfo.add(new MBeanAttributeInfo(o.getName() + AVG_TIME, "java.lang.Long", + o.getDescription(), true, false, false)); + attributesInfo.add(new MBeanAttributeInfo(o.getName() + MIN_TIME, "java.lang.Long", + o.getDescription(), true, false, false)); + attributesInfo.add(new MBeanAttributeInfo(o.getName() + MAX_TIME, "java.lang.Long", + o.getDescription(), true, false, false)); + needsMinMaxResetOperation = true; // the min and max can be reset. + + // Note the special attributes (AVG_TIME, MIN_TIME, ..) are derived from metrics + // Rather than check for the suffix we store them in a map. + metricsRateAttributeMod.put(o.getName() + NUM_OPS, o); + metricsRateAttributeMod.put(o.getName() + AVG_TIME, o); + metricsRateAttributeMod.put(o.getName() + MIN_TIME, o); + metricsRateAttributeMod.put(o.getName() + MAX_TIME, o); + + } else if ( MetricsIntValue.class.isInstance(o) || MetricsTimeVaryingInt.class.isInstance(o) ) { + attributesInfo.add(new MBeanAttributeInfo(o.getName(), "java.lang.Integer", + o.getDescription(), true, false, false)); + } else if ( MetricsLongValue.class.isInstance(o) || MetricsTimeVaryingLong.class.isInstance(o) ) { + attributesInfo.add(new MBeanAttributeInfo(o.getName(), "java.lang.Long", + o.getDescription(), true, false, false)); + } else { + MetricsUtil.LOG.error("unknown metrics type: " + o.getClass().getName()); + } + + if (needsMinMaxResetOperation) { + operationsInfo = new MBeanOperationInfo[] { + new MBeanOperationInfo(RESET_ALL_MIN_MAX_OP, "Reset (zero) All Min Max", + null, "void", MBeanOperationInfo.ACTION) }; + } + } + MBeanAttributeInfo[] attrArray = new MBeanAttributeInfo[attributesInfo.size()]; + mbeanInfo = new MBeanInfo(this.getClass().getName(), mbeanDescription, + attributesInfo.toArray(attrArray), null, operationsInfo, null); + } + + @Override + public Object getAttribute(String attributeName) throws AttributeNotFoundException, + MBeanException, ReflectionException { + if (attributeName == null || attributeName.equals("")) + throw new IllegalArgumentException(); + + updateMbeanInfoIfMetricsListChanged(); + + Object o = metricsRateAttributeMod.get(attributeName); + if (o == null) { + o = metricsRegistry.get(attributeName); + } + if (o == null) + throw new AttributeNotFoundException(); + + if (o instanceof MetricsIntValue) + return ((MetricsIntValue) o).get(); + else if (o instanceof MetricsLongValue) + return ((MetricsLongValue) o).get(); + else if (o instanceof MetricsTimeVaryingInt) + return ((MetricsTimeVaryingInt) o).getPreviousIntervalValue(); + else if (o instanceof MetricsTimeVaryingLong) + return ((MetricsTimeVaryingLong) o).getPreviousIntervalValue(); + else if (o instanceof MetricsTimeVaryingRate) { + MetricsTimeVaryingRate or = (MetricsTimeVaryingRate) o; + if (attributeName.endsWith(NUM_OPS)) + return or.getPreviousIntervalNumOps(); + else if (attributeName.endsWith(AVG_TIME)) + return or.getPreviousIntervalAverageTime(); + else if (attributeName.endsWith(MIN_TIME)) + return or.getMinTime(); + else if (attributeName.endsWith(MAX_TIME)) + return or.getMaxTime(); + else { + MetricsUtil.LOG.error("Unexpected attrubute suffix"); + throw new AttributeNotFoundException(); + } + } else { + MetricsUtil.LOG.error("unknown metrics type: " + o.getClass().getName()); + throw new AttributeNotFoundException(); + } + } + + @Override + public AttributeList getAttributes(String[] attributeNames) { + if (attributeNames == null || attributeNames.length == 0) + throw new IllegalArgumentException(); + + updateMbeanInfoIfMetricsListChanged(); + + AttributeList result = new AttributeList(attributeNames.length); + for (String iAttributeName : attributeNames) { + try { + Object value = getAttribute(iAttributeName); + result.add(new Attribute(iAttributeName, value)); + } catch (Exception e) { + continue; + } + } + return result; + } + + @Override + public MBeanInfo getMBeanInfo() { + return mbeanInfo; + } + + @Override + public Object invoke(String actionName, Object[] parms, String[] signature) + throws MBeanException, ReflectionException { + + if (actionName == null || actionName.equals("")) + throw new IllegalArgumentException(); + + + // Right now we support only one fixed operation (if it applies) + if (!(actionName.equals(RESET_ALL_MIN_MAX_OP)) || + mbeanInfo.getOperations().length != 1) { + throw new ReflectionException(new NoSuchMethodException(actionName)); + } + for (MetricsBase m : metricsRegistry.getMetricsList()) { + if ( MetricsTimeVaryingRate.class.isInstance(m) ) { + MetricsTimeVaryingRate.class.cast(m).resetMinMax(); + } + } + return null; + } + + @Override + public void setAttribute(Attribute attribute) + throws AttributeNotFoundException, InvalidAttributeValueException, + MBeanException, ReflectionException { + throw new ReflectionException(new NoSuchMethodException("set" + attribute)); + } + + @Override + public AttributeList setAttributes(AttributeList attributes) { + return null; + } +} Added: hadoop/common/branches/branch-0.20-security-203/src/core/org/apache/hadoop/metrics/util/MetricsIntValue.java URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.20-security-203/src/core/org/apache/hadoop/metrics/util/MetricsIntValue.java?rev=1081840&view=auto ============================================================================== --- hadoop/common/branches/branch-0.20-security-203/src/core/org/apache/hadoop/metrics/util/MetricsIntValue.java (added) +++ hadoop/common/branches/branch-0.20-security-203/src/core/org/apache/hadoop/metrics/util/MetricsIntValue.java Tue Mar 15 16:27:19 2011 @@ -0,0 +1,108 @@ +/** + * 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.hadoop.metrics.util; + +import org.apache.hadoop.classification.InterfaceAudience; +import org.apache.hadoop.metrics.MetricsRecord; +import org.apache.hadoop.util.StringUtils; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +/** + * The MetricsIntValue class is for a metric that is not time varied + * but changes only when it is set. + * Each time its value is set, it is published only *once* at the next update + * call. + * + * @deprecated in favor of {@link org.apache.hadoop.metrics2.lib.MutableGaugeInt}. + */ +@Deprecated +@InterfaceAudience.LimitedPrivate({"HDFS", "MapReduce"}) +public class MetricsIntValue extends MetricsBase { + + private static final Log LOG = + LogFactory.getLog("org.apache.hadoop.metrics.util"); + + private int value; + private boolean changed; + + + /** + * Constructor - create a new metric + * @param nam the name of the metrics to be used to publish the metric + * @param registry - where the metrics object will be registered + */ + public MetricsIntValue(final String nam, final MetricsRegistry registry, final String description) { + super(nam, description); + value = 0; + changed = false; + registry.add(nam, this); + } + + /** + * Constructor - create a new metric + * @param nam the name of the metrics to be used to publish the metric + * @param registry - where the metrics object will be registered + * A description of {@link #NO_DESCRIPTION} is used + */ + public MetricsIntValue(final String nam, MetricsRegistry registry) { + this(nam, registry, NO_DESCRIPTION); + } + + + + /** + * Set the value + * @param newValue + */ + public synchronized void set(final int newValue) { + value = newValue; + changed = true; + } + + /** + * Get value + * @return the value last set + */ + public synchronized int get() { + return value; + } + + + /** + * Push the metric to the mr. + * The metric is pushed only if it was updated since last push + * + * Note this does NOT push to JMX + * (JMX gets the info via {@link #get()} + * + * @param mr + */ + public synchronized void pushMetric(final MetricsRecord mr) { + if (changed) { + try { + mr.setMetric(getName(), value); + } catch (Exception e) { + LOG.info("pushMetric failed for " + getName() + "\n" + + StringUtils.stringifyException(e)); + } + } + changed = false; + } +}