Skip to content

Commit

Permalink
Merge pull request #255 from Denia-park/feat/error를-Slack이랑-연동시키기
Browse files Browse the repository at this point in the history
Slack에 error-log 연동하기
  • Loading branch information
Denia-park authored Feb 28, 2024
2 parents 2b6982a + 486b246 commit 0ed751f
Show file tree
Hide file tree
Showing 4 changed files with 102 additions and 0 deletions.
3 changes: 3 additions & 0 deletions my-garden-be/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,9 @@ dependencies {
annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
annotationProcessor "jakarta.persistence:jakarta.persistence-api"

//Slack Webhook 의존성 추가
implementation "net.gpedro.integrations.slack:slack-webhook:1.4.0"
}

ext { // 전역 변수
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
package org.hyunggi.mygardenbe.common.exception.controlleradvice;

import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import net.gpedro.integrations.slack.SlackApi;
import net.gpedro.integrations.slack.SlackAttachment;
import net.gpedro.integrations.slack.SlackField;
import net.gpedro.integrations.slack.SlackMessage;
import org.springframework.context.annotation.Profile;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Date;
import java.util.List;

@Profile("prod")
@RequiredArgsConstructor
@RestControllerAdvice
@Slf4j
public class ServerErrorDetectControllerAdvice {
private final SlackApi slackApi;

@ExceptionHandler(Exception.class)
public void handleException(final HttpServletRequest req, final Exception e) throws Exception {
log.error("Server Error : {}", e.getMessage(), e);

slackApi.call(buildSlackMessage(buildSlackAttachment(req, e)));
throw e;
}

private SlackMessage buildSlackMessage(final SlackAttachment slackAttachment) {
final SlackMessage slackMessage = new SlackMessage();

slackMessage.setAttachments(List.of(slackAttachment));
slackMessage.setIcon(":ghost:");
slackMessage.setText("Error Detect");
slackMessage.setUsername("error-bot");

return slackMessage;
}

private SlackAttachment buildSlackAttachment(final HttpServletRequest req, final Exception e) {
final SlackAttachment slackAttachment = new SlackAttachment();

slackAttachment.setFallback("Error");
slackAttachment.setColor("danger");
slackAttachment.setTitle("Server Error Detect");
slackAttachment.setTitleLink(req.getContextPath());
slackAttachment.setText(getStackTrace(e));
slackAttachment.setColor("danger");
slackAttachment.setFields(addField(req));

return slackAttachment;
}

private String getStackTrace(final Exception e) {
StringWriter sw = new StringWriter();
e.printStackTrace(new PrintWriter(sw));

return sw.toString();
}

private List<SlackField> addField(final HttpServletRequest req) {
return List.of(
new SlackField().setTitle("Request URL").setValue(req.getRequestURL().toString()),
new SlackField().setTitle("Request Method").setValue(req.getMethod()),
new SlackField().setTitle("Request Time").setValue(new Date().toString()),
new SlackField().setTitle("JWT Token").setValue(req.getHeader("Authorization")),
new SlackField().setTitle("Request IP").setValue(req.getRemoteAddr()),
new SlackField().setTitle("Request User-Agent").setValue(req.getHeader("User-Agent"))
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package org.hyunggi.mygardenbe.configuration;

import net.gpedro.integrations.slack.SlackApi;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;

@Profile("prod")
@Configuration
public class SlackLogAppenderConfiguration {
@Value("${my-garden.slack.incoming-webhook-token}")
String token;

@Bean
public SlackApi slackApi() {
return new SlackApi("https://hooks.slack.com/services/" + token);
}
}
4 changes: 4 additions & 0 deletions my-garden-be/src/main/resources/application.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -99,3 +99,7 @@ management:
base-path: ${actuator.url}
server:
port: ${actuator.port}

my-garden:
slack:
incoming-webhook-token: ${slack-incoming-webhook.url}

0 comments on commit 0ed751f

Please sign in to comment.