使用 Cloud Trace、Cloud Monitoring 和 OpenCensus 捕获 Bigtable 跟踪和指标

本教程介绍如何使用 OpenCensusTraceCloud MonitoringCloud Bigtable 工作负载中实施客户端跟踪和指标记录。

虽然 Bigtable 使用 Trace 提供多个有用的服务器端指标,但是应用可以通过实现客户端跟踪、插桩和应用定义的指标来获得额外的好处。例如,服务器端指标不提供窗口来显示对 Bigtable 端点进行的调用的往返延时,只能使用客户端跟踪功能提供这些指标。

OpenCensus 是一个开源库,可用于在应用中提供可观察性。该库与供应商无关,并与几个后端(例如 Prometheus 和 Zipkin)相集成。在本教程中,您将使用 Trace 和 Monitoring 作为跟踪和指标的后端。

如需完成本教程中的步骤,您应该熟悉 Linux 命令行。了解 Java 编程语言有助于您理解示例代码,但这并不是必需的。

目标

  • 部署 Bigtable 实例。
  • 部署 Compute Engine 虚拟机以运行 OpenCensus 检测的示例 Java 客户端。
  • 下载、部署并运行经过检测的 Java 客户端应用。
  • 在 Cloud Trace 中查看 OpenCensus 跟踪记录。
  • 在 Monitoring 的 Metrics Explorer 中查看 OpenCensus 指标。

费用

本教程使用 Google Cloud 的以下收费组件:

您可使用价格计算器根据您的预计使用量来估算费用。 Google Cloud 新用户可能有资格申请免费试用

准备工作

  1. 登录您的 Google Cloud 帐号。如果您是 Google Cloud 新手,请创建一个帐号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  2. 在 Google Cloud Console 的项目选择器页面上,选择或创建一个 Google Cloud 项目。

    转到“项目选择器”

  3. 确保您的 Cloud 项目已启用结算功能。 了解如何确认您的项目是否已启用结算功能

  4. 启用 Compute Engine, Bigtable, and Cloud Logging API。

    启用 API

  5. 安装并初始化 Cloud SDK

参考架构

为简单起见,在本教程中,您将在 Java 控制台应用中实现所有客户端逻辑。对于 Datastore 层级,您可以使用 Bigtable,它可以让您专注于客户端跟踪和指标的关键方面,而无需担心数据库部署和相关配置等问题。

以下架构图显示了 Java 控制台应用和数据存储区层级。

显示 Java 控制台应用和数据存储区层级的参考架构。

创建 Bigtable 实例

在本部分中,您将创建 Java 应用稍后在本教程中使用的 Bigtable 实例。

  • 在 Cloud Shell 中,创建一个 Bigtable 开发实例:

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

此命令可能需要几分钟时间才能完成。

创建和配置 Compute Engine 虚拟机

  • 在 Cloud Shell 中,创建一个具有 OAuth 2.0 所需的安全范围的 Compute Engine 虚拟机:

    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 应用

本部分将使用一个示例 Java 应用,用于生成事务以演示 OpenCensus 和 Logging 的跟踪功能。

应用流程

在 Compute Engine 虚拟机上运行的示例 Java 应用将执行以下操作:

  1. 在 Bigtable 实例中创建一个表。
  2. 对于 10000 个事务集的系列,执行以下操作:
    1. 写入少量的若干行数据。
    2. 读取一行数据。
    3. 对这些行执行表扫描。
  3. 删除表。

部署示例应用

在本部分中,您将下载包含插桩代码的 Java 应用,对其进行修改以反映您的环境,然后运行该应用。

  1. 在 Cloud Console 中,转到虚拟机实例页面:

    转到“虚拟机实例”页面

  2. 通过点击 SSH 按钮(在以下屏幕截图中突出显示的按钮)使用 SSH 连接到虚拟机:

    使用 SSH 连接到虚拟机。

  3. 在虚拟机实例中,安装 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 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 将 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 中查看跟踪记录

该示例程序对 10000 个事务集执行以下操作:三次写入和一次范围读取。导出器配置为每 1000 个事务集记录一个跟踪记录示例。因此,在该程序运行期间,系统将捕获 10 条或 11 条跟踪记录。

在该程序运行了一段较短的时间以后,请执行以下操作:

  1. 在 Cloud Console 中,转到 Trace

    转到 Trace。

  2. 点击跟踪列表

    在屏幕右侧,您应该会看到一个类似于以下内容的表格:

    跟踪记录列表。

    跟踪记录的采样率设置为每 1000 个事务记录一条跟踪记录。

    时间轴中的跟踪标签 opencensus.Bigtable.Tutorial 是在以下代码段中定义的最外层跟踪范围的名称。

    // sample every 1000 transactions
    configureOpenCensusExporters(Samplers.probabilitySampler(1/1000.0));
  3. 选择 opencensus.Bigtable.Tutorial。这将打开一个展开细目型视图,其中会显示有关调用链的更多信息以及其他有用信息,例如插桩在客户端库中的离散 API 调用的跟踪范围和操作级调用延时。

    例如,每个读写行系列都由用户定义的较低级别 WriteRowsReadRows 跟踪 span 进行封装。

    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 ms、5-10 ms、10-25 ms,依此类推。

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. 点击查找资源类型和指标 (Find resource type and metric) 对应的框,然后输入 opencensus/btappmetrics/write_latency
  8. 在下拉菜单中,选择热图。此时会显示分布热图
  9. 点击保存图表 (Save Chart)。
  10. 将以下受监控的资源的图表添加到您的信息中心:opencensus/btappmetrics/read_latencyopencensus/btappmetrics/transaction_set_count
  11. 点击信息中心/Cloud Bigtable 指标 (Cloud Bigtable Metrics)。此时会显示这三个指标的图表。
  12. 如需放大图表,请选择一个时间范围,点击其中一个图表,然后将指针拖动到图表的边缘。对于热图,您可以通过将光标放在各个彩色块上来查看有关分布的更多详细信息。

    热图的分布详细信息。

    Metrics Explorer 显示了写入延时的热图。如图所示,2108 个指标样本分布在 5-10 ms 时间段中。

清理

  1. 在 Cloud Console 中,转到管理资源页面。

    转到“管理资源”

  2. 在项目列表中,选择要删除的项目,然后点击删除
  3. 在对话框中输入项目 ID,然后点击关闭以删除项目。

后续步骤