성능 지표(Metrics)와 모니터링(Monitoring)은 어떻게 이루어지나요?

김상욱·2024년 12월 22일

성능 지표(Metrics)와 모니터링(Monitoring)은 어떻게 이루어지나요?

What Metrics?

성능 지표(Metrics)는 애플리케이션이나 시스템의 상태와 성능을 수치로 나타낸 것입니다. 이를 통해 시스템이 얼마나 효율적으로 작동하고 있는지 문제가 발생했는지 파악할 수 있습니다.

  • 응답 시간(Response Time) : 요청을 보낸 시점부터 응답을 받을 때까지 걸리는 시간
  • 처리량(Throughput) : 일정 시간 동안 처리되는 요청의 수
  • 에러율(Error Rate) : 전체 요청 중 실패한 요청의 비율
  • CPU 사용률(CPU Usage) : 서버의 CPU가 얼마나 사용되고 있는지.
  • 메모리 사용량(Memory Usage) : 애플리케이션이 사용하는 메모리의 양

What Monitoring?

모니터링은 실시간으로 시스템의 상태와 성능 지표를 수집하고 분석하는 과정입니다. 이를 통해 문제가 발생했을 때 신속하게 대응할 수 있으며, 시스템의 안정성을 유지할 수 있습니다.

  • 시스템이 정상적으로 작동하는지 지속적으로 확인
  • 장애나 성능 저하가 발생했을 때 즉각적으로 알림을 받고 대응
  • 수집된 데이터를 분석하여 시스템을 더 효율적으로 개선

Metrics & Monitoring in Java/Spring

A. Metrics 수집
  1. Micrometer : Spring Boot와 잘 통합되는 라이브러리로, 다양한 모니터링 시스템(Prometheus, Grafana 등)과 연동할 수 있습니다.
@RestController
public class MyController {
    
    private final Counter requestCounter;

    public MyController(MeterRegistry registry) {
        this.requestCounter = registry.counter("requests.total");
    }

    @GetMapping("/hello")
    public String hello() {
        requestCounter.increment();
        return "Hello, World!";
    }
}
  1. Spring Actuator : 애플리케이션의 상태를 모니터링하고 관리할 수 있는 엔드포인트를 제공.
management.endpoints.web.exposure.include=health,info,metrics
B. Monitoring 도구
  1. Prometheus + Grafana
  • Prometheus는 시계열 데이터베이스로 다양한 메트릭을 수집하고 저장합니다.
  • Grafana는 Prometheus에서 수집한 데이터를 시각화하는 도구.
<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
scrape_configs:
  - job_name: 'spring-app'
    metrics_path: '/actuator/prometheus'
    static_configs:
      - targets: ['localhost:8080']
  1. ELK Stack(Elasticsearch, Logstash, Kibana)
  • 로그 수집, 저장, 시각화 도구로 애플리케이션 로그를 분석하는 데 유용
  • Spring Boot 애플리케이션에서 Logstash로 로그 전송 설정을 할 수 있습니다.
  1. New Relic, Datadog등 SaaS 모니터링 서비스
  • 설정이 간편하며, 다양한 기능과 대시보드 제공
  • 에이전트를 애플리케이션에 설치하여 메트릭과 로그를 자동으로 수집할 수 있습니다.
C. 알림 설정

모니터링 도구를 통해 특정 조건(예: 응답 시간 증가, 에러율 상승)이 발생하면 알림을 받을 수 있습니다. 예를 들어, Prometheus의 Alertmanager와 연동하여 슬랙, 이메일 등으로 알림을 받을 수 있습니다.

D. 로그 관리

모니터링과 함께 로그 관리는 매우 중요합니다. 로그는 문제의 원인을 파악하는데 도움을 줍니다.

  • Logback이나 Log4j와 같은 로깅 프레임워크를 사용하여 로그를 관리.
  • Centralized Logging : 모든 서비스의 로그를 중앙에서 관리하여 쉽게 검색하고 분석할 수 있도록 함.

EXAMPLE

Spring Boot 애플리케이션의 /api/users 엔드포인트의 성능을 모니터링한다고 가정.

  1. Micrometer와 Spring Actuator 설정
  • build.gradle 또는 pom.xml에 Micrometer와 Prometheus 의존성 추가
  • application.properties에 Actuator와 Prometheus 설정 추가
  1. 메트릭 수집
  • Micrometer를 통해 요청 수, 응답 시간 등의 메트릭 자동 수집.
  • 커스텀 메트릭을 추가하여 특정 비즈니스 로직의 성능도 모니터링 가능
  1. Prometheus 설정
  • Prometheus 서버를 설치하고 prometheus.yml에 Spring 애플리케이션의 /actuator/prometheus 엔드포인트 추가
  1. Grafana 대시보드 구성
  • Grafana에서 Prometheus를 데이터 소스로 추가.
  • 다양한 그래프와 차트를 생성하여 실시간으로 메트릭을 시각화
  1. 알림 설정
  • 응답 시간이 일정 수준 이상일 경우 슬랙으로 알림이 가도록 Alertmanager 설정

TIP

  • CI/CD와 연동 : 모니터링 도구를 CI/CD 파이프라인과 연동하여 배포 후 성능 테스트를 자동화할 수 있습니다.
  • 자동 스케일링 : 클라우드 환경에서는 모니터링 데이터를 기반으로 자동으로 인스턴스를 늘리거나 줄일 수 있습니다.
  • 보안 고려 : 모니터링 데이터는 민감할 수 있으므로 접근 권한을 적절히 관리.

취업 준비 중인 신입 Java 및 Spring 백엔드 개발자라면, 성능 지표(Metrics)와 모니터링(Monitoring)에 대한 이해를 실제 프로젝트를 통해 심화시키는 것이 매우 중요합니다. 실습을 통해 이론을 적용해보고, 포트폴리오에 추가할 수 있는 프로젝트를 만드는 것은 취업에 큰 도움이 될 것입니다. 아래에 신입 개발자가 실습하기에 적합한 몇 가지 프로젝트 아이디어와 단계별 가이드를 제공해드릴게요.

1. 간단한 Spring Boot 애플리케이션 개발

먼저, 모니터링과 성능 지표를 적용할 수 있는 간단한 Spring Boot 애플리케이션을 만드세요. 예를 들어, 사용자 관리(User Management) API를 개발할 수 있습니다.

프로젝트 예시: 사용자 관리 API

  • 기능

    • 사용자 등록 (Create)
    • 사용자 조회 (Read)
    • 사용자 수정 (Update)
    • 사용자 삭제 (Delete)
  • 기술 스택

    • Spring Boot
    • Spring Data JPA (H2 데이터베이스 사용)
    • Lombok
    • Maven 또는 Gradle

단계별 가이드

  1. Spring Boot 프로젝트 생성

    • Spring Initializr를 사용하여 새로운 Spring Boot 프로젝트를 생성합니다.
    • 필요한 의존성: Spring Web, Spring Data JPA, H2 Database, Lombok.
  2. 엔티티 및 리포지토리 생성

    • User 엔티티 클래스를 생성하고, UserRepository 인터페이스를 작성합니다.
    @Entity
    @Data
    public class User {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
        private String name;
        private String email;
    }
    
    public interface UserRepository extends JpaRepository<User, Long> {}
  3. 컨트롤러 작성

    • 기본적인 CRUD API 엔드포인트를 작성합니다.
    @RestController
    @RequestMapping("/api/users")
    public class UserController {
    
        private final UserRepository userRepository;
    
        public UserController(UserRepository userRepository) {
            this.userRepository = userRepository;
        }
    
        @PostMapping
        public User createUser(@RequestBody User user) {
            return userRepository.save(user);
        }
    
        @GetMapping("/{id}")
        public ResponseEntity<User> getUser(@PathVariable Long id) {
            return userRepository.findById(id)
                .map(ResponseEntity::ok)
                .orElse(ResponseEntity.notFound().build());
        }
    
        @PutMapping("/{id}")
        public ResponseEntity<User> updateUser(@PathVariable Long id, @RequestBody User userDetails) {
            return userRepository.findById(id)
                .map(user -> {
                    user.setName(userDetails.getName());
                    user.setEmail(userDetails.getEmail());
                    return ResponseEntity.ok(userRepository.save(user));
                })
                .orElse(ResponseEntity.notFound().build());
        }
    
        @DeleteMapping("/{id}")
        public ResponseEntity<Void> deleteUser(@PathVariable Long id) {
            return userRepository.findById(id)
                .map(user -> {
                    userRepository.delete(user);
                    return ResponseEntity.ok().<Void>build();
                })
                .orElse(ResponseEntity.notFound().build());
        }
    }
  4. 애플리케이션 실행 및 테스트

    • 애플리케이션을 실행하고, Postman 또는 cURL을 사용하여 API를 테스트합니다.

2. Spring Actuator와 Micrometer를 사용한 메트릭 수집

애플리케이션의 성능 지표를 수집하기 위해 Spring Actuator와 Micrometer를 통합합니다.

단계별 가이드

  1. 의존성 추가

    • pom.xml 또는 build.gradle에 Spring Actuator와 Micrometer 의존성을 추가합니다.
    <!-- Maven 예시 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
        <groupId>io.micrometer</groupId>
        <artifactId>micrometer-registry-prometheus</artifactId>
    </dependency>
  2. 애플리케이션 설정

    • application.properties 또는 application.yml에 Actuator와 Prometheus 설정을 추가합니다.
    # application.properties 예시
    management.endpoints.web.exposure.include=health,info,metrics,prometheus
    management.metrics.export.prometheus.enabled=true
  3. 커스텀 메트릭 추가 (선택 사항)

    • 특정 비즈니스 로직의 성능을 모니터링하고 싶다면, 커스텀 메트릭을 추가할 수 있습니다.
    @RestController
    @RequestMapping("/api/users")
    public class UserController {
    
        private final UserRepository userRepository;
        private final Counter createUserCounter;
    
        public UserController(UserRepository userRepository, MeterRegistry registry) {
            this.userRepository = userRepository;
            this.createUserCounter = registry.counter("users.created.total");
        }
    
        @PostMapping
        public User createUser(@RequestBody User user) {
            createUserCounter.increment();
            return userRepository.save(user);
        }
    
        // 나머지 엔드포인트...
    }
  4. 애플리케이션 재실행 및 메트릭 확인

    • 애플리케이션을 다시 실행하고, http://localhost:8080/actuator/prometheus에 접속하여 메트릭이 정상적으로 노출되는지 확인합니다.

3. Prometheus와 Grafana를 사용한 모니터링 설정

수집된 메트릭을 시각화하고 모니터링하기 위해 Prometheus와 Grafana를 설정합니다.

단계별 가이드

  1. Docker 설치 (선택 사항)

    • Prometheus와 Grafana를 쉽게 실행하기 위해 Docker를 사용할 수 있습니다. Docker 설치 가이드
  2. Prometheus 설정

    • Prometheus 설정 파일(prometheus.yml)을 생성합니다.
    global:
      scrape_interval: 15s
    
    scrape_configs:
      - job_name: 'spring-app'
        metrics_path: '/actuator/prometheus'
        static_configs:
          - targets: ['host.docker.internal:8080'] # Docker 사용 시 호스트 주소 확인
  3. Prometheus 실행

    • Docker를 사용하여 Prometheus를 실행합니다.
    docker run -d \
      -p 9090:9090 \
      -v $(pwd)/prometheus.yml:/etc/prometheus/prometheus.yml \
      prom/prometheus
  4. Grafana 설정 및 실행

    • Docker를 사용하여 Grafana를 실행합니다.
    docker run -d -p 3000:3000 grafana/grafana
  5. Grafana에 Prometheus 데이터 소스 추가

    • 웹 브라우저에서 http://localhost:3000에 접속합니다. 기본 로그인은 admin / admin입니다.
    • 데이터 소스로 Prometheus를 추가합니다 (http://host.docker.internal:9090).
  6. 대시보드 생성

    • Grafana에서 새로운 대시보드를 생성하고, 다양한 메트릭을 시각화하는 패널을 추가합니다.
    • 예: HTTP 요청 수, 응답 시간, 에러율 등.

4. 알림(Alert) 설정

모니터링 시스템에서 특정 조건이 발생했을 때 알림을 받을 수 있도록 설정합니다. 예를 들어, 응답 시간이 일정 수준 이상일 경우 슬랙으로 알림을 받을 수 있습니다.

단계별 가이드

  1. Alertmanager 설정 (Prometheus와 연동)

    • alertmanager.yml 파일을 생성합니다.
    global:
      resolve_timeout: 5m
    
    route:
      receiver: 'slack-notifications'
    
    receivers:
      - name: 'slack-notifications'
        slack_configs:
          - api_url: 'https://hooks.slack.com/services/XXXX/XXXX/XXXX'
            channel: '#alerts'
  2. Prometheus 설정 파일에 Alertmanager 추가

    alerting:
      alertmanagers:
        - static_configs:
            - targets: ['localhost:9093']
    
    rule_files:
      - "alerts.yml"
  3. 경고 규칙 작성 (alerts.yml)

    groups:
      - name: example
        rules:
          - alert: HighResponseTime
            expr: http_server_requests_seconds_max{uri="/api/users"} > 1
            for: 1m
            labels:
              severity: warning
            annotations:
              summary: "High response time detected"
              description: "Response time for /api/users is above 1s for more than 1 minute."
  4. Prometheus 및 Alertmanager 재시작

    • 설정 파일을 적용하기 위해 Prometheus와 Alertmanager를 재시작합니다.
  5. Slack Webhook 설정

    • Slack에서 Incoming Webhooks을 설정하고, alertmanager.ymlapi_url을 추가합니다.

5. 로그 관리 설정

효과적인 모니터링을 위해 로그 관리는 필수적입니다. ELK Stack(Elasticsearch, Logstash, Kibana) 또는 다른 중앙 집중식 로그 관리 도구를 사용할 수 있습니다.

단계별 가이드

  1. Spring Boot 로그 설정

    • application.properties에 로그 레벨과 패턴을 설정합니다.
    logging.level.org.springframework=INFO
    logging.file.name=application.log
  2. Logstash 설정 (Docker 사용 시)

    • Logstash 설정 파일(logstash.conf)을 생성합니다.
    input {
      file {
        path => "/path/to/application.log"
        start_position => "beginning"
      }
    }
    
    filter {
      grok {
        match => { "message" => "%{COMMONAPACHELOG}" }
      }
    }
    
    output {
      elasticsearch {
        hosts => ["elasticsearch:9200"]
      }
    }
  3. ELK Stack 실행

    • Docker Compose를 사용하여 ELK Stack을 실행합니다.
    version: '3'
    services:
      elasticsearch:
        image: docker.elastic.co/elasticsearch/elasticsearch:7.9.2
        environment:
          - discovery.type=single-node
        ports:
          - "9200:9200"
    
      logstash:
        image: docker.elastic.co/logstash/logstash:7.9.2
        volumes:
          - ./logstash.conf:/usr/share/logstash/pipeline/logstash.conf
        ports:
          - "5044:5044"
    
      kibana:
        image: docker.elastic.co/kibana/kibana:7.9.2
        ports:
          - "5601:5601"
        depends_on:
          - elasticsearch
    docker-compose up -d
  4. Kibana에서 로그 시각화

    • 웹 브라우저에서 http://localhost:5601에 접속하여 Kibana를 설정하고 로그를 시각화합니다.

6. 포트폴리오 프로젝트로 발전시키기

위의 단계를 통해 기본적인 모니터링 시스템을 구축한 후, 이를 포트폴리오 프로젝트로 발전시킬 수 있습니다.

추가 기능 및 개선 사항

  • Dockerize 애플리케이션: Docker를 사용하여 애플리케이션과 모니터링 도구를 컨테이너화합니다.
  • CI/CD 파이프라인 통합: GitHub Actions나 Jenkins를 사용하여 자동 배포 및 모니터링 설정을 자동화합니다.
  • 클라우드 배포: AWS, GCP, Azure 등의 클라우드 서비스를 사용하여 애플리케이션과 모니터링 시스템을 배포합니다.
  • 보안 강화: 모니터링 도구의 접근 권한을 설정하고, 데이터 암호화 등을 구현합니다.
  • 다양한 메트릭 추가: JVM 메트릭, 데이터베이스 쿼리 성능, 외부 API 호출 성능 등 다양한 메트릭을 추가하여 심화된 모니터링을 구현합니다.

포트폴리오 구성 팁

  • GitHub 레포지토리: 모든 소스 코드를 GitHub에 공개하여 코드 품질과 프로젝트 진행 과정을 보여줍니다.
  • README 작성: 프로젝트의 목적, 사용 기술, 설정 방법, 실행 방법, 주요 기능 등을 자세히 설명합니다.
  • 문서화: 각 단계별 설정 파일과 코드에 대한 설명을 문서화하여 이해하기 쉽게 만듭니다.
  • 데모 영상: 프로젝트의 기능과 모니터링 대시보드를 시연하는 짧은 데모 영상을 제작하여 시각적으로 보여줍니다.

7. 추가 학습 자료

결론

성능 지표와 모니터링은 백엔드 개발에서 시스템의 안정성과 효율성을 유지하는 데 중요한 역할을 합니다. 위의 실습 프로젝트를 통해 Java와 Spring 환경에서의 모니터링 시스템 구축 과정을 경험하고, 이를 포트폴리오에 추가함으로써 취업 준비에 큰 강점을 가질 수 있습니다. 실습을 진행하면서 발생하는 문제를 해결하고, 다양한 도구를 탐구하는 과정에서 실무 역량도 자연스럽게 향상될 것입니다. 화이팅입니다!

0개의 댓글