Improve report output.

This commit is contained in:
sk89q 2015-01-13 02:23:06 -08:00
parent 547e89b85d
commit 8cc7bcc849
4 changed files with 101 additions and 0 deletions

View File

@ -70,4 +70,9 @@ public boolean test(ItemStack itemStack) {
return test(new MaterialTarget(itemStack.getTypeId(), itemStack.getDurability())); return test(new MaterialTarget(itemStack.getTypeId(), itemStack.getDurability()));
} }
@Override
public String toString() {
return entries.toString();
}
} }

View File

@ -19,14 +19,36 @@
package com.sk89q.worldguard.bukkit.util.report; package com.sk89q.worldguard.bukkit.util.report;
import com.google.common.base.Optional;
import com.google.common.reflect.TypeToken;
import com.sk89q.guavabackport.cache.CacheBuilder;
import com.sk89q.guavabackport.cache.CacheLoader;
import com.sk89q.guavabackport.cache.LoadingCache;
import com.sk89q.worldguard.util.report.DataReport; import com.sk89q.worldguard.util.report.DataReport;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.scheduler.BukkitTask; import org.bukkit.scheduler.BukkitTask;
import javax.annotation.Nullable;
import java.lang.reflect.Field;
import java.util.List; import java.util.List;
import java.util.Set;
public class SchedulerReport extends DataReport { public class SchedulerReport extends DataReport {
private LoadingCache<Class<?>, Optional<Field>> taskFieldCache = CacheBuilder.newBuilder()
.build(new CacheLoader<Class<?>, Optional<Field>>() {
@Override
public Optional<Field> load(Class<?> clazz) throws Exception {
try {
Field field = clazz.getDeclaredField("task");
field.setAccessible(true);
return Optional.fromNullable(field);
} catch (NoSuchFieldException ignored) {
return Optional.absent();
}
}
});
public SchedulerReport() { public SchedulerReport() {
super("Scheduler"); super("Scheduler");
@ -35,10 +57,32 @@ public SchedulerReport() {
append("Pending Task Count", tasks.size()); append("Pending Task Count", tasks.size());
for (BukkitTask task : tasks) { for (BukkitTask task : tasks) {
Class<?> taskClass = getTaskClass(task);
DataReport report = new DataReport("Task: #" + task.getTaskId()); DataReport report = new DataReport("Task: #" + task.getTaskId());
report.append("Owner", task.getOwner().getName()); report.append("Owner", task.getOwner().getName());
report.append("Runnable", taskClass != null ? taskClass.getName() : "<Unknown>");
report.append("Synchronous?", task.isSync()); report.append("Synchronous?", task.isSync());
append(report.getTitle(), report); append(report.getTitle(), report);
} }
} }
@SuppressWarnings("unchecked")
@Nullable
private Class<?> getTaskClass(BukkitTask task) {
Class<?> clazz = task.getClass();
Set<Class<?>> classes = (Set) TypeToken.of(clazz).getTypes().rawTypes();
try {
for (Class<?> type : classes) {
Optional<Field> field = taskFieldCache.getUnchecked(type);
if (field.isPresent()) {
return field.get().get(task).getClass();
}
}
} catch (IllegalAccessException ignored) {
}
return null;
}
} }

View File

@ -37,6 +37,8 @@ public ServerReport() {
append("Implementation", server.getVersion()); append("Implementation", server.getVersion());
append("Player Count", "%d/%d", BukkitUtil.getOnlinePlayers().size(), server.getMaxPlayers()); append("Player Count", "%d/%d", BukkitUtil.getOnlinePlayers().size(), server.getMaxPlayers());
append("Server Class Source", server.getClass().getProtectionDomain().getCodeSource().getLocation());
DataReport spawning = new DataReport("Spawning"); DataReport spawning = new DataReport("Spawning");
spawning.append("Ambient Spawn Limit", server.getAmbientSpawnLimit()); spawning.append("Ambient Spawn Limit", server.getAmbientSpawnLimit());
spawning.append("Animal Spawn Limit", server.getAnimalSpawnLimit()); spawning.append("Animal Spawn Limit", server.getAnimalSpawnLimit());

View File

@ -19,12 +19,21 @@
package com.sk89q.worldguard.util.report; package com.sk89q.worldguard.util.report;
import java.lang.management.*;
import java.util.List;
import java.util.concurrent.TimeUnit;
public class SystemInfoReport extends DataReport { public class SystemInfoReport extends DataReport {
public SystemInfoReport() { public SystemInfoReport() {
super("System Information"); super("System Information");
Runtime runtime = Runtime.getRuntime(); Runtime runtime = Runtime.getRuntime();
RuntimeMXBean runtimeBean = ManagementFactory.getRuntimeMXBean();
ClassLoadingMXBean classLoadingBean = ManagementFactory.getClassLoadingMXBean();
List<GarbageCollectorMXBean> gcBeans = ManagementFactory.getGarbageCollectorMXBeans();
OperatingSystemMXBean osBean = ManagementFactory.getOperatingSystemMXBean();
ThreadMXBean threadBean = ManagementFactory.getThreadMXBean();
append("Java", "%s %s (%s)", append("Java", "%s %s (%s)",
System.getProperty("java.vendor"), System.getProperty("java.vendor"),
@ -38,6 +47,47 @@ public SystemInfoReport() {
append("Free Memory", runtime.freeMemory() / 1024 / 1024 + " MB"); append("Free Memory", runtime.freeMemory() / 1024 / 1024 + " MB");
append("Max Memory", runtime.maxMemory() / 1024 / 1024 + " MB"); append("Max Memory", runtime.maxMemory() / 1024 / 1024 + " MB");
append("Total Memory", runtime.totalMemory() / 1024 / 1024 + " MB"); append("Total Memory", runtime.totalMemory() / 1024 / 1024 + " MB");
append("System Load Average", osBean.getSystemLoadAverage());
append("Java Uptime", TimeUnit.MINUTES.convert(runtimeBean.getUptime(), TimeUnit.MILLISECONDS) + " minutes");
DataReport startup = new DataReport("Startup");
startup.append("Input Arguments", runtimeBean.getInputArguments());
startup.append("Boot Class Path", runtimeBean.getBootClassPath());
startup.append("Library Path", runtimeBean.getLibraryPath());
append(startup.getTitle(), startup);
DataReport vm = new DataReport("Virtual Machine");
vm.append("Name", runtimeBean.getVmName());
vm.append("Vendor", runtimeBean.getVmVendor());
vm.append("Version", runtimeBean.getVmVendor());
append(vm.getTitle(), vm);
DataReport spec = new DataReport("Specification");
spec.append("Name", runtimeBean.getSpecName());
spec.append("Vendor", runtimeBean.getSpecVendor());
spec.append("Version", runtimeBean.getSpecVersion());
append(spec.getTitle(), spec);
DataReport classLoader = new DataReport("Class Loader");
classLoader.append("Loaded Class Count", classLoadingBean.getLoadedClassCount());
classLoader.append("Total Loaded Class Count", classLoadingBean.getTotalLoadedClassCount());
classLoader.append("Unloaded Class Count", classLoadingBean.getUnloadedClassCount());
append(classLoader.getTitle(), classLoader);
DataReport gc = new DataReport("Garbage Collectors");
for (GarbageCollectorMXBean bean : gcBeans) {
DataReport thisGC = new DataReport(bean.getName());
thisGC.append("Collection Count", bean.getCollectionCount());
thisGC.append("Collection Time", bean.getCollectionTime() + "ms");
gc.append(thisGC.getTitle(), thisGC);
}
append(gc.getTitle(), gc);
DataReport threads = new DataReport("Threads");
for (ThreadInfo threadInfo : threadBean.dumpAllThreads(false, false)) {
threads.append("#" + threadInfo.getThreadId() + " " + threadInfo.getThreadName(), threadInfo.getThreadState());
}
append(threads.getTitle(), threads);
} }
} }