通过CEL表达式消除请求路径维度中的ID信息

在某些应用场景中,请求路径包含特定信息来表征用户身份或访问对象。例如,访问某电商后端/buy路径时,订单ID被拼接为请求路径 /buy/{order_id}。这会导致访问同一后端的不同订单请求时,会产生大量监控指标,增大数据面并影响 Prometheus 性能。为避免这种情况,您可以通过定义更高级的CEL (Common Expression Language)表达式,定制指标维度生成规则,消除请求路径中订单ID等信息,从而有效收敛监控指标。本文介绍如何通过CEL表达式消除监控指标请求路径维度中的ID信息。

前提条件

步骤一:启用监控指标并添加自定义维度

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

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

  3. 监控指标设置列表中开启REQUEST_SIZECLIENT侧指标SERVER侧指标,并分别添加自定义维度request_path,取值为request.path

    image

步骤二:访问httpbin服务

  1. 执行以下命令,查看应用运行状态。

    kubectl get pod

    预期输出:

    NAME                      READY   STATUS    RESTARTS   AGE
    httpbin-fd68xxxxx-xxxxx   2/2     Running   0          44m
    sleep-5488dxxxxx-xxxxx    2/2     Running   0          43m
  2. 执行以下命令,从sleep应用Pod访问httpbin应用,请求路径中加入了ID信息。

    kubectl exec -it deploy/sleep -- curl httpbin:8000/buy/id1 > /dev/null
    kubectl exec -it deploy/sleep -- curl httpbin:8000/buy/id2 > /dev/null
    kubectl exec -it deploy/sleep -- curl httpbin:8000/sell/id1 > /dev/null
    kubectl exec -it deploy/sleep -- curl httpbin:8000/sell/id2 > /dev/null
  3. 执行以下命令,查看监控指标信息。

    kubectl exec -it deploy/httpbin -c istio-proxy -- curl localhost:15020/stats/prometheus | grep request_bytes_count

    预期输出:

    istio_request_bytes_count{reporter="destination",source_workload="sleep",...request_path="/buy/id1"} 2
    istio_request_bytes_count{reporter="destination",source_workload="sleep",...request_path="/buy/id2"} 2
    istio_request_bytes_count{reporter="destination",source_workload="sleep",...request_path="/sell/id1"} 2
    istio_request_bytes_count{reporter="destination",source_workload="sleep",...request_path="/sell/id2"} 2

    可以看到记录了所有请求的 request_path

步骤三:修改监控指标自定义维度以消除ID信息

当前的自定义维度配置状态下,会记录每个请求的 request_path,每个请求中都包含特定的 ID 信息,这会为Prometheus带来一些性能压力。您可以通过修改自定义维度request_path的取值为以下CEL表达式,以消除ID信息。

matches(request.path, "/sell/.*") ? "/sell/{order_id}" : 
    (matches(request.path, "/buy/.*") ? "/buy/{order_id}" : 
    "/default")
说明

该 CEL 表达式的含义为:

  • 如果请求路径以/sell开头,返回/sell/{order_id}

  • 如果请求路径以/buy开头,返回/buy/{order_id}

  • 如果请求路径不符合以上两种情况,则返回/default

  1. 执行以下命令,再次访问httpbin应用。

    kubectl exec -it deploy/sleep -- curl httpbin:8000/buy/id1 > /dev/null
    kubectl exec -it deploy/sleep -- curl httpbin:8000/buy/id2 > /dev/null
    kubectl exec -it deploy/sleep -- curl httpbin:8000/sell/id1 > /dev/null
    kubectl exec -it deploy/sleep -- curl httpbin:8000/sell/id2 > /dev/null
    kubectl exec -it deploy/sleep -- curl httpbin:8000/product > /dev/null
  2. 执行以下命令,查看监控指标信息。

    kubectl exec -it deploy/httpbin -c istio-proxy -- curl localhost:15020/stats/prometheus|grep request_bytes_count

    预期输出:

    istio_request_bytes_count{reporter="destination",source_workload="sleep",...request_path="/buy/{order_id}"} 3
    istio_request_bytes_count{reporter="destination",source_workload="sleep",...request_path="/default"} 2
    istio_request_bytes_count{reporter="destination",source_workload="sleep",...request_path="/sell/{order_id}"} 4

    可以看到,此时请求路径前缀为/buy的请求request_path维度变为/buy/{order_id},前缀为/sell的请求变为/sell/{order_id},其它请求则变为/default

相关文档

更多关于CEL表达式的使用方法,请参见cel-spec