Loki告警的正確姿勢(shì)

image.png

小白之前有通過(guò)Grafana設(shè)置Loki數(shù)據(jù)源的騷操作來(lái)做日志告警,雖然能直接在Grafana面板上配置告警,當(dāng)它們還是沒辦法集中維護(hù)和管理。小白前面介紹了那么多關(guān)于Loki的文章,那么它有沒有像Promethues一樣的rules來(lái)管理策略呢?答案是肯定的!

根據(jù)Loki的RoadMap,Ruler組件將于Loki 1.7.0版本正式推出。那么小白今天先帶大家嘗嘗鮮,體驗(yàn)下在Loki里日志告警的正確姿勢(shì)。

Loki Ruler

Loki1.7將包含一個(gè)名為Ruler的組件,它是從Crotex項(xiàng)目里面引入進(jìn)來(lái)的(還記得Loki分集群的架構(gòu)嗎?)Ruler的主要功能是持續(xù)查詢r(jià)ules規(guī)則,并將超過(guò)閾值的事件推送給Alert-Manager或者其他Webhook服務(wù)。


image.png

結(jié)合Cortex,Loki的Ruler組件也是如上的架構(gòu)??梢钥吹絣oki和cortex的架構(gòu)主要區(qū)別只剩下Configs API了。??不過(guò),牛逼的是借助注冊(cè)到consul的一致性hash環(huán),Loki的ruler同樣支持多實(shí)例的分布式部署,實(shí)例和實(shí)例之間會(huì)自己根據(jù)分片協(xié)調(diào)需要使用的rules。不過(guò)這是一個(gè)動(dòng)態(tài)的過(guò)程,任何ruler實(shí)例的添加或刪除都會(huì)導(dǎo)致rules的重新分片

當(dāng)前啟用Loki的ruler組件比較簡(jiǎn)單,只要將下列的相關(guān)配置引入,并在Loki啟動(dòng)的參數(shù)里面加入-target=ruler即可。

ruler:
    # 觸發(fā)告警事件后的回調(diào)查詢地址
    # 如果用grafana的話就配置成grafana/explore
    external_url:
  
    # alertmanager地址 
    alertmanager_url: <alertmanager_endpoint>
    enable_alertmanager_v2: true
  
    # 啟用loki rules API
    enable_api: true
    
    # 對(duì)rules分片,支持ruler多實(shí)例
    enable_sharding: true
  
    # ruler服務(wù)的一致性哈希環(huán)配置,用于支持多實(shí)例和分片
    ring:
        kvstore:
            consul:
                host: <consul-endpoint>:8500
            store: consul
  
    # rules臨時(shí)規(guī)則文件存儲(chǔ)路徑
    rule_path: /tmp/rules
   
    # rules規(guī)則存儲(chǔ)
    # 主要支持本地存儲(chǔ)(local)和對(duì)象文件系統(tǒng)(azure, gcs, s3, swift)
    storage:
      type: local
      local:
        directory: /loki/rules
      
    # rules規(guī)則加載時(shí)間    
    flush_period: 1m

想快速體驗(yàn)Ruler的同學(xué),可以用小白之前docker-compose啟動(dòng)的loki-cluster-deploy來(lái)部署demo

Alert配置

Loki的rulers規(guī)則和結(jié)構(gòu)與Prometheus完全兼容,唯一的區(qū)別在于查詢語(yǔ)句不同。在Loki中我們用logQL來(lái)查詢?nèi)罩局笜?biāo)。一個(gè)典型的rules配置說(shuō)明如下:

groups:
  # 組名稱
  - name: <string>
    rules:
      # Alert名稱
      - alert: <string>
        # logQL查詢語(yǔ)句
        expr: <string>
        # 產(chǎn)生告警的持續(xù)時(shí)間
        pending.
        [ for: <duration> | default = 0s ]
        # 自定義告警事件的label
        labels:
        [ <labelname>: <tmpl_string> ]
        # 告警時(shí)間的注釋
        annotations:
        [ <labelname>: <tmpl_string> ]

舉個(gè)栗子,如果小白想通過(guò)日志查到某個(gè)業(yè)務(wù)日志的錯(cuò)誤率大于5%就處罰告警,那么可以配置成這樣:

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)生時(shí),我們?cè)赼lert-manager上就能收到該事件的推送。


image.png

Ruler用途

  • 還沒用metrics做應(yīng)用監(jiān)控告警時(shí)

對(duì)于有些業(yè)務(wù)可能沒有暴露自己程序運(yùn)行時(shí)的metrics時(shí),這個(gè)時(shí)候我們可以借助查詢?nèi)罩镜姆椒ㄈ?gòu)建相關(guān)的指標(biāo)告警是比較容易的。比如上面提到的應(yīng)用錯(cuò)誤率的告警。

  • 黑匣子監(jiān)控

對(duì)于完全不受我們控制的應(yīng)用(開源服務(wù)或者三方閉源產(chǎn)品),在他們不提供監(jiān)控指標(biāo)時(shí),我們采用查詢?nèi)罩局笜?biāo)的方式不失為一個(gè)快速的方法。

下面這個(gè)就是某大佬利用nginx日志和logQL做的監(jiān)控和告警大盤,簡(jiǎn)直不要太炫酷。


image.png
image.png
  • 響應(yīng)應(yīng)用的事件

對(duì)于有些應(yīng)用的特殊的事件,我們也可以利用Loki的ruler來(lái)做相關(guān)的通知,比如檢查日志中的base auth認(rèn)證泄漏事件

- 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高基告警

看過(guò)小白之前《Loki最佳實(shí)踐》的同學(xué)知道,在Loki中high-cardinality會(huì)嚴(yán)重拖慢查詢效率。這部分查詢會(huì)在接下來(lái)的LogQL v2語(yǔ)法中實(shí)現(xiàn)

關(guān)于云原生小白

云原生小白的創(chuàng)號(hào)目的是將平日里離大家較遠(yuǎn)云原生應(yīng)用以實(shí)用的角度展現(xiàn)出來(lái),站在小白的角度來(lái)看待和使用云原生,并以每篇文章解決一個(gè)實(shí)際問(wèn)題的出發(fā)點(diǎn)帶領(lǐng)大家走進(jìn)云原生。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容