Cloud Trace, Cloud Monitoring, OpenCensus를 사용하여 Cloud Bigtable 추적 및 측정항목 캡처

이 가이드에서는 OpenCensus, Trace, Cloud Monitoring을 사용하여 Cloud Bigtable 워크로드에서 클라이언트 측 추적과 측정항목 기록을 구현하는 방법을 보여줍니다.

Cloud Bigtable은 Trace를 사용하여 여러 가지 유용한 서버 측 측정항목을 표시하긴 하지만 앱이 클라이언트 측 추적, 계측, 앱 정의 측정항목을 구현하면 추가적인 장점을 제공할 수 있습니다. 예를 들어 서버 측 측정항목은 Cloud Bigtable 엔드포인트에 대한 호출의 왕복 지연 시간을 제공하지 않으며 클라이언트 측 추적을 사용해서만 표시할 수 있습니다.

OpenCensus는 앱에 관찰 기능을 제공하는 데 사용할 수 있는 오픈소스 라이브러리입니다. 이 라이브러리는 공급업체에 구애되지 않으며 Prometheus, Zipkin과 같은 여러 백엔드와 통합됩니다. 이 가이드에서는 Trace 및 Monitoring을 추적 및 측정항목의 백엔드로 사용합니다.

이 가이드의 단계를 완료하려면 Linux 명령줄을 잘 알고 있어야 합니다. 필수는 아니지만 자바 프로그래밍 언어를 알면 예시 코드를 이해하는 데 도움이 됩니다.

목표

  • Cloud Bigtable 인스턴스를 배포합니다.
  • OpenCensus로 계측할 샘플 자바 클라이언트를 실행하기 위한 Compute Engine 가상 머신(VM)을 배포합니다.
  • 계측할 자바 클라이언트 앱을 다운로드, 배포, 실행합니다.
  • Cloud Trace에서 OpenCensus trace를 확인합니다.
  • Monitoring의 측정항목 탐색기에서 OpenCensus 측정항목을 확인합니다.

비용

이 가이드에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.

프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요. Google Cloud를 처음 사용하는 사용자는 무료 체험판을 사용할 수 있습니다.

시작하기 전에

  1. Google 계정으로 로그인합니다.

    아직 계정이 없으면 새 계정을 등록하세요.

  2. Google Cloud Console의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택하거나 만듭니다.

    프로젝트 선택기 페이지로 이동

  3. Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다. 프로젝트에 결제가 사용 설정되어 있는지 확인하는 방법을 알아보세요.

  4. Compute Engine, Cloud Bigtable, and Cloud Logging API를 사용 설정합니다.

    API 사용 설정

  5. Cloud SDK 설치 및 초기화

참조 아키텍처

편의를 위해 이 가이드에서는 모든 클라이언트 측 로직을 자바 콘솔 앱에 구현합니다. Datastore 계층의 경우 Cloud Bigtable을 사용하면 데이터베이스 배포와 관련 구성 등을 걱정할 필요 없이 클라이언트 측 추적과 측정항목의 주요 측면에 집중할 수 있습니다.

다음 아키텍처 다이어그램은 자바 콘솔 앱과 Datastore 계층을 보여줍니다.

자바 콘솔 앱과 Datastore 계층을 보여주는 참조 아키텍처

Cloud Bigtable 인스턴스 만들기

이 섹션에서는 가이드 뒷부분에서 자바 앱이 사용하는 Cloud Bigtable 인스턴스를 만듭니다.

  • Cloud Shell에서 Cloud Bigtable 개발 인스턴스를 만듭니다.

    gcloud bigtable instances create cbt-oc \
      --cluster=cbt-oc \
      --cluster-zone=us-central1-c \
      --display-name=cbt-oc \
      --instance-type=DEVELOPMENT
    

이 명령어를 완료하는 데 몇 분이 걸릴 수 있습니다.

Compute Engine VM 만들기 및 구성

  • Cloud Shell에서 OAuth 2.0에 필요한 보안 범위를 사용하여 Compute Engine VM을 만듭니다.

    gcloud compute instances create trace-client \
        --zone=us-central1-c \
        --scopes="https://www.googleapis.com/auth/bigtable.admin.table,\
    https://www.googleapis.com/auth/bigtable.data,\
    https://www.googleapis.com/auth/logging.write,\
    https://www.googleapis.com/auth/monitoring.write,\
    https://www.googleapis.com/auth/trace.append"
    

샘플 자바 앱

이 섹션에서는 OpenCensus 및 Logging의 추적 기능을 설명하기 위해 트랜잭션을 생성하는 샘플 자바 앱을 사용합니다.

앱 흐름

Compute Engine VM에서 실행되는 샘플 자바 앱은 다음을 수행합니다.

  1. Cloud Bigtable 인스턴스에 테이블을 만듭니다.
  2. 일련의 트랜잭션 10,000개로 이루어진 집합에 다음을 수행합니다.
    1. 작은 행 집합을 작성합니다.
    2. 단일 행을 읽습니다.
    3. 해당 행에 대해 테이블 스캔을 수행합니다.
  3. 테이블을 삭제합니다.

샘플 앱 배포

이 섹션에서는 계측된 코드가 포함된 자바 앱을 다운로드하여 환경에 맞게 수정한 다음 실행합니다.

  1. Cloud Console에서 VM 인스턴스 페이지로 이동합니다.

    VM 인스턴스 페이지로 이동

  2. SSH 버튼(아래 스크린샷에 강조표시됨)을 클릭하여 SSH를 통해 VM에 연결합니다.

    SSH를 통해 VM에 연결

  3. VM 인스턴스에서 Git, 자바 8 JDK, Maven을 설치합니다.

    sudo apt-get install git openjdk-8-jdk maven -y
    
  4. 인스턴스에서 이 가이드의 소스 저장소를 클론합니다.

    git clone https://github.com/GoogleCloudPlatform/community.git
    

    이제 자바 앱을 프로젝트와 관련된 구성 설정으로 업데이트할 수 있습니다.

  5. 자바 소스가 포함된 폴더로 이동합니다.

    cd community/tutorials/bigtable-oc/java/
    
  6. cbt-oc Cloud Bigtable 인스턴스를 사용하도록 앱 코드를 구성합니다.

    export INSTANCE_ID=cbt-oc
    
  7. 이제 Maven 명령어를 실행하여 프로그램을 빌드하고 실행합니다.

    mvn package -DskipTests --quiet
    mvn exec:java -Dexec.mainClass=com.example.bigtable.App --quiet
    

    결과는 다음과 유사합니다.

    ...
    2019-05-13 23:31:54 INFO  BigtableSession:89 - Opening connection for projectId your-project, instanceId cbt-oc, on data host bigtable.googleapis.com, admin host bigtableadmin.googleapis.com.
    2019-05-13 23:31:54 INFO  BigtableSession:89 - Bigtable options: {......}
    2019-05-13 23:31:54 INFO  OAuthCredentialsCache:89 - Refreshing the OAuth token
    2019-05-13 23:31:55 INFO  App:170 - Create table Hello-Bigtable
    2019-05-13 23:35:36 INFO  App:209 - Delete the table
    2019-05-13 23:35:36 WARN  BigtableAdmin:116 - Table Hello-Bigtable was disabled in memory only.
    

샘플 앱 코드 하이라이트

아래의 코드 세그먼트에서는 이전에 설정한 INSTANCE_ID 환경 변수를 사용하여 Cloud Bigtable 인스턴스가 자바 런타임에 제공됩니다.

private static final String PROJECT_ID = ServiceOptions.getDefaultProjectId();
private static final String INSTANCE_ID = System.getenv( "INSTANCE_ID");

아래의 코드 세그먼트는 수동으로 라벨이 지정된 추적 범위를 정의하는 방법을 보여줍니다.

try (Scope ss = tracer.spanBuilder("opencensus.Bigtable.Tutorial").startScopedSpan()) {

    // generate unique UUID
    UUID uuid = UUID.randomUUID();
    String randomUUIDString = uuid.toString();

    startWrite = System.currentTimeMillis();
    // write to Bigtable
    writeRows(table, randomUUIDString);
    endWrite = System.currentTimeMillis();

    startRead = System.currentTimeMillis();
    // read from Bigtable
    readRows(table, randomUUIDString);
    endRead = System.currentTimeMillis();

spanBuilder에 대한 호출이 있는 try 블록을 확인하세요. 이 부분은 프로그램이 OpenCensus를 사용하여 추적을 수행하는 방법을 보여줍니다. doBigTableOperations 함수에서 테이블 쓰기와 읽기를 수행하는 호출 체인은 이러한 방식으로 계측됩니다.

또한 이 프로그램은 Cloud Trace를 추적 백엔드로 구성합니다.

private static void configureOpenCensusExporters(Sampler sampler) throws IOException {
    TraceConfig traceConfig = Tracing.getTraceConfig();

    // For demo purposes, lets always sample.

    traceConfig.updateActiveTraceParams(
      traceConfig.getActiveTraceParams().toBuilder().setSampler(sampler).build());

    // Create the Stackdriver trace exporter
    StackdriverTraceExporter.createAndRegister(
      StackdriverTraceConfiguration.builder()
        .setProjectId(PROJECT_ID)
        .build());

    // [Start Stackdriver Monitoring]
    StackdriverStatsExporter.createAndRegister();

Cloud Trace에서 trace 보기

샘플 프로그램은 10,000개의 트랜잭션 집합(세 건의 쓰기와 한 건의 범위 읽기)을 수행합니다. 내보내기는 1,000개의 트랜잭션 집합마다 하나의 trace 샘플을 기록하도록 구성됩니다. 따라서 프로그램 실행 중에 10개 또는 11개의 trace가 캡처됩니다.

프로그램이 잠시 실행된 후에 다음 안내를 따르세요.

  1. Cloud Console에서 Trace로 이동합니다.

    Trace로 이동

  2. Trace 목록을 클릭합니다.

    오른쪽에 다음과 유사한 테이블이 표시됩니다.

    trace 목록 테이블

    trace의 샘플링 비율은 트랜잭션 1,000개마다 하나의 trace를 기록하도록 설정됩니다.

    타임라인의 추적 라벨 opencensus.Bigtable.Tutorial은 다음 코드 스니펫에 정의된 가장 바깥쪽 추적 범위의 이름입니다.

    // sample every 1000 transactions
    configureOpenCensusExporters(Samplers.probabilitySampler(1/1000.0));
  3. opencensus.Bigtable.Tutorial을 선택합니다. 그러면 호출 체인에 대한 자세한 정보와 함께 클라이언트 라이브러리에서 계측된 개별 API 호출의 추적 범위, 작업 수준 호출 지연 시간과 같은 기타 유용한 정보를 표시하는 드릴다운 뷰가 열립니다.

    예를 들어 일련의 쓰기 및 읽기 행은 각각 하위 수준의 사용자 정의 WriteRowsReadRows 추적 스팬으로 캡슐화됩니다.

    ReadRows 아래에 get 작업이 있고 그 다음에 테이블 스캔 작업이 나옵니다.

    Get 작업 및 테이블 스캔 작업

    Operation.google.bigtable.admin.v2.BigtableTableAdmin.CreateTable 같이 trace 목록에 포함된 다른 항목은 수동으로 정의된 추적 범위의 바깥에 있습니다. 따라서 이러한 항목이 목록에 별도의 작업으로 포함됩니다.

Monitoring에서 측정항목 보기

앱 코드는 지연 시간과 트랜잭션 수를 측정하고 기록하는 방법을 보여줍니다.

측정 항목에는 샘플링이 없습니다. 기록된 모든 값은 측정항목 표현에 포함됩니다. 각 측정항목은 수행할 측정의 유형으로 정의됩니다. 이 예시에서 쓰기 지연 시간은 마이크로초 단위로 기록됩니다.

// The write latency in milliseconds
private static final MeasureDouble M_WRITE_LATENCY_MS = MeasureDouble.create("btapp/write_latency", "The latency in milliseconds for write", "ms");

분포는 0~5ms, 5~10ms, 10~25ms 등의 버킷을 사용하여 집계되고 저장됩니다.

Aggregation latencyDistribution = Distribution.create(BucketBoundaries.create(
        Arrays.asList(
            0.0, 5.0, 10.0, 25.0, 100.0, 200.0, 400.0, 800.0, 10000.0)));
View.create(Name.create("btappmetrics/write_latency"),
            "The distribution of the write latencies",
            M_WRITE_LATENCY_MS,
            latencyDistribution,
            Collections.singletonList(KEY_LATENCY)),

세 가지 측정 항목(쓰기 지연 시간, 읽기 지연 시간, 트랜잭션 수)은 모두 레코더에 대한 단일 호출을 사용하여 기록됩니다.

// record read, write latency metrics and count
STATS_RECORDER.newMeasureMap()
              .put(M_READ_LATENCY_MS, endRead - startRead)
              .put(M_WRITE_LATENCY_MS, endWrite - startWrite)
              .put(M_TRANSACTION_SETS, 1)
              .record();

캡처된 측정항목을 검토하려면 다음 안내를 따르세요.

  1. Google Cloud Console에서 Monitoring으로 이동하거나 다음 버튼을 사용합니다.
    Monitoring으로 이동
  2. 대시보드를 클릭합니다.
  3. 대시보드 만들기를 클릭합니다.
  4. 대시보드 이름 필드에 Cloud Bigtable Metrics을 입력합니다.
  5. 차트 추가를 클릭합니다.
  6. 측정항목 탭을 선택했는지 확인합니다.
  7. 리소스 유형 및 측정항목 찾기로 표시된 상자를 클릭하고 opencensus/btappmetrics/write_latency를 입력합니다.
  8. 드롭다운 메뉴에서 히트 맵을 선택합니다. 분포 히트 맵 그래프가 표시됩니다.
  9. 차트 저장을 클릭합니다.
  10. opencensus/btappmetrics/read_latencyopencensus/btappmetrics/transaction_set_count 모니터링 리소스의 대시보드에 차트를 추가합니다.
  11. 대시보드/Cloud Bigtable 측정항목을 클릭합니다. 세 개의 측정항목 차트가 표시됩니다.
  12. 확대하려면 기간을 선택하고 차트 중 하나를 클릭한 다음 그래프의 가장자리로 포인터를 드래그합니다. 히트맵의 경우 다양한 색상 블록 위에 커서를 놓으면 분포에 대한 자세한 내용을 볼 수 있습니다.

    히트맵의 배포 세부정보

    측정항목 탐색기는 쓰기 지연 시간의 히트맵을 보여줍니다. 이미지에 나와 있듯이 2,108개의 측정항목 샘플이 5~10ms 버킷에 해당합니다.

삭제

  1. Cloud Console에서 리소스 관리 페이지로 이동합니다.

    리소스 관리로 이동

  2. 프로젝트 목록에서 삭제할 프로젝트를 선택하고 삭제를 클릭합니다.
  3. 대화상자에서 프로젝트 ID를 입력한 후 종료를 클릭하여 프로젝트를 삭제합니다.

다음 단계