查看应用请求的延迟

了解如何从应用中收集和查看延迟数据:

  1. 使用 Google Cloud CLI 创建 Google Kubernetes Engine (GKE) 集群。

  2. 下载示例应用并将其部署到集群。

  3. 通过向示例应用发送 HTTP 请求来创建跟踪记录。

  4. 查看您创建的跟踪记录的延迟时间信息。

  5. 清理。


如需在 Google Cloud 控制台中直接遵循有关此任务的分步指导,请点击操作演示

操作演示


准备工作

  1. 您的组织定义的安全限制条件可能会导致您无法完成以下步骤。如需了解相关问题排查信息,请参阅在受限的 Google Cloud 环境中开发应用

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

    转到“项目选择器”

  4. 确保您的 Google Cloud 项目已启用结算功能

  5. 启用 Google Kubernetes Engine and Cloud Trace API。

    启用 API

  6. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  7. 确保您的 Google Cloud 项目已启用结算功能

  8. 启用 Google Kubernetes Engine and Cloud Trace API。

    启用 API

创建 GKE 集群

  1. 在工具栏中,点击 激活 Cloud Shell,然后在 Cloud Shell 中执行以下步骤。

  2. 创建集群:

    gcloud container clusters create cloud-trace-demo --zone us-central1-c
    

    上一个命令(需要几分钟才能完成)会在地区 us-central1-c 中创建一个名为 cloud-trace-demo 的标准集群。

  3. kubectl 配置为自动刷新其凭据,以使用与 Google Cloud CLI 相同的身份:

    gcloud container clusters get-credentials cloud-trace-demo --zone us-central1-c
    
  4. 验证对集群的访问权限:

    kubectl get nodes
    

    此命令的示例输出如下:

    NAME                                              STATUS   ROLES    AGE   VERSION
    gke-cloud-trace-demo-default-pool-063c0416-113s   Ready    <none>   78s   v1.22.12-gke.2300
    gke-cloud-trace-demo-default-pool-063c0416-1n27   Ready    <none>   79s   v1.22.12-gke.2300
    gke-cloud-trace-demo-default-pool-063c0416-frkd   Ready    <none>   78s   v1.22.12-gke.2300
    

下载、部署及应用

下载并部署 Python 应用,该应用使用 Flask 框架和 OpenTelemetry 软件包。本页的关于应用部分介绍了该应用。

在 Cloud Shell 中,执行以下操作:

  1. 从 GitHub 克隆 Python 应用:

    git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
    
  2. 运行以下命令以部署示例应用:

    cd python-docs-samples/trace/cloud-trace-demo-app-opentelemetry && ./setup.sh
    

    脚本 setup.sh 需要几分钟才能完成。

    该脚本使用预构建的映像配置三项服务,然后等待所有资源完成预配。工作负载分别名为 cloud-trace-demo-acloud-trace-demo-bcloud-trace-demo-c

    此命令的示例输出如下:

    deployment.apps/cloud-trace-demo-a is created
    service/cloud-trace-demo-a is created
    deployment.apps/cloud-trace-demo-b is created
    service/cloud-trace-demo-b is created
    deployment.apps/cloud-trace-demo-c is created
    service/cloud-trace-demo-c is created
    
    Wait for load balancer initialization complete......
    Completed.
    

创建轨迹数据

“跟踪记录”描述应用完成单个操作所需的时间。trace

如需创建跟踪记录,请在 Cloud Shell 中运行以下命令:

curl $(kubectl get svc -o=jsonpath='{.items[?(@.metadata.name=="cloud-trace-demo-a")].status.loadBalancer.ingress[0].ip}')

上述命令的响应如下所示:

Hello, I am service A
And I am service B
Hello, I am service C

您可以多次执行 curl 命令以生成多条跟踪记录。

查看延迟时间数据

  1. 在 Google Cloud 控制台的导航面板中,选择 Trace,然后选择 Trace Explorer

    转到 Trace Explorer

    每条跟踪记录由图表上的一个点和表中的一行表示。

    以下屏幕截图显示了多条跟踪记录:

    快速入门的 Trace Explorer 窗口。

  2. 如需详细查看跟踪记录,请选择图表中的一个点或表格中的某一行。

    散点图将会刷新,您选择的点会以围绕该点绘制的圆圈突出显示,而代表所有其他轨迹的所有其他点会变暗。

    甘特图显示了所选跟踪记录的相关信息。甘特图中的第一行用于跟踪记录,而跟踪记录中的每个 span 均有一行。span 描述执行一个完整子操作所需的时间。

    有关每个 span 的其他详细信息显示在“详细信息”窗格中。

  3. 如需查看有关某个 span 的详细信息,请在甘特图中选择该 span。

关于应用

本快速入门中使用的示例应用可在 GitHub 代码库中找到。此代码库包含有关如何在除 Cloud Shell 之外的环境中使用应用的信息。示例应用使用 Python 编写,使用 Flask 框架和 OpenTelemetry 软件包,并在 GKE 集群上执行。

插桩

GitHub 代码库中的文件 app.py 包含捕获跟踪记录数据并将其发送到 Google Cloud 项目所需的插桩:

  • 该应用导入了多个 OpenTelemetry 软件包:

    from opentelemetry import trace
    from opentelemetry.exporter.cloud_trace import CloudTraceSpanExporter
    from opentelemetry.instrumentation.flask import FlaskInstrumentor
    from opentelemetry.instrumentation.requests import RequestsInstrumentor
    from opentelemetry.propagate import set_global_textmap
    from opentelemetry.propagators.cloud_trace_propagator import CloudTraceFormatPropagator
    from opentelemetry.sdk.trace import TracerProvider
    from opentelemetry.sdk.trace.export import BatchSpanProcessor
    
  • 该应用使用跟踪上下文对 Web 请求进行插桩,并自动跟踪 Flask 处理程序和对其他服务的请求:

    app = flask.Flask(__name__)
    FlaskInstrumentor().instrument_app(app)
    RequestsInstrumentor().instrument()
  • 应用将 Cloud Trace 导出器配置为跟踪记录提供程序,以 Cloud Trace 格式传播跟踪记录上下文:

    def configure_exporter(exporter):
        """Configures OpenTelemetry context propagation to use Cloud Trace context
    
        Args:
            exporter: exporter instance to be configured in the OpenTelemetry tracer provider
        """
        set_global_textmap(CloudTraceFormatPropagator())
        tracer_provider = TracerProvider()
        tracer_provider.add_span_processor(BatchSpanProcessor(exporter))
        trace.set_tracer_provider(tracer_provider)
    
    configure_exporter(CloudTraceSpanExporter())
    tracer = trace.get_tracer(__name__)
  • 以下代码段展示了如何在 Python 中发送请求。OpenTelemetry 通过传出请求隐式传播跟踪上下文:

    if endpoint is not None and endpoint != "":
        data = {"body": keyword}
        response = requests.get(
            endpoint,
            params=data,
        )
        return keyword + "\n" + response.text
    else:
        return keyword, 200
    
    

应用的工作原理

为简洁起见,在此部分中,在服务名称中省略了 cloud-trace-demo。例如,服务 cloud-trace-demo-c 的引用名称为 c

此应用会创建三项服务,其名分别为 abc。服务 a 配置为调用服务 b,服务 b 配置为调用服务 c。如需详细了解这些服务的配置,请参阅 GitHub 代码库中的 YAML 文件。

在本快速入门中,当您向服务 a 发出了 HTTP 请求后,请使用以下 curl 命令:

curl $(kubectl get svc -o=jsonpath='{.items[?(@.metadata.name=="cloud-trace-demo-a")].status.loadBalancer.ingress[0].ip}')

curl 命令的工作原理如下:

  1. kubectl 会获取名为 cloud-trace-demo-a 的服务的 IP 地址。
  2. 然后,curl 命令会将 HTTP 请求发送到服务 a
  3. 服务 a 会接收 HTTP 请求并向服务 b 发送请求。
  4. 服务 b 会接收 HTTP 请求并向服务 c 发送请求。
  5. c 服务接收来自服务 b 的 HTTP 请求,并将字符串 Hello, I am service C 返回给服务 b
  6. b 服务接收来自服务 c 的响应,将其附加到字符串 And I am service B,并将结果返回给服务 a
  7. a 服务接收来自服务 b 的响应,并将其附加到字符串 Hello, I am service A
  8. 来自服务 a 的响应会输出到 Cloud Shell 中。

清理

为避免因本页中使用的资源导致您的 Google Cloud 账号产生费用,请按照以下步骤操作。

如果您创建了一个新项目,但不再需要该项目,请删除项目

如果您使用了现有项目,请执行以下操作:

  1. 如需删除您的集群,请在 Cloud Shell 中运行以下命令:

    gcloud container clusters delete cloud-trace-demo --zone us-central1-c

后续步骤