快速入门

在本快速入门中,您使用 Cloud Shell 将示例应用部署到 Google Kubernetes Engine (GKE) 集群。应用是使用 Python 编写的。部署后,您使用 curl 发出 HTTP 请求。此操作会捕获跟踪记录并将其发送到您的 Google Cloud 项目。最后,使用 Cloud Trace 界面查看您生成的跟踪记录的延迟时间信息。

准备工作

  1. 登录您的 Google 帐号。

    如果您还没有 Google 帐号,请注册一个新帐号

  2. 在 Cloud Console 的项目选择器页面上,选择或创建 Cloud 项目。

    转到项目选择器页面

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

下载并部署您的应用

如需下载和部署应用,请执行以下操作:

  1. 如需打开 Cloud Shell,请点击 Google Cloud Console 工具栏中的激活 Cloud Shell

    激活 Cloud Shell。

    片刻之后,Google Cloud Console 内会打开一个 Cloud Shell 会话:

    Cloud Shell 会话。

  2. 如需从 GitHub 下载源代码,请运行以下命令:

    git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
    
  3. 如需启用 Google Kubernetes Engine API,请在 Cloud Shell 中发出以下命令:

    gcloud services enable container.googleapis.com
    
  4. 如需创建名为 demo 的 GKE 集群,请在 Cloud Shell 中运行以下命令:

    gcloud container clusters create demo --zone us-west1-b
    

    此命令需要 3 到 5 分钟才能完成。此命令成功完成后,您的 Google Cloud 项目将包含名为 demo 的 GKE 集群。您必须有权在 Google Cloud 项目中创建具有外部访问权限的集群。如果您的 Google Cloud 位于组织或文件夹中,那么即使您是项目所有者,也可能没有这些权限。如果此命令失败,请与您的系统管理员联系。

  5. 如需验证创建是否成功,请执行以下 kubectl 命令:

    kubectl get nodes
    

    此命令的示例输出如下:

    NAME                                  STATUS   ROLES    AGE   VERSION
    gke-demo-default-pool-24680f3d-bzvg   Ready    <none>   26m   v1.14.10-gke.27
    gke-demo-default-pool-24680f3d-hfnq   Ready    <none>   26m   v1.14.10-gke.27
    gke-demo-default-pool-24680f3d-qnh6   Ready    <none>   26m   v1.14.10-gke.27
    
  6. 通过运行以下命令部署示例应用:

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

    脚本 setup.sh 是此项目的一部分,它会配置三种不同的服务,分别标记为 cloud-trace-demo-acloud-trace-demo-bcloud-trace-demo-c。由于设置脚本一次配置一项服务,因此需要几分钟才能完成配置。以下是脚本在执行期间输出到 Cloud Shell 的示例:

     Creating service a
     deployment.apps/cloud-trace-demo-a unchanged
     service/cloud-trace-demo-a unchanged
     Fetching the external IP of service a
     Passing external IP for the first service 34.82.132.95 to the second service template
     deployment.apps/cloud-trace-demo-b created
     service/cloud-trace-demo-b created
     Fetching the external IP of service b
     Passing external IP for the service b 35.230.0.131 to the service c
     deployment.apps/cloud-trace-demo-c created
     service/cloud-trace-demo-c created
     

创建跟踪记录

跟踪记录会描述应用完成单个操作所需的时间。每条跟踪记录由一个或多个 span 组成。Span 会描述执行完整子操作所需的时间。例如,跟踪记录可能会描述处理用户的传入请求并返回响应所需的时间。Span 可能会描述特定 RPC 调用所需的时长。如需了解详情,请参阅 Cloud Trace 的数据模型

如需创建跟踪记录,请执行以下命令:

curl $(kubectl get svc cloud-trace-demo-c -ojsonpath='{.status.loadBalancer.ingress[0].ip}')

curl 命令会生成 HTTP GET 请求并向名为 cloud-trace-demo-c 的服务发出请求。此请求完成后,Helloworld! 会输出到 shell。

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

查看跟踪记录数据

如需在 Google Cloud Console 中打开 Cloud Trace 界面,请点击 导航菜单,然后选择 Trace,或点击以下按钮:

转到 Trace

“概览”窗口

概览窗口是 Trace 中的默认视图。此窗口会显示延迟时间数据和摘要信息,包括分析报告。如果您创建了新项目,则概览窗口中最有用的窗格是带有近期跟踪记录标签的窗格:

“近期跟踪记录”窗格,其中显示了最近的跟踪记录及其延迟时间。

此窗格列出了最近的跟踪记录及其延迟时间。如需查看跟踪记录的详细信息,请点击该跟踪记录的链接。

跟踪记录列表窗口

在 Trace 导航窗格中,点击 跟踪记录列表

帮助您快速入门的跟踪记录列表窗口。

此窗口会显示一个图表和一个表。图表上的每个点都代表一条跟踪记录。每个点还对应于表中的一行。在上面的屏幕截图中,系统列出了多条跟踪记录,表明 curl 命令已执行了多次。

如需查看详细的跟踪记录,请选择图表中的相应点或表中的相应行。此操作会打开两个窗格,其中显示了所选跟踪记录的详细信息:

帮助您快速入门的瀑布视图。

一个窗格会以瀑布图的形式显示跟踪记录,另一个窗格会显示该跟踪记录的详细信息。瀑布图中的每一行都对应一个 span。详情表中显示了该 span 的详细信息,例如其跟踪记录标签、方法以及有关命令延迟时间的摘要信息。如需查看某个 span 的详细信息,请点击瀑布图中的对应行。请注意,span 适用于三个不同的 IP 地址;它们与三项服务的 IP 地址相对应。从此跟踪记录中,您可以看到服务名称 cloud-trace-demo-c 接收的 HTTP 请求会传递到服务 cloud-trace-demo-b,然后传递到服务 cloud-trace-demo-a

详细信息表可能包含指向发送到 Cloud Logging 的数据的链接。如需在 Cloud Logging 界面中查看信息,请点击查看。以下屏幕截图展示了由跟踪记录数据生成的日志示例:

快速入门中的跟踪记录 LogEntry。

请注意,瀑布视图中显示的 IP 地址与名为 cloud-trace-demo-acloud-trace-demo-b 的服务的 IP 地址相对应。

“分析报告”窗口

如需查看或创建报告,请在 Trace 导航窗格中点击 分析报告。Trace 会自动创建每日报告。对于此项目,没有足够的数据来创建新报告。

关于应用

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

该应用作者选择使用 Flask 框架,不仅是因为它可简化应用开发,而且是因为他们希望使用 OpenCensus Flask 中间件。如果您使用的是 Python,则无需改用 Flask 框架。

插桩

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

  • 应用导入语句包含用于 Flask 和多个 OpenCensus 软件包的语句。StackdriverExporter 是将跟踪记录数据发送到您的 Google Cloud 项目的对象:

    from flask import Flask
    from opencensus.ext.flask.flask_middleware import FlaskMiddleware
    from opencensus.ext.stackdriver.trace_exporter import StackdriverExporter
    from opencensus.trace import execution_context
    from opencensus.trace.propagation import google_cloud_format
    from opencensus.trace.samplers import AlwaysOnSampler
  • 该应用会创建一个中间件组件,该组件将 Flask 用作 HTTP 框架:

    propagator = google_cloud_format.GoogleCloudFormatPropagator()
    
    def createMiddleWare(exporter):
        # Configure a flask middleware that listens for each request and applies automatic tracing.
        # This needs to be set up before the application starts.
        middleware = FlaskMiddleware(
            app,
            exporter=exporter,
            propagator=propagator,
            sampler=AlwaysOnSampler())
        return middleware

    在此应用中,字段 sampler 由 OpenCensus 方法 AlwaysOnSampler() 设置。此方法会针对每个采样决策返回 True,并确保跟踪 100% 的请求。不建议在生产环境中对所有请求进行采样。如需了解详情,请参阅采样率

  • 在应用的 main 函数中,构建使用 StackdriverExporter() 的 Flask 中间件:

    createMiddleWare(StackdriverExporter())
  • 该应用还包含另一项不需要的修改。此修改仅作说明之用。在应用中,对路由 / 的响应包含 X-Cloud-Trace-Context 标头:

    trace_context_header = propagator.to_header(execution_context.get_opencensus_tracer().span_context)
    response = requests.get(
        url,
        params=data,
        headers={
          'X-Cloud-Trace-Context' : trace_context_header}
    )

    X-Cloud-Trace-Context 标头是一个 HTTP 标头,其中包含有关当前跟踪记录的信息,包括跟踪记录标识符。要使不同的服务能够为同一跟踪记录添加 span 信息,这些服务必须能识别跟踪记录标识符。默认情况下,OpenCensus 软件包会自动在响应标头中包含此上下文。

应用的工作原理

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

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

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

curl $(kubectl get svc cloud-trace-demo-c -ojsonpath='{.status.loadBalancer.ingress[0].ip}')

curl 命令的工作原理如下:

  1. kubectl 会获取名为 cloud-trace-demo-c 的服务的 IP 地址。
  2. 然后,curl 命令会将 HTTP 请求发送到服务 c
  3. 服务 c 会接收 HTTP 请求并向服务 b 发送请求。
  4. 服务 b 会接收 HTTP 请求并向服务 a 发送请求。
  5. 服务 a 会接收请求并返回字符串 Hello。字符串 Hello 是作为默认参数传递到此服务的关键字。
  6. 服务 b 会接收来自服务 a 的响应,附加字符串 world,然后返回 Helloworld。字符串 world 是作为默认参数传递到此服务的关键字。
  7. 服务 c 会接收来自服务 b 的响应,附加 !,然后返回 Helloworld!
  8. 来自服务 c 的响应会输出到 Cloud Shell 中。

清理

为避免系统因本快速入门中使用的资源向您的 Google Cloud 帐号收取费用,请按照以下步骤操作。

  • 如果您为本快速入门创建了新的 Google Cloud 项目,请删除该项目以免产生费用。如需删除项目,请执行以下操作:

    1. 在 Google Cloud Console 中,点击 导航菜单,然后选择首页
    2. 项目信息窗格中,点击转到项目设置
    3. 设置窗口中,点击关闭,然后完成其余步骤。
  • 如果您没有为本快速入门创建新的 Google Cloud 项目,请通过运行以下命令删除名为 demo 的 Google Kubernetes Engine 集群:

    gcloud container clusters delete demo --zone us-west1-b
    

后续步骤