환경: 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
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 의 설명에 적힌 것 처럼,
- generateGitProperties 단계에서 src/main/resources 에 파일을 생성 후 src/main/resources -> build/resources/main 로 복사를 하고
- 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)대로 값이 들어있다.
실행하고 info를 띄워본다.
이렇게 별다른 코딩없이 그래들 설정으로 info 정보를 보여줄 수 있다.
추가적으로 application.properties에 아래 설정들을 추가해서 더 보거나 덜 보거나 하는 사항들을 조절할 수 있다.
management.info.git.mode=full //or simple
management.info.env.enabled=true //or false
//등등 많음
참고로 exclude 속성은 include 속성보다 우위에 있기 때문에 exclude로 막아놓으면 include로 추가해도 안 보임
actuator를 넣는 목적은 배포 후에 배포가 잘되었는지 확인하기 위해서기 때문에 아래 목적을 달성할 수 있어야한다.
- 서버가 잘 떴는지(유관 서버들 포함; DB, rabbit, reddis, etc) 확인
- 최종 버전으로 잘 배포 되었는지 확인
사실 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 에서 보고싶은 정보가 있으면 추가하면 된다.
최종 결과는 아래와 같다.
참고
스프링 설정: https://docs.spring.io/spring-boot/docs/current/reference/html/actuator.html
'개발 > 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 |