
Prometheus에 수집한 데이터를 Grafana를 통해 대시보드를 구축합니다.
Docker-compose를 사용하여 모니터링시스템을 구축.
Prometheus중심으로 메트릭 수집.
->필요한 exporter를 세팅하여 메트릭 수집. node-exporter와 cadvisor 사용
node-exporter: 인프라 메트릭 수집
cadvisor: 각 도커 컨테이너의 메트릭 수집(주로 kubernetes에 사용)
Grafana 에서 PromQL이라는걸 보낸다고 되어있는데 PromQL은 Prometheus 쿼리 언어로, Prometheus에서 수집한 메트릭 데이터에 대해 쿼리를 실행하고 결과를 검색하는 데 사용됩니다. Grafana는 이러한 Prometheus 데이터를 시각화하고 대시보드에 표시하기 위해 Prometheus와 통합될 수 있습니다. 그러므로 Grafana에서 Prometheus 서버로 PromQL을 보내는 것은 Grafana 대시보드에 표시할 데이터를 요청하는 과정을 의미합니다. 이를 통해 사용자는 Prometheus로부터 수집된 메트릭 데이터를 쿼리하고, Grafana 대시보드에서 시각적으로 나타낼 수 있습니다.
PromQL은 SQL과 다르게 시계열데이터를 보내는데 특화되어있다.
인프라 메트릭, 도커 컨테이너 메트릭을 왜 수집해야할까?
예를들어 쿠버네티스 환경에서는 여러 서버가 있고 각각 서버 부하들이 있을텐데 이 부하들을 기반으로 자동화가 되어있을 것이다. 카카오톡의 경우 해가 바뀌어 1월1일 00시가 될 때 서버의 트레킹이 엄청 튈 것인데 이걸 예상해서 서버를 여러 대 더 띄워놓을으려고 할 것이다. 그러면 00시에 피크 치겠지만, 미리 00시 근처에 좀 더 민감하게 세팅 해 놔서 순간적으로 들어올 때를 볼 수 있다면 서버를 미리 띄워놓는 준비를 할 수 있다. 그래서 인프라 메트릭을 수집하는 것이다.
우리가 개발을 할 때 코드를 완벽하게 짰다고 생각하더라도 계속 사용하다보면 memory leak(메모리가 계속 쌓임)이 발생할 수 있다. 이것은 코드가 이상해서, 혹은 라이브러리의 버그일 수도 있고 여러 이유로 발생 할 수 있는데, 그렇다면 이 컨테이너 안에 있는 메트릭을 트래킹하지 않으면 memory leak이 있는지 없는지 알 수가 없다. (쿠버네티스에서 어느정도 이 부분을 해결해주긴 한다)
하나하나 찾아서 보는것과, 대시보드을 만들어서 쉽게 한눈에 보는 것과는 효율에서 큰 차이가 있다.
데이터 시각화 및 모니터링 도구. 사용자는 Grafana를 통해 다양한 데이터 원본에서 데이터를 쿼리하고, 이를 시각적으로 표현하여 실시간으로 모니터링하고 분석할 수 있다. 주로 시계열 데이터와 지표를 다루는 데에 특화되어 있다.
여러 데이터소스를 지원하며 Prometheus, InfluxDB, Graphite, Elasticsearch, MySQL, PostgreSQL 등이 포함된다.
커뮤니티에서 공유된 대시보드들을 쉽게 import해서 사용할 수 있다.
시스템 및 서비스의 모니터링 및 경고 도구로 널리 사용되는 오픈소스 메트릭 데이터 저장 및 쿼리시스템. Kubernetes, Docker 및 클라우드 기반 환경과 같은 동적으로 확장 가능한 환경에서 특히 인기가 있다.
PromQL이라는 고유 쿼리 언어를 사용하여 데이터에 대한 유연한 쿼리 지원
단일 서버에 자동으로 데이터를 저장하기 때문에 분산 스토리지에 의존할 필요가 없다.
Service discovery 또는 Static Configuration을 통해 수집 대상을 설정할 수 있습니다. 이번 실습에서는 Static Configuration을 해볼것
인프라 메트릭을 수집할 node_exporter를 설정한다. 메트릭 수집에 필요한 경로를 마운트 해준다.
# docker-compose.yaml
services:
prometheus:
...
node_exporter:
image: quay.io/prometheus/node-exporter:latest
container_name: node_exporter
command:
- '--path.rootfs=/host'
ports:
- 9100:9100
restart: unless-stopped
volumes:
- '/:/host:ro,rslave'
도커컨테이너 메트릭을 수집하기위해 설정
# docker-compose.yaml
services:
prometheus:
...
node_exporter:
...
cadvisor:
image: google/cadvisor:latest
container_name: cadvisor
ports:
- 8081:8080
restart: unless-stopped
volumes:
- /:/rootfs:ro
- /var/run:/var/run:rw
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro #-> 도커는 가상화가 아니고 프로세스 격리이다.
volumes 경로를 보면 이상하게 되어있는데 이것은 도커의 루트경로이다. 다른컴퓨터 처럼 되어있지만 실제로는 내 컴퓨터의 어딘가에 랜덤하게 도커파일 경로가 임의로 생성이 되어있다. ex) /var/lib/docker~
/sys:/sys:ro -> 도커도 하나의 프로세스이기 때문에 프로세스 실행 목록을 보면 어떤 도커파일이 떠있을 것이다. 이러한 시스템 경로들도 마운트를 해줘야한다.
volumes 경로의 각각 모든경로들을 다 마운트 해줘야 제대로 된 수집이 가능해진다.
(여기 volumes의 마운트 경로의 경우 도커의 기본적인 경로임)
(실제 코드 넣을 때 주석은 빼야한다)
Prometheus는 prometheus.yml 파일에 정의한 scrape_configs를 기반으로 메트릭을 수집할 수 있습니다.
cadvisor 및 node_selector의 데이터를 5초에 한번씩 수집하도록 설정합니다.
해당 파일은 volume mount로 전달되지만 수정한 내용을 반영하기 위해 재시작 해야합니다.
# prometheus.yml
scrape_configs:
- job_name: cadvisor
scrape_interval: 5s # 5초에 한번씩 수집
static_configs:
- targets:
- cadvisor:8080 # 8080포트에 cadvisor를 떄려라
- job_name: node
scrape_interval: 5s
static_configs:
- targets:
- node_exporter:9100
도커 파일을 수정했을 때는 항상 도커 재시작을 해줘야한다. 실행 시에 이미지가 주입되기 때문.
docker-compose up -d로 실행하면
와 같은 권한문제가 발생할 수 있다.
우선 docker-compose down 으로 내려놓은 후에, ll명령어를 쳐보면
처럼 뜰 것이다. 여기서 권한문제를 해결하려면 저 앞의 drwxr-xr-x를 읽을 줄 알아야하는데 이걸 읽는방법은 맨 첫글자는 디렉토리or파일을 나타내고(d or -), 그 후에는 3글자씩 끊어서 읽으면 된다.
d : 디렉토리
- : 파일이란 뜻
r : 읽기권한이 있다는 뜻
w : 쓰기권한이 있다는 뜻
x : 실행권한이 있다는 뜻
우리의 권한에러는 grafana에서 났기 때문에 grafana 의 경우를 읽어보면
'd': 디렉토리
'rwx' : 첫번째 3글자는 만든사람(나) = root를 의미하고, rwx이니까 읽기,쓰기,실행 권한 다 있음
'r-x' : 두번째 3글자는 나의 그룹=root 를 의미하고, r-x 이니까 읽기, 실행 권한만 있음
'r-x' : 세번째 3글자는 나머지others = 4096를 의미하고, 읽기, 실행 권한만 있음
으로 읽을 수 있다. 지금 w 가 없다. 즉, 나의그룹이 쓰기 권한이 없는 상태이므로 권한 에러가 난 것으로 유추할 수 있다. 앞의 두 곳만 쓰기권한을 줘 보자. 'drwxrwxr-x' 로 바꿔주면 된다. 우리가 3글자씩 끊은 이유는 컴퓨터가 이 부분을 3비트씩 끊어서 나타내기 때문이다(읽기,쓰기,실행 3개라서 3비트). 이것을 0과 1로 바꿔서 표현해 보면 111 111 101 이 된다. 이것은 10진법 숫자로 7 7 5 를 의미한다.
명령어: sudo chmod -R 775 grafana/
여기서 -R은 해당 디렉토리의 하위 디렉토리까지 싹 다 동일한 작업을 적용시켜라 라는 의미.
(chmod = change mode)
수정된모습
수정 후 다시 도커컴포즈 파일 실행 해보면
와 같은 성공화면이 뜰것이다.
포트포워딩 3000, 9090 설정해주고
localhost9090 주소로 접속해보면

Status - Configuration 가면 어떻게 설정했는지 코드를 볼 수 있고
Status - Targets 가면 수집중인 메트릭을 볼 수 있다.
잘 수집되고 있다면 초록색으로 UP 이 떠있다.

localhost:3000 으로 접속
보통은 github 연동해 놓거나 github으로 자동로그인 되도록 설정해놓는데 나중에 여유있을 때 하고, 일단은
id : admin
pw : admin
으로 접속하자. (비번변경은 skip)
그 후 쭉 내려서 Save&Test 로 저장. ( 성공문구 떠야함)

Connection URL, Authentication 등등 각각 db정보 적어서 Save&Test 하자
(airflow 환경변수 세팅할때 썼던 compose.yaml 파일 참고하면 편함
(추후 mlflow, airflow 대시보드도 만들어보자)


json파일을 업로드 하거나, url 혹은 id를 적으라고 한다.
마우스가 가리키는 곳을 클릭하면 공유되어있는 대시보드들을 찾을 수 있다.
이 중 Node Exporter Full 을 사용해보자

붙여넣기 한 다음 밑에 Load 클릭
완료

여기서 SWAP Used가 안뜨는 이유는 swap메모리가 설정이 안되어있어서 그렇다.
swap메모리는 컴퓨터가 RAM메모리를 다 썼을 때 하드디스크, ssd를 대신 가상메모리로 사용하게 해주는건데 속도가 RAM보다 느린 대신 컴퓨터를 꺼도 데이터가 유지된다.
명령어 free -h 를 해보면
swap 메모리가 0인걸 볼 수 있다. 설정해주면 뜰 것임.
Crtl + S 로 대시보드 저장해주자

마찬가지의 방식으로 Docker Container & Host Metrics 대시보드도 import해보자.


만약 수정하고 싶다면 해당 이미지에 마우스를 갖다 댄 후 점 3개를 누르고 edit

예를 들어 Running containers 같은 경우는 edit으로 들어가보니 count(container ~ 부분이 수집이 안되고 있어서 안뜨는 것이다.
대시보드 둘 다 Ctrl + S 로 저장해주고 별표시까지 눌러서 즐찾까지 해두자.