/**
* 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.server.datanode.metrics;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.metrics2.MetricsBuilder;
import org.apache.hadoop.metrics2.MetricsSource;
import org.apache.hadoop.metrics2.MetricsSystem;
import org.apache.hadoop.metrics2.lib.DefaultMetricsSystem;
import org.apache.hadoop.metrics2.lib.MetricMutableCounterInt;
import org.apache.hadoop.metrics2.lib.MetricMutableCounterLong;
import org.apache.hadoop.metrics2.lib.MetricMutableStat;
import org.apache.hadoop.metrics2.lib.MetricsRegistry;
import org.apache.hadoop.metrics2.source.JvmMetricsSource;
public class DataNodeInstrumentation implements MetricsSource {
final MetricsRegistry registry = new MetricsRegistry("datanode");
final MetricMutableCounterLong bytesWritten =
registry.newCounter("bytes_written", "", 0L);
final MetricMutableCounterLong bytesRead =
registry.newCounter("bytes_read", "", 0L);
final MetricMutableCounterInt blocksWritten =
registry.newCounter("blocks_written", "", 0);
final MetricMutableCounterInt blocksRead =
registry.newCounter("blocks_read", "", 0);
final MetricMutableCounterInt blocksReplicated =
registry.newCounter("blocks_replicated", "", 0);
final MetricMutableCounterInt blocksRemoved =
registry.newCounter("blocks_removed", "", 0);
final MetricMutableCounterInt blocksVerified =
registry.newCounter("blocks_verified", "", 0);
final MetricMutableCounterInt blockVerificationFailures =
registry.newCounter("block_verification_failures", "", 0);
final MetricMutableCounterInt blocksGetLocalPathInfo =
registry.newCounter("blocks_get_local_pathinfo", "", 0);
final MetricMutableCounterInt readsFromLocalClient =
registry.newCounter("reads_from_local_client", "", 0);
final MetricMutableCounterInt readsFromRemoteClient =
registry.newCounter("reads_from_remote_client", "", 0);
final MetricMutableCounterInt writesFromLocalClient =
registry.newCounter("writes_from_local_client", "", 0);
final MetricMutableCounterInt writesFromRemoteClient =
registry.newCounter("writes_from_remote_client", "", 0);
final MetricMutableStat readBlockOp = registry.newStat("readBlockOp");
final MetricMutableStat writeBlockOp = registry.newStat("writeBlockOp");
final MetricMutableStat blockChecksumOp = registry.newStat("blockChecksumOp");
final MetricMutableStat copyBlockOp = registry.newStat("copyBlockOp");
final MetricMutableStat replaceBlockOp = registry.newStat("replaceBlockOp");
final MetricMutableStat heartbeats = registry.newStat("heartBeats");
final MetricMutableStat blockReports = registry.newStat("blockReports");
public DataNodeInstrumentation(Configuration conf, String storageId) {
String sessionId = conf.get("session.id");
JvmMetricsSource.create("DataNode", sessionId);
registry.setContext("dfs").tag("sessionId", "", sessionId);
}
//@Override
public void shutdown() {
// metrics system shutdown would suffice
}
//@Override
public void resetAllMinMax() {
readBlockOp.resetMinMax();
writeBlockOp.resetMinMax();
blockChecksumOp.resetMinMax();
copyBlockOp.resetMinMax();
replaceBlockOp.resetMinMax();
heartbeats.resetMinMax();
blockReports.resetMinMax();
}
//@Override
public void addHeartBeat(long latency) {
heartbeats.add(latency);
}
//@Override
public void addBlockReport(long latency) {
blockReports.add(latency);
}
//@Override
public void incrBlocksReplicated(int delta) {
blocksReplicated.incr(delta);
}
//@Override
public void incrBlocksWritten() {
blocksWritten.incr();
}
//@Override
public void incrBlocksRemoved(int delta) {
blocksRemoved.incr(delta);
}
//@Override
public void incrBytesWritten(int delta) {
bytesWritten.incr(delta);
}
//@Override
public void incrBlockVerificationFailures() {
blockVerificationFailures.incr();
}
//@Override
public void incrBlocksVerified() {
blocksVerified.incr();
}
//@Override
public void incrBlocksGetLocalPathInfo() {
blocksGetLocalPathInfo.incr();
}
//@Override
public void addReadBlockOp(long latency) {
readBlockOp.add(latency);
}
//@Override
public void incrReadsFromLocalClient() {
readsFromLocalClient.incr();
}
//@Override
public void incrReadsFromRemoteClient() {
readsFromRemoteClient.incr();
}
//@Override
public void addWriteBlockOp(long latency) {
writeBlockOp.add(latency);
}
//@Override
public void incrWritesFromLocalClient() {
writesFromLocalClient.incr();
}
//@Override
public void incrWritesFromRemoteClient() {
writesFromRemoteClient.incr();
}
//@Override
public void addReplaceBlockOp(long latency) {
replaceBlockOp.add(latency);
}
//@Override
public void addCopyBlockOp(long latency) {
copyBlockOp.add(latency);
}
//@Override
public void addBlockChecksumOp(long latency) {
blockChecksumOp.add(latency);
}
//@Override
public void incrBytesRead(int delta) {
bytesRead.incr(delta);
}
//@Override
public void incrBlocksRead() {
blocksRead.incr();
}
@Override
public void getMetrics(MetricsBuilder builder, boolean all) {
registry.snapshot(builder.addRecord(registry.name()), all);
}
public static DataNodeInstrumentation create(Configuration conf,
String storageID) {
return create(conf, storageID, DefaultMetricsSystem.INSTANCE);
}
public static DataNodeInstrumentation create(Configuration conf,
String storageID,
MetricsSystem ms) {
return ms.register("DataNode", "DataNode metrics",
new DataNodeInstrumentation(conf, storageID));
}
}