雖然這篇json轉png鄉民發文沒有被收入到精華區:在json轉png這個話題中,我們另外找到其它相關的精選爆讚文章
在 json轉png產品中有2篇Facebook貼文,粉絲數超過2,018的網紅Kewang 的資訊進化論,也在其Facebook貼文中提到, 繼之前分享如何實作「窮人版 ELK」之後,再來分享一下這個服務裡面的 DSL 是如何實作的。會想到要為這個服務做 DSL,主要是小編雖然已經把 Impala 產生的資料利用一些工具轉成 PNG 圖檔,但動作太繁雜,所以想把這些過程用 DSL 來表示,工程師只要會下 SQL 就能把資料轉成 PNG 圖...
json轉png 在 Kewang 的資訊進化論 Facebook 的最佳貼文
繼之前分享如何實作「窮人版 ELK」之後,再來分享一下這個服務裡面的 DSL 是如何實作的。會想到要為這個服務做 DSL,主要是小編雖然已經把 Impala 產生的資料利用一些工具轉成 PNG 圖檔,但動作太繁雜,所以想把這些過程用 DSL 來表示,工程師只要會下 SQL 就能把資料轉成 PNG 圖檔了。
其實對於 DSL,有在 follow 粉絲頁的朋友應該有注意到,小編很久以前就有一個屬意的方案了,那就是 MSON。它結合了 Markdown 以及 JSON,所以不只人類易讀,機器也易讀。只不過 MSON Parser 一直都是殘缺不全,所以沒辦法讓小編完整的實作 DSL,這個方案就被捨棄了。
另一個也很適合拿來做 DSL 的就是 YAML 了,個人覺得跟 MSON 比起來易讀性稍低一點,但已經是目前還不錯的實作方式,所以就以這個來做為「窮人版 ELK」的 DSL 實作方案。
DSL 已經把所有轉換的細節都隱藏起來了,工程師只要先自己在 Impala 上撰寫正確的 SQL 指令,其他動作只要把必要欄位填完就可以了。下面是必要欄位的說明:
* SQL:要在 Impala 裡面執行的 SQL 指令,其中有用 ":VAR" 包起來的變數名稱,表示是從 INPUT 欄位取得
* CHART:highcharts 的圖表格式,DSL 目前支援 column (長條圖)、pie (圓餅圖)
* INPUT:這是一個陣列,表示這個變數名稱是從外部操作時取得,另外後面的 "date" 為資料型態,目前支援的類型為 HTML 的 input[type]
* OUTPUT:產生 PNG 圖檔時的欄位資訊,如 X 軸是從 Impala 的哪個欄位取得,顯示在圖表上的名稱要叫什麼
至於轉換細節又是另一件麻煩事,將 DSL 轉成最後的圖檔又經過了不少步驟:
1. js-yaml:雖然說 YAML 很適合拿來做 DSL,但 JSON 還是目前大家最常用的格式。所以當然要先把 YAML 轉成 JSON 這樣才好操作 XD
2. jq:轉換過程中 jq 幫了小編很大的忙,官網寫著這是一套輕量且靈活的命令列 JSON 處理工具。無論要對 JSON 取 key、取 value、取 length、做 group by、做 sort by、if-else、while-loop 都可以,就是很強大。所以小編就拿這個將 YAML 轉換完的 JSON,用一堆奇怪的語法把資料轉換成功。
其實在轉換過程最麻煩的不是操作 JSON,最麻煩的在小編不太會寫 bash script 啊!!!尤其是一堆變數轉換的過程,一下子用 ${},一下子用 $(),還有 ${[$k]} 的這種寫法,看了頭好痛 Orz
最後把 jq 轉完的資料丟給前一篇提到的那些工具,就可以完美把 PNG 圖檔產生出來了,第二篇的「窮人版 ELK」文章到此也就結束了。其實這個專案還有另一個跟圖表無關的功能,那就是即時觀看 API 發送歷程,如果有第三篇的話再來分享一下好了。
* 如何實作「窮人版 ELK」:https://www.facebook.com/kewang.information/posts/2085843121692051
* 如何使用 MSON 的幾個方向:https://www.facebook.com/kewang.information/posts/1940647046211660
* jq:https://stedolan.github.io/jq
#mson #dsl #yaml #json #jq
json轉png 在 Kewang 的資訊進化論 Facebook 的精選貼文
小編最近一直用 Impala 在分析產品的 API log,雖然有下 SQL 做了一些圖表 (DAU, MAU) 出來,但如果要讓非資訊人員自己下指令產生這些圖表的話,真的是會要了他們老命。尤其這些圖表如果是要給 PM、行銷看的話,每隔幾天就要叫工程師跑圖表,工程師真的會累死 Orz。
雖然有 ELK 這種整套都弄好好的系統,但這種系統還是工程師比較知道如何操作。小編想了一下,自己寫一套讓大家一鍵產生圖表還比較方便,於是就花了兩三天做了這個「窮人版 ELK」。
本來小編是想直接用 Cloudera HUE 產出來的圖表拿來處理,但因為 HUE 的報表是用 D3 產生出來的,所以如果真要跟 HUE 串接的話,除了 auth 那段要解決之外,還要處理 D3 產出來的互動式圖表。看了一下實在太花功夫,所以小編就放棄這段,直接重頭開始刻。
這次開發用了下面幾套工具,一直 pipe 來 pipe 去的,小編頭都快昏了 Orz。如果要跟數據打交道的話,真的要好好學一下 Linux 上的各種文字處理工具:
1. impala-shell:用 Impala 下 SQL 指令,將資料拉回來,參數 -B 可以將結果產生成 CSV 格式
2. csv2json:因為這次用的圖表工具只吃 JSON 格式,所以先將資料從 CSV 轉為 JSON,才能繼續下一步
3. json2highcharts:自己開發的程式,因為小編這次用的圖表工具 highcharts,無論是資料或設定檔 (像是顯示直條圖或折線圖) 都是 JSON 格式,所以要把這些資料跟設定檔轉成 highcharts 能吃的格式,所以又做了一次 JSON 轉換
4. highcharts-export-server:最後一步就是要呼叫產生圖表的工具了,小編找了蠻多的能在 command line 執行的圖表工具,有要裝 cairo 的,有要裝 png lib 的,還有一些要重頭 make 的,實在都太麻煩。後來看到這套是使用 phantomjs,直接跑 browser render,雖然肥了一點但不用管 dependency 就是爽 XDD
把這 4 步都執行完之後就會產生圖表了。但為了方便之後產生新類型的圖表,小編打算只要讓工程師把寫好的 DSL 丟到 server 上,非資訊人員就可以直接用網頁操作了。下一篇再來講如何開發 DSL 好了 (又是一連串的文字處理 Orz)。
* backend-log-explorer:https://github.com/mitaketw/backend-log-explorer
* 想了解在執行 Impala 之前,這些資料做了什麼處理嗎?推薦強者小編同事的文章:https://www.facebook.com/groups/616369245163622/permalink/1329521563848383/
#log #impala #highcharts #elk #資料分析