RabbitMQ的集群监控的方式

目录

前言

启动插件

tracing监控

Zabbix监控

自定义监控信息


 

前言

 

监控RabbitMQ有四种方式:启动插件、查看Track日志、自定义监控信息、使用第三方组件如Zabbix 

 

 

启动插件

 

这种办法用的很少,注意是自带的插件监控的粒度不够

rabbitmq-plugins enable rabbitmq_management 

RabbitMQ的集群监控的方式_第1张图片

 

 

tracing监控

 

之前有提到https://blog.csdn.net/Delicious_Life/article/details/107176014

 

 

Zabbix监控

 

Zabbix是一个基于WEB界面提供分布式系统监视以及网络监视功能的企业级开源解决方案,他也可以帮助我们搭建一个MQ集群的监控系统,同时提供预警等功能,但是由于其搭建配置要求比较高一般都是由运维人员负责搭建。

 

 

自定义监控信息

 

注意自定义监控信息会打印到程序控制台,有如下参数可选择 

RabbitMQ的集群监控的方式_第2张图片

具体使用需要导入jar包


    org.apache.httpcomponents
    httpclient
    4.3.6


 com.fasterxml.jackson.core
 jackson-databind
 2.7.4


 com.fasterxml.jackson.core
 jackson-annotations
 2.7.4


 com.fasterxml.jackson.core
 jackson-core
 2.7.4

编写实体类

    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;
​
        // 此处省略了Getter和Setter方法
        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;
        }
​
        @Override
        public String toString() {
            return "ClusterStatus{" +
                    "diskFree=" + diskFree +
                    ", diskLimit=" + diskLimit +
                    ", fdUsed=" + fdUsed +
                    ", fdTotal=" + fdTotal +
                    ", socketUsed=" + socketUsed +
                    ", socketTotal=" + socketTotal +
                    ", memoryUsed=" + memoryUsed +
                    ", memoryLimit=" + memoryLimit +
                    ", procUsed=" + procUsed +
                    ", procTotal=" + procTotal +
                    '}';
        }
​
    }

编写监控启动类

/**
 * RabbitMQ的监控
 */
public class MonitorRabbitMQ {
    //RabbitMQ的HTTP API——获取集群各个实例的状态信息,ip替换为自己部署相应实例的
    private static String RABBIT_NODES_STATUS_REST_URL = "http://192.168.13.111:15672/api/nodes";
    //RabbitMQ的HTTP API——获取集群用户信息,ip替换为自己部署相应实例的
    private static String RABBIT_USERS_REST_URL = "http://192.168.13.111:15672/api/users";
    //rabbitmq的用户名
    private static String RABBIT_USER_NAME = "guest";
    //rabbitmq的密码
    private static String RABBIT_USER_PWD = "guest";
​
    public static void main(String[] args) {
        try {
            //step1.获取rabbitmq集群各个节点实例的状态信息
            Map clusterMap =
                    fetchRabbtMQClusterStatus(RABBIT_NODES_STATUS_REST_URL, RABBIT_USER_NAME, RABBIT_USER_PWD);
​
            //step2.打印输出各个节点实例的状态信息
            for (Map.Entry entry : clusterMap.entrySet()) {
                System.out.println(entry.getKey() + " : " + entry.getValue());
            }
​
            //step3.获取rabbitmq集群用户信息
            Map userMap =
                    fetchRabbtMQUsers(RABBIT_USERS_REST_URL, RABBIT_USER_NAME, RABBIT_USER_PWD);
​
            //step4.打印输出rabbitmq集群用户信息
            for (Map.Entry entry : userMap.entrySet()) {
                System.out.println(entry.getKey() + " : " + entry.getValue());
            }
​
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
​
    public static Map fetchRabbtMQClusterStatus(String url, String username, String password) throws IOException {
        Map clusterStatusMap = new HashMap();
        String nodeData = getData(url, username, password);
        JsonNode jsonNode = null;
        try {
            jsonNode = JsonUtil.toJsonNode(nodeData);
        } catch (IOException e) {
            e.printStackTrace();
        }
        Iterator 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;
    }
​
    public static Map fetchRabbtMQUsers(String url, String username, String password) throws IOException {
        Map userMap = new HashMap();
        String nodeData = getData(url, username, password);
        JsonNode jsonNode = null;
        try {
            jsonNode = JsonUtil.toJsonNode(nodeData);
        } catch (IOException e) {
            e.printStackTrace();
        }
        Iterator 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;
    }
​
    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(url);
        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("call http api to get rabbitmq data return 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);
            //objectMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
        }
​
        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 +
                    '}';
        }
        //GET/SET方法省略
​
        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;
        }
    }
}

启动测试会把监控信息打印在控制台上

RabbitMQ的集群监控的方式_第3张图片

你可能感兴趣的:([RabbitMQ])