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}