Istio 为 Service Mesh 中的微服务提供了非常丰富的统计指标(Metrics),这些指标可以让运维人员随时监控应用程序中服务的健康状况,在系统出现线上故障之前就发现潜在问题并进行处理。本文将介绍 Istio Metrics 的实现机制,以帮助读者深入了解其原理。
Istio Metrics 是基于 Envoy Stats 机制进行扩展而实现的。要理解 Istio Metrics 的实现机制,我们需要先了解 Envoy Stats。Envoy Stats (Statistics 的缩写,即统计数据) 是 Envoy 中的一个公共模块,为 Envoy 中的各种 filter(如 HCM,TCP Proxy 等)和 Cluter 输出详尽的统计数据。Envoy 提供了三种类型的 stats:
通过 envoy 的 admin 端口可以查询 stats 数据。Envoy 支持按照原始格式或者 prometheus 格式展示指标数据。
原始格式:以 “.” 将 stats 的名称和该 stats 的各个 tag 连在一起作为指标名称。
下面的这个 stats 是一个 counter,表示 echo-service 这个 cluster 的 http1 请求总数:
http.echo-service.downstream_rq_http1_total: 41
Prometheus 格式:将指标名中的 tag 按照规则提取出来,即可输出 Prometheus 格式的指标数据。
将上面的 stats 转换为 Prometheus 格式:
envoy_http_downstream_rq_http1_total{envoy_http_conn_manager_prefix="echo-service"} 41
通过 http://localhost:`$(admin_port)/stats 和 http://localhost:$`(admin_port)/stats/prometheus 可以以原始格式和 Prometheus 格式查看 envoy 中的所有 stats 数据。
虽然 Envoy 通过 stats提供了非常完善的统计数据,但是 Envoy 提供的这些指标都是基于 cluster 进行统计的,例如某个 cluster 的请求次数,请求耗时,成功率等。从单个代理的角度来看,这些指标已经足以用于分析代理和其 upstream server 的工作状况,但这些指标用在 service mesh 的场景中是不够的。
在 service mesh 中,我们需要查看 service 维度的统计指标,包括某个 service 的调用次数,请求耗时,成功率等。通过在 service 的指标中加入丰富的 tag,包括请求端 service 的信息(cluster,namespace,workload,canonical service),服务端 service 的信息(cluster,namespace,service name,version 等),Istio 可以让微服务运维和开发人员准确监控系统的运行情况并找到有问题的服务。
Istio 为 Envoy sidecar 增加了以下 stats:
七层(HTTP/gRPC)指标:
四层(TCP)指标:
Istio 提供的一个服务级别的指标的示例:
istio_requests_total{
response_code="200",
reporter="source",
source_workload="reviews-v3",
source_workload_namespace="default",
source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",
source_app="reviews",
source_version="v3",
source_cluster="Kubernetes",
destination_workload="ratings-v1",
destination_workload_namespace="default",
destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-ratings",
destination_app="ratings",destination_version="v1",
destination_service="ratings.default.svc.cluster.local",
destination_service_name="ratings",
destination_service_namespace="default",
destination_cluster="Kubernetes",
request_protocol="http",
response_flags="-",
grpc_response_status="",
connection_security_policy="unknown",
source_canonical_service="reviews",
destination_canonical_service="ratings",
source_canonical_revision="v3",
destination_canonical_revision="v1"}
32
从上面的例子中可以看到,Istio 为每个指标提供了丰富的 tag(Istio 中又称为 label),其中比较重要的 tag 的含义见下表:
Tag | 说明 | 示例 | 备注 |
---|---|---|---|
Reporter | 本条数据的上报端 | source/destination | 如果数据是从 client 端的 sidecar proxy 上报的,则取值为 source;如果是从 server 端的 sidecar proxy 上报的,则取值为 destination |
Source Workload | Client 端的 workload(deployment 名称) | reviews-v3 | |
Source Workload Namespace | Client 端所属的 Namespace | default | |
Source Principal | Client 端的服务身份 | spiffe://cluster.local/ns/default/sa/bookinfo-reviews | |
Source App | Client 端的应用名称 | reviews | |
// 待补充
var disq = new iDisqus('disqus-comment', { forum: 'zhaohuabings-blog', api: 'https:\/\/disqusapi.zhaohuabing.com', site: 'https:\/\/zhaohuabing.com', mode: 1, timeout: 5000, init: true, emojiPreview: true });