모니터링

  • 모니터링은 시스템의 성능, 안정성 및 가용성을 실시간으로 관찰하고 측정하는 과정을 의미
  • 모니터링 도구를 사용하여 시스템의 상태를 추적하고, 문제를 감지하고, 성능을 최적화하며, 장애 발생 시 빠르게 대응

모니터링의 중요성

문제 예방, 빠른 대응, 성능 최적화, 사용자 경험 향상, 비즈니스 연속성

  • 애플리케이션을 개발 후, 안정적이고 효율적인 운영을 위해 모니터링은 필수
    • 모니터링은 시스템의 성능, 가용성, 안정성을 지속적으로 감시하고, 잠재적인 문제를 신속하게 발견하여 대응
    • 이를 통해 애플리케이션의 다운타임을 최소화하고, 사용자 경험을 향상
  • 또한, 모니터링은 애플리케이션의 성능을 최적화하고, 자원의 효율적인 사용을 보장
    • 성능 병목 현상이나 리소스 낭비를 식별하고 해결하여 시스템의 전체적인 효율성
  • 로그 분석을 통해 시스템의 이상 징후를 조기에 발견하고, 문제의 원인을 정확히 파악
    • 이를 통해 보다 신속하고 효과적인 문제 해결이 가능

모니터링의 범위

  • 서버 모니터링: CPU, 메모리, 디스크 사용량, 네트워크 트래픽 등 서버 자원 사용을 모니터링
  • 애플리케이션 모니터링: 애플리케이션의 상태, 성능, 로그 등을 모니터링
  • 네트워크 모니터링: 네트워크 트래픽, 대역폭 사용량, 네트워크 지연 등을 모니터
  • 데이터베이스 모니터링: 쿼리 성능, 연결 수, 데이터베이스 사용량 등을 모니터링
  • 보안 모니터링: 보안 이벤트, 침입 시도, 취약점 등을 모니터링

시큐어 코딩

보안

  • 웹 애플리케이션 개발은 항상 해커들의 타겟
  • 해커들은 다양한 기법을 사용하여 시스템의 취약점을 찾고, 이를 악용
  • 따라서 애플리케이션의 보안은 매우 중요한 요소
  • 보안 위협으로부터 애플리케이션을 보호하기 위해, 강력한 인증 및 권한 부여 메커니즘을 구현
    • 사용자 접근을 제한하고, 민감한 정보를 보호
    • 정기적인 보안 점검 및 취약성 테스트는 시스템의 보안 상태를 평가하고, 새로운 위협에 대응하기 위해 필요
    • 보안 취약점을 사전에 발견하고, 이를 해결

Spring Boot Actuator

Spring Boot Actuator

  • Spring Boot Actuator는 Spring Boot 애플리케이션의 상태와 성능을 모니터링하고 관리할 수 있도록 다양한 엔드포인트를 제공하는 기능
  • Actuator는 헬스 체크, 메트릭스, 환경 정보, 로그 정보 등 여러 가지 중요한 정보를 쉽게 확인

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 요청 및 응답을 추적

Actuator 엔드포인트 설정

  • 기본적으로 모든 엔드포인트가 활성화되어 있지 않을 수 있다. application.properties 파일을 사용하여 필요한 엔드포인트를 활성화하거나 비활성화할 수 있다.
  • 설정 옵션 설명
    • never : 헬스 체크 상세 정보를 절대 표시하지 않는다

    • always : 모든 사용자에게 헬스 체크 상세 정보를 항상 표시

    • when_authorized : 인증된 사용자에게만 헬스 체크 상세 정보를 표시

      src/main/resources/application.properties

      spring.application.name=sample
      
      server.port=8080
      
      #모든 엔드포인트 노출 설정
      management.endpoints.web.exposure.include=* 
      
      #헬스 체크 엔드포인트 상세 정보 표시 설정
      management.endpoint.health.show-details=always 
      # 이 설정은 /actuator/health 엔드포인트에서 헬스 체크 정보를 항상 상세히 보여주도록 설정합니다. 기본적으로, 헬스 체크 엔드포인트는 요약된 상태 정보만 제공하며, 상세 정보는 노출되지 않습니다.

주의사항 및 권장사항

  • 보안
    • 모든 엔드포인트를 노출하는 설정은 개발 및 테스트 환경에서는 유용할 수 있지만, 운영 환경에서는 보안 위험을 증가시킬 수 있다. 필요한 엔드포인트만 노출하는 것을 권장
    • 헬스 체크 엔드포인트에서 상세 정보를 항상 노출하는 설정 역시 운영 환경에서는 민감한 정보를 포함할 수 있으므로, show-details설정을 when_authorized 옵션을 사용하는 것이 좋다.
  • 엔드포인트 보호
    • actuator 접근 포트만 다른 포트로 설정하여 보호 할 수 있다.
      # 애플리케이션의 기본 포트를 8080으로 설정
      server.port=8080
      
      # Actuator 엔드포인트를 19090 포트에서 서비스하도록 설정
      management.server.port=19090
    • Spring Security를 사용하여 민감한 엔드포인트에 접근 제어를 설정하는 것이 좋다.
    • 예를 들어, /actuator 경로에 대한 보안 설정을 추가할 수 있다.

실습

  • 스프링 프로젝트를 만듭니다.

Prometheus

Prometheus 란?

  • Prometheus는 오픈소스 시스템 모니터링 및 경고 도구
  • SoundCloud에서 시작되어 현재는 Cloud Native Computing Foundation(CNCF)에서 호스팅
  • Prometheus는 시계열 데이터베이스를 사용하여 메트릭 데이터를 수집하고, 쿼리 및 시각화를 통해 시스템 상태를 모니터링하고 경고를 설정

Prometheus의 주요 구성 요소

  • 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 버전 안내사항
Prometheus 버전이 1.1.3으로 업데이트 됨에 따라서, Springboot 버전 3.3.3 이상에서만 동작합니다.

https://start.spring.io/ 에서는 최신 버전만 지원하고 있으므로 버전 선택에 참고 바랍니다.

참고 링크 : https://github.com/micrometer-metrics/micrometer/issues/5093

  • Prometheus 를 보다 쉽게 설치하기 위해서 Docker 를 사용합니다.
  1. 먼저 스프링 프로젝트 부터 생성하겠습니다. 이전 실습에 Prometheus를 추가합니다.

  1. src/main/resources/application.properties 를 수정합니다.

    spring.application.name=sample
    
    server.port=8080
    
    #모든 엔드포인트 노출 설정
    management.endpoints.web.exposure.include=* 
    
    #헬스 체크 엔드포인트 상세 정보 표시 설정
    management.endpoint.health.show-details=always # 이 설정은 /actuator/health 엔드포인트에서 헬스 체크 정보를 항상 상세히 보여주도록 설정합니다. 기본적으로, 헬스 체크 엔드포인트는 요약된 상태 정보만 제공하며, 상세 정보는 노출되지 않습니다.
    
    management.endpoint.prometheus.enabled=true
  1. http://localhost:8080/actuator/prometheus 에 접속하여 프로메테우스 매트릭스를 확인할 수 있습니다.

  1. Prometheus 설정 파일 생성

    • Prometheus가 모니터링할 타겟과 기타 설정을 정의하는 설정 파일(prometheus.yml)을 생성합니다.
    • host.docker.internalDocker에서 제공하는 특수한 DNS 이름으로, Docker 컨테이너가 호스트 머신(즉, Docker를 실행하는 컴퓨터)의 네트워크 서비스에 접근할 수 있도록 합니다. 이를 통해 컨테이너 내부에서 호스트 머신의 네트워크 주소를 참조할 수 있습니다.
      global:
        scrape_interval: 15s
      
      scrape_configs:
        - job_name: 'spring-boot'
          metrics_path: '/actuator/prometheus'
          static_configs:
            - targets: ['host.docker.internal:8080']
  2. Prometheus 실행

    • Docker 명령어를 사용해 Prometheus컨테이너를 실행합니다.
    • -v 옵션의 앞부분은 방금전 생성한 prometheus.yml의 경로를 포함하여 작성합니다.
    docker run -d --name=prometheus -p 9090:9090 -v /path/to/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus
  3. localhost:9090 에 접속해봅니다.프로메테우스 서버에 접속할 수 있습니다.

  1. 상단 메뉴에서 Status > Targets에 접속하여 스프링 애플리케이션의 매트릭스를 수집하고 있는것을 확인 할 수 있습니다 (나오지 않는다면 스프링 애플리케이션을 Run하고 있는지 확인합니다.)

Grafana

그라파나란?

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

그라파나 주요기능

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

5.3 그라파나 설치하기

  1. Docker 를 사용하여 그라파나 컨테이너를 실행합니다.

    docker run -d --name=grafana -p 3000:3000 grafana/grafana
  2. localhost:3000에 접속하여 로그인을 진행합니다. 기본계정의 아이디와 비밀번호는 admin/admin 입니다.

  3. 대시보드에서 DATA SOURCE 를 클릭한 후, Prometheus를 선택합니다.

  4. Name을 입력한후, Contact에 Prometheus Server URL 을 입력합니다. 여기서는 host.docker.internal을 사용했습니다(스프링 애플리케이션이 호스트 PC에서 실행되어 접근하기 위함)

    그후, Save & test를 클릭하여 저장합니다.

  5. 대시보드 메뉴에 접속하여 Create Dashboard 버튼을 클릭합니다. 그후 import dashboard 를 클릭합니다.

  6. 임포트 창에서 19004을 입력하고 Load 버튼을 클릭합니다.19004는 그라파나에서 제공하는 spring boot 3용 대시보드입니다.

  7. prometheus 를 선택하고 Import 를 클릭하면 대시보드가 생성됩니다.

Grafana Slack Alert 보내기

슬랙 앱 생성

여기는 슬랙 API 할 때랑 비슷함.

그라파나 Alert 설정

그라파나에서 사이드메뉴에 Alerting > Contact points 에 접속하여 Add contact point 버튼을 클릭합니다.

Name 을 입력한 후, Integration 을 Slack을 선택합니다. 그후 Webhook URL에 아까 앱에서 복사한 URL을 입력합니다. 테스트 버튼을 클릭하면 테스트 메시지가 슬랙 채널로 오는 것을 확인할 수 있습니다.

그라파나 사이드 메뉴에서 Alerting > Notification policies 로 들어갑니다. 그 후 Default policy의 edit 버튼을 클릭합니다. 이후 나온 Edit창에서 Default contact point 를 이전에 생성한 contact point로 선택합니다.

Alerting > Alert rules 를 클릭하여 “New alert rule”을 클릭합니다.

알림 이름을 입력합니다. Define query and alert condition 에서 matric을 UP을 선택하고 Label filter 에서 Job , spring-boot 를 선택합니다.

Expression 의 Threshold에서 IS BLOW를 선택 숫자는 1을 입력합니다. 이를 통해 만약 애플리케이션이 정지되면 알람이 발송되게 됩니다.

스크롤 하여 내려가면 Set evaluation behavior 섹션을 볼 수 있습니다.

Folder 및 Evaluation group을 선택또는 새로 생성합니다.

pending period, Evaluation internal 은 빠른 확인을 위해 1m으로 설정합니다.

좀더 스크롤해 내려가면 Confifure labels and notifications 메뉴가 있습니다. 해당 메뉴의 contact point 을 이전에 설정한 slack으로 설정합니다.

그라파나 Alert 설정 확인

Alert rules에 생성한 Alert이 노출 됩니다. 상태는 Normal인 것을 확인할 수 있습니다.

스플링 애플리케이션을 정지 시키면 Normal 이었던 상태가 Pending > Firing으로 변경됩니다.

그후 잠시 기다려면 슬랙 채널로 Firing 알람이 오는것을 확인할 수 있습니다.

다시 스프링 애플리케이션을 실행한후 기다리면 슬랙 채널로 Resolved 알람이 오는것을 확인할수 있습니다.

(해당 알람은 도착하는데 시간이 걸립니다!)

0개의 댓글