/** * 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.yarn.server.resourcemanager.scheduler.fair; import com.google.common.annotations.VisibleForTesting; import org.apache.hadoop.classification.InterfaceAudience; import org.apache.hadoop.classification.InterfaceStability; import org.apache.hadoop.metrics2.MetricsCollector; import org.apache.hadoop.metrics2.MetricsInfo; import org.apache.hadoop.metrics2.MetricsSource; 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 static org.apache.hadoop.metrics2.lib.Interns.info; import org.apache.hadoop.metrics2.lib.MutableRate; /** * Class to capture the performance metrics of FairScheduler. * This should be a singleton. */ @InterfaceAudience.Private @InterfaceStability.Unstable @Metrics(context="fairscheduler-op-durations") public class FSOpDurations implements MetricsSource { @Metric("Duration for a continuous scheduling run") MutableRate continuousSchedulingRun; @Metric("Duration to handle a node update") MutableRate nodeUpdateCall; @Metric("Duration for a update thread run") MutableRate updateThreadRun; @Metric("Duration for an update call") MutableRate updateCall; @Metric("Duration for a preempt call") MutableRate preemptCall; private static final MetricsInfo RECORD_INFO = info("FSOpDurations", "Durations of FairScheduler calls or thread-runs"); private final MetricsRegistry registry; private boolean isExtended = false; private static final FSOpDurations INSTANCE = new FSOpDurations(); public static FSOpDurations getInstance(boolean isExtended) { INSTANCE.setExtended(isExtended); return INSTANCE; } private FSOpDurations() { registry = new MetricsRegistry(RECORD_INFO); registry.tag(RECORD_INFO, "FSOpDurations"); MetricsSystem ms = DefaultMetricsSystem.instance(); if (ms != null) { ms.register(RECORD_INFO.name(), RECORD_INFO.description(), this); } } private synchronized void setExtended(boolean isExtended) { if (isExtended == INSTANCE.isExtended) return; continuousSchedulingRun.setExtended(isExtended); nodeUpdateCall.setExtended(isExtended); updateThreadRun.setExtended(isExtended); updateCall.setExtended(isExtended); preemptCall.setExtended(isExtended); INSTANCE.isExtended = isExtended; } @Override public synchronized void getMetrics(MetricsCollector collector, boolean all) { registry.snapshot(collector.addRecord(registry.info()), all); } public void addContinuousSchedulingRunDuration(long value) { continuousSchedulingRun.add(value); } public void addNodeUpdateDuration(long value) { nodeUpdateCall.add(value); } public void addUpdateThreadRunDuration(long value) { updateThreadRun.add(value); } public void addUpdateCallDuration(long value) { updateCall.add(value); } public void addPreemptCallDuration(long value) { preemptCall.add(value); } @VisibleForTesting public boolean hasUpdateThreadRunChanged() { return updateThreadRun.changed(); } }