Karaf monitoring using Java
Here you go with sample program!
package com.sample.factory;
import java.lang.management.ClassLoadingMXBean;
import java.lang.management.GarbageCollectorMXBean;
import java.lang.management.ManagementFactory;
import java.lang.management.MemoryMXBean;
import java.lang.management.OperatingSystemMXBean;
import java.lang.management.RuntimeMXBean;
import java.lang.management.ThreadMXBean;
import java.lang.reflect.Method;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Properties;
import org.apache.karaf.bundle.core.BundleInfo;
import org.apache.karaf.bundle.core.BundleService;
import org.apache.karaf.bundle.core.BundleState;
import org.apache.karaf.shell.commands.InfoProvider;
import org.apache.karaf.shell.commands.Option;
import org.apache.karaf.shell.table.Row;
import org.apache.karaf.shell.table.ShellTable;
import org.fusesource.jansi.Ansi;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.startlevel.FrameworkStartLevel;
import com.owlike.genson.convert.DefaultConverters.PrimitiveConverterFactory.booleanConverter;
/**
*
* @author vimal.m@bdbizviz.com
*
*/
public class NodeInfoAction {
private NumberFormat fmtI = new DecimalFormat("###,###", new DecimalFormatSymbols(Locale.ENGLISH));
private NumberFormat fmtD = new DecimalFormat("###,##0.000", new DecimalFormatSymbols(Locale.ENGLISH));
private List<InfoProvider> infoProviders = new LinkedList<InfoProvider>();
int bundleLevelThreshold = -1;
boolean dontShowName;
boolean showLoc;
boolean showSymbolic;
boolean showUpdate;
boolean showRevisions;
boolean noFormat;
private static BundleContext bundleContext;
private BundleService bundleService;
public NodeInfoAction() {
}
public NodeInfoAction(int bundleLevelThreshold, boolean dontShowName,
boolean showLoc, boolean showSymbolic, boolean showUpdate,
boolean showRevisions, boolean noFormat) {
this.bundleLevelThreshold = bundleLevelThreshold;
this.dontShowName = dontShowName;
this.showLoc = showLoc;
this.showSymbolic = showSymbolic;
this.showUpdate = showUpdate;
this.showRevisions = showRevisions;
this.noFormat = noFormat;
}
public NodeInfoAction(BundleContext context) {
bundleContext = context;
}
private BundleContext getBundleContext() {
return bundleContext;
}
public void setBundleService(BundleService bundleService) {
this.bundleService = bundleService;
}
public void init() {
try {
doExecute();
} catch (Exception e) {
e.printStackTrace();
}
}
protected Object doExecute() throws Exception {
int maxNameLen = 25;
RuntimeMXBean runtime = ManagementFactory.getRuntimeMXBean();
OperatingSystemMXBean os = ManagementFactory.getOperatingSystemMXBean();
ThreadMXBean threads = ManagementFactory.getThreadMXBean();
MemoryMXBean mem = ManagementFactory.getMemoryMXBean();
ClassLoadingMXBean cl = ManagementFactory.getClassLoadingMXBean();
// print Karaf informations //
System.out.println("Karaf");
printValue("Karaf name", maxNameLen, System.getProperty("karaf.name"));
printValue("Karaf version", maxNameLen, System.getProperty("karaf.version"));
printValue("Karaf home", maxNameLen, System.getProperty("karaf.home"));
printValue("Karaf base", maxNameLen, System.getProperty("karaf.base"));
printValue("Karaf etc", maxNameLen, System.getProperty("karaf.etc"));
printValue("OSGi Framework", maxNameLen, bundleContext.getBundle(0).getSymbolicName() + " - " +
bundleContext.getBundle(0).getVersion());
System.out.println();
System.out.println("JVM");
printValue("Java Virtual Machine", maxNameLen, runtime.getVmName() + " version " + runtime.getVmVersion());
printValue("Version", maxNameLen, System.getProperty("java.version"));
printValue("Vendor", maxNameLen, runtime.getVmVendor());
printValue("Pid", maxNameLen, getPid());
printValue("Uptime", maxNameLen, printDuration(runtime.getUptime()));
try {
printValue("Container CPU load", maxNameLen, String.valueOf(getInt(((getSunOsValueAsDouble(os, "getProcessCpuLoad") * 1000) / 10.0))+"%"));
printValue("System CPU load", maxNameLen, String.valueOf(getInt(((getSunOsValueAsDouble(os, "getSystemCpuLoad") * 1000) / 10.0))+"%"));
} catch (Exception t) {
t.printStackTrace();
}
printValue("Total compile time", maxNameLen, printDuration(ManagementFactory.getCompilationMXBean().getTotalCompilationTime()));
System.out.println("Threads");
printValue("Live threads", maxNameLen, Integer.toString(threads.getThreadCount()));
printValue("Daemon threads", maxNameLen, Integer.toString(threads.getDaemonThreadCount()));
printValue("Peak", maxNameLen, Integer.toString(threads.getPeakThreadCount()));
printValue("Total started", maxNameLen, Long.toString(threads.getTotalStartedThreadCount()));
System.out.println("Memory");
printValue("Current heap size", maxNameLen, printSizeInKb(mem.getHeapMemoryUsage().getUsed()));
printValue("Maximum heap size", maxNameLen, printSizeInKb(mem.getHeapMemoryUsage().getMax()));
printValue("Committed heap size", maxNameLen, printSizeInKb(mem.getHeapMemoryUsage().getCommitted()));
printValue("Pending objects", maxNameLen, Integer.toString(mem.getObjectPendingFinalizationCount()));
for (GarbageCollectorMXBean gc : ManagementFactory.getGarbageCollectorMXBeans()) {
String val = "Name = '" + gc.getName() + "', Collections = " + gc.getCollectionCount() + ", Time = " + printDuration(gc.getCollectionTime());
printValue("Garbage collector", maxNameLen, val);
}
System.out.println("Classes");
printValue("Current classes loaded", maxNameLen, printLong(cl.getLoadedClassCount()));
printValue("Total classes loaded", maxNameLen, printLong(cl.getTotalLoadedClassCount()));
printValue("Total classes unloaded", maxNameLen, printLong(cl.getUnloadedClassCount()));
System.out.println("Operating system");
printValue("Name", maxNameLen, os.getName() + " version " + os.getVersion());
printValue("Architecture", maxNameLen, os.getArch());
printValue("Processors", maxNameLen, Integer.toString(os.getAvailableProcessors()));
try {
printValue("Total physical memory", maxNameLen, printSizeInKb(getSunOsValueAsLong(os, "getTotalPhysicalMemorySize")));
printValue("Free physical memory", maxNameLen, printSizeInKb(getSunOsValueAsLong(os, "getFreePhysicalMemorySize")));
printValue("Committed virtual memory", maxNameLen, printSizeInKb(getSunOsValueAsLong(os, "getCommittedVirtualMemorySize")));
printValue("Total swap space", maxNameLen, printSizeInKb(getSunOsValueAsLong(os, "getTotalSwapSpaceSize")));
printValue("Free swap space", maxNameLen, printSizeInKb(getSunOsValueAsLong(os, "getFreeSwapSpaceSize")));
} catch (Exception t) {
t.printStackTrace();
}
//Display Information from external information providers.
Map<String, Map<Object, Object>> properties = new HashMap<String, Map<Object, Object>>();
if (infoProviders != null) {
for (InfoProvider provider : infoProviders) {
if (!properties.containsKey(provider.getName())) {
properties.put(provider.getName(), new Properties());
}
properties.get(provider.getName()).putAll(provider.getProperties());
}
List<String> sections = new ArrayList<String>(properties.keySet());
Collections.sort(sections);
for (String section : sections) {
List<Object> keys = new ArrayList<Object>(properties.get(section).keySet());
if (keys.size() > 0) {
System.out.println(section);
Collections.sort(keys, new Comparator<Object>() {
public int compare(Object o1, Object o2) {
return String.valueOf(o1).compareTo(String.valueOf(o2));
}
});
for (Object key : keys) {
printValue(String.valueOf(key), maxNameLen, String.valueOf(properties.get(section).get(key)));
}
}
}
}
System.out.println("Bundle Informations");
Bundle[] bundles = getBundleContext().getBundles();
if (bundles == null) {
System.out.println("There are no installed bundles.");
return null;
}
determineBundleLevelThreshold();
// Display active start level.
FrameworkStartLevel fsl = getBundleContext().getBundle(0).adapt(FrameworkStartLevel.class);
if (fsl != null) {
System.out.println("START LEVEL " + fsl.getStartLevel() + " , List Threshold: " + bundleLevelThreshold);
}
ShellTable table = new ShellTable();
table.column("ID").alignRight();
table.column("State");
table.column("Lvl").alignRight();
table.column("Version");
if (!dontShowName) {
table.column("Name");
}
if (showLoc) {
table.column("Location");
}
if (showSymbolic) {
table.column("Symbolic name");
}
if (showUpdate) {
table.column("Update location");
}
if (showRevisions) {
table.column("Revisions");
}
for (int i = 0; i < bundles.length; i++) {
Bundle bundle = bundles[i];
BundleInfo info = this.bundleService.getInfo(bundle);
if (info.getStartLevel() >= bundleLevelThreshold) {
ArrayList<Object> rowData = new ArrayList<Object>();
rowData.add(info.getBundleId());
rowData.add(getStateString(info.getState()));
rowData.add(info.getStartLevel());
rowData.add(info.getVersion());
if (!dontShowName) {
String bundleName = (info.getName() == null) ? info.getSymbolicName() : info.getName();
bundleName = (bundleName == null) ? info.getUpdateLocation() : bundleName;
String name = bundleName + printFragments(info) + printHosts(info);
rowData.add(name);
}
if (showLoc) {
rowData.add(info.getUpdateLocation());
}
if (showSymbolic) {
rowData.add(info.getSymbolicName() == null ? "<no symbolic name>" : info.getSymbolicName());
}
if (showUpdate) {
rowData.add(info.getUpdateLocation());
}
if (showRevisions) {
rowData.add(info.getRevisions());
}
Row row = table.addRow();
row.addContent(rowData);
}
}
table.print(System.out, !noFormat);
return null;
}
private String printHosts(BundleInfo info) {
if (info.getFragmentHosts().size() <= 0) {
return "";
}
StringBuilder builder = new StringBuilder();
builder.append(", Hosts: ");
boolean first = true;
for (Bundle host : info.getFragmentHosts()) {
builder.append((first ? "" : ", ") + host.getBundleId());
first = false;
}
return builder.toString();
}
private String printFragments(BundleInfo info) {
if (info.getFragments().size() <= 0) {
return "";
}
StringBuilder builder = new StringBuilder();
builder.append(", Fragments: ");
boolean first = true;
for (Bundle host : info.getFragments()) {
builder.append((first ? "" : ", ") + host.getBundleId());
first = false;
}
return builder.toString();
}
private String getStateString(BundleState state) {
return (state == null) ? "" : state.toString();
}
private void determineBundleLevelThreshold() {
final String sbslProp = getBundleContext().getProperty("karaf.systemBundlesStartLevel");
if (sbslProp != null) {
try {
if (bundleLevelThreshold < 0) {
bundleLevelThreshold = Integer.valueOf(sbslProp);
}
} catch (Exception ignore) {
// ignore
}
}
}
private Integer getInt(double d) {
int val = (int) d;
return val;
}
private String printLong(long i) {
return fmtI.format(i);
}
private String printSizeInKb(double size) {
return fmtI.format((long) (size / 1024)) + " kbytes";
}
private Double getSunOsValueAsDouble(OperatingSystemMXBean os, String name) throws Exception {
Method mth = os.getClass().getMethod(name);
mth.setAccessible(true);
// val = (long) ((d * 1000) / 10.0);
return (Double) mth.invoke(os);
}
private Long getSunOsValueAsLong(OperatingSystemMXBean os, String name) throws Exception {
Method mth = os.getClass().getMethod(name);
mth.setAccessible(true);
return (Long) mth.invoke(os);
}
protected String printDuration(double uptime) {
uptime /= 1000;
if (uptime < 60) {
return fmtD.format(uptime) + " seconds";
}
uptime /= 60;
if (uptime < 60) {
long minutes = (long) uptime;
String s = fmtI.format(minutes) + (minutes > 1 ? " minutes" : " minute");
return s;
}
uptime /= 60;
if (uptime < 24) {
long hours = (long) uptime;
long minutes = (long) ((uptime - hours) * 60);
String s = fmtI.format(hours) + (hours > 1 ? " hours" : " hour");
if (minutes != 0) {
s += " " + fmtI.format(minutes) + (minutes > 1 ? " minutes" : " minute");
}
return s;
}
uptime /= 24;
long days = (long) uptime;
long hours = (long) ((uptime - days) * 24);
String s = fmtI.format(days) + (days > 1 ? " days" : " day");
if (hours != 0) {
s += " " + fmtI.format(hours) + (hours > 1 ? " hours" : " hour");
}
return s;
}
private String getPid() {
String name = ManagementFactory.getRuntimeMXBean().getName();
String[] parts = name.split("@");
return parts[0];
}
void printValue(String name, int pad, String value) {
System.out.println(Ansi.ansi().a(" ")
.a(Ansi.Attribute.INTENSITY_BOLD).a(name).a(spaces(pad - name.length())).a(Ansi.Attribute.RESET)
.a(" ").a(value).toString());
}
String spaces(int nb) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < nb; i++) {
sb.append(' ');
}
return sb.toString();
}
}
This program will work with Karaf 3.0.7 +
ReplyDeleteI liked your blog thanks for sharing this.
ReplyDelete