Cloud Insight API 사용하여 서버의 평균 CPU 사용량 출력 #2-2

Burst·2022년 12월 28일
0

다수의 Metric 조회하기

지난 글에서는 서버 한대의 평균 CPU 사용량을 조회하는 방법을 알아봤다.
이번 글에서는 한대가 아닌 다수의 서버의 평균 CPU 사용량을 조회하는 내용을 다룰 예정이다.

QueryDataMultiple API

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

payload 데이터

QueryData API 사용과 비슷하다. payload 데이터에 수집을 원하는 metric 정보를 metricInfoList 변수에 리스트 형식으로 저장하면 된다.

  • metricInfoList는 1회 호출에 최대 20개의 Metric을 조회 가능

[예시]

{
    "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])
profile
Cloud Developer

1개의 댓글

comment-user-thumbnail
2023년 12월 11일

안녕하세요. 도움되는 글 감사합니다.
NCP 입문자인데 AWS의 boto3 라이브러리처럼 ncloud에서 python SDK를 사용하려면 위처럼 복잡한 방식으로 밖에 사용할수가 없나요??ㅜ 다른 블로그 글들 검색해봐도 작성자님께서 쓰신 코드처럼 길게 되어있더라구요.

답글 달기