package com.enonic.cms.web.status.builders; import org.codehaus.jackson.node.ObjectNode; import org.elasticsearch.action.admin.cluster.node.info.NodeInfo; import org.elasticsearch.action.admin.cluster.state.ClusterStateResponse; import org.elasticsearch.cluster.node.DiscoveryNode; import org.elasticsearch.cluster.node.DiscoveryNodes; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.enonic.cms.core.search.ElasticSearchIndexService; import com.enonic.cms.web.status.StatusInfoBuilder; @Component public final class ClusterStatusInfoBuilder extends StatusInfoBuilder { @Autowired private ElasticSearchIndexService elasticSearchIndexService; public ClusterStatusInfoBuilder() { super( "cluster" ); } @Override public void build( final ObjectNode json ) { final ClusterStateResponse clusterState; try { clusterState = elasticSearchIndexService.getClusterState(); } catch ( Exception e ) { json.put( "exception", exceptionToString( e ) ); return; } if ( clusterState == null ) { json.put( "error", "not able to get cluster state" ); return; } json.put( "clusterName", clusterState.getClusterName().value() ); final DiscoveryNodes clusterMembers = clusterState.getState().getNodes(); final String masterNodeId = clusterMembers.getMasterNodeId(); final ObjectNode localNodeObject = json.putObject( "localNode" ); final NodeInfo localNodeInfo; try { localNodeInfo = elasticSearchIndexService.getLocalNodeInfo(); } catch ( Exception e ) { json.put( "exception", exceptionToString( e ) ); return; } if ( localNodeInfo == null ) { json.put( "error", "not able to get localNodeInfo" ); return; } final String localNodeId = localNodeInfo.getNode().getId(); localNodeObject.put( "id", localNodeId ); localNodeObject.put( "hostName", localNodeInfo.getHostname() ); localNodeObject.put( "master", Boolean.toString( masterNodeId.equals( localNodeId ) ) ); localNodeObject.put( "numberOfNodesSeen", clusterMembers.size() ); final ObjectNode nodesObject = json.putObject( "members" ); for ( DiscoveryNode node : clusterMembers ) { final ObjectNode thisNode = nodesObject.putObject( node.getId() ); buildNodeInfo( masterNodeId, node, thisNode ); } } private void buildNodeInfo( final String masterNodeId, final DiscoveryNode node, final ObjectNode thisNode ) { thisNode.put( "name", node.getName() ); thisNode.put( "id", node.getId() ); thisNode.put( "address", node.getAddress().toString() ); thisNode.put( "version", node.getVersion().toString() ); thisNode.put( "master", Boolean.toString( node.getId().equals( masterNodeId ) ) ); } }