반응형

환경: java11, springboot2.6.2, gradle7.1

spring actuator?

  • 스프링 부트 기반의 애플리케이션에서 제공하는 여러가지 정보를 쉽게 모니터링하게 하는 라이브러리
  • DB연결상태, disk space, rabbit, reddis, 커스텀 정보 등 표현 가능

 

예전(spring2.1.8, gradle4)에 spring actuator에 깃 인포를 담기 위해, gradle task로 git정보를 담은 파일을 특정 장소에 생성하는 task를 작성했었는데 자동으로 생성해주는 플러그인이 있어 사용해보기로 한다.

https://github.com/n0mer/gradle-git-properties

 

GitHub - n0mer/gradle-git-properties: Gradle plugin for `git.properties` file generation

Gradle plugin for `git.properties` file generation - GitHub - n0mer/gradle-git-properties: Gradle plugin for `git.properties` file generation

github.com

plugins {
	...
    id "com.gorylenko.gradle-git-properties" version "2.4.0-rc2"
}

build.gradle에 위와 같이 한 줄을 추가하고 gradle refresh 하면 generateGitProperties task가 생긴다.

실행하면 build 경로에 아래와 같은 파일이 생긴다.

클릭해보면 깃 정보가 들어있는 것을 알 수 있다.

 

더 놀라운 것은 이 플러그인/파일이 공식적으로 spring-boot-actuator와 연동 가능하다는 것인데, actuator와 자동 연동을 하려면 src/main/resources 경로에 git.properties 가 있어야 한다.

build.gradle에 아래 항목을 추가한다.

gitProperties {
    //필요한 항목만 나열가능, keys 없으면 전체 다 나옴
    keys = ['git.branch','git.commit.id','git.commit.time', 'git.commit.message.full', 'git.commit.id.abbrev', 'git.build.version','git.build.user.name']
    //날짜 포맷
    dateFormat = "yyyy-MM-dd HH:mm:ss"
    //커스텀 값 넣을 수 있고 기존 항목 override도 가능
    customProperty 'git.build.version', '3.4.5'

    // The directory in this config key is also added as a classpath entry
    //복사할 경로 지정
    gitPropertiesResourceDir = file("${project.rootDir}/src/main/resources")
}

빌드하면 아래와 같은 에러가 나면서 빌드가 실패한다..ㅎㅎ 

> Task :compileJava
> Task :generateGitProperties UP-TO-DATE
> Task :processResources FAILED


Execution failed for task ':processResources'.
> Entry application-common.properties is a duplicate but no duplicate handling strategy has been set.

우선 빌드 순서를 보면 generateGitProperties를 하고 processResources를 하는데,

gitProperties.gitPropertiesResourceDir 의 설명에 적힌 것 처럼,

  1. generateGitProperties 단계에서 src/main/resources 에 파일을 생성 후 src/main/resources -> build/resources/main 로 복사를 하고
  2. processResources 단계에서 (또) src/main/resources -> build/resources/main 으로 옮기는 듯 하다.

그래서 두 번의 복사로 인해 충돌되는 파일(application-common.properties / git.properties)에 대해 설정하라는 에러인 듯 하다.

 

해결책은

1. 아래와 같이 build.gradle에 duplicatesStrategy과 관련된 설정을 추가하거나..

gitProperties {
    //필요한 항목만 나열가능, keys 없으면 전체 다 나옴
    keys = ['git.branch','git.commit.id','git.commit.time', 'git.commit.message.full', 'git.commit.id.abbrev', 'git.build.version','git.build.user.name']
    //날짜 포맷
    dateFormat = "yyyy-MM-dd HH:mm:ss"
    //커스텀 값 넣을 수 있고 기존 항목 override도 가능
    customProperty 'git.build.version', '3.4.5'

    // The directory in this config key is also added as a classpath entry
    //복사할 경로 지정
    gitPropertiesResourceDir = file("${project.rootDir}/src/main/resources")
}

processResources{
    duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}

 

2. 아래와 같이 설정을 바꾸면 해결은 된다..

gitProperties {
    //필요한 항목만 나열가능, keys 없으면 전체 다 나옴
    keys = ['git.branch','git.commit.id','git.commit.time', 'git.commit.message.full', 'git.commit.id.abbrev', 'git.build.version','git.build.user.name']
    //날짜 포맷
    dateFormat = "yyyy-MM-dd HH:mm:ss"
    //커스텀 값 넣을 수 있고 기존 항목 override도 가능
    customProperty 'git.build.version', '3.4.5'

    // Customize file name (could be a file name or a relative file path below gitPropertiesResourceDir dir)
    gitPropertiesName = "${project.rootDir}/src/main/resources/git.properties"
}

 

허나 좀 찝찝한게 있는데, 여전히 아래와 같은 경고 메세지가 나오기 때문이다. 

> Task :processResources
Execution optimizations have been disabled for task ':processResources' to ensure correctness due to the following reasons:
Reason: Task ':processResources' uses this output of task ':generateGitProperties' without declaring an explicit or implicit dependency.

 

위 경고에 대한 설명은 여기에 있다. 간단히 설명하자면 두 task 가 같은 경로에서 작업을 하기 때문에 순서에 영향을 받는다는 의미다.

+ 순서를 명시적으로 잡아주면 해결된다. 깃 정보 파일을 만들고 프로퍼티 파일 옮기는 작업을 하도록 설정했다.

processResources{
    dependsOn(generateGitProperties)
}

 

빌드를 하면 src/main/resources에 git.properties가 생성되어있고, 파일을 열어보면 아래와 같이 위 설정(keys)대로 값이 들어있다.

git.properties

실행하고 info를 띄워본다.

/actuator/info

이렇게 별다른 코딩없이 그래들 설정으로 info 정보를 보여줄 수 있다.

추가적으로 application.properties에 아래 설정들을 추가해서 더 보거나 덜 보거나 하는 사항들을 조절할 수 있다.

management.info.git.mode=full  //or simple
management.info.env.enabled=true  //or false
//등등 많음

참고로 exclude 속성은 include 속성보다 우위에 있기 때문에 exclude로 막아놓으면 include로 추가해도 안 보임


actuator를 넣는 목적은 배포 후에 배포가 잘되었는지 확인하기 위해서기 때문에 아래 목적을 달성할 수 있어야한다.

  1. 서버가 잘 떴는지(유관 서버들 포함; DB, rabbit, reddis, etc) 확인
  2. 최종 버전으로 잘 배포 되었는지 확인

사실 1번을 알기 위해서는 /actuator/health 를 사용하면 되고 2번을 알기 위해서는 /actuator/info 를 이용하면 된다.

허나 이를 위해 api를 두 번 날리는게 번거로웠고(게다가 관리하려는 서버가 많으면 두 번씩 날리는게 매우 힘들고 한 눈에 보기도 어려워진다), 어떻게 보면 info에 나오는 정보에서 딱히 쓸만한게 깃 해쉬정도밖에 없는 듯해 info를 health와 합치고 싶었다.

그래서 health 를 커스텀하기로 한다. 아래와 같이 HealthIndicator를 구현하면 된다.

@Component
@PropertySource("classpath:git.properties")
public class HealthConfig implements HealthIndicator {
    @Value("${git.commit.id.abbrev}")
    private String hash;
    @Value("${git.branch}")
    private String branch;
    @Value("${git.build.time}")
    private String buildTime;
    @Value("${git.build.version}")
    private String buildVer;

    @Override
    public Health health() {
        return Health.up()
                .withDetail("version", buildVer)
                .withDetail("hash", hash)
                .withDetail("branch", branch)
                .withDetail("buildTime", buildTime)
                .build();
    }
}

그 외 health 에서 보고싶은 정보가 있으면 추가하면 된다.

최종 결과는 아래와 같다.

/actuator/health

 


참고

스프링 설정: https://docs.spring.io/spring-boot/docs/current/reference/html/actuator.html

 

Production-ready Features

You can enable HTTP Tracing by providing a bean of type HttpTraceRepository in your application’s configuration. For convenience, Spring Boot offers InMemoryHttpTraceRepository, which stores traces for the last 100 (the default) request-response exchange

docs.spring.io

 

728x90
반응형

'개발 > spring' 카테고리의 다른 글

[retry] spring-retry for auto retry  (0) 2022.02.04
[spring] graceful shutdown default as of 2.3  (0) 2022.02.03
[jpa] OSIV란; spring.jpa.open-in-view  (0) 2022.01.27
[jpa] 영속성 컨텍스트 in spring  (0) 2022.01.27
[jpa] one-indexed pageable  (0) 2022.01.27

+ Recent posts