Changeset 576c59eb8d6e2ceec745959d2ccccb024d7f4324

Show
Ignore:
Timestamp:
09/04/11 16:08:15 (3 years ago)
Author:
neophenix <neophenix@gmail.com>
git-committer:
neophenix <neophenix@gmail.com> 1315152495 -0400
git-parent:

[b1133af9f85966fc31d2bee8a38cb7a8561807fe]

git-author:
neophenix <neophenix@gmail.com> 1315152495 -0400
Message:

fix JMX check to support proper metric names and more types of possible values

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • src/java/com/omniti/jezebel/check/jmx.java

    rb553f9a r576c59e  
    3939import java.util.Arrays; 
    4040import java.util.ArrayList; 
    41 import java.util.regex.Pattern
    42 import java.util.regex.Matcher; 
     41import java.util.List
     42import java.util.Iterator; 
    4343 
    4444import javax.management.MBeanServerConnection; 
     
    5050import javax.management.remote.JMXConnectorFactory; 
    5151import javax.management.remote.JMXServiceURL; 
     52import javax.management.AttributeList; 
     53import javax.management.Attribute; 
     54import javax.management.openmbean.CompositeData; 
     55import javax.management.openmbean.CompositeDataSupport; 
     56import javax.management.openmbean.CompositeType; 
     57import javax.management.openmbean.OpenType; 
     58import javax.management.openmbean.SimpleType; 
     59import javax.management.openmbean.TabularDataSupport; 
     60import java.lang.management.MemoryUsage; 
    5261 
    5362import com.omniti.jezebel.ResmonResult; 
     
    8897            } 
    8998 
    90             Pattern space = Pattern.compile("\\s"); 
    91              
    9299            for (ObjectName objectName : allObjectNames) { 
    93100                if ( ! domains.isEmpty() && ! domains.contains(objectName.getDomain()) ) { 
     
    97104                MBeanInfo mbi = mbsc.getMBeanInfo(objectName); 
    98105                MBeanAttributeInfo[] attribs = mbi.getAttributes(); 
    99                 String oname = ""; 
    100  
    101                 Hashtable<String,String> objectPropList = objectName.getKeyPropertyList(); 
    102                 if ( objectPropList.containsKey("name") ) { 
    103                     oname += objectPropList.get("name"); 
    104                 } 
    105                 if ( objectPropList.containsKey("type") ) { 
    106                     if ( ! oname.equals("") ) { 
    107                         oname += "`"; 
    108                     } 
    109                     oname += objectPropList.get("type"); 
    110                 } 
    111  
    112                 Matcher m = space.matcher(oname); 
    113                 oname = m.replaceAll("_"); 
    114  
    115                 for (MBeanAttributeInfo attr : attribs) 
    116                 { 
    117                     try { 
    118                         String mname = attr.getName(); 
    119                         Matcher m2 = space.matcher(mname); 
    120                         mname = m2.replaceAll("_"); 
    121  
    122                         if ( attr.getType().equals("java.lang.String") ) { 
    123                             String val = (String)mbsc.getAttribute(objectName, attr.getName()); 
    124                             if ( val.length() <= 256 ) { 
    125                                 rr.set(oname + "`" + mname, val); 
    126                             } 
    127                         } 
    128                         else if ( attr.getType().equals("int") ) { 
    129                             rr.set(oname + "`" + mname, (Integer)mbsc.getAttribute(objectName, attr.getName())); 
    130                         } 
    131                         else if ( attr.getType().equals("long") ) { 
    132                             rr.set(oname + "`" + mname, (Long)mbsc.getAttribute(objectName, attr.getName())); 
    133                         } 
    134                         else if ( attr.getType().equals("boolean") ) { 
    135                             Boolean val = (Boolean)mbsc.getAttribute(objectName, attr.getName()); 
    136                             rr.set(oname + "`" + mname, (val)?1:0); 
    137                         } 
    138                     } 
    139                     catch (Exception e) {} 
     106                String oname = objectName.getDomain() + ":" + objectName.getCanonicalKeyPropertyListString(); 
     107 
     108                String[] attributes = new String[attribs.length]; 
     109                int i = 0; 
     110                for (MBeanAttributeInfo attr : attribs) { 
     111                    attributes[i] = attr.getName(); 
     112                    ++i; 
     113                } 
     114 
     115                AttributeList al = mbsc.getAttributes(objectName, attributes); 
     116                List<Attribute> aal = al.asList(); 
     117 
     118                for (Attribute a : aal ) { 
     119                    getMetric(oname, a.getName(), a.getValue(), rr); 
    140120                } 
    141121            } 
     
    147127        } 
    148128    } 
     129 
     130    private void getMetric (String objectName, String metricName, Object value, ResmonResult rr) { 
     131        try { 
     132            if ( value == null ) return; 
     133 
     134            if ( value instanceof String ) { 
     135                String val = (String)value; 
     136                if ( val != null && val.length() <= 256 ) { 
     137                    rr.set(objectName + "`" + metricName, val); 
     138                } 
     139            } 
     140            else if ( value instanceof Integer ) { 
     141                rr.set(objectName + "`" + metricName, (Integer)value); 
     142            } 
     143            else if ( value instanceof Long ) { 
     144                rr.set(objectName + "`" + metricName, (Long)value); 
     145            } 
     146            else if ( value instanceof Boolean ) { 
     147                Boolean val = (Boolean)value; 
     148                rr.set(objectName + "`" + metricName, (val)?1:0); 
     149            } 
     150            else if ( value instanceof Double ) { 
     151                rr.set(objectName + "`" + metricName, (Double)value); 
     152            } 
     153            else if ( value instanceof Float ) { 
     154                rr.set(objectName + "`" + metricName, (Float)value); 
     155            } 
     156            else if ( value instanceof CompositeData ) { 
     157                CompositeType ct = ((CompositeData)value).getCompositeType(); 
     158                Set<String> keys = ct.keySet(); 
     159                for ( String key : keys ) { 
     160                    getMetric(objectName, metricName + "`" + key, ((CompositeData)value).get(key), rr); 
     161                } 
     162            } 
     163            else if ( value instanceof MemoryUsage ) { 
     164                rr.set(objectName + "`" + metricName + "`committed", ((MemoryUsage)value).getCommitted()); 
     165                rr.set(objectName + "`" + metricName + "`init", ((MemoryUsage)value).getInit()); 
     166                rr.set(objectName + "`" + metricName + "`max", ((MemoryUsage)value).getMax()); 
     167                rr.set(objectName + "`" + metricName + "`used", ((MemoryUsage)value).getUsed()); 
     168            } 
     169            else if ( value instanceof CompositeDataSupport ) { 
     170                CompositeDataSupport data = (CompositeDataSupport)value; 
     171                CompositeType type = data.getCompositeType(); 
     172                Set keys = type.keySet(); 
     173                for ( Iterator it = keys.iterator(); it.hasNext(); ) { 
     174                    String key = (String)it.next(); 
     175                    Object v = data.get(key); 
     176                    OpenType ot = type.getType(key); 
     177                    if ( ot instanceof SimpleType ) { 
     178                        if ( data.containsKey("key") ) { 
     179                            getMetric(objectName, metricName + "`" + data.get("key"), data.get("value"), rr); 
     180                        } 
     181                        else { 
     182                            getMetric(objectName, metricName + "`" + key, data.get(key), rr); 
     183                        } 
     184                    } 
     185                } 
     186            } 
     187            else if ( value instanceof TabularDataSupport ) { 
     188                TabularDataSupport data = (TabularDataSupport)value; 
     189                Set keys = data.keySet(); 
     190                for ( Iterator it = keys.iterator(); it.hasNext(); ) { 
     191                    Object key = it.next(); 
     192                    for ( Iterator ki = ((List) key).iterator(); ki.hasNext(); ) { 
     193                        Object key2 = ki.next(); 
     194                        CompositeData cd = data.get(new Object[] {key2}); 
     195                        Object v = cd.get("value"); 
     196                        OpenType ot = cd.getCompositeType().getType("value"); 
     197                        getMetric(objectName, metricName + "`" + key2, v, rr); 
     198                    } 
     199                } 
     200            } 
     201            else if ( value instanceof Map ) { 
     202                for ( Object entry : ((Map)value).entrySet() ) { 
     203                    Object key = ((Map.Entry<?,?>)entry).getKey(); 
     204                    Object v = ((Map.Entry<?,?>)entry).getValue(); 
     205                    getMetric(objectName, metricName, v, rr); 
     206                } 
     207            } 
     208            else if ( value.getClass().isArray() ) { 
     209                String t = value.getClass().getName().substring(1,2); 
     210                if ( t.equals("L") ) { 
     211                    Object[] vals = (Object[])value; 
     212                    for ( int i = 0, len = vals.length; i < len; ++i ) { 
     213                        getMetric(objectName, metricName + "`" + i, vals[i], rr); 
     214                    } 
     215                } 
     216                else { 
     217                    ArrayList<Object> list = new ArrayList<Object>(0); 
     218                    if ( t.equals("Z") ) { 
     219                        boolean[] vals = (boolean[])value; 
     220                        list = new ArrayList<Object>(vals.length); 
     221                        for ( boolean v : vals ) { list.add(v); } 
     222                    } 
     223                    else if ( t.equals("B") ) { 
     224                        byte[] vals = (byte[])value; 
     225                        list = new ArrayList<Object>(vals.length); 
     226                        for ( byte v : vals ) { list.add(v); } 
     227                    } 
     228                    else if ( t.equals("C") ) { 
     229                        char[] vals = (char[])value; 
     230                        list = new ArrayList<Object>(vals.length); 
     231                        for ( char v : vals ) { list.add(v); } 
     232                    } 
     233                    else if ( t.equals("D") ) { 
     234                        double[] vals = (double[])value; 
     235                        list = new ArrayList<Object>(vals.length); 
     236                        for ( double v : vals ) { list.add(v); } 
     237                    } 
     238                    else if ( t.equals("F") ) { 
     239                        float[] vals = (float[])value; 
     240                        list = new ArrayList<Object>(vals.length); 
     241                        for ( float v : vals ) { list.add(v); } 
     242                    } 
     243                    else if ( t.equals("I") ) {  
     244                        int[] vals = (int[])value; 
     245                        list = new ArrayList<Object>(vals.length); 
     246                        for ( int v : vals ) { list.add(v); } 
     247                    } 
     248                    else if ( t.equals("J") ) { 
     249                        long[] vals = (long[])value; 
     250                        list = new ArrayList<Object>(vals.length); 
     251                        for ( long v : vals ) { list.add(v); } 
     252                    } 
     253                    else if ( t.equals("S") ) { 
     254                        short[] vals = (short[])value; 
     255                        list = new ArrayList<Object>(vals.length); 
     256                        for ( short v : vals ) { list.add(v); } 
     257                    } 
     258 
     259                    for ( int i = 0, len = list.size(); i < len; ++i ) { 
     260                        getMetric(objectName, metricName + "`" + i, list.get(i), rr); 
     261                    } 
     262                } 
     263            } 
     264            else { 
     265                System.err.println("Error, could not handle. name: " + objectName+"`"+metricName + " type: " + value.getClass().getName()); 
     266            } 
     267        } 
     268        catch (Exception e) { System.err.println("Exception: " + objectName+"`"+metricName + " " + e.getMessage()); } 
     269    } 
    149270}