-
깔짝 맛보는 프로메테우스(Prometheus) + 그라파나(Grafana) 를 이용한 시스템 모니터링 대시보드 만들기스터디 노트 2023. 11. 16. 15:09
📌 들어가며
갑자기 신규 프로젝트에서 시스템 모니터링에 대한 이슈가 대두되며 모니터링에 대한 스터디가 필요하게 되었습니다.
그래서 귀동냥으로 알고있던 '프로메테우스를 도입해보자!'고 적극 어필하였고, 사전 스터디를 진행해보게 되었습니다.
어떻게 해야하나..싶었는데, 뭐 별 것 있습니까?
그냥 만들어보는거죠 ㅎ
샘플 코드들은 아래 깃헙에서 확인하실 수 있습니다.
📌 개념부터
일단 프로메테우스라는 것은 무엇일까요?
'프로메테우스'는 그리스 신화에 올림포스의 신들보다 한 세대 앞서는 티탄족에 속하는 신..
아 이게 아니고, 프로메테우스는 원래 SoundCloud에서 구축된 오픈 소스 시스템 모니터링 툴입니다.
지표를 시계열 데이터로 수집하고 저장하며 지표정보는 레이블이라고 하는 키-값 쌍과 타임스템프도 함께 저장되게 됩니다.
프로메테우스는 메트릭의 수집 및 시각화와 알람매니저를 통한 알람, 그리고 서비스 디스커버리 등의 기능을 제공합니다.
2016년에는 쿠버네티스에 이어서 두번째로 Cloud Native Computing Foundation(CNCF) 산하의 프로젝트가 되었습니다.
프로메테우스의 특징은 다음과 같습니다.
- 메트릭 이름과 키/값 쌍으로 식별된 시계열 데이터를 가진 다차원 데이터 모델
- 다차원 데이터 모델을 지원하기 위한 유연한 PromQL을 활용
- 메트릭 데이터는 HTTP를 통한 Pull 방식으로 수집
- 서비스 디스커버리 기능 및 다양한 그래프 작성, 대시보드 지원
다음은 프로메테우스의 Architecture 입니다.
프로메테우스는 Pushgateway라는 것을 통해 측정된 메트릭 데이터를 스크랩해옵니다.
모든 데이터를 로컬에 저장하고 이에 대한 규칙을 적용해 경고 알람 및 시각화 기능을 제공하게 됩니다.
프로메테우스 자체적으로도 Web UI를 제공하긴하지만, 대부분은 Visualization Tool인 Grafana를 많이 활용하고 있습니다.
프로메테우스는 순수하게 시계열 데이터를 수집하고 시각화 하는데 적합한 오픈소스 라이브러리입니다.
이를 통해 모니터링을 보다 정밀하게 할 수 있다는 장점을 지니고 있지요.
하지만 요청별 수집 데이터 자체가 100%의 퍼펙트한 정확성을 보장하는 것은 아니기 때문에 순수 모니터링 이외의 청구나 기타 크리티컬 코어 비즈니스에는 적합하지 않을 수 있습니다.
📌 직접 해봅시다
이번 예제에서는 시스템 데이터 메트릭을 수집하여 시각화해볼겁니다.
Docker를 베이스로 Prometheus와 Grafana를 설치하고 Node-exporter를 연동하여 실제 시스템 메트릭 데이터를 스크래핑하여 대시보드를 띄워보기까지 진행해보도록 하겠습니다.
잠깐, 그럼 Node-exporter는 또 뭘까요?
쉽게 생각해서 exporter란 메트릭 데이터 수집기 입니다. 시스템 또는 특정 메트릭 데이터를 수집하여 엔드포인트에 제공해주는 역할을 하는 모듈이라고 생각하시면 편하겠네요.
그리고 Node-exporter라는 것은 UNIX계열 커널을 가진 하드웨어와 OS의 시스템 데이터들을 수집하는 Exporter의 한 종류입니다.
즉, Node-exporter는 Prometheus 모니터링 시스템과 함께 사용하기위해 개발된 오픈소스 소프트웨어로 운영중인 시스템의 각종 메트릭 정보를 수집해 프로메테우스에 전달해주는 역할을 하는 것이죠.
이렇게 수집된 데이터는 Prometheus의 PromQL을 통해 손쉽게 쿼리가 가능합니다.
앞서 설명드린데로 Docker 위에 Prometheus와 Grafana 그리고 Node-exporter까지 모두 설치하여 연동할 것입니다.
Docker-compose.yml파일을 한 번 확인해보겠습니다.
우선 Prometheus의 경우 실행을 위해서는 특정 폴더를 지정해주시는 것이 좋습니다.
제 PC는 윈도우 기반이기에 폴더명을 D드라이브에 Prometheus로 잡아주었습니다.
여기 아래 config폴더를 만들고, prometheus.yml파일을 놓을 것입니다.
version: '3.7' services: prometheus: image: prom/prometheus container_name: prometheus volumes: - D:\prometheus\config\:/etc/prometheus/ // 윈도우 계열이기에 역슬레시를 사용했습니다. - D:\prometheus\prometheus-volume:/prometheus ports: - 9090:9090 command: // web.enalbe-lifecycle은 api 재시작없이 설정파일들을 reload 할 수 있게 해줍니다. - '--web.enable-lifecycle' - '--config.file=/etc/prometheus/prometheus.yml' - '--storage.tsdb.path=/prometheus' - '--web.console.libraries=/usr/share/prometheus/console_libraries' - '--web.console.templates=/usr/share/prometheus/consoles' restart: always
위와 같이 설정하면 프로메테우스는 9090포트를 통하여 구동되게 됩니다.
위에 나와있는데로 prometheus의 설정은 D:\prometheus\config 폴더 안에 prometheus.yml이라는 설정 파일을 만들어줍니다.
참고로 해당 내용은 구루미님의 깃헙의 설정파일을 참고하여 제작하였음을 먼저 밝힙니다.
# my global config global: scrape_interval: 15s # By default, scrape targets every 15 seconds. evaluation_interval: 15s # By default, scrape targets every 15 seconds. external_labels: monitor: 'my-project' rule_files: # - 'alert.rules' # - "first.rules" # - "second.rules" # alert # alerting: # alertmanagers: # - scheme: http # static_configs: # - targets: # - "alertmanager:9093" # A scrape configuration containing exactly one endpoint to scrape: # Here it's Prometheus itself. scrape_configs: - job_name: 'prometheus' scrape_interval: 5s static_configs: - targets: ['localhost:9090'] - job_name: 'node-exporter' scrape_interval: 5s static_configs: - targets: ['node-exporter:9100']
다음은 node-exporter의 설정 내용입니다.
node-exporter: container_name: node-exporter image: prom/node-exporter ports: - "9100:9100"
node-exporter는 prometheus에서 제공해주는 이미지를 활용하며 컨테이너명은 node-exporter 입니다
다음은 Grafana의 설정입니다.
grafana: container_name: grafana image: grafana/grafana:latest ports: - "3000:3000" volumes: - D:\prometheus\grafana\datasource.yml:/etc/grafana/provisioning/datasources/datasource.yml environment: - GF_AUTH_ANONYMOUS_ENABLED=true - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
위에서 언급드린데로 D드라이브 내에 prometheus 폴더를 만들고 config 폴더와 같은 위치에 grafana 폴더를 만들어줍니다. 그리고 그 안에 아래와 같이 작성된 datasource.yml 파일을 넣어주시면 됩니다.
# config file version apiVersion: 1 deleteDatasources: - name: Prometheus datasources: - name: Prometheus type: prometheus access: proxy orgId: 1 url: http://prometheus:9090 basicAuth: false isDefault: false version: 1 editable: false
설정은 모두 끝났습니다. 그럼 이제 Docker에 컨테이너를 올려볼까요?
> docker-compose up -d -d 옵션을 사용하면 데몬 모드로 백그라운드에서 구동시킬 수 있습니다.
프로메테우스의 Web UI에서 PromQL 창에 'up'이라고 입력하면 prometheus는 9090번에서 구동중이며 node-exporter가 9100번에서 실행중인 것을 볼 수 있습니다.
그리고 localhost:9090의 Prometheus의 /metrics URI로 접속하면 텍스트로 된 시스템 메트릭 데이터를 조회할 수 있습니다( http://localhost:9090/metrics).
그리고 localhost:3000 으로 접속을 하게 되면 Grafana 대시보드에도 접속을 할 수 있게 됩니다.
그라파나에서는 다양한 대시보드 레이아웃 템플릿을 제공을 합니다.
아래 사이트에 접속하시면 다양한 대시보드들이 보이실겁니다.
여기서 우리는 Node Exporter Full 이라는 대시보드를 사용하겠습니다.
해당 대시보드를 클릭하고 안으로 들어가서 우측에 위치한 Copy ID를 클릭합니다.
그럼 해당 대시보드의 ID가 복사되고 이를 Grafana에 적용하면 대시보드 템플릿을 손쉽게 사용할 수 있습니다.
복사한 대시보드 ID를 입력 후 Load를 하면 다음과 같은 화면이 뜹니다.
Prometheus를 선택한 후 Import를 해주면 아래와 같이 손쉽게 템플릿으로 구성된 그라파나 대시보드를 활용할 수 있게 됩니다.
📌 마치며
갑작스럽게 스터디해보게된 프로메테우스(Prometheus) 였습니다.
가장 특이한 점은 기존의 모니터링 방식이 데이터를 푸시 받는 방식이었다면, 프로메테우스는 풀링 방식으로 exporter를 통해 메트릭 데이터 스크래핑을 한 정보를 가져옴으로써 기존의 서버나 시스템에 어떠한 변경이나 부담을 주지 않은 상태에서 손쉽게 데이터를 가져와서 모니터링을 할 수 있다는 것이었습니다.
이제 시스템 관리를 저희 프로젝트로 가져와서 그라파나를 빼고 저희 솔루션에서 모니터링 할 수 있도록 만들어야겠네요..
하..하하..
'스터디 노트' 카테고리의 다른 글
[ClickHouse] 클릭하우스란 무엇일까? (0) 2023.11.20 [SQL] JOIN이란? JOIN의 종류(INNER, LEFT, RIGHT, FULL OUTER JOIN) (1) 2023.11.17 MongoDB + Docker 설치 및 기본 동작 방법 bash: mongo: command not found (1) 2023.11.09 도커 + 카프카 명령어 (0) 2023.11.08 스프링 환경에서 웹 애플리케이션 설정 메커니즘 정리 (0) 2023.11.01