서비스를 운영하면서 서버에 대한 여러 정보들을 수집하여 기능을 개선해나가기 위해 모니터링을 도입하기로 하였다. 특히나 진행중이던 프로젝트에서 오토스케일링 도입이 불투명해진 상황에서, 유저테스트때의 서버 상태를 모니터링해보고 스케일업을 할지 말지 결정해야했기 때문에 더더욱이 모니터링이 필요했다.
이 글에서는 프로젝트를 진행하며 모니터링을 구현한 몇가지 이유 등과 docker를 이용한 prometheus, grafana, node exporter 설치 방법, grafana 대시보드 세팅 까지의 내용을 다룬다.
1. 기술적 의사 결정
모니터링 툴 중에서는 Prometheus, Grafana 조합과 Sentry, Pinpoint 중에서 고민하였는데, 결과적으로 Prometheus, Grafana를 사용하기로 하였다.
다음과 같은 이유에서였는데, Sentry는 에러 모니터링, 리포팅 쪽에 특화되어 있는 것 같았고, Pinpoiont는 분산 애플리케이션의 성능 분석과 트랜잭션 추적 기능에 특화되어 있는 듯 했다.
Prometheus와 Grafana를 사용했을때는 보다 범용적인 메트릭 수집 및 시각화가 가능했고, 확장성이 필요한 시나리오에서 유리한 특징이 있어 현재 서비스에 적용했을때 보다 의미있는 데이터들을 확인 할 수 있을 것 같아 Prometheus와 Grafana를 선택하게되었다.
2. 어떤식으로 모니터링이 이루어지는가?
Prometheus로 metrics를 수집하여 사용자가 쿼리를 날려 질의하면 그에 맞는 데이터를 응답해준다. 이때 데이터들을 시각화해서 보여주는 툴이 Grafana이고, 수집된 metrics는 node exporter를 이용하여 prometheus가 수집할 수 있게 한다.
node exporter를 모니터링 하고싶은 서버에 설치하여 metrics를 뽑아낼 수 있는데, prometheus가 metrics를 받는 방식이 pull 방법으로 받아오기 때문에 node exporter가 설치되어있는 서버는 데이터 송출에 대한 부하의 걱정이 없다.
3. 어떻게 설계하였나?
보통 대부분의 레퍼런스들은 Prometheus와 Grafana를 별도의 서버에 두고 node exporter는 운영중인 서버에 설치하여 관리하고 있었다. 하지만, 현재 우리의 프로젝트에 주어진 서버 비용이 넉넉치 않은 상황이라 ec2 인스턴스를 추가로 늘리고 유지시키기에는 부담이 되는 상황이었다.
때문에 먼저, Prometheus, Grafana, node exporter를 운영중인 서버에 모두 설치, 실행하여 추가 ec2 인스턴스 없이 모니터링 하려했다. 하지만 metrics를 prometheus에서 받아오는 과정에서 트래픽이 발생하여 서버의 메모리를 차지할 것으로 예상되어 스케일링이 필요해질 것 같아 비용적인 측면에서 부담되는 상황이 똑같이 발생할 것으로 예상되었다.
따라서 Prometheus, Grafana는 로컬환경에 설치, 실행하고 node exporter만 서버에 설치하여 추가적인 서버비용을 최소화하여 모니터링을 구축하기로 했다.
구축을 끝내고 잘 작동되는걸 확인하고나서 문제가 생겼다.
로컬환경에서 prometheus를 실행했기 때문에 컴퓨터를 끄면 모니터링이 멈춘다는것이다. 어찌보면 당연한건데.. 이런 이유때문에서라도 별도의 서버가 필요했음을 알게되었다. 그래서 추가 인스턴스를 생성해서 모니터링을 구축하였다.
3-1. 그래서 어떻게 설치하는데?
3-1-1. 모니터링용 EC2 인스턴스 생성
이 부분은 간단하기도하고해서 설명을 생략하겠다.
프리티어로 하나 만들어줬다.
이 모니터링용 인스턴스에는 Prometheus와 Grafana를 설치할거다.
3-1-2. Docker 설치
Prometheus, Grafana, Node exporter들을 직접 설치해주는 방법도 있지만 CI-CD에서 Docker를 사용하면서 엄청난 편리함을 느꼈었기때문에, 이번에도 Docker를 사용해보았다.
모니터링용 인스턴스에 아래 명령어로 도커를 설치해주기만 하면 준비가 끝난다.
sudo apt-get update
sudo apt install docker.io
3-1-2. Prometheus 설치, 실행
먼저, prometheus.yml 세팅을 해주었다.
모니터링용 인스턴스에 터미널로 접속해서 아래 명령어로 다음 위치에 작성해준다.
sudo vim /tmp/prometheus.yml
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: 'node_exporter'
metrics_path: /metrics
static_configs:
- targets: ["{서비스 중인 인스턴스의 IP}:9100"]
targets의 중괄호 안에는 서비스 중인 ec2 인스턴스의 퍼블릭ip를 적으면 된다.
node exporter가 서비스 중인 서버의 metrics를 export 할건데, prometheus가 그걸 pull 받아오는 방식이다.
잘 작성하고 나오면 tmp 위치에 잘 세팅되어 있을거다.
이제 docker로 설치, 실행해준다.
$ sudo docker run -d \
-p 9090:9090 \
-v /tmp/prometheus.yml:/etc/prometheus/prometheus.yml \
prom/prometheus
실행 후, 아래 주소로 들어가면 Prometheus 화면에 접속이 가능하다.
Prometheus 포트 기본값은 9090이다.
http://{모니터링용 인스턴스 ip}:9090
이런 화면이 나오면 된다.
3-1-3. Grafana 설치, 실행
그라파나는 별도의 yml 세팅 필요없이 바로 docker로 실행해줬다.
sudo docker run -d -p 3000:3000 grafana/grafana
이 후, 아래 주소로 들어가면 Grafana의 화면이 나온다.
Grafana는 포트 기본값이 3000이다.
http://{모니터링용 인스턴스 ip}:3000
최초로 접속하면 아이디, 비밀번호 입력을 해야하는데
admin / admin 을 입력하면 된다.
이런 화면이 나오면 성공.
3-1-4. Node Exporter 설치, 실행
node exporter는 모니터링용 인스턴스가 아닌 모니터링 대상 인스턴스에 설치해야한다.
다시말하지만 Node Exporter가 서버의 metrics를 뽑아내면 Prometheus가 그 metrics들을 pull 받아낸다.
아래 명령어를 순서대로 입력하고, 도커로 실행한다.
docker pull prom/node-exporter
sudo docker run -d \
-p 9100:9100 \
prom/node-exporter
이 후,
{모니터링 대상 서버의 ip}:9100/metrics
로 접속하면 node exporter 화면을 볼 수 있다.
이런 화면이 나오면 된다.
4. Grafana 대시보드 세팅
4-1. Prometheus와 연동
왼쪽 카테고리에서 Connections - Add new connection
Prometheus 선택
URL에 Prometheus의 주소를 입력해준다.
모니터링용 서버에 설치했으니 모니터링용 서버 ip:9090
이 후 밑으로 내려 Save & test 를 누르면 끝.
4-2. DashBoard 세팅
대시보드는 직접 만드는 방법도 있지만, 나의 경우엔 제공되는 대시보드 템플릿을 활용하였다.
https://grafana.com/grafana/dashboards/
Dashboards | Grafana Labs
Thank you! Your message has been received!
grafana.com
위의 링크에 접속하면 그라파나 템플릿 사이트가 나오는데 나는 Node Exporter Full 을 선택했다.
Node Exporter Full을 눌러 들어가면 import 방법을 고를 수 있는데, 나는 JSON 파일로 선택했다.
Download JSON을 누르면 JSON 파일이 다운로드 된다.
다시, 그라파나 화면으로 돌아가서 왼쪽 카테고리의 DashBoards 로 들어가자.
New - Import를 누르면
이런 화면이 나오는데 Upload dashboard JSON file 에 다운로드 받은 JSON 파일을 끌어다 놓고, 밑의 Load를 누르면 대시보드가 생성된다.
생성 후, Dashboards에 들어가면 Node Exporter Full 이라고 새로 대시보드가 생성되어있을 것이다.
이런 화면이 나오면 성공!
여기서 항목별로 그래프로 확인이 가능하다!!
프리티어 수준으로 서버를 만들어 SWAP 메모리 설정을 해놨었는데 SWAP 메모리 사용량까지도 볼 수 있다.
📌 Reference
https://prometheus.io/docs/prometheus/latest/getting_started/
Getting started | Prometheus
An open-source monitoring system with a dimensional data model, flexible query language, efficient time series database and modern alerting approach.
prometheus.io
https://devent.tistory.com/173
Prometheus + Node Exporter 연동하기
요약 프로메테우스는 오픈소스 시스템 모니터링 툴이다. 쿠버네티스 환경을 운용하는 시스템이라면 프로메테우스를 사용하라고 권장할 정도로 널리 사용되고 있다. 프로메테우스가 매트릭 수
devent.tistory.com
https://magpienote.tistory.com/260
[Prometheus] Prometheus와 Grafana 연동하고 Node_exporter 대쉬보드 만들기, Grafana Dashboard(
목차 Grafana란? Grafana 설치하기 Grafana 시작하기 Grafana 접속 Grafana Data Source 만들기 Grafana Dashboard 만들기 Grafana Dashboard(= Template) 사용하기 Grafana란? Grafana Lab에서 제공하는 오픈소스 데이터 시각화/모
magpienote.tistory.com
https://www.devkuma.com/docs/prometheus/uses/
Prometheus를 설치 및 시작
Prometheus를 시작하려면 (prometheus라는) 바이너리를 실행하면 된다. 이상이다. …. 결론으로서는 이것뿐이지만, 조금은 이것뿐이라고 아무래도 친절하지 않으므로, 데모를 섞어 설명하겠다. Prometheu
www.devkuma.com
https://hays99.tistory.com/278
[Prometheus] 프로메테우스 설치
Docker 설치 $ sudo apt-get update $ sudo apt install docker.io Prometheus 설치 $ sudo vi /tmp/prometheus.yml global: scrape_interval: 15s evaluation_interval: 15s $ sudo docker run -d \ -p 9090:9090 \ -v /tmp/prometheus.yml:/etc/prometheus/prometheus.y
hays99.tistory.com
'DevOps > Monitoring' 카테고리의 다른 글
Grafana와 Slack 연동하고, 실시간 알림 받아보기 - 2 (5) | 2024.03.05 |
---|