들어가며
- 스파클링소다 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 평균 사용량을 출력합니다.
마치며
- promql 쿼리 사용 가이드 https://prometheus.io/docs/prometheus/latest/querying/examples/
아티클이 유용했나요?
훌륭합니다!
피드백을 제공해 주셔서 감사합니다.
도움이 되지 못해 죄송합니다!
피드백을 제공해 주셔서 감사합니다.
피드백 전송
소중한 의견을 수렴하여 아티클을 개선하도록 노력하겠습니다.