使用Wasm插件扩展ASM监控指标的维度信息

服务网格 ASM(Service Mesh)内置多个监控指标以及丰富的指标维度来帮助您更好地了解应用的运行情况。同时,ASM提供了强大的扩展机制,您可以基于请求或响应信息自行编写处理逻辑,将处理后的结果添加到监控指标的维度中。本文介绍如何使用Wasm插件为ASM中已有的监控指标新增自定义维度。

背景信息

ASM内置的监控指标(例如:istio_requests_total、istio_request_duration_milliseconds等),都有默认的一些维度(例如:source_workload、destination_workload、response_code等)。基于这些维度,您可以配置网格代理生成的监控指标。具体操作,请参见监控指标设置说明。基于这些监控指标信息,您可以构建丰富的仪表盘以及一些告警规则。

前提条件

步骤一:编写插件并将其应用至httpbin应用

本文将演示使用Rust开发Wasm插件,将请求头中的user-name进行base64解码,然后将user-name作为一个维度添加到istio_requests_total指标中。

其他语言和Rust插件调用的API类似,如果您使用其他语言编写Wasm插件,请自行查阅对应的SDK文档。
  1. 获取插件源码

  2. 编译并部署插件。具体操作,请参见使用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做相对应的调整。

步骤二:修改可观测配置,输出自定义维度

  1. 登录ASM控制台,在左侧导航栏,选择服务网格 > 网格管理

  2. 网格管理页面,单击目标实例名称,然后在左侧导航栏,选择可观测管理中心 > 可观测配置

  3. 监控指标设置列表中开启REQUEST_COUNTCLIENT侧指标SERVER侧指标,并分别添加自定义维度user_name,取值为filter_state["wasm.user-name"]

    image

  4. 单击提交,即可将Wasm插件设置的filter_state添加到指标维度中。

步骤三:发起访问测试,并查看结果

  1. 执行以下命令,访问测试服务。

    curl ${ASM网关IP}:80/status/418 --header "user-name:YXNtLXRlc3QtdXNlcgo="
    YXNtLXRlc3QtdXNlcgo=是asm-test-user进行base64编码后的结果。

    预期输出:

        -=[ teapot ]=-
    
           _...._
         .'  _ _ `.
        | ."` ^ `". _,
        \_;`"---"`|//
          |       ;/
          \_     _/
            `"""`
  2. 使用数据面集群的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中定制特定用户的各种统计信息。