在某些应用场景中,请求路径包含特定信息来表征用户身份或访问对象。例如,访问某电商后端/buy路径时,订单ID被拼接为请求路径 /buy/{order_id}。这会导致访问同一后端的不同订单请求时,会产生大量监控指标,增大数据面并影响 Prometheus 性能。为避免这种情况,您可以通过定义更高级的CEL (Common Expression Language)表达式,定制指标维度生成规则,消除请求路径中订单ID等信息,从而有效收敛监控指标。本文介绍如何通过CEL表达式消除监控指标请求路径维度中的ID信息。
前提条件
已部署httpbin和sleep应用。应用部署的具体步骤,请参见部署httpbin应用。
步骤一:启用监控指标并添加自定义维度
登录ASM控制台,在左侧导航栏,选择 。
在网格管理页面,单击目标实例名称,然后在左侧导航栏,选择 。
在监控指标设置列表中开启REQUEST_SIZE的CLIENT侧指标和SERVER侧指标,并分别添加自定义维度
request_path
,取值为request.path
。
步骤二:访问httpbin服务
执行以下命令,查看应用运行状态。
kubectl get pod
预期输出:
NAME READY STATUS RESTARTS AGE httpbin-fd68xxxxx-xxxxx 2/2 Running 0 44m sleep-5488dxxxxx-xxxxx 2/2 Running 0 43m
执行以下命令,从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
执行以下命令,查看监控指标信息。
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
。
执行以下命令,再次访问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
执行以下命令,查看监控指标信息。
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。