blob: 199aa4c3fc764e9535d2e484e14d233dfa3eb29b [file] [log] [blame]
/**
* 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.distributedlog.stats;
import org.apache.bookkeeper.client.BKException.Code;
import org.apache.bookkeeper.stats.Counter;
import org.apache.bookkeeper.stats.StatsLogger;
import java.util.HashMap;
import java.util.Map;
/**
* A Util to logger stats on bk exceptions.
*/
public class BKExceptionStatsLogger {
public static String getMessage(int code) {
switch (code) {
case Code.OK:
return "OK";
case Code.ReadException:
return "ReadException";
case Code.QuorumException:
return "QuorumException";
case Code.NoBookieAvailableException:
return "NoBookieAvailableException";
case Code.DigestNotInitializedException:
return "DigestNotInitializedException";
case Code.DigestMatchException:
return "DigestMatchException";
case Code.NotEnoughBookiesException:
return "NotEnoughBookiesException";
case Code.NoSuchLedgerExistsException:
return "NoSuchLedgerExistsException";
case Code.BookieHandleNotAvailableException:
return "BookieHandleNotAvailableException";
case Code.ZKException:
return "ZKException";
case Code.LedgerRecoveryException:
return "LedgerRecoveryException";
case Code.LedgerClosedException:
return "LedgerClosedException";
case Code.WriteException:
return "WriteException";
case Code.NoSuchEntryException:
return "NoSuchEntryException";
case Code.IncorrectParameterException:
return "IncorrectParameterException";
case Code.InterruptedException:
return "InterruptedException";
case Code.ProtocolVersionException:
return "ProtocolVersionException";
case Code.MetadataVersionException:
return "MetadataVersionException";
case Code.LedgerFencedException:
return "LedgerFencedException";
case Code.UnauthorizedAccessException:
return "UnauthorizedAccessException";
case Code.UnclosedFragmentException:
return "UnclosedFragmentException";
case Code.WriteOnReadOnlyBookieException:
return "WriteOnReadOnlyBookieException";
case Code.IllegalOpException:
return "IllegalOpException";
default:
return "UnexpectedException";
}
}
private final StatsLogger parentLogger;
private final Map<Integer, Counter> exceptionCounters;
public BKExceptionStatsLogger(StatsLogger parentLogger) {
this.parentLogger = parentLogger;
this.exceptionCounters = new HashMap<Integer, Counter>();
}
public Counter getExceptionCounter(int rc) {
Counter counter = exceptionCounters.get(rc);
if (null != counter) {
return counter;
}
// TODO: it would be better to have BKException.Code.get(rc)
synchronized (exceptionCounters) {
counter = exceptionCounters.get(rc);
if (null != counter) {
return counter;
}
counter = parentLogger.getCounter(getMessage(rc));
exceptionCounters.put(rc, counter);
}
return counter;
}
}