forked from boostcampwm-2024/web17-juchumjuchum
-
Notifications
You must be signed in to change notification settings - Fork 1
메트릭 수집에 필요한 툴들 설치하기
KWAKMANBO edited this page Jan 20, 2025
·
2 revisions
- Grafana와 Prometheus를 사용할 예정
- Grafana는 데이터 시각화 수행
- Prometheus는 메트릭 데이터 수집역할
- Prometheus는 메트릭 데이터 수집에 Collector라는 데이터 수집 툴을 사용
-
node_exporter
,postgres_exporter
,cadvisor
,nestjs-prometheus
- 위와 같은 툴들이 있는데 어떤 데이터를 수집하는지 알아보고, 우리 프로젝트에 필요한것들만 사용해볼 예정이다.
-
-
node exporter
은 하드웨어의 상태 및 정보 커널 관련 메트릭을 수징하는 Collector - 현재 하드웨어의 CPU 및 메모리 등 하드웨어 정보를 수집
- 부하 테스트를 진행하면서 서버에 어느정도 부하가 걸리는지 확인하기 위해서는 HW의 상태 및 정보를 확인할 필요가 있으므로
node exporter
는 사용하는게 좋아보임
docker pull prom/node-exporter
- 위 명령어로
node exporter
를 pull 해오자 -
node exporter
image가 pull 된것을 확인할 수 있음
docker run -d \
--net="host" \
--pid="host" \
-v "/:/host:ro,rslave" \
quay.io/prometheus/node-exporter:latest \
--path.rootfs=/host
- 위 명령어를 입력해서
node exporter
를 실행하자 -
node exporter
컨테이너가 host의 namespace에 접근하려면 추가적인 옵션들이 필요함-
node exporter
가 host를 모니터링 하기위해서는 path.rootfs를 호스트 루트 디렉토리로 지정해주어야함 - WHY?)
node exporter
가 호스트의 파일 시스템에 접근할 수 있게 하기위해서
-
-
--net="host"
- 컨테이거나 호스트의 네트워크 네임 스페이스를 공유
- 컨테이너 내부의 네트워크 인터페이스가 호스트와 동일하게 작동하고
-
Node Exporter
가 시스템 리소스 정보를 정확히 수집할 수 있게함 -
- host의 네트워크 네임 스페이스를 공유했기 때문에 포트 포워딩 없이
Node Exporter
가 사용하는 9100으로 접속하면 된다
- host의 네트워크 네임 스페이스를 공유했기 때문에 포트 포워딩 없이
-
--pid="host"
- 컨테이너가 호스트의 프로세스 네임스페이스를 공유
- 컨테이너 내부에서 호스트의 모든 프로세스를 관찰하 메트릭을 수집할 수 있음
-
-v "/:/host:ro,rslave"
- 볼륨을 설정, 호스트의 루트 디렉토리
/
와 컨테이너의/host
디렉토리 경로에 마운트 -
ro
옵션을 통해 마운트를 읽기 전용으로 설정 -
rslave
옵션을 통해 Propagation 설정, 하위 마운트 및 변경 사항이 호스트와 컨테이너간에 공유 -
Node Exporter
는 호스트의 전체 파일 시스템을 확인해야 디스크 관련 메트릭을 수집할 수 있음
- 볼륨을 설정, 호스트의 루트 디렉토리
-
Node Exporter
가 실행되고 있음 -
Node Exporter
는 기본적으로 9100번 포트를 사용한다고 하니http://localhost:9100
로 접속되는지 확인해보자
- 내 로컬환경에서는
http://localhost:9100
로 접속했을때 접속이 안되는 문제가 발생했다. - Node Exporter 접속 안되는 문제] 이 글을 보고 해결할 수 있다.
- Prometheus에서 제공하는 Exporter들의 종류는 정말로 많음
- https://prometheus.io/docs/instrumenting/exporters/ 여기서 어떤 Exporter들을 제공하는지 확인할 수 있음
- 그중 우리 프로젝트에서 사용하는 MySQL은 MySQL server exporter가 있어 사용해보려한다.
- 일단 exporter전용 유저를 만들어서 사용해볼 예정
CREATE USER 'exporter'@'%' IDENTIFIED BY 'XXXXXXXX' WITH MAX_USER_CONNECTIONS 3;
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'%';
FLUSH PRIVILEGES;
-
exporter
는 UserID를 의미하고,'XXXXXXXX'
는 비밀번호를 의미하므로 기호에 맞게 커스텀해도된다. - 생성한 유저의 정보를 확인해볼 수 있다.
sudo echo ''' [client]
host=[컨테이너명]
user=exporter
password=[비밀번호]
''' | sudo tee /home/users/mysql_exporter.cnf
- 디렉토리는 마음대로 해줘도된다. 나같은 경우
home/users
로 지정해줬는데 이때home
디렉토리 속에users
라는 디렉토리가 존재해야 명령어가 수행된다.
-
mysql exporter docker를 통해서
mysql exporter
를 docker로 설치하는 방법을 알아보자
docker pull prom/mysqld-exporter
- 위 명령어로
mysql exporter
를pull해오자
docker run -itd -p 9104:9104 -v /home/users/mysql_exporter.cnf:/.my.cnf --network my-mysql-network --name mysql_exporter prom/mysqld-exporter
- mysql과 연결하기 위해서는
mysql exporter
을mysql
이 속한 네트워크와 동일하게 연결해줘야한다. - mysql이 속해있는 네트워크 my-mysql-network랑 연결해주자
-
docker inspect [네트워크 이름]
으로 mysql과 똑같은 network에 속하는지 확인해주자 - 같은 network에 속하지 않는다면 연결이 안된다..(한참 헤맸다 이거떔에ㅔ..)
- 9104포트로 포트 매핑을 했으니,
localhost:9104/metrics
로 요청을 보내보자 - 요청을 보냈을때 응답으로온 메트릭 데이터이다.
- 맨밑
mysql_up
이 1이면 연결이 된거고 0이면 연결이 안된거니 명심하자! - 같은 네트워크에 속해서 연결할때 명심해야할점, -p 옵션으로 포트 포워딩을 해줬어도, 같은 네트워크 내에서는 컨테이터 내부 포트를 사용하니 포트 매핑한 포트로 연결해줄 필요가 없다고한다!
- 위 처럼 mysql exporter가 메트릭 데이터를 수집해오는것을 확인할 수 있다.
- 위에서 설치한
node exporter
는 http request 및 response time 등을 핸들링하거나 추적하기에는 적합하지 않는 데이터를 수집 - 실제 http request/response를 다루기 위해서
nestjs-prometheus
를 이용해야한다고 한다. - NestJS prometheus 에서 설치하는 방법과 적용방법을 알 수 있다.
- 일단 위에 두개만 먼저 서버에 적용해보고 추후 에 NestJS Prometheus를 도입해볼 예정
grafana monitoring with nestjs
[Prometheus] Node Exporter란?
Mysql exporter Docker 설치
- [1주 2일차 합동 개발 일지](marketCap 데이터 null 이슈 해결)
- 인터셉터를 이용한 로거 개발기
- 배포 환경에서 웹 소캣 연결 실패 문제 해결
- Github Actions를 이용한 CI CD 구축
- nGrinder 테스트 시나리오
- nGrinder TPS가 측정되지 않는 문제
- 메트릭 수집에 필요한 툴들 설치하기
- Node Exporter 연결 안되는 문제
- StockService에서 Repository 계층 분리하기
- Server와 Grafana연동하기
- Guest 로그인 중복 문제 해결