본 포스팅은 3편으로 구성되어 있습니다.
2024.05.05 - [IT/오픈소스] - 프로메테우스(Prometheus) 오픈소스란?
2024.05.05 - [IT/오픈소스] - 프로메테우스(Prometheus) 기본 사용법
2024.05.06 - [IT/오픈소스] - 프로메테우스(Prometheus) 자바 클라이언트 활용
이전 포스팅에서는 프로메테우스가 무엇인지 등의 개념을 배웠다.
이번 포스팅에서는 커스텀 메트릭을 만들어서 실제로 프로메테우스를 사용하는 방법에 관해 설명한다.
해당 포스팅을 잘 따라하면 누구나 그래프를 눈으로 볼 수 있을 것이다.
프로메테우스 설치
우선 프로메테우스를 설치한다.
위 구조에서 Prmethues server에 해당하는 부분을 설치하는 것이다.
리눅스 서버에 직접 설치할 수 있고, 도커로 빠르게 할 수 도있다. 물론 윈도우에 설치도 가능하다.
- 윈도우 설치
해당 링크에 들어가서 각 사용자에 맞게 파일을 다운받는다.
https://prometheus.io/download/
prometheus.yml 열어서 target을 채우고 prometheus.exe로 실행.
- 리눅스 설치 (도커 설치)
방법은 여러가지가 있다. 리눅스에 직접 설치할수도있고, docker-compose.yml로 할 수도 있다.
docker run -d -p 9090:9090 --name prometheus
-v /home/monitor/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
-v prometheus-data:/prometheus
prom/prometheus
외부에서 yml파일을 컨트롤하기위해 -v 옵션을 붙여주었다. 해당경로에 prometheus.yml 파일이 존재해야한다.
또, 도커 컨테이너가 날아가버릴때 데이터가 사라지는것을 방지하기위해 볼륨을 추가하여 데이터를 저장하도록 한다.
(기본적으로 도커를 사용할줄아는것을 전제함)
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: "job_onl"
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ["localhost:9219"]
위 yml설정에관해 간단히 설명하자면,
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.
query_log_file: /etc/prometheus/prometheus.log
글로벌하게 적용되는 설정인데, 매트릭 수집 시간을 정한다. 타겟마다 따로 설정된 수집시간이 없으면 기본적으로 15초로 마다 매트릭을 수집하겠다는 의미이다.
프로메테우스 http 포트
scrape_configs:
- job_name: "prometheus"
static_configs:
- targets: ["localhost:9090"]
prometheus의 http 웹 포트를 9090포트로 설정하겠다는 의미이다. (디폴트값)
메트릭 수집 타겟
scrape_configs:
- job_name: 'node01'
scrape_interval: 1s
static_configs:
- targets: ['localhost:9180']
labels:
node_id: node01
node_exporter라는 이름을 가진 job에 관한 설정이다. 프로메테우스가 localhost:9180에 접근하여 메트릭 데이터를 pull 해온다. 중요한것은, 아무포트나 등록하면 되는것이 아니라 프로메테우스가 읽어올수있도록 메트릭 정보를 제공해주는 exporter의 포트를 등록해야한다는 것이다.
여러가지의 exporter가 존재하지만, 리눅스 서버의 cpu, heap, memory 사용량 등을 체크하고싶을때 사용하는node_exporter를 설치해본다.
https://prometheus.io/download/#node_exporter
위 링크로 접속하여 환경에 맞는 압축파일을 링크 복사한다.
wget으로 다운
wget https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz
node exporter 실행
./node_exporter
기본적으로는 9180포트이지만 포트를 바꾸고싶다면 실행시 옵션을 주면된다.
./node_exporter --web.listen-address=:9180 (포트변경가능)
node_exporter가 잘 실행되었는지 확인하려면 ip:9180/metric 으로 접속해본다.
위처럼 표현된다면 node_exporter가 설치된것이다.
node_exporter까지 설치한 후에 도커를 실행시킨 후, localhost:9090/targets 에 접속해본다.
위처럼 표현된다면, prometheus 설치는 잘된것이다.
데이터 그래프로 표현하기
데이터집계를 프로메테우스로 하고 + 시각화는 그라파나로 하는것이 대부분이지만, 사실 프로메테우스는 데이터 집계와 시각화까지 둘다해준다. (보기가 별로여서 안 쓰고, 게이지 사용량등을 시각화해주는것에 한계점이 있으므로) 하지만, 프로메테우스로도 간단히 promql을 사용해보기는 좋다.
localhost:9090/graph 로 접근하여 검색창에 cpu를 입력해보면 관련된 메트릭들이 나온다.
예를들어, 현재 서버의 cpu사용량을 그래프로 보고싶다고 가정하고 promql을 작성해보자
node_cpu_seconds_total은 해당 서버의 cpu의 코어가 초당 얼마만큼의 cpu를 할당받았느냐를 나타내는 메트릭이다.
옆에 counter, gauge 등의 메트릭 유형이 나오는것을 주목하자. node_cpu_seconds_total는 counter이기 때문에 증가밖에 할 수 없는 메트릭이다. ( node_cpu_seconds_total 를 집계할 수 있었던것은 앞에서 설치했던 node_exporter가 메트릭을 집계해주고 있기 때문이다. )
node_cpu_seconds_total로 검색을 해보면 많은 결과값이 나올것이다.
위 결과는 필터를 걸지 않았기때문에 cpu에 각종 모드가 모두 보여지는 값이라 유의미한 결과값이 아니다.
cpu는 여러가지 모드가 존재하는데 우리가 원하는것은 할당받은 cpu의 값이지만, 우선 idle모드를 구하여 cpu를 할당받지 못해 놀고있는 값을 구한다.
node_cpu_seconds_total{mode=“idle”} 로 검색하면 cpu를 할당 받지못해 놀고있는 값만 나오는것을 알 수 있다. (idle을 제외하면 모두 cpu에게 할당받아 작업했다는 의미)
서버의 cpu 코어개수만큼 나올것인데, 나 같은경우에는 리눅스 서버의 cpu 코어가 64이므로 cpu="0"부터 cpu="63"까지 총 64개의 그래프가 그려진다. node_cpu_seconds_total는 Counter 타입이므로 숫자가 계속 증가하기만한다. 결국 해당 그래프의 설명은 0번cpu는 지금까지 37.85M초 (37849097.38초) 동안 idle 상태였다는 의미이다. 1번cpu ~ 63번cpu도 마찬가지 각각의 idle 값을 가지고있다.
여기서 등장할수있는 것이 rate()함수다. rate() 함수는 지정한 시간 범위 내에 매트릭이 변화한 정도를 보기 위한 연산이다. Counter 유형에 자주 쓰이며, 해당 범위의 초당 평균 변화율을 나타낸다. rate() 함수는 처음과 끝 샘플을 이용하여 초당 평균 변화율을 계산한다. (samle(t2) - sample(t1)) / (t2 - t1)
rate() 계산방법의 자세한 방법은 여기서 확인하도록 하자. https://velog.io/@skynet/Prometheus-rate-%EC%97%B0%EC%82%B0%EC%9D%98-%EC%8B%A4%ED%96%89-%EC%9B%90%EB%A6%AC
(rate(node_cpu_seconds_total{mode="idle"}[30s])) 라는 의미는, 현 시점부터 30초전의 처음과 끝샘플을 비교해서 초당 평균 변화율을 나타낸것이다. idle값의 초당 평균 변화율이므로 값이 1에 가까울수록 해당 코어는 일을 안하고 열심히 놀았다 라는 의미이다. 예를 들어, 0번cpu의 초당 평균 변화율이 0.94라면 해당 cpu는 평균적으로 1초동안 0.94초는 놀고 0.06초만 일했다고 이해하면 된다.
우리는 리눅스 서버별로 cpu의 사용량을 보고싶은것이지, 서버의 cpu 코어별로 cpu사용량을 보고싶은것은 아니다.
avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[30s])) 를 입력하여 instance별로 cpu의 평균을 구한다.
해당 그래프는 현시점부터 30초전의 idle값을 비교하여 초당 평균 변화율을 계산한것에 0번cpu~63번cpu의 값을 또 평균낸값이다. 즉, 이 그래프는 서버의 cpu 유휴 값을 나타낸다.
cpu의 유휴 시간을 알았으니 100을 곱한후에 전체 100에서 빼면 cpu의 사용율을 알수있다.
100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[30s])) * 100)
해당서버는 평균적으로 cpu사용량이 2%정도 되는 널널한 상태임을 알 수 있다.
이렇게 promql을 잘 활용하면 무한한 활용이 가능하니, 여러가지 예제를 보고 숙달하는 과정이 필요하다.
번외로, 방금했던것은 서버의 전체 cpu%사용률은 나타낸것이고, 특정 프로세스만의 cpu의 사용률을 알고싶다면
아래와 같이 process_cpu_seconds_total을 활용하여 cpu개수를 나누면 된다.
rate(process_cpu_seconds_total{job="abc"}[30s]) / (count without(cpu, mode) (node_cpu_seconds_total{mode="idle"})) * 100
rate(process_cpu_seconds_total{job="abc"}[30s]) / cpu개수 * 100
다음 포스팅에서는 node_exporter처럼 만들어져있는 메트릭을 사용하는것이 아닌, 직접 커스텀 메트릭을 구현하여 모니터링하는 방법에 관하여 설명하겠다.
참고
'IT > 오픈소스' 카테고리의 다른 글
JPA - 고급 매핑 (0) | 2024.12.23 |
---|---|
프로메테우스(Prometheus) 자바 클라이언트 활용 (0) | 2024.05.06 |
프로메테우스(Prometheus) 오픈소스란? (0) | 2024.05.05 |
JPA - 기본 개념 (1) | 2024.01.30 |
카프카(Kafka) - 활용정리 (0) | 2023.09.12 |
댓글