❕ 들어가며
제가 다니고 있는 회사에서는 로깅 시스템, APM 시스템으로 NewRelic을 사용하고 있습니다. 이번 글에서는 NewRelic을 조금 더 잘 활용하기 위한 기능인 배포 마커 (Deployment Marker)에 대해 소개합니다.
💡 이 글을 읽게 됨으로써 얻을 수 있는 지식은 아래와 같습니다.
- 배포 마커 (Deployment Marker)가 무엇인지
- 변경 사항 추적 (Change Tracking)이 무엇인지
- 배포 마커나 변경 사항 추적을 사용하면 무엇이 좋은지
- 변경 사항 추적을 사용한 배포 마커 적용 사례
✒️ 배포 마커(Deployment Marker)
배포 마커는 배포 시점에 APM 차트와 대시보드에 마커를 추가해 주는 기능으로, 에러가 나는 경우에 배포의 영향은 아닐지 확인하기 용이합니다. 즉, 배포 마커를 추가함으로써 MTTR을 줄일 수 있고, Observability 도 확보할 수 있습니다. 뉴렐릭에서 제작한 소개 영상이 있으니 더 자세한 정보를 알고 싶다면 영상을 참고해 주세요!
사용방법
배포 마커를 사용하기 위해서는 두 가지 방법이 있는데요.
1. 뉴렐릭 API로 배포 완료 요청 전송
뉴렐릭에서 제공해 주는 배포 완료 요청 API를 사용해 전송하는 방법입니다. 아래 예제와 같이 사용할 수 있습니다.
curl -X POST "https://api.newrelic.com/v2/applications/$APP_ID/deployments.json" \
-H "X-Api-Key:$API_KEY" \
-i \
-H "Content-Type: application/json" \
-d \
'{
"deployment": {
"revision": "REVISION",
"changelog": "Added: /v2/deployments.rb, Removed: None",
"description": "Added a deployments resource to the v2 API",
"user": "datanerd@example.com",
"timestamp": "2019-10-08T00:15:36Z"
}
}'
2. Track Changes
NerdGraph를 사용해 배포 완료 요청을 보내는 방법으로, 뉴렐릭에서는 1번 방법보다는 Track Changes를 사용하는 방법을 권장합니다.
We recommend that you use the change tracking feature instead of the older deployment markers. If you've been using deployment markers feature, you can still use it, but keep in mind that the change tracking feature is available for browser and mobile, as well as APM.
따라서 이번 글에서도 Track Changes 가 무엇이고 어떻게 사용하는지에 대해 조금 더 자세히 알아볼 예정입니다.
📝 변경 사항 기록(Track Changes)
Track Changes에 대해서 처음 들으시는 분들을 위해 간단하게 설명하면, 다양한 변경사항을 뉴렐릭에 기록하는 기능입니다. 따라서 Track Changes를 사용하면 변경에 따라 시스템에 어떤 영향을 미쳤는지 쉽게 추적할 수 있습니다. 예를 들어, 일부 배포를 수행한 경우 Track Changes를 사용하면 뉴렐릭 UI 차트에서 결과를 모니터링할 수 있습니다.
사용방법
NerdGraph(GraphQL)를 사용해 요청을 보낼 수 있습니다. 여기에서 YOUR_NEW_RELIC_USER_KEY
는 뉴렐릭에서 발급받은 API Key를 입력해 주세요.
curl -X POST https://api.newrelic.com/graphql \
-H 'Content-Type: application/json' \
-H 'API-Key: YOUR_NEW_RELIC_USER_KEY' \
-d '{ "query": "{ requestContext { userId apiKey } }" } '
mutation {
changeTrackingCreateDeployment(
deployment: {
version: "0.0.1"
user: "INSERT_YOUR_NAME"
timestamp: INSERT_MS_EPOCH_TIMESTAMP
entityGuid: "INSERT_YOUR_GUID"
description: "create a new marker"
deploymentType: BASIC
deepLink: "example.com/path"
commit: "INSERT_A_COMMIT_HASH"
changelog: "test log"
}
) {
changelog
commit
deepLink
deploymentId
deploymentType
description
entityGuid
groupId
timestamp
user
version
}
}
Track Changes를 사용함으로써 얻을 수 있는 이점으로는 여러 가지가 있습니다.
01. 모든 엔티티에서 시스템의 변경 사항 캡처
APM 서비스에 대한 배포 마커 기능을 넘어 모바일 앱, 인프라 호스트, 워크로드 등의 변경 사항도 추적할 수 있습니다. 필요한 경우에 사용자 대시보드를 직접 구현해도 변경 사항이 보입니다.
02. "무엇이 바뀌었나요?"라는 질문에 빠르게 답하세요.
APM, mobile, browser, service level management, custom dashboards 등 지표를 확인할 수 있는 여러 대시보드에 배포 마커가 생기기 때문에 무엇이 바뀌었는지 한눈에 볼 수 있습니다. “Deployment” 탭에서는 배포 사항의 리스트를 확인할 수 있습니다.
03. 평균 해결 시간(MTTR) 단축
변경 이후 얼마나 많은 오류가 감지되었는지 확인할 수 있고, 변경 이후 어떤 비정상적인 활동이 있다면 그것 또한 알려주기 때문에 UI를 통해 확인할 수 있는 것만으로도 평균 해결 시간을 단축할 수 있습니다. (참고)
04. 배포 및 변경 데이터가 한 곳에 저장됩니다.
모든 변경사항은 뉴렐릭 데이터베이스(NRDB)에 저장됩니다. 즉, NRQL 및 NerdGraph를 사용하여 배포 및 변경 데이터를 쿼리 할 수 있습니다. (참고)
SELECT * FROM Deployment SINCE 30 days ago
05. 팀이 변경 사항의 영향을 더 쉽게 이해할 수 있습니다.
API 필드 목록을 활용하여 팀 간에 빠르고 쉽게 컨텍스트를 공유할 수 있습니다.
예를 들어, 그룹 ID 속성을 사용하여 여러 배포 또는 기타 변경 사항을 서로 연관시키거나 커밋 SHA, 변경 로그 또는 CI/CD 플랫폼에 대한 딥 링크를 추가할 수 있습니다.
06. 컨텍스트를 전환하지 않고 필요한 정보 얻기
뉴렐릭에서 엔티티와 관련된 시스템 부분의 변경 사항을 확인할 수 있습니다.
🔍 적용 사례
저는 코드 파이프라인에서 배포가 끝나면 배포 마커가 추가되게 적용했는데요. 대략적인 흐름을 정리하면 코드 파이프라인에서 배포가 다 끝난 뒤에 1. Invoke 단계에서 람다를 호출합니다. 2. 람다는 시크릿 매니저에서 뉴렐릭 API 키를 가져오고, Track Changes 요청을 보낸 뒤, 응답을 정상적으로 전달받으면 3. 코드 파이프라인에게 성공/실패를 알리고, 코드 파이프라인은 응답을 받은 뒤에 성공/실패됩니다.
아래는 루비로 작성한 람다 코드입니다. 코드 내용이 많아 대략적인 흐름을 파악할 수 있게만 코드 갈무리했습니다.
def lambda_handler(event:, context:)
begin
response = post(headers, body(event))
success(event)
rescue => error
failure(event, error)
end
end
def api_key
# 시크릿 매니저에서 뉴렐릭 API Key 가져오는 코드
end
def headers
{
'API-Key': api_key,
'Content-Type': 'application/json'
}
end
def body(event)
{
'query': "mutation {
changeTrackingCreateDeployment(
deployment: {
version: \"#{job_id}\",
entityGuid: \"#{entity_guid}\",
commit: \"#{commit_hash}\",
description: \"#{github_url}\"
}) {
deploymentId entityGuid commit description
}
}"
}
end
def success(event)
code_pipeline.put_job_success_result(job_id: job_id(event))
end
def failure(event, error)
code_pipeline.put_job_failure_result(job_id: job_id(event), failure_details: {
'message': error.message,
'type': 'JobFailed'
})
end
💛 맺으며
개인적으로 배포 마커의 가장 큰 장점은 뉴렐릭 - AWS 간의 최소한의 컨텍스트 스위칭으로 MTTR을 단축하는 것이라고 생각합니다. 아직까지 잘 쓰고 있는 기능이라 뉴렐릭을 사용하시는 분들에게 도움이 될까 싶어 포스팅으로 남겨둡니다. 공식문서가 너무 잘 되어있지만요 ㅎㅎ
혹시 글을 읽으면서 잘못된 내용이 있으면 댓글로 알려주시면 감사하겠습니다. 읽어주셔서 감사합니다! 😊