服务网格 ASM(Service Mesh)内置多个监控指标以及丰富的指标维度来帮助您更好地了解应用的运行情况。同时,ASM提供了强大的扩展机制,您可以基于请求或响应信息自行编写处理逻辑,将处理后的结果添加到监控指标的维度中。本文介绍如何使用Wasm插件为ASM中已有的监控指标新增自定义维度。
背景信息
ASM内置的监控指标(例如:istio_requests_total、istio_request_duration_milliseconds等),都有默认的一些维度(例如:source_workload、destination_workload、response_code等)。基于这些维度,您可以配置网格代理生成的监控指标。具体操作,请参见监控指标设置说明。基于这些监控指标信息,您可以构建丰富的仪表盘以及一些告警规则。
前提条件
已添加集群到ASM实例,且ASM实例版本为1.18及以上。
已启用Sidecar注入。具体操作,请参见配置Sidecar注入策略。
已创建入口网关。
已部署httpbin应用,且可以正常访问。具体操作,请参见部署httpbin应用。
步骤一:编写插件并将其应用至httpbin应用
本文将演示使用Rust开发Wasm插件,将请求头中的user-name进行base64解码,然后将user-name作为一个维度添加到istio_requests_total指标中。
其他语言和Rust插件调用的API类似,如果您使用其他语言编写Wasm插件,请自行查阅对应的SDK文档。
获取插件源码。
编译并部署插件。具体操作,请参见使用Rust为网格代理开发Wasm插件。
此插件的主要功能是:调用
SetProperty
函数,将解析的结果设置为一个filter_state。其中,WasmPlugin
的示例YAML如下。apiVersion: extensions.istio.io/v1alpha1 kind: WasmPlugin metadata: name: add-metrics-log namespace: default spec: imagePullPolicy: IfNotPresent selector: matchLabels: app: httpbin url: oci://registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/asm-wasm-rust-add-metrics-tag:v1.22.6.7-g1926b20-aliyun phase: AUTHN
此示例中的镜像存储在公开仓库,因此不需要配置
wasm-secrets
。如果您所使用的ACR为私有仓库,请根据使用Rust为网格代理开发Wasm插件中的示例YAML做相对应的调整。
步骤二:修改可观测配置,输出自定义维度
登录ASM控制台,在左侧导航栏,选择 。
在网格管理页面,单击目标实例名称,然后在左侧导航栏,选择 。
在监控指标设置列表中开启REQUEST_COUNT的CLIENT侧指标和SERVER侧指标,并分别添加自定义维度
user_name
,取值为filter_state["wasm.user-name"]
。单击提交,即可将Wasm插件设置的
filter_state
添加到指标维度中。
步骤三:发起访问测试,并查看结果
执行以下命令,访问测试服务。
curl ${ASM网关IP}:80/status/418 --header "user-name:YXNtLXRlc3QtdXNlcgo="
YXNtLXRlc3QtdXNlcgo=
是asm-test-user进行base64编码后的结果。预期输出:
-=[ teapot ]=- _...._ .' _ _ `. | ."` ^ `". _, \_;`"---"`|// | ;/ \_ _/ `"""`
使用数据面集群的kubeconfig,执行以下命令,查看httpbin Pod对应的Prometheus指标。
kubectl exec deploy/httpbin -it -c istio-proxy -- curl localhost:15000/stats/prometheus | grep istio_requests_total
预期输出:
# TYPE istio_requests_total counter istio_requests_total{reporter="destination",source_workload="istio-ingressgateway",...,user_name="asm-test-user"} 3
至此,您可以基于此维度在Prometheus中定制特定用户的各种统计信息。