| /** |
| * 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.hdfs.nfs.nfs3; |
| |
| import static org.apache.hadoop.metrics2.impl.MsInfo.SessionId; |
| |
| import org.apache.hadoop.classification.InterfaceAudience; |
| import org.apache.hadoop.conf.Configuration; |
| import org.apache.hadoop.hdfs.DFSConfigKeys; |
| import org.apache.hadoop.hdfs.nfs.conf.NfsConfigKeys; |
| import org.apache.hadoop.metrics2.MetricsSystem; |
| import org.apache.hadoop.metrics2.annotation.Metric; |
| import org.apache.hadoop.metrics2.annotation.Metrics; |
| import org.apache.hadoop.metrics2.lib.DefaultMetricsSystem; |
| import org.apache.hadoop.metrics2.lib.MetricsRegistry; |
| import org.apache.hadoop.metrics2.lib.MutableCounterLong; |
| import org.apache.hadoop.metrics2.lib.MutableQuantiles; |
| import org.apache.hadoop.metrics2.lib.MutableRate; |
| import org.apache.hadoop.metrics2.source.JvmMetrics; |
| |
| /** |
| * This class is for maintaining the various NFS gateway activity statistics and |
| * publishing them through the metrics interfaces. |
| */ |
| @InterfaceAudience.Private |
| @Metrics(about = "Nfs3 metrics", context = "dfs") |
| public class Nfs3Metrics { |
| // All mutable rates are in nanoseconds |
| // No metric for nullProcedure; |
| @Metric MutableRate getattr; |
| @Metric MutableRate setattr; |
| @Metric MutableRate lookup; |
| @Metric MutableRate access; |
| @Metric MutableRate readlink; |
| @Metric MutableRate read; |
| final MutableQuantiles[] readNanosQuantiles; |
| @Metric MutableRate write; |
| final MutableQuantiles[] writeNanosQuantiles; |
| @Metric MutableRate create; |
| @Metric MutableRate mkdir; |
| @Metric MutableRate symlink; |
| @Metric MutableRate mknod; |
| @Metric MutableRate remove; |
| @Metric MutableRate rmdir; |
| @Metric MutableRate rename; |
| @Metric MutableRate link; |
| @Metric MutableRate readdir; |
| @Metric MutableRate readdirplus; |
| @Metric MutableRate fsstat; |
| @Metric MutableRate fsinfo; |
| @Metric MutableRate pathconf; |
| @Metric MutableRate commit; |
| final MutableQuantiles[] commitNanosQuantiles; |
| |
| @Metric MutableCounterLong bytesWritten; |
| @Metric MutableCounterLong bytesRead; |
| |
| final MetricsRegistry registry = new MetricsRegistry("nfs3"); |
| final String name; |
| JvmMetrics jvmMetrics = null; |
| |
| public Nfs3Metrics(String name, String sessionId, int[] intervals, |
| final JvmMetrics jvmMetrics) { |
| this.name = name; |
| this.jvmMetrics = jvmMetrics; |
| registry.tag(SessionId, sessionId); |
| |
| final int len = intervals.length; |
| readNanosQuantiles = new MutableQuantiles[len]; |
| writeNanosQuantiles = new MutableQuantiles[len]; |
| commitNanosQuantiles = new MutableQuantiles[len]; |
| |
| for (int i = 0; i < len; i++) { |
| int interval = intervals[i]; |
| readNanosQuantiles[i] = registry.newQuantiles("readProcessNanos" |
| + interval + "s", "Read process in ns", "ops", "latency", interval); |
| writeNanosQuantiles[i] = registry.newQuantiles("writeProcessNanos" |
| + interval + "s", "Write process in ns", "ops", "latency", interval); |
| commitNanosQuantiles[i] = registry.newQuantiles("commitProcessNanos" |
| + interval + "s", "Commit process in ns", "ops", "latency", interval); |
| } |
| } |
| |
| public static Nfs3Metrics create(Configuration conf, String gatewayName) { |
| String sessionId = conf.get(DFSConfigKeys.DFS_METRICS_SESSION_ID_KEY); |
| MetricsSystem ms = DefaultMetricsSystem.instance(); |
| JvmMetrics jm = JvmMetrics.create(gatewayName, sessionId, ms); |
| |
| // Percentile measurement is [50th,75th,90th,95th,99th] currently |
| int[] intervals = conf |
| .getInts(NfsConfigKeys.NFS_METRICS_PERCENTILES_INTERVALS_KEY); |
| return ms.register(new Nfs3Metrics(gatewayName, sessionId, intervals, jm)); |
| } |
| |
| public String name() { |
| return name; |
| } |
| |
| public JvmMetrics getJvmMetrics() { |
| return jvmMetrics; |
| } |
| |
| public void incrBytesWritten(long bytes) { |
| bytesWritten.incr(bytes); |
| } |
| |
| public void incrBytesRead(long bytes) { |
| bytesRead.incr(bytes); |
| } |
| |
| public void addGetattr(long latencyNanos) { |
| getattr.add(latencyNanos); |
| } |
| |
| public void addSetattr(long latencyNanos) { |
| setattr.add(latencyNanos); |
| } |
| |
| public void addLookup(long latencyNanos) { |
| lookup.add(latencyNanos); |
| } |
| |
| public void addAccess(long latencyNanos) { |
| access.add(latencyNanos); |
| } |
| |
| public void addReadlink(long latencyNanos) { |
| readlink.add(latencyNanos); |
| } |
| |
| public void addRead(long latencyNanos) { |
| read.add(latencyNanos); |
| for (MutableQuantiles q : readNanosQuantiles) { |
| q.add(latencyNanos); |
| } |
| } |
| |
| public void addWrite(long latencyNanos) { |
| write.add(latencyNanos); |
| for (MutableQuantiles q : writeNanosQuantiles) { |
| q.add(latencyNanos); |
| } |
| } |
| |
| public void addCreate(long latencyNanos) { |
| create.add(latencyNanos); |
| } |
| |
| public void addMkdir(long latencyNanos) { |
| mkdir.add(latencyNanos); |
| } |
| |
| public void addSymlink(long latencyNanos) { |
| symlink.add(latencyNanos); |
| } |
| |
| public void addMknod(long latencyNanos) { |
| mknod.add(latencyNanos); |
| } |
| |
| public void addRemove(long latencyNanos) { |
| remove.add(latencyNanos); |
| } |
| |
| public void addRmdir(long latencyNanos) { |
| rmdir.add(latencyNanos); |
| } |
| |
| public void addRename(long latencyNanos) { |
| rename.add(latencyNanos); |
| } |
| |
| public void addLink(long latencyNanos) { |
| link.add(latencyNanos); |
| } |
| |
| public void addReaddir(long latencyNanos) { |
| readdir.add(latencyNanos); |
| } |
| |
| public void addReaddirplus(long latencyNanos) { |
| readdirplus.add(latencyNanos); |
| } |
| |
| public void addFsstat(long latencyNanos) { |
| fsstat.add(latencyNanos); |
| } |
| |
| public void addFsinfo(long latencyNanos) { |
| fsinfo.add(latencyNanos); |
| } |
| |
| public void addPathconf(long latencyNanos) { |
| pathconf.add(latencyNanos); |
| } |
| |
| public void addCommit(long latencyNanos) { |
| commit.add(latencyNanos); |
| for (MutableQuantiles q : commitNanosQuantiles) { |
| q.add(latencyNanos); |
| } |
| } |
| |
| } |