content: /**
   * Copyright The Apache Software Foundation
   *
   * 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 com.alibaba.wasp.master;
  
  import com.alibaba.wasp.master.metrics.MetricsMasterSource;
  import com.alibaba.wasp.master.metrics.MetricsMasterWrapper;
  import com.alibaba.wasp.metrics.BaseSourceImpl;
  import org.apache.hadoop.metrics2.MetricsBuilder;
  import org.apache.hadoop.metrics2.MetricsRecordBuilder;
  import org.apache.hadoop.metrics2.lib.MetricMutableGaugeLong;
  
  /**
   * Implementation of MetricsMasterSource.
   * 
   * Implements BaseSource through BaseSourceImpl, following the pattern
   */
  public class MetricsMasterSourceImpl extends BaseSourceImpl implements
      MetricsMasterSource {
    private final MetricsMasterWrapper masterWrapper;
    private MetricMutableGaugeLong clusterRequestsGauge;
    private MetricMutableGaugeLong ritGauge;
    private MetricMutableGaugeLong ritCountOverThresholdGauge;
    private MetricMutableGaugeLong ritOldestAgeGauge;
  
    public MetricsMasterSourceImpl(MetricsMasterWrapper masterWrapper) {
      this(METRICS_NAME, METRICS_DESCRIPTION, METRICS_CONTEXT,
          METRICS_JMX_CONTEXT, masterWrapper);
    }
  
    public MetricsMasterSourceImpl(String metricsName, String metricsDescription,
        String metricsContext, String metricsJmxContext,
        MetricsMasterWrapper masterWrapper) {
      super(metricsName, metricsDescription, metricsContext, metricsJmxContext);
      this.masterWrapper = masterWrapper;
    }
  
    @Override
    public void init() {
      super.init();
      clusterRequestsGauge = metricsRegistry.newGauge(CLUSTER_REQUESTS_NAME,
          "", 0l);
      ritGauge = metricsRegistry.newGauge(RIT_COUNT_NAME, "", 0l);
      ritCountOverThresholdGauge = metricsRegistry.newGauge(
          RIT_COUNT_OVER_THRESHOLD_NAME, "", 0l);
      ritOldestAgeGauge = metricsRegistry.newGauge(RIT_OLDEST_AGE_NAME, "", 0l);
    }
  
    @Override
    public void incRequests(final int inc) {
      this.clusterRequestsGauge.incr(inc);
    }
  
    @Override
    public void setEGIT(int egitCount) {
      ritGauge.set(egitCount);
    }
  
    @Override
    public void setEGITCountOverThreshold(int egitCount) {
      ritCountOverThresholdGauge.set(egitCount);
    }
  
    @Override
    public void setEGITOldestAge(long egitCount) {
      ritOldestAgeGauge.set(egitCount);
    }
  
    /**
     * Method to export all the metrics.
     * 
     * @param metricsBuilder Builder to accept metrics
     * @param all push all or only changed?
     */
    @Override
    public void getMetrics(MetricsBuilder metricsBuilder, boolean all) {
  
      MetricsRecordBuilder metricsRecordBuilder = metricsBuilder.addRecord(
          metricsName).setContext(metricsContext);
  
      // masterWrapper can be null because this function is called inside of init.
      if (masterWrapper != null) {
        metricsRecordBuilder
            .addGauge(MASTER_ACTIVE_TIME_NAME, MASTER_ACTIVE_TIME_DESC,
                masterWrapper.getActiveTime())
            .addGauge(MASTER_START_TIME_NAME, MASTER_START_TIME_DESC,
                masterWrapper.getStartTime())
            .addGauge(AVERAGE_LOAD_NAME, AVERAGE_LOAD_DESC,
                masterWrapper.getAverageLoad())
            .addGauge(NUM_FSERVERS_NAME, NUMBER_OF_FSERVERS_DESC,
                masterWrapper.getFServers())
            .addGauge(NUM_DEAD_FSERVERS_NAME, NUMBER_OF_DEAD_FSERVERS_DESC,
                masterWrapper.getDeadFServers())
            .tag(ZOOKEEPER_QUORUM_NAME, ZOOKEEPER_QUORUM_DESC,
                masterWrapper.getZookeeperQuorum())
            .tag(SERVER_NAME_NAME, SERVER_NAME_DESC,
                masterWrapper.getServerName())
            .tag(CLUSTER_ID_NAME, CLUSTER_ID_DESC, masterWrapper.getClusterId())
            .tag(IS_ACTIVE_MASTER_NAME, IS_ACTIVE_MASTER_DESC,
                String.valueOf(masterWrapper.getIsActiveMaster()));
      }
  
      metricsRegistry.snapshot(metricsRecordBuilder, all);
    }
  
  }
  