如何掌握GCP各台主機的成本?利用BigQuery的Label語法教學

如何掌握GCP各台主機的成本?利用BigQuery的Label語法教學
如何掌握GCP各台主機的成本?part2 - 利用BigQuery的Label語法教學

自從上次分享如何設定Label之後,開始得到許多用戶熱列的反饋(敲碗)……

然後呢?然後呢?然後呢?好像只寫一半啊!

是的,因為設定label之後的那一刻,才開始用label來記錄成本,當下無法看結果,要等到幾天後才有一些成本相關的數據做分析喔!

原先設定

現在我們來看一下結果。首先我上次的設定是:

設定GCP VM的Label 範例
設定GCP VM的Label 範例

PS.如果只要看整台機器的錢,不把disk分開,那disk的label value直接取名vm1就可以,到時候它會sum起來。

然後設定匯出帳單到BigQuery的Dataset,這次寫文章時是匯到另一個Dataset,先確定此功能是一直在運作的,代表每天發生的成本都有寫進”Data_Studio”這個Dataset。(Data_Studio只是取的名字, 本文尚未介紹該產品)

GCP帳單匯出到BigQuery的確認畫面
GCP帳單匯出到BigQuery的確認畫面

接著直接進到BigQuery找找看這個Dataset有沒有Billing相關的Table,果然看到了,表示這張Table有在記錄成本,而其中的labels就是我們要分析的欄位了!

初步結果

我們先下個簡單的Query:

SELECT * FROM seminar-and-workshop.Data_Studio.gcp_billing_export_v1_014FED_3121B3_421B27
WHERE project.id = “seminar-and-workshop”
and labels is not null and
DATE(_PARTITIONTIME) between “2020-05-01” and “2020-05-02”

因為我只要看有label的資料,所以用 labels is not null來過濾。

另外我測試label只開了2天機器,所以用 DATE(_PARTITIONTIME) 挑出這兩天的資料來分析。附帶提一下,因為BigQuery可以用Partition的方式做table,這樣select該欄位就不會Query全部資料,浪費成本。

結果如下:

從BigQuery撈出自訂lable的資料
從BigQuery撈出自訂lable的資料

看到我們自訂的label上去了,同時你也看到有good-gke-volume這個label,這是GKE系統內建的key,很多GCP的服務會自動建label,如果沒有要分析它們,就不用處理沒關係。

但是,這些資料是每日明細,非常細的資料無法直接看出成本,所以要用語法來加總它們。

查詢label為AP的成本

首先,如果我們只看標籤有AP的所有成本,語法如下:

SELECT
labels.key AS key,
SUM(cost) AS cost
FROM
seminar-and-workshop.Data_Studio.gcp_billing_export_v1_014FED_3121B3_421B27
LEFT JOIN UNNEST(labels) AS labels
ON labels.key = “ap”
WHERE
project.id = “seminar-and-workshop”
AND labels IS NOT NULL
AND DATE(_PARTITIONTIME) BETWEEN “2020-05-01”
AND “2020-05-02”
GROUP BY key

語法解釋:

  1. labels.key AS key,用別名,這樣後面GROUP BY時,比較不會有語法錯誤。

2. From Table的時候,因為project id有”-“,所以前後必須要用單引號,才不會出錯。

3. 這個Table是巢狀的,不能單純用where條件直接下 labels.key = “ap”,必須要用LEFT JOIN,重要!

4. 最後因為只用key的值ap來加總,所以只用Group by key,如果你要一次select很多欄位,那記得你select多少欄位,就要group by多少欄位喔!

我們來看一下結果:

BigQuery撈出label為ap的成本
BigQuery撈出label為ap的成本

所有標記為AP的成本,是0.8左右。

查詢每一台機器的成本

那如果要看單台主機呢?語法如下:

SELECT labels.key as key,
labels.value as value,
sum(cost) as cost
FROM seminar-and-workshop.Data_Studio.gcp_billing_export_v1_014FED_3121B3_421B27
LEFT JOIN UNNEST(labels) as labels
ON labels.key = “ap”
WHERE project.id = “seminar-and-workshop”
and labels is not null
and DATE(_PARTITIONTIME)
between “2020-05-01” and “2020-05-02”
GROUP BY key, value
order by value

用BigQuery撈出單台主機的成本
用BigQuery撈出單台主機的成本

先插一下話,你有看到右邊它只Query 402 KB吧,它真的是partition table,原本整張table是116MB,但是因為切日期Query,所以不會整個table query,很省錢吧!

回過頭來,我們看到VM1的主機大概是0.41元,它的Disk vm1-hdd1是0.009元。你可能會想說,為什麼不合併在一起?

可以啊,前面有提過,你只要回去disk的table,把vm1-hdd1也改成vm1,它就合併在一起了。

其實”project id”,你可以視情況要不要下,如果你的billing account只有一個project,那就不用下。

“label is not null”也不需要下。

2020/8/20 更新:主機出去的網路流量呢?

有的,我們再把語法多加入一欄sku.desciription, 更新部分如紅字:

SELECT labels.key as key, labels.value as value, sku.description,
sum(cost) as cost
FROM seminar-and-workshop.Data_Studio.gcp_billing_export_v1_014FED_3121B3_421B27
LEFT JOIN UNNEST(labels) as labels
ON labels.key = “aaron”
WHERE project.id = “seminar-and-workshop”
and labels is not null
and DATE(_PARTITIONTIME)
between “2020-07-01” and “2020-08-19”
GROUP BY key, value, sku.description
order by value

可以查到這台機器相關的費用明細。

也有人問到,如果是IP位址,會算在同一台嗎?有的,如下圖第8筆record。

(在靜態IP的頁面有Label的欄位,但目前似乎尚未開放編輯,所以目前不需要去那裡設定,Label加在VM上就會計網路流量)

就這樣嗎?

其實還有最後一招不用 Query啦!還吊大家胃口是怎樣?

隱藏密技

在GCP Console上,我們直接去Billing的Report就可以看到了:

直接在Billing Report看到Label的成本
直接在Billing Report看到Label的成本

右邊的Group by先選擇Group by Lable key,裡面選ap。

中間就立即反應所有ap相關的成本了,還幫你畫圖表,多貼心啊!

其實我本來要做到Data Studio畫成精美的報表分析,所以Dataset才取名Data Studio,可知我用心良苦啊!沒想到label分析功能早就已經被Google做掉了!!(寫心酸的)

這樣也好,大家以後就可以輕鬆看成本囉!!

PS.BigQuery和Report的時間計算基準有點不同,所以會有誤差,BigQuery還是可以參考。

後來想想,其實label這東西,可以規範一個命名原則,請同事每次開機器都自己設定好,例如Aaron開的機器,都叫做aaron-01, aaron-02…, 這樣隨時要查成本,直接進Report不就看到每一台機器的價錢了嗎?簡單一個動作就達成了,用習慣就很方便。

如果要參考原始文件,可以看這裡喔!

發佈留言