blob: 326f92b581c277c42eb23f1d389a1f1931cf90c9 [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 com.twitter.distributedlog.stats;
import org.apache.bookkeeper.stats.StatsLogger;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
/**
* Stats logger to log exceptions happened in {@link com.twitter.distributedlog.readahead.ReadAheadWorker}.
* They are counters of exceptions happened on each read ahead phase:
* <code>`scope`/exceptions/`phase`/`code`</code>. `scope` is the current scope of
* stats logger, `phase` is the read ahead phase, while `code` is the exception code. Check
* {@link com.twitter.distributedlog.readahead.ReadAheadPhase} for details about phases and
* {@link BKExceptionStatsLogger} for details about `code`.
*/
public class ReadAheadExceptionsLogger {
private final StatsLogger statsLogger;
private StatsLogger parentExceptionStatsLogger;
private final ConcurrentMap<String, BKExceptionStatsLogger> exceptionStatsLoggers =
new ConcurrentHashMap<String, BKExceptionStatsLogger>();
public ReadAheadExceptionsLogger(StatsLogger statsLogger) {
this.statsLogger = statsLogger;
}
public BKExceptionStatsLogger getBKExceptionStatsLogger(String phase) {
// initialize the parent exception stats logger lazily
if (null == parentExceptionStatsLogger) {
parentExceptionStatsLogger = statsLogger.scope("exceptions");
}
BKExceptionStatsLogger exceptionStatsLogger = exceptionStatsLoggers.get(phase);
if (null == exceptionStatsLogger) {
exceptionStatsLogger = new BKExceptionStatsLogger(parentExceptionStatsLogger.scope(phase));
BKExceptionStatsLogger oldExceptionStatsLogger =
exceptionStatsLoggers.putIfAbsent(phase, exceptionStatsLogger);
if (null != oldExceptionStatsLogger) {
exceptionStatsLogger = oldExceptionStatsLogger;
}
}
return exceptionStatsLogger;
}
}