용로그
article thumbnail

CI/CD 파이프라인을 구축해 보는 글에 이어 모니터링 시스템을 도입해보고자 하는 사람들에게 도움이 되고자 모니터링 구축기까지 이어서 작성해 본다.

 

모니터링 구축기라고 말은 했다만, CI/CD 파이프라인 글처럼 친절하게 설명하진 않을 것이다. 모니터링이라는 것은 자신의 상황에 맞게 어느 서버에 어떠한 옵션들을 설정해서 어떻게 보고 판단할 건지마다 천차만별이기 때문이다.

 

그래서 그런 모니터링 구축 가이드라인 글도 되려면 될 수는 있겠지만, 내가 모니터링 툴을 직접 도입해 보면서 헷갈렸던 과정들을 위주로 글을 작성하겠다.

 

모니터링이란?
시스템, 서비스, 네트워크 또는 애플리케이션의 상태와 동작을 지속적으로 감시하고 평가하는 프로세스다. 주요 목적은 시스템의 성능, 가용성, 안정성 및 보안을 확인하여 문제를 식별하고 조치할 수 있도록 하는 것이다.

 

Prometheus


모니터링은 내가 만든 서버랑 모니터링 툴이랑 연결하면 뚝딱 완성되는 것이 아니다. 서버의 상태를 측정하고 그것을 토대로 서버의 성능과 상태를 측정해야 나의 서버를 객관적으로 바라볼 수 있다.

 

이렇게 서버의 상태를 측정한 항목이나 지표를 메트릭(Metric)이라고 한다. 아래 사진은 실제 메트릭들(Metrics)이다. 

 

메트릭스

 

이 메트릭들은 실로 엄청나게 자세한 정보들을 제공하는데, 예를 들면 CPU 사용량, 메모리 사용량, 디스크 공간, 네트워크 트래픽, 요청 처리량, 응답 시간 등이 있다.

 

이렇게 메트릭을 저장하고 관리하는 도구 중 하나가 프로메테우스이다. 프로메테우스는 오픈소스로 운영되며 데이터메트릭을 저장하고 애플리케이션의 성능상태 모니터링을 제공한다.

 

프로메테우스가 제공하는 GUI

 

프로메테우스는 메트릭을 받아서 저장만 하지, 메트릭 자체를 수집하는 건 아니다. 메트릭을 수집하는 툴은 따로 있는데, 아래서 자세히 설명하겠다.

Grafana


아무리 프로메테우스가 모니터 GUI를 지원한다지만, 개발자가 저런 모니터를 보고 서버를 관리할바에는 AWS EC2 모니터를 보는 게 나을 것이다. 

 

그래서 훨씬 보기 쉽고 이쁜 GUI를 지원하는 데이터 시각화 툴이 그라파나(Grafana)다. 그라파나 또한 오픈 소스이며 프로메테우스, 그래파이트, 인플럭스, 엘라스틱서치 같은 다양한 데이터 소스와의 연동도 지원한다.

 

대쉬보드 예시

 

확실히 다른 수준의 GUI다 매우 상세한 정보들을 제공하며 자신이 원하는 대로 커스터마이징도 가능하다. 그라파나는 프로메테우스랑 함께 자주 사용되며, 프로메테우스에서 수집한 데이터를 그라파나를 통해 시각화하고 대시보드 형태로 표시할 수 있다.

 

본격 모니터링 시스템 구축하기


모니터링 서버 고려하기

프로메테우스와 그라파나를 띄울 때 어느 서버에 어떻게 띄울지 고려해보아야 한다. 나는 docker-compose를 이용해서 프로메테우스와 그라파나를 docker container를 띄웠다.

 

관련 설정을 간단하면서도 상세하게 설정할 수 있기도 하고 무엇보다 실행하고 관리하기 편하다. 그리고 해당 컨테이너를 띄울 서버를 고민해봐야 한다.

 

처음에는 spring boot가 실행되는 서버에 프로메테우스와 그라파나를 같이 두려고 했지만, 생각해 보면 어느 순간 메인 서버가 터지면 모니터링 서버까지 같이 터지기 때문에 모니터링 서버를 별도의 ec2로 분리하는 게 적합하다고 생각했다.

 

그래서 이번 글에서는 메인 서버 + 모니터링 서버를 따로 사용하기 때문에 ec2 인스턴스가 2개 필요하다. 구조를 보자면 아래와 같다.

 

 

정말 간단한 CI/CD 파이프라인과 모니터링 시스템을 도입한 인프라 구조다. 아래의 ec2 인스턴스가 Node ExporterMetric을 수집한 다음 Prometheus가 해당 Metrics를 가져온다.

 

Node Exporter란?
Prometheuse의 오픈 소스 프로젝트로, 리눅스 및 UNIX 시스템에서 작동하는 메트릭 수집기다. 시스템의 여러 측면을 모니터링하기 위해 사용된다. 호스트 메트릭(CPU 사용률, 메모리 사용률, 디스크 사용률..)을 수집하고 Prometheus에 전달하여 저장하고 쿼리 할 수 있게 한다.

메트릭은 일정 간격으로 수집되어 시계열 데이터로 저장된다. 메트릭을 서버가 켜져 있는 내내 스레드 단위로 메트릭을 수집할 수는 없으니 자신이 원하는 매트릭 수집 간격을 설정해서 몇 초마다 메트릭을 수집할 것인지 정할 수도 있다.

 

메인 서버 Node Exporter 설치

우리는 메인 서버에서 Metrics를 수집한 다음 모니터링 서버에 있는 Prometheus에게 전달해주어야 한다. 그러려면 메인 서버에 Node Exporter를 설치해야 한다.

 

Prometheus 사이트에 접속해서 자신의 상황에 알맞은 Node Exporter를 설치한다. darwin과 linux를 지원하는데 필자는 linux로 진행했다.

 

Darwin이란?
애플이 개발한 운영 체제로, macOS와 iOS 등의 애플 제품군에서 사용된다.

 

 

원하는 파일을 찾았다면 우클릭 후 링크 주소 복사를 클릭한다. 참고로 Node Exporter의 버전은 정말 자주 바뀌기 때문에 인터넷에 돌아다니는 설치법대로 하면 버전이 안 맞을 확률이 매우 높다.

 

때문에 귀찮더라도 공식 사이트에 들어가서 최신 버전으로 다운로드하는 것을 추천한다. 복사했다면 이제 아래의 순서대로 따라 해보자.

 

Node Exporter 설치

wget [복사한 링크]

 

압축 해제

tar xvfz [압축된 파일명]

 

압축 해제한 파일로 이동

cd [압축 해제된 파일명]

 

Node Exporter 실행

이동하면 안에 있는 파일 중에 node_exporter라는 실행 파일이 있을 것이다. 해당 파일을 실행시키면 Node Exporter가 메트릭을 수집하기 시작할 것이다.

 

sudo systemctl start node_exporter

 

그리고 [EC2 인스턴스 IP]:9100/metrics으로 접근해서 아래와 같은 화면이 나오면 성공이다.

 

metrics

 

모니터링 서버 구축

먼저 프로메테우스가 어느 서버를 바라보도록 할 것인지 설정이 필요하다. 먼저 prometheus.yml에 해당 설정들을 해보자.

 

prometheus.yml

global:
  scrape_interval: 10s
  evaluation_interval: 10s
scrape_configs:
  - job_name: 'spring-boot-server'
    metrics_path: /actuator/prometheus
    static_configs:
      - targets: ['domain:port']

  - job_name: 'ec2-server'
    metrics_path: /metrics
    static_configs:
      - targets: ['domain:port']

필자의 프로메테우스는 Node-Exporter로 메트릭을 수집하는 EC2 ServerSpring Actuator로 관리하는 스프링 서버 2개가 있다. 만약 EC2 서버만 모니터링하고 싶다면 ec2-server 세션만 작성해 주면 된다.

 

  • global : 전역 설정을 정의하는 섹션
    • scrap_interval : 목표 서버에서 메트릭을 가져오는 간격
    • evaluation_interval : 프로메테우스에서 규칙 평가 및 알람 생성을 실행하는 간격
  • scrip_configs : 수집 대상 및 대상별 구성을 정의하는 섹션
    • job_name : 프로메테우스에서 해당 작업을 식별하는 데 사용되는 이름
      • metrics_path : 메트릭 엔드포인트의 경로 지정
      • static_configs : 대상 서버를 정의하는 섹션
        • targets : 메트릭을 수집할 서버

 

프로메테우스와 그라파나를 docker-compose로 올릴 것이다. 그러려면 docker-compose 파일을 작성해야 하는데, 평소 docker-compose를 사용했던 사람이라면 어렵지 않게 만들 수 있을 것이다. 내가 작성한 docker-compose 파일은 아래와 같다.

docker-compose.monitoring.yml

version: '3'

services:
  prometheus:
    image: prom/prometheus
    container_name: prometheus
    volumes:
      - ./prometheus.yml:/prometheus/prometheus.yml:ro
    ports:
      - 19090:9090
    command:
      - "--web.enable-lifecycle"
    restart: always
    networks:
      - promnet
    user: root

  grafana:
    image: grafana/grafana
    container_name: grafana
    volumes:
      - ./grafana-volume:/var/lib/grafana
    restart: always
    networks:
      - promnet
    ports:
      - 13030:3000
    user: root

networks:
  promnet:
    driver: bridge

 

그다음 docker compose -f docker-compose.monitoring.yml up -d 명령어를 입력해서 container를 띄우면 프로메테우스(도메인:19090)로 접속할 수 있다.

 

 

헤더의 Status > Targets를 들어가서 prometheus.yml에 설정한 Node Exporter가 설치된 서버의 [EC2 인스턴스 IP]:9100/metrics이 있는지 확인하면 된다.

 

Grafana

이제 거의 다 왔다. 아까 도커로 띄운 그라파나에 접속한다. 처음 접속하면 로그인 화면이 나오는데, 별도의 설정을 안 했다면 ID, PW가 admin, admin일 것이다.

 

[EC2 인스턴스 IP]:13030

 

  • Home > Dashboards > New > Imports 

아래의 화면이 보일 텐데, 기본적으로 제공되는 Grafana GUI는 약간 칙칙하다. 그라파나는 이쁜 대시보드 UI가 많이 제공되는데, 필자는 임의로 정한 대시보드를 설정하겠다. Import via grafana.com1860을 입력하고 Load 하면 된다.

 

 

그리고 간단한 설정을 해주는 창으로 넘어가는데 본인이 설정하면 된다. 그렇게 되면 아래와 같은 이쁜 그래프로 내 서버를 실시간 모니터링 할 수 있다.

 

 

참고로 얼마 전의 시간까지 모니터링할 것인지도 정할 수 있다. Ex) 5분 전, 30분 전, 1시간 전, 분기별, 1년 단위.. 만약 자신이 ec2 프리티어를 사용하고 있다면 단위를 5분 단위로 설정하고 node-exporter가 설치된 서버에서 빌드를 해보면 위와 같은 그래프를 볼 수 있을 것이다.

 

profile

용로그

@용로그

벨덩보단 용덩 github.com/wonyongChoi05