IaaS/퍼블릭클라우드

(AWS) CloudWatch Metric에 대해서

armyost 2022. 3. 12. 07:29
728x90

Amazon CloudWatch는 기본적으로 지표 리포지토리입니다. Amazon EC2와 같은 AWS 서비스는 지표를 리포지토리에 저장하므로 이러한 지표를 기반으로 통계를 검색할 수 있습니다.

Cloudwatch 구성요소

 

네임스페이스

네임스페이스는 CloudWatch 지표의 컨테이너입니다. 다른 네임스페이스의 지표는 서로 격리되어 있으므로 다른 애플리케이션의 지표가 실수로 동일한 통계로 집계되는 일은 없습니다.

 

지표

‘지표’는 CloudWatch의 기본 개념입니다. 지표는 CloudWatch에 게시된 시간 순서별 데이터 요소 집합을 나타냅니다. 지표는 모니터링할 변수로, 데이터 요소는 시간에 따른 변수의 값을 나타내는 것으로 간주합니다. 예를 들어 특정 EC2 인스턴스의 CPU 사용량은 Amazon EC2가 제공하는 하나의 지표입니다. 데이터 요소 그 자체는 데이터를 수집하는 애플리케이션이나 비즈니스 활동에서 나올 수 있습니다.

 

타임스탬프

각 지표 데이터 요소에는 타임스탬프가 연결되어 있어야 합니다. 타임스탬프는 최대 2주 전이고 최대 2시간 빠를 수 있습니다. 타임스탬프를 제공하지 않으면 CloudWatch는 데이터 요소를 수신한 시간에 따라 자동으로 타임스탬프를 생성합니다.

 

 

※ 지표 보존 기간

CloudWatch는 지표 데이터를 다음과 같이 유지합니다.

즉 시간이 가까울수록 자세한 지표를 볼 수 있고, 먼 시간일수록 지표의 상세함이 떨어집니다.

  • 기간이 60초 미만으로 설정된 데이터 요소들은 3시간 동안 사용이 가능합니다. 이러한 데이터 요소는 고분해능 사용자 지정 지표입니다.
  • 기간이 60초(1분)로 설정된 데이터 요소들은 15일 동안 사용이 가능
  • 기간이 300초(5분)로 설정된 데이터 요소들은 63일 동안 사용이 가능
  • 기간이 3600초(1시간)로 설정된 데이터 요소들은 455일(15개월) 동안 사용이 가능

 

측정기준(Dimension)

측정기준은 지표의 자격 증명에 속하는 이름/값 페어입니다. 측정기준은 지표에 대한 고유한 식별자의 일부이므로 지표 중 하나에 이름/값 쌍을 추가할 때마다 해당 지표의 새로운 변형이 생성되는 것입니다.

※ 측정기준 조합(Dimension Combination)

CloudWatch는 지표에 동일한 지표 이름이 있는 경우에도 각각의 고유한 측정기준 조합을 별도의 지표로 처리합니다. 사용자가 게시한 측정기준의 조합만 사용해서 통계를 검색할 수 있습니다. 

 

해결

각 지표는 다음 중 하나입니다.

  • 표준 분해능 - 1분 세분화 데이터
  • 고분해능 - 1초 세분화 데이터

AWS 서비스에 의해 생성되는 지표는 기본적으로 표준 분해능입니다. 사용자 지정 지표를 게시할 때는 지표를 표준 분해능 또는 고분해능으로 정의할 수 있습니다. 고분해능 지표를 게시할 경우 CloudWatch는 이 지표를 1초 분해능으로 저장합니다. 그러면 사용자는 1초, 5초, 10초, 30초 또는 60초의 배수 기간으로 지표를 읽고 검색할 수 있습니다.

 

통계

통계는 지정한 기간에 걸친 지표 데이터 집계입니다. 

 

단위

각각의 통계는 측정 단위를 가지고 있습니다. 단위로는 Bytes, Seconds, Count 및 Percent가 있습니다.

 

기간

‘기간’은 특정 Amazon CloudWatch 통계와 연관된 시간의 길이입니다. 각 통계는 지정한 기간에 대해 수집된 지표 데이터의 집계를 나타냅니다. 기간은 초 단위로 정의되며, 유효한 기간 값은 1, 5, 10, 30 또는 60의 배수입니다. 

 

집계

Amazon CloudWatch는 통계 검색 시 지정한 기간에 따라 통계를 집계합니다. 동일하거나 유사한 타임스탬프를 사용하여 데이터 요소를 원하는 만큼 게시할 수 있습니다. CloudWatch는 지정된 기간에 따라 데이터 요소를 집계합니다. 

 

백분위수

백분위수는 데이터 세트에서 값의 상대적 위치를 나타냅니다. 예를 들어 95 백분위는 데이터의 95%가 이 값보다 아래에 있고 5%가 이 값보다 위에 있다는 것을 의미합니다. 백분위수는 지표 데이터의 분포를 정확하게 이해하는 데 도움이 됩니다.

 

경보

경보를 사용하여 작업을 자동으로 시작할 수 있습니다. 경보는 지정한 기간에 단일 지표를 감시하고 시간에 따른 임계값에 대한 지표 값을 기준으로 지정된 작업을 하나 이상 수행합니다. 

 

인스턴스 기본 모니터링과 세부 모니터링

일반적으로 인스턴스를 생성하게 되면 기본 모니터링으로 인스턴스를 시작하게 되는데, 기본모니터링은 매 5분마다 시스템 메트릭이 생성된다. 그래서 5분간의 포인트를 찍고 그 포인트를 연결해서 그래프를 보여준다.

선으로 표시되지만 실제로 5분 간격의 점을 연결한 것일뿐

 

세부모니터링을 활성화 하게 되면 매분의 지표를 받아 볼 수 있다. 다만 비용이 발생함을 알아두자

 

 

세부모니터링을 설정한 인스턴스 메트릭은 더 상세하다.

 

앞의 두개의 점은 기본 메트릭사용시, 20:55 부터의 그래프는 상세 모니터링 사용시

 

Cloudwatch Custom Metrics에 대해

일반적인 시스템 모니터링은 기본 지표로 충분합니다만 메모리나 각 마운트된 디스크에 대한 사용률을 확인하려고 할 때는 맞춤형 지표(Custom Metric)를 생성해야 합니다.

맞춤형 지표란 모니터링하고자 하는 통계치를 여러분이 선정해서 CloudWatch로 보내 관리하는 지표를 말합니다. 맞춤형 지표를 CloudWatch로 보내는 것은 매우 간단합니다. CLI를 사용해서 여러분이 정의한 통계치를 보낼 수 있습니다.

 

예시 1)

$ aws cloudwatch put-metric-data --metric-name Buffers --namespace MyNameSpace --unit Bytes --value 231434333 --dimensions InstanceId=1-23456789,InstanceType=m1.small

설명

  put-metric-data
--namespace <value>
[--metric-data <value>]
[--metric-name <value>]
[--timestamp <value>]
[--unit <value>]
[--value <value>]
[--dimensions <value>]
[--statistic-values <value>]
[--storage-resolution <value>]
[--cli-input-json <value>]
[--generate-cli-skeleton <value>]

--namespace : 보통 서비스명으로 사용. 지표의 네임스페이스

--metric-name : 해당 메트릭의 이름

--timstamp : 메트릭이 수신된 시간. 밀리세컨드로 표시

--unit : 메트릭을 저장하거나 표시할때 어떤 형태로 사용할 것인지

--value : 이 경우에는 해당 메트릭을 표시(구분)하는 숫자

--dimentions : 데이터를 구분하기 위한 기준. 해당 포스팅 상단 설명 참조

 

중요한것들만 정리하였으니 상세한 내용은 아래 링크 참조

https://docs.aws.amazon.com/cli/latest/reference/cloudwatch/put-metric-data.html

 

put-metric-data — AWS CLI 1.22.72 Command Reference

Note: You are viewing the documentation for an older major version of the AWS CLI (version 1). AWS CLI version 2, the latest major version of AWS CLI, is now stable and recommended for general use. To view this page for the AWS CLI version 2, click here. F

docs.aws.amazon.com

 

예시 2)
또는 단일 데이터에 대한 표시도 추가할 수 있습니다.

신규 또는 기존 지표에서 단일 데이터 요소를 게시하려면 하나의 값과 타임스탬프와 함께 put-metric-data 명령을 사용하면 된다. 예시로 다음 각 작업은 데이터 요소 하나를 게시한다.

$ aws cloudwatch put-metric-data --metric-name PageViewCount --namespace MyService --value 2 --timestamp 2016-10-20T12:00:00.000Z
$ aws cloudwatch put-metric-data --metric-name PageViewCount --namespace MyService --value 4 --timestamp 2016-10-20T12:00:01.000Z
$ aws cloudwatch put-metric-data --metric-name PageViewCount --namespace MyService --value 5 --timestamp 2016-10-20T12:00:02.000Z

새 지표 이름으로 이 명령을 호출하면 CloudWatch가 지표를 생성한다. 그러지 않으면 CloudWatch는 지정된 기존의 지표에 데이터를 연결한다.

 

CloudWatch 로그를 S3 혹은 ElasticSearch에 Export하기

기본적으로 CloudWatch 로그를 Export하게되면 JSON 타입의 데이터로 추출된다. 이를 S3나 ElasticSearch에 전송하여 관리하는것도 좋은 방법이다.

 

S3에 Export

S3에 Export하는 방법은 Console로도 가능하다. 아래의 링크를 참조하길 바란다.

https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/S3ExportTasksConsole.html

 

Export log data to Amazon S3 using the console - Amazon CloudWatch Logs

If the existing bucket already has one or more policies attached to it, add the statements for CloudWatch Logs access to that policy or policies. We recommend that you evaluate the resulting set of permissions to be sure that they're appropriate for the us

docs.aws.amazon.com

 

다만, 당신이 주기적으로 Schedule 형태로 로그를 계속 보내고 싶다면 CLI를 직접사용하거나 LambdaFunction을 사용해야 한다.

 

사용방법

1. S3에 로그를 수집할 버킷 생성

2. [AWS Console]-[Lambda]-[Functions] 에서 "Create Function" 클릭

3. Author from Scratch 선택

4. Runtime Python 3.x 선택

5. Lambda 소스코드를 다음과 같이 작성

import boto3
import os
import datetime


"""
This portion will obtain the Environment variables from AWS Lambda.
"""

GROUP_NAME = os.environ['GROUP_NAME']
DESTINATION_BUCKET = os.environ['DESTINATION_BUCKET']
PREFIX = os.environ['PREFIX']
NDAYS = os.environ['NDAYS']
nDays = int(NDAYS)


"""
This portion will receive the nDays value (the date/day of the log you want
want to export) and calculate the start and end date of logs you want to
export to S3. Today = 0; yesterday = 1; so on and so forth...
Ex: If today is April 13th and NDAYS = 0, April 13th logs will be exported.
Ex: If today is April 13th and NDAYS = 1, April 12th logs will be exported.
Ex: If today is April 13th and NDAYS = 2, April 11th logs will be exported.
"""

currentTime = datetime.datetime.now()
StartDate = currentTime - datetime.timedelta(days=nDays)
EndDate = currentTime - datetime.timedelta(days=nDays - 1)


"""
Convert the from & to Dates to milliseconds
"""

fromDate = int(StartDate.timestamp() * 1000)
toDate = int(EndDate.timestamp() * 1000)


"""
The following will create the subfolders' structure based on year, month, day
Ex: BucketNAME/LogGroupName/Year/Month/Day
"""


BUCKET_PREFIX = os.path.join(PREFIX, StartDate.strftime('%Y{0}%m{0}%d').format(os.path.sep))


"""
Based on the AWS boto3 documentation
https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/logs.html#CloudWatchLogs.Client.create_export_task
"""


def lambda_handler(event, context):
    client = boto3.client('logs')
    client.create_export_task(
         logGroupName=GROUP_NAME,
         fromTime=fromDate,
         to=toDate,
         destination=DESTINATION_BUCKET,
         destinationPrefix=BUCKET_PREFIX
        )

※ 환경변수는 다음과 같다.

  • DESTINATION_BUCKET
  • GROUP_NAME
  • PREFIX
  • NDAYS (review the documentation I left in the python script)

 

6. [AWS Console]-[CloudWatch]-[Rules]에서 "Create Rule" 클릭

7. Rule의 Target으로 방금 만든 Lambda Function인 Cron 생성. 완료.

 

Elastic Search(현재 AWS OpenSearch로 대체)에 Export

 

1. [AWS Console]-[CloudWatch]-[로그그룹] 에서 해당 로그로 접근하여 "구독필터"-"Amazon OpenSearch Service구독필터 생성" 클릭

 

2. 이 계정의 클러스터로 스트리밍할지 아니면 다른 계정의 클러스터로 스트리밍할지 선택합니다.

3. 로그 형식에서 로그 형식을 선택합니다

4. 구독 필터 패턴에 로그 이벤트에서 찾을 용어나 패턴을 입력합니다. 이렇게 하면 OpenSearch 클러스터로 원하는 데이터만 전송할 수 있습니다.

※ 지표 필터를 한 개 이상 생성하여 CloudWatch Logs로 들어오는 로그 데이터를 검색하고 필터링할 수 있습니다.

※ 지표필터는 다음의 구성요소로 이루어져 있습니다.

  • 기본값
    로그를 수집했지만 일치하는 로그를 찾을 수 없는 기간 동안 지표 필터에 보고되는 값입니다. 이 값을 0으로 설정하면 이러한 모든 기간에서 데이터가 보고되어 일치하는 데이터가 없는 기간 때문에 지표가 '불규칙'해지는 것을 방지할 수 있습니다. 1분 동안 로그가 수집되지 않은 경우에는 아무 값도 보고되지 않습니다.
    지표 필터로 생성한 지표에 측정기준을 할당하는 경우 해당 지표에 기본값을 할당할 수 없습니다.
  • Dimensions
    차원은 지표를 추가로 정의하는 키-값 쌍입니다. 지표 필터에서 생성된 지표에 차원을 할당할 수 있습니다. 차원은 지표에 대한 고유한 식별자의 일부이므로 로그에서 고유한 이름/값 쌍을 추출할 때마다 해당 지표의 새로운 변형이 생성되는 것입니다.
  • 필터 패턴
    CloudWatch Logs가 각 로그 이벤트에서 데이터를 해석하는 방법을 심볼로 설명한 것입니다. 예를 들어 로그 항목에는 타임스탬프, IP 주소, 문자열 등이 포함될 수 있습니다. 이러한 패턴을 사용하여 로그 파일에서 검색할 내용을 지정합니다.
  • 지표 이름
    모니터링된 로그 정보가 게시되는 CloudWatch 지표의 이름입니다. 예를 들어 ErrorCount라는 지표에 게시할 수 있습니다.
  • 지표 네임스페이스
    새 CloudWatch 지표에 대한 대상 네임스페이스입니다.
  • 지표 값
    일치하는 로그가 발견될 때마다 지표에 게시하는 숫자 값입니다. 예를 들어, 특정 단어(예: "Error")의 출현 횟수를 계산할 경우 각 출현마다 이 값이 "1"이 됩니다. 전송된 바이트를 계산하는 경우 로그 이벤트에서 발견된 실제 바이트 수만큼 증가시킬 수 있습니다.

5. 테스트할 로그 데이터 선택에서 로그 스트림을 선택한 다음 패턴 테스트를 선택해서 검색 필터가 예상한 결과를 반환하고 있는지 확인합니다.

6. 스트리밍 시작을 선택합니다. 완료.

'IaaS > 퍼블릭클라우드' 카테고리의 다른 글

(AWS) CloudWatch 에서 Apache 로그 수집을 위해 Agent 사용  (0) 2022.03.14
(AWS) CloudWatch Alarm에 대해서  (0) 2022.03.12
(AWS) Kinesis란?  (0) 2022.03.07
(AWS) CloudTrail 이란?  (0) 2022.03.04
(AWS) Opsworks 란?  (0) 2022.03.04