원격 웨이팅 서비스 라인업지의 모니터링을 진행하면서 결국은 Pinpoint를 더욱 많이 사용했고, 서비스 이튿날에는 핀포인트만 사용했다고 해도 과언이 아니었다. 하지만 Pinpoint를 적용하기 전에는 Prometheus와 Grafana를 통한 인스턴스 모니터링을 진행했고, 이를 어떻게 진행했는지 글로 남기고자 한다.
Prometheus와 Grafana
그전에 앞서서, Prometheus와 Grafana의 기능과 차이점을 짚고 넘어가야 한다.
Prometheus
Prometheus는 시스템의 성능 지표(metrics)를 수집, 시각화, 알림 등을 제공하는 오픈 소스 모니터링 시스템이다. 이번에는 Prometheus를 통해 Spring Actuator에서 각종 성능 지표들을 가져올 예정이다. 하지만 Prometheus를 통해 가져온 지표들을 보기 쉽게 시각화하는 것은 무척 어렵다.
Grafana
다행히 이런 지표들을 시각화해 주는 툴이 있는데, 바로 Grafana이다. Grafana는 성능 지표들을 시각화하는데 가장 최적화된 대시보드를 제공해 준다. 이를 통해 우리는 Prometheus를 통해 가져오는 성능 지표들에 대한 시각화를 진행한다.
따라서 최종 모니터링 흐름은 다음과 같다.
- Prometheus를 통해 스프링 부트 애플리케이션으로부터 성능 지표를 가져온다.
- Grafana를 통해 Prometheus의 데이터를 대시보드 형태로 시각화한다.
구현
Prometheus 설치
의존성 추가
implementation "org.springframework.boot:spring-boot-starter-actuator"
runtimeOnly "io.micrometer:micrometer-registry-prometheus"
build.gradle 파일에 다음과 같이 두 개의 의존성을 설치해 준다.
- actuator: 스프링 부트 애플리케이션에서 각종 지표들을 전달하기 위함이다.
- prometheus: Prometheus와 스프링 부트를 연동하기 위함이다.
application.yml
Security Actuator 안전하게 사용하기 | 우아한형제들 기술블로그
안녕하세요, 우아한형제들 SOC팀에서 Application Security를 담당하고 있는 권현준입니다. 오늘 준비한 주제는 개발자에게 편리함을 제공하나, 잘못 사용하면 매우 위험한 Actuator를 안전하게 사용하
techblog.woowahan.com
이후 application.yml을 수정하여 Spring Boot Acuator의 Prometheus 엔드포인트를 활성화하고, 필요한 정보만 노출하도록 화이트리스트 형태로 관리해 준다. 화이트리스트 형태로 운영해 주는 이유는 Acuator를 잘못 사용할 경우, 서비스 운영에 지장을 줄 수 있는 민감한 정보들이 유출될 수 있기 때문이다. 따라서 노출할 정보의 엔드포인트를 화이트리스트 형태로 관리하고 Spring Boot Actuator의 경로를 임의의 UUID로 변경하여 서비스의 공격에 대비해 주었다.
management:
server:
port: 63544
endpoints:
enabled-by-default: false
jmx:
exposure:
exclude: "*"
web:
exposure:
include: info, health, prometheus, metrics
base-path: ENC(djCq5yP+wuQcOpBaOgZYbubHDHG8KwWN4eLyukWl46+Y6xz7fDUGRH0/lwVLqhDL)
endpoint:
health:
enabled: true
info:
enabled: true
prometheus:
enabled: true
metrics:
enabled: true
prometheus:
metrics:
export:
enabled: true
- enabled-by-default: 기본적으로 모든 엔드포인트를 비활성화한다.(화이트리스트 형태로 관리하기 위함)
- port: 스프링 부트의 기본 포트랑 다르게 설정해 주어 무작위 공격에 대비해 준다.
- exposure: 화이트리스트 형태로 관리하여 필요한 정보의 엔드포인트만 노출되도록 설정해 준다.
- base-path: Actuator의 경로를 임의의 값으로 변경해 준 후, 암호화해서 해당 경로가 노출되지 않도록 한다.
- endpoint: 노출하고자 하는 지표에 대한 엔드포인트를 활성화해 준다.
- prometheus: Prometheus 엔드포인트를 활성화하여 지표들을 수집할 수 있도록 설정한다.
prometheus.yml
global:
scrape_interval:
scrape_configs:
- job_name: '애플리케이션 이름'
static_configs:
- targets: ['서비스 애플리케이션 주소']
Prometheus를 실행하기 위해, 측정 지표를 가져올 서비스 애플리케이션 주소를 위와 같이 prometheus.yml 파일에 생성하여 작성해준다. prometheus.yml 파일은 Prometheus를 실행하고자 하는 인스턴스에 생성해주어, 도커를 통해 Prometheus를 실행할 때 환경변수로 넣어준다.
Docker를 통한 실행
docker run -p 9090:9090 \
-v ~/prometheus.yml:/etc/prometheus/prometheus.yml \
--name prometheus \
-d prom/prometheus \
--config.file=/etc/prometheus/prometheus.yml
DockerHub에서 prometheus 이미지를 가져와 컨테이너에 띄워 실행해준다. 이 때 -v 옵션을 통해 이전에 생성해준 prometheus.yml 파일을 도커의 환경변수로 넣어주는데, prometheus.yml의 경로는 상황에 따라 유동적으로 작성해주면 된다.
Prometheus 환경설정
이후 인스턴스 주소의 9090포트를 통해 접속하면 다음과 같은 화면에 접속할 수 있는데, 이는 자료 수집이 정상적으로 이루어지고 있다는 뜻이다. 이제는 Prometheus에서 가져오는 측정 지표들을 대시보드에 시각화해주기 위해 Grafana를 구성해줄 차례이다.
Grafana 설치
Grafana도 마찬가지로 DockerHub에서 이미지를 가져와 컨테이너에 띄워서 실행해준다.
docker run -d --name=grafana -p 3000:3000 grafana/grafana
이후 인스턴스 주소의 3000포트를 통해 접속하면, 다음과 같은 로그인 화면에서 Grafana 초기 계정 설정을 진행할 수 있다.
이후 로그인 하면 다음과 같은 화면을 마주할 수 있는데, 여기서 Prometheus와 연결 설정을 진행해 줄 수 있다.
Grafana와 Prometheus 연동
이제 Prometheus에서 수집한 측정 지표들을 Grafana에 연동해 줄 차례다.
좌측 상단의 햄버거 버튼을 누른 후, Connections -> Data sources -> 우측 상단의 Add new data source를 선택해준다.
이후 data source 목록들 중, 최상단에 위치한 Prometheus를 선택해준다.
선택하면, 연결하고자 하는 데이터의 이름에 원하는 이름을 입력해주고, Prometheus가 실행되고 있는 인스턴스의 주소와 Prometheus의 포트 번호를 입력해주면 된다.
이후 맨 아래의 Save&Test 버튼을 누르면, 정상적으로 Prometheus가 Grafana와 연동되게 된다.
Dashboard로 시각화하기
연동 이후, 마찬가지로 좌측 상단의 햄버거 버튼을 누른 후, Dashboards -> New -> 버튼을 눌러 Dashboard에 이전에 연동한 Prometheus 데이터를 연결해준다. Grafana는 데이터 소스의 종류에 맞는 다양한 Dashboard를 제공하고 있는데, 따라서 우리도 기존에 만들어진 Dashboard를 Import 해줄 것이다! 하단의 링크에 접속해서 지표를 측정하고자 하는 서비스에 알맞는 Dashboard를 선택해 준다.
Grafana dashboards | Grafana Labs
No results found. Please clear one or more filters.
grafana.com
이후 우측에 Copy ID to clipboard 버튼을 선택해 해당 Dashboard의 코드를 복사해주고, 대시보드를 Import해주는 곳에 해당 코드를 붙여넣기 해준다.
이후 하단에 Prometheus 데이터 소스를 연결해주고, Import 버튼을 눌러주면 모든 Prometheus와 Grafana를 통한 인스턴스 모니터링 연동 과정이 마무리된다.
결과
이렇게 Prometheus와 Grafana를 통한 인스턴스 모니터링 과정을 마무리 해보았다. 시각화 과정을 통해 주기적으로 애플리케이션과 인스턴스의 모니터링을 보다 편리하게 해줄 수 있었다. 조만간 작성할 내용인 Pinpoint라는 별도의 모니터링 툴도 물론 있지만, 그렇다고 Grafana를 통한 모니터링이 불필요하지는 않다. Pinpoint는 각 요청에 대한 메서드 호출을 편리하게 확인할 수 있다면, Prometheus&Grafana 조합은 애플리케이션의 상태를 나타내는 각 지표들을 자세히 살펴보는데 더 특화되어 있다고 할 수 있다. 쉽게 말해 숲을 보려면 Pinpoint와 같은 모니터링 툴을, 나무를 보려면 Prometheus&Grafana 조합을 사용하는 것이 좋을 것 같다.
참조
Prometheus + Grafana로 Java 애플리케이션 모니터링하기 : NHN Cloud Meetup
Prometheus 2012년에 처음으로 모습을 드러낸 오픈소스 모니터링 플랫폼입니다.
meetup.nhncloud.com
Security Actuator 안전하게 사용하기 | 우아한형제들 기술블로그
안녕하세요, 우아한형제들 SOC팀에서 Application Security를 담당하고 있는 권현준입니다. 오늘 준비한 주제는 개발자에게 편리함을 제공하나, 잘못 사용하면 매우 위험한 Actuator를 안전하게 사용하
techblog.woowahan.com
GTB-79 [feat] 모니터링 구축 by jwnnoh · Pull Request #94 · Gachon-Table/GachonTable-BE
1. 무슨 이유로 코드를 변경했나요? 축제 기간 동안 대응을 위해 모니터링 툴을 구축하였습니다. Prometheus + Grafana Prometheus : Actuator에서 각종 수치 데이터들을 가져옵니다. Grafana: Prometheus에 저장된
github.com
'DevOps' 카테고리의 다른 글
Ngrok을 통해 외부에서 localhost 주소 접속하기 (0) | 2024.12.08 |
---|---|
Caddy로 도메인 없이 HTTPS 연결하기 (1) | 2024.12.03 |