지난 글에서는 서버 한대의 평균 CPU 사용량을 조회하는 방법을 알아봤다.
이번 글에서는 한대가 아닌 다수의 서버의 평균 CPU 사용량을 조회하는 내용을 다룰 예정이다.
API 서버 정보
api_server = "https://cw.apigw.ntruss.com"
API URI 정보
api_url = "/cw_fea/real/cw/api/data/query/multiple"
Ncloud API 링크: https://api.ncloud-docs.com/docs/management-cloudinsight-querydatamultiple
QueryData API 사용과 비슷하다. payload 데이터에 수집을 원하는 metric 정보를 metricInfoList 변수에 리스트 형식으로 저장하면 된다.
[예시]
{
"metricInfoList": [
{
"prodKey": "string",
"metric": "string",
"interval": "string",
"aggregation": "string",
"queryAggregation": "string",
"dimensions": {
"string": "string"
}
},
{
"prodKey": "string",
"metric": "string",
"interval": "string",
"aggregation": "string",
"queryAggregation": "string",
"dimensions": {
"string": "string"
}
}
],
"timeStart": "long",
"timeEnd": "long"
}
실질적으로 QueryData API와 크게 다른 부분이 없어서 쉽게 확인할 수 있었다.
작성 코드는 서버1 ~ 서버15의 avg_cpu_used_rto 조회하는 내용이다.
payload = {
"metricInfoList": [
{
"prodKey": "567435234753253376",
"metric": "avg_cpu_used_rto",
"interval": "Min1",
"aggregation": "avg",
"dimensions": {
"instanceNo": "Server 1 Instance Number"
}
},
{
"prodKey": "567435234753253376",
"metric": "avg_cpu_used_rto",
"interval": "Min1",
"aggregation": "avg",
"dimensions": {
"instanceNo": "Server 2 Instance Number"
}
},
.
.
.
.
,
{
"prodKey": "567435234753253376",
"metric": "avg_cpu_used_rto",
"interval": "Min1",
"aggregation": "avg",
"dimensions": {
"instanceNo": "Server 15 Instance Number"
}
}
],
"prodName":"System/Server(VPC)",
"timeEnd": 조회를 원하는 시간의 Timestamp 값,
"timeStart": 조회를 원하는 시간의 Timestamp 값
}
단순 조회를 원하는 Metric 정보를 리스트 형식으로 지정하면 된다.
위 코드는 "avg_cpu_used_rto" Metric에 대해 다수의 서버를 지정해서 조회하지만, 여러 Metric 및 서버를 지정해도 조회 가능하다.
[출력 예]
[{'aggregation': 'AVG', 'dimensions': {'instanceNo': 'Server1 Instance Number'}, 'dps': [[1672185600000, 0.34366158]], 'interval': 'Min1', 'metric': 'avg_cpu_used_rto', 'productName': 'Server(VPC)'},
{'aggregation': 'AVG', 'dimensions': {'instanceNo': 'Server2 Instance Number'}, 'dps': [[1672185600000, 29.135073]], 'interval': 'Min1', 'metric': 'mem_usert', 'productName': 'Server(VPC)'}]
출력을 보면 QueryData는 Timestamp, Metric만 출력되서 확인이 편했지만 QueryDataMultiple의 경우 Timestamp, Metric 외 여러 정보를 확인 할 수 있다.
앞선 서버 목록을 출력하는 예시와 비슷하게 응답데이터 처리가 필요했다.
출력에서 워하는 데이터는 'dps'(Key)에 해당되는 Metric Data정보만(Value) 필요하다.
데이터 구조는 아래와 같이 요약할 수 있다.
[
{
"aggregation":"AVG",
"dimensions":{
"instanceNo":"Server1 Instance Number"
},
"dps":[
[
Timestamp,
Metric
]
],
"interval":"Min1",
"metric":"avg_cpu_used_rto",
"productName":"Server(VPC)"
}
]
살펴보면 전체 데이터는 Python List 자료형으로 구성되어 있으며, Dic 자료형으로 리스팅 되어 있다.
'dps' Key의 첫번 째 Value값의 2번째 데이터가 실제 요청한 avg_cpu_used_rto Metric인걸 알 수 있다.
이는 for문을 통해 쉽게 확인 할 수 있었다.
for avg_cpu_used_rto in real_data:
print(avg_cpu_used_rto['dps'][0][1])
이번 글에서는 QueryDataMultiple API를 사용하여 avg_cpu_used_rto Metric을 조회하는 법을 알아 보았다.
다음 글은 응답 데이터를 별도의 엑셀파일로 저장하는 내용을 작성할 예정이다.
[전체소스코드]
import hashlib
import hmac
import base64
import requests
import time
import json
# unix timestamp 설정
timestamp = int(time.time() * 1000)
timestamp = str(timestamp)
# Ncloud API Key 설정
ncloud_accesskey = "Access Ke"
ncloud_secretkey = "Secert Key"
# 암호화 문자열 생성을 위한 기본값 설정
apicall_method = "POST"
space = " "
new_line = "\n"
# API 서버 정보
api_server = "https://cw.apigw.ntruss.com"
# API URL 서버 목록 조회
api_url = "/cw_fea/real/cw/api/data/query/multiple"
# hmac으로 암호화할 문자열 생성
message = apicall_method + space + api_url + new_line + timestamp + new_line + ncloud_accesskey
message = bytes(message, 'UTF-8')
# hmac_sha256 암호화
ncloud_secretkey = bytes(ncloud_secretkey, 'UTF-8')
signingKey = base64.b64encode(hmac.new(ncloud_secretkey, message, digestmod=hashlib.sha256).digest())
# http 호출 헤더값 설정
http_header = {
#'Content-Type': 'application/json',
'x-ncp-apigw-timestamp': timestamp,
'x-ncp-iam-access-key': ncloud_accesskey,
'x-ncp-apigw-signature-v2': signingKey
}
payload = {
"metricInfoList": [
{
"prodKey": "460438474722512896",
"metric": "avg_cpu_used_rto",
"interval": "Min1",
"aggregation": "avg",
"dimensions": {
"instanceNo": "Server1 Instance Number"
}
},
{
"prodKey": "460438474722512896",
"metric": "mem_usert",
"interval": "Min1",
"aggregation": "avg",
"dimensions": {
"instanceNo": "Server2 Instance Number"
}
},
],
"prodName":"System/Server(VPC)",
"timeEnd": 조회를 원하는 시간의 Timestamp 값,
"timeStart": 조회를 원하는 시간의 Timestamp 값
}
response = requests.post(api_server + api_url, headers=http_header,json=payload)
real_data = json.loads(response.text)
for i in real_data:
#print(i['dps'][0][1])
print(i['dps'][0][1])
안녕하세요. 도움되는 글 감사합니다.
NCP 입문자인데 AWS의 boto3 라이브러리처럼 ncloud에서 python SDK를 사용하려면 위처럼 복잡한 방식으로 밖에 사용할수가 없나요??ㅜ 다른 블로그 글들 검색해봐도 작성자님께서 쓰신 코드처럼 길게 되어있더라구요.