스프링 모니터링 1- 환경 구성(그라파나, 프로메테우스)

Jang990·2023년 7월 27일
0
post-thumbnail

환경

다음 환경에서 간단하게 액추에이터, 프로메테우스와 그라파나를 사용한 모니터링 환경 구성을 해보겠다.
필요한 내용만 확인하고 빠르게 모니터링 환경을 구성하기 위한 글이다.
자세한 내용은 따로 공부하도록 하자.

운영체제: Windows
SpringBoot 2.7.11
java 11
프로메테우스 2.44.0
그라파나 9.5.2

스프링 부트 환경 설정

build.gradle 설정

plugins {
	...
	id "com.gorylenko.gradle-git-properties" version "2.4.1" // git 모니터링을 위한 플러그인 추가
}

...

dependencies {
	...
    
    // 모니터링 설정
	implementation 'org.springframework.boot:spring-boot-starter-actuator' // 액추에이터
	implementation 'io.micrometer:micrometer-registry-prometheus' // 프로메테우스 마이크로미터 구현체 추가
}

액추에이터

implementation 'org.springframework.boot:spring-boot-starter-actuator' // 액추에이터

스프링 액추에이터는 동작하고 있는 서버의 내부 정보를 확인할 수 있도록 만들어준다.
로깅 정보, 애플리케이션 정보 등등 많은 데이터들이 있다.
또한 외부에서 POST 요청을 통해 설정을 바꿀 수 있는 것들도 있다.(Shutdown, 로그 레벨 등등)

git

id "com.gorylenko.gradle-git-properties" version "2.4.1" // git 모니터링을 위한 플러그인 추가

현재 동작중인 서버의 Git 브랜치 명, 커밋 시간 등등의 정보를 추가적으로 제공한다.
git을 사용하지 않는다면 제외해도 상관없다.

프로메테우스 마이크로미터

implementation 'io.micrometer:micrometer-registry-prometheus' // 프로메테우스 마이크로 미터 구현체 추가


이런 식의 액추에이터에서 제공하는 데이터를 그대로 모니터링 툴에서 사용할 수 없다.

세상에는 많은 모니터링 툴이 있기 때문에, 해당 모니터링 툴에서 사용하는 데이터 형식으로 변환해서 서버의 정보를 보내줘야 한다.

특정 모니터링 툴을 쓰려고 해당 모니터링 툴에 맞춰서 데이터 형식을 모두 맞춰놨다.
그런데 어떤 요구사항에 의해 모니터링 툴을 변경해야 한다면 어떻게 해야할까?
기존에 만든 데이터 형식을 모두 바꿔야 한다.

이때 나오는 것이 마이크로미터이다.
마이크로미터를 사용하면 우리가 기존에 사용하는 모니터링 툴을 변경하면, 마이크로미터를 같이 변경하면 된다.
이 글에서는 이 정도만 알아두고 자세한 내용은 따로 공부하도록 하자.

아무튼 해당 코드를 추가하면 액추에이터 제공 정보들 중에 localhost:9292/actuator/prometheus 가 추가된다.
json 형식의 정보가 아닌 프로메테우스가 알아볼 수 있는 형식의 데이터들을 확인할 수 있다.

application.yml 설정

management:
  server:
    # 해당 포트 접근하면 서버의 정보를 다 알 수 있음 - 보안 관련 설정이다!
    port: 9292 
  endpoint:
    health:
      # db, disk, ping 등등 자세한 정보를 볼 수 있도록 만드는 설정
      show-details: always #  status(UP or DOWN)를 포함한 디테일한 숫자정보
#      show-components: always # status(UP or DOWN) 정보만
#    shutdown: 
#      enabled: true # 'POST:...:9292/shutdown' 요청을 하면 서버 내려감
  endpoints:
    web:
      base-path: /my-monitor # '...:9292/my-monitor'로 요청하면 내부 값을 알 수 있다
      exposure:
        include: "*" # 모든 엔드포인트 노출(env beans는 따로 enable 설정해줘야 함)

주석으로 어느 정도 설명을 적어놓았다.

기본적으로 특정 엔드포인트를 사용하려면 2가지 설정을 하면 된다.

  • 엔드포인트 활성화 (endpoint 설정)
  • 엔드포인트 노출 (exposure 설정)

엔드포인트는 기본적으로 shutdown을 제외하고 모두 활성화되어 있다.

엔드포인트 관련 정보는 나중에 필요할 때 해당 문서에서 확인해보자.
https://docs.spring.io/spring-boot/docs/2.1.7.RELEASE/reference/html/production-ready-endpoints.html

엔드 포인트 예시
http://localhost:9292/my-monitor/health 엔드포인트로 들어가면 애플리케이션의 상태 정보를 볼 수 있다.
상태가 전부 UP이라면 서버가 잘 동작하고 있는 것이다.

보안 관련 사항

서버 내부의 상태정보를 보내여주는 액추에이터는 일반 사용자가 볼 수 없도록 만들어야 한다.

# 위에서 본 설정입니다. 보안과 관련된 설정들만 빼놨습니다.
management:
  server:
    port: 9292 
  ...
  endpoints:
    web:
      base-path: /my-monitor

그렇기 때문에 스프링 서버는 디폴트 포트인 8080포트를 사용하고 액추에이터 정보는 9292포트를 사용하도록 변경하였다.
또한 혹시 몰라서 기본 설정인 /actuator를 사용하지 않고 /my-monitor로 변경하였다.

AWS를 사용한다면 8080 포트를 열고 9292 포트는 내부에서만 사용하도록 막을 수 있을 것이다.

보안 관련 사항은 필요할 때 다음 글을 참고하자.
우아한 기술 블로그 - Actuator 안전하게 사용하기

동작 테스트

서버를 실행시키고 다음 url로 접속을 하면 사진과 같은 화면이 나온다면 잘 동작한 것이다.
http://localhost:9292/my-monitor

프로메테우스

액추에이터에서 제공하는 정보들을 저장해야 한다.
그래야 이전 데이터를 확인할 수 있고 실시간으로 변경되는 사항들을 확인할 수 있다.
이렇게 서버 정보를 저장하는 것이 프로메테우스이다.

설치

프로메테우스를 다운받자.
Download | Prometheus

실행 확인

해당 파일을 실행시키고 프로메테우스에 접속해보자.
프로메테우스의 기본 포트는 9090이다.

http://localhost:9090

이런 화면이 나온다면 잘 동작하는 것이다.

하지만 이걸로 끝이 아니다.
http://localhost:9292/my-monitor/prometheus 에서 정보를 수집해와야 한다.

정보 수집 설정

프로메테우스 폴더에 있는 yml 파일을 수정하면 http://localhost:9292/my-monitor/prometheus 에서 정보를 수집하도록 만들 수 있다.


사진과 같이 가장 밑에 해당 코드를 추가해주자. yml 파일이기 때문에 띄어쓰기에 주의하자.

  #추가
  - job_name: "spring-actuator" # 그냥 job name 아무거나 적자
    metrics_path: '/my-monitor/prometheus' # 프로메테우스가 데이터를 가져올 경로
    scrape_interval: 1s # 1초마다 가져온다. 이 설정은 프로젝트에 따라 다르다.
    static_configs:
      - targets: ['localhost:9292'] # 이 경로를 호출해서 계속 수집한다.

이제 프로메테우스를 다시 시작하고 http://localhost:9090 로 접속해서 status에 target으로 이동해보자.

http://localhost:9292/my-monitor/prometheus의 상태가 UP이라면 잘 동작하고 있는 것이다.

이러면 1초마다 http://localhost:9292/my-monitor/prometheus 에서 정보를 가져와서 저장한다.

그라파나

이제 저장한 정보들을 이쁘게 확인해보자.
프로메테우스에서도 그래프로 확인이 가능하다.
근데 대시보드로 더 편하게 확인하려면 그라파나가 필요하다.

그라파나 설치

다음 링크로 들어가서 그라파나를 설치하자.

https://grafana.com/grafana/download?platform=windows

그라파나 실행

설치한 그라파나 폴더에서 /bin 폴더로 이동하면,
다음 사진과 같은 화면이 나오는데 grafana-server.exe를 실행시켜주자.

그라파나는 기본적으로 3000포트를 사용한다.
http://localhost:3000 이 링크를 통해 접속하자.

처음 접속할 때 아이디와 비밀번호는 다음과 같다.

ID: admin
password: admin

그라파나 설정

Adminstration으로 이동한다
DataSource를 클릭한다.

Add data Source 버튼을 누르고 프로메테우스를 선택한다.
프로메테우스를 설정해주면 된다.

우리가 설정한 프로메테우스의 url로 설정 정보를 변경하고 Save & Test를 눌러주면 된다.

그러면 Data source is working이라는 창이 나올 것이다. 이러면 된 것이다.

주의할 점은 스프링 서버, 프로메테우스, 그라파나가 모두 실행중이여야 한다.

중간 설명

스프링 서버(8080포트) - localhost:8080/login 등등 요청 처리

스프링 액추에이터(9292포트) -> 프로메테우스(9090포트) -> 그라파나(3000포트)

스프링의 현재 상태 정보(9292)를 프로메테우스(9090)가 1초마다 가져와서 저장을 한다.
프로메테우스(9090)의 저장된 정보를 그라파나(3000)로 가져와서 대시보드를 꾸민다.

대시보드 사용하기

대시보드는 우리가 만들 수 있지만 그냥 다른 사람이 만들어 놓은 것을 가져다가 사용할 수도 있다.

https://grafana.com/grafana/dashboards/?search=spring
해당 링크로 들어가서 많이 다운받은 대시보드의 ID를 COPY해주자



그리고 대시보드에 들어가서 New Dashboard가 아닌 Import 버튼을 클릭하고 복사한 ID를 넣어주고 load 해주면 된다.
마지막에 있는 datasource는 우리가 앞서 만든 data source로 설정해주자.


그리고 import를 해주면 다음과 같이 예쁜 화면이 등장한다.

이제 CPU 사용률, DB 커넥션 등등의 데이터를 전부 모니터링할 수 있다.

실행되지 않을 때

그라파나 or 프로메테우스가 실행되지 않을 때는 다음과 같이 포트를 확인하자.

프로메테우스 기본(9090) 포트와 그라파나 기본(3000) 포트에서 이미 다른 서비스가 실행되고 있는지 확인.
기존 실행되고 있는 서비스를 종료하거나 포트를 변경.

내용 출처

인프런. 스프링 부트 - 핵심 원리와 활용



도커로 사용해보기.


다음과 같이 docker-compose.yml과 prometheus.yml을 추가해주자.

prometheus.yml

# my global config
global:
  scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).

# Alertmanager configuration
alerting:
  alertmanagers:
    - static_configs:
        - targets:
          # - alertmanager:9093

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
# - "first_rules.yml"
# - "second_rules.yml"

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: "prometheus"

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
      - targets: ["localhost:9090"]

  - job_name: "spring-actuator" # 그냥 job name 아무거나 적자
    metrics_path: '/my-monitor/prometheus' # 프로메테우스가 데이터를 가져올 경로
    scrape_interval: 1s # 1초마다 가져온다. 이 설정은 프로젝트에 따라 다르다.
    static_configs:
      - targets: [ 'host.docker.internal:9292' ] # 이 경로를 호출해서 계속 수집한다.

docker-compose.yml

version: '3'
services:
  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    restart: always
    ports:
      - "3000:3000"
    volumes:
      - grafana-data:/var/lib/grafana
      - ./grafana/provisioning/:/etc/grafana/provisioning/
    environment:
      - GF_SERVER_ROOT_URL=http://localhost:3000
      - GF_SECURITY_ADMIN_PASSWORD=admin
    depends_on:
      - prometheus
    networks:
      - monitoring

  prometheus:
    image: prom/prometheus:latest
    container_name: prometheus
    restart: always
    ports:
      - "9090:9090"
    volumes:
      - ./prometheus:/etc/prometheus/
      - prometheus-data:/prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/prometheus'
    networks:
      - monitoring

volumes:
  grafana-data:
  prometheus-data:

networks:
  monitoring:

Prometheus DataSource

docker compose up으로 실행하고 그라파나의 DataSource를 다음과 같이 추가해주자.

대시보드를 확인할 수 있다.

profile
공부한 내용을 적지 말고 이해한 내용을 설명하자

1개의 댓글

comment-user-thumbnail
2023년 7월 27일

잘 봤습니다. 좋은 글 감사합니다.

답글 달기