You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
실행 결과를 통해서 이 빌드는 main 브랜치와 754bc78 커밋에서 만들어진 것을 확인할 수 있다.
애플리케이션을 배포할 때 가끔 기대와 전혀 다르게 동작할 때가 있는데,(특정 기능이 빠져있다던가) 확인해보면 다른 커밋이나 다른 브랜치의 내용이 배포된 경우가 종종 있다. 이럴 때 큰 도움이 된다.
개발 서버는 보통 DEBUG 로그를 사용하지만, 운영 서버는 보통 요청이 아주 많다. 따라서 로그도 너무 많이 남기 때문에 DEBUG 로그까지 모두 출력하게 되면 성능이나 디스크에 영향을 주게 된다. 그래서 운영 서버는 중요하다고 판단되는 INFO 로그 레벨을 사용한다.
그런데 서비스 운영중에 문제가 있어서 급하게 DEBUG 나 TRACE 로그를 남겨서 확인하고 싶다면 어떻게 해야할까? 일반적으로는 로깅 설정을 변경하고, 서버를 다시 시작해야 한다.
loggers 엔드포인트를 사용하면 애플리케이션을 다시 시작하지 않고, 실시간으로 로그 레벨을 변경할 수 있다.
다음을 Postman 같은 프로그램으로 POST로 요청해보자 (꼭! POST를 사용해야 한다)
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
-
2.5. 애플리케이션 정보 (/actuator/info)
💡info엔드포인트는 애플리케이션의 기본 정보를 노출한다.기본으로 제공하는 기능들은 다음과 같다.
java: 자바 런타임 정보os: OS 정보env:Environment에서info.으로 시작하는 정보build: 빌드 정보,META-INF/build-info.properties파일이 필요하다.git: git 정보,git.properties파일이 필요하다.env, java, os 는 기본으로 비활성화 되어 있다. build, git 은 파일을 추가해야 한다.
실행
처음에 실행하면 정보들이 보이지 않을 것이다.
java,os기능을 활성화해보자.(1) java, os
JAVA, OS 정보를 확인해보자.
application.yml- 내용 추가management.info.<id>.enabled의 값을true로 지정하면 활성화 된다.주의! management.endpoint 하위가 아니다. management 바로 다음에 info가 나온다.
실행 결과
http://localhost:8080/actuator/info
{ "java":{ "version":"17.0.3", "vendor":{ "name":"JetBrains s.r.o.", "version":"JBR-17.0.3+7-469.37-jcef" }, "runtime":{ "name":"OpenJDK Runtime Environment", "version":"17.0.3+7-b469.37" }, "jvm":{ "name":"OpenJDK 64-Bit Server VM", "vendor":"JetBrains s.r.o.", "version":"17.0.3+7-b469.37" } }, "os":{ "name":"Mac OS X", "version":"12.5.1", "arch":"aarch64" } }실행해보면 java, os 관련 정보를 확인할 수 있다.
(2) env
💡env는Environment에서info.로 시작하는 정보를 출력한다.이번에는 env 를 사용해보자.
management.info.env.enabled를 추가하고,info..관련 내용을 추가했다.실행 결과
http://localhost:8080/actuator/info
{ "app":{ "name":"hello-actuator", "company":"yh" } ... }application.yml에서info로 시작하는 부분의 정보가 노출되는 것을 확인할 수 있다.(3) build
이번에는 빌드 정보를 노출해보자. 빌드 정보를 노출하려면 빌드 시점에
META-INF/[build-info.properties](http://build-info.properties/)파일을 만들어야 한다.gradle을 사용하면 다음 내용을 추가하면 된다.build.gradle- 빌드 정보 추가springBoot { buildInfo() }이렇게 하고 빌드를 해보면 build 폴더 안에
resources/main/META-INF/build-info.properties파일을 확인할 수 있다.build 는 기본으로 활성화 되어 있기 때문에 이 파일만 있으면 바로 확인할 수 있다.
실행 결과
http://localhost:8080/actuator/info
{ "build": { "artifact":"actuator", "name":"actuator", "time":"2023-01-01T00:00:00.000Z", "version":"0.0.1-SNAPSHOT", "group":"hello" } ... }실행 결과를 통해서 애플리케이션의 기본 정보와 버전 그리고 빌드된 시간을 확인할 수 있다.
(4) git
앞서본
build와 유사하게 빌드 시점에 사용한git정보도 노출할 수 있다.git정보를 노출하려면 [git.properties](http://git.properties) 파일이 필요하다.build.gradle- git 정보 추가plugins { ... id "com.gorylenko.gradle-git-properties" version "2.4.1" //git info }프로젝트에
git을 적용하고 커밋해보자.이렇게 하고 빌드를 해보면
build폴더 안에resources/main/git.properties파일을 확인할 수 있다.git 은 기본으로 활성화 되어 있기 때문에 이 파일만 있으면 바로 확인할 수 있다.
실행 결과
http://localhost:8080/actuator/info
{ "git":{ "branch":"main", "commit":{ "id":"754bc78", "time":"2023-01-01T00:00:00Z" } } ... }실행 결과를 통해서 이 빌드는
main브랜치와754bc78커밋에서 만들어진 것을 확인할 수 있다.애플리케이션을 배포할 때 가끔 기대와 전혀 다르게 동작할 때가 있는데,(특정 기능이 빠져있다던가) 확인해보면 다른 커밋이나 다른 브랜치의 내용이 배포된 경우가 종종 있다. 이럴 때 큰 도움이 된다.
git에 대한 더 자세한 정보를 보고 싶다면 다음 옵션을 적용하면 된다.application.yml 추가
2.6. 로그 정보 (/actuator/loggers)
💡loggers 엔드포인트를 사용하면 로깅과 관련된 정보를 확인할 수 있고, 또 운영중에 급할 때 서버를 껐다켜지 않고 실시간으로 변경할 수도 있다.
코드를 통해서 알아보자.
(1) 기본 로그 조회
여러 레벨을 로그를 남기는 단순한 컨트롤러이다.
hello.controller패키지와 그 하위는debug레벨을 출력하도록 했다. 이제 앞서 만든LogController클래스도debug레벨의 영향을 받는다.실행
http://localhost:8080/log
결과 로그
실행 결과를 보면 기대한 것 처럼
DEBUG레벨까지 출력되는 것을 확인할 수 있다.loggers엔드포인트를 호출해보자.실행
http://localhost:8080/actuator/loggers
실행 결과
{ "levels":[ "OFF", "ERROR", "WARN", "INFO", "DEBUG", "TRACE" ] //기본 로깅 레벨 "INFO" "loggers":{ "ROOT":{ "configuredLevel":"INFO", "effectiveLevel":"INFO" }, "_org.springframework":{ "effectiveLevel":"INFO" }, "hello":{ "effectiveLevel":"INFO" }, "hello.ActuatorApplication":{ "effectiveLevel":"INFO" }, //우리가 .yml 에 설정한 hello.controller 패키지 및 하위 패키지 로깅 레벨 "DEBUG" "hello.controller":{ "configuredLevel":"DEBUG", "effectiveLevel":"DEBUG" }, "hello.controller.LogController":{ "effectiveLevel":"DEBUG" } } }INFO를 사용한다.ROOT의configuredLevel이INFO인 것을 확인할 수 있다.INFO레벨이 적용된다.hello.controller는DEBUG로 설정했다. 그래서 해당 부분에서configuredLevel이DEBUG로 설정된 것을 확인할 수 있다. 그리고 그 하위도DEBUG레벨이 적용된다.(2) 더 자세히 조회하기
다음과 같은 패턴을 사용해서 특정 로거 이름을 기준으로 조회할 수 있다.
실행
http://localhost:8080/actuator/loggers/hello.controller
결과
{ "configuredLevel": "DEBUG", "effectiveLevel": "DEBUG" }(3) 실시간 로그 레벨 변경
개발 서버는 보통
DEBUG로그를 사용하지만, 운영 서버는 보통 요청이 아주 많다. 따라서 로그도 너무 많이 남기 때문에 DEBUG 로그까지 모두 출력하게 되면 성능이나 디스크에 영향을 주게 된다. 그래서 운영 서버는 중요하다고 판단되는INFO로그 레벨을 사용한다.그런데 서비스 운영중에 문제가 있어서 급하게 DEBUG 나 TRACE 로그를 남겨서 확인하고 싶다면 어떻게 해야할까? 일반적으로는 로깅 설정을 변경하고, 서버를 다시 시작해야 한다.
loggers엔드포인트를 사용하면 애플리케이션을 다시 시작하지 않고, 실시간으로 로그 레벨을 변경할 수 있다.다음을 Postman 같은 프로그램으로 POST로 요청해보자 (꼭! POST를 사용해야 한다)
POST 요청 : http://localhost:8080/actuator/loggers/hello.controller
POST로 전달하는 내용 JSON,
content/type도application/json으로 전달해야 한다.204응답이 온다. (별도의 응답 메시지는 없다.)GET으로 요청해서 확인해보면
configuredLevel이TRACE로 변경된 것을 확인할 수 있다.GET 요청 : http://localhost:8080/actuator/loggers/hello.controller
호출 결과
정말 로그 레벨이 실시간으로 변경되었는지 확인해보자.
실행
http://localhost:8080/log
결과 로그
실행 결과를 보면
TRACE레벨까지 출력되는 것을 확인할 수 있다.2.7. 로그 정보 (/actuator/httpexchanges)
💡HTTP 요청과 응답의 과거 기록을 확인하고 싶다면
httpexchanges엔드포인트를 사용하면 된다.(많이 사용하지는 않는다.)
HttpExchangeRepository인터페이스의 구현체를 빈으로 등록하면httpexchanges엔드포인트를 사용할 수 있다.(주의! 해당 빈을 등록하지 않으면
httpexchanges엔드포인트가 활성화 되지 않는다)스프링 부트는 기본으로
InMemoryHttpExchangeRepository구현체를 제공한다.InMemoryHttpExchangeRepository 추가
이 구현체는 history에 최대 100개의 HTTP 요청까지만 기록한다. 최대 요청이 넘어가면 과거 요청을 삭제한다. setCapacity() 로 최대 요청수를 변경할 수 있다.
실행
http://localhost:8080/actuator/httpexchanges
실행해보면 지금까지 실행한 HTTP 요청과 응답 정보를 확인할 수 있다.
2.8. 액추에이터와 보안 (/actuator)
(1) 보안 주의 필요
액츄에이터가 제공하는 기능들은 우리 애플리케이션의 내부 정보를 너무 많이 노출한다. 그래서 외부 인터넷 망이 공개된 곳에 액츄에이터의 엔드포인트를 공개하는 것은 보안상 좋은 방안이 아니다.
액츄에이터의 엔드포인트들은 외부 인터넷에서 접근이 불가능하게 막고, 내부에서만 접근 가능한 내부망을 사용하는 것이 안전하다.
액츄에이터를 다른 포트에서 실행
액추에이터 포트 설정
management.server.port: 9292실행
http://localhost:9292/actuator
(2) 엔드포인트 경로 변경
엔드포인트의 기본 경로를 변경하려면 다음과 같이 설정하면 된다.
application.yml/actuator/{엔드포인트}대신에/manage/{엔드포인트}로 변경된다.Chapter 9. 에서는 본격적으로 스프링 부트가 제공하는 액추에이터에다가 CPU 사용량, 메모리 사용량, 톰캣 쓰레드 등이 제공되는 metrics 를 활용한 모니터링 + 프로메테우스와 그라파나를 엮어서 실무에서 어떤식으로 모니터링을 구성하는지 설명한다.
Beta Was this translation helpful? Give feedback.
All reactions