Cloud Functions 로깅 및 추적 Codelab

이 Codelab의 목표는 모든 Cloud 함수 개발자에게 제공되는 로깅 및 모니터링 도구를 활용하는 방법을 이해하는 것입니다. 이러한 도구는 지원되는 모든 언어로 배포하는 모든 Cloud 함수와 함께 제공되므로 서버리스 코드를 작성하고 운영하는 경우 생산성이 향상됩니다.

여기서는 HTTP 트리거 함수를 사용하지만, 여기서 다루는 모든 내용은 다른 언어 (저장소 버킷, Pub/Sub 등)에 의해 트리거되는 함수에도 적용됩니다.

자습형 환경 설정

Google 계정 (Gmail 또는 Google 앱)이 아직 없다면 계정을 만들어야 합니다. Google Cloud Platform Console(console.cloud.google.com)에 로그인하여 새 프로젝트를 만듭니다.

2016-02-10 12:45:26.png 스크린샷

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

다음으로 Google Cloud 리소스를 사용하려면 Cloud Console에서 결제를 사용 설정해야 합니다.

이 codelab을 실행하는 과정에는 많은 비용이 들지 않지만 더 많은 리소스를 사용하려고 하거나 실행 중일 경우 비용이 더 들 수 있습니다(이 문서 마지막의 '삭제' 섹션 참조).

Google Cloud Platform의 신규 사용자는 $300 무료 체험판을 사용할 수 있습니다.

Google Cloud Shell

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

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

Google Cloud Shell을 활성화하려면 개발자 콘솔에서 오른쪽 상단의 버튼을 클릭하면 됩니다. 환경을 프로비저닝하고 연결하는 데는 몇 분 정도만 소요됩니다.

activateCloudShell.png

'Cloud Shell 시작' 버튼을 클릭합니다.

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>

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

echo $GOOGLE_CLOUD_PROJECT

명령어 결과

<PROJECT_ID>

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

gcloud config set project <PROJECT_ID>

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

프로젝트 ID

중요: 마지막으로 기본 영역 및 프로젝트 구성을 설정합니다.

gcloud config set compute/zone us-central1-f

다양한 영역을 선택할 수 있습니다. 리전 및 영역 영역 문서에서 자세히 알아보세요.

모니터링할 항목을 만들기 위해 Hello World Cloud 함수를 만듭니다. 콘솔의 왼쪽 메뉴에서 Cloud Functions를 클릭한 다음 Create function를 클릭합니다.

새 함수의 이름을 다음과 같이 지정합니다.hello-monitor"

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

마지막으로 'Create' 버튼을 사용하여 함수를 만듭니다.

잠시 후(호출이 준비됨으로 나열됨(초록색 체크표시로 표시됨)가 표시됩니다.

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

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

$ gcloud functions describe hello-monitor

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

이제 이 URL을 curl'로 실행하기만 하면 함수를 트리거할 수 있습니다.

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

이제 간단한 HTTP 부하 테스트 도구인 Vegeta를 사용합니다. Cloud Shell을 설치하려면 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

함수 세부정보 보기에서 오른쪽 상단의 '로그 보기'를 클릭합니다.

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

함수에 대한 모든 요청이 200 상태 코드를 반환하기를 바랍니다.

이 로그 뷰어를 사용하여 다음을 할 수 있습니다.

  • 로그 수준별 필터링 (이 경우 모든 로그는 Debug 수준임)
  • 특정 기간을 선택합니다 (상대적 또는 절대적).
  • 화면 상단에 있는 로그 스트리밍 사용 설정(\"quot;play" 버튼)
  • 로그 항목에 링크 복사하기 (팀원과 공유)
  • 리소스 컨텍스트의 로그 항목 표시
  • 로그 항목 고정 (시각적 신호)
  • BigQuery, Cloud Storage 또는 Cloud Pub/Sub로 로그 내보내기 (또는 JSON 또는 CSV 형식으로 다운로드)

왼쪽 상단 선택기를 함수별로 로그를 필터링할 수도 있습니다. 창 상단의 검색창에서 라벨 또는 전체 텍스트 검색을 검색할 수도 있습니다. 여기서 라벨은 hello-monitor (함수 이름)와 각 요청의 실행 식별자입니다.

필터를 복사하여 공유할 수도 있습니다 (검색창의 드롭다운 메뉴 확인).

Console을 사용하여 '함수 세부정보' 뷰로 이동하고 초당 호출 수 및 실행 시간 측면에서 로드 테스터를 통해 생성된 급증을 확인합니다.

지연 시간과 RPC 호출을 관측하는 또 다른 자세한 도구는 Stackdriver Trace 기능입니다. 하지만 이 기능을 사용하려면 먼저 몇 가지 함수를 변경해야 합니다.

  1. 생명을 보호하는 node-emoji 패키지를 종속 항목으로 추가
  2. node-emoji 모듈을 사용하도록 함수 코드를 업데이트하고 지연 시간 도입
  3. Cloud Functions에 Stackdriver Trace를 사용 설정하려면 환경 변수를 추가합니다.

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

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
  
};

300밀리초 동안 일시중지되면 함수가 반환한 메시지에 임의의 그림 이모티콘이 추가됩니다.

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

'저장'을 클릭하는 것을 잊지 마세요.

이제 Cloud Shell로 돌아가서 명령어를 다시 실행하여 새로 배포된 함수에 일부 부하를 생성합니다.

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

이제 다른 설정 요구사항 없이 코드에 생성된 추적 목록을 관찰할 수 있습니다.

왼쪽 메뉴를 사용하여 Stackdriver Trace 아래의 Trace 목록으로 이동합니다.

이 화면 캡처와 비슷한 화면이 표시됩니다.

이렇게 하면 함수에 도입된 지연 시간이 실제로 300ms에 측정된다는 것을 분명히 알 수 있습니다.

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

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

축소하려면 페이지 상단에 있는 '확대/축소 실행취소' 버튼을 클릭합니다.

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

왼쪽 메뉴에서 Trace "섹션으로 이동합니다.

이 개요 페이지에서 최근 trace와 기타 유용한 정보를 확인할 수 있습니다.

URI 요청 필터, HTTP 메서드, HTTP 상태, 시간 범위의 조합을 바탕으로 맞춤 보고서를 만드는 기능도 제공됩니다. 생성된 값을 시간 기준과 비교할 수도 있습니다.

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

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

이것으로 새로운 Cloud 함수 배포, 로그 탐색, 요청 trace 관찰에 관한 Codelab을 마칩니다.

Cloud Functions 및 Stackdriver 도구는 사용하지 않는 경우 비용이 발생하지 않는 서버리스 플랫폼이지만, 우수한 클라우드 시민이 되려면 기능을 삭제해야 합니다.

Cloud Functions 개요 페이지에서 hello-monitor 함수를 선택하고 "삭제"를 클릭하면 됩니다.

Cloud Functions 로깅 및 trace를 사용한 이 간단한 시작 Codelab이 완료되었습니다.

다음은 관련 뉴스입니다.

/