Friday 5 August 2016

Karaf monitoring using Java

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();
}
}

2 comments: