모니터링

docker에 prometheus + grafana 올리기 (Spring boot)

MIN우 2023. 11. 7. 15:39
728x90

 

왜 prometheus와 grafana를 사용하게 되었을까 ?

실제 서비스를 돌리고 운영을 해가면서 실제로 친구들이 테스트를 진행해주면서 병목지점이 발생부분을 찾을 수 있었다.

그래서 깨달은 것이 바로 모니터링 환경이다.모니터링 환경을 구축함으로 써 Tester가 알려주지않아도 어느지점 어느 api에서 병목지점이 생겼는지 파악하고 해당 부분을 파악하고 수정해나아가는 것이 중요하다는 것을 깨닫게 되었다. 모니터링 도구 중 가장 많이 사용

되고 있는 prometheus와 gramafana는 정말 찰떡궁합이다. 

 

바로 이런 구조로 springboot에서 발생한 매트릭정보를 prometheus와 연동시켜 spring boot Actuator를 

노출시키고 해당 매트릭을 수집을 위한 엔드포인트를 열어주게되면 prometheus는 데이터를 수집하고

시계열 데이터를 grafana와 연동시켜 시각적으로 잘 보여주는 역할을 하게 된다.

 

*시계열 데이터란 ? 일정한 시간 동안 수집 된 일련의 순차적으로 정해진 데이터 셋의 집합.

 

Metric

메트릭(metric)이란 측정 가능한 양이나 특성을 나타내는 척도 또는 지표를 말한다. 데이터 분석이나 평가, 성능 측정 등 다양한 분야에서 사용된다. 메트릭을 잘 수집하면 시스템의 현재 상태를 손쉽게 파악할 수 있다. 메트릭은 주어진 목표나 문제에 따라 다양한 형태로 정의될 수 있다.

  • 호스트 단위 메트릭 : CPU, 메모리, 디스크 I/O 등
  • 종합 메트릭 : 데이터베이스 계층의 성능, 캐시 계층의 성능 등
  • 핵심 비즈니스 메트릭 : 일별 사용자, 수익, 재방문 등

 

 

Prometheus

프로메테우스(Prometheus)는 오픈 소스 모니터링 도구로 메트릭 데이터를 수집하여 데이터베이스에 저장하고, 이를 사용하여 애플리케이션의 상태를 모니터링하고 분석한다. 애플리케이션에서는 메트릭 데이터를 프로메테우스로 노출시켜줘야 하는데, 스프링 부트에서 프로메테우스를 사용하기 위해서는 스프링 부트 액추에이터(Spring Boot Actuator)를 사용하여 메트릭 수집을 위한 엔드포인트를 노출시킨다.

 

모니터링 시스템에는 Pull/Push 2가지 방식이 존재한다.

  • Push : 메트릭이 발생하는 곳에서 메트릭을 수집하는 곳으로 보낸다.
  • Pull : 메트릭을 수집하는 곳에서 주기적으로 데이터를 수집해 간다.

Prometheus는 직접 주기적으로 메트릭을 Pull 해오는 방식으로 동작한다.

 

 

Actuator

액추에이터(Actuator)는 상태, 메트릭, 환경 등 실행 중인 애플리케이션에 대한 운영 정보를 노출하는 데 사용된다. 해당 모듈을 추가함으로 해당 기능을 직접 구현하지 않아도 사용할 수 있으며 다양한 설정을 편리하게 할 수 있게 도와준다. 엔드포인트를 통해 메트릭을 노출시키는데 기본적으로 제공하는 엔드포인트 외에도 사용자가 직접 정의한 엔드포인트도 사용할 수 있다. 제공하는 엔드포인트는 해당 링크를 통해 확인할 수 있다.

 

 

Grafana

그라파나(Grafana)는 오픈 소스 시각화 및 대시보드 도구로 다양한 데이터 소스와 통합되어 다양한 유형의 데이터를 시각화하고 사용자가 쉽게 대시보드를 구성할 수 있는 기능을 제공한다. 가장 일반적으로 사용되는 데이터 소스가 프로메테우스이다. 그 외에도 InfluxDB, ElasticSearch, MySQL, PostgreSQL, AWS CloudWatch 등 다양한 데이터 소스와 통합할 수 있다. 이러한 데이터 소스로부터 그라파나는 데이터를 쿼리하고, 그래프, 차트, 테이블 등 다양한 시각화 요소를 사용하여 데이터를 시각적으로 표현한다.

 

어느정도 개념 및 원리는 파악한 것 같으니 "백문이불여일타" 바로 적용해보겠습니다.

 

build.gradle

 implementation 'org.springframework.boot:spring-boot-starter-web'
 implementation 'io.micrometer:micrometer-registry-prometheus'
 implementation 'org.springframework.boot:spring-boot-starter-actuator'

application.yml

management:
  endpoints:
    web:
      exposure:
        include: prometheus

http://localhost:8080/actuator/prometheus 호출!

 

docker-compose.yml

version: "3.7"

services:

  prometheus:
      image: prom/prometheus
      ports:
        - "9090:9090"
      volumes:
        - /home/pliz/prometheus/conf/prometheus.yml:/etc/prometheus/prometheus.yml
      command:
        - '--config.file=/etc/prometheus/prometheus.yml'
      restart: always

  grafana:
    image: "grafana/grafana"
    ports:
      - "3000:3000"
    volumes:
      - /home/pliz/grafana/conf_grafana:/config_files
    restart: always
    depends_on:
      - prometheus
    privileged: true

간단하게 중요한 기능만 설명하고 넘어가겠습니다.

volume은 호스트 os의 경로와 guest os의 경로를 volume mount하는 역할이다.

 

command명령어: config.file의 경로를 config로 설정하겠다.

음 결론은 volumes의 앞에있는 경로는 자신의 로컬의 경로를 넣어줘야겠습니다.

 

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"]


  - job_name: "java_application"
    metrics_path: '/actuator/prometheus'
    scrape_interval: 5s
    static_configs:
      - targets: ["host.docker.internal:8080"]

 

제대로 실행된 것이 보입니다.

 

http://localhost:3000/login

그라파나는 3000번 포트로 접속한다.

초기 비밀번호는 admin/admin이다.

 

 

 

메인화면에 보이는 DATA SOURCES를 누른다.

 

 

프로메테우스를 선택한다.

 

 

URL에 프로메테우스 URL을 넣어야 한다.

컨테이너 내부에서 호출하는 것이기 때문에 localhost:9090으로 하면 안된다.

프로메테우스 컨테이너 ip를 확인한 후 넣어주면 된다. 

 

docker를 잘 모르시는 분들을 위해 어떻게 ip확인하는지 알려드리겠습니다.

docker inspect <container name> 을 치시면 docker bridge에 의해 만들어진 private ip가 나옵니다 그거 써주시면 됩니다.

 

 

아래쪽에 Save & test 버튼을 눌러준다.

 

 

 

Dashboards > Import 메뉴로 들어간다.

 

 

 

가장 유명한 대시보드이다.

import via grafana.com에 https://grafana.com/grafana/dashboards/4701-jvm-micrometer/ 를 입력한 후 Load한다.

 

 

 

 

그라파나 화면을 확인할 수 있다.

 

 

 

 

irate(http_server_requests_seconds_count{application="spring-boot-monitoring", uri="/test"}[3m])

3분동안 해당 uri를 호출한 count를 확인할 수 있다.

 

더해서 cpu 전체 사용량을 측정하고 싶다 ? 그러면

sum by(job, instance) (rate(process_cpu_seconds_total{job="prometheus"}[$__rate_interval]))

 

 

메인 대쉬보드에서 나는 해당 쿼리를 확인하고싶다 ?

 

상단에 Add to dashboard를 클릭하여 대쉬보드에도 추가할 수 있다.

728x90