通過(guò)CEL表達(dá)式消除請(qǐng)求路徑維度中的ID信息
在某些應(yīng)用場(chǎng)景中,請(qǐng)求路徑包含特定信息來(lái)表征用戶(hù)身份或訪問(wèn)對(duì)象。例如,訪問(wèn)某電商后端/buy路徑時(shí),訂單ID被拼接為請(qǐng)求路徑 /buy/{order_id}。這會(huì)導(dǎo)致訪問(wèn)同一后端的不同訂單請(qǐng)求時(shí),會(huì)產(chǎn)生大量監(jiān)控指標(biāo),增大數(shù)據(jù)面并影響 Prometheus 性能。為避免這種情況,您可以通過(guò)定義更高級(jí)的CEL (Common Expression Language)表達(dá)式,定制指標(biāo)維度生成規(guī)則,消除請(qǐng)求路徑中訂單ID等信息,從而有效收斂監(jiān)控指標(biāo)。本文介紹如何通過(guò)CEL表達(dá)式消除監(jiān)控指標(biāo)請(qǐng)求路徑維度中的ID信息。
前提條件
已部署httpbin和sleep應(yīng)用。應(yīng)用部署的具體步驟,請(qǐng)參見(jiàn)部署httpbin應(yīng)用。
步驟一:?jiǎn)⒂帽O(jiān)控指標(biāo)并添加自定義維度
登錄ASM控制臺(tái),在左側(cè)導(dǎo)航欄,選擇 。
在網(wǎng)格管理頁(yè)面,單擊目標(biāo)實(shí)例名稱(chēng),然后在左側(cè)導(dǎo)航欄,選擇 。
在監(jiān)控指標(biāo)設(shè)置列表中開(kāi)啟REQUEST_SIZE的CLIENT側(cè)指標(biāo)和SERVER側(cè)指標(biāo),并分別添加自定義維度
request_path
,取值為request.path
。
步驟二:訪問(wèn)httpbin服務(wù)
執(zhí)行以下命令,查看應(yīng)用運(yùn)行狀態(tài)。
kubectl get pod
預(yù)期輸出:
NAME READY STATUS RESTARTS AGE httpbin-fd68xxxxx-xxxxx 2/2 Running 0 44m sleep-5488dxxxxx-xxxxx 2/2 Running 0 43m
執(zhí)行以下命令,從sleep應(yīng)用Pod訪問(wèn)httpbin應(yīng)用,請(qǐng)求路徑中加入了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
執(zhí)行以下命令,查看監(jiān)控指標(biāo)信息。
kubectl exec -it deploy/httpbin -c istio-proxy -- curl localhost:15020/stats/prometheus | grep request_bytes_count
預(yù)期輸出:
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
可以看到記錄了所有請(qǐng)求的
request_path
。
步驟三:修改監(jiān)控指標(biāo)自定義維度以消除ID信息
當(dāng)前的自定義維度配置狀態(tài)下,會(huì)記錄每個(gè)請(qǐng)求的 request_path
,每個(gè)請(qǐng)求中都包含特定的 ID 信息,這會(huì)為Prometheus帶來(lái)一些性能壓力。您可以通過(guò)修改自定義維度request_path
的取值為以下CEL表達(dá)式,以消除ID信息。
matches(request.path, "/sell/.*") ? "/sell/{order_id}" :
(matches(request.path, "/buy/.*") ? "/buy/{order_id}" :
"/default")
該 CEL 表達(dá)式的含義為:
如果請(qǐng)求路徑以
/sell
開(kāi)頭,返回/sell/{order_id}
。如果請(qǐng)求路徑以
/buy
開(kāi)頭,返回/buy/{order_id}
。如果請(qǐng)求路徑不符合以上兩種情況,則返回
/default
。
執(zhí)行以下命令,再次訪問(wèn)httpbin應(yīng)用。
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
執(zhí)行以下命令,查看監(jiān)控指標(biāo)信息。
kubectl exec -it deploy/httpbin -c istio-proxy -- curl localhost:15020/stats/prometheus|grep request_bytes_count
預(yù)期輸出:
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
可以看到,此時(shí)請(qǐng)求路徑前綴為
/buy
的請(qǐng)求request_path
維度變?yōu)?code data-tag="code" code-type="xCode" class="code">/buy/{order_id},前綴為/sell
的請(qǐng)求變?yōu)?code data-tag="code" code-type="xCode" class="code">/sell/{order_id},其它請(qǐng)求則變?yōu)?code data-tag="code" code-type="xCode" class="code">/default。
相關(guān)文檔
更多關(guān)于CEL表達(dá)式的使用方法,請(qǐng)參見(jiàn)cel-spec。