AppSync 해석기 로그 샘플링 방법
6276 단어 lambdacloudwatchawsappsync
AppSync에는 CloudWatch 로그와의 로그 통합이 내장되어 있습니다(logging options에 대한 자세한 내용은 여기 참조).
Field resolver log level
을 NONE
, 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 level
과 ALL
사이에서 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
으로 설정ERROR
으로 다시 설정로그 보존 업데이트 잊지 마세요
또 하나 기억해야 할 중요한 것은 로그 그룹의 로그 보존 정책을 업데이트하는 것이다.기본적으로 CloudWatch 로그는 만료되지 않기 때문에 매달 0.03달러/GB를 지불하여 점점 더 많은 로그를 얻을 수 있습니다. 이 로그들은 분당 그다지 유용하지 않습니다.
과거, 현재, 미래의 모든 로그 그룹의 로그 보존을 관리하는 가장 좋은 방법은 this SAR application을 당신이 있는 지역에 배치하여 나머지 작업을 완성하는 것입니다.
이 SAR 응용 프로그램은 배포 기간에 모든 기존 로그 그룹을 업데이트합니다.나중에 새 로그 그룹을 만들 때 보존 정책도 자동으로 업데이트됩니다.
주 AppSync 및 GraphQL
만약 실천 강좌를 통해 GraphQL과 AppSync를 배우고 싶다면 저의 new AppSync course을 보십시오. 그곳에서 AppSync, Lambda, DynamoDB, Cognito와 Vue의 조합으로 트위터 복제를 구축할 것입니다.js.다양한 GraphQL 모델링 기술, 해석기 디버깅 방법, CI/CD, 감시와 경보 등을 배울 것입니다.
Reference
이 문제에 관하여(AppSync 해석기 로그 샘플링 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/aws-heroes/how-to-sample-appsync-resolver-logs-34ml텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)