使用 Vector 將 PostgreSQL 日志輸出為 Prometheus 指標(biāo)
?本文討論使用日志作為數(shù)據(jù)源生成 Prometheus 指標(biāo)。如果現(xiàn)有 exporters 提供的指標(biāo)無(wú)法滿足需求,或者 exporter 因授權(quán)原因無(wú)法對(duì)外公開(kāi),則可以參考本文提供的方式。
寫本文的原因是,我們的一位客戶希望能夠及時(shí)獲取有關(guān)從應(yīng)用程序到 PostgreSQL v14 數(shù)據(jù)庫(kù)的失敗查詢的信息。同時(shí),我們必須在不對(duì)應(yīng)用程序代碼進(jìn)行任何更改的情況下實(shí)現(xiàn)此監(jiān)控。在查看現(xiàn)有的 PostgreSQL exporter后,我們未能找到任何能夠發(fā)送錯(cuò)誤報(bào)告的合適指標(biāo),因此我們決定自己新建一個(gè)。
1.準(zhǔn)備日志以供進(jìn)一步使用
從技術(shù)角度來(lái)看,步驟大致為:解析日志文件、從數(shù)據(jù)中提取指標(biāo)、將其輸出到 Prometheus 以及設(shè)置告警。早期的 PostgreSQL 版本(15 版本之前)不支持 JSON 結(jié)構(gòu)化日志格式。在生產(chǎn)環(huán)境中安裝第三方模塊并不推薦,我們也與推薦以 CSV 格式存儲(chǔ)日志數(shù)據(jù)。但是,我們能夠根據(jù)需要使用配置文件來(lái)格式化輸出。我們的客戶使用了以下日志格式:
描述如下:
- %m是一個(gè)時(shí)間戳,包括毫秒;
- %p– 進(jìn)程號(hào);
- %u- 用戶名;
- %d- 數(shù)據(jù)庫(kù)名稱。
有關(guān)其他變量的用途以及可以寫入日志的其他信息的更多信息,請(qǐng)參閱 PostgreSQL 文檔
(https://www.postgresql.org/docs/14/runtime-config-logging.html)。
結(jié)果如下:
2.尋找最佳解決方案
我們嘗試了 fluentd (https://docs.fluentd.org/?) 、 Promtail (https://grafana.com/docs/loki/latest/clients/promtail/?) 和 exporter (https://vector.dev/docs/) 從日志中檢索指標(biāo)并將它們發(fā)送到 Prometheus。
Fluentd 有一個(gè)廣泛的插件系統(tǒng)來(lái)適應(yīng)所有用例。例如, fluent-plugin-prometheus (https://github.com/fluent/fluent-plugin-prometheus) 將數(shù)據(jù)轉(zhuǎn)換為指標(biāo)格式并將其交付給 Prometheus。然而,自從發(fā)布 v2.0.0 以來(lái),該項(xiàng)目發(fā)展緩慢。出于這個(gè)原因,我們這次決定換一種方式——盡管我們真的很喜歡 fluentd 并且經(jīng)常使用它。
我們嘗試的第一個(gè)工具是 Promtail。它具有解析文本日志(包括多行日志)、基于任務(wù)處理它們(包括提取指標(biāo))以及基于指定參數(shù)過(guò)濾內(nèi)容的能力。
為了進(jìn)行測(cè)試,我們創(chuàng)建了一個(gè)配置文件來(lái)計(jì)算日志行數(shù)。
這是日志處理階段的示例:
配置工作正常;然而,我們錯(cuò)過(guò)了一個(gè)關(guān)鍵點(diǎn)。Promtail需要Loki(Grafana開(kāi)發(fā)的日志聚合工具)的地址作為強(qiáng)制配置參數(shù)。沒(méi)有這個(gè)參數(shù)集,它根本不會(huì)啟動(dòng)。我們認(rèn)為同時(shí)安裝 Loki 是不切實(shí)際的。
注意。如果您仍然想使用 Promtail,您可以將 Loki 地址替換為任何能夠?yàn)槿魏握?qǐng)求提供 200 響應(yīng)代碼的 Web 服務(wù)器(例如,nginx)的地址。但是,我們不建議在生產(chǎn)環(huán)境中使用此解決方法。
終于輪到 Vector 了。這對(duì)我們來(lái)說(shuō)效果很不錯(cuò)。
3.Vector:解析日志并輸出到 Prometheus
Vector 必須安裝在要解析的日志文件所在的主機(jī)上,以便將日志輸出到 Prometheus。安裝完成后,進(jìn)行相應(yīng)的配置。你可以使用,例如,Ansible 來(lái)做到這一點(diǎn):
Vector 配置存儲(chǔ)在 TOML 文件中。在此文件中指定日志文件的位置及其類型:
請(qǐng)注意,halt_before?mode 意味著 Vector 會(huì)將跟在condition_pattern(并且不以后者開(kāi)頭)之后的所有行視為單個(gè)消息。
您也可以使用其他multiline.mode?值。例如,該half_with?模式包括所有連續(xù)的行,直到并包括與condition_pattern消息中匹配的第一行。
然后使用VRL (https://vector.dev/docs/reference/vrl) 解析消息:
在這里,我們:
- 指定日志源;
- 設(shè)置一個(gè)正則表達(dá)式來(lái)解析日志消息;
- 刪除了不必要的字段;
- 使用“,”分隔符拆分消息;
- 將結(jié)果保存到map數(shù)組中,對(duì)其進(jìn)行處理,并獲得 JSON 輸出,以便我們可以繼續(xù)操作其字段。
現(xiàn)在讓我們過(guò)濾掉錯(cuò)誤消息:
此配置將在指標(biāo)中包含ERROR和FATAL消息。
接下來(lái),根據(jù)過(guò)濾的日志消息創(chuàng)建一個(gè)指標(biāo)。設(shè)置要使用的指標(biāo)類型和字段,適當(dāng)?shù)孛?,并附加額外的標(biāo)簽。
最后一步是發(fā)布 exporter。Prometheus 將使用它來(lái)抓取指標(biāo)。
4.根據(jù)檢索到的指標(biāo)設(shè)置警報(bào)
為了讓 Prometheus 能夠從新 exporter 器中抓取指標(biāo),我們現(xiàn)在必須設(shè)置常規(guī)目標(biāo):
下一步是創(chuàng)建基于指標(biāo)的規(guī)則,Alertmanager 將根據(jù)其路由設(shè)置處理該規(guī)則:
pg_log_error_total這里計(jì)算向量時(shí)間序列30分鐘的增量。其值大于零意味著計(jì)數(shù)器已更改,從而導(dǎo)致向用戶發(fā)送警報(bào)。然后用戶可以檢查 PostgreSQL 日志以找出問(wèn)題的原因。
5.結(jié)論
因此,我們使用了一個(gè)簡(jiǎn)單的錯(cuò)誤計(jì)數(shù)器來(lái)說(shuō)明如何根據(jù)日志文件設(shè)置指標(biāo)收集。如果現(xiàn)有的 exporter 沒(méi)有提供我們想要的指標(biāo),并且沒(méi)有辦法更改應(yīng)用程序代碼,這可以作為一個(gè)相對(duì)簡(jiǎn)單的解決方案。
我們的選擇受到 Vector 的簡(jiǎn)單配置和廣泛功能的影響,使其成為各種任務(wù)的理想選擇。此外,其高性能 (https://medium.com/ibm-cloud/log-collectors-performance-benchmarking-8c5218a08fea) 意味著可用資源得到有效利用。vector top Cli工具有助于調(diào)試日志管道和查看 Vector 的指標(biāo)。它在漂亮的 TUI 界面中顯示信息。
Vector 不僅限于基本的計(jì)數(shù)器功能——它還可以解析日志以查找緩慢的數(shù)據(jù)庫(kù)查詢。然后,您可以使用 VRL 處理結(jié)果,聚合 (https://vector.dev/docs/reference/configuration/transforms/aggregate/) 它們,將它們轉(zhuǎn)換為指標(biāo),然后顯示 Grafana 中排名前 10 位的查詢。它還可以通過(guò)處理連接日志和根據(jù)獲得的數(shù)據(jù)創(chuàng)建指標(biāo)來(lái)證明對(duì)安全審計(jì)很有用。換句話說(shuō),Vector 有很多的應(yīng)用場(chǎng)景——這完全取決于用戶的需求。
原文:https://blog.palark.com/vector-to-export-pgsql-logs-into-prometheus/?