Stackdriver と OpenCensus を用いた Cloud Bigtable のトレースと指標のキャプチャ

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

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

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

目標

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

費用

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

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを出すことができます。 GCP を初めてご利用の場合は、無料トライアルをご利用いただけます。

始める前に

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

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

  2. GCP プロジェクトを選択または作成します。

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

  3. Google Cloud Platform プロジェクトに対して課金が有効になっていることを確認します。 詳しくは、課金を有効にする方法をご覧ください。

  4. Compute Engine、Cloud Bigtable、Stackdriver 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 と Stackdriver のトレース機能を確認するため、トランザクションを生成する Java サンプル アプリケーションを使用します。

アプリケーションの流れ

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

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

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

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

  1. GCP 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();

    startRead = System.currentTimeMillis();
    // write to Bigtable
    writeRows(table, randomUUIDString);
    endRead = System.currentTimeMillis();

    startWrite = System.currentTimeMillis();
    // read from Bigtable
    readRows(table, randomUUIDString);
    endWrite = System.currentTimeMillis();

spanBuilder を呼び出す try ブロックに注意してください。これは、プログラムが OpenCensus を使用してトレースを実行する方法を示しています。doBigTableOperations 関数でテーブルの書き込みと読み取りを実行する呼び出しチェーンは、この方法でインストゥルメント化されています。

また、プログラムは Stackdriver 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();

Stackdriver Trace UI でのトレースの表示

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

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

  1. Stackdriver の Stackdriver Trace コンソールに移動します。

    Stackdriver Trace コンソール。

  2. [Trace List] をクリックします。

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

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

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

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

    // 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 など)は、手動定義のトレース スコープの範囲外で発生しています。そのため、これらの項目は個別のオペレーションとしてリストに表示されます。

Stackdriver Metrics Explorer UI での指標の表示

このアプリケーション コードは、レイテンシとトランザクション数を測定し、記録する方法を示しています。

指標のサンプリングはありません。記録された値はすべて指標表現に含まれます。各指標は、実行する測定のタイプによって定義されます。この例では、書き込みレイテンシはマイクロ秒単位で記録されます。

// 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. GCP Console で、Metrics Explorer のページに移動します。

    Metrics Explorer に移動

  2. 左側のナビゲーション ペインで、[Dashboards/Create Dashboard] をクリックします。

  3. ダッシュボードのタイトルで、Untitled DashboardCloud Bigtable Metrics に置き換えます。

  4. 左側のナビゲーション ペインで、[Resources/Metrics Explorer] をクリックします。

  5. Metrics Explorer で、[Find resource type and metric] を使用して指標を検索します。opencensus/btappmetrics/write_latency と入力し、[Enter] をクリックします。

  6. 上部のリストから [Heatmap] を選択します。

    分布ヒートマップ グラフが右ペインに表示されます。

  7. [Save Chart] をクリックします。

  8. [Select Dashboard] で、[Cloud Bigtable Metrics] を選択します。

  9. [Save] をクリックします。

  10. 左ペインの [Metric] ラベルの横で、選択した指標の横にある [] をクリックします。

  11. 指標 opencensus/btappmetrics/read_latencyopencensus/btappmetrics/transaction_set_count に対して手順を繰り返します。

  12. 左側のナビゲーション ペインで、[Dashboards/Cloud Bigtable Metrics] を選択します。

    3 つの指標グラフが表示されます。

  13. 時間範囲を選択してズームインし、いずれかのグラフをクリックして、カーソルをグラフの右端にドラッグします。

    ヒートマップの場合、色付きのブロックの上にカーソルを置くと、分布に関する詳細を確認できます。

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

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

クリーンアップ

  1. GCP Console で [プロジェクト] ページに移動します。

    プロジェクト ページに移動

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

次のステップ

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...