package com.bytedance.hadoop.hdfs.server.proxy;

import org.apache.hadoop.classification.InterfaceAudience;
import org.apache.hadoop.classification.InterfaceStability;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hdfs.DFSConfigKeys;
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 org.apache.hadoop.metrics2.lib.MutableCounterLong;
import org.apache.hadoop.metrics2.source.JvmMetrics;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import static org.apache.hadoop.metrics2.impl.MsInfo.ProcessName;
import static org.apache.hadoop.metrics2.impl.MsInfo.SessionId;

/** */
@InterfaceAudience.Private
@InterfaceStability.Evolving
@Metrics(name = "ProxyActivity", about = "NameNode proxy metrics", context = "nnproxy")
public class ProxyMetrics {
    final MetricsRegistry registry = new MetricsRegistry("nnproxy");

    private static final Logger LOG = LoggerFactory.getLogger(ProxyMetrics.class);

    @Metric
    public MutableCounterLong throttledOps;
    @Metric
    public MutableCounterLong successOps;
    @Metric
    public MutableCounterLong failedOps;

    JvmMetrics jvmMetrics = null;

    ProxyMetrics(String processName, String sessionId, final JvmMetrics jvmMetrics) {
        this.jvmMetrics = jvmMetrics;
        registry.tag(ProcessName, processName).tag(SessionId, sessionId);
    }

    public static ProxyMetrics create(Configuration conf) {
        String sessionId = conf.get(DFSConfigKeys.DFS_METRICS_SESSION_ID_KEY);
        String processName = "NNPROXY";
        MetricsSystem ms = DefaultMetricsSystem.instance();
        JvmMetrics jm = JvmMetrics.create(processName, sessionId, ms);

        return ms.register(new ProxyMetrics(processName, sessionId, jm));
    }

}