Grafana動態視圖在轉轉推送系統中的應用

1 背景
轉轉的推送系統為自研產物,實現過程簡述為:對外提供一個接入層,以多次MQ轉發形式進行多系統交互,內部包括:推送內容過濾、免打擾策略、廠商通道分發等邏輯,最終發起http請求至廠商通道,推送至設備,如圖1所示。一條Push經過的邏輯節點眾多,業務側同學經常反饋Push收不到。每次收到反饋,都需要對鏈路中的每個集群進行排查,費時費力,亟需一種快速定位問題的方式,解放人力。

圖1 轉轉推送系統-推送流程
2 idea的誕生
在調用鏈路層面,一次接口調用中,traceId貫穿整個調用鏈路,該能力由Radar(自研能力,負責埋點的生成等)+ Zipkin實現。當Push發送失敗時,一定會在某個邏輯節點終止,如果我們可以將正向邏輯節點、異常邏輯節點以可視化的方式呈現出來,以traceId作為查詢問題的線索,則可以在圖中快速定位問題原因。
在數據采集方向上,對數據上報有嚴格的耗時、低性能開銷要求。Prometheus監控體系的QPS在千萬級別,耗時為納秒級,內存占用和資源消耗都相對較小,主要取決于標簽的數量,標簽越多,內存占用越多。若采用traceId作為查詢條件(對應Prometheus中的一個標簽),可以通過抽樣、限制收集的環境,即:只在測試、沙箱環境收集,降低對內存等資源的消耗。
以這兩個層面為出發點,Grafana動態視圖與我們訴求不謀而合。
3 什么是動態視圖
動態視圖,即:Flowcharting,是Grafana的一個插件。該插件借助在線圖形庫draw.io繪制、展示復雜圖表。draw.io支持的圖表包括:技術架構方案(Legacy、Cloud、Azure、AWS、GCP、Kubernetes、Terraform)、UML方案、工作流等。
可以用這個插件動態填充數據、自定義數據與圖表的交互,它可以/支持:
- 監視狀態和性能
- 與圖表交互
- 根據數據或狀態更改顯示的對象
- 向對象添加鏈接
- 充分利用變量修改形狀、顏色、鏈接、下載路徑等
- 支持正則表達式進行匹配和替換
附官方動態視圖樣例,如圖2所示。

圖2 官方Grafana動態視圖樣例
4 構建看板
4.1 繪制視圖
我們將一條Push經過的每個邏輯節點繪畫出來,如圖3所示。上方的綠色底色節點為正向節點,每個正向節點正下方對應一些異常節點,即:圖中的土黃色節點。多個正向節點之間用箭頭串聯起來。此外,所有節點都定義了一個狀態碼,用來唯一標識該節點。節點狀態碼釋義放在了最右側的灰色底色節點中,點擊該節點可以進入狀態碼說明在線文檔。

圖3 轉轉推送系統-鏈路流程圖
4.2 上報數據
在公共jar包中定義一個Counter,該Counter中包含了兩個標簽:nodeName、traceId。其中,traceId對應視圖中每個節點的名稱。
private static final Counter NODE_COUNTER = Counter.build().name("push_link_graph_node_monitor").help("push鏈路節點監控").labelNames("nodeName", "traceId").disableAutoCreateGraph(true).register();此外,在jar包中提供上報方法,供各服務上報數據使用。
public static void reportNodeInfoStrWithTraceId(String nodeName, String traceId) {
try {
if (StringUtils.isBlank(traceId)) {
traceId = com.bj58.zhuanzhuan.radar.util.RadarUtils.getTraceId();
}
NODE_COUNTER.labels(nodeName, traceId).inc();
} catch (Exception e) {
// DO NOTHING
}
return;
}最后,在業務代碼中上報埋點數據,如圖4所示。

圖4 上報埋點數據
4.3 創建Grafana看板
新建一個Grafana看板如圖5所示。

圖5 創建Grafana看板
點擊《設置》按鈕,完善基礎信息、設置變量,如圖6所示。

圖6 設置按鈕圖示
基礎信息的填寫如圖7所示,基礎信息包括:看板名稱、看板標簽(可用來標記看板所屬的部門信息)、看板數據的時間查詢條件等。

圖7 完善看板基礎信息
設置變量如圖8所示,該變量用作后續的數據源召回條件。變量的類型支持:即時手動輸入、實時數據源、常量等等。這里將traceId設置為:即時手動輸入類型。

圖8 設置變量
4.4 將圖導入Grafana
在已繪制好的流程界面中,選中《其它》tab,勾選其中的《編輯繪圖》選項,如圖9所示。然后復制XML內容到剪貼板中,如圖10所示。最后將復制好的內容粘貼在FlowCharting看板內,如圖11所示。

圖9 編輯繪圖

圖10 復制XML內容

圖11 粘貼XML內容
4.5 完善PromQL數據
這一步驟是書寫查詢語句,以獲取視圖中動態查詢到的數據。在《Query》tab中填寫PromQL、數據的圖例維度,如圖12所示。圖例維度用作后續數據與圖表的交互條件。

圖12 完善PromQL與圖例
對當前的推送場景來說,PromQL按照traceId聚合,圖例使用nodeName。附,PromQL如下:
increase(push_link_graph_node_monitor{traceId="${traceId}"}[$__rate_interval])如果對PromQL不了解,可以查閱參考資料中的第4點。
填寫好的PromQL可以通過2種方式驗證結果,如圖13所示。
- QL驗證方式一:打開頁面右上角的《Table view》開關,可以觀測到下方有查詢數據展示出來。
- QL驗證方式二:點擊頁面中部靠下的《Query Inspector》按鈕,出現查詢結果半層,半層中可以看到查詢結果,如圖14所示。當出錯時,會給出提示信息,按提示排查即可。

圖13 QL驗證方式

圖14 Query Inspector半層
4.6 定義Mapping
這一步驟是定義數據與圖表的交互。Mapping包括:
- Color/Tooltip Mappings:將數據關聯drwa.io XML元素,動態修改圖的顏色、提示。如:訂單數小于100單將圖變紅。
- Label/Text Mappings:將計算的數據展示到圖上。
- Link Mappings:將圖配置跳轉鏈接,點擊即可跳轉。
- Event/Animation Mappings:用于將圖的數據綁定事件,如:訂單數小于100單,圖的邊框閃爍。
每個場景的使用方式可以參考官方網站,詳見《參考資料》第3點,或點擊每個頁面元素右側的問號查看幫助信息、樣例,如圖15所示。

圖15 頁面元素右側的幫助信息
在推送場景中,我們使用Event/Animation Mappings,當數據滿足一定條件時,圖中的元素閃爍展示。首先我們配置數據的聚合方式與觸發閾值,配置樣例如圖16所示。

圖16 配置數據的聚合方式與觸發閾值
其中lvl字段0值代表nodeName為21000的第一個不為空的數據大于等于0。后面會用到這個lvl值觸發圖形交互。
接下來,我們配置圖形閃爍的條件,如圖17所示。點擊紅色框中的《鏈接》按鈕,然后在左側選中要關聯的頁面圖形元素,對應本圖中的左側藍色框內容。選中之后,該元素的唯一標識會出現自動填充在右側藍色框中。之后,在黃色框里選擇lvl的值,即我們剛剛設置的lvl為0這個值,代表當滿足該條件時,元素會出現動效。最后在綠色框中設置動效效果為閃爍。

圖17 圖的數據綁定事件示例
以此類推,給頁面上每個元素設置數據交互效果。
5 成果與收效
5.1 成果
通過draw.io繪制出含有Push鏈路中每個邏輯節點的視圖,然后在Grafana上構建數據交互規則,將推送系統鏈路以可視化的方式呈現出來。
當我們拿到一個traceId后,輸入到搜索框中,Grafana自動獲取到數據,觸發數據交互,高亮每一個邏輯節點,如圖18所示,非常直觀。

圖18 推送系統動態視圖演示
當異常節點高亮時,業務側同學可以根據狀態碼查看說明文檔,找出對應的解決方案,如圖19所示,該圖表明是蘋果APNs通道返回了狀態碼為400,且原因為BadDeviceToken。

圖19 推送系統動態視圖-鏈路異常case
我們可以在圖中灰色節點的在線文檔鏈接中找到解決方案,如圖20所示。

圖20 推送系統APNs異常狀態碼釋義
5.2 收效
在動態視圖出現之前,人均排查時間為0.25小時以上,詢問頻率為每天N次。有了動態視圖,業務側同學基本能夠根據動態視圖定位到異常原因,實現自助解決問題,沒有再詢問過(排除服務異常的case,需要人工再次介入),極大降低了人力成本的投入。
6 推廣
只要你的服務或者業務,可以用流程圖繪制,都可以通過本文的方式構建出一張動態視圖,以可視化方式展現邏輯,幫助你快速定位正向、異常邏輯節點,減少排查問題過程中的人力投入。
歡迎大家在評論區留言,也可添加微信號:zpc_1994,進一步交流。
7 致謝
感謝架構部伙伴建新(王建新)同學、趙浩同學的答疑解惑,幫助我們深入了解數據采集、動態視圖構建相關的原理,為最終的技術選型提供了有力的理論支撐。
8 參考資料
[1] 孟維道.轉轉Push系統設計及架構演進,2023
[2] 苑沖.Prometheus+Grafana:轉轉如何打造開箱即用的一體化監控系統?,https://mp.weixin.qq.com/s/uSgAAsIqFcKf9jPNKH7sOw
[3] flowcharting-repository,https://algenty.github.io/flowcharting-repository/
[4] 初識PromQL,https://www.topgoer.cn/docs/prometheus/prometheus-1ccta9bf6ibdq
































