prometheus官方教程
說明:
感冒了,寫點總結不浪費時間,聲明不會扯出來任何的私有代碼,畢竟要保密,只會講prometheus的官方有的,以及那些開源的代碼方法,例如prometheus客戶端代方法,代碼
工作中遇到了metrics相關任務,之前沒有學過,趁著任務需求,就學了一點
prometheus 有四種指標的,但是沒有一種指標類型可以是數組類型
而我的需求就是很需要這個數組類型
但是這四種指標類型沒有數組類型是很合理的,畢竟數組怎么當指標呢?
不過話說回來,即便當前的任務對我很難(畢竟一無所知對prometheus),但是該完成任務還要完成任務,學就完事了
任務:
給指標添加——事項id,為了dis
簡單分析一下不難發現,我們目前的指標有
個人效能——就是事項,例如bug數量,需求數量,任務數量等
代碼貢獻——例如代碼增加/減少行數,文件修改數目,commit個數
項目報表——項目緯度的功能點,bug,task,requirement 個數等
那么以個人效能來說,單位是人,這個人有什么指標呢?就是例如有一個bug總數,這個指標對應的事項id是什么?
忘了說了事項——就是需求(requirement),任務(task),缺陷(bug)
所以這個bug總數指標對應的事項id不可能是一個,而是很多個,因為bug總數,代表的是所有bug,每個bug都是一個事項,都有一個事項id,所以,這個bug總數是幾,他對應的事項id就有幾個,就是一個id數組
首先先吐槽一下,這個任務真的挺雞肋的,為了dis,就是比較
但是又不得不說,他有難度,是個男點,畢竟四個指標類型都沒有數組
解決方案:
方案一:直接寫一個prometheus對象,collect出來指標——id數組,返回,結果返回方法沒有這種指標類型
//注冊一個指標對象
registry := prometheus.NewRegistry()
registry.MustRegister(對象(例如a))func NewMetricWithTimestamp(t time.Time, m Metric) Metric
prometheus.NewMetricWithTimestamp(t time.Time,MustNewConstMetric(desc *Desc, valueType ValueType, value float64, labelValues ...string) Metric,
)
// 對就是 MustNewConstMetric 方法里的第三個參數只能接受float64類型的
// 另外就是去找了其他類型的,都沒有找到數組類型的a.Register.Add(http.MethodGet, "/url", func(w http.ResponseWriter, r *http.Request) {promhttp.HandlerFor(registry, promhttp.HandlerOpts{}).ServeHTTP(w, r)
})
//當調用了 /url 接口,就會走這個http請求,轉發到promhttp去調用collect,但是我并沒有看出來是如何返回指標的,應該是NewMetricWithTimestamp 這個函數有什么操作
//但是源碼只有一行:Collect(chan<- Metric),也不知道嗯干嘛的,但總之是返回了指標數據
所以方案一不行了…
方案二:
還在構建思索中
目前大體思路是這樣:
能否從概念入手,指標名作為key,本來的value是float64類型的一個值,但在這中間還有一個label呢!,記錄的是這個人的信息,例如人名,id,項目名,項目id,組織id。
而我在label中加一個id數組,這樣就不必是指標類型了
把label中的id數組,想像成value即可,畢竟這整體還是一個指標,是一個完整的
接著在另一個項目就可以去拿到這指標,處理一下,做一下關聯,存儲到clickhouse,給項目a用
哦對了,講一下背景:
整體原本的思路和邏輯是這樣的,項目a,計算采集指標放在etcd,放的是每天的指標,同時有暴露接口能給項目b調用
項目a通過查詢clickhouse拿到當前的指標
我曾經疑我們的mysql有幾個?有一個,那怎么主從同步,怎么解決高并發,數據庫崩了等等問題,然后看到了rds,原來用的是阿里云的rds云數據庫服務啊,專業的事交給了專業的人去做了,clickhouse有四個
后續有進展持續更新