/**
* 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.stats;
import com.codahale.metrics.Timer;
import com.codahale.metrics.MetricRegistry;
import static com.codahale.metrics.MetricRegistry.name;
import org.apache.bookkeeper.stats.Counter;
import org.apache.bookkeeper.stats.Gauge;
import org.apache.bookkeeper.stats.OpStatsLogger;
import org.apache.bookkeeper.stats.StatsLogger;
public class CodahaleStatsLogger implements StatsLogger {
protected final String basename;
final MetricRegistry metrics;
CodahaleStatsLogger(MetricRegistry metrics, String basename) {
this.metrics = metrics;
this.basename = basename;
}
@Override
public OpStatsLogger getOpStatsLogger(String statName) {
Timer success = metrics.timer(name(basename, statName));
Timer failure = metrics.timer(name(basename, statName+"-fail"));
return new CodahaleOpStatsLogger(success, failure);
}
@Override
public Counter getCounter(String statName) {
final com.codahale.metrics.Counter c = metrics.counter(name(basename, statName));
return new Counter() {
@Override
public synchronized void clear() {
long cur = c.getCount();
c.dec(cur);
}
@Override
public Long get() {
return c.getCount();
}
@Override
public void inc() {
c.inc();
}
@Override
public void dec() {
c.dec();
}
@Override
public void add(long delta) {
c.inc(delta);
}
};
}
@Override
public <T extends Number> void registerGauge(final String statName, final Gauge<T> gauge) {
String metricName = name(basename, statName);
metrics.remove(metricName);
metrics.register(metricName, new com.codahale.metrics.Gauge<T>() {
@Override
public T getValue() {
return gauge.getSample();
}
});
}
@Override
public StatsLogger scope(String scope) {
String scopeName;
if (0 == basename.length()) {
scopeName = scope;
} else {
scopeName = name(basename, scope);
}
return new CodahaleStatsLogger(metrics, scopeName);
}
}