프로메테우스 단위 기간내 특정 시간대의 리소스 사용량 확인.

작성자 박형춘 수정일 2024-01-15 09:16

들어가며

  • 스파클링소다 3.0 ,4.0 제품에는 리소스 모니터링을 위해 prometheus(시계열 데이터 수집), grafana(가공된 데이터 대시보드화)가 반영되어 있습니다.
  • grafana 대시보드 탭에서는 모니터링 기간을 지정할수 있습니다.
  • 다만 grafana에서 해당 기간의 특정 시간대에 대한 필터링 기능은 지원되지 않습니다.
  • 분석엔진 내부 python 환경이 제공되므로 단위 기간내 특정 시간대의 리소스를 확인하는 방법을 작성합니다.


사전 작업 및 준비

  • 분석엔진 내부에서 request, numpy 패키지를 사용합니다. (해당 패키지는 nexus에서 설치 가능해야합니다.)
  • prometheus 서버를 직접 호출하므로 service 타입이 nodeport로 열려있는지 확인합니다. *예시 포트 30990
  • prometheus 서버 호출시 promql을 사용하므로 쿼리 사용방법을 숙지해야 합니다.


내용

1. 분석엔진 실행(예시 환경은 jupyter notebook입니다.)

python 버전을 확인합니다.

import sys
sys.version



2. 첨부된 파일을 반영한 후 수정사항을 변경합니다.

메모리 확인 : memory_check.py
CPU 확인 : cpu_check.py


cpu_check.py

# cpu
import requests
from datetime import datetime, timedelta, time
import numpy as np
import math

# 프로메테우스 서버 URL
url = "http://192.168.50.181:30990/api/v1/query_range" # 서버 주소 확인.

# 데이터 조회 범위
end_time = datetime.now()
start_time = end_time - timedelta(days=14)

### 노드 전체
query = 'sum (rate (container_cpu_usage_seconds_total{node="dev-master"}[1m])) by (pod)' # 노드명 확인.

### 특정 파드 (cpu limit 있는 파드)
# query = 'rate (container_cpu_usage_seconds_total{node="master",pod="kube-apiserver-master"}[1m]) '

### 특정 파드 (cpu limit 없는 파드)
# query = 'rate (container_cpu_usage_seconds_total{node="master",pod="sodaflow-app-7fc78b9977-swhmb"}[1m]) '

step = '1h'

response = requests.get(url, params={'query': query, 'start': start_time.timestamp(), 'end': end_time.timestamp(), 'step': step})

results = response.json()['data']['result']

cpu_usages_between_8_and_18 = []

for result in results:
    for value in result['values']:
        timestamp, cpu_usage = value

        # 타임스탬프 객체로 변환 
        dt_object = datetime.fromtimestamp(timestamp)

        # 시간 정의
        if time(8) <= dt_object.time() <= time(18):
            cpu_usages_between_8_and_18.append(float(cpu_usage))
        else:
            average_cpu_usage_between_8_and_18 = 0

np_value = np.mean(cpu_usages_between_8_and_18) * 100
average_cpu_usage_between_8_and_18 = round(np_value, 2)

# print(f"단위 기간 2주 // 08시 ~ 18시 평균 CPU = {average_cpu_usage_between_8_and_18}%")       # python 3.6 이상인 경우
print("단위 기간 2주 // 08시 ~ 18시 평균 CPU = {}%".format(average_cpu_usage_between_8_and_18)) # python 3.5 이하인 경우


memory_check.py

import requests
from datetime import datetime, timedelta, time
import numpy as np
import math

# 프로메테우스 서버 URL
url = "http://192.168.50.181:30990/api/v1/query_range"

# 데이터 조회 범위
end_time = datetime.now()
start_time = end_time - timedelta(days=14)

### 노드 전체
query = 'sum (container_memory_working_set_bytes{node="dev-worker",container!="POD", container!=""}) by(node)'

### 특정 파드 (cpu limit 없는 파드)
# query = 'sum (container_memory_working_set_bytes{node="dev-master",pod="devainexus-0",container!="POD", container!=""}) by (pod)'

step = '1h'

response = requests.get(url, params={'query': query, 'start': start_time.timestamp(), 'end': end_time.timestamp(), 'step': step})

results = response.json()['data']['result']

first_v = results[0]
second_v = first_v['values']

arr = []
for value in second_v:
    timestamp, memory_usage = value
    dt_object = datetime.fromtimestamp(float(timestamp))
    
    # 시간 정의
    if time(8) <= dt_object.time() <= time(18):
        arr.append(float(memory_usage))

np_value=np.mean(arr)
translate_np_val=np_value / (1000 ** 3)

#print(f"단위 기간 2주 // 08시 ~ 18시 평균 사용 메모리 = {translate_np_val:.2f}GB")          # python 3.6 이상인 경우
print("단위 기간 2주 // 08시 ~ 18시 평균 사용 메모리 = {:.2f}GB".format(translate_np_val))   # python 3.5 이하인 경우


수정 필요한 사항

- url : 프로메테우스 서버의 url 로 주소와 포트를 수정합니다.
- query : 예시로 등록된 'query'를 참고하여 적절히 수정합니다.
    예시 1) query = 'sum (container_memory_working_set_bytes{node="dev-master",pod="devainexus-0",container!="POD", container!=""}) by (pod)'
    >> 'container_memory_working_set_bytes 쿼리를 사용하고 필터링을 수행하여 결과를 찾습니다.
    >> 'node' 라벨에 해당하는 값은 필터링할 노드명으로 변경합니다.
    >> 'pod' 라벨에 해당하는 값은 필터링할 파드명으로 변경합니다.
    >> 'container!="POD" , container!="" ' 옵션은 리소스 확인시 pause 컨테이너로 인한 중복 제거를 위한 조치로 쿼리 사용시 기본적으로 추가합니다.

- start_time , end_time : 데이터 조회 일자를 지정합니다. (prometheus 기본 설정은 2주가 최대값입니다.)

- if time(8) <= dt_object.time() <= time(18) : 지정한 기간의 08시부터 18시까지의 시간 데이터만 추출합니다.

    >> 위 예시1 쿼리의 결과는 'dev-master' 노드에 실행중인 'devainexus-0' 파드의 08시부터 18시까지의 cpu 평균 사용량을 출력합니다. 
    




마치며

아티클이 유용했나요?

훌륭합니다!

피드백을 제공해 주셔서 감사합니다.

도움이 되지 못해 죄송합니다!

피드백을 제공해 주셔서 감사합니다.

아티클을 개선할 수 있는 방법을 알려주세요!

최소 하나의 이유를 선택하세요
CAPTCHA 확인이 필요합니다.

피드백 전송

소중한 의견을 수렴하여 아티클을 개선하도록 노력하겠습니다.

02-558-8300