| /** |
| * 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.namenode.startupprogress; |
| |
| import static org.apache.hadoop.metrics2.lib.Interns.info; |
| |
| import org.apache.hadoop.classification.InterfaceAudience; |
| import org.apache.hadoop.hdfs.server.namenode.startupprogress.Phase; |
| import org.apache.hadoop.hdfs.server.namenode.startupprogress.StartupProgressView; |
| import org.apache.hadoop.metrics2.MetricsCollector; |
| import org.apache.hadoop.metrics2.MetricsInfo; |
| import org.apache.hadoop.metrics2.MetricsRecordBuilder; |
| import org.apache.hadoop.metrics2.MetricsSource; |
| import org.apache.hadoop.metrics2.lib.DefaultMetricsSystem; |
| |
| /** |
| * Links {@link StartupProgress} to a {@link MetricsSource} to expose its |
| * information via JMX. |
| */ |
| @InterfaceAudience.Private |
| public class StartupProgressMetrics implements MetricsSource { |
| |
| private static final MetricsInfo STARTUP_PROGRESS_METRICS_INFO = |
| info("StartupProgress", "NameNode startup progress"); |
| |
| private final StartupProgress startupProgress; |
| |
| /** |
| * Registers StartupProgressMetrics linked to the given StartupProgress. |
| * |
| * @param prog StartupProgress to link |
| */ |
| public static void register(StartupProgress prog) { |
| new StartupProgressMetrics(prog); |
| } |
| |
| /** |
| * Creates a new StartupProgressMetrics registered with the metrics system. |
| * |
| * @param startupProgress StartupProgress to link |
| */ |
| public StartupProgressMetrics(StartupProgress startupProgress) { |
| this.startupProgress = startupProgress; |
| DefaultMetricsSystem.instance().register( |
| STARTUP_PROGRESS_METRICS_INFO.name(), |
| STARTUP_PROGRESS_METRICS_INFO.description(), this); |
| } |
| |
| @Override |
| public void getMetrics(MetricsCollector collector, boolean all) { |
| StartupProgressView prog = startupProgress.createView(); |
| MetricsRecordBuilder builder = collector.addRecord( |
| STARTUP_PROGRESS_METRICS_INFO); |
| |
| builder.addCounter(info("ElapsedTime", "overall elapsed time"), |
| prog.getElapsedTime()); |
| builder.addGauge(info("PercentComplete", "overall percent complete"), |
| prog.getPercentComplete()); |
| |
| for (Phase phase: prog.getPhases()) { |
| addCounter(builder, phase, "Count", " count", prog.getCount(phase)); |
| addCounter(builder, phase, "ElapsedTime", " elapsed time", |
| prog.getElapsedTime(phase)); |
| addCounter(builder, phase, "Total", " total", prog.getTotal(phase)); |
| addGauge(builder, phase, "PercentComplete", " percent complete", |
| prog.getPercentComplete(phase)); |
| } |
| } |
| |
| /** |
| * Adds a counter with a name built by using the specified phase's name as |
| * prefix and then appending the specified suffix. |
| * |
| * @param builder MetricsRecordBuilder to receive counter |
| * @param phase Phase to add |
| * @param nameSuffix String suffix of metric name |
| * @param descSuffix String suffix of metric description |
| * @param value long counter value |
| */ |
| private static void addCounter(MetricsRecordBuilder builder, Phase phase, |
| String nameSuffix, String descSuffix, long value) { |
| MetricsInfo metricsInfo = info(phase.getName() + nameSuffix, |
| phase.getDescription() + descSuffix); |
| builder.addCounter(metricsInfo, value); |
| } |
| |
| /** |
| * Adds a gauge with a name built by using the specified phase's name as prefix |
| * and then appending the specified suffix. |
| * |
| * @param builder MetricsRecordBuilder to receive counter |
| * @param phase Phase to add |
| * @param nameSuffix String suffix of metric name |
| * @param descSuffix String suffix of metric description |
| * @param value float gauge value |
| */ |
| private static void addGauge(MetricsRecordBuilder builder, Phase phase, |
| String nameSuffix, String descSuffix, float value) { |
| MetricsInfo metricsInfo = info(phase.getName() + nameSuffix, |
| phase.getDescription() + descSuffix); |
| builder.addGauge(metricsInfo, value); |
| } |
| } |