NCP

[NCP] Cloud Insight Metric 짧게 파헤치기

안녕하세요. ManVSCloud 김수현입니다.

오늘은 Cloud Insight Metric에 대해 짧게 이해하는 시간을 가져보도록 하겠습니다.

Metric 종류는 어떤 게 있으며 어떻게 Metric이 수집되고 어떤 방식으로 Cloud Insigh가 사용자에게 성능 지표를 제공하게 되는지 알아보는 시간이 될 것같습니다.


어떻게 Cloud Insight를 통해서 모니터링을 할 수 있게 되는걸까?

네이버 클라우드의 Cloud Insight는 서비스들의 성능 지표를 통합하고, 장애 발생 시 담당자에게 장애 정보를 신속히 전달할 수 있는  모니터링 서비스 입니다.

Cloud Insight는 어떻게 사용자에게 이러한 서비스를 제공할 수 있을까요?

https://guide.ncloud-docs.com/docs/cloudinsight-cloudinsightoverview

Cloud Insight는 네이버 클라우드의 서비스로부터 System Metric, 사용자 어플리케이션으로부터 Custom Metric 각 Metric 정보를 Cloud Insight로 전달합니다.

즉, 해당 Metric 정보가 전달되지 않으면 Cloud Insight 입장에선 감시 대상이나 감시 항목, 조건을 모르니 알림이나 대시보드로 사용할 수 없는 상태인거죠.

또한 System Metric은 Basic Metric과 Extended Metric이 존재합니다.
기본적인 데이터 지표를 제공하는 것이 Basic Metric이며, 서버에서 [상세 모니터링 설정]을 하게되면 Extended Metric를 사용하게 되어 더욱 상세한 데이터 지표를 얻을 수 있게 되는거죠.

요점은 아래 두가지입니다.

  • Cloud Insight는 System Metric, Custom Metric 데이터를 수집한다.
  • 감시 대상, 항목, 조건을 선택할 수 없거나 없는 이유는 수집한 데이터가 없기때문이다.

자 그럼 이제 Metric이 어떻게 수집되는지 알아봅시다.


누가 Cloud Insight에게 Metric을 보냈는가?

Cloud Insight에서는 Server, Load Balancer, Cloud DB for…등 모니터링 할 수 있는 감시 대상들과 항목들이 이미 존재합니다.

난 Metric을 Cloud Insight로 보낸 적이 없다… 그럼 누가 Metric을?!

일반적으로 위와 같은 Metric은 System Metric에 속하는데 이는 생성한 리소스 내에서 Agent를 통해 데이터를 지속적으로 Cloud Insight로 전달하고 있습니다.

가장 쉽게 확인할 수 있는 게 서버인데 ps 명령어로 확인해보면 아래와 같이 agent가 동작하고 있는 것을 알 수 있습니다.

/home1/nbpmon/agent_controller_linux/.venv/bin/python /home1/nbpmon/agent_controller_linux/agent_updater.py 
\_ /home1/nbpmon/agent_controller_linux/install_folders/agent_linux_pub_2044/.venv/bin/python /home1/nbpmon/agent_controller_linux/install_folders/agent_linux_pub_2044/agent.py

정말? 저 python 파일이 Cloud Insight로 데이터를 보내고 있다고?
그렇습니다.

/home1/nbpmon/agent_controller_linux/logs 경로에서 agent.log를 이용해 데이터가 전송되는 것을 확인할 수 있습니다.

cat agent.log | grep “host.id” | awk -F DEBUG: ‘{print $3}’ | tail -n 1 | jq 명령어로 전송되는 Metric을 확인해보았습니다.

{
  "host.id": "-",
  "package": [
    {
      "script.version": "-1",
      "ntp_checked": true,
      "time": 1664115007036,
      "config.version": "-1",
      "data": [
        {
          "snd_pps": 9.116666666666667,
          "clsn_packt_cnt": 0,
          "snd_bps": 167554.13333333333,
          "macaddr": "-",
          "snd_fail_packt_cnt": 0,
          "nic_ip": "-",
          "nic_desc": "eth0",
          "rcv_fail_packt_cnt": 0,
          "rcv_pps": 10.016666666666667,
          "rcv_bps": 9510.266666666666
        },
        {
          "max_snd_pps": 9.116666666666667,
          "avg_clsn_packt_cnt": 0,
          "max_rcv_bps": 9510.266666666666,
          "max_rcv_pps": 10.016666666666667,
          "schema_type": "svr",
          "avg_snd_pps": 9.116666666666667,
          "avg_snd_fail_packt_cnt": 0,
          "avg_rcv_pps": 10.016666666666667,
          "avg_rcv_fail_packt_cnt": 0,
          "avg_rcv_bps": 9510.266666666666,
          "max_snd_bps": 167554.13333333333,
          "avg_snd_bps": 167554.13333333333
        }
      ],
      "script.type": "ntwk"
    },
    {
      "script.version": "-1",
      "ntp_checked": true,
      "time": 1664115007041,
      "config.version": "-1",
      "data": [
        {
          "ind_usert": 0.968808389387145,
          "mnt_stat_cd": 1,
          "free_byt_cnt": 38892.23828125,
          "mnt_nm": "/",
          "used_byt_cnt": 11258.265625,
.
.
.
이하 생략

직접 확인해보실 수도 있겠지만 정말 많은 Metric이 Cloud Insight로 전송된다는 사실을 알 수 있습니다.

이렇게 네이버 클라우드 상품 내에 이미 Agent가 내장되어 이미 Cloud Insight로 Metric이 전송되고 있는 것을 System Metric이라고 합니다.

Custom Metric는 사용자가 정의하고 직접 Cloud Insight로 데이터를 전송해야하는 Metric인 거죠.

Custom Metric을 전송하기 위해서는 Custom Schema를 생성하고 CW_KEY를 얻어야합니다.


어떤 Metric이 전송되는지 알 수 있는 방법이 있을까?

SearchMetricList API를 이용하면 상품별 등록된 Metric을 알 수 있습니다.

먼저 상품 목록별 CW_KEY는 아래 URL에서 알 수 있습니다.

먼저 Server(VPC)의 Metric을 알아봅시다.
민간존 Server(VPC)의 CW_KEY는 “460438474722512896” 입니다.

import sys
import os
import hashlib
import hmac
import base64
import requests
import time
import json

def main():

    timestamp = int(time.time() * 1000)
    timestamp = str(timestamp)

    access_key = os.environ['NCLOUD_ACCESS_KEY']
    secret_key = os.environ['NCLOUD_SECRET_KEY']
    secret_key = bytes(secret_key, 'UTF-8')

    method = "POST"

    api_server = "https://cw.apigw.ntruss.com"
    uri = "/cw_fea/real/cw/api/rule/group/metric/search"

    message = method + " " + uri + "\n" + timestamp + "\n" + access_key
    message = bytes(message, 'UTF-8')
    signingKey = base64.b64encode(hmac.new(secret_key, message, digestmod=hashlib.sha256).digest())


    http_header = {
            'x-ncp-apigw-signature-v2': signingKey,
            'x-ncp-apigw-timestamp': timestamp,
            'x-ncp-iam-access-key': access_key
            }



    payload = {
        "prodKey": "460438474722512896"
    }

    response = requests.post(api_server + uri, headers=http_header, json=payload)
    data = json.loads(response.text)

    print(response.text)

main()

위와 같이 python으로 SearchMetricList를 이용하여 Server(VPC) Metric 리스트를 확인하게되면 사용할 수 있는 Metric이 상당히 많이 존재하는 것을 알 수 있습니다.

[root@manvscloud-dev metric]# python server-search-metric.py | jq
{
  "metrics": [
    {
      "dataType": "FLOAT",
      "desc": "used ratio",
      "dimensions": [
        {
          "dim": "type",
          "val": "cpu"
        },
        {
          "dim": "cpu_idx",
          "val": "0"
        }
      ],
      "idDimension": "instanceNo",
      "metric": "used_rto",
      "options": {
        "Min1": [
          "COUNT",
          "SUM",
          "MAX",
          "MIN",
          "AVG"
        ],
        "Min5": [
          "COUNT",
          "SUM",
          "MAX",
          "MIN",
          "AVG"
        ],
        "Min30": [
          "COUNT",
.
.
.
[root@manvscloud-dev metric]# python server-search-metric.py | jq | grep prodKey | wc -l
144

자, 여기서 질문!

NAS(VPC)는 상품 목록에 CW_KEY도 있는데 Cloud Insight에서 모니터링이 불가능합니다.
왜 그럴까요? 확인해보자구요.
NAS(VPC)의 CW_KEY는 “665289997397659648” 입니다.

import sys
import os
import hashlib
import hmac
import base64
import requests
import time
import json


def main():

    timestamp = int(time.time() * 1000)
    timestamp = str(timestamp)

    access_key = os.environ['NCLOUD_ACCESS_KEY']
    secret_key = os.environ['NCLOUD_SECRET_KEY']
    secret_key = bytes(secret_key, 'UTF-8')

    method = "POST"

    api_server = "https://cw.apigw.ntruss.com"
    uri = "/cw_fea/real/cw/api/rule/group/metric/search"

    message = method + " " + uri + "\n" + timestamp + "\n" + access_key
    message = bytes(message, 'UTF-8')
    signingKey = base64.b64encode(hmac.new(secret_key, message, digestmod=hashlib.sha256).digest())


    http_header = {
            'x-ncp-apigw-signature-v2': signingKey,
            'x-ncp-apigw-timestamp': timestamp,
            'x-ncp-iam-access-key': access_key
            }


    payload = {
        "prodKey": "665289997397659648"
    }

    response = requests.post(api_server + uri, headers=http_header, json=payload)
    data = json.loads(response.text)

    print(response.text)

main()

CW_KEY만 변경해주고 나머지는 동일하게 사용해준 뒤 실행시켜보았습니다.

[root@manvscloud-dev metric]# python nas-search-metric.py 
{"metrics":[],"prodKey":"665289997397659648"}

Metrics이 비어있네요!

결과적으로 NAS(VPC) 상품은 API나 Agent방식으로 Metric Data가 Cloud Insight로 전송되는 부분이 아직 미지원이므로 직접 API를 이용하여 Metric Data를 전송해주어야한다는 결론에 도달하였습니다.

정리해봅시다.

  • 지원하는 System Metric(Basic Metric/Extended Metric) 외에 다른 데이터를 모니터링 하고싶다면 직접 Custom Metric을 Cloud Insight로 전송해야한다.
  • Custom Metric를 Cloud Insight로 전송하려면 Custom Schema를 생성한 후 CW_KEY를 발급 받아야한다.

Personal Comments

Cloud Insight의 Custom Schema와 네이버 클라우드에서 제공하는 Cloud Insight의 각종 API를 잘 사용할 수 있게 된다면 Cloud Insight의 활용도가 상당히 높아집니다.

저 같은 경우 이를 활용하여 비용 대시보드 생성 및 일정 비용 이상이 발생하게되면 모니터링 알림도 받고 있으며 NAS 용량을 모니터링할 뿐만 아니라 Cloud Function과 연동하여 자동으로 NAS 용량을 확장할 수 있도록 설정하여 사용하고 있습니다.

제가 “100% 활용하는 Cloud Insight의 정석”이라는 주제로 강의를 준비하고 있습니다.

해당 강의에서는 Cloud Insight에 대한 이해와 API를 이용한 PLUGIN 활용, Custom Schema를 활용하여 다양한 메트릭을 추가하고 활용하는 방법 등을 모두 알 수 있는 강의입니다.

현재 자료는 모두 완성된 상태이며 소수의 인원을 대상으로 여러번 강의를 진행할 예정입니다.
(언제 진행하게 될지는 아직 미정인 상태입니다.)

긴 글 읽어주셔서 감사합니다.