Just FYI for beginners like me: I've also write it with jython.
Getting attributes are more easier than invoke Operations.  I feel
jython will be a good option to create custom monitoring/management
tools.
#!/usr/bin/jython
#
# *** This is JYTHON script. You can't run it on CPython. ***

import sys;

import java.net.InetAddress;
import javax.management.MBeanServerConnection;
import javax.management.ObjectName;
import javax.management.openmbean.CompositeDataSupport;
import javax.management.openmbean.CompositeType;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;

if len(sys.argv) < 4:
    print "usage: getNaturalEndpoings.py host port keyspace key"
    exit(1)

(pname, host, port, keyspace, key) = sys.argv
url_spec = "service:jmx:rmi:///jndi/rmi://%s:%s/jmxrmi" % (host, port)


# Create JMXConnection with the URL spec and extract MBServerServerConnection
jmxurl = javax.management.remote.JMXServiceURL(url_spec)
jmxc = javax.management.remote.JMXConnectorFactory.connect(jmxurl)
mbsc = jmxc.getMBeanServerConnection();

mbname ="org.apache.cassandra.db:type=StorageService"

# It's a bit tricky:
# To invoke JMX method, we need to make argument array and signature array
# for the method.
# Array of signature represent type of each argument.
# For getNaturalEndpoints, 1st arg is java.lang.String, and
# 2nd args is byte array. "[B" is the signature for Java byte array.

opArgs = [keyspace, java.lang.String.getBytes(key, "UTF-8")]
opSignature = ["java.lang.String", "[B"]

# Invoke MBean Operation
nodes = mbsc.invoke(javax.management.ObjectName(mbname), "getNaturalEndpoints", opArgs, opSignature)

for node in nodes:
    print java.net.InetAddress.getHostAddress(node)

# Close JMX connection
jmxc.close()

Reply via email to