모니터링

ayboori·2024년 9월 5일
0

Spring

목록 보기
22/24

Spring Boot Actuator : 어플리케이션의 상태, 성능을 점검할 수 있도록 다양한 엔드포인트 제공 / 메트릭 데이터를 수집, 제공
Prometheus : 수집된 메트릭을 보관할 DB
Grafana : 수집된 메트릭을 시각화 할 대시보드

모니터링

  • 시스템의 성능, 안정성, 가용성을 실시간 관찰, 측정하는 과정

모니터링의 중요성

메소드의 에러, 성능 병목 현상, 리소스 낭비 절약
로그 분석으로 이상 징후 등 식별

  • 사용자가 에러를 발견 후 신고하기 전에 우리가 식별해야 한다!
  • 문제 예방: 모니터링을 통해 잠재적인 문제를 사전에 발견, 해결
  • 빠른 대응: 시스템 다운 타임, 딜레이 타임을 최소화
  • 성능 최적화: 애플리케이션의 성능 병목 지점을 찾아 개선
    실제 프로그램 개발 시 Server에서 자원을 사용하기 때문에 최적화가 중요
  • 사용자 경험 향상: 안정적이고 빠른 서비스를 제공하여 사용자 만족도를 높입니다.
  • 비즈니스 연속성: 시스템 가용성(끊임 없는 서비스)을 보장하여 비즈니스 운영의 연속성을 유지

    요청이 많아지는 순간을 알림으로 받고, 예상하여 어플리케이션 확장 등으로 대응

모니터링의 범위**

  • 서버 모니터링: CPU, 메모리, 디스크 사용량, 네트워크 트래픽 등 서버 자원 사용
  • 애플리케이션 모니터링: 애플리케이션의 상태, 성능, 로그 등을 모니터링 백엔드 개발자인 우리에게 제일 중요한 부분!
  • 네트워크 모니터링: 네트워크 트래픽, 대역폭 사용량, 네트워크 지연 등을 모니터링
  • 데이터베이스 모니터링: 쿼리 성능, 연결 수, 데이터베이스 사용량 등을 모니터링
  • 보안 모니터링: 보안 이벤트, 침입 시도, 취약점 등을 모니터링

Spring Boot Actuator

Spring Boot 애플리케이션의 상태와 성능을 모니터링하고 관리할 수 있도록 다양한 엔드포인트를 제공하는 기능

  • 헬스 체크, 메트릭스, 환경 정보, 로그 정보 등을 쉽게 확인할 수 있도록 함

Actuator 의존성 추가

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

Actuator 엔드포인트

  • Actuator는 기본적으로 여러 엔드포인트를 제공합니다. 이러한 엔드포인트는 /actuator 경로 하위에 위치하며, 각각의 엔드포인트는 다양한 정보를 제공합니다.

    • /actuator/health: 애플리케이션의 상태를 확인합니다.
    • /actuator/metrics: 애플리케이션의 메트릭 정보를 제공합니다.
    • /actuator/loggers: 로깅 설정을 조회하고 변경할 수 있습니다.
    • /actuator/env: 환경 변수와 설정 정보를 확인합니다.
    • /actuator/beans: 애플리케이션 컨텍스트에 있는 빈 목록을 확인합니다.
    • /actuator/threaddump: 스레드 덤프를 확인합니다.
    • /actuator/httptrace: 최근 HTTP 요청 및 응답을 추적합니다.

엔드포인트 접근 설정

  • application.properties 에서 활성화, 비활성화
spring.application.name=sample

server.port=8080

#모든 엔드포인트 노출 설정
management.endpoints.web.exposure.include=* 

#헬스 체크 엔드포인트 상세 정보 표시 설정
management.endpoint.health.show-details=always 

# 이 설정은 /actuator/health 엔드포인트에서 헬스 체크 정보를 항상 상세히 보여주도록 설정합니다. 기본적으로, 헬스 체크 엔드포인트는 요약된 상태 정보만 제공하며, 상세 정보는 노출되지 않습니다.

# never: 헬스 체크 상세 정보를 절대 표시하지 않습니다.
# always: 모든 사용자에게 헬스 체크 상세 정보를 항상 표시합니다.
# when_authorized: 인증된 사용자에게만 헬스 체크 상세 정보를 표시합니다.

엔드포인트 보호

모든 엔드포인트를 노출하는 것은 운영 환경에서 위험하다. 필요한 엔드포인트만 노출하고, 항상 노출하는 것 보다는 인증된 사용자에게 노출하자

  • 엔드포인트 보호
    • actuator 접근 포트만 다른 포트로 설정하여 보호
        # 애플리케이션의 기본 포트를 8080으로 설정
        server.port=8080
        
        # Actuator 엔드포인트를 19090 포트에서 서비스하도록 설정
        management.server.port=19090
  • Spring Security를 사용하여 민감한 엔드포인트에 접근 제어를 설정

  • 예를 들어, /actuator 경로에 대한 보안 설정을 추가

        import org.springframework.context.annotation.Configuration;
        import org.springframework.security.config.annotation.web.builders.HttpSecurity;
        import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
        import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
        
        @Configuration
        @EnableWebSecurity
        public class SecurityConfig extends WebSecurityConfigurerAdapter {
            @Override
            protected void configure(HttpSecurity http) throws Exception {
            // /actuator/ 하위의 모든 접근은 authenticated 필요
                http.authorizeRequests()
                    .antMatchers("/actuator/**").authenticated() 
                    .and()
                    .httpBasic();
            }
        }

Prometheus

  • Prometheus는 오픈소스 시스템 모니터링 및 경고 도구입니다.
  • 시계열 데이터베이스를 사용하여 메트릭 데이터를 수집하고, 쿼리 및 시각화를 통해 시스템 상태를 모니터링하고 경고를 설정할 수 있습니다.
  • 수집한 메트릭 (메모리 사용률, CPU 사용률, 스레드 사용률 등등.. 시간에 따른 추이를 추적할 가치가 있는 데이터)을 보관할 DB의 역할
  • 메트릭 수집은 Actuator 내에 내장된 마이크로미터 모듈이 담당한다.

주요 구성 요소

  • Prometheus 서버:
    • 메트릭 데이터를 수집하고 저장하는 핵심 컴포넌트입니다.
    • 각 타겟 (어플리케이션 / ~이 제공하는 엔드 포인트)으로부터 데이터를 주기적으로 스크랩(scrape)하여 시계열 데이터베이스에 저장합니다.
    • 시계열 데이터베이스(Time Series Database, TSDB)는 시간에 따라 변화하는 데이터를 효율적으로 저장하고 조회할 수 있도록 최적화된 데이터베이스입니다.
  • Exporters:
    • Prometheus는 기본적으로 애플리케이션에서 메트릭 데이터를 수집합니다.
    • Exporter는 특정 애플리케이션이나 시스템의 메트릭 데이터를 Prometheus가 이해할 수 있는 형식으로 변환해주는 도구입니다.

      예시: Node Exporter (서버의 시스템 메트릭 수집), PostgreSQL Exporter (PostgreSQL 메트릭 수집), Spring boot의 micrometer-registry-prometheus 디펜던시

  • Pushgateway:
    • 짧은 수명의 작업(job)에서 메트릭을 수집하여 Prometheus 서버에 푸시(push)할 수 있습니다.
    • 일반적으로 지속적으로 실행되지 않는 작업에서 사용됩니다.

      예를 들어 배치 작업, 스크립트 실행, 크론 작업 등

  • Alertmanager:
    • Prometheus 서버에서 발생하는 경고(alert)를 처리하고, 이메일, PagerDuty, Slack 등 다양한 방법으로 알림을 보낼 수 있습니다.
  • Grafana:
    • Prometheus 데이터를 시각화하기 위해 자주 사용되는 대시보드 도구입니다.
    • Grafana를 사용하면 Prometheus에- 서 수집한 메트릭 데이터를 대시보드 형태로 시각화할 수 있습니다.

실습

  • Prometheus 의존성 추가

  • application.properties 추가

management.endpoint.prometheus.enabled=true

http://localhost:8080/actuator/prometheus
에 접속하여 프로메테우스 매트릭스를 확인 가능

  • prometheus.yml 파일 생성
    (폴더 위치는 자유, monitor 라는 폴더를 새로 생성할 수 있다.)
    모니터링할 타겟, 기타 설정을 정의모니터링할 타겟, 기타 설정을 정의
global:
  scrape_interval: 15s

scrape_configs:
  - job_name: 'spring-boot'
    metrics_path: '/actuator/prometheus'
    static_configs:
      - targets: ['host.docker.internal:8080']
  • host.docker.internal

host.docker.internal은 Docker에서 제공하는 특수한 DNS 이름으로, Docker 컨테이너가 호스트 머신(즉, Docker를 실행하는 컴퓨터 / docker로 띄운 프로젝트가 아닌 Spring Boot 프로젝트)의 네트워크 서비스에 접근할 수 있도록 합니다.
이를 통해 컨테이너 내부에서 호스트 머신의 네트워크 주소를 참조할 수 있습니다.

docker 컨테이너 실행

docker run -d --name=prometheus -p 9090:9090 -v /path/to/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus

docker run: Docker에서 새로운 컨테이너를 생성하고 실행하는 명령입니다.

-d: 이 옵션은 컨테이너를 백그라운드에서 실행하게 합니다. 즉, 터미널을 차지하지 않고 뒤에서 실행되는 상태를 유지합니다.

--name=prometheus: 생성될 컨테이너의 이름을 prometheus로 지정

-p 9090:9090: Docker 컨테이너의 네트워크 포트 설정입니다.

첫 번째 9090은 호스트 머신(컴퓨터)의 포트이고,
두 번째 9090은 컨테이너 내부에서 Prometheus가 실행되는 포트입니다.
즉, 호스트의 9090 포트로 접속하면, 컨테이너의 9090 포트에서 Prometheus 서비스에 접근할 수 있습니다.
-v /path/to/prometheus.yml:/etc/prometheus/prometheus.yml: 볼륨을 마운트하는 옵션입니다.

호스트 머신에 있는 설정 파일(/path/to/prometheus.yml)을 컨테이너 내부의 /etc/prometheus/prometheus.yml에 연결합니다. /path/~ 부분은 본인의 프로젝트 경로에 맞게 수정/ (cd 명령으로 promethus로 이동하고, pwd 명령으로 확인할 수 있다.)

Prometheus는 이 파일을 통해 설정을 읽습니다.
호스트에서 설정 파일을 수정하면, 컨테이너 내부에서도 설정이 즉시 반영됩니다.
prom/prometheus: 사용할 Docker 이미지 이름입니다. prom/prometheus는 Prometheus를 실행할 수 있는 이미지를 의미합니다.

요약하자면, 이 명령은 Prometheus를 Docker 컨테이너로 실행하고, 호스트와 포트를 연결해 웹 인터페이스로 접근할 수 있게 하며, 설정 파일을 외부에서 제공하도록 구성한 것입니다.

  • status > targets > 타겟 모니터링 가능

Grafana

  • 오픈소스 데이터 시각화 및 모니터링 도구입니다.
  • 다양한 데이터 소스를 지원하여 데이터를 시각화하고 분석할 수 있도록 돕습니다.
  • Grafana는 대시보드를 생성하고, 데이터를 그래프나 차트 형태로 표현하며, 알림 기능을 제공하여 모니터링을 강화할 수 있습니다.

그라파나 주요기능

  • 대시보드 생성:
    • Grafana는 사용자가 데이터를 시각화할 수 있는 대시보드를 생성할 수 있도록 합니다. 여러 가지 그래프, 차트, 게이지 등을 사용하여 데이터를 시각적으로 표현할 수 있습니다.
  • 다양한 데이터 소스 지원:
    • Prometheus, InfluxDB, Graphite, Elasticsearch, MySQL, PostgreSQL 등 다양한 데이터 소스를 지원합니다. 이를 통해 여러 시스템과 애플리케이션의 데이터를 통합하여 시각화할 수 있습니다.

      위 데이터 소스들을 시각화 할 수 있다.

  • 알림 기능:
    • 조건을 설정하여 조건이 충족되면 이메일, Slack, PagerDuty 등 다양한 채널을 통해 알림을 보낼 수 있습니다. 이를 통해 시스템 상태를 실시간으로 모니터링하고 문제가 발생했을 때 즉시 대응할 수 있습니다.
  • 플러그인 지원:
    • Grafana는 플러그인 아키텍처를 지원하여, 다양한 플러그인을 통해 기능을 확장할 수 있습니다. 예를 들어, 새로운 데이터 소스나 시각화 유형을 추가할 수 있습니다.
  • 사용자 관리:
    • 사용자를 관리하고, 대시보드와 데이터 소스에 대한 접근 권한을 설정할 수 있습니다. 이를 통해 팀 내에서 협업을 강화하고 데이터 보안을 유지할 수 있습니다.

실습

그라파나 설치 - docker 사용

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

설치 확인

docker ps, localhost:3000 으로 확인 > admin/admin으로 로그인

promethus와 연동

  • data sources > prometheus > Connection에 Prometheus Server URL 을 입력

http://host.docker.internal:9090

그라파나도 docker 내부의 컨테이너이므로 host를 찾고, 그 내부의 promethus 찾도록 하는 경로 설정 (스프링 애플리케이션이 호스트 PC에서 실행되어 접근하기 위함)

내부 다른 설정들도 실제 사용 시에는 설정해야 한다.

  • Save & test

대시보드 생성

Create Dashboard 버튼 > import dashboard 를 클릭
그라파나에서 제공하는 대시보드를 사용 / 검색창에 Spring Boot 버전 적절한 것 찾아서 사용 (Id 카피 후 붙여넣기) / import 창에서 19004 클릭, Load / promethus 아래에서 데이터소스 선택 후 Import

profile
프로 개발자가 되기 위해 뚜벅뚜벅.. 뚜벅초

0개의 댓글