org.forstdb.StatisticsCollector Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of forstjni Show documentation
Show all versions of forstjni Show documentation
ForSt fat jar with modifications specific for Apache Flink that contains .so files for linux32 and linux64 (glibc and musl-libc), jnilib files
for Mac OSX, and a .dll for Windows x64.
// Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
// This source code is licensed under both the GPLv2 (found in the
// COPYING file in the root directory) and Apache 2.0 License
// (found in the LICENSE.Apache file in the root directory).
package org.forstdb;
import java.util.List;
import java.util.concurrent.Executors;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.TimeUnit;
/**
* Helper class to collect DB statistics periodically at a period specified in
* constructor. Callback function (provided in constructor) is called with
* every statistics collection.
*
* Caller should call start() to start statistics collection. Shutdown() should
* be called to stop stats collection and should be called before statistics (
* provided in constructor) reference has been disposed.
*/
public class StatisticsCollector {
private final List _statsCollectorInputList;
private final ExecutorService _executorService;
private final int _statsCollectionInterval;
private volatile boolean _isRunning = true;
/**
* Constructor for statistics collector.
*
* @param statsCollectorInputList List of statistics collector input.
* @param statsCollectionIntervalInMilliSeconds Statistics collection time
* period (specified in milliseconds).
*/
public StatisticsCollector(
final List statsCollectorInputList,
final int statsCollectionIntervalInMilliSeconds) {
_statsCollectorInputList = statsCollectorInputList;
_statsCollectionInterval = statsCollectionIntervalInMilliSeconds;
_executorService = Executors.newSingleThreadExecutor();
}
public void start() {
_executorService.submit(collectStatistics());
}
/**
* Shuts down statistics collector.
*
* @param shutdownTimeout Time in milli-seconds to wait for shutdown before
* killing the collection process.
* @throws java.lang.InterruptedException thrown if Threads are interrupted.
*/
public void shutDown(final int shutdownTimeout) throws InterruptedException {
_isRunning = false;
_executorService.shutdownNow();
// Wait for collectStatistics runnable to finish so that disposal of
// statistics does not cause any exceptions to be thrown.
_executorService.awaitTermination(shutdownTimeout, TimeUnit.MILLISECONDS);
}
@SuppressWarnings("PMD.CloseResource")
private Runnable collectStatistics() {
return () -> {
while (_isRunning) {
try {
if (Thread.currentThread().isInterrupted()) {
break;
}
for (final StatsCollectorInput statsCollectorInput : _statsCollectorInputList) {
final Statistics statistics = statsCollectorInput.getStatistics();
final StatisticsCollectorCallback statsCallback = statsCollectorInput.getCallback();
// Collect ticker data
for (final TickerType ticker : TickerType.values()) {
if (ticker != TickerType.TICKER_ENUM_MAX) {
final long tickerValue = statistics.getTickerCount(ticker);
statsCallback.tickerCallback(ticker, tickerValue);
}
}
// Collect histogram data
for (final HistogramType histogramType : HistogramType.values()) {
if (histogramType != HistogramType.HISTOGRAM_ENUM_MAX) {
final HistogramData histogramData = statistics.getHistogramData(histogramType);
statsCallback.histogramCallback(histogramType, histogramData);
}
}
}
Thread.sleep(_statsCollectionInterval);
} catch (final InterruptedException e) {
Thread.currentThread().interrupt();
break;
} catch (final Exception e) {
throw new RuntimeException("Error while calculating statistics", e);
}
}
};
}
}