Grafana & Prometheus 구축과 트러블슈팅 w/ docker

지누·2024년 10월 6일
post-thumbnail

1. 스프링부트 메트릭 설정

1.1. 의존성 설정

implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'io.micrometer:micrometer-registry-prometheus' 

Spring Boot Actuator는 운영 중인 애플리케이션을 HTTP나 JMX를 이용해서 모니터링하고 관리할 수 있는 기능을 제공한다.

http://localhost:8080/actuator 에 들어가면, 몇개의 링크가 나타나는데 접속해보면 어플리케이션의 상태를 확인할 수 있는 url들이 존재한다.

1.2. application.yml

application.yml에 아래처럼 설정한 뒤, http://localhost:8080/actuator으로 이동하면 더 많은 정보를 확인할 수 있다.

// application.yml
management:
  endpoints:
    web:
      exposure:
        include: "*"

actuator/metrics

http://localhost:8080/actuator/metrics 에 접속한다면 스프링부트 어플리케이션에서 확인 가능한 여러가지 상태를 메트릭으로 받아볼 수있다.

위의 정보를 메트릭을 통해 확인할 수 있고, 우리의 어플리케이션에서 메트릭을 수집하려면 prometheus를 이용해야 한다.

actuator/prometheus

// application.yml
management:
  endpoints:
    web:
      exposure:
        include: "prometheus"

프로메테우스를 이용한 메트릭 수집 이외의 기능은 필요없으니, 위처럼 설정하도록 하자.

http://localhost:8080/actuator/prometheus 으로 들어가보면, 우리 스프링부트서버에서 수집된 메트릭이 나타난다. 이것을 Grafana를 이용하여 모니터링 할 것이다.

2. 프로메테우스 실행 및 도커 환경 설정

로컬에서 테스트 한 후, 모니터링이 돌아갈 ec2에 적용하도록 하겠다.

  • 프로메테우스는 기본적으로 9090포트를 사용하지만, 나는 19090포트를 사용했다.
  • 그라파나는 기본적으로 3000포트를 사용하지만, 나는 13030포트를 사용했다.

2.1. prometheus.yml 생성

로컬 환경에서 docker-compose를 이용하여 프로메테우스그라파나를 띄울 예정이다.

global:
  scrape_interval: 10s
  evaluation_interval: 10s
scrape_configs:
  - job_name: 'prometheus'
    metrics_path: /actuator/prometheus
    static_configs:
      - targets: ['host.docker.internal:8080'] //중요!

targets는 프로메테우스로 메트릭을 수집할 위치이다.

❗️localhost:8080이 아닌 host.docker.internal:8080이다.❗️

2.2. docker-compose.monitoring.yml

그라파나와 프로메테우스가 구동될 도커 환경을 설정한다.

version: '3'

services:
  prometheus:
    image: prom/prometheus
    container_name: prometheus
    volumes:
      - ./prometheus.yml:/prometheus/prometheus.yml:ro
    ports:
      - 19090:9090 // 9090이 아닌 19090포트를 사용
    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 // 3000 아닌 13030 포트를 사용
    user: root

networks:
  promnet:
    driver: bridge

2.3. 확인

docker compose -f docker-compose.monitoring.yml up -d

docker compose를 이용하여 실행하자.

http://localhost:19090/targets?search= 으로 접속했을 때 아래 사진처럼 StateUp이면 성공이다.

prometheus.yml에서 프로메테우스의 위치를 localhost:19090이 아닌 host.docker.internal:19090으로 설정 해 주었다.

처음에 localhost를 이용했다가 수 시간동안 구글을 뒤지며 왜 안되는지 찾았다.

3. 그라파나

http://localhost:13030/ 으로 접속해준다.

로그인하라는 창이 뜨면, admin/admin이 기본 ID/PW이다.

가운데에 있는 Add your first data source를 눌러 프로메테우스에서 수집된 메트릭를 연동한다.

Save & Test를 눌러 커넥션을 맺으면 메트릭 소스 연결이 완료된다.

3.1. 대시보드 구축


Dashboard 탭에서 대시보드를 구축하자.

New Dashboard를 통해 메트릭에서 내가 원하는 값만 시각화 할 수도 있고, 기본적으로 제공하는 템플릿을 쓰는것이 좀 더 편하다.

Import를 눌러 14430번 템플릿을 사용하겠다.

3.1. 짜잔?

실시간으로 갱신이 되고 있으며, 내가 보냈던 api/finding/info api가 몇 번 호출되었는지도 잘 보인다.

이제 로컬에서 테스트를 완료하였으니 EC2 환경에 적용해보자.

4.node-exporter

메트릭을 수집하기 위해, EC2 스프링 서버에 node-exporter를 설치해야한다.

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

https://github.com/prometheus/node_exporter/releases/download/v1.8.2/node_exporter-1.8.2.linux-amd64.tar.gz

tar xvzf node_exporter-1.8.2.linux-amd64.tar.gz

cd node_exporter-1.8.2.linux-amd64

./node_exporter (또는 백그라운드 실행)

이제 {EC2의 IP:9100}으로 접속해보면 다음과 같은 창이 나타난다.
(EC2의 보안그룹을 설정하였다면 인바운드에서 9100포트를 열어줘야한다.)

그럼 우리는 메인서버에 node-exporter를 통해 메트릭을 수집하기 시작한 것이다.

5. 모니터링 서버 구축

모니터링 서버로 사용할 EC2를 생성한다.
위에서 작성한 prometheus.yml,docker-compose.monitoring.yml을 작성하고 실행한다.

prometheus.yml

// prometheus.yml
global:
  scrape_interval: 10s
  evaluation_interval: 10s
scrape_configs:
  - job_name: 'prometheus'
    metrics_path: /actuator/prometheus
    static_configs:
      - targets: ['{스프링서버의ip}:8080']

이번엔 host.docker.internal이 아닌 ip를 입력해야한다.

성공!

6. 메인서버(EC2), DB서버(EC2)도 적용하기

현재는 메인서버에서 돌아가는 스프링부트 어플리케이션에서 수집한 메트릭을 모니터링 하는 것이다.

아까 적용한 node-exporter는 메인서버의 메트릭을 보내는 것이다. 따라서 적용하자

scp -i caecae-spring.pem -r node_exporter-1.8.2.linux-amd64  ubuntu@10.0.2.49:/home/ubuntu/

내 DB서버는 private subnet이다. 보안그룹의 9100번 포트의 인바운드를 열어줘야한다!!


트러블슈팅 1.그라파나 커넥션 에러




http://localhost:19090
http://localhost:19090/metrics
http://localhost:8080/actuator/prometheus
메트릭이 수집되는 어떤 주소를 입력했는데도 연결이 되지 않았다..

그러다 같은 상황에 놓인 사람들이 만들어 놓은 깃허브 이슈의 댓글에서 힌트를 얻었다.
https://github.com/grafana/grafana/issues/46434


트러블슈팅 2. 그라파나 메트릭 실시간 수집이 안됨(딜레이?)

postman을 이용하여 아래의 요청을 여러번 보냈는데, 그라파나에는 실시간으로 나타나지 않았다.
따라서, 뭐가 잘못되었는지 알기 위해 메트릭을 열어 보았다.


3번 보낸 이후, 카운트 값이 16 -> 19로 늘어난 것을 볼 수 있다.

그렇다면 왜 그라파나는 업데이트가 되지 않는 것일까? 현재 시간이 15시인데, 14시24분까지의 api call만 기록에 남아있다.

해답

아래의 코드로 설정하면 그라파나에서 메트릭이 수집되지 않는다.

//prometheus.yml
 global:
  scrape_interval: 10s
  evaluation_interval: 10s
scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['host.docker.internal:19090']

http://localhost:19090/metricshttp://localhost:8080/actuator/prometheus에서 동일한 메트릭을 보여주지만, 스프링부트 어플리케이션에서 보여주는 프로메테우스 url로 연결해야 한다.

위의 사진에서 13:30 부근, 14:30 부근에 수집이 되었던건 환경을 구축하며 prometheus.yml 설정을 이것저것 바꾸면서 순간순간 적용이 되었던 것이고, 위 코드로 설정하고 진행하였더니 실시간 반영이 되지 않았던 것이다.


https://velog.io/@roycewon/Spring-boot-%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81Prometheus-Grafana-docker

https://developer-nyong.tistory.com/49
https://lordofkangs.tistory.com/329

profile
열심히 살자😱

0개의 댓글