MSA 환경에서 모니터링을 위한 Prometheus + Grafana 설정하기

1

TIL

목록 보기
169/183
post-thumbnail

Prometheus로 메트릭 데이터를 수집하여 DB에 저장하고, Grafana를 이용해 데이터를 가져와 시각화 하는 과정


Prometheus 연동

내가 사용할 프로젝트의 각 서비스에 Actuator 의존성을 추가하고 yml 파일에서 각 서비스를 scrape_configs 섹션에 추가하여 메트릭을 수집하도록 한다.

    // actuator
    implementation 'org.springframework.boot:spring-boot-starter-actuator'

    // prometheus
    runtimeOnly 'io.micrometer:micrometer-registry-prometheus'
management:
  endpoints:
    web:
      exposure:
        include: 'prometheus'

이 설정들을 해주고 나면
아래의 엔드포인트에서 다음과 같은 response를 확인할 수 있다.


이 정보들이 Spring Boot의 Metric 정보들이고, 이를 prometheus로 넘겨주어야 한다.


이제 prometheus를 설치하고

docker pull prom/prometheus

prometheus 설정을 할 service 모듈을 추가하여 prometheus.yml 파일을 설정한다.

global:
  scrape_interval: 15s  # 메트릭 수집 주기

scrape_configs:
  - job_name: 'eureka'
    metrics_path: '/actuator/prometheus'
    static_configs:
      - targets: [ 'host.docker.internal:12001' ]  # Eureka Server의 메트릭 엔드포인트

  - job_name: 'gateway-service'
    metrics_path: '/actuator/prometheus'
    static_configs:
      - targets: ['host.docker.internal:12011']  # Gateway 서비스의 메트릭 엔드포인트

  - job_name: 'user-service'
    metrics_path: '/actuator/prometheus'
    static_configs:
      - targets: ['host.docker.internal:12021']  # User 서비스의 메트릭 엔드포인트

  - job_name: 'concert-service'
    metrics_path: '/actuator/prometheus'
    static_configs:
      - targets: ['host.docker.internal:12031']  # Concert 서비스의 메트릭 엔드포인트

  - job_name: 'order-service'
    metrics_path: '/actuator/prometheus'
    static_configs:
      - targets: ['host.docker.internal:12041']  # Order 서비스의 메트릭 엔드포인트

이 설정은 로컬 환경에서 통신할 수 있도록 제공된 주소이므로 배포 환경에서는 targets의 수정이 필요하다.


모든 설정이 완료되었다면 yml 파일을 도커 컨테이너 내부에 마운트하여 가동시킨다.

docker-compose.yml(prometheus.yml 파일과 같은 경로에 위치)

version: '3'

services:
  prometheus:
    image: prom/prometheus
    container_name: prometheus
    ports:
      - "9090:9090"  # Prometheus의 기본 포트
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml  # 호스트의 prometheus.yml 파일을 컨테이너에 마운트
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'  # 설정 파일 경로 지정

터미널에서 해당 파일들이 있는 경로로 가서 docker compose --project-name prometheus up을 입력
(원래는 docker compose up인데 컨테이너 이름을 prometheus로 지정하고 싶어서)


localhost:9090으로 연결된 것을 확인할 수 있고


localhost:9090/targets에서 각 서비스가 정상적으로 설정이 된 것을 확인 할 수 있다.



Grafana 연동

우선, Grafana를 사용하기 위해 docker로 이미지를 가져온다.

docker pull grafana/grafana

도커를 통해 받아온 이미지를 3000번 포트로 가동시킨다.(grafana의 기본 포트가 3000번이라서)

docker run -d --name=grafana -p 3000:3000 grafana/grafana

localhost:3000으로 접속하고 로그인을 한다.
(기본 계정의 아이디와 비밀번호는 admin/admin 이다.)


해당 화면에서 DATA SOURCES 선택


Prometheus 선택


Name과 Connection URL을 지정

했는데 에러 발생

이 오류는 Grafana가 prometheus 호스트 이름을 DNS를 통해 해결하지 못함을 의미

Docker network 목록을 확인해보니 Grafana 컨테이너가 네트워크에 속해있지 않은 상태임을 확인

(base) ~-MacBookAir ~ % docker network ls
NETWORK ID     NAME                                             DRIVER    SCOPE
...
adcdef123456   prometheus_default                               bridge    local
...

docker-compose.yml 파일을 수정하여 같은 네트워크에 연결되도록 설정한다.
version: '3'

services:
  prometheus:
    image: prom/prometheus
    container_name: prometheus
    ports:
      - "9090:9090"
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
    networks:
      - prometheus-network  # Prometheus를 prometheus-network에 연결

  grafana:
    image: grafana/grafana
    container_name: grafana
    ports:
      - "3000:3000"
    depends_on:
      - prometheus
    networks:
      - prometheus-network  # Grafana를 prometheus-network에 연결

networks:
  prometheus-network:
    external: false  # 내부 네트워크로 설정

prometheus와 grafana를 같은 네트워크로 설정을 해주고 컨테이너를 확인을 해보니

(base) sangwoo@sang-uui-MacBookAir resources % docker ps -a
CONTAINER ID   IMAGE               COMMAND                  CREATED          STATUS                       PORTS                              NAMES
7818333aa000   grafana/grafana     "/run.sh"                3 minutes ago    Created                                                         grafana
3a239ee5e000   prom/prometheus     "/bin/prometheus --c…"   15 minutes ago   Exited (137) 3 minutes ago                                      prometheus
261ee743c000   grafana/grafana     "/run.sh"                2 hours ago      Up 22 minutes                0.0.0.0:3000->3000/tcp             intelligent_sammet

grafana가 2개가 충돌이 일어나고 있는 것을 확인

둘 모두 삭제해주고나서 다시 compose up을 한 후 시도해보니 성공


보여질 대시보드를 설정해줘야됨


새로운 대시보드를 생성하고

대시보드를 커스텀해서 사용할 수 있지만 기존에 만들어져있는 대시보드를 임포트하여 사용할 수 있다.

강의자료에서 사용했던 spring boot 3용 대시보드를 Load


설정한 prometheus를 선택 후 Import


연동한 프로젝트의 정보를 시각화하여 확인할 수 있다.

0개의 댓글

관련 채용 정보