본문 바로가기
Projects/청하-청년을 위한 커뮤니티 서비스

[청하] 37. 로컬 환경에서 Spring Boot 모니터링 시스템 구축 (with. Prometheus, Grafana)

by Lpromotion 2024. 10. 27.

REF
https://lordofkangs.tistory.com/327
https://woo-chang.tistory.com/78
https://lordofkangs.tistory.com/329
https://velog.io/@coastby/Grafana-설치-prometheus와-연동하기

 

모니터링의 중요성

현대 소프트웨어 개발에서 모니터링은 중요한 요소이다. 모니터링을 통해 애플리케이션이 실시간으로 어떻게 동작하는지를 파악하고, 문제가 발생했을 때 이를 빠르게 감지하고 대응할 수 있다. 이는 서비스의 안정성과 사용자 경험에 직접적인 영향을 미친다.

특히 애플리케이션의 성능, 상태, 리소스 사용량 등을 지속적으로 모니터링함으로써 가용성을 유지하고, 성능 병목 현상이나 오류를 빠르게 감지할 수 있다. 이런 모니터링 시스템 구축을 위해 프로메테우스(Prometheus)와 그라파나(Grafana)를 많이 사용한다.

프로메테우스는 시계열 데이터를 수집하고 저장하는 모니터링 및 경고 도구이며, 그라파나는 이러한 데이터를 시각적으로 표현해 사용자들이 쉽게 이해할 수 있도록 돕는 대시보드 도구이다. 이 두 도구를 결합하면 강력한 모니터링 시스템을 구축할 수 있다.

 

1. 개요

https://woo-chang.tistory.com/78

 

1.1. Metric

메트릭(Metric)은 애플리케이션의 상태를 수치로 표현한 데이터이다. 예를 들어, CPU 사용률, 메모리 사용량, 요청 처리 시간 등이 메트릭에 해당한다. 스프링부트에서는 Micrometer를 사용해 이러한 메트릭을 쉽게 수집하고 관리할 수 있다. Micrometer는 다양한 모니터링 시스템과 호환되며, 특히 프로메테우스와의 통합이 용이하다.

 

1.2. Actuator

스프링부트 애플리케이션에서는 Actuator를 통해 메트릭을 노출할 수 있다. Actuator는 다양한 엔드포인트를 제공하여 애플리케이션의 상태, 메트릭, 트레이스, 요청 매핑 등을 확인할 수 있게 한다. 이를 통해 애플리케이션의 상태를 실시간으로 모니터링할 수 있으며, 프로메테우스는 이 엔드포인트를 통해 메트릭을 수집한다.

 

1.3. Prometheus

프로메테우스는 시계열 데이터베이스(TSDB)로, 메트릭을 수집하고 저장하며, 분석과 경고 기능도 제공한다. 주로 HTTP를 통해 데이터를 수집하며, PromQL이라는 쿼리 언어를 사용해 복잡한 데이터 분석이 가능하다. 프로메테우스는 Pull 방식으로 작동해, 모니터링 대상이 노출하는 메트릭 엔드포인트를 주기적으로 조회하여 데이터를 수집한다.

 

주요 컴포넌트

  • Prometheus Server: 메트릭을 수집하고 저장하며, PromQL을 통해 쿼리할 수 있는 핵심 컴포넌트이다.
  • Pushgateway: 단기 작업(job)에서 메트릭을 푸시(push) 방식으로 수집할 때 사용한다.
  • Exporters: 프로메테우스와 연동되지 않은 시스템의 메트릭을 수집하기 위해 사용된다. 예를 들어, Node Exporter는 시스템의 CPU, 메모리 사용량 등을 수집할 수 있다.

 

프로메테우스의 데이터 모델링과 시계열 데이터 저장 방식
프로메테우스는 시계열 데이터를 라벨(Label)과 함께 저장해 데이터를 유연하게 쿼리할 수 있게 한다. 각 시계열 데이터는 고유한 이름을 가진 메트릭과 하나 이상의 라벨로 구성된다. 예를 들어, http_requests_total{method="GET", handler="/api"}라는 메트릭은 HTTP GET 요청의 총합을 나타내며, 메서드핸들러라는 라벨로 분류된다. 이러한 구조는 PromQL을 통해 다양한 시각에서 데이터를 분석할 수 있게 한다.

 

1.4. Grafana

그라파나는 다양한 데이터 소스를 지원하는 시각화 도구로, 프로메테우스와 같은 모니터링 시스템에서 수집된 데이터를 시각적으로 표현하는 데 강점을 가진다. 사용자는 직관적인 대시보드를 통해 실시간으로 데이터를 모니터링할 수 있으며, 이를 기반으로 알람을 설정해 특정 조건이 충족되었을 때 즉각적으로 통지받을 수 있다.

 

다양한 데이터 소스 지원
그라파나는 프로메테우스 외에도 InfluxDB, Elasticsearch, MySQL 등 다양한 데이터 소스를 지원한다. 이를 통해 모니터링 외에도 로그 분석, 데이터베이스 모니터링 등 다양한 용도로 활용할 수 있다. 각 데이터 소스는 개별적으로 구성할 수 있으며, 하나의 대시보드에서 여러 소스의 데이터를 동시에 시각화할 수 있다.

 

대시보드 및 알람 설정 개요
그라파나의 대시보드는 시각화의 핵심이다. 사용자는 다양한 위젯을 사용해 데이터를 차트, 그래프, 테이블 등으로 표현할 수 있다. 또한, 특정 조건이 발생했을 때 알람을 통해 이메일, Slack, PagerDuty 등의 채널로 통지할 수 있다. 이는 시스템 문제를 빠르게 감지하고 대응하는 데 큰 도움이 된다.

 

1.5. 결론

프로메테우스와 그라파나를 이용한 모니터링 시스템은 스프링부트 애플리케이션의 성능과 상태를 효과적으로 관리할 수 있는 강력한 도구이다. 이 두 도구를 통해 실시간 모니터링, 시각화, 알람 설정을 통해 애플리케이션의 가용성을 높이고, 문제 발생 시 신속하게 대응할 수 있다.

 

2. Prometheus 설치

 

Download | Prometheus

An open-source monitoring system with a dimensional data model, flexible query language, efficient time series database and modern alerting approach.

prometheus.io

 

나의 로컬 환경은 윈도우이므로 windows 버전을 선택했다.

그리고 안전성을 위해 LTS 버전으로 설치했다.

 

C:\Program Files 에 저장함.

prometheus.exe 파일을 찾아서 실행하고,

http://localhost:9090 로 프로메테우스에 접속할 수 있다.

 

위 화면이 나오면 프로메테우스 서버가 실행된 것이다.

 

3. Spring Boot 에 Actuator, Prometheus 설정

3.1. 의존성 추가

build.gradle

// prometheus
runtimeOnly 'io.micrometer:micrometer-registry-prometheus'  // 마이크로미터 프로메테우스 구현체
implementation 'org.springframework.boot:spring-boot-starter-actuator' // 엑츄에이터

메트릭 수집을 위한 Micrometer 의존성과 매트릭 노출을 위한 actuator 의존성을 추가한다.

 

3.2. Actuator 엔드포인트

{
  "_links": {
    "self": {
      "href": "http://localhost:8080/actuator",
      "templated": false
    },
    "beans": {
      "href": "http://localhost:8080/actuator/beans",
      "templated": false
    },
    "caches-cache": {
      "href": "http://localhost:8080/actuator/caches/{cache}",
      "templated": true
    },
    "caches": {
      "href": "http://localhost:8080/actuator/caches",
      "templated": false
    },
    "health-path": {
      "href": "http://localhost:8080/actuator/health/{*path}",
      "templated": true
    },
    "health": {
      "href": "http://localhost:8080/actuator/health",
      "templated": false
    },
    "info": {
      "href": "http://localhost:8080/actuator/info",
      "templated": false
    },
    "conditions": {
      "href": "http://localhost:8080/actuator/conditions",
      "templated": false
    },
    "configprops": {
      "href": "http://localhost:8080/actuator/configprops",
      "templated": false
    },
    "configprops-prefix": {
      "href": "http://localhost:8080/actuator/configprops/{prefix}",
      "templated": true
    },
    "env": {
      "href": "http://localhost:8080/actuator/env",
      "templated": false
    },
    "env-toMatch": {
      "href": "http://localhost:8080/actuator/env/{toMatch}",
      "templated": true
    },
    "loggers": {
      "href": "http://localhost:8080/actuator/loggers",
      "templated": false
    },
    "loggers-name": {
      "href": "http://localhost:8080/actuator/loggers/{name}",
      "templated": true
    },
    "heapdump": {
      "href": "http://localhost:8080/actuator/heapdump",
      "templated": false
    },
    "threaddump": {
      "href": "http://localhost:8080/actuator/threaddump",
      "templated": false
    },
    "prometheus": {
      "href": "http://localhost:8080/actuator/prometheus",
      "templated": false
    },
    "metrics": {
      "href": "http://localhost:8080/actuator/metrics",
      "templated": false
    },
    "metrics-requiredMetricName": {
      "href": "http://localhost:8080/actuator/metrics/{requiredMetricName}",
      "templated": true
    },
    "scheduledtasks": {
      "href": "http://localhost:8080/actuator/scheduledtasks",
      "templated": false
    },
    "mappings": {
      "href": "http://localhost:8080/actuator/mappings",
      "templated": false
    }
  }
}

애플리케이션을 실행 후 http://localhost:8080/actuator에 접속하면 현재 actuator가 제공하는 엔드포인트 목록을 확인할 수 있다. 필요로 하는 메트릭을 제공하는 엔드포인트에 접속함으로 원하는 메트릭 데이터를 확인할 수 있다. 메트릭 수집 도구인 prometheus에 메트릭을 제공하기 위한 엔드포인트도 만들 수 있다.

엔드포인트 설명 용도
/health 애플리케이션 건강 상태 시스템 상태 모니터링
/metrics 메트릭 정보 성능 모니터링
/prometheus Prometheus 포맷 메트릭 Prometheus 연동
/info 애플리케이션 정보 버전 등 정보 확인

 

3.3. 보안 설정

application.yml

management:
  endpoints:
    web:
      exposure:
        include: "*" # 필요한 엔드포인트만 노출

설정 파일에서 actuator에 대한 데이터 노출 설정을 해야한다.

management.endpoints.web.exposure.include 는 외부에 노출할 엔드포인트를 지정한다. 우선 모든 데이터를 노출하도록 설정했다.

 

추가

metrics:
  tags:
    application: ${spring.application.name}

management.metrics.tags.application 는 메트릭 데이터에 태그를 추가하는 역할을 한다. 예시에서는 application이라는 태그를 추가하고 해당 태그의 값으로 application.yml 파일에 정의되어 있는 spring.application.name 값을 사용하도록 하였다. 태그 추가를 통해 메트릭 데이터를 구체적으로 분석하고 필터링할 수 있다.

 

설정 후 노출된 엔드포인트로 접속하면 정보를 확인할 수 있다.

ex) /actuator/prometheus : 커넥션, 세션, 스레드 등과 같은 애플리케이션 메트릭 정보를 확인할 수 있다.

 

4. Prometheus 설정

prometheus.yml

# my global config
global:
  scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).

# Alertmanager configuration
alerting:
  alertmanagers:
    - static_configs:
        - targets:
          # - alertmanager:9093

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: "prometheus"

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
      - targets: ["localhost:9090"]
  # 메트릭 데이터 URL 경로 정보 추가
  - job_name: "spring-actuator"
    metrics_path: '/actuator/prometheus'
    scrape_interval: 1s
    static_configs:
      - targets: ['localhost:8080']

promethues 설정 파일에서 추가적인 설정을 통해 다양한 대상에서 메트릭을 수집할 수 있다.

 

  • global:
    • scrape_interval: 메트릭을 수집하는 간격을 15초로 설정한 옵션이다.
    • evaluation_interval: 규칙을 평가하는 간격을 15초로 설정한 옵션이다.
  • alerting:
    • alertmanagers: Alertmanager 서버의 설정을 정의하는 옵션이다. (현재는 주석 처리)
  • rule_files:
    • rule_files: 규칙 파일을 지정하는 옵션이다. (현재는 주석 처리)
  • scrape_configs:
    • prometheus:
      • job_name: 프로메테우스 자체를 스크레이프 대상으로 설정한 작업 이름이다.
      • static_configs: localhost:9090에서 메트릭을 수집하도록 설정되어 있다.
    • spring-actuator:
      • job_name: 스프링부트 애플리케이션의 액추에이터 메트릭을 수집하기 위한 작업 이름이다.
      • metrics_path: 메트릭을 수집할 경로를 /actuator/prometheus로 설정한 옵션이다.
      • scrape_interval: 1초마다 메트릭을 수집하도록 설정한 옵션이다.
      • static_configs: localhost:8080에서 메트릭을 수집하도록 설정되어 있다.

 

rule.yml

groups:
  - name: system-monitor
    rules:
      - alert: InstanceDown
        expr: up == 0
        for: 5m
        labels:
          severity: page
        annotations:
          summary: "Instance {{ $labels.instance }} down"
          description: "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 5 minutes."

      - alert: APIHighRequestLatency
        expr: api_http_request_latencies_second{quantile="0.5"} > 1
        for: 10m
        annotations:
          summary: "High request latency on {{ $labels.instance }}"
          description: "{{ $labels.instance }} has a median request latency above 1s (current value: {{ $value }}s)"

메트릭 스크랩 설정 외에도 알람에 대한 설정도 가능하다. 프로메테우스에서 알람은 시스템 또는 서비스의 이상 상태를 감지하고 이에 대한 경고 또는 통지를 생성하는 기능이다. 알람은 메트릭 데이터를 기반으로 정의되며 특정 조건이 충족될 때 발생한다.

 

  • groups: 규칙을 그룹화하는 옵션이다. 여기서 여러 규칙을 하나의 그룹으로 묶을 수 있다.
  • name: 그룹의 이름을 지정하는 옵션이다.
  • rules: 그룹 내에서 정의된 개별 규칙들의 목록이다.
  • alert: 알람의 이름을 지정하는 옵션이다.
    • 예를 들어, InstanceDownAPIHighRequestLatency라는 두 개의 알람이 정의되어 있다.
  • expr: 알람을 발생시키는 조건을 정의하는 표현식이다.
    • up == 0은 인스턴스가 다운되었음을 의미하고, api_http_request_latencies_second{quantile="0.5"} > 1은 API 요청 지연 시간이 1초를 초과하는 경우를 나타낸다.
  • for: 조건이 일정 시간 동안 지속될 때만 알람을 발생시키도록 설정하는 옵션이다.
    • 예를 들어, InstanceDown 알람은 5분 동안 다운되었을 때 발생한다.
  • labels: 알람에 추가적인 라벨을 붙이는 옵션이다.
    • severity: page는 알람의 심각도를 나타내는 라벨이다.
  • annotations: 알람에 대한 추가적인 정보를 제공하는 옵션이다. summarydescription 필드를 통해 알람의 요약과 상세 설명을 지정할 수 있다.
    • summary: 알람의 요약 정보를 제공하는 옵션이다. 예를 들어, "Instance {{ $labels.instance }} down"은 인스턴스가 다운되었음을 요약한다.
    • description: 알람의 상세 설명을 제공하는 옵션이다. 여기서 인스턴스와 작업(job) 이름, 현재 값 등을 포함한 상세한 설명을 제공한다.

 

rule.yml 파일은 직접 생성해야 하며, prometheus.yml 파일에서 참조하도록 “rule_files” 섹션에 추가해야 한다.

나는 일단 알람 기능은 추가하지 않았다.

 

http://localhost:9090 로 프로메테우스 서버에 접속해서 Status > Targets 에 가면 연동 상태를 확인할 수 있다. Labels에 spring-actuator가 연동한 대상이다. URL을 보면 prometheus.yml에서 설정한 대로임을 확인할 수 있다.

prometheus는 설정한 대로 1초마다 메트릭 데이터를 수집하여 DB에 저장하고 있다. DB에 프로메테우스 쿼리를 이용해 원하는 데이터를 조회할 수 있다.

 

쿼리: http_server_requests_seconds_count{uri="/actuator/prometheus"}



이 쿼리는 /actuator/prometheus 경로에 http request를 요청한 횟수를 조회하는 쿼리이다.

283번 요청이 이루어졌다는 결과가 반환되었다.

 

Graph 탭을 누르면 도식화된 형태로 시간별 데이터 추이를 확인할 수 있다.

 

https://lordofkangs.tistory.com/327

프로메테우스는 설정된 수집 주기(scrape interval)에 따라 메트릭 데이터를 수집하여 시계열 데이터베이스(TSDB)에 저장한다. 저장된 데이터는 PromQL(Prometheus Query Language)을 통해 조회할 수 있으며, 이를 활용하여 시간대별 데이터 추이를 분석할 수 있다. 이러한 시계열 데이터 분석은 애플리케이션의 성능 모니터링과 문제 해결에 핵심적인 정보를 제공한다.

 

5. Grafana 설치

 

Download Grafana | Grafana Labs

Overview of how to download and install different versions of Grafana on different operating systems.

grafana.com

 

윈도우 11.2.0 버전을 설치했다.

C:\Program Files\GrafanaLabs 에 저장된다.

C:\Program Files\GrafanaLabs\grafana\bin 에서 grafana-server.exe 를 실행하고,
http://localhost:3000/로 접속한다.

 

로그인 화면이 나오고, id와 password를 admin, admin으로 로그인한다.

 

grafana 서버가 정상 작동하는 것을 확인할 수 있다.

 

6. Grafana와 Prometheus 연동

Home>Connections>Data sources>Add data source로 들어가 “Prometheus”를 선택한다.

 

URL에 prometheus 의 로컬 서버 주소인 http://localhost:9090을 입력한다.

 

저장을 누르고 “Successfully queried the Prometheus API.”라는 문구가 나오면 정상 연동되었다는 의미이다.

 

6.1. 대시보드 만들기

Home>Dashboards>New>New dashborad를 선택>Add visualization을 선택한다.

 

하단에 “Select Metric”을 통해 쿼리를 선택하고 “Run queries”를 누르면 Prometheus에서 데이터를 가져와 시각화한다.

 

쿼리: system_cpu_usage (전체 시스템의 CPU 사용량을 나타낸다.)

 

쿼리: process_cpu_usage (JVM 프로세스의 CPU 사용량을 나타낸다.)

 

6.2. 공유 대시보드 활용하기

Grafana Lab에서 prometheus와 관련된 대시보드 템플릿을 검색하고 적절한 것을 선택한다.

(ex: Spring 검색)

“Copy ID to clipboard” 을 눌러 템플릿 ID를 복사한다.

 

Home>Dashboards>New>Import 로 들어가서 복사한 ID를 입력하고 “Load” 한다.

 

하단에 prometheus를 선택하고 “Import” 한다.

대시보드가 생성되고 panel 별로 들어가서 쿼리나 옵션을 수정할 수 있다.

반응형

댓글