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 */ 018package org.apache.hadoop.hdfs.server.namenode.metrics; 019 020import static org.apache.hadoop.metrics2.impl.MsInfo.ProcessName; 021import static org.apache.hadoop.metrics2.impl.MsInfo.SessionId; 022 023import org.apache.hadoop.conf.Configuration; 024import org.apache.hadoop.hdfs.DFSConfigKeys; 025import org.apache.hadoop.hdfs.server.common.HdfsServerConstants.NamenodeRole; 026import org.apache.hadoop.metrics2.MetricsSystem; 027import org.apache.hadoop.metrics2.annotation.Metric; 028import org.apache.hadoop.metrics2.annotation.Metrics; 029import org.apache.hadoop.metrics2.lib.DefaultMetricsSystem; 030import org.apache.hadoop.metrics2.lib.MetricsRegistry; 031import org.apache.hadoop.metrics2.lib.MutableCounterLong; 032import org.apache.hadoop.metrics2.lib.MutableGaugeInt; 033import org.apache.hadoop.metrics2.lib.MutableQuantiles; 034import org.apache.hadoop.metrics2.lib.MutableRate; 035import org.apache.hadoop.metrics2.source.JvmMetrics; 036 037/** 038 * This class is for maintaining the various NameNode activity statistics 039 * and publishing them through the metrics interfaces. 040 */ 041@Metrics(name="NameNodeActivity", about="NameNode metrics", context="dfs") 042public class NameNodeMetrics { 043 final MetricsRegistry registry = new MetricsRegistry("namenode"); 044 045 @Metric MutableCounterLong createFileOps; 046 @Metric MutableCounterLong filesCreated; 047 @Metric MutableCounterLong filesAppended; 048 @Metric MutableCounterLong getBlockLocations; 049 @Metric MutableCounterLong filesRenamed; 050 @Metric MutableCounterLong getListingOps; 051 @Metric MutableCounterLong deleteFileOps; 052 @Metric("Number of files/dirs deleted by delete or rename operations") 053 MutableCounterLong filesDeleted; 054 @Metric MutableCounterLong fileInfoOps; 055 @Metric MutableCounterLong addBlockOps; 056 @Metric MutableCounterLong getAdditionalDatanodeOps; 057 @Metric MutableCounterLong createSymlinkOps; 058 @Metric MutableCounterLong getLinkTargetOps; 059 @Metric MutableCounterLong filesInGetListingOps; 060 @Metric("Number of allowSnapshot operations") 061 MutableCounterLong allowSnapshotOps; 062 @Metric("Number of disallowSnapshot operations") 063 MutableCounterLong disallowSnapshotOps; 064 @Metric("Number of createSnapshot operations") 065 MutableCounterLong createSnapshotOps; 066 @Metric("Number of deleteSnapshot operations") 067 MutableCounterLong deleteSnapshotOps; 068 @Metric("Number of renameSnapshot operations") 069 MutableCounterLong renameSnapshotOps; 070 @Metric("Number of listSnapshottableDirectory operations") 071 MutableCounterLong listSnapshottableDirOps; 072 @Metric("Number of snapshotDiffReport operations") 073 MutableCounterLong snapshotDiffReportOps; 074 @Metric("Number of blockReceivedAndDeleted calls") 075 MutableCounterLong blockReceivedAndDeletedOps; 076 077 @Metric("Journal transactions") MutableRate transactions; 078 @Metric("Journal syncs") MutableRate syncs; 079 MutableQuantiles[] syncsQuantiles; 080 @Metric("Journal transactions batched in sync") 081 MutableCounterLong transactionsBatchedInSync; 082 @Metric("Block report") MutableRate blockReport; 083 MutableQuantiles[] blockReportQuantiles; 084 @Metric("Cache report") MutableRate cacheReport; 085 MutableQuantiles[] cacheReportQuantiles; 086 087 @Metric("Duration in SafeMode at startup in msec") 088 MutableGaugeInt safeModeTime; 089 @Metric("Time loading FS Image at startup in msec") 090 MutableGaugeInt fsImageLoadTime; 091 092 @Metric("GetImageServlet getEdit") 093 MutableRate getEdit; 094 @Metric("GetImageServlet getImage") 095 MutableRate getImage; 096 @Metric("GetImageServlet putImage") 097 MutableRate putImage; 098 099 NameNodeMetrics(String processName, String sessionId, int[] intervals) { 100 registry.tag(ProcessName, processName).tag(SessionId, sessionId); 101 102 final int len = intervals.length; 103 syncsQuantiles = new MutableQuantiles[len]; 104 blockReportQuantiles = new MutableQuantiles[len]; 105 cacheReportQuantiles = new MutableQuantiles[len]; 106 107 for (int i = 0; i < len; i++) { 108 int interval = intervals[i]; 109 syncsQuantiles[i] = registry.newQuantiles( 110 "syncs" + interval + "s", 111 "Journal syncs", "ops", "latency", interval); 112 blockReportQuantiles[i] = registry.newQuantiles( 113 "blockReport" + interval + "s", 114 "Block report", "ops", "latency", interval); 115 cacheReportQuantiles[i] = registry.newQuantiles( 116 "cacheReport" + interval + "s", 117 "Cache report", "ops", "latency", interval); 118 } 119 } 120 121 public static NameNodeMetrics create(Configuration conf, NamenodeRole r) { 122 String sessionId = conf.get(DFSConfigKeys.DFS_METRICS_SESSION_ID_KEY); 123 String processName = r.toString(); 124 MetricsSystem ms = DefaultMetricsSystem.instance(); 125 JvmMetrics.create(processName, sessionId, ms); 126 127 // Percentile measurement is off by default, by watching no intervals 128 int[] intervals = 129 conf.getInts(DFSConfigKeys.DFS_METRICS_PERCENTILES_INTERVALS_KEY); 130 return ms.register(new NameNodeMetrics(processName, sessionId, intervals)); 131 } 132 133 public void shutdown() { 134 DefaultMetricsSystem.shutdown(); 135 } 136 137 public void incrGetBlockLocations() { 138 getBlockLocations.incr(); 139 } 140 141 public void incrFilesCreated() { 142 filesCreated.incr(); 143 } 144 145 public void incrCreateFileOps() { 146 createFileOps.incr(); 147 } 148 149 public void incrFilesAppended() { 150 filesAppended.incr(); 151 } 152 153 public void incrAddBlockOps() { 154 addBlockOps.incr(); 155 } 156 157 public void incrGetAdditionalDatanodeOps() { 158 getAdditionalDatanodeOps.incr(); 159 } 160 161 public void incrFilesRenamed() { 162 filesRenamed.incr(); 163 } 164 165 public void incrFilesDeleted(long delta) { 166 filesDeleted.incr(delta); 167 } 168 169 public void incrDeleteFileOps() { 170 deleteFileOps.incr(); 171 } 172 173 public void incrGetListingOps() { 174 getListingOps.incr(); 175 } 176 177 public void incrFilesInGetListingOps(int delta) { 178 filesInGetListingOps.incr(delta); 179 } 180 181 public void incrFileInfoOps() { 182 fileInfoOps.incr(); 183 } 184 185 public void incrCreateSymlinkOps() { 186 createSymlinkOps.incr(); 187 } 188 189 public void incrGetLinkTargetOps() { 190 getLinkTargetOps.incr(); 191 } 192 193 public void incrAllowSnapshotOps() { 194 allowSnapshotOps.incr(); 195 } 196 197 public void incrDisAllowSnapshotOps() { 198 disallowSnapshotOps.incr(); 199 } 200 201 public void incrCreateSnapshotOps() { 202 createSnapshotOps.incr(); 203 } 204 205 public void incrDeleteSnapshotOps() { 206 deleteSnapshotOps.incr(); 207 } 208 209 public void incrRenameSnapshotOps() { 210 renameSnapshotOps.incr(); 211 } 212 213 public void incrListSnapshottableDirOps() { 214 listSnapshottableDirOps.incr(); 215 } 216 217 public void incrSnapshotDiffReportOps() { 218 snapshotDiffReportOps.incr(); 219 } 220 221 public void incrBlockReceivedAndDeletedOps() { 222 blockReceivedAndDeletedOps.incr(); 223 } 224 225 public void addTransaction(long latency) { 226 transactions.add(latency); 227 } 228 229 public void incrTransactionsBatchedInSync() { 230 transactionsBatchedInSync.incr(); 231 } 232 233 public void addSync(long elapsed) { 234 syncs.add(elapsed); 235 for (MutableQuantiles q : syncsQuantiles) { 236 q.add(elapsed); 237 } 238 } 239 240 public void setFsImageLoadTime(long elapsed) { 241 fsImageLoadTime.set((int) elapsed); 242 } 243 244 public void addBlockReport(long latency) { 245 blockReport.add(latency); 246 for (MutableQuantiles q : blockReportQuantiles) { 247 q.add(latency); 248 } 249 } 250 251 public void addCacheBlockReport(long latency) { 252 cacheReport.add(latency); 253 for (MutableQuantiles q : cacheReportQuantiles) { 254 q.add(latency); 255 } 256 } 257 258 public void setSafeModeTime(long elapsed) { 259 safeModeTime.set((int) elapsed); 260 } 261 262 public void addGetEdit(long latency) { 263 getEdit.add(latency); 264 } 265 266 public void addGetImage(long latency) { 267 getImage.add(latency); 268 } 269 270 public void addPutImage(long latency) { 271 putImage.add(latency); 272 } 273}