/**
 * 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.ozone.container.common.transport.server.ratis;

import com.google.common.annotations.VisibleForTesting;
import org.apache.hadoop.classification.InterfaceAudience;
import org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos;
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.MutableCounterLong;
import org.apache.hadoop.metrics2.lib.MutableRate;
import org.apache.hadoop.metrics2.lib.MetricsRegistry;
import org.apache.ratis.protocol.RaftGroupId;

/**
 * This class is for maintaining Container State Machine statistics.
 */
@InterfaceAudience.Private
@Metrics(about="Container State Machine Metrics", context="dfs")
public class CSMMetrics {
  public static final String SOURCE_NAME =
      CSMMetrics.class.getSimpleName();

  // ratis op metrics metrics
  private @Metric MutableCounterLong numWriteStateMachineOps;
  private @Metric MutableCounterLong numQueryStateMachineOps;
  private @Metric MutableCounterLong numApplyTransactionOps;
  private @Metric MutableCounterLong numReadStateMachineOps;
  private @Metric MutableCounterLong numBytesWrittenCount;
  private @Metric MutableCounterLong numBytesCommittedCount;

  private @Metric MutableRate transactionLatency;
  private MutableRate[] opsLatency;
  private MetricsRegistry registry = null;

  // Failure Metrics
  private @Metric MutableCounterLong numWriteStateMachineFails;
  private @Metric MutableCounterLong numWriteDataFails;
  private @Metric MutableCounterLong numQueryStateMachineFails;
  private @Metric MutableCounterLong numApplyTransactionFails;
  private @Metric MutableCounterLong numReadStateMachineFails;
  private @Metric MutableCounterLong numReadStateMachineMissCount;
  private @Metric MutableCounterLong numStartTransactionVerifyFailures;
  private @Metric MutableCounterLong numContainerNotOpenVerifyFailures;

  private @Metric MutableRate applyTransaction;
  private @Metric MutableRate writeStateMachineData;

  public CSMMetrics() {
    int numCmdTypes = ContainerProtos.Type.values().length;
    this.opsLatency = new MutableRate[numCmdTypes];
    this.registry = new MetricsRegistry(CSMMetrics.class.getSimpleName());
    for (int i = 0; i < numCmdTypes; i++) {
      opsLatency[i] = registry.newRate(
          ContainerProtos.Type.forNumber(i + 1).toString(),
          ContainerProtos.Type.forNumber(i + 1) + " op");
    }
  }

  public static CSMMetrics create(RaftGroupId gid) {
    MetricsSystem ms = DefaultMetricsSystem.instance();
    return ms.register(SOURCE_NAME + gid.toString(),
        "Container State Machine",
        new CSMMetrics());
  }

  public void incNumWriteStateMachineOps() {
    numWriteStateMachineOps.incr();
  }

  public void incNumQueryStateMachineOps() {
    numQueryStateMachineOps.incr();
  }

  public void incNumReadStateMachineOps() {
    numReadStateMachineOps.incr();
  }

  public void incNumApplyTransactionsOps() {
    numApplyTransactionOps.incr();
  }

  public void incNumWriteStateMachineFails() {
    numWriteStateMachineFails.incr();
  }

  public void incNumWriteDataFails() {
    numWriteDataFails.incr();
  }

  public void incNumQueryStateMachineFails() {
    numQueryStateMachineFails.incr();
  }

  public void incNumBytesWrittenCount(long value) {
    numBytesWrittenCount.incr(value);
  }

  public void incNumBytesCommittedCount(long value) {
    numBytesCommittedCount.incr(value);
  }

  public void incNumReadStateMachineFails() {
    numReadStateMachineFails.incr();
  }

  public void incNumReadStateMachineMissCount() {
    numReadStateMachineMissCount.incr();
  }

  public void incNumApplyTransactionsFails() {
    numApplyTransactionFails.incr();
  }

  @VisibleForTesting
  public long getNumWriteStateMachineOps() {
    return numWriteStateMachineOps.value();
  }

  @VisibleForTesting
  public long getNumQueryStateMachineOps() {
    return numQueryStateMachineOps.value();
  }

  @VisibleForTesting
  public long getNumApplyTransactionsOps() {
    return numApplyTransactionOps.value();
  }

  @VisibleForTesting
  public long getNumWriteStateMachineFails() {
    return numWriteStateMachineFails.value();
  }

  @VisibleForTesting
  public long getNumWriteDataFails() {
    return numWriteDataFails.value();
  }

  @VisibleForTesting
  public long getNumQueryStateMachineFails() {
    return numQueryStateMachineFails.value();
  }

  @VisibleForTesting
  public long getNumApplyTransactionsFails() {
    return numApplyTransactionFails.value();
  }

  @VisibleForTesting
  public long getNumReadStateMachineFails() {
    return numReadStateMachineFails.value();
  }

  @VisibleForTesting
  public long getNumReadStateMachineMissCount() {
    return numReadStateMachineMissCount.value();
  }

  @VisibleForTesting
  public long getNumReadStateMachineOps() {
    return numReadStateMachineOps.value();
  }

  @VisibleForTesting
  public long getNumBytesWrittenCount() {
    return numBytesWrittenCount.value();
  }

  @VisibleForTesting
  public long getNumBytesCommittedCount() {
    return numBytesCommittedCount.value();
  }

  public MutableRate getApplyTransactionLatency() {
    return applyTransaction;
  }

  public void incPipelineLatency(ContainerProtos.Type type, long latencyNanos) {
    opsLatency[type.ordinal()].add(latencyNanos);
    transactionLatency.add(latencyNanos);
  }

  public void incNumStartTransactionVerifyFailures() {
    numStartTransactionVerifyFailures.incr();
  }

  public void incNumContainerNotOpenVerifyFailures() {
    numContainerNotOpenVerifyFailures.incr();
  }

  public void recordApplyTransactionCompletion(long latencyNanos) {
    applyTransaction.add(latencyNanos);
  }

  public void recordWriteStateMachineCompletion(long latencyNanos) {
    writeStateMachineData.add(latencyNanos);
  }

  public void unRegister() {
    MetricsSystem ms = DefaultMetricsSystem.instance();
    ms.unregisterSource(SOURCE_NAME);
  }
}
