001    /**
002     * Licensed to the Apache Software Foundation (ASF) under one
003     * or more contributor license agreements.  See the NOTICE file
004     * distributed with this work for additional information
005     * regarding copyright ownership.  The ASF licenses this file
006     * to you under the Apache License, Version 2.0 (the
007     * "License"); you may not use this file except in compliance
008     * with the License.  You may obtain a copy of the License at
009     *
010     *     http://www.apache.org/licenses/LICENSE-2.0
011     *
012     * Unless required by applicable law or agreed to in writing, software
013     * distributed under the License is distributed on an "AS IS" BASIS,
014     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015     * See the License for the specific language governing permissions and
016     * limitations under the License.
017     */
018    
019    package org.apache.hadoop.metrics2;
020    
021    import com.google.common.base.Objects;
022    import static com.google.common.base.Preconditions.*;
023    
024    import org.apache.hadoop.classification.InterfaceAudience;
025    import org.apache.hadoop.classification.InterfaceStability;
026    
027    /**
028     * Immutable tag for metrics (for grouping on host/queue/username etc.)
029     */
030    @InterfaceAudience.Public
031    @InterfaceStability.Evolving
032    public class MetricsTag implements MetricsInfo {
033      private final MetricsInfo info;
034      private final String value;
035    
036      /**
037       * Construct the tag with name, description and value
038       * @param info  of the tag
039       * @param value of the tag
040       */
041      public MetricsTag(MetricsInfo info, String value) {
042        this.info = checkNotNull(info, "tag info");
043        this.value = value;
044      }
045    
046      @Override public String name() {
047        return info.name();
048      }
049    
050      @Override public String description() {
051        return info.description();
052      }
053    
054      /**
055       * @return the info object of the tag
056       */
057      public MetricsInfo info() {
058        return info;
059      }
060    
061      /**
062       * Get the value of the tag
063       * @return  the value
064       */
065      public String value() {
066        return value;
067      }
068    
069      @Override public boolean equals(Object obj) {
070        if (obj instanceof MetricsTag) {
071          final MetricsTag other = (MetricsTag) obj;
072          return Objects.equal(info, other.info()) &&
073                 Objects.equal(value, other.value());
074        }
075        return false;
076      }
077    
078      @Override public int hashCode() {
079        return Objects.hashCode(info, value);
080      }
081    
082      @Override public String toString() {
083        return Objects.toStringHelper(this)
084            .add("info", info)
085            .add("value", value())
086            .toString();
087      }
088    }