

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用 Envoy 指标监控您的应用程序
<a name="envoy-metrics"></a>

**重要**  
终止支持通知：2026 年 9 月 30 日， AWS 将停止对的支持。 AWS App Mesh 2026 年 9 月 30 日之后，您将无法再访问 AWS App Mesh 控制台或 AWS App Mesh 资源。有关更多信息，请访问此博客文章[从迁移 AWS App Mesh 到 Amazon ECS Service Connect](https://aws.amazon.com/blogs/containers/migrating-from-aws-app-mesh-to-amazon-ecs-service-connect)。

Envoy 将其指标分为以下主要类别：
+ **下游**—与进入代理的连接和请求相关的指标。
+ **上游**—与传出连接和代理发出的请求相关的指标。
+ **服务器**—描述 Envoy 内部状态的指标。其中包括诸如正常运行时间或分配内存之类的指标。

在 App Mesh 中，代理会拦截上游和下游流量。例如，Envoy 将从您的客户端收到的请求以及您的服务容器发出的请求归类为下游流量。为了区分这些不同类型的上游和下游流量，App Mesh 根据与您的服务相关的流量方向进一步对 Envoy 指标进行了分类：
+ **入口**—与流向您的服务容器的连接和请求相关的指标和资源。
+ **出口**—与来自您的服务容器并最终流出您的 Amazon ECS 任务或 Kubernetes 容器组 (pod) 的连接和请求相关的指标和资源。

下图显示了代理和服务容器之间的通信。

![](http://docs.aws.amazon.com/zh_cn/app-mesh/latest/userguide/images/task-proxy-container.png)


**资源命名约定**

了解 Envoy 如何查看您的网格以及其资源如何映射回您在 App Mesh 中定义的资源非常有用。以下是 App Mesh 配置的主要 Envoy 资源：
+ **侦听器**—代理侦听下游连接的地址和端口。在上图中，App Mesh 为进入您的 Amazon ECS 任务或 Kubernetes 容器组 (pod) 的流量创建了一个入口侦听器，并为离开服务容器的流量创建了一个出口侦听器。
+ **集群**—代理连接和路由流量到的上游端点的命名组。在 App Mesh 中，您的服务容器以及您的服务可以连接到的所有其他虚拟节点都表示为集群。
+ **路径**—这些路径对应于您在网格中定义的路径。它们包含代理匹配请求所依据的条件以及请求发送到的目标集群。
+ **端点和集群负载分配**—上游集群的 IP 地址。 AWS Cloud Map 当使用虚拟节点的服务发现机制时，App Mesh 会将发现的服务实例作为端点资源发送到您的代理。
+ **密钥**—这些密钥包括但不限于您的加密密钥和 TLS 证书。当 AWS Certificate Manager 用作客户端和服务器证书的来源时，App Mesh 会将公共和私有证书作为秘密资源发送到您的代理。

App Mesh 使用一致的方案来命名 Envoy 资源，您可以使用这些资源与网格相关联。

了解侦听器和集群的命名方案对于理解 Envoy 在 App Mesh 中的指标非常重要。

**侦听器名称**

使用以下格式命名侦听器：

```
lds_{{<traffic direction>}}_{{<listener IP address>}}_{{<listening port>}}
```

您通常会看到在 Envoy 中配置了以下侦听器：
+ `lds_ingress_0.0.0.0_15000`
+ `lds_egress_0.0.0.0_15001`

使用 Kubernetes CNI 插件或 IP 表规则，Amazon ECS 任务或 Kubernetes 容器组 (pod) 中的流量将定向到端口 `15000` 和 `15001`。App Mesh 将 Envoy 配置为这两个侦听器，以接受入口（传入）和出口（传出）流量。如果您的虚拟节点上没有配置侦听器，则不应看到入口侦听器。

**集群名称**

大多数集群使用以下格式：

```
cds_{{<traffic direction>}}_{{<mesh name>}}_{{<virtual node name>}}_{{<protocol>}}_{{<port>}}
```

您的服务与每个虚拟节点通信的虚拟节点都有自己的集群。如前所述，App Mesh 为在 Envoy 旁边运行的服务创建一个集群，以便代理可以向其发送入口流量。

例如，如果您有一个名为 `my-virtual-node` 的虚拟节点，用于侦听端口 `8080` 上的 http 流量，并且该虚拟节点位于名为 `my-mesh`的网格中，则 App Mesh 会创建一个名为 `cds_ingress_my-mesh_my-virtual-node_http_8080` 的集群。该集群充当进入 `my-virtual-node` 服务容器的流量的目的地。

App Mesh 还可以创建以下类型的额外特殊集群。这些其他集群不一定对应于您在网格中明确定义的资源。
+ 用于访问其他 AWS 服务的集群。默认情况下，这种类型允许您的网格访问大多数 AWS 服务:`cds_egress_{{<mesh name>}}_amazonaws`.
+ 用于为虚拟网关执行路由的集群。但一般可以安全地忽略此错误：
  + 对于单个侦听器：`cds_ingress_{{<mesh name>}}_{{<virtual gateway name>}}_self_redirect_{{<protocol>}}_{{<port>}}`
  + 对于多个侦听器：`cds_ingress_{{<mesh name>}}_{{<virtual gateway name>}}_self_redirect_{{<ingress_listener_port>}}_{{<protocol>}}_{{<port>}}`
+ 当您使用 Envoy 密钥发现服务检索密钥时，您可以为其定义端点的集群，例如 TLS：`static_cluster_sds_unix_socket`。

## 应用程序指标示例
<a name="envoy-metrics-examples"></a>

为了说明 Envoy 中可用的指标，以下示例应用程序包含三个虚拟节点。可以忽略网格中的虚拟服务、虚拟路由器和路由，因为它们不会反映在 Envoy 的指标中。在此示例中，所有服务都在端口 8080 上侦听 http 流量。

![](http://docs.aws.amazon.com/zh_cn/app-mesh/latest/userguide/images/envoy-metric-example1.png)


我们建议将环境变量 `ENABLE_ENVOY_STATS_TAGS=1` 添加到网格中运行的 Envoy 代理容器中。这可为代理发出的所有指标添加以下指标维度：
+ `appmesh.mesh`
+ `appmesh.virtual_node`
+ `appmesh.virtual_gateway`

这些标签设置为网格、虚拟节点或虚拟网关的名称，以允许使用网格中的资源名称筛选指标。

**资源名称**

网站虚拟节点的代理具有以下资源：
+ 两个侦听器，用于侦听入口和出口流量：
  + `lds_ingress_0.0.0.0_15000`
  + `lds_egress_0.0.0.0_15001`
+ 两个出口集群，代表两个虚拟节点后端：
  + `cds_egress_online-store_product-details_http_8080`
  + `cds_egress_online-store_cart_http_8080`
+ 网站服务容器的入口集群：
  + `cds_ingress_online-store_website_http_8080`

**侦听器指标示例**
+ `listener.0.0.0.0_15000.downstream_cx_active`—与 Envoy 的活跃入口网络连接数。
+ `listener.0.0.0.0_15001.downstream_cx_active`—与 Envoy 的活跃出口网络连接数。您的应用程序与外部服务建立的连接包含在此计数中。
+ `listener.0.0.0.0_15000.downstream_cx_total`—与 Envoy 的入口网络连接总数。
+ `listener.0.0.0.0_15001.downstream_cx_total`—与 Envoy 的出口网络连接总数。

有关全套侦听器指标，请参阅 Envoy 文档中的[统计信息](https://www.envoyproxy.io/docs/envoy/latest/configuration/listeners/stats)。

**集群指标示例**
+ `cluster_manager.active_clusters`— Envoy 已与之建立至少一个连接的集群总数。
+ `cluster_manager.warming_clusters`— Envoy 尚未连接的集群总数。

以下集群指标使用的格式为 `cluster.<cluster name>.<metric name>`。这些指标名称是应用程序示例所独有的，由网站 Envoy 容器发出：
+ `cluster.cds_egress_online-store_product-details_http_8080.upstream_cx_total`—网站和产品详情之间的连接总数。
+ `cluster.cds_egress_online-store_product-details_http_8080.upstream_cx_connect_fail`—网站和产品详情之间失败的连接总数。
+ `cluster.cds_egress_online-store_product-details_http_8080.health_check.failure`—网站和产品详情之间运行状况检查失败的总数。
+ `cluster.cds_egress_online-store_product-details_http_8080.upstream_rq_total`—在网站和产品详情之间提出的请求总数。
+ `cluster.cds_egress_online-store_product-details_http_8080.upstream_rq_time`—在网站和产品详情之间提出的请求所花费的时间。
+ `cluster.cds_egress_online-store_product-details_http_8080.upstream_rq_2xx`—网站从产品详情中收到的 HTTP 2xx 响应的数量。

有关完整的 HTTP 指标集，请参阅 Envoy 文档中的[统计信息](https://www.envoyproxy.io/docs/envoy/latest/configuration/http/http_conn_man/stats)。

**管理服务器指标**

Envoy 还会发布与其与 App Mesh 控制面板的连接相关的指标，App Mesh 控制面板充当 Envoy 的管理服务器。我们建议您监控其中的一些指标，以便在代理与控制面板长时间不同步时通知您。与控制平面的连接中断或更新失败会使您的代理无法从 App Mesh 接收新配置，包括通过 App Mesh 进行的网格 APIs更改。
+ `control_plane.connected_state`—当代理连接到 App Mesh 时，该指标设置为 1，否则为 0。
+ `*.update_rejected`—Envoy 拒绝的配置更新总数。这通常是由于用户配置错误造成的。例如，如果您将 App Mesh 配置为从 Envoy 无法读取的文件中读取 TLS 证书，则包含该证书路径的更新将被拒绝。
  + 对于已拒绝更新的侦听器，统计数据将为 `listener_manager.lds.update_rejected`。
  + 对于更新被拒绝的集群，统计数据将为 `cluster_manager.cds.update_rejected`。
+ `*.update_success`—App Mesh 成功更新代理的配置次数。其中包括启用新 Envoy 容器时发送的初始配置有效负载。
  + 如果 Listener 更新成功，则统计数据将为 `listener_manager.lds.update_success`。
  + 要成功更新集群，统计数据将为 `cluster_manager.cds.update_success`。

有关管理服务器指标集，请参阅 Envoy 文档中的[管理服务器](https://www.envoyproxy.io/docs/envoy/latest/configuration/overview/mgmt_server)。