Cloud Functions에 Stackdriver Logging 및 Stackdriver Trace 사용

1. 소개

이 Codelab에서는 Cloud Functions를 사용하는 모든 개발자에게 제공되는 로깅 및 모니터링 도구를 활용하는 방법을 알아봅니다. 이 도구는 지원되는 모든 언어에 배포하는 모든 Cloud 함수와 함께 제공되므로 서버리스 코드를 작성하고 운영할 때 생산성을 높일 수 있습니다.

5815064fec87444b.png

HTTP 트리거 Cloud 함수를 사용하지만 여기서 다루는 모든 내용은 다른 언어 및 다른 이벤트에 의해 트리거된 Cloud Functions에도 적용됩니다.

2. 설정 및 요건

자습형 환경 설정

  1. Cloud Console에 로그인하고 새 프로젝트를 만들거나 기존 프로젝트를 다시 사용합니다. (Gmail 또는 G Suite 계정이 없으면 만들어야 합니다.)

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

모든 Google Cloud 프로젝트에서 고유한 이름인 프로젝트 ID를 기억하세요(위의 이름은 이미 사용되었으므로 사용할 수 없습니다). 이 ID는 나중에 이 Codelab에서 PROJECT_ID라고 부릅니다.

  1. 그런 후 Google Cloud 리소스를 사용할 수 있도록 Cloud Console에서 결제를 사용 설정해야 합니다.

이 Codelab 실행에는 많은 비용이 들지 않습니다. 이 가이드를 마친 후 비용이 결제되지 않도록 리소스 종료 방법을 알려주는 '삭제' 섹션의 안내를 따르세요. Google Cloud 새 사용자에게는 미화 $300 상당의 무료 체험판 프로그램에 참여할 수 있는 자격이 부여됩니다.

Cloud Shell

Cloud Functions와 로깅 및 모니터링 기능을 노트북에서 원격으로 사용할 수 있지만 여기서는 Google Cloud에서 실행되는 명령줄 환경인 Cloud Shell을 사용해 보겠습니다.

이 Debian 기반 가상 머신에는 필요한 모든 개발 도구가 로드되어 있습니다. 영구적인 5GB 홈 디렉터리를 제공하고 Google Cloud에서 실행되므로 네트워크 성능과 인증이 크게 개선됩니다. 즉, 이 Codelab에 필요한 것은 브라우저뿐입니다(Chromebook에서도 작동 가능).

  1. Cloud Console에서 Cloud Shell을 활성화하려면 단순히 Cloud Shell 활성화fEbHefbRynwXpq1vj2wJw6Dr17O0np8l-WOekxAZYlZQIORsWQE_xJl-cNhogjATLn-YxLVz8CgLvIW1Ncc0yXKJsfzJGMYgUeLsVB7zSwz7p6ItNgx4tXqQjag7BfWPcZN5kP-X3Q를 클릭합니다. 환경을 프로비저닝하고 연결하는 데 몇 정도만 소요됩니다.

I5aEsuNurCxHoDFjZRZrKBdarPPKPoKuExYpdagmdaOLKe7eig3DAKJitIKyuOpuwmrMAyZhp5AXpmD_k66cBuc1aUnWlJeSfo_aTKPY9aNMurhfegg1CYaE11jdpSTYNNIYARe01A

Screen Shot 2017-06-14 at 10.13.43 PM.png

Cloud Shell에 연결되면 사용자 인증이 이미 완료되었고 프로젝트가 내 PROJECT_ID에 설정되어 있음을 확인할 수 있습니다.

gcloud auth list

명령어 결과

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
gcloud config list project

명령어 결과

[core]
project = <PROJECT_ID>

어떤 이유로든 프로젝트가 설정되지 않았으면 다음 명령어를 실행하면 됩니다.

gcloud config set project <PROJECT_ID>

PROJECT_ID를 찾고 계신가요? 설정 단계에서 사용한 ID를 확인하거나 Cloud Console 대시보드에서 확인하세요.

R7chO4PKQfLC3bvFBNZJALLTUiCgyLEq_67ECX7ohs_0ZnSjC7GxDNxWrJJUaoM53LnqABYamrBJhCuXF-J9XBzuUgaz7VvaxNrkP2TAn93Drxccyj2-5zz4AxL-G3hzxZ4PsM5HHQ

또한 Cloud Shell은 기본적으로 이후 명령어를 실행할 때 유용할 수 있는 몇 가지 환경 변수를 설정합니다.

echo $GOOGLE_CLOUD_PROJECT

명령어 결과

<PROJECT_ID>
  1. 마지막으로 기본 영역 및 프로젝트 구성을 설정합니다.
gcloud config set compute/zone us-central1-f

다양한 영역을 선택할 수 있습니다. 자세한 내용은 리전 및 영역을 참조하세요.

3. 간단한 Cloud 함수 배포

모니터링할 항목을 만들려면 'Hello, World' Cloud 함수입니다. Google Cloud 콘솔의 왼쪽 메뉴에서 Cloud Functions를 클릭한 다음 함수 만들기를 클릭합니다.

3c13aa20af602aa7.png

'hello-monitor'를 입력합니다. 를 새 Cloud 함수의 이름으로 설정합니다.

fa6816c96d6d5b94.png

소스 코드의 모든 기본값을 유지합니다. 그러나 원하는 경우 다른 언어/런타임을 선택할 수 있습니다.

7aadf164450484e.png

마지막으로 만들기를 클릭합니다.

dc74cd21000d6c91.png

Cloud 함수가 옆에 녹색 체크표시와 함께 표시되어 호출할 준비가 되었음을 나타냅니다.

5363a34eb001d5ed.png

4. Cloud 함수 테스트 및 부하 생성기를 사용하여 트래픽 전송

이제 Cloud 함수가 성공적으로 배포되었으므로 명령줄에서 함수를 테스트합니다.

먼저 Cloud Shell을 사용하여 다음 명령어를 내보냅니다.

$ gcloud functions describe hello-monitor

그러면 Cloud 함수를 호출할 HTTP(S) 엔드포인트인 httpsTrigger의 URL을 포함하여 Cloud 함수에 관한 설명이 반환됩니다. 다음과 같이 표시됩니다. https://<region>-<project-id>.cloudfunctions.net/hello-monitor

이제 해당 URL에서 curl 명령어를 사용하는 것만큼 간단하게 Cloud 함수를 트리거할 수 있습니다.

$ curl https://<region>-<project-id>.cloudfunctions.net/hello-monitor
Hello World!

이제 간단한 HTTP 부하 테스트 도구인 Vegeta를 사용합니다. 설치하려면 Cloud Shell에서 다음 명령어를 입력하기만 하면 됩니다.

$ go get -u github.com/tsenart/vegeta

Cloud 함수로 일부 트래픽 (몇 분 동안 초당 요청 5개)을 전송하려면 다음 명령어를 사용합니다.

$ echo "GET https://<region>-<project-id>.cloudfunctions.net/hello-monitor" \
   | vegeta attack -rate=5 -duration=120s \
   > results.bin

5. 로그 탐색

Cloud 함수 세부정보 뷰에서 로그 보기를 클릭합니다.

b24157fd3376e6a8.png

그러면 프로젝트의 Stackdriver Logging 섹션으로 이동하여 Cloud 함수 로그만 표시됩니다.

5a36fa75d2fb0165.png

Cloud 함수에 대한 모든 요청은 200 상태 코드를 반환해야 합니다.

로그를 볼 때 다음을 수행할 수 있습니다.

  • 로그 수준으로 필터링합니다 (이 경우 모든 로그가 debug 수준임).
  • 특정 기간 (상대적 또는 절대적)을 선택합니다.
  • 로그 스트리밍을 사용 설정합니다 (화면 상단의 재생 751a4600016f34a7.png 사용).
  • 로그 항목 링크를 복사합니다 (팀 구성원과 공유).
  • 리소스 컨텍스트에서 로그 항목을 표시합니다.
  • 로그 항목을 고정합니다 (시각적 신호로).
  • BigQuery, Cloud Storage, Pub/Sub로 로그를 내보내거나 JSON 또는 CSV 파일로 다운로드하세요.

6. 함수 업데이트

Cloud 콘솔을 사용하여 함수 세부정보 뷰로 이동하여 부하 테스터로 만든 초당 호출 수 및 실행 시간 급증을 관찰합니다.

aaee3159bbe395d3.png 7ed347101da5eca0.png

지연 시간과 RPC 호출을 관찰하는 또 다른 상세한 도구는 Stackdriver Trace이지만, 사용하기 전에 Cloud Functions에서 몇 가지 사항을 변경해야 합니다. 다음 단계를 따르세요.

  1. 생명을 구하는 node-emoji 패키지를 종속 항목으로 추가합니다.
  2. 노드 그림 이모티콘 모듈을 사용하고 약간의 지연 시간이 발생하도록 함수 코드를 업데이트합니다.
  3. Cloud Functions용 Stackdriver Trace를 사용 설정하도록 환경 변수를 추가합니다.

함수 세부정보에서 수정을 클릭하여 함수를 수정합니다.

39b0f8f98b18a6c0.png

package.json 파일을 수정하여 node-emoji 패키지의 종속 항목을 추가합니다.

{
  "name": "sample-http",
  "version": "0.0.1",
  "dependencies": {
    "node-emoji": "^1.8.1"
  }
}

index.js의 콘텐츠를 다음과 같이 변경하여 실제 함수를 수정합니다.

const emoji = require('node-emoji');

exports.helloWorld = (req, res) => {
  let message = req.query.message || req.body.message || 'Hello World!';

  // add some latency, functions are too quick!
  setTimeout(function() {
     message += emoji.random().emoji;  
     res.status(200).send(message);
  }, (3 * 100));  // 300ms
  
};

그러면 Cloud 함수가 300밀리초 동안 일시중지한 후 반환된 메시지에 무작위 이모티콘이 추가됩니다.

마지막으로 GOOGLE_CLOUD_TRACE_ENABLED라는 Cloud 함수 환경 변수를 추가하고 다음과 같이 true로 설정합니다.

9205bd277b76aa21.png

저장을 클릭합니다.

Cloud Shell로 돌아가서 새로 배포된 Cloud 함수에 부하를 생성하는 명령어를 다시 불러옵니다.

$ echo "GET https://<region>-<project-id>.cloudfunctions.net/hello-monitor" \
   | vegeta attack -rate=5 -duration=120s \
   > results.bin

이제 다른 설정 요구사항 및 코드에 특정 추적 라이브러리 없이 생성된 트레이스 목록을 관찰할 수 있습니다.

7. 업데이트된 Cloud 함수 추적

왼쪽 메뉴를 사용하여 Stackdriver Trace 아래에 있는 추적 목록으로 이동합니다.

576373f38cad6f8.png

다음 스크린샷과 같이 표시됩니다.

44a36b758b49f88f.png

이를 통해 Cloud 함수에 도입된 지연 시간이 실제로 300밀리초로 측정된다는 것을 알 수 있습니다.

그래프의 각 점은 타임스탬프, HTTP 메서드 및 상태, 라벨, 해당 로그 항목의 링크, Cloud 함수에서 실행하는 모든 후속 RPC 호출과 같은 세부정보를 볼 수 있는 요청입니다.

5815064fec87444b.png

확대하려면 그래프를 클릭하고 드래그하기만 하면 됩니다. 추적 그래프에서 커스텀 기간 선택

축소하려면 페이지 상단에서 확대/축소 실행취소를 클릭합니다.

단일 Cloud 함수를 배포했으므로 그래프에는 hello-monitor URI에 GET 요청만 표시되지만 HTTP 상태 (2XX, 3XX)별로 HTTP 메서드 (GET, POST, DELETE) 또는 요청 필터를 사용하여 trace를 필터링할 수 있습니다.

왼쪽 메뉴에서 개요로 이동합니다.

e920cfca2a50899e.png

이 개요 페이지에서 최근 trace 및 기타 통계를 확인할 수 있습니다.

ef5a45647967d275.png

URI 요청 필터, HTTP 메서드, HTTP 상태, 기간의 조합을 기반으로 커스텀 보고서를 만들 수도 있습니다. 또한 생성된 값을 시간 기준과 비교할 수도 있습니다.

5bd34e9d13b47fb6.png

충분한 데이터 포인트로 올바른 시간 범위를 설정하면 초기 Cloud 함수와 새 Cloud 함수 사이의 중요한 지연 시간 변동을 보여주는 보고서를 생성할 수 있습니다.

2cc0e9a3212b91bb.png

2e7b1ebf2f0a2b4f.png

이러한 커스텀 보고서는 성능 문제가 발생한 시점을 찾고 최종 사용자 요청 지연 시간과 같은 서비스 수준 지표 (SLI)를 추적하는 데 사용할 수 있습니다.

8. 리소스를 삭제할 시간

이것으로 Codelab을 마칩니다.

Cloud Functions 및 Stackdriver 도구는 사용하지 않을 때 비용이 발생하지 않는 서버리스 플랫폼입니다. 하지만 Cloud Functions를 철저하게 사용하고 Cloud 함수를 삭제하는 것이 좋습니다. Cloud Functions개요에서 hello-monitor를 선택하고 삭제를 클릭하기만 하면 됩니다.

aceb633cf70a4a27.png

9. 다음 단계

다음은 후속 읽기 자료입니다.

/