spring boot 스케줄러, slack 을 이용한 Health check 본문

프로그램/JAVA

spring boot 스케줄러, slack 을 이용한 Health check

반응형

특정 웹서비스가 잘 동작하고 있는지를 판단하여 

문제가 발생했을때, Slack 메신저에 메세지를 발송해서 알 수 있는 방법을 만들어 볼 예정이다.

 

전체적인 셋팅 및 개발 방식은 대략 아래와 같다.

1. Slack 에 호출 받을 환경을 셋팅 ( Spring boot에서 호출할 채널 url 설정)

2. Spring boot 에서 스케줄러를 이용하여 특정 간격으로 http 서비스가 살아있는지 체크

3. 문제가 발생한 경우,  1번에서 세팅한 url 채널로 특정 문구를 발송하여 Slack에서 확인


우선, Slack 에서의 설정 방법이다.

Slack 앱(프로그램) 을 열고  제일 상단 좌측의 메뉴를 선택 > 이동 > 앱 을 선택한다.

우측에 앱이 조회되는데 상단 검색을 이용해서 'webhooks'를 조회하면 두개가 나오는데 그중에 'Incoming WebHooks'를 추가한다.

 

브라우저에서 아래 화면이 뜨면 'Slack에 추가' 버튼을 눌러서 추가한다.

 

slack에 추가한 뒤에 a) 채널 선택,  웹후크 Url 복사 또는 재생성, 발송의 구분을 위한 대표 이름을 입력해준다.

그리고 설정 저장을 하면  Slack의 환경 세팅은 끝난다.

 

채널 선택 팝업

 

 

우선 체크를 하는 스케줄러를 먼저 아래와 같이 만든다.

    @Scheduled(cron = "0 0/5 * * * *")
    public void healthCheck() {
        logger.info("BatchJobScheduler.healthCheck() is called.");
        
        URL url = null;

        try {
            url = new URL("http://localhost:8080/login");
            
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            
            //http 요청에 필요한 타입 정의 실시
            //conn.setRequestProperty("Accept", "application/json");
            conn.setRequestMethod("GET");
            
            //http 요청 실시
            conn.connect();
            
            //http 요청 응답 코드 확인 실시
            responseCode = String.valueOf(conn.getResponseCode());
            System.out.println("url http 응답 코드 : "+responseCode);
            
            if(!"200".equals(responseCode)) {
                messageSend("error");
            }
            conn.disconnect();
        
        } catch (Exception e) {
            // TODO Auto-generated catch block
            //e.printStackTrace();
            messageSend("econt");
        }
    }

 

스케줄러에서 200으로 응답을 못 받을 때에 별도 아래 메소드를 이용해서 POST로 웹 후크 URL로 호출만 하면 된다.

payload={"text": "보낼 메세지 내용"}

public void messageSend(String errorGubun) {
	
	String message = "";
	String channel_url = "";
	
	if("error".equals(errorGubun)) {
		message = "서버 응답오류 발생. 확인 바랍니다.";
		channel_url = "https://hooks.slack.com/services/머시기머시기"; // 수신 웹후크 url을 복사하면 된다.
	} else {
		return;
	}
	
	try {
		logger.info(message);
		
		URL url = new URL(channel_url);
		HttpURLConnection connection = (HttpURLConnection) url.openConnection();
		connection.setRequestMethod("POST");
		connection.setRequestProperty("Content-Type", "application/json");
		connection.setDoOutput(true);

		Map<String, Object> body = new HashMap<String, Object>();
		body.put("text", message);
		
		JSONObject json =  new JSONObject();
		json.putAll(body);
		
		String jsonString = json.toJSONString();

		OutputStream os = connection.getOutputStream();
		os.write(jsonString.getBytes(StandardCharsets.UTF_8));
		os.flush();
		os.close();

		connection.getResponseCode();
		connection.disconnect();
	} catch (IOException e) {
		e.printStackTrace();
	}
}

 

서비스를 올려서 스케줄러를 동작시킨 다음에 헬스체크를 하는 서비스를 내려보자.

그럼 아래와 같이 해당 slack 의 채널로 알림이 온다. 

 

반응형

프로그램/JAVA Related Articles

MORE

Comments