import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.http.HttpEntity;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.auth.BasicScheme;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
/**
* @Description: TODO
* @author: qinlei
* @date: 2020年05月28日 9:41
*/
public class MonitorRabbitmQ {
/**
* rabbitmq的http api 获取集群各个实例的状态信息,IP替换为自部署的相应实例的ip
*/
private static String RABBIT_NODES_STATUS_REST_URL="http://192.168.1.2:15672/api/nodes";
/**
* 获取集群用户信息,ip同上
*/
private static String RABBIT_USERS_REST_URL="http://192.168.1.2:15672/api/users";
/**
* rabbitmq的用户名
*/
private static String RABBIT_USER_NAME="qinlei";
/**
* rabbitmq的密码
*/
private static String RABBIT_USER_PASSWORD="qinlei";
/**
* 获取rabbitmq集群各个节点实例的状态信息
* @param url
* @param username
* @param password
* @return
* @throws IOException
*/
public static Map<String,ClusterStatus> fetchRabbitMQClusterStatus(String url,String username
,String password)throws IOException{
Map<String,ClusterStatus> clusterStatusMap = new HashMap<>();
String nodeData = getData(url,username,password);
JsonNode jsonNode = null;
try {
jsonNode = JsonUtil.toJsonNode(nodeData);
}catch (IOException e){
e.printStackTrace();;
}
Iterator<JsonNode> iterator = jsonNode.iterator();
while(iterator.hasNext()){
JsonNode next = iterator.next();
ClusterStatus status = new ClusterStatus();
status.setDiskFree(next.get("disk_free").asLong());
status.setFdUsed(next.get("fd_used").asLong());
status.setMemoryUsed(next.get("mem_used").asLong());
status.setProcUsed(next.get("proc_used").asLong());
status.setSocketUsed(next.get("sockets_used").asLong());
clusterStatusMap.put(next.get("name").asText(),status);
}
return clusterStatusMap;
}
/**
* 获取rabbitmq集群用户信息
* @param url
* @param username
* @param password
* @return
* @throws IOException
*/
public static Map<String,User> fetchRabbitMQUsers(String url,String username
,String password)throws IOException{
Map<String,User> userMap = new HashMap<>();
String nodeData = getData(url,username,password);
JsonNode jsonNode = null;
try {
jsonNode = JsonUtil.toJsonNode(nodeData);
}catch (IOException e){
e.printStackTrace();
}
Iterator<JsonNode> iterator = jsonNode.iterator();
while(iterator.hasNext()){
JsonNode next = iterator.next();
User user = new User();
user.setName(next.get("name").asText());
user.setTags(next.get("tags").asText());
userMap.put(next.get("name").asText(),user);
}
return userMap;
}
/**
* 向rabbitmq发送请求,获取响应数据
* @param url
* @param username
* @param password
* @return
* @throws IOException
*/
public static String getData(String url ,String username,String password)throws IOException {
CloseableHttpClient httpClient = HttpClients.createDefault();
UsernamePasswordCredentials creds = new UsernamePasswordCredentials(username,password);
HttpGet httpGet = new HttpGet();
httpGet.addHeader(BasicScheme.authenticate(creds,"UTF-8",false));
httpGet.setHeader("Content-Type","application/json");
CloseableHttpResponse response = httpClient.execute(httpGet);
try {
if(response.getStatusLine().getStatusCode()!=200){
System.out.println("http请求rabbitmq返回的code:"+response.getStatusLine().getStatusCode()
+",url:"+url);
}
HttpEntity entity = response.getEntity();
if(entity!=null){
return EntityUtils.toString(entity);
}
}finally{
response.close();
}
return null;
}
public static class JsonUtil{
private static ObjectMapper objectMapper = new ObjectMapper();
static {
objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
}
public static JsonNode toJsonNode(String jsonString) throws IOException{
return objectMapper.readTree(jsonString);
}
}
public static class User{
private String name;
private String tags;
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", tags='" + tags + '\'' +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTags() {
return tags;
}
public void setTags(String tags) {
this.tags = tags;
}
}
public static class ClusterStatus{
private long diskFree;
private long diskLimit;
private long fdUsed;
private long fdTotal;
private long socketUsed;
private long socketTotal;
private long memoryUsed;
private long memoryLimit;
private long procUsed;
private long procTotal;
public long getDiskFree() {
return diskFree;
}
public void setDiskFree(long diskFree) {
this.diskFree = diskFree;
}
public long getDiskLimit() {
return diskLimit;
}
public void setDiskLimit(long diskLimit) {
this.diskLimit = diskLimit;
}
public long getFdUsed() {
return fdUsed;
}
public void setFdUsed(long fdUsed) {
this.fdUsed = fdUsed;
}
public long getFdTotal() {
return fdTotal;
}
public void setFdTotal(long fdTotal) {
this.fdTotal = fdTotal;
}
public long getSocketUsed() {
return socketUsed;
}
public void setSocketUsed(long socketUsed) {
this.socketUsed = socketUsed;
}
public long getSocketTotal() {
return socketTotal;
}
public void setSocketTotal(long socketTotal) {
this.socketTotal = socketTotal;
}
public long getMemoryUsed() {
return memoryUsed;
}
public void setMemoryUsed(long memoryUsed) {
this.memoryUsed = memoryUsed;
}
public long getMemoryLimit() {
return memoryLimit;
}
public void setMemoryLimit(long memoryLimit) {
this.memoryLimit = memoryLimit;
}
public long getProcUsed() {
return procUsed;
}
public void setProcUsed(long procUsed) {
this.procUsed = procUsed;
}
public long getProcTotal() {
return procTotal;
}
public void setProcTotal(long procTotal) {
this.procTotal = procTotal;
}
}
}
测试
public static void main(String[] args) {
try {
//1.获取rabbitmq集群各个节点的实例信息
Map<String,ClusterStatus> clusterStatusMap =
fetchRabbitMQClusterStatus(RABBIT_NODES_STATUS_REST_URL,RABBIT_USER_NAME,
RABBIT_USER_PASSWORD);
//2.输出各个节点实例的状态信息
clusterStatusMap.entrySet().forEach(entry-> System.out.println(entry.getKey()+":"+entry.getValue()));
//3.获取rabbitmq集群用户信息
Map<String, User> userMap = fetchRabbitMQUsers(RABBIT_NODES_STATUS_REST_URL,
RABBIT_USER_NAME, RABBIT_USER_PASSWORD);
//4.输出各个节点实例的用户信息
userMap.entrySet().forEach(entry-> System.out.println(entry.getKey()+":"+entry.getValue()));
}catch (IOException e){
e.printStackTrace();
}
}