본문 바로가기

자바 심화/TIL

모니터링(Monitoring)

개요

예전에 모니터링을 적용하기 위해 기술 블로그를 통해 정리한 적이 있지만, 이번에 강의를 통해 다시 배운 내용을 정리해 볼 것이다.

 

Spring boot 모니터링 with Prometheus, Grafana

애플리케이션 모니터링 애플리케이션에서 발생하는 동작들에 대한 메트릭을 수집하여 애플리케이션 성능을 분석하는 분야로 모니터링을 통해 서비스 개발 과정에서는 동작을 확인할 수 있고,

eleunadeu.tistory.com

 

모니터링(Monitoring)

시스템, 애플리케이션, 인프라의 성능과 상태를 지속적으로 관찰하고 데이터를 수집하여 이상 징후나 오류를 감지하는 프로세스.

  • 문제를 신속하게 해결하고 시스템 가용성을 유지할 수 있다.

주요 목적

  1. 가용성 확보: 서비스 중단을 방지하고 안정적인 운영 보장
  2. 성능 최적화: 성능 저하 원인을 발견하고 개선
  3. 장애 탐지: 시스템 오류 발생 시 빠르게 탐지 및 대응
  4. 비용 관리: 리소스 사용량을 추적하여 비용 효율성을 개선

 

종류(범위)

  1. 시스템 모니터링
    • CPU, 메모리, 디스크 사용량 등 인프라 자원을 추적
    • 대표 도구: Prometheus, Grafana, Nagios
  2. 애플리케이션 모니터링(APM)
    • 애플리케이션 성능과 트랜잭션 추적
    • 대표 도구: New Relic, AppDynamics, Spring Boot Actuator
  3. 로그 모니터링
    • 로그 데이터를 수집하고 분석하여 오류나 이벤트 탐지
    • 대표 도구: ELK Stack(Elasticsearch, Logstash, Kibana), Graylog
  4. 네트워크 모니터링
    • 네트워크 트래픽, 대역폭 사용량, 패킷 손실 감시
    • 대표 도구: Zabbix, SolarWinds
  5. 보안 모니터링
    • 침입 탐지, 취약점 관리, 보안 이벤트 추적
    • 대표 도구: Splunk, Wazuh

 

모니터링 구성 요소

  1. 데이터 수집(Agent/Exporter): 시스템 또는 애플리케이션에서 데이터를 수집하는 역할
  2. 데이터 저장(Database/TSDB): 수집된 데이터를 저장하고 관리
  3. 데이터 시각화(Dashboard): 데이터를 시각적으로 표시하여 상태를 쉽게 파악
  4. 알림 및 경고(Alerting): 특정 임계값 초과 시 알림 전송

 

MSA 프로젝트 모니터링 적용 사례

  • Spring Cloud 기반 MSA 프로젝트에 적용할 수 있는 모니터링 도구
    • Eureka Server Health Check: 서비스 등록/해제 상태 확인
    • Spring Boot Actuator: 애플리케이션 상태 점검(엔드포인트, 메트릭 제공)
    • Prometheus & Grafana: 시스템 메트릭 수집 및 시각화
    • Zipkin: 분산 추적을 통해 요청 경로 분석
    • ELK Stack: 로그 수집 및 검색

 

Spring Boot 모니터링 도구

Spring Boot Actuator

Spring Boot 애플리케이션의 상태와 성능을 모니터링할 수 있는 라이브러리, 운영 환경에서 애플리케이션의 내부 상태를 확인하고 관리할 수 있는 다양한 엔드포인트를 제공.

 

주요 기능

  1. 엔드포인트 제공: 상태 확인(/actuator/health), 메트릭(/actuator/metrics), 로그 수준 조정 등
  2. 보안 통합: 엔드포인트 접근 권한 관리
  3. 확장 가능: 사용자 정의 엔드포인트 추가 가능

엔드포인트

  • /actuator/health: 애플리케이션 상태 확인
  • /actuator/metrics: 메트릭 정보 확인(CPU, 메모리, HTTP 요청 수 등)
  • /actuator/env: 환경 변수 확인

사용 방법

  1. Spring Boot Actuator 의존성 추가(build.gradle)
  2. Actuator 설정(application.yml)
  3. 애플리케이션 실행 후 Actuator 엔드포인트 접속 및 확인

build.gradle

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

 

application.yml

management:
  endpoints:
    web:
      exposure:
        include: "*"
  endpoint:
    health:
      show-details: always

 

endpoint 접속

 

 

Prometheus

오픈소스 시스템 모니터링 및 경고 도구, 주로 시계열(Time-Series) 데이터 수집과 저장을 위해 사용된다.

 

주요 기능

  1. 메트릭 수집 및 저장: 시계열 데이터를 효율적으로 관리
  2. 다양한 Exporter 지원: 애플리케이션 및 인프라 메트릭 수집 가능
  3. PromQL 언어 지원: 데이터 쿼리 및 분석 가능
  4. 경고 기능(Alerting): 특정 임계값 초과 시 알림 전송

사용 예시

  • Spring Boot Actuator 메트릭 수집
  • Kubernetes 클러스터 자원 모니터링

사용 방법

  1. prometheus 의존성 추가(build.gradle)
  2. prometheus 설정(yml)
  3. promethues docker 설치
  4. 애플리케이션 실행 후 엔드포인트 접속 및 확인

build.gradle

runtimeOnly 'io.micrometer:micrometer-registry-prometheus'

 

application.yml

management:
  endpoints:
    web:
      exposure:
        include: "*"
  endpoint:
    health:
      show-details: always
    prometheus:
      access: unrestricted
  •  
  • prometheus access
    • unrestricted(엔드포인트에 대한 무제한 엑세스 허용)
    • read_only(엔드포인트에 대한 읽기 전용 엑세스 허용)
    • none(엔드포인트에 대한 엑세스 불가)

promethues.yml

global:
  scrape_interval: 15s

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

 

prometheus docker 설치 및 실행 명령어

docker run -d --name=prometheus -p 9090:9090 -v Path\prometheus\prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus
  • Window와 Mac의 Path는 다름(Window는 드라이브부터 Path 입력 및 \ 사용, Mac은 루트 폴더부터 입력 및 / 사용)

docker ps를 통해 정상 실행 확인 및 접속

 

 

Grafana

데이터를 시각화하고 대시보드를 생성하는 도구, Prometheus, Loki, InfluxDB 등 다양한 데이터 소스와 통합.

 

주요 기능

  1. 대시보드 생성: 실시간 데이터 시각화
  2. 데이터 소스 통합: Prometheus, Loki, Elasticsearch 등 지원
  3. 알림 시스템 연동: 특정 임계값에 도달하면 알림 전송
  4. 유연한 사용자 관리: 역할 기반 권한 관리 지원

사용 예시

  • 애플리케이션 성능 대시보드
  • 네트워크 트래픽 및 리소스 사용량 시각화

사용 방법

  1. docker로 grafana 설치
  2. grafana 엔드포인트 접속
  3. 로그인(비밀번호 수정)
  4. 데이터 소스 추가 및 대시보드 설정

docker 명령어

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

 

 

 

실행 상태 확인 후 엔드포인트 접속

 

비밀번호 변경(Skip 가능)

 

data source 추가

  • Connection http://host.docker.internal:{port}로 설정(docker에서 prometheus 실행)

  • 저장 및 테스트 성공 버튼을 눌러 확인

 

Dashboard 생성

 

Create dashboard → Import Dashboard

  • ID(사용하려는 대시보드 ID) 입력 후 Load(grafana.com/dashboards 주소에 접속해서 대시보드 종류 확인 및 ID 복사 가능)

 

대시보드 확인

  • 대시보드에서 애플리케이션 상태를 확인할 수 있다.

 

Loki

로그 수집 및 관리 시스템으로, Grafana Labs에서 개발한 오픈소스 프로젝트.

Prometheus가 메트릭을 수집하듯이, Loki는 로그 데이터를 수집하지만 메트릭과 달리 텍스트 기반 로그 데이터를 관리.

 

주요 기능

 

  1. 로그 수집 및 저장: 애플리케이션 로그 수집
  2. 데이터 인덱싱 최소화: 효율적인 로그 저장 구조
  3. Grafana 통합 지원: 로그 데이터를 대시보드에서 시각화 가능
  4. 멀티테넌시 지원: 여러 애플리케이션 로그를 중앙 관리

사용 예시

  • 애플리케이션 로그 모니터링
  • 장애 및 오류 탐지
  • Grafana 대시보드에 로그 데이터 시각화

사용 방법

  1. loki 의존성 추가
  2. loki 설정(yml)
  3. docker로 loki 설치
  4. 애플리케이션 구성
  5. grafana 설정(data source 추가, 로그 설정)
  6. 애플리케이션 실행 및 확인

build.gradle

implementation 'com.github.loki4j:loki-logback-appender:1.5.1'

 

 

loki-confing.yml

auth_enabled: false

server:
  http_listen_port: 3100
  grpc_listen_port: 9096

common:
  instance_addr: 127.0.0.1
  path_prefix: /tmp/loki
  storage:
    filesystem:
      chunks_directory: /tmp/loki/chunks
      rules_directory: /tmp/loki/rules
  replication_factor: 1
  ring:
    kvstore:
      store: inmemory

query_range:
  results_cache:
    cache:
      embedded_cache:
        enabled: true
        max_size_mb: 100

schema_config:
  configs:
    - from: 2020-10-24
      store: tsdb
      object_store: filesystem
      schema: v13
      index:
        prefix: index_
        period: 24h

ruler:
  alertmanager_url: http://localhost:9093
 

docker loki 설치 명령어

docker run --name loki -d -v Path\loki:/mnt/config -p 3100:3100 grafana/loki:3.0.0 --config.file=/mnt/config/loki-config.yml
  • yml 파일이 있는 폴더까지 Path로 입력

컨테이너 실행 확인

 

애플리케이션 구성

 

controller

package com.monitor.sample;

import jakarta.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.IOException;

@RestController
public class SampleController {

    private static final Logger logger = LoggerFactory.getLogger(SampleController.class);

    @GetMapping("/")
    public String hello(HttpServletResponse response) throws IOException {
        logger.info("Attempted access to / endpoint resulted in 403 Forbidden");
        response.sendError(HttpServletResponse.SC_FORBIDDEN, "Access denied");
        return null;
    }
}

 

logback.xml

<configuration>
    <appender name="LOKI" class="com.github.loki4j.logback.Loki4jAppender">
        <http>
            <url>http://localhost:3100/loki/api/v1/push</url>
        </http>
        <format>
            <label>
                <pattern>app=my-app,host=${HOSTNAME}</pattern>
            </label>
            <message class="com.github.loki4j.logback.JsonLayout" />
        </format>
    </appender>

    <root level="DEBUG">
        <appender-ref ref="LOKI" />
    </root>
</configuration>
  • 로그 테스트를 위한 간단한 애플리케이션 구성

 

애플리케이션 실행 및 endpoint 접속

 

grafana loki 설정

 

Exploere 설정

  • Labdel - app 설정
  • Line contains INFO(로그 설정), Line contanis SampleController(사용하는 컨트롤러) 설정

  • Run Query를 눌러 실행 및 로그 확인

 

정리

  • 모니터링의 중요성 및 기능, Spring Boot에서 사용하는 모니터링 도구들을 사용하는 방법에 대해 배웠다.
  • 위 도구들을 사용해 애플리케이션의 정보를 간편하게 얻을 수 있고, 설정에 따라 원하는 정보를 얻을 수 있다는 사실을 배웠다.
  • 프로젝트에 실제로 적용해 보고 모니터링을 통해 성능 개선이나 오류 해결에 사용하는 경험을 해보고 싶다.

'자바 심화 > TIL' 카테고리의 다른 글

모니터링 - Slack Alert 보내기  (1) 2024.12.20
프로젝트 회고  (0) 2024.12.18
Open Route Service API 사용  (1) 2024.12.16
프로젝트 문제 해결(역직렬화, git 에러)  (0) 2024.12.12
DDD(Domain-Driven Design)  (1) 2024.12.09