로그 기반 측정항목 사용

이 페이지에서는 로그를 내보내 가용성 및 지연 시간 SLI를 만드는 기본 사항을 설명합니다. 또한 로그 기반 측정항목을 사용하여 SLO를 정의하는 방법의 구현 예시도 제공합니다.

로그 항목의 데이터 요소를 사용하여 서비스 수준 지표를 만드는 것은 기존 로그 페이로드를 활용할 수 있는 방법입니다. 그렇지 않으면 기존 서비스에 로깅을 추가할 수 있으며 이 방법이 측정항목 계측을 만드는 것보다 쉬울 수 있습니다.

로그 및 측정항목

로그는 컴퓨터 시스템에서 발생하는 특정 이벤트를 설명하는 로그 항목이라는 레코드를 수집합니다. 로그는 코드별, 코드가 실행 중인 플랫폼 서비스별(예: Dataflow)로 플랫폼에서 사용하는 인프라(예: Compute Engine 인스턴스)에 작성됩니다.

최신 시스템의 로그는 디스크에 기록되는 텍스트 파일(경우에 따라)에 포함되므로 로그 항목은 로그 파일의 한 행에 적당하며 로깅의 양자 단위로 간주될 수 있습니다.

로그 항목은 최소한 다음 두 가지로 구성됩니다.

  • 이벤트가 발생한 시점이나 로깅 시스템에 수집된 시점을 나타내는 타임스탬프
  • 구조화되지 않은 텍스트 데이터 또는 구조화된 데이터(JSON이 가장 일반적)인 텍스트 페이로드

로그는 특히 Cloud Logging에서 수집된 경우에 연결된 메타데이터를 전달할 수도 있습니다. 이러한 메타데이터에는 로그를 작성하는 리소스, 로그 이름, 각 항목의 심각도가 포함될 수 있습니다.

로그

로그는 다음 두 가지 주요 용도로 사용됩니다.

  • 이벤트 로그는 시스템 내에서 발생하는 특정 이벤트를 설명합니다. 이벤트 로그를 사용하면 사용자에게 정상적으로 작동한다고 보장하는 메시지를 출력하거나('태스크 성공') 실패할 경우('서버에서 예외 수신') 정보를 제공할 수 있습니다.
  • 트랜잭션 로그는 시스템 또는 구성요소에서 처리되는 모든 트랜잭션의 세부정보를 설명합니다. 예를 들어 부하 분산기는 요청이 성공적으로 완료되었는지에 관계없이 수신된 모든 요청을 로깅하고 요청된 URL, HTTP 응답 코드, 요청을 처리하는 데 사용된 백엔드와 같은 정보 등 추가 정보를 기록합니다.

측정항목

로그와 달리 측정항목은 일반적으로 특정 이벤트를 설명하지 않습니다. 보다 일반적으로는 측정항목은 시간 경과에 따른 시스템 상태를 나타내는 데 사용됩니다. 측정항목은 시스템의 일부 요소를 측정하는 일련의 데이터 포인트로 구성됩니다. 각 데이터 포인트에는 타임스탬프와 숫자 값이 포함됩니다.

측정항목에는 일련의 데이터 포인트와 연결된 메타데이터가 있을 수도 있습니다. 시계열이라고 하는 일련의 데이터 포인트에는 측정항목 이름, 설명과 같은 정보가 포함되며 데이터를 작성하는 리소스를 지정하는 라벨이 포함되는 경우가 있습니다. Monitoring 측정항목 모델에 대한 자세한 내용은 측정항목, 시계열, 리소스를 참조하세요.

로그 기반 측정항목

로그 기반 측정항목은 로그 항목의 정보를 추출하고 시계열 데이터로 변환하여 로그 항목에서 생성된 측정항목입니다. Cloud Logging은 로그 항목에서 두 가지 종류의 측정항목을 만들 수 있는 메커니즘을 제공합니다.

  • 카운터 측정항목: 특정 필터와 일치하는 로그 항목 수를 계산합니다. 예를 들어 카운터 측정항목을 사용하여 로그에 기록된 요청이나 오류 수를 확인할 수 있습니다.

  • 분산 측정항목: 정규 표현식을 사용하여 각 로그 항목의 페이로드를 파싱해 숫자 값을 분포로 추출합니다.

Cloud Logging의 로그 기반 측정항목에 대한 자세한 내용은 로그 기반 측정항목 사용을 참조하세요.

로그 기반 측정항목을 SLI로 사용

로그 기반 측정항목을 사용하면 Monitoring에서 SLI를 빌드하는 데 사용할 수 있는 형태로 로그에서 데이터를 추출할 수 있습니다.

  • 로그 기반 카운터 측정항목을 사용하여 요청 기반 가용성 SLI를 표현할 수 있습니다.

  • 로그 기반 배포 측정항목을 사용하면 요청 기반 지연 시간 SLI를 표현할 수 있습니다.

샘플 로그 항목

Stack Doctor 애플리케이션은 모든 요청, 오류, 서비스에서 발생한 지연 시간에 대한 정보가 포함된 로그 메시지를 내보내도록 계측하는 서비스의 예시입니다. stack-doctor GitHub 저장소에서 서비스 코드를 확인할 수 있습니다.

서비스는 projects/stack-doctor/logs/bunyan_log 로그에 Cloud Logging 로그 항목을 생성합니다. 각 이벤트 유형의 로그 항목에는 서로 다른 message 값이 포함됩니다. 다양한 이벤트 유형의 로그 항목은 다음과 같습니다.

  • 요청마다 다음을 실행합니다.

    {
      "insertId": "..........iTRVT5MOK2VOsVe31bzrTD",
      "jsonPayload": {
        "pid": 81846,
        "time": "Mon Aug 31 2020 20:30:49 GMT-0700 (Pacific Daylight Time)",
        "hostname": "<hostname>",
        "level": 30,
        "message": "request made",
        "v": 0,
        "name": "sli-log"
      },
        "resource": {
        "type": "global",
        "labels": {
          "project_id": "stack-doctor"
        }
      },
      "timestamp": "2020-09-01T03:30:49.263999938Z",
      "severity": "INFO",
      "logName": "projects/stack-doctor/logs/bunyan_log",
      "receiveTimestamp": "2020-09-01T03:30:50.003471183Z"
    }
    
  • 성공적인 요청 시:

    {
      "insertId": "..........qTRVT5MOK2VOsVe31bzrTD",
      "jsonPayload": {
        "name": "sli-log",
        "v": 0,
        "pid": 81846,
        "level": 30,
        "hostname": "<hostname>",
        "time": "Mon Aug 31 2020 20:30:49 GMT-0700 (Pacific Daylight Time)",
        "message": "success!"
      },
      "resource": {
        "type": "global",
        "labels": {
          "project_id": "stack-doctor"
        }
      },
      "timestamp": "2020-09-01T03:30:49.874000072Z",
      "severity": "INFO",
      "logName": "projects/stack-doctor/logs/bunyan_log",
      "receiveTimestamp": "2020-09-01T03:30:50.201547371Z"
    }
    
  • 완료된 요청 시:

    {
      "insertId": "..........mTRVT5MOK2VOsVe31bzrTD",
      "jsonPayload": {
        "time": "Mon Aug 31 2020 20:30:49 GMT-0700 (Pacific Daylight Time)",
        "level": 30,
        "name": "sli-log",
        "message": "slept for 606 ms",
        "hostname": "<hostname>",
        "pid": 81846,
        "v": 0
      },
      "resource": {
        "type": "global",
        "labels": {
          "project_id": "stack-doctor"
        }
      },
      "timestamp": "2020-09-01T03:30:49.874000072Z",
      "severity": "INFO",
      "logName": "projects/stack-doctor/logs/bunyan_log",
      "receiveTimestamp": "2020-09-01T03:30:50.201547371Z"
    }
    
  • 오류 시:

    {
      "insertId": "..........DTRVT5MOK2VOsVe31bzrTD",
      "jsonPayload": {
        "hostname": "<hostname>",
        "level": 50,
        "pid": 81846,
        "message": "failure!",
        "name": "sli-log",
        "time": "Mon Aug 31 2020 20:30:44 GMT-0700 (Pacific Daylight Time)",
        "v": 0
      },
      "resource": {
        "type": "global",
        "labels": {
          "project_id": "stack-doctor"
        }
      },
      "timestamp": "2020-09-01T03:30:44.414999961Z",
      "severity": "ERROR",
      "logName": "projects/stack-doctor/logs/bunyan_log",
      "receiveTimestamp": "2020-09-01T03:30:46.182157077Z"
    }
    

이 항목을 기반으로 모든 요청을 계산하고 오류를 계산하고 요청 지연 시간을 추적하는 로그 기반 측정항목을 만들 수 있습니다. 그런 다음 로그 기반 측정항목을 사용하여 가용성 및 지연 시간 SLI를 만들 수 있습니다.

SLI의 로그 기반 측정항목 만들기

로그 기반 측정항목의 SLI를 만들려면 먼저 로그 기반 측정항목을 만들어야 합니다.

  • 요청과 오류 계산에 대한 가용성 SLI의 경우 로그 기반 카운터 측정항목을 사용합니다.
  • 지연 시간 SLI의 경우 로그 기반 분포 측정항목을 사용합니다.

로그 기반 측정항목을 만든 후 측정항목 탐색기로 검색하여 Monitoring에서 찾을 수 있습니다. Monitoring의 로그 기반 측정항목에는 logging.googleapis.com/user 프리픽스가 있습니다.

가용성 SLI 측정항목

Cloud Monitoring API에서 TimeSeriesRatio 구조를 사용하여 총 요청에 대한 '양호' 또는 '불량' 요청의 비율을 설정해 요청 기반 가용성 SLI를 표현합니다. 이 비율은 RequestBasedSli 구조의 goodTotalRatio 필드에서 사용됩니다.

이 비율을 구성하는 데 사용할 수 있는 로그 기반 카운터 측정항목을 만들어야 합니다. 다음 중에서 최소 두 개 이상을 만들어야 합니다.

  1. 총 이벤트 수를 계산하는 측정항목. 비율의 totalServiceFilter에서 이 측정항목을 사용합니다.

    'stack-doctor' 예시의 경우 'request made' 메시지 문자열이 표시된 로그 항목을 계산하는 로그 기반 측정항목을 만들 수 있습니다.

  2. '불량' 이벤트를 계산하는 측정항목. 비율의 badServiceFilter에서 이 측정항목을 사용합니다.

    'stack-doctor' 예시의 경우 'failure!' 메시지 문자열이 표시된 로그 항목을 계산하는 로그 기반 측정항목을 만들 수 있습니다.

  3. '양호' 이벤트를 계산하는 측정항목. 비율의 goodServiceFilter에서 이 측정항목을 사용합니다.

    'stack-doctor' 예시의 경우 'success!' 메시지 문자열이 표시된 로그 항목을 계산하는 로그 기반 측정항목을 만들 수 있습니다.

이 예시에서 설명하는 SLI는 log_based_total_requests라는 총 요청 측정항목과 log_based_errors라는 오류 측정항목을 기반으로 합니다.

Google Cloud 콘솔, Cloud Logging API 또는 Google Cloud CLI를 사용하여 로그 기반 측정항목을 만들 수 있습니다. Google Cloud 콘솔을 사용하여 로그 기반 카운터 측정항목을 만들려면 다음 절차를 수행하면 됩니다.

  1. Google Cloud 콘솔에서 로그 기반 측정항목 페이지로 이동합니다.

    로그 기반 측정항목으로 이동

    검색창을 사용하여 이 페이지를 찾은 경우 부제목이 Logging인 결과를 선택합니다.

    로그 기반 측정항목 페이지에는 사용자 정의 측정항목 테이블과 시스템 정의 측정항목 테이블이 표시됩니다.

  2. 사용자 정의 측정항목 테이블 위에 있는 측정항목 만들기를 클릭합니다.

  3. 측정항목 유형 창에서 카운터를 선택합니다.

  4. 세부정보 창에서 새 측정항목 이름을 지정합니다. 'stack-doctor' 예시의 경우 log_based_total_requests 또는 log_based_errors를 입력합니다.

    이 예시에서 다른 필드를 무시해도 됩니다.

  5. 필터 선택 패널에 측정항목에서 계산하려는 로그 항목만 검색하는 쿼리를 만듭니다.

    'stack-doctor' 예시의 경우 log_based_total_requests 쿼리에는 다음이 포함될 수 있습니다.

    resource.type="global"
    logName="projects/stack-doctor/logs/bunyan_log"
    jsonPayload.message="request made"
    

    logs_based_errors의 쿼리는 메시지 문자열을 변경합니다.

    resource.type="global"
    logName="projects/stack-doctor/logs/bunyan_log"
    jsonPayload.message="failure!"
    
  6. 미리보기 로그를 클릭하여 필터를 확인하고 필요한 경우 조정합니다.

  7. 이 예시에서는 라벨 창을 무시합니다.

  8. 측정항목 만들기를 클릭하여 절차를 완료합니다.

로그 기반 카운터 측정항목을 만드는 방법에 대한 자세한 내용은 카운터 측정항목 만들기를 참조하세요.

지연 시간 SLI 측정항목

Cloud Monitoring API에서 DistributionCut 구조를 사용하여 요청 기반 지연 시간 SLI를 표현합니다. 이 구조는 RequestBasedSli 구조의 distributionCut 필드에 사용됩니다. 지연 시간 SLI를 만들려면 로그 기반 배포 측정항목을 만들어야 합니다. 이 예시에서는 log_based_latency.라는 로그 기반 배포 측정항목을 만듭니다.

Google Cloud 콘솔, Cloud Logging API 또는 Google Cloud CLI를 사용하여 로그 기반 측정항목을 만들 수 있습니다. Google Cloud 콘솔을 사용하여 로그 기반 배포 측정항목을 만들려면 다음 절차를 수행하면 됩니다.

  1. Google Cloud 콘솔에서 로그 기반 측정항목 페이지로 이동합니다.

    로그 기반 측정항목으로 이동

    검색창을 사용하여 이 페이지를 찾은 경우 부제목이 Logging인 결과를 선택합니다.

    로그 기반 측정항목 페이지에는 사용자 정의 측정항목 테이블과 시스템 정의 측정항목 테이블이 표시됩니다.

  2. 사용자 정의 측정항목 테이블 위에 있는 측정항목 만들기를 클릭합니다.

  3. 측정항목 유형 창에서 분포를 선택합니다.

  4. 세부정보 창에서 새 측정항목 이름을 지정합니다. 'stack-doctor' 예시의 경우 log_based_latency를 입력합니다.

    이 예시에서 다른 필드를 무시해도 됩니다.

  5. 필터 선택 패널에 측정항목에서 계산하려는 로그 항목만 검색하는 쿼리를 만듭니다.

    'stack-doctor' 예시의 경우 log_based_latency 쿼리에는 다음이 포함될 수 있습니다.

    resource.type="global"
    logName="projects/stack-doctor/logs/bunyan_log"
    jsonPayload.message="slept for"
    

    필터 쿼리에 다음 필드를 지정합니다.

    • 필드 이름: json.message
    • 정규 표현식: \s(\d*)\s

      완료된 요청의 메시지 문자열은 'slept for n ms' 형식입니다. 정규 표현식은 문자열에서 지연 시간 값 n을 추출합니다.

  6. 이 예시에서는 라벨 창을 무시합니다.

  7. 측정항목 만들기를 클릭하여 절차를 완료합니다.

로그 기반 분포 측정항목을 만드는 방법에 대한 자세한 내용은 분포 측정항목 만들기를 참조하세요.

가용성 SLI

Cloud Monitoring에서 TimeSeriesRatio 구조를 사용하여 요청 기반 가용성 SLI를 표현합니다. 다음 예시에서는 비율에서 log_based_total_requestslog_based_errors 측정항목을 사용하는 SLO를 보여줍니다. 이 SLO는 24시간 동안 총 요청 대비 '양호' 요청의 비율이 최소 98% 이상 된다고 예상합니다.

{
 "serviceLevelIndicator": {
   "requestBased": {
     "goodTotalRatio": {
       "totalServiceFilter":
         "metric.type=\"logging.googleapis.com/user/log_based_total_requests\"
          resource.type=\"global\"",
       "badServiceFilter":
         "metric.type=\"logging.googleapis.com/user/log_based_errors\"
          resource.type=\"global\""
     }
   }
 },
 "goal": 0.98,
 "rollingPeriod": "86400s",
 "displayName": "Log-Based Availability"
}

지연 시간 SLI

Cloud Monitoring에서 DistributionCut 구조를 사용하여 요청 기반 지연 시간 SLI를 표현합니다. 다음 예시에서는 log_based_latency 측정항목을 사용하고 요청의 98%가 24시간 동안 500ms 미만이라고 예상하는 SLO를 보여줍니다.

{
  "serviceLevelIndicator": {
    "requestBased": {
      "distributionCut": {
        "distributionFilter":
          "metric.type=\"logging.googleapis.com/user/log_based_latency\"
          resource.type=\"global\"",
        "range": {
          "min": 0,
          "max": 500
        }
      }
    }
  },
  "goal": 0.98,
  "rollingPeriod": "86400s",
  "displayName": "98% requests under 500 ms"
}

추가 리소스