/*
 *
 * 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.bookkeeper.client;

import org.apache.bookkeeper.client.impl.BookKeeperClientStatsImpl;
import org.apache.bookkeeper.stats.Counter;
import org.apache.bookkeeper.stats.Gauge;
import org.apache.bookkeeper.stats.OpStatsLogger;
import org.apache.bookkeeper.stats.StatsLogger;

/**
 * List of constants for defining client stats names.
 */
public interface BookKeeperClientStats {
    String CATEGORY_CLIENT = "client";

    String CLIENT_SCOPE = "bookkeeper_client";

    // Metadata Operations

    String CREATE_OP = "LEDGER_CREATE";
    String DELETE_OP = "LEDGER_DELETE";
    String OPEN_OP = "LEDGER_OPEN";
    String RECOVER_OP = "LEDGER_RECOVER";
    String LEDGER_RECOVER_READ_ENTRIES = "LEDGER_RECOVER_READ_ENTRIES";
    String LEDGER_RECOVER_ADD_ENTRIES = "LEDGER_RECOVER_ADD_ENTRIES";
    String LEDGER_ENSEMBLE_BOOKIE_DISTRIBUTION = "LEDGER_ENSEMBLE_BOOKIE_DISTRIBUTION";

    // Data Operations

    String ADD_OP = "ADD_ENTRY";
    String ADD_OP_UR = "ADD_ENTRY_UR"; // Under Replicated during AddEntry.
    String FORCE_OP = "FORCE"; // Number of force ledger operations
    String READ_OP = "READ_ENTRY";
    // Corrupted entry (Digest Mismatch/ Under Replication) detected during ReadEntry
    String READ_OP_DM = "READ_ENTRY_DM";
    String WRITE_LAC_OP = "WRITE_LAC";
    String READ_LAC_OP = "READ_LAC";
    String READ_LAST_CONFIRMED_AND_ENTRY = "READ_LAST_CONFIRMED_AND_ENTRY";
    String READ_LAST_CONFIRMED_AND_ENTRY_RESPONSE = "READ_LAST_CONFIRMED_AND_ENTRY_RESPONSE";
    String PENDING_ADDS = "NUM_PENDING_ADD";
    String ENSEMBLE_CHANGES = "NUM_ENSEMBLE_CHANGE";
    String LAC_UPDATE_HITS = "LAC_UPDATE_HITS";
    String LAC_UPDATE_MISSES = "LAC_UPDATE_MISSES";
    String GET_BOOKIE_INFO_OP = "GET_BOOKIE_INFO";
    String SPECULATIVE_READ_COUNT = "SPECULATIVE_READ_COUNT";
    String READ_REQUESTS_REORDERED = "READ_REQUESTS_REORDERED";
    String GET_LIST_OF_ENTRIES_OF_LEDGER_OP = "GET_LIST_OF_ENTRIES_OF_LEDGER";

    // per channel stats
    String CHANNEL_SCOPE = "per_channel_bookie_client";

    String CHANNEL_READ_OP = "READ_ENTRY";
    String CHANNEL_TIMEOUT_READ = "TIMEOUT_READ_ENTRY";
    String CHANNEL_ADD_OP = "ADD_ENTRY";
    String CHANNEL_TIMEOUT_ADD = "TIMEOUT_ADD_ENTRY";
    String CHANNEL_WRITE_LAC_OP = "WRITE_LAC";
    String CHANNEL_FORCE_OP = "FORCE";
    String CHANNEL_TIMEOUT_WRITE_LAC = "TIMEOUT_WRITE_LAC";
    String CHANNEL_TIMEOUT_FORCE = "TIMEOUT_FORCE";
    String CHANNEL_READ_LAC_OP = "READ_LAC";
    String CHANNEL_TIMEOUT_READ_LAC = "TIMEOUT_READ_LAC";
    String TIMEOUT_GET_BOOKIE_INFO = "TIMEOUT_GET_BOOKIE_INFO";
    String CHANNEL_START_TLS_OP = "START_TLS";
    String CHANNEL_TIMEOUT_START_TLS_OP = "TIMEOUT_START_TLS";
    String TIMEOUT_GET_LIST_OF_ENTRIES_OF_LEDGER = "TIMEOUT_GET_LIST_OF_ENTRIES_OF_LEDGER";

    String NETTY_EXCEPTION_CNT = "NETTY_EXCEPTION_CNT";
    String CLIENT_CHANNEL_WRITE_WAIT = "CLIENT_CHANNEL_WRITE_WAIT";
    String CLIENT_CONNECT_TIMER = "CLIENT_CONNECT_TIMER";
    String ADD_OP_OUTSTANDING = "ADD_OP_OUTSTANDING";
    String READ_OP_OUTSTANDING = "READ_OP_OUTSTANDING";
    String NETTY_OPS = "NETTY_OPS";
    String ACTIVE_NON_TLS_CHANNEL_COUNTER = "ACTIVE_NON_TLS_CHANNEL_COUNTER";
    String ACTIVE_TLS_CHANNEL_COUNTER = "ACTIVE_TLS_CHANNEL_COUNTER";
    String FAILED_CONNECTION_COUNTER = "FAILED_CONNECTION_COUNTER";
    String FAILED_TLS_HANDSHAKE_COUNTER = "FAILED_TLS_HANDSHAKE_COUNTER";

    // placementpolicy stats
    String NUM_WRITABLE_BOOKIES_IN_DEFAULT_RACK = "NUM_WRITABLE_BOOKIES_IN_DEFAULT_RACK";
    String WRITE_DELAYED_DUE_TO_NOT_ENOUGH_FAULT_DOMAINS = "WRITE_DELAYED_DUE_TO_NOT_ENOUGH_FAULT_DOMAINS";
    String WRITE_DELAYED_DUE_TO_NOT_ENOUGH_FAULT_DOMAINS_LATENCY =
            "WRITE_DELAYED_DUE_TO_NOT_ENOUGH_FAULT_DOMAINS_LATENCY";
    String WRITE_TIMED_OUT_DUE_TO_NOT_ENOUGH_FAULT_DOMAINS = "WRITE_TIME_OUT_DUE_TO_NOT_ENOUGH_FAULT_DOMAINS";
    String NUM_WRITABLE_BOOKIES_IN_DEFAULT_FAULTDOMAIN = "NUM_WRITABLE_BOOKIES_IN_DEFAULT_FAULTDOMAIN";

    String BOOKIE_LABEL = "bookie";

    OpStatsLogger getCreateOpLogger();
    OpStatsLogger getOpenOpLogger();
    OpStatsLogger getDeleteOpLogger();
    OpStatsLogger getRecoverOpLogger();
    OpStatsLogger getReadOpLogger();
    OpStatsLogger getReadLacAndEntryOpLogger();
    OpStatsLogger getReadLacAndEntryRespLogger();
    OpStatsLogger getAddOpLogger();
    OpStatsLogger getForceOpLogger();
    OpStatsLogger getWriteLacOpLogger();
    OpStatsLogger getReadLacOpLogger();
    OpStatsLogger getRecoverAddCountLogger();
    OpStatsLogger getRecoverReadCountLogger();
    Counter getReadOpDmCounter();
    Counter getAddOpUrCounter();
    Counter getSpeculativeReadCounter();
    Counter getEnsembleBookieDistributionCounter(String bookie);
    Counter getEnsembleChangeCounter();
    Counter getLacUpdateHitsCounter();
    Counter getLacUpdateMissesCounter();
    OpStatsLogger getClientChannelWriteWaitLogger();
    OpStatsLogger getWriteDelayedDueToNotEnoughFaultDomainsLatency();
    Counter getWriteDelayedDueToNotEnoughFaultDomains();
    Counter getWriteTimedOutDueToNotEnoughFaultDomains();
    void registerPendingAddsGauge(Gauge<Integer> gauge);

    static BookKeeperClientStats newInstance(StatsLogger stats) {
        return new BookKeeperClientStatsImpl(stats);
    }

}
