Grafana + Prometheus (1)

김재익·2023년 9월 13일
0
post-thumbnail

대규모 트래픽 환경을 컨트롤하는 프로젝트에서 서버의 상태를 알아보기 위한 모니터링 시스템을 만들어보았다.
결과적으로 분산 서버 환경과 오토스케일링으로 늘어나는 서버에서 발생하는 메트릭을 자동으로 수집하는 환경을 구현하였다.

모니터링 환경을 구현하는 시스템들은 여러가지가있다 AWS의 CloudWatch, Pinpoint, prometheus 등등 그리고 수집한 메트릭 정보를 UI로 그려주는 Grafana가 있다. 네이버 클라우드에도 모니터링을 지원하고 와탭이라는 모니터링 서비스 플랫폼도 존재한다.

여러 방법이 있는데 이 중에 나는 grafana에 prometheus를 물려서 모니터링 하는 방식을 선택했다 이유는 두 가지인데

  1. 비용이 들지 않는다.
  2. jvm 정보도 같이 수집하고싶었다.

비용 문제는 서버가 ec2 환경에서 구동 되기 때문에 cloudwatch를 사용하면 간편하게 받을 수 있지만 비용이 발생할 수 있다고 해서 최대한 지원금을 아껴보고자 포기했고, jvm 정보는 prometheus와 actuator를 이용해서 메트릭을 수집하기 때문에 cpu 부하 정보도 prometheus로 수집하면 되는게 아닐까 해서 시작하게 되었다.

가장 간단하게 구현하는 방법은 도커를 이용하는 방법이다.
실제로 사용한 방법이기도 하다.

Grafana

그라파나의 경우 이미지를 받아와 실행 시켜주기만 하면 바로 해당 ip의 3000번 포트(변경가능)로 호스팅이 된다. 굉장히 가벼운데 그라파나가 제공하는 서비스를 보면 경이롭기까지 하다.

모니터링을 구현하면서 서버를 새로 생성하거나 다른 계정 서버로 옮기는 경우가 있어서 나는 도커 컴포즈를 이용해서 구동시켰다.

docker-compose.yml

version: '3'

services:

  prometheus:
    container_name: prometheus
    image: prom/prometheus
    volumes:
      - /home/ubuntu/prometheus:/etc/prometheus
    ports:
      - "9090:9090"

  grafana:
    container_name: grafana
    image: grafana/grafana
    ports:
      - "3000:3000"

Prometheus

위의 컴포즈파일에 적혀있듯 프로메테우스는 설정파일이 필요하다.
우리가 수집할 정보는 node-exporter를 이용한 PC 정보와 spring actuator에서 나오는 jvm 정보다.

이 둘의 메트릭을 수집하기 위해 설정을 해줘야한다.

도커에서 실행될 프로메테우스의 설정 정보를 파일로 작성해놓고 volumes에 적어서 복사하도록 해준다.

prometheus.yml

global:
  scrape_interval: 15s 
  evaluation_interval: 15s

scrape_configs:
  - job_name: "node-exporter"
    static_configs:
      - targets: ["{ip}:{port}"]

  - job_name: "spring-actuator"
    metrics_path: "/actuator/prometheus"
    static_configs:
      - targets: ["{ip}:{port}"]

그라파나를 구동하는 서버에서 node exporter나 spring boot 서버를 구동중이라면 ip가 아니라 localhost만 적어도 구동 되도록 설정할 수도있다.
방법은 도커의 network_mode 검색.

node-exporter

docker run 명령어로 이미지 받아서 실행하면 끝.

actuator

gradle에 의존성 주입하고

Spring Security를 적용중이라면 /actuator/** 를 permitall 시켜주면 된다.

실제 적용

ec2 서버 ip:3000 접속
아이디 비밀번호 기본값 admin

데이터 추가

프로메테우스 선택

프로메테우스 구동중인 서버:9090 으로 정보 받아오기
(그라파나 구동서버에 프로메테우스 실행했으니 ip정보는 동일)

Dashbords 에 jvm과 node-exporter 그리기

1860 == 남이 만들어 놓은 node-exporter 대시보드

4701 == 남이 만들어 놓은 jvm 대시보드

아까 등록한 프로메테우스 정보 등록하기

확인

문제1

단일 서버의 경우 위의 방법으로 구동하면 되는데 분산 서버 환경이라면 어떻게 해야할까?

정답

두 가지 방법이있다.

  1. 각 서버의 ip를 prometheus.yml에 등록하기
  2. 각 서버에 프로메테우스를 구동시켜서 grafana에 등록하기

문제2

오토 스케일링의 경우는 어떻게 확인하지?

정답

Grafana + Prometheus (2)

profile
개발자호소인

0개의 댓글