Cloud Trace、Cloud Monitoring、OpenCensus を使用した Bigtable のトレースと指標のキャプチャ

このチュートリアルでは、OpenCensusTraceCloud Monitoring を使用して、Cloud Bigtable ワークロードのクライアント側トレースと指標の記録を実装する方法について説明します。

Cloud Bigtable は、Trace を使用してサーバー側の指標を表示しますが、アプリにクライアント側トレース、インストゥルメント、アプリ定義の指標を実装することで、さらなる利点を実現できます。たとえば、サーバー側の指標は、Cloud Bigtable エンドポイントに対して行われた呼び出しのラウンドトリップ レイテンシのウィンドウを提供しません。この指標はクライアント側トレースを使用してのみ表示できます。

OpenCensus は、アプリケーションに可観測性を提供できるオープンソース ライブラリです。このライブラリはベンダーに依存せず、Prometheus や Zipkin などの複数のバックエンドと統合されます。このチュートリアルでは、Trace と Monitoring をトレースと指標のバックエンドとして使用します。

このチュートリアルの手順を完了するには、Linux コマンドラインに精通している必要があります。必須ではありませんが、Java プログラミング言語の知識があるとサンプルコードの理解に役立ちます。

目標

  • Cloud Bigtable インスタンスをデプロイする。
  • OpenCensus がインストゥルメント化された Java サンプル クライアントを実行するために Compute Engine 仮想マシン(VM)をデプロイする。
  • インストゥルメント化された Java クライアント アプリケーションをダウンロードしてデプロイし、実行する。
  • Cloud Trace で OpenCensus トレースを表示する。
  • Monitoring の Metrics Explorer で OpenCensus の指標を表示する。

費用

このチュートリアルでは、課金対象である次の Google Cloud コンポーネントを使用します。

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。新しい Google Cloud ユーザーは無料トライアルをご利用いただけます。

始める前に

  1. Google アカウントにログインします。

    Google アカウントをまだお持ちでない場合は、新しいアカウントを登録します。

  2. Cloud Console のプロジェクト セレクタページで、Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタのページに移動

  3. Google Cloud プロジェクトに対して課金が有効になっていることを確認します。プロジェクトに対して課金が有効になっていることを確認する方法を学習する

  4. Compute Engine, Cloud Bigtable, and Cloud Logging API を有効にします。

    API を有効にする

  5. Cloud SDK をインストールして初期化します。

リファレンス アーキテクチャ

説明を簡単にするため、このチュートリアルでは、クライアント側のすべてのロジックを Java コンソール アプリに実装します。データストア層では Cloud Bigtable を使用します。これにより、データベースのデプロイや関連する構成などを気にすることなく、クライアント側のトレースと指標の重要な側面に集中できます。

次のアーキテクチャ図は、Java コンソール アプリとデータストア層を示しています。

Java コンソール アプリとデータストア層を示すリファレンス アーキテクチャ。

Cloud Bigtable インスタンスの作成

このセクションでは、チュートリアルの後半で Java アプリケーションが使用する 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 で、0Auth 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"
    

Java サンプル アプリケーション

このセクションでは、OpenCensus と Logging のトレース機能を確認するため、トランザクションを生成する Java サンプル アプリケーションを使用します。

アプリケーションの流れ

Compute Engine VM で実行される Java サンプルアプリケーションは次の処理を行います。

  1. Cloud Bigtable インスタンスにテーブルを作成します。
  2. 10,000 回のトランザクション セットに対して、次の操作を実行します。
    1. 小数の行を書き込みます。
    2. 単一行を読み取ります。
    3. これらの行に対してテーブル スキャンを実行します。
  3. テーブルを削除します。

サンプル アプリケーションのデプロイ

このセクションでは、インストゥルメント化されたコードを含む Java アプリケーションをダウンロードし、環境を反映するように修正して実行します。

  1. Cloud Console で、[VM インスタンス] ページに移動します。

    [VM インスタンス] ページに移動

  2. [SSH] ボタン(次のスクリーンショットで強調表示されている部分)をクリックして、SSH 経由で VM に接続します。

    SSH で VM に接続します。

  3. VM インスタンスで、Git、Java 8 JDK、Maven をインストールします。

    sudo apt-get install git openjdk-8-jdk maven -y
    
  4. インスタンスで、このチュートリアルのソース リポジトリのクローンを作成します。

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

    これで、プロジェクトに固有の構成設定で Java アプリケーションを更新できます。

  5. Java ソースを含むフォルダに移動します。

    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 インスタンスが Java ランタイムに提供されます。

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 でのトレースの表示

サンプル プログラムは 10,000 回のトランザクション セットを実行します。書き込みを 3 回行い、範囲の読み取りを 1 回行います。エクスポータは、1,000 回のトランザクション セットごとに 1 つのトレース サンプルを記録するように構成されています。その結果、プログラムの実行中に 10 個または 11 個のトレースがキャプチャされます。

プログラムを短時間実行した後、次の操作を行います。

  1. Cloud Console で [トレース] に移動します。

    [トレース] に移動

  2. [トレースリスト] をクリックします。

    右側に、次のようなテーブルが表示されます。

    トレースリスト テーブル。

    トレースのサンプリング レートは、1,000 回のトランザクションごとに 1 つのトレースを記録するように設定されています。

    [タイムライン] のトレースラベル opencensus.Bigtable.Tutorial は、以下のコード スニペッドで定義されているトレース スコープで最も外側にある名前です。

    // sample every 1000 transactions
    configureOpenCensusExporters(Samplers.probabilitySampler(1/1000.0));
  3. opencensus.Bigtable.Tutorial を選択します。ドリルダウン ビューが開き、呼び出しチェーンに関する詳細情報が表示されます。クライアント ライブラリに組み込まれた個別の API 呼び出しのトレース スコープや、オペレーション レベルの呼び出しレイテンシなどの有用な情報も表示されます。

    たとえば、一連の書き込み / 読み取りの各行は、低レベルのユーザー定義の WriteRowsReadRows トレーススパンによってカプセル化されます。

    ReadRows の下に get オペレーションが表示され、その後にテーブル スキャン オペレーションが表示されます。

    オペレーションとテーブル スキャン オペレーションを取得します。

    トレースリストに含まれる他の項目(Operation.google.bigtable.admin.v2.BigtableTableAdmin.CreateTable など)は、手動定義のトレース スコープの範囲外で発生しています。そのため、これらの項目は個別のオペレーションとしてリストに表示されます。

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~5 ミリ秒、5~10 ミリ秒、10~25 ミリ秒間隔で集計され、バケットに保存されます。

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)),

書き込みレイテンシ、読み取りレイテンシ、トランザクション数の 3 つの指標はすべて、レコーダーに対する 1 回の呼び出しで記録されます。

// 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 で [モニタリング] を選択するか、次のボタンを使用します。
    [モニタリング] に移動
  2. [ダッシュボード] をクリックします。
  3. [ダッシュボードを作成] をクリックします。
  4. [ダッシュボード名] フィールドに Cloud Bigtable Metrics と入力します。
  5. [グラフを追加] をクリックします。
  6. [指標] タブが選択されていることを確認します。
  7. [Find resource type and metric] とラベルの付いたボックスをクリックし、opencensus/btappmetrics/write_latency と入力します。
  8. プルダウン メニューで [ヒートマップ] を選択します。分布ヒートマップ グラフが表示されます。
  9. [グラフを保存] をクリックします。
  10. モニタリング対象リソース opencensus/btappmetrics/read_latencyopencensus/btappmetrics/transaction_set_count のダッシュボードにグラフを追加します。
  11. [Dashboards/Cloud Bigtable Metrics] をクリックします。3 つの指標グラフが表示されます。
  12. ズームインするには、期間を選択して、いずれかのグラフをクリックし、ポインタをグラフの端にドラッグします。ヒートマップの場合、色付きのブロックの上にカーソルを置くと、分布に関する詳細を確認できます。

    ヒートマップの分布の詳細。

    Metrics Explorer に、書き込みレイテンシのヒートマップが表示されます。図のように、2,108 個の指標サンプルが 5~10 ミリ秒のバケットに分類されます。

クリーンアップ

  1. Cloud Console で [リソースの管理] ページに移動します。

    [リソースの管理] ページに移動

  2. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
  3. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。

次のステップ