티스토리 뷰

구글 클라우드 플랫폼 (Google Gloud Platform, 이하 GCP)에서 어플리케이션 에러 로그 관리 등을 쉽게 해주는 클라우드 모니터링 도구인 Stackdriver가 있습니다. 구글이 2014년도에 스택드라이버를 인수하여 2015년도 부터 GCP에 탑재하였습니다.

Stackdriver의 설치부터 로깅을 전송하는 부분까지 차례대로 살펴보겠습니다. 테스트 환경은 다음과 같습니다.

  • Google Compute Engine (Linux / Ubuntu 16.04 LTS)
  • Java / Spring / Spring Boot
  • Maven

1. 로깅 에이전트 설치

스택드라이버 로깅 에이전트(Stackdriver Logging Agent)는 GCP의 VM 인스턴스에 설치되어 응용프로그램으로 부터 로깅을 스트리밍 받습니다. 이 결과는 GCP 콘솔에서 확인할 수 있습니다. 설정을 통해 에러 로깅 등이 인입되면 알람을 받을 수도 있습니다. 로깅 에이전트 방식 외에 REST API를 이용한 방식도 있지만 여기서 다루지는 않습니다. 하단 참고 메뉴의 Using the Stackdriver Error Reporting API 를 참고바랍니다.

로깅 에이전트를 지원하는 GCP의 VM 인스턴스는 아래와 같습니다.

  • Google App Engine : 자동으로 내장 탑재
  • Google Container Engine : 자동으로 내장 탑재
  • Google Compute Engine : 직접 설치 필요
  • Amazon EC2 : 직접 설치 필요

로깅 에이전트 설치는 매우 간단합니다.

Google App Engine의 인스턴스에 접속하여 로깅 에이전트를 다운로드 받습니다.

curl -sSO https://dl.google.com/cloudagents/install-logging-agent.sh
sha256sum install-logging-agent.sh

정상적으로 다운로드 되어졌다면 다음과 같은 출력이 나옵니다.

993a99ad560017aa561e94829f2dc0cbdf534e4aafed13b0716068e2162d0efe  install-logging-agent.sh

정상적으로 진행되었다면 설치 스크립트를 실행해줍니다.

sudo bash install-logging-agent.sh

아래의 명령어을 통해 상태확인 및 제어할 수 있습니다. 에이전트 삭제 등 추가 메뉴얼은 하단 참고 메뉴의 Installing the Logging Agent 를 참고바랍니다.

sudo service google-fluentd status // 로깅 에이전트 상태 확인
sudo service google-fluentd start  // 로깅 에이전트 실행
sudo service google-fluentd stop   // 로깅 에이전트 종료

2. Google Compute Engine에서 셋팅

maven을 사용하고 있다면 다음과 같이 pom.xml 에 디펜던시를 추가해줍니다. 다른 언어 및 환경을 사용하고 있다면 하단 참고 메뉴의 Setting up on Google Compute Engine 를 참고바랍니다.

<dependency>
  <groupId>org.fluentd</groupId>
  <artifactId>fluent-logger</artifactId>
  <version>0.3.3</version>
</dependency>

디펜던시를 추가했다면 다음과 같이 Stackdriver 로깅 에이전트로 에러를 전송해주는 유틸리티 클래스를 작성합니다. myapp 부분을 서비스명 등 모니터링 화면에서 구별가능한 이름으로 변경해주시면 됩니다.

public class ExceptionUtil {
    private static FluentLogger ERRORS = FluentLogger.getLogger("myapp");

    public static void report(Throwable ex) {
        StringWriter exceptionWriter = new StringWriter();
        ex.printStackTrace(new PrintWriter(exceptionWriter));
        Map<String, Object> data = new HashMap<>();
        data.put("message", exceptionWriter.toString());
        Map<String,String> serviceContextData = new HashMap<>();
        serviceContextData.put("service", "myapp");
        data.put("serviceContext", serviceContextData);
        // ... add more metadata
        ERRORS.log("errors", data);
    }
}

유틸리티 클래스를 작성하였으면 모든 작업은 완료되었습니다. 다음과 같이 사용하실 수 있습니다.

try {
    throw new Exception("Generic exception for testing Stackdriver");
} catch (Exception e) {
    // Stackdriver 로깅 에이전트로 에러 전송
    ExceptionUtil.report(e);
}

다음 그림은 구글 클라우드 콘솔에서의 스택드라이버 에러로그 확인 화면입니다.


참고


댓글