ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 프로메테우스와 그라파나를 사용하여 모니터링 수행하기
    SpringBoot 2024. 3. 28. 10:14

     

    들어가며

    우선 서비스 개발과 장기적인 운영 관점에서 애플리케이션을 모니터링하는 것은 매우 중요한 작업입니다.

     

    애플리케이션에서 발생하는 동작들에 대한 메트릭을 수집하여 애플리케이션 성능을 분석하면서

    추후에 성능을 최적화할 수 있고, 시스템 내부에서 발생할 수 있는 잠재적인 문제를 빠르게 식별하고

    해결하는 데 도움이 될 수 있습니다.

    또한 외부로 부터 발생하는 악의적인 활동이나 보안 위협을 식별하고 대응할 수 있기 때문에

    모니터링 환경 구축은 필수적이라고 할 수 있습니다.

     

    그러므로 이번에 스프링부트 환경에서 프로메테우스와 그라파나를 사용하여 모니터링 구축을 하면서

    공부한 내용들을 기록해보았습니다.

    전반적인 흐름

     

     

     

     

    용어 및 개념

    Metric

    위에서부터 메트릭이라는 용어를 사용했기 때문에, 해당 용어에 대해서 궁금하셨을 수도 있을거라 생각합니다.

    메트릭(metric)은 시스템이나 소프트웨어의 상태, 성능 또는 활동을 측정하고 기록하는 수치적인 값을 의미합니다.

    예를 들어 애플리케이션 내에 요청 수가 많을 때 해당 애플리케이션이 느려질 수 있습니다.

    만약 요청 수에 대한 메트릭을 가지고 있다면,

    그 원인을 파악하고 서버 수를 늘려 부하를 처리하는 등의 해결책을 마련할 수 있을 것입니다.

     

    메트릭은 주어진 상황에 따라 다양하게 존재할 수 있습니다.

    성능 관점 : CPU 사용률, 메모리 사용량, 네트워크 대역폭 등과 같이 시스템 리소스의 사용량을 측정하는 용도

    가용성 관점 : 시스템이 사용 가능한 시간의 비율을 측정하는 용도

    비즈니스 관점 : 거래량, 매출, 구매량 등

     

    Prometheus

    프로메테우스(Prometheus)는 오픈 소스 모니터링 도구로, 서버 및 애플리케이션에서 메트릭을 수집하고 저장하여 시스템의 상태를 모니터링하고 분석합니다.

    애플리케이션에서는 메트릭 데이터를 프로메테우스로 노출시켜줘야 하는데,

    스프링부트에서 프로메테우스를 사용하기 위해서는 스프링부트 액추에이터를 사용하여

    메트릭 수집을 위한 엔드포인트를 노출시킵니다.

     

    Grafana

    그라파나(Grafana)는 오픈 소스 시각화 및 대시보드 도구로, 다양한 데이터와 소스와 통합되어

    다양한 유형의 데이터를 시각화하고 사용자가 쉽게 대시보드를 구성할 수 있는 기능을 제공합니다.

     

     

     

     

    환경 설정

    build.gradle.kts

    implementation("org.springframework.boot:spring-boot-starter-actuator")
    implementation("io.micrometer:micrometer-registry-prometheus")

     

    application.yml 파일에 메트릭 관련 설정

    management:
      metrics:
        tags:
          application:
            ${spring.application.name}
      endpoints:
        web:
          exposure:
            include: prometheus

     

    위 내용을 추가해줍니다.

    • management.metrics.tags.application
      • 메트릭 데이터에 태그를 추가하는 역할을 합니다.
      • 여기서는 application이라는 태그를 추가하고, 해당 태그의 값으로 spring.application.name 값을 사용하도록 합니다.
      • 태그 추가를 통해서 메트릭 데이터를 보다 구체적으로 분석하고 필터링할 수 있습니다.
    • management.endpoints.web.exposure.include
      • 외부에 노출할 엔드포인트를 지정해줍니다.
      • prometheus 엔드포인트를 지정하여 프로메테우스에서 해당 엔드포인트를 통해 메트릭을 수집하도록 설정합니다.
      • 위와 같은 include 대신, exclude를 사용하면 외부에 노출시키고 싶지 않은 엔드포인트를 지정할 수 있습니다.

     

    저의 경우, 멀티 모듈 환경의 프로젝트를 진행하고 있기 때문에

    모니터링을 진행하고자 하는 각 모듈들에 대한 .yml 파일에 메트릭 관련 설정을 추가해주었습니다.

     

    application-api.yml

    spring:
      application:
        name: coupon-api
    server:
      port: 8080
      tomcat:
        threads:
          max: 400
        mbeanregistry:
          enabled: true
    management:
      metrics:
        tags:
          application:
            ${spring.application.name}
      endpoints:
        web:
          exposure:
            include: prometheus

     

    application-consumer.yml

    spring:
      application:
        name: coupon-api
    server:
      port: 8081
    management:
      metrics:
        tags:
          application:
            ${spring.application.name}
      endpoints:
        web:
          exposure:
            include: prometheus

     

     

    애플리케이션 메트릭 정보 확인하기

    위와 같이 설정하고 나면,

    postman 등으로 엔드포인트인 http://localhost:8080/actuator/prometheus(저의 경우 8081도 포함)로 접속하면

    jvm_thread에 관한 내용이나 tomcat에 관련된 지표, 메모리 관련 등 시스템에서의 다양한 지표를 응답받을 수 있습니다.

     

     

     

    이제 모니터링 매트릭을 수집하는건 끝났고,

    지속적으로 매트릭을 수집할 수 있는 환경을 구축해야합니다.

     

     

    prometheus.yml

    저의 경우 coupon > monitoring > prometheus > config > 경로에 prometheus.yml 파일을 생성하고

    아래 내용을 추가했습니다.

    global:
      scrape_interval: 5s
    
    scrape_configs:
      - job_name: "coupon-api"
        metrics_path: '/actuator/prometheus'
        static_configs:
          - targets: ['host.docker.internal:8080']
      - job_name: "coupon-consumer"
        metrics_path: '/actuator/prometheus'
        static_configs:
          - targets: ['host.docker.internal:8081']
    • global.scrape_interval
      • 전역으로 스크랩할 각 타겟의 수집 주기를 설정합니다.
      • 기본은 10초이고, 여기서는 5초마다 스크랩하도록 설정하였습니다.
    • scrape_configs.job_name
      • 각 스크랩 대상에 대한 작업 이름을 정의합니다. 이를 통해서 프로메테우스가 대상을 구분할 수 있도록합니다.
    • scrape_configs.metrics_path
      • 스크랩 대상에서 메트릭을 수집할 엔드포인트 경로를 정의합니다.
    • scrape_configs.static_configs
      • 스크랩 대상의 정적 구성을 정의합니다.
      • 저의 경우 8080, 8081 포트로 Docker 내부의 호스트와 포트로 스프링 부트 애플리케이션의 프로메테우스 엔드포인트를 가리킵니다.

     

     

    prometheus.yml 파일은 프로메테우스가 coupon-api와 coupon-consumer라는 두 개의 작업을 수행하며, 

    각 작업은 해당하는 애플리케이션에서 제공하는 프로메테우스 엔드포인트에서 메트릭을 수집합니다.

     

     

    docker-compose.yml

    프로메테우스와 그라파나 컨테이너를 하나의 네트워크로 동작시키기 위한

    도커 컴포즈 파일을 작성해줍니다.

    version: '3.7'
    services:
      prometheus:
        image: prom/prometheus
        container_name: prometheus
        volumes:
          - ./prometheus/config:/etc/prometheus
          - ./prometheus/volume:/prometheus
        ports:
          - 9090:9090
        command:
          - '--config.file=/etc/prometheus/prometheus.yml'
        restart: always
        networks:
          - promnet
      grafana:
        image: grafana/grafana
        container_name: grafana
        ports:
          - 3000:3000
        volumes:
          - ./grafana/volume:/var/lib/grafana
        restart: always
        networks:
          - promnet
    networks:
      promnet:
        driver: bridge

     

    위에서 말한 것처럼, 프로메테우스를 통해서 지속적으로 메트릭을 수집하고

    그라파나를 통해서 대시보드를 만들어 시각화를 진행합니다.

    프로메테우스는 9090 포트, 그라파나는 3000 포트로 설정하였습니다.

     

    이후 docker-compose up -d 명령어를 통해 컨테이너를 띄워줍니다.

     

     

     

     

     

    프로메테우스

    이제 위에서 설정한 9090 포트로 접근하여 프로메테우스를 실행해줍니다.

     

     

    상단의 Status > Targets를 눌러주면 서버 상태 확인이 가능합니다.

     

     

    다음과 같이 서버가 켜져있으면 UP이라는 문구와 초록색불이 들어오고,

    다운되어있으면 Down이라는 문구와 함께 적색불이 들어오게 됩니다.

    지금 위의 상황은 coupon-api는 켜지고 coupon-consumer는 잠시 꺼놓은 상태입니다.

     

     

    나머지 서버를 작동하니, 초록색 불이 들어온 것을 확인할 수 있고

    초록색 불이 들어오면 프로메테우스는 각 메트릭들을 지속적으로 수집하게 됩니다.

     

    또한 검색창을 통해서 찾고자 하는 지표에 대한 확인이 가능합니다.

    아래 사진처럼 system_cpu_usage를 검색하여 cpu 사용량을 확인할 수 있습니다.

     

     

     

     

    그라파나

    이제 수집한 지표들을 시각화하기 위해 3000 포트로 접근하여 그라파나를 실행합니다.

    그러면 초기 아이디/비밀번호인 admin/admin으로 로그인을 진행해주고

     

     

    위와 같이 비밀번호 변경을 할 수 있습니다.

     

    대시보드 생성하기

    다음과 같이 하늘색으로 테두리를 친 부분을 클릭하여 대시보드 생성을 진행해줍니다.

     

     

    여기서 다른 사람들이 미리 만들어 놓은 대시보드 구성을 그대로 가져다가 사용할 수 있습니다.

    저의 경우 4701을 입력하여 로드하였습니다.

     

    프로메테우스 등록하기

    클릭 후, Configure a new data source 클릭

     

    server url을 입력해주고, 아래에 스크롤 내려서 Save & test를 클릭합니다.

     

    Successfully queried the Prometheus API. 라고 뜨면 데이터 소스 추가가 완료된 것 입니다.

     

    이제 다시 import dashboard 부분으로 돌아가서 id를 입력하고

    방금 생성한 프로메테우스를 등록해줍니다.

     

     

     

     

    대시보드 확인

     

    위와 같이 다양한 지표에 대한 대시보드가 기본적으로 생성되어 있는 것을 한눈에 확인할 수 있습니다.

    추가로 우측 상단에 Last 5 minutes로 설정하여, 최근 5분으로 조회하도록 설정하였습니다.

    그 옆에 자동으로 모니터링 대시보드가 갱신되는 주기도 설정이 가능합니다.

    저의 경우 5s로 설정했습니다.

     

     

     

     

    마무리

    이렇게 프로메테우스와 그라파나를 사용하여 모니터링 환경을 구축해보았습니다.

    모니터링에 대한 추가적인 공부를 하고, 그라파나에서 대시보드를 통해 한 눈에 지표들이 들어오는 과정을 보고

    정말 흥미롭게 공부했던 것 같습니다.

     

    다음번에는 실제 트래픽을 발생시켜서

    이에 대한 지표들을 모니터링하는 과정을 담은 내용을 포스팅하겠습니다.

     

    감사합니다!

Designed by Tistory.