RabbitMQ(9)-REST API監控RabbitMQ

一.介紹

Nagiosjava

Nagios健康檢測是一個獨立的程序,它在運行時監控服務並在程序終止運行時退出代碼來指示服務的健康狀態,能夠用任何語言來編寫,檢測程序能夠將可讀狀態打印到stdout上,返回四種整型退出代碼:ios

0----OK:接收檢測的服務正常運行apache

1----WARNING:服務運行遇到問題,但並不緊急,好比內存到了監控閥值或者檢測的隊列屬性錯誤等json

2----CRITICAL:服務關閉無響應,而且超過受監控的臨界值api

3----UNKONWN:服務的狀態或者監控的度量值沒法肯定app

二.實戰

1.工具類:

import com.rabbitmq.client.ConnectionFactory;

public class RabbitMQUtils extends ConnectionFactory{
    //定義Nagios的健康狀態值
    public static final Integer EXIT_OK=0;
    public static final Integer EXIT_WARNING=1;
    public static final Integer EXIT_CRITICAL=2;
    public static final Integer EXIT_UNKNOWN=3;
    public static ConnectionFactory getFactory(){
        ConnectionFactory factory = new ConnectionFactory();
        factory.setPort(5670);
        factory.setHost("192.168.111.131");
        factory.setUsername("admin");
        factory.setPassword("admin");
        return factory;
    }
}

2.非REST API方式檢測:

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.demo.inaction.utils.RabbitMQUtils;

public class AMQPPingCheck {

    public static void main(String[] args) {
        ConnectionFactory factory = RabbitMQUtils.getFactory();
        Connection connection = null;
        try {
            connection = factory.newConnection();
            Channel channel = connection.createChannel();
        } catch (Exception e) {
            System.out.println("Could not connect to "+factory.getHost()+":"+factory.getPort());
            System.exit(RabbitMQUtils.EXIT_CRITICAL);
            e.printStackTrace();
        }
        System.out.println("OK! Connect to "+factory.getHost()+":"+factory.getPort()+" successful ");
        System.exit(RabbitMQUtils.EXIT_OK);
    }
}

3.REST API方式檢測:

import com.rabbitmq.demo.inaction.utils.RabbitMQUtils;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import sun.misc.BASE64Encoder;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;

public class RESTAMQPPingCheck {
    private static final String USERNAME="admin";
    private static final String PASSWORD="admin";
    //%2F表明"/"(默認的vhost)
    private static final String URL="http://192.168.111.128:15672/api/aliveness-test/%2F";
    public static void main(String[] args) throws UnsupportedEncodingException {
        HttpResponse response = null;
        int statusCode = 0;
        try {
            DefaultHttpClient Client = new DefaultHttpClient();
            HttpGet httpGet = new HttpGet(URL);
            String up = USERNAME+":"+PASSWORD;
            //設置憑證
            String credentials = new BASE64Encoder().encode(up.getBytes("UTF-8"));
            httpGet.setHeader("Authorization","Basic "+credentials);
            response = Client.execute(httpGet);
            //讀取響應內容
            BufferedReader breader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
            StringBuilder responseString = new StringBuilder();
            String line = null;
            while ((line = breader.readLine()) !=null) {
                responseString.append(line);
            }
            breader.close();
            String repsonseStr =responseString.toString();
            statusCode = response.getStatusLine().getStatusCode();
            System.out.println("statusCode="+statusCode+" repsonseStr =" + repsonseStr);
        } catch (Exception e) {
            System.out.println("Could not connect to "+URL);
            System.exit(RabbitMQUtils.EXIT_CRITICAL);
            e.printStackTrace();
        }
        //響應碼大於299要麼表明錯誤,要麼就是發送給客戶端額外的指令
        if(statusCode>299){
            System.out.println("Critical:Broker not alive:"+statusCode);
            System.exit(RabbitMQUtils.EXIT_CRITICAL);
        }
        System.out.println("OK! Connect to "+URL+" successful ");
        System.exit(RabbitMQUtils.EXIT_OK);
    }
}

4.檢測配置文件的修改:

import com.alibaba.fastjson.JSON;
import com.rabbitmq.demo.inaction.utils.RabbitMQUtils;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import sun.misc.BASE64Encoder;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;

public class RESTTestQueueConfiguration {
    private static final String USERNAME="admin";
    private static final String PASSWORD="admin";
    private static final String QUEUE="myqueue";
    //%2F表明"/"(默認的vhost)
    private static final String URL="http://192.168.111.128:15672/api/queues/%2F/"+QUEUE;
    public static void main(String[] args) throws UnsupportedEncodingException {
        HttpResponse response = null;
        int statusCode = 0;
        String auto_delete = null, repsonseStr=null,durable = null;
        try {
            DefaultHttpClient Client = new DefaultHttpClient();
            HttpGet httpGet = new HttpGet(URL);
            String up = USERNAME+":"+PASSWORD;
            //設置憑證
            String credentials = new BASE64Encoder().encode(up.getBytes("UTF-8"));
            httpGet.setHeader("Authorization","Basic "+credentials);
            response = Client.execute(httpGet);
            //讀取響應內容
            BufferedReader breader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
            StringBuilder responseString = new StringBuilder();
            String line = null;
            while ((line = breader.readLine()) !=null) {
                responseString.append(line);
            }
            breader.close();
            repsonseStr = responseString.toString();
            auto_delete = JSON.parseObject(repsonseStr).getString("auto_delete");
            durable = JSON.parseObject(repsonseStr).getString("durable");
            statusCode = response.getStatusLine().getStatusCode();
            System.out.println("statusCode="+statusCode+" repsonseStr =" + repsonseStr);
        } catch (Exception e) {
            System.out.println("Could not connect to "+URL);
            System.exit(RabbitMQUtils.EXIT_CRITICAL);
            e.printStackTrace();
        }
        //隊列不存在的狀況
        if(statusCode==404){
            System.out.println("Critical:Queue "+QUEUE+" does not exist");
            System.exit(RabbitMQUtils.EXIT_CRITICAL);
        }
        if(statusCode>299){
            System.out.println("Unexpected API error :"+repsonseStr);
            System.exit(RabbitMQUtils.EXIT_UNKNOWN);
        }
        //檢測auto_delete或者durable屬性不對應則警告
        if(auto_delete!="false"){
            System.out.println("WARN: Queue "+QUEUE+"-auto_delete flag is not false");
            System.exit(RabbitMQUtils.EXIT_WARNING);
        }if(durable!="true"){
            System.out.println("WARN: Queue "+QUEUE+"-durable flag is not true");
            System.exit(RabbitMQUtils.EXIT_WARNING);
        }
        System.out.println("OK! Connect to "+URL+" successful ");
        System.exit(RabbitMQUtils.EXIT_OK);
    }
}
相關文章
相關標籤/搜索