AppSync 해석기 로그 샘플링 방법


AppSync에는 CloudWatch 로그와의 로그 통합이 내장되어 있습니다(logging options에 대한 자세한 내용은 여기 참조).
Field resolver log levelNONE, ERROR 또는 ALL으로 설정할 수 있습니다.

필드 분석기 로그 레벨이 NONE 또는 ERROR으로 설정된 경우 AppSync 로그에서 많은 값을 얻을 수 없습니다.예를 들어, 이것은 내가 본 GraphQL 요청입니다.
latency을 볼 수 있지만 지연의 원인을 찾을 수 없습니다.정말이지, 네가 할 수 있는 일은 많지 않아.
하지만 필드 해상도 로그 레벨을 ALL으로 설정하면 모든 내용을 갑자기 볼 수 있습니다!

각 해석기의 요청과 응답 맵, 그리고 각 필드의 해석에 필요한 시간입니다.
이거 대박!
그러나 CloudWatch 로그에 전송되는 정보량을 고려하면 적지 않은 비용 영향을 미칠 수 있다.아래에서 보듯이 CloudWatch 로그는 GB당 0.50달러를 받습니다.이것은 AppSync에 125000개의 조회/변이 요청을 보내는 비용과 맞습니다. 이 작업들은 1GB가 넘는 로그를 생성할 것입니다!

실제로, 당신은 Field resolver log level을 생산 환경의 ALL에 남기고 싶지 않습니다.원가가 너무 높다.
불행하게도 X선과 달리 샘플링 지원이 내장되어 있지 않다.

cron 작업을 통해 샘플링 해상도 로그


한 가지 해결 방법은 Lambda 함수를 사용하여 한 쌍의cron 작업을 통해 Field resolver log levelALL 사이에서 ERROR을 전환하는 것이다.
이것이 바로 내가 최근에 고객 프로젝트에서 한 일이다. 목적은 원가와 나의 응용 프로그램이 무엇을 하고 있는지 이해하는 데 있어서 건강한 균형을 유지하는 것이다.
이를 위해, 나는 두 개의cron 작업(Lambda 사용)을 설정했다.
turnOnResolverLogging:
  handler: functions/toggle-resolver-log-level.handler
  events:
    - schedule: cron(8 * * * ? *)
  environment:
    APPSYNC_API_ID: !GetAtt AppsyncapiGraphQlApi.ApiId
    FIELD_LOG_LEVEL: ALL
  iamRoleStatements:
    - Effect: Allow
      Action: 
        - appsync:GetGraphqlApi
        - appsync:UpdateGraphqlApi
      Resource: !Ref AppsyncapiGraphQlApi
    - Effect: Allow
      Action: iam:PassRole
      Resource: !GetAtt AppSyncLoggingServiceRole.Arn
turnOffResolverLogging:
  handler: functions/toggle-resolver-log-level.handler
  events:
    - schedule: cron(10 * * * ? *)
  environment:
    APPSYNC_API_ID: !GetAtt AppsyncapiGraphQlApi.ApiId
    FIELD_LOG_LEVEL: ERROR
  iamRoleStatements:
    - Effect: Allow
      Action: 
        - appsync:GetGraphqlApi
        - appsync:UpdateGraphqlApi
      Resource: !Ref AppsyncapiGraphQlApi
    - Effect: Allow
      Action: iam:PassRole
      Resource: !GetAtt AppSyncLoggingServiceRole.Arn
이 cron 작업은 시간당 8분과 10분에 실행되며, 시간당 2분의 해상도 로그를 제공합니다.이것은 나에게 조회/변이 작업의 약 3% 를 제공하는 해상도 로그를 제공했다.
함수는 다음과 같습니다.
const AppSync = require('aws-sdk/clients/appsync')
const appSync = new AppSync()
const { APPSYNC_API_ID, FIELD_LOG_LEVEL } = process.env
module.exports.handler = async (event) => {
  const resp = await appSync.getGraphqlApi({
    apiId: APPSYNC_API_ID
  }).promise()
const api = resp.graphqlApi
  api.logConfig.fieldLogLevel = FIELD_LOG_LEVEL
delete api.arn
  delete api.uris
  delete api.tags
await appSync.updateGraphqlApi(api).promise()
}
다른 구성이 실수로 변경되지 않도록 현재 API 구성을 먼저 가져옵니다.그러나 updateGraphqlApi 요청이 arn, uris 또는 tags을 받아들이지 않기 때문에 삭제해야 합니다. 그렇지 않으면 요청이 검증을 통과할 수 없습니다.
근데 잠깐만!만약 dev에 모든 해상도 로그를 보존하고 생산에서만 샘플링을 사용하고 싶다면 어떻게 해야 합니까?
serverless-ifelse 플러그인을 사용하여 dev 단계의 이 두 함수를 조건부로 제거할 수 있습니다. 아래와 같습니다.
serverlessIfElse:
  - If: '"${self:custom.stage}" == "dev"'
    Exclude:
      - functions.turnOnResolverLogging
      - functions.turnOffResolverLogging
위에서 개술한 방법은 매우 간단해서 CloudWatch 원가를 증가하지 않고 충분한 해상도 로그를 제공할 수 있다.단, 샘플링이 몇 시간 내에 더욱 고르게 분포되기를 원한다면, 이러한 대체 방법을 고려하여 몇 분마다 cron 작업을 실행하고 Lambda 함수를 사용할 수 있습니다.
  • 에서 해상도 로그 레벨을 ALL으로 설정
  • 바쁘게 대기, 예를 들어 10초
  • 에서 해상도 로그 레벨을 ERROR으로 다시 설정
  • 이렇게 하면 쿼리/변이 요청이 있는 해상도 로그를 몇 분마다 10초씩 가지고 있습니다. 시간당 2분이 아니라.

    로그 보존 업데이트 잊지 마세요


    또 하나 기억해야 할 중요한 것은 로그 그룹의 로그 보존 정책을 업데이트하는 것이다.기본적으로 CloudWatch 로그는 만료되지 않기 때문에 매달 0.03달러/GB를 지불하여 점점 더 많은 로그를 얻을 수 있습니다. 이 로그들은 분당 그다지 유용하지 않습니다.
    과거, 현재, 미래의 모든 로그 그룹의 로그 보존을 관리하는 가장 좋은 방법은 this SAR application을 당신이 있는 지역에 배치하여 나머지 작업을 완성하는 것입니다.

    이 SAR 응용 프로그램은 배포 기간에 모든 기존 로그 그룹을 업데이트합니다.나중에 새 로그 그룹을 만들 때 보존 정책도 자동으로 업데이트됩니다.

    주 AppSync 및 GraphQL


    만약 실천 강좌를 통해 GraphQL과 AppSync를 배우고 싶다면 저의 new AppSync course을 보십시오. 그곳에서 AppSync, Lambda, DynamoDB, Cognito와 Vue의 조합으로 트위터 복제를 구축할 것입니다.js.다양한 GraphQL 모델링 기술, 해석기 디버깅 방법, CI/CD, 감시와 경보 등을 배울 것입니다.

    좋은 웹페이지 즐겨찾기