
一. 為什么從 ELK 遷移到 Metabase + OLAP
1.1 ELK 的問題
- 擴(kuò)展性不強(qiáng):Kibana 只能應(yīng)用在 ElasticSearch 上
- 管理不便:在阿里云等平臺,一個(gè) ElasticSearch 集群對應(yīng)一個(gè) Kibana,難以統(tǒng)一管理
- 開發(fā)成本:無法將圖表嵌入到其他應(yīng)用中,需要二次開發(fā)圖形展示
- 性能一般:ElasticSearch 擅長全文搜索,在數(shù)據(jù)分析功能上的性能不如 OLAP 數(shù)據(jù)庫,并且存在一些限制,例如去重的精度不足,上限只有40000(默認(rèn)準(zhǔn)確度保證僅有3000)
- 運(yùn)維成本:拋開搜索優(yōu)化,仍需要維護(hù)好一套索引生命周期管理、索引模板,以及應(yīng)對字段變更時(shí)的 reindex。此外,相同數(shù)據(jù)量下,Elastic 的壓縮比不如列式數(shù)據(jù)庫,內(nèi)存占用也更高,相應(yīng)的成本也要高出不少。
1.2 Metabase + 其他DB 的優(yōu)勢
- 擴(kuò)展性: JDBC + Clojure multi-method 實(shí)現(xiàn) Driver 擴(kuò)展,即使開發(fā)新 Driver 的成本也不高。
- 統(tǒng)一入口: 使用相同后端存儲的 Metabase 可以同時(shí)管理多個(gè)不同的 DB
- 開發(fā)成本: 在 Metabase 開發(fā)的 Dashboard 可以直接嵌套到其他前端應(yīng)用,并且維護(hù)有 JWT 認(rèn)證。其他人員開發(fā)的 Question、Model、Metric 可以相互引用。
至于性能和運(yùn)維成本,則由所選擇的后端 DB 所決定。Metabase 本身不需要進(jìn)行多復(fù)雜的維護(hù),單個(gè) DB 故障并不會引起 Metabase 崩潰。

二. 提問
2.1 數(shù)據(jù)源
數(shù)據(jù)源有三種
-
Raw Data,即源數(shù)據(jù),任一數(shù)據(jù)庫表都是源數(shù)據(jù)。可以直接點(diǎn)開任一 raw 表以表格方式查看數(shù)據(jù)。
示例訂單數(shù)據(jù) Question,問題,已存儲的問題也可以成為數(shù)據(jù)源,例如這樣一個(gè)問題:查詢過去一年內(nèi)每天不同來源的消息量,我們可以基于這個(gè)問題構(gòu)建一個(gè)過去6個(gè)月每周的消息量問題。
Model,模型,可以由 Question 或 SQL 提問后轉(zhuǎn)化,Model 某種程度上是一種物化視圖,物化不存儲數(shù)據(jù),通常不直接用來可視化。例如有個(gè)人信息和訂單兩張實(shí)體表,可以把用戶名和用戶常買的物品、購買時(shí)間等組合為一個(gè)新的模型。
2.2 構(gòu)建問題
2.2.1 組成部分
- Data 部分即前面的數(shù)據(jù)源
- 可以選擇需要的列,在查詢數(shù)據(jù)時(shí)減少干擾,提升速度。
- 可以 JOIN 三種數(shù)據(jù)源,但必須在同一個(gè)數(shù)據(jù)庫,當(dāng)然,也要是同一種數(shù)據(jù)庫。也有例外,ClickHouse 可以使用 MySQL、Postgres、MongoDB 等外表。在 Metabase 上展示為同一種數(shù)據(jù)庫,但實(shí)際類型不同。 JOIN 的不同模式(
LEFT JOIN、RIGHT JOIN)可以點(diǎn)擊圖標(biāo)切換。 - Custom Column 類似于數(shù)據(jù)庫函數(shù)的接口抽象,不是所有驅(qū)動都支持該實(shí)現(xiàn)。一般用在統(tǒng)計(jì)階段。
- (可選)Filter 部分即過濾器,選擇合適的 Filter 可以提速,也可以排除無關(guān)的結(jié)果。在數(shù)據(jù)表格預(yù)覽時(shí)可以直接在列上方過濾數(shù)據(jù),例如這里只看有折扣的客單價(jià):
過濾數(shù)據(jù)

- (可選)Summarize 部分即統(tǒng)計(jì)相關(guān),需要結(jié)合分組操作。常用的例如 sum、count,如果需要構(gòu)建更復(fù)雜的計(jì)算,可以使用 Custom Column,包含其他的數(shù)學(xué)函數(shù)和字符串函數(shù),未必所有函數(shù)都可用

- (可選)Sort 和 Limit 即 排序和返回?cái)?shù)量,排序在圖表上的展示區(qū)別不大,最好限制返回的數(shù)量(默認(rèn) 10000)特別是在源表上。
2.2.2 調(diào)試 Question
每個(gè)階段都可以點(diǎn)擊小三角形預(yù)覽數(shù)據(jù)
- 在最終結(jié)果無法展示時(shí),可以逐個(gè)階段預(yù)覽調(diào)試
- 在 JOIN 數(shù)據(jù)時(shí),可以檢查是否 JOIN 模式存在錯(cuò)誤,導(dǎo)致結(jié)果缺少或者重復(fù)
如果仍然無法解決問題,可以點(diǎn)擊右邊的 SQL 語句按鈕,由開發(fā)同學(xué)協(xié)助調(diào)試。
2.3 使用 SQL 構(gòu)建問題
用 SQL 構(gòu)建問題除了可以自由選擇函數(shù)外,也可以使用變量作為過濾器。
使用變量的兩個(gè)關(guān)鍵語法是 {{variable}} 和 [[{{variable}}]] ,第一個(gè)為一般變量,第二個(gè)為可選變量,使用變量時(shí)不需要使用 where table.a = {{variable}} 方式,直接用 where = {{variable}} 使用可選變量時(shí),不需要用 AND 連接。
有點(diǎn)繞?
看看例子:這是一個(gè)統(tǒng)計(jì)不同 HTTP 方法的 SQL,將 create_time 和 method 作為過濾器,其中 create_time 是可選變量。
SELECT `inner_api_log`.`method` AS `method`,
toDate(`inner_api_log`.`create_time`) AS `create_time`, count(*) AS `count`
FROM `inner_api_log` where {{method}} [[{{create_time}}]]
GROUP BY `inner_api_log`.`method`, toDate(`inner_api_log`.`create_time`)
ORDER BY `inner_api_log`.`method` ASC, toDate(`inner_api_log`.`create_time`) ASC
過濾器可以進(jìn)一步設(shè)置,例如作為下拉框(需要映射原始表,且差異值有限)或者作為搜索框等等。

- 要進(jìn)一步分析,將 SQL 保存的問題作為數(shù)據(jù)源再次引用即可。
- 使用變量的 SQL 不可作為 Model 使用
2.4 選擇可視化圖表
點(diǎn)擊可視化圖形選擇面板選擇可用的圖表,部分圖表未必適合當(dāng)前數(shù)據(jù),可能點(diǎn)擊后仍不可用。


2.5 設(shè)置圖表
2.5.1 通用設(shè)置
點(diǎn)擊 Question 顯示通用菜單,可以添加描述、添加到 Dashboard、移動或歸檔等。
左下角的 History 按鈕可以查看版本歷史,每次保存或者回滾均會產(chǎn)生一條版本記錄。

2.5.2 折線、柱狀圖
- Data:即數(shù)據(jù)源,用來選擇展示的數(shù)據(jù)。數(shù)據(jù)旁邊的設(shè)置按鈕,可以用來格式化數(shù)據(jù),例如數(shù)字的展示可以設(shè)置小數(shù)點(diǎn),或者表示為貨幣,日期的格式等等
- Display:即展示效果,例如設(shè)置數(shù)據(jù)的顏色,設(shè)置目標(biāo)線
- Axes:刻度,用來設(shè)置數(shù)據(jù)的呈現(xiàn)方式,例如大小分布很不均勻的數(shù)據(jù)(通常數(shù)據(jù)中的最大數(shù)字比最小數(shù)字大數(shù)百甚至數(shù)千倍)可以使用對數(shù)刻度(Log)或者冪次刻度(Power),遺憾的是,Metabase 不能選擇對數(shù)的底數(shù)大小。
下圖是分布不均的典型案例,由于某種數(shù)據(jù)暴漲,掩蓋了其他數(shù)據(jù)的趨勢展示,改為對數(shù)刻度就可以很好地展示:


Labels:標(biāo)簽,或稱圖例標(biāo)簽(Legend Label),可以添加備注
可視化界面(右側(cè)):除了點(diǎn)擊圖例篩選、鼠標(biāo)懸停查看具體值之外,還可以點(diǎn)擊圖形上的點(diǎn),彈出的窗口可以做進(jìn)一步值的篩選、或者分組操作。例如原問題是按 Category 分組,這里可以進(jìn)一步按時(shí)間查看趨勢

當(dāng) X 軸為時(shí)間軸,鼠標(biāo)可以選中區(qū)間查看對應(yīng)時(shí)間范圍的數(shù)據(jù)分布。

2.5.3 表格

左側(cè)設(shè)置面板:
- Columns:列屬性,點(diǎn)擊設(shè)置按鈕設(shè)置列名,對于數(shù)值類型,支持以迷你條形圖方式展示,對于時(shí)間類型,支持格式化時(shí)間。

- Conditional Formating:即條件格式化??梢詫M足條件的值高亮顯示,高亮支持單色或顏色范圍展示


右側(cè)展示面板
-
點(diǎn)擊列名彈出快速操作,可以進(jìn)行排序、過濾、或進(jìn)一步統(tǒng)計(jì)
快速操作表格 - 點(diǎn)擊具體值彈出快速篩選窗口
- 右下角支持下載源數(shù)據(jù)到本地(JSON、Excel 或 CSV)如設(shè)置提醒,則會定時(shí)接收到該表格的郵件。
三. Dashboard 管理
3.1 編輯 Dashboard
- 右上角三個(gè)按鈕分別可以添加已保存的問題、添加文本(Markdown)和添加過濾器
- 鼠標(biāo)懸停在任一組件上,可以移動位置,組件右下角可以拖動改變大小
- 非編輯模式,點(diǎn)擊任一問題標(biāo)題,進(jìn)入到相應(yīng)問題詳情

- 對于地圖類型,支持設(shè)置默認(rèn)展示區(qū)域

Tips: 默認(rèn)提供了世界地圖和美國地圖,如果不能滿足你,可以在 AdminSetting 添加其他 Geojson 格式的地圖。

3.2 過濾器
過濾器支持幾種不同類型

添加過濾器后會固定在 Dashboard 上方,不隨頁面移動(Binding Top),拖動過濾器改變位置
-
設(shè)置聯(lián)動的圖表
點(diǎn)擊要設(shè)置的過濾器,然后在圖表上選擇聯(lián)動的列,選擇過濾條件就會聯(lián)動設(shè)置的圖表。如下圖所示,過去 30 天的過濾條件會應(yīng)用在四個(gè)圖表上。 - (可選)設(shè)置默認(rèn)的過濾選項(xiàng)、過濾器名稱

- 聯(lián)動過濾器,一般用在多級分組上,例如省-市等多級分類,選擇大一級分類會影響子分類選項(xiàng)。

3.3 可視化
如果修改圖表的標(biāo)題、微調(diào)展示的顏色等操作,需要回到問題頁修改再保存,會使操作變得繁瑣,并增加不必要的新問題。
Dashboard 編輯模式下,支持在不修改圖表展示類型的情況下,修改該類型圖表幾乎所有參數(shù),例如下圖所示,僅數(shù)據(jù)源不支持修改。
點(diǎn)擊 reset to default 會恢復(fù)到原問題的設(shè)置。

3.4 疊加圖表
在需要橫向?qū)Ρ鹊膱鼍?,有時(shí)因?yàn)闂l件難以用單個(gè) SQL 表達(dá)。
可以考慮下面的方式:
- 分別創(chuàng)建若干個(gè)問題。如果需要永久保存,可以再添加一個(gè)問題,JOIN 幾個(gè)問題實(shí)現(xiàn)圖表疊加。如果需要合并,查看 SQL 再轉(zhuǎn)化為新的問題即可。

- 若不需要,在 Dashboard 編輯模式下,添加 Add Series,搜索已保存的問題,如果問題存在感嘆號,則可能不兼容當(dāng)前的圖表。疊加的圖表同樣支持在編輯模式下分別設(shè)置圖表。


3.5 點(diǎn)擊行為
- 跳轉(zhuǎn)到自定義鏈接:用來鏈接到外部的同一網(wǎng)址,或者跳轉(zhuǎn)到帶參數(shù)的指定詳情頁等。也可以跳轉(zhuǎn)到指定的 Dashboard 或者問題頁。
例如,在地圖圖表上添加搜索關(guān)鍵詞,點(diǎn)擊跳轉(zhuǎn)到 Google 搜索頁:

- 聯(lián)動頁面過濾器:下拉過濾器可能不夠直觀,下面的地圖例子,當(dāng)點(diǎn)擊對應(yīng)州的圖形時(shí),會同步改變州(State)過濾器,其他引用的圖表就會一起更新。

四. 管理數(shù)據(jù)
4.1 管理數(shù)據(jù)源
添加數(shù)據(jù)源時(shí),管理員需要做好以下操作
- 限制數(shù)據(jù)源權(quán)限,設(shè)置好組員的查看和編輯權(quán)
- 隱藏不必要的數(shù)據(jù),例如ClickHouse 的 Kafka Engine 表、導(dǎo)入詳情表的物化表等對數(shù)據(jù)分析人員沒有意義。
一些數(shù)據(jù)列只提供給開發(fā)人員調(diào)試,對其他人員沒有意義的,同樣也要隱藏?;蛘?strong>某些列不適合統(tǒng)計(jì),聚合可能導(dǎo)致崩潰。
數(shù)據(jù)可見性.png - 更改列屬性,Metabase 有時(shí)存在列的屬性推斷錯(cuò)誤,例如某些列我們希望它有下拉過濾,但被推斷為其他類型,可以手動修改,再重新掃描該列。

4.2 創(chuàng)建模型(Model)
同樣是由表延展的數(shù)據(jù),模型具有一定實(shí)體意義,通常不直接用來可視化,而是作為源數(shù)據(jù),方便復(fù)用。
模型擁有和源數(shù)據(jù)一樣豐富的列屬性設(shè)置,這里不再贅述。



