프로메테우스 & 그라파나 세팅
2026년 8월 31일
현재 화면을 그리는 서버가 두 대 돌고 있고, 그 앞에 부하를 나눠 주는 장치가 있으며, 뒤에는 데이터를 주는 백엔드 서버가 따로 있게 인프라를 구축한 상황에서, 서버들이 잘 돌아가고 있는 지를 확인하려면 직접 들어가 봐야 합니다.
서버 안에 남는 기록은 배포 때마다 서버가 통째로 새것으로 바뀌는 구조라 같이 사라집니다.
특히 지난주에 에러 처리 구조를 새로 만들었기 때문에 이 문제가 더 크게 느껴졌습니다. 에러가 나면 안전하게 받아 주는 장치를 만들어 두었는데, 정작 실제 서비스에서 에러가 하루에 몇 번 나는지, 어떤 요청에서 나는지 아무것도 모르는 상태였습니다. 장치를 만들었으면 그 장치가 얼마나 자주 일하는지도 봐야 의미가 있습니다.
프로메테우스, 그라파나
프로메테우스는 서비스의 상태를 숫자로 계속 재서 모아 두는 도구이고, 그라파나는 그 숫자를 그래프로 보여 주는 도구입니다. 둘은 보통 한 쌍으로 씁니다.
서버에는 "지금 요청이 몇 건 들어왔나, 응답에 평균 몇 밀리초가 걸리나, 실패가 몇 번 났나, 메모리를 얼마나 쓰고 있나" 같은 수치가 늘 있습니다. 이 수치를 적어 둔 작은 페이지를 서버가 하나 열어 둡니다. 프로메테우스는 15초에 한 번씩 그 게시판에 찾아가서 숫자를 베껴 옵니다. 그리고 "몇 시 몇 분에 이 값이었다"를 시간순으로 쌓아 둡니다.
여기서 중요한 점은 서버가 숫자를 보내는 게 아니라 프로메테우스가 찾아가서 가져온다는 것입니다. 서버는 게시판만 열어 두면 되고, 수집하는 쪽이 어디에 있든 신경 쓸 필요가 없습니다. 서버가 죽으면 게시판이 안 열리고, 그러면 "가져오기 실패"가 곧 서버가 죽었다는 신호가 됩니다.
그라파나는 이렇게 쌓인 숫자를 사람이 볼 수 있게 그려 줍니다. 숫자 자체는 글자 덩어리라 눈으로 보기 어렵습니다. 그라파나에 프로메테우스를 연결해 두면 "시간대별 백엔드 호출 수", "실패 비율", "응답이 느린 상위 5퍼센트의 대기 시간" 같은 그래프를 화면 한 장에 모아 볼 수 있습니다.
방식
방법은 세 가지가 있었습니다.
첫째, 우리 서버들과 같은 망 안에 작은 서버를 하나 두고 거기서 프로메테우스와 그라파나를 돌리는 것.
둘째, 백엔드 팀이 이미 돌리고 있는 게 있으면 거기에 얹는 것.
셋째, 클라우드 업체가 대신 운영해 주는 서비스를 쓰고 우리 서버가 숫자를 밖으로 밀어 보내는 것.
셋째가 가장 손이 덜 갑니다. 설정을 남에게 맡기면 무엇이 왜 그렇게 되는지 배울 기회가 사라집니다.
그래서 첫째를 골랐습니다.
세팅
첫째, /metrics 엔드포인트를 Next 라우트로 만들지 않았습니다. 그렇게 하면 ALB를 거쳐 인터넷에서도 요청 수와 에러율이 그대로 보입니다. 대신 Next와 별도 포트(mobile 9464, web 9465)에 메트릭 서버를 따로 띄웠습니다. 이 포트는 ALB 대상 그룹에 없어서 외부에서 닿을 수 없고, 보안그룹에서 모니터링 EC2의 보안그룹을 소스로 지정해 열었습니다.
둘째, 스크레이프 대상을 IP로 적지 않았습니다. 프론트 EC2는 ASG에 속해 있고 CodeDeploy Blue/Green 배포 때마다 인스턴스가 통째로 교체됩니다. 프로메테우스의 EC2 서비스 디스커버리로 Name 태그가 plick-frontend-asg-prod인 인스턴스를 60초마다 다시 조회하게 해서, 인스턴스가 바뀌어도 설정을 건드리지 않습니다.
셋째, 그라파나를 인터넷에 노출하지 않았습니다. 모니터링 EC2는 프라이빗 서브넷에 두고 인바운드 규칙 없이 그라파나와 프로메테우스를 127.0.0.1에만 바인딩했습니다. 화면은 SSM 포트 포워딩으로 노트북의 localhost:3000에 연결해서 봅니다.
앱 쪽에서는 서버가 뜰 때 숫자 게시판을 함께 여는 코드를 넣었습니다. 기본으로 잡히는 값에 더해, 우리 앱이 백엔드를 부를 때마다 어떤 요청이 몇 밀리초 걸렸고 결과가 무엇이었는지를 세도록 했습니다. 모든 백엔드 호출이 지나가는 자리가 하나 있어서 거기에 한 번만 끼워 넣으면 됐습니다. 지난주에 만든 에러 장치가 잡은 에러도 같이 셉니다.
인프라 쪽에서는 모니터링 서버 한 대를 만들었습니다. 서버에 들어가서 손으로 이것저것 깔지 않고, 첫 부팅에 실행되는 스크립트 하나에 필요한 설정 파일을 전부 담아 두었습니다. 서버를 지우고 다시 만들어도 같은 상태로 뜹니다. 그리고 이 서버가 다른 서버 목록을 조회할 수 있는 권한, 우리 서버의 숫자 게시판에 접근할 수 있는 방화벽 규칙을 각각 하나씩 열었습니다.
결과

아직 못 보는 것도 있습니다.사용자가 실제로 페이지를 몇 번 열었는지, 그중 몇 번이 실패했는지는 부하 분산 장치가 따로 세고 있어서 그 값을 그라파나에 붙이는 게 다음 일입니다. 브라우저 안에서 잡힌 에러를 서버로 보고하는 경로, 그리고 실패 비율이 어느 선을 넘으면 알려 주는 알림도 남았습니다.