본문 바로가기

리눅스 인프라/Prometheus

Spring - Prometheus, NodeExporter, Grafana 를 사용해서, 서버와 컴퓨터의 정보 확인하기

관련 내용

해당 프로젝트 깃허브

개발 환경

  • SpringBoot(gradle) - 2.7.5
  • Ubuntu - 20.04

개요 목표

Spring Server - Prometheus와 Grafana 연결을 통해서 api별 호출 횟수 파악, api 별 오류율 확인(해당 api가 몇 퍼센트 오류율을 가지고 있는 지), api별 호출 시간(해당 api 함수가 얼마나 시간이 걸리는 지 파악) 정보를 얻어서, 그래프로 시각화 방법을 알아본다.

그리고 NodeExporter - Prometheus와 Grafana 연결을 통해서 해당 서버의 메모리 사용량 파악, CPU사용 % 정보를 나타내는 방법을 알아본다.

<VirtualBox 내 상황>

spring sub 6 서버에서 실행 되고 있는 Spring Server API 메트릭 정보와, node-exporter를 통한 CPU MEMORY 메트릭 정보를, mysql 서버에서 얻어 시각적 그래프로 나타낸다.

1. Prometheus, Grafana - Spring 서버 api 별 정보 출력하기

Spring Actuator와 Prometheus 연결

Actuator란

스프링부트 어플리케이션 상태 정보를 HTTP를 사용해서 모니터링과 관리를 할 수 있게 해준다. 예를 들어 애플리케이션 기능들이 잘 돌아가는 지 확인하거나, 서버를 재 시작하거나, 로그 정보를 변경하는 등 외부에서 쉽게 조작하기 위한 도구이다.

이번 시간에는 Prometheus가 서버의 상태를 파악하기 위한 메트릭을 Spring Actuator에서 노출한다. 노출된 메트릭을 Prometheus가 수집해서 서버의 상태(api별 호출 횟수, 오류율 등)를 파악한다. Prometheus와 연결된 Grafana는 해당 정보를 시각화한다.

  • 메트릭(metric)이란, 간단하게 말하자면 숫자 데이터이다. 메트릭의 예로는 요청 시간, 데이터베이스 활성 연결 수, CPU 사용량 등이 있다. 그리고 Prometheus는 이 메트릭을 HTTP를 통한 pull을 통해 주기적으로 수집하여 시계열(time series) 데이터로 저장한다. 따라서, 숫자로 구성된 시계열 데이터를 수집하고 모니터링 하는데 적합하다.

Spring Actuator 설정

build.gradle 의존성 추가

SeperateDeliveryService\APIDeliveryService\build.gradle

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-actuator'
    implementation 'io.micrometer:micrometer-registry-prometheus'
}

application.yml에서 Prometheus 메트릭을 노출할 수 있게 endpoint를 설정

SeperateDeliveryService\APIDeliveryService\src\main\resources\application.yml

spring:
  application:
    name: monitoring
management:
  endpoints:
    web:
      exposure:
        include: prometheus

Actuator에서 prometheus endpoint 외에도, beans(모든 빈 정보를 알려준다) 같은 endpoint를 열어서 서버 정보를 확인할 수 있다.

아래 사진에서 SpringServer의 Actuator promethus 엔드 포인트가 잘 열린 것을 확인 할 수 있다.

ubuntu(mysql) prometheus 다운 및 설정

spring server가 있는 spring sub 6이 아니라, mysql이름의 우분투 서버에 Prometheus를 설치한다.

패키지 다운

sudo apt-get update -y
sudo apt-get install -y prometheus prometheus-node-exporter prometheus-pushgateway prometheus-alertmanager

prometheus 설정 (vi /etc/prometheus/prometheus.yml)

Prometheus시작

systemctl start prometheus

이렇게 설정하면, 10.0.2.6:5511/actutor/prometheus에서 메트릭 정보를 수집한다.

Prometheus에 들어가 Targets을 들어가 보면 spring server와 연결 된 것을 확인할 수 있다.

Prometheus 메트릭스 Grafana시각화

mysql 서버에 Grafana를 다운 받고, 같은 서버에 있는 Prometheus와 연결하여

pi별 호출 횟수 파악, api 별 오류율 확인(해당 api가 몇 퍼센트 오류율을 가지고 있는 지), api별 호출 시간을 그래프로 확인해보자.

grafana 다운, Prometheus와 연결

패키지 다운

sudo apt-get update && sudo apt-get upgrade -y
sudo apt-get install -y apt-transport-https
sudo apt-get install -y software-properties-common wget
wget -q -O - <https://packages.grafana.com/gpg.key> | sudo apt-key add -
//기본
echo "deb <https://packages.grafana.com/oss/deb> stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list
//베타
echo "deb <https://packages.grafana.com/oss/deb> beta main" | sudo tee -a /etc/apt/sources.list.d/grafana.list
sudo apt-get update
sudo apt-get install grafana

Grafana 시작

systemctl start grafana-server

Grafana 접속 후 Prometheus와 연결

http://127.0.0.3:3000 접속 후에

id: admin password:admin 으로 로그인

configuration 설정에서 Prometheus dataSource 등록하기

API 별 정보 호출 코드 작성하기

dashboard 에서 addpannel하기

  • api 별 에러 발생율

rate(http_server_requests_seconds_count{status=~"5..|4.."}[1m]) /http_server_requests_seconds_count

  • api 별 호출 시간

http_server_requests_seconds_max{status!~"4..|5.."}

  • api 별 호출 빈도

http_server_requests_seconds_count{uri!="/actuator/prometheus", status!~"4..|5.."}

이렇게 Spirng Actuator -Prometheus - Grafana를 연결해서 api 별 정보를 그래프로 확인 할 수 있다.

2. NodeExpoter - Prometheus, Grafana 연동

Spring Boot Actuator를 통해서 스프링 서버의 상태를 파악할 수 있다. 이번에는 서버 자체(spring sub6)의 CPU 사용량 Memory 사용량을 파악하기 위해 NodeExpoter 서버와 Prometheus를 연동하여 서버의 상태를 확인 그래프로 확인해보자.

연동하기

VirtualBox spring sub6에 다운 그림하나 추가하면 좋을듯

nodeExporter 다운 실행

spring sub6에 nodeExporter 다운로드

wget <https://github.com/prometheus/node_exporter/releases/download/v0.17.0/node_exporter-0.17.0.linux-amd64.tar.gz>
tar zxvf node_exporter-0.17.0.linux-amd64.tar.gz

node_exporter 실행

cd node_exporter-0.17.0.linux-amd64/
./node_exporter &

동작 확인하기

spring sub6의 node exporter가 잘 작동하는 것을 확인할 수 있다.

Prometheus와 연동 (vi /etc/prometheus/prometheus.yml)

mysql 서버 prometheus 설정 변경

spring server6의 exporter와 mysql서버의 prometheus를 연결한다.

연동 확인하기

CPU Memory 사용량 코드 작성

  • 메모리 사용량 MB로 변환해서 파악하기

node_memory_Active_bytes/1048576

(1048576 B = 1 MB)

  • CPU 사용량

rate(node_cpu_seconds_total{mode=~"system|user"}[1m]) *100

위 코드를 작성해서 서버 자체의 CPU 메모리 사용량을 파악할 수 있다.


Reference

https://stackoverflow.com/questions/71126401/find-exact-cpu-percentage-from-the-metrics-exported-by-prometheus-node-exporter

https://ourcodeworld.com/articles/read/1686/how-to-install-prometheus-node-exporter-on-ubuntu-2004

https://meetup.nhncloud.com/posts/237

https://velog.io/@sosimina/Prometheus-모니터링-설치-및-Node-exporter-조인