輕量級(jí)日志平臺(tái) Loki 2.3 發(fā)布: 15 倍最近數(shù)據(jù)查詢(xún)速度提升
一、前言
Loki v2.3.0 中添加了出色的新功能,進(jìn)行了 bug 修復(fù)。除此之外,性能也得到了提升。雖然我們一直很低調(diào),但我們是真的很忙!
二、自定義保留規(guī)則
Loki 中的保留對(duì)于集群來(lái)說(shuō)一直是全局的,并推遲到底層對(duì)象存儲(chǔ)。
Loki 現(xiàn)在可以通過(guò) Compactor 組件處理保留。你可以配置每個(gè)租戶(hù)和每個(gè)流的保留時(shí)間。這些不同的保留配置允許你以更精細(xì)的方式控制存儲(chǔ)成本并滿(mǎn)足安全性和合規(guī)性要求。使用 Loki 現(xiàn)有的配置覆蓋機(jī)制完成配置:

閱讀 Loki 存儲(chǔ)保留文檔[1]了解更多信息。
三、日志刪除
Loki 現(xiàn)在支持在指定的時(shí)間范圍刪除選定日志流條目。
與自定義保留功能一樣,通過(guò) Compactor 組件支持刪除。Compactor 公開(kāi)用于刪除任務(wù)的 API 端點(diǎn)。存在用于請(qǐng)求刪除、列出現(xiàn)有刪除請(qǐng)求及其狀態(tài)以及取消掛起的刪除請(qǐng)求的端點(diǎn)。
此功能的初始實(shí)現(xiàn)支持刪除截至當(dāng)前時(shí)間 - 24 小時(shí)的數(shù)據(jù)(你不能刪除過(guò)去 24 小時(shí)內(nèi)的數(shù)據(jù))。此實(shí)現(xiàn)的主要要求是確保 Loki 可以始終遵守刪除個(gè)人信息的請(qǐng)求??梢詣h除截至當(dāng)前時(shí)間的數(shù)據(jù),但更復(fù)雜。我們將來(lái)可能會(huì)迭代此功能以添加此類(lèi)功能。
此功能是實(shí)驗(yàn)性的,僅支持BoltDB 托管索引存儲(chǔ)[2]。你可以在日志條目刪除文檔中[3]了解有關(guān)此功能的更多信息。
四、錄制規(guī)則
Loki 現(xiàn)在支持 Prometheus 風(fēng)格的錄制規(guī)則。錄制規(guī)則使你能夠定期對(duì)日志進(jìn)行指標(biāo)查詢(xún),將結(jié)果指標(biāo)發(fā)送到 Prometheus[4] 和 Prometheus 兼容的系統(tǒng)例如 Cortex 和 Thanos。
錄制規(guī)則的一個(gè)引人注目的用例是用于:無(wú)法通過(guò)檢測(cè)來(lái)發(fā)送 Prometheus metrics 指標(biāo)的軟件。僅使用日志,你就可以創(chuàng)建 metrics 指標(biāo)!
我們一直在嘗試從 Loki 的 metrics.go 日志行創(chuàng)建每個(gè)租戶(hù) (org_id) 指標(biāo),該行輸出大量單獨(dú)的查詢(xún)統(tǒng)計(jì)信息。
這也可以通過(guò) Prometheus 和直方圖來(lái)完成,但這種方法的一個(gè)優(yōu)點(diǎn)是我們不需要生成具有租戶(hù)標(biāo)簽維度的直方圖,因此它減少了 Prometheus 中存儲(chǔ)的系列數(shù)量。每個(gè)租戶(hù)只生成一個(gè)系列,而不是每個(gè)租戶(hù)生成一個(gè)系列乘以直方圖中的桶數(shù)。Prometheus 中的記錄規(guī)則也可以實(shí)現(xiàn)相同的減少到每個(gè)租戶(hù)一個(gè)系列的效果,但在某些情況下,這種方法可能更適合你。
此功能是實(shí)驗(yàn)性的。有關(guān)更多詳細(xì)信息,請(qǐng)參閱錄制規(guī)則文檔[5]。
五、模式解析器
使用新的模式解析器,編寫(xiě) LogQL 查詢(xún)以提取非結(jié)構(gòu)化日志的標(biāo)簽變得更快、更容易。使用模式解析器,你可以避免編寫(xiě)繁瑣的正則表達(dá)式,尤其是對(duì)于由文字和空格分隔的標(biāo)記形成的常見(jiàn)日志格式。
考慮這個(gè) NGINX 日志行:
0.191.12.2 - - [10/Jun/2021:09:14:29 +0000] "GET /api/plugins/versioncheck HTTP/1.1" 200 2 "-" "Go-http-client/2.0" "13.76.247.102, 34.120.177.193" "TLSv1.2" "US" ""
可以使用模式解析器表達(dá)式解析此日志行:
<ip> - - <_> "<method> <uri> <_>" <status> <size> <_> "<agent>" <_>
它提取這些字段:
"ip" => "0.191.12.2"
"method" => "GET"
"uri" => "/api/plugins/versioncheck"
"status" => "200"
"size" => "2"
"agent" => "Go-http-client/2.0"
要了解有關(guān)語(yǔ)法的更多信息,請(qǐng)參閱 LogQL 文檔[6]。
六、分片攝取器
Loki 中的分片是查詢(xún)前端用于拆分查詢(xún)以進(jìn)行并行計(jì)算的技術(shù)。在 v2.3.0 之前,未對(duì)最近的數(shù)據(jù)應(yīng)用分片。使用分片攝取,所有時(shí)間范圍都是并行化的。
**分片提高了性能:我們的環(huán)境從 ~1GB/s 的搜索速度躍升至 ~15GB/s。**它應(yīng)該提高對(duì)大量流或具有大量數(shù)據(jù)的流的近期數(shù)據(jù)查詢(xún)的搜索性能。
舉個(gè)例子,看看從我們的 NGINX 入口控制器查詢(xún)最后一小時(shí)的數(shù)據(jù)時(shí)的差異,它每小時(shí)記錄大約 90GB:在攝取分片之前:
? logcli query '{container="ingress-nginx"} |= "trytofindme!!!"' --since=1h --stats 2>&1 | grep Summary
Summary.BytesProcessedPerSecond 784 MB
Summary.LinesProcessedPerSecond 1263304
Summary.TotalBytesProcessed 88 GB
Summary.TotalLinesProcessed 141420028
Summary.ExecTime 1m51.944531908s
攝取分片后:
? logcli query '{container="ingress-nginx"} |= "trytofindme!!!"' --since=1h --stats 2>&1 | grep Summary
Summary.BytesProcessedPerSecond 15 GB
Summary.LinesProcessedPerSecond 24171034
Summary.TotalBytesProcessed 88 GB
Summary.TotalLinesProcessed 142086646
Summary.ExecTime 5.878385063s
Ingester 分片默認(rèn)處于啟用狀態(tài),但僅當(dāng)你運(yùn)行一個(gè)查詢(xún)前端組件負(fù)責(zé)創(chuàng)建發(fā)送到 ingesters 的拆分和分片時(shí)才會(huì)生效。
七、LogQL IP 地址匹配
對(duì)于想要對(duì)包含 IP 地址的日志進(jìn)行更復(fù)雜過(guò)濾的任何人,LogQL 已經(jīng)學(xué)習(xí)了許多新技巧來(lái)幫助你。
語(yǔ)法如下:ip("<pattern>"). <pattern> 可以是:
單個(gè) IP 地址。例子: ip("192.0.2.0"),ip("::1")IP 地址內(nèi)的一個(gè)范圍。示例: ip("192.168.0.1-192.189.10.12"),ip("2001:db8::1-2001:db8::8")CIDR 規(guī)范。示例: ip("192.51.100.0/24")、ip("2001:db8::/32")
這允許你執(zhí)行以下操作:返回匹配特定 IP 的日志行
{container="nginx"} |= ip("192.168.4.5")
返回不包括 IP 范圍的日志行
{container="nginx"} != ip("192.168.4.1-192.168.4.10")
返回匹配特定子網(wǎng)的日志行
{container="nginx"} |= ip("192.168.4.0/24")
在LogQL 文檔中[7]了解有關(guān)語(yǔ)法的更多信息[8]。
八、擴(kuò)展閱讀
Spring boot 微服務(wù)組件 mica 中的 mica-logging 組件支持 json 日志收集到 loki,也支持日志直接批量發(fā)送到 loki,歡迎試用。
參考資料
Loki 存儲(chǔ)保留文檔: https://grafana.com/docs/loki/latest/operations/storage/retention/#retention-configuration
[2]BoltDB 托管索引存儲(chǔ): https://grafana.com/docs/loki/latest/operations/storage/boltdb-shipper/
[3]日志條目刪除文檔中: https://grafana.com/docs/loki/latest/operations/storage/logs-deletion/
[4]Prometheus: http://grafana.com/oss/prometheus/
[5]錄制規(guī)則文檔: https://grafana.com/docs/loki/latest/rules/#recording-rules
[6]LogQL 文檔: https://grafana.com/docs/loki/latest/logql/#pattern
[7]LogQL 文檔中: https://grafana.com/docs/loki/latest/logql/ip
[8]更多信息: https://grafana.com/docs/loki/latest/logql/ip
