服务网格 ASM(Service Mesh)支持无侵入式熔断、限流及流量监控。本文介绍熔断和限流常用的大盘配置及告警规则。
熔断降级
流量熔断是一种过载保护机制,主要用于防止系统因为短时间内过大的流量而崩溃。在云原生服务之间存在东西向调用流量的情况下,如果某个服务发生故障(例如:响应过慢或者失败率升高),可能会导致该服务所在调用链路上的一系列服务也发生连锁崩溃。
通过为服务间的东西向调用流量配置熔断规则,可以实现当请求失败率或响应超时次数达到阈值时,主动“切断”来自上游服务的请求。在保护上游服务的同时,也有效防止故障在整个调用链路中扩散,造成整个系统雪崩。
配置熔断规则后,每个网格代理将基于其代理的请求分别计算请求失败率或响应超时次数。因此,对于同一个发生故障的上游服务、客户端网格代理发生熔断的时机可能略有不同。
大盘示例

对应每个面板说明如下:
|
面板(Panels) |
说明 |
|
Requests |
请求总体情况,包含以下指标:
|
|
Requests OK Percent |
请求成功的总数占总请求数的比例。 |
|
Requests Throttled Percent |
触发熔断的请求占总请求数的比例。 |
您可以将以下JSON导入到Grafana大盘,为集群创建熔断大盘。您也可以修改或根据以下JSON内容自定义创建大盘。
告警规则示例
|
告警配置 |
示例 |
说明 |
|
自定义PromQL语句 |
(sum by(cluster, namespace) (increase(envoy_asm_circuit_breaker_total_broken_requests[1m]))) > 10 |
查询最近1分钟之内熔断的请求数量,并根据触发熔断的服务所在命名空间以及服务名称进行分组。当1分钟内被熔断的请求数量大于10时触发告警。 |
|
告警内容 |
发生服务级熔断!命名空间:{{$labels.namespace}},发生熔断的目标服务:{{$labels.cluster}}。当前1分钟内熔断的请求数量:{{ $value }} |
展示了触发熔断的服务所在命名空间以及服务名称,以及最近1分钟内发往该服务被熔断的请求数量的告警信息格式。 |
全局限流防护
在Envoy代理中,全局限流是一种用于控制整个服务网格中请求速率的机制。它基于Envoy的限流服务(Rate Limit Service)实现。该服务可以集中处理来自整个服务网格中的流量,并根据预先定义的规则和配额来限制请求的速率。
全局限流可以与本地限流结合使用,以提供不同层面的限流功能。
大盘示例

对应每个面板说明如下:
|
面板(Panels) |
说明 |
|
Requests |
请求总体情况,包含以下指标:
|
|
Requests OK Percent |
请求成功的总数占总请求数的比例。 |
|
Requests Reached Limits Percent |
触发限流的请求占总请求数的比例。 |
您可以将以下JSON导入到Grafana大盘,为集群创建全局限流大盘。您也可以修改或根据以下JSON内容自定义创建大盘。
告警规则示例
|
告警配置 |
示例 |
说明 |
|
自定义PromQL语句 |
sum (increase(envoy_cluster_ratelimit_over_limit[1m])) by (namespace, service_istio_io_canonical_name) > 10 |
查询最近1分钟之内限流的请求数量,并根据触发限流的服务所在命名空间以及服务名称进行分组。当1分钟内被限流的请求数量大于10时触发告警。 |
|
告警内容 |
已触发限流!命名空间:{{$labels.namespace}},发生限流的目标服务:{{$labels.service_istio_io_canonical_name}}。当前1分钟内限流的请求数量:{{ $value }} |
展示了触发限流的服务所在命名空间以及服务名称,以及最近1分钟内发往该服务被限流的请求数量的告警信息格式。 |
本地限流防护
Envoy代理使用令牌桶算法实现本地限流。令牌桶算法是一种限制发送到服务端的请求数量的方法,基于一定数量的令牌桶。存储桶以恒定的速率不断填充令牌,当向服务发送请求时,会从存储桶中删除一个令牌。如果存储桶为空,则请求将被拒绝。
本地限流可以与全局限流结合使用,以提供不同层面的限流功能。
大盘示例

对应每个面板说明如下:
|
面板(Panels) |
说明 |
|
Requests |
请求总体情况,包含以下指标:
|
|
Requests OK Percent |
请求成功的总数占总请求数的比例。 |
|
Requests Reached Limits Percent |
触发限流的请求占总请求数的比例。 |
您可以将以下JSON导入到Grafana大盘,为集群创建本地限流大盘。您也可以修改或根据以下JSON内容自定义创建大盘。
告警规则示例
|
告警配置 |
示例 |
说明 |
|
自定义PromQL语句 |
sum (increase(envoy_http_local_rate_limiter_http_local_rate_limit_enforced[1m])) by (namespace, service_istio_io_canonical_name) > 10 |
查询最近1分钟之内限流的请求数量,并根据触发限流的服务所在命名空间以及服务名称进行分组。当1分钟内被限流的请求数量大于10时触发告警。 |
|
告警内容 |
已触发限流!命名空间:{{$labels.namespace}},发生限流的目标服务:{{$labels.service_istio_io_canonical_name}}。当前1分钟内限流的请求数量:{{ $value }} |
展示了触发限流的服务所在命名空间以及服务名称,以及最近1分钟内发往该服务被限流的请求数量的告警信息格式。 |
相关操作
导入Grafana大盘
-
登录ARMS控制台。
-
在左侧导航栏,单击接入管理。
-
在已接入环境页签中选择容器环境,通过集群名称搜索环境,然后单击进入目标环境。单击大盘目录。
大盘目录位于容器环境详情页基本信息区域中,单击其对应的值即可跳转至Grafana大盘目录。
-
在Dashboards页签右侧,单击Import按钮。
-
将JSON内容粘贴到Import via panel json区域,然后单击Load按钮。保持默认设置,单击Import,即可完成大盘的导入。
说明您也可以通过上传JSON文件的方式导入大盘。