반응형
https://suho0303.tistory.com/58
지난 게시물에 이어 Discord로 예외를 감지하는 방법도 한번 공부해보았습니다.
Slack과 달리 Discord는 API가 없어서 직접 원하는 채널로 http 요청을 날려야 알림을 받을 수 있습니다.
Discord 웹훅봇 생성
먼저 Discord 채널에 웹훅봇을 추가해야합니다.
그다음 웹훅봇이 활동할 채널을 선택하고 http 요청을 보낼 웹후크URL 을 가져옵니다.
Discord 웹훅 연결
Discord는 각 파라미터에 맞게 요청을 보내야 알림을 받을 수 있기 때문에 각 파라미터 에 맞게 요청을 만들어야합니다.
저는 Discord 웹훅 로직과 파라미터를 쉽게 생성 및 관할 수 있는 클래스를 사용하여 파라미터를 관리하였습니다. 이곳에서 각 파라미터를 json에 작성하고 http 요청을 만듭니다. (DiscordUtil)
https://gist.github.com/k3kdude/fba6f6b37594eae3d6f9475330733bdb
위 클래스를 사용하여 DiscordService를 생성했습니다.
@Slf4j
@Component
@RequiredArgsConstructor
public class DiscordService {
@Value("${webhook.discord.url}")
private String discordUrl;
public void sendDiscordAlertLog(CustomException ex, HttpServletRequest request) {
try {
DiscordUtil discordUtil = new DiscordUtil(discordUrl);
String registeredTimeFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(LocalDateTime.now());
discordUtil.setUsername("Millicon");
discordUtil.setAvatarUrl("https://raw.githubusercontent.com/angelSooho/InfraTest/main/images/millicon-black.png");
DiscordUtil.EmbedObject embedObject = new DiscordUtil.EmbedObject()
.setTitle("\uD83D\uDEA8 서버에 에러가 감지되었습니다. 즉시 확인이 필요합니다. \uD83D\uDEA8")
.setColor(Color.RED)
// .setFooter("여기는 footer 입니다 ", "https://i.imgur.com/Hv0xNBm.jpeg") // 푸터
// .setThumbnail("https://i.imgur.com/oBPXx0D.png") // 썸네일 이미지
// .setImage("https://i.imgur.com/8nLFCVP.png") // 메인 이미지
.addField("Request IP", request.getRemoteAddr(), true)
.addField("Request URL", request.getRequestURL() + " " + request.getMethod(), true)
.addField("Error Code", ex.getErrorCode().getStatus().toString(), false)
.addField("Error Message", ex.getErrorCode().getMessage(), true)
.addField("발생 시간", registeredTimeFormat, false);
discordUtil.addEmbed(embedObject);
discordUtil.execute();
} catch (Exception e) {
log.debug("Discord 통신 과정에 예외 발생");
}
}
}
작성 후, 이전 게시물과 같이 전역 예외 핸들러에 메소드를 추가하시면 알림을 받을 수 있습니다.
결과
참고
https://gist.github.com/k3kdude/fba6f6b37594eae3d6f9475330733bdb
반응형
'Spring' 카테고리의 다른 글
환경변수 @ConfigurationProperties로 간단히 관리하기 (with Kotlin) (1) | 2024.01.30 |
---|---|
스프링에서 gpt api 사용해보기 (0) | 2024.01.16 |
스프링에서 실시간 에러 로그를 Slack으로 받는 방법 (0) | 2023.11.22 |
JPA의 정적쿼리와 동적쿼리의 차이점 (0) | 2023.06.06 |
@Validated, @Valid와 @Column으로 나뉘는 유효성 검증 (0) | 2023.03.22 |
댓글