/**
* Copyright 2016 Yahoo Inc.
*
* Licensed 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.yahoo.pulsar.broker.stats;
import java.util.stream.Collectors;
import org.apache.bookkeeper.mledger.impl.EntryCacheImpl;
import com.google.common.collect.Lists;
import com.yahoo.pulsar.common.stats.AllocatorStats;
import com.yahoo.pulsar.common.stats.AllocatorStats.PoolArenaStats;
import com.yahoo.pulsar.common.stats.AllocatorStats.PoolChunkListStats;
import com.yahoo.pulsar.common.stats.AllocatorStats.PoolChunkStats;
import com.yahoo.pulsar.common.stats.AllocatorStats.PoolSubpageStats;
import io.netty.buffer.PoolArenaMetric;
import io.netty.buffer.PoolChunkListMetric;
import io.netty.buffer.PoolChunkMetric;
import io.netty.buffer.PoolSubpageMetric;
import io.netty.buffer.PooledByteBufAllocator;
public class AllocatorStatsGenerator {
public static AllocatorStats generate(String allocatorName) {
PooledByteBufAllocator allocator = null;
if ("default".equals(allocatorName)) {
allocator = PooledByteBufAllocator.DEFAULT;
} else if ("ml-cache".equals(allocatorName)) {
allocator = EntryCacheImpl.allocator;
} else {
throw new IllegalArgumentException("Invalid allocator name : " + allocatorName);
}
AllocatorStats stats = new AllocatorStats();
stats.directArenas = allocator.directArenas().stream().map(x -> newPoolArenaStats(x))
.collect(Collectors.toList());
stats.heapArenas = allocator.heapArenas().stream().map(x -> newPoolArenaStats(x)).collect(Collectors.toList());
stats.numDirectArenas = allocator.numDirectArenas();
stats.numHeapArenas = allocator.numHeapArenas();
stats.numThreadLocalCaches = allocator.numThreadLocalCaches();
stats.normalCacheSize = allocator.normalCacheSize();
stats.smallCacheSize = allocator.smallCacheSize();
stats.tinyCacheSize = allocator.tinyCacheSize();
return stats;
}
private static PoolArenaStats newPoolArenaStats(PoolArenaMetric m) {
PoolArenaStats stats = new PoolArenaStats();
stats.numTinySubpages = m.numTinySubpages();
stats.numSmallSubpages = m.numSmallSubpages();
stats.numChunkLists = m.numChunkLists();
stats.tinySubpages = m.tinySubpages().stream().map(x -> newPoolSubpageStats(x)).collect(Collectors.toList());
stats.smallSubpages = m.smallSubpages().stream().map(x -> newPoolSubpageStats(x)).collect(Collectors.toList());
stats.chunkLists = m.chunkLists().stream().map(x -> newPoolChunkListStats(x)).collect(Collectors.toList());
stats.numAllocations = m.numAllocations();
stats.numTinyAllocations = m.numTinyAllocations();
stats.numSmallAllocations = m.numSmallAllocations();
stats.numNormalAllocations = m.numNormalAllocations();
stats.numHugeAllocations = m.numHugeAllocations();
stats.numDeallocations = m.numDeallocations();
stats.numTinyDeallocations = m.numTinyDeallocations();
stats.numSmallDeallocations = m.numSmallDeallocations();
stats.numNormalDeallocations = m.numNormalDeallocations();
stats.numHugeDeallocations = m.numHugeDeallocations();
stats.numActiveAllocations = m.numActiveAllocations();
stats.numActiveTinyAllocations = m.numActiveTinyAllocations();
stats.numActiveSmallAllocations = m.numActiveSmallAllocations();
stats.numActiveNormalAllocations = m.numActiveNormalAllocations();
stats.numActiveHugeAllocations = m.numActiveHugeAllocations();
return stats;
}
private static PoolSubpageStats newPoolSubpageStats(PoolSubpageMetric m) {
PoolSubpageStats stats = new PoolSubpageStats();
stats.maxNumElements = m.maxNumElements();
stats.numAvailable = m.numAvailable();
stats.elementSize = m.elementSize();
stats.pageSize = m.pageSize();
return stats;
}
private static PoolChunkListStats newPoolChunkListStats(PoolChunkListMetric m) {
PoolChunkListStats stats = new PoolChunkListStats();
stats.minUsage = m.minUsage();
stats.maxUsage = m.maxUsage();
stats.chunks = Lists.newArrayList();
m.forEach(chunk -> stats.chunks.add(newPoolChunkStats(chunk)));
return stats;
}
private static PoolChunkStats newPoolChunkStats(PoolChunkMetric m) {
PoolChunkStats stats = new PoolChunkStats();
stats.usage = m.usage();
stats.chunkSize = m.chunkSize();
stats.freeBytes = m.freeBytes();
return stats;
}
}