Loki 告警的正確姿勢
小白之前有通過Grafana設(shè)置Loki數(shù)據(jù)源的騷操作來做日志告警,雖然能直接在Grafana面板上配置告警,但它們還是沒辦法集中維護和管理。小白前面介紹了那么多關(guān)于Loki的文章,那么它有沒有像Prometheus一樣的rules來管理策略呢?答案是肯定的!
根據(jù)Loki的RoadMap,Ruler組件將于Loki 1.7.0版本正式推出。那么小白今天先帶大家嘗嘗鮮,體驗下在Loki里日志告警的正確姿勢。
Loki Ruler
Loki1.7將包含一個名為Ruler的組件,它是從Crotex項目里面引入進來的(還記得Loki分集群的架構(gòu)嗎?)Ruler的主要功能是持續(xù)查詢rules規(guī)則,并將超過閾值的事件推送給Alert-Manager或者其他Webhook服務(wù)。
結(jié)合Cortex,Loki的Ruler組件也是如上的架構(gòu)。可以看到loki和cortex的架構(gòu)主要區(qū)別只剩下Configs API了。?不過,牛逼的是借助注冊到consul的一致性hash環(huán),Loki的ruler同樣支持多實例的分布式部署,實例和實例之間會自己根據(jù)分片協(xié)調(diào)需要使用的rules。不過這是一個動態(tài)的過程,任何ruler實例的添加或刪除都會導(dǎo)致rules的重新分片。
當(dāng)前啟用Loki的ruler組件比較簡單,只要將下列的相關(guān)配置引入,并在Loki啟動的參數(shù)里面加入-target=ruler即可。
ruler:
# 觸發(fā)告警事件后的回調(diào)查詢地址
# 如果用grafana的話就配置成grafana/explore
external_url:
# alertmanager地址
alertmanager_url:
enable_alertmanager_v2: true
# 啟用loki rules API
enable_api: true
# 對rules分片,支持ruler多實例
enable_sharding: true
# ruler服務(wù)的一致性哈希環(huán)配置,用于支持多實例和分片
ring:
kvstore:
consul:
host: :8500
store: consul
# rules臨時規(guī)則文件存儲路徑
rule_path: /tmp/rules
# rules規(guī)則存儲
# 主要支持本地存儲(local)和對象文件系統(tǒng)(azure, gcs, s3, swift)
storage:
type: local
local:
directory: /loki/rules
# rules規(guī)則加載時間
flush_period: 1m
想快速體驗Ruler的同學(xué),可以用小白之前docker-compose來部署demo
https://github.com/CloudXiaobai/loki-cluster-deploy/tree/master/demo/docker-compose
Alert配置
Loki的rulers規(guī)則和結(jié)構(gòu)與Prometheus完全兼容,唯一的區(qū)別在于查詢語句不同。在Loki中我們用logQL來查詢?nèi)罩局笜?biāo)。一個典型的rules配置說明如下:
groups:
# 組名稱
- name:
rules:
# Alert名稱
- alert:
# logQL查詢語句
expr:
# 產(chǎn)生告警的持續(xù)時間
pending.
[ for: | default = 0s ]
# 自定義告警事件的label
labels:
[ : ]
# 告警時間的注釋
annotations:
[ : ]
舉個栗子,如果小白想通過日志查到某個業(yè)務(wù)日志的錯誤率大于5%就觸發(fā)告警,那么可以配置成這樣:
groups:
- name: should_fire
rules:
- alert: HighPercentageError
expr: |
sum(rate({app="foo", env="production"} |= "error" [5m])) by (job)
/
sum(rate({app="foo", env="production"}[5m])) by (job)
> 0.05
for: 10m
labels:
severity: page
annotations:
summary: High request latency
當(dāng)告警事件產(chǎn)生時,我們在alert-manager上就能收到該事件的推送。
Ruler用途
還沒用metrics做應(yīng)用監(jiān)控告警時
對于有些業(yè)務(wù)可能沒有暴露自己程序運行時的metrics時,這個時候我們可以借助查詢?nèi)罩镜姆椒ㄈ?gòu)建相關(guān)的指標(biāo)告警是比較容易的。比如上面提到的應(yīng)用錯誤率的告警。
黑匣子監(jiān)控
對于完全不受我們控制的應(yīng)用(開源服務(wù)或者三方閉源產(chǎn)品),在他們不提供監(jiān)控指標(biāo)時,我們采用查詢?nèi)罩局笜?biāo)的方式不失為一個快速的方法。
下面這個就是某大佬利用nginx日志和logQL做的監(jiān)控和告警大盤,簡直不要太炫酷。

響應(yīng)應(yīng)用的事件
對于有些應(yīng)用的特殊的事件,我們也可以利用Loki的ruler來做相關(guān)的通知,比如檢查日志中的base auth認證泄漏事件
- name: credentials_leak
rules:
- alert: http-credentials-leaked
annotations:
message: "{{ $labels.job }} is leaking http basic auth credentials."
expr: 'sum by (cluster, job, pod) (count_over_time({namespace="prod"} |~ "http(s?)://(\\w+):(\\w+)@" [5m]) > 0)'
for: 10m
labels:
severity: critical
High-Cardinality高基告警
看過小白之前《Loki最佳實踐》的同學(xué)知道,在Loki中high-cardinality會嚴(yán)重拖慢查詢效率。這部分查詢會在接下來的LogQL v2語法中實現(xiàn)。
K8S進階訓(xùn)練營,點擊下方圖片了解詳情

