Vishal Sharma
Vishal Sharma

Reputation: 1750

Using Cassandra Metrics for monitoring

I have been using Cassandra and its C++ driver to write APIs to insert and fetch data for some time now. However now that I've created my cluster, I want to develop monitoring tools for my cluster.

I want to build an application(preferably in C++ and I don't want to use a 3rd party application), which will store Cluster management specific attributes like memory utilization of each node in the cluster, latency of each operation, space occupied by each table on each node etc. I read about 'Metrics in Cassandra(https://cassandra.apache.org/doc/latest/operating/metrics.html) but I don't know how exactly to use them in building my application as I've not worked on Java before(excuse me for that!). Can such application be built using C++? If it's a lot of work in C++, then it will be highly beneficial if you can share some Java code where these Cassandra Metrics have been used to monitor a Cassandra Cluster.

OS: RHEL Cassandra version: 3.11.2

Upvotes: 2

Views: 1886

Answers (2)

Chris Hinshaw
Chris Hinshaw

Reputation: 7255

Cassandra 3.x uses the drop wizard api as you alluded to. If you can add the Jolokia jars to your deployment server(s) this will allow you to access the java jmx data using a simple http request. Jolokia exposes all the mbeans from java over a rest api.

Upvotes: 2

Mikhail Baksheev
Mikhail Baksheev

Reputation: 1414

It seems, there are no any c++ libs for JMX, but in Java it is pretty easy to get JMX metrics, all of you need is standard jdk. The following code demonstrates how to connect to cassandra node and get 'down' node count.

import java.util.HashMap;
import java.util.Map;

import javax.management.MBeanServerConnection;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;

public class Main {
    public static void main( String[] args ) throws Exception {
        String node = args[0];
        String port = args[1];
        String username = args[2];
        String password = args[3];

        JMXServiceURL url = new JMXServiceURL( "service:jmx:rmi:///jndi/rmi://" + node + ":" + port + "/jmxrmi" );
        String[] credentials = {username, password};

        Map<String, String[]> environment = new HashMap<>();
        environment.put( JMXConnector.CREDENTIALS, credentials );
        JMXConnector jmxConnector = JMXConnectorFactory.connect( url, environment );
        MBeanServerConnection mbsc = jmxConnector.getMBeanServerConnection();//Get metrics bean
        ObjectName oName = new ObjectName( "org.apache.cassandra.net:type=FailureDetector" );//create JMX object name
        int downNodes = (int) mbsc.getAttribute( oName, "DownEndpointCount" ); //get number of unavailable nodes

        System.out.println("Down node count: " + downNodes);
    }
}

More details about jmx you can find in Oracle documentation

To obtain JMX object names and attribute names you can use jconsole tool, which is shipped together with jdk:

enter image description here

Upvotes: 1

Related Questions