1. 程式人生 > 實用技巧 >採用docker方式安裝ElastAlert,圖形化配置告警規則

採用docker方式安裝ElastAlert,圖形化配置告警規則

注意:這種方式報警採用的是郵件方式,並不包含微信報警方式,因為採用的是國外的docker映象,主要作用是在kibana中安裝配置外掛,圖形化配置rule告警規則,其實就跟直接編輯告警規則類似

1.建立幾個資料夾儲存ElastAlert相關配置資訊,用來掛載到容器中使用

mkdir -p /mnt/elastalert/{config,rules,rule_templates}

之後我們定義路徑: ${ELASTALERT}=/mnt/elastalert=/mnt/elastalert

檔案(夾) 用途
config 存放所有相關配置檔案
rules 存放路由規則
rule_templates (可選)存放規則模板
config.yaml ElastAlert核心配置,配置規則的執行時機、重試、快取等規則。
config.json 配置Docker ElastAlert的啟動引數
rule.yaml 單條規則的詳細配置
smtp_auth.yaml 郵箱smtp認證配置

2.編寫核心配置,建立 ${ELASTALERT}/config/config.yaml用來儲存核心配置:

# 路由規則存放的檔案路徑
rules_folder: rules

# 每間隔run_every時間執行一次
run_every:
#  seconds: 30
  minutes: 1

# ElastAlert使用ES進行過濾查詢的結果將被快取的時間
buffer_time:
  minutes: 15

# 服務連線地址
es_host: 192.168.75.21

# Elasticsearch 埠
es_port: 9200

# Elasticsearch 認證配置
es_username: elastic
es_password: elastic

# ElastAlert預設在ES上建立的索引,由於存放ElastAlert執行日誌
writeback_index: elastalert_status
writeback_alias: elastalert_alerts

# 2天內報警失敗,進行重試
alert_time_limit:
  days: 2

3.ElastAlert的啟動引數配置,建立 ${ELASTALERT}/config/config.json啟動引數配置檔案:

{
  "appName": "elastalert-server",
  "port": 3030,
  "wsport": 3333,
  "elastalertPath": "/opt/elastalert",
  "verbose": true,
  "es_debug": false,
  "debug": false,
  "rulesPath": {
    "relative": true,
    "path": "/rules"
  },
  "templatesPath": {
    "relative": true,
    "path": "/rule_templates"
  },
  "es_host": "192.168.75.21",
  "es_port": 9200,
  "writeback_index": "elastalert_status"
}
引數 用途
elastalertPath 根ElastAlert資料夾的路徑。它是包含“ setup.py”指令碼的資料夾。(容器中的路徑,並不是宿主機的路徑)
verbose 將增加日誌記錄的詳細程度,使您可以檢視有關查詢狀態的資訊。
es_debug ES debug日誌。
debug 不能與verbose同時開啟,verbose符合規則時進行報警,而debug只打印報警日誌。
rulesPath 規則配置檔案存放路徑。
relative 是否使用相對於“elastalertPath”資料夾的路徑。
writeback_index 啟動時建立的用於標識ElastAlert狀態的索引名。

4.編寫一條報警規則
編寫一條,模糊匹配的規則,規則滿足的條件如下:

  • 匹配所有以filebeat-*開頭的ES索引;
  • 匹配索引的message欄位中包含“ERROR”字串,不包含“INFO”和“Read timed out”的日誌;
  • 每分鐘執行一次,5分鐘內與規則匹配的日誌超過1條,觸發郵箱報警;
  • 對5分鐘內符合規則的日誌進行去重;
  • 聚合5分鐘內所有報警資訊,5分鐘後統一觸發報警器。

建立 ${ELASTALERT}/config/xxx_server_rule.yaml用來儲存規則配置:

es_host: 192.168.75.21
es_port: 9200
#use_ssl: True
es_username: elastic
es_password: elastic
name: xxx_server_rule
# 規則型別,預設支援的規則:https://github.com/Yelp/elastalert#overview
# frequency:匹配Y時間中至少有X個事件的地方。
type: frequency

# 不進行重複提醒的(ES索引)欄位,和realert聯合使用,30分鐘內這個query_key只告警一次
query_key:
  - message
  
# 聚合2分鐘內的結果。設定一個時長,則該時長內,所有的報警(同一個配置檔案內的報警)最終合併在一起傳送。預設值為警報間隔一分鐘。
aggregation:
  minutes: 5

# 同一規則的兩次警報之間的最短時間。在此時間內發生的任何符合相同規則的警報都將被丟棄。預設值為一分鐘(去重)。
# 如果你希望聽到不斷的“叮咚”聲,可以將它配置為 0。
realert:
 minutes: 5

# ES索引名稱,支援模糊匹配
index: "filebeat-*"
# 與規則匹配的日誌出現次數
num_events: 1
#threshold: 1 

# 與num_events配合,表示在timeframe時間內出現num_events次與規則匹配的日誌,將會觸發報警。
timeframe:
    minutes: 5

# 以下編寫了一條Lucene格式的過濾規則
filter:
- query:
    query_string:
        query: "message: ERROR"
- query:
    query_string:
        query: "NOT message: INFO"
- query:
    query_string:
        query: "NOT message: Read timed out"

# 告警方式
#alert: post
# 告警連線介面,更多資訊參考:https://elastalert.readthedocs.io/en/latest/ruletypes.html?highlight=http_post_url#alerta
#http_post_url: "http://localhost:8088/alertapi"

alert:
- "email"

# Email格式
email_format: html

# 如果這個去掉,那麼傳送alert_text的同時,也會發送預設模板內容
alert_text_type: alert_text_only

#主題模板
alert_text: "<div style='display:block;background-color: red;padding: 10px;border-radius: 5px;color: white;font-weight: bold;'><p>緊急!XXX日誌報警通知。</p></div><br><a href='http://192.168.0.123:5601/app/kibana'target='_blank'style='padding: 8px 16px;background-color: #46bc99;text-decoration:none;color: white;border-radius: 5px;'>立馬前往Kibana檢視</a><br><h3>告警詳情</h3><table><tr><td style='padding:5px;text-align: right;font-weight: bold;border-radius: 5px;background-color: #eef;'>@timestamp:</td><td style='padding:5px;border-radius: 5px;background-color: #eef;'>{}</td></tr><tr><td style='padding:5px;text-align: right;font-weight: bold;border-radius: 5px;background-color: #eef;'>@version:</td><td style='padding:5px;border-radius: 5px;background-color: #eef;'>{}</td></tr><tr><td style='padding:5px;text-align: right;font-weight: bold;border-radius: 5px;background-color: #eef;'>_id:</td><td style='padding:5px;border-radius: 5px;background-color: #eef;'>{}</td></tr><tr><td style='padding:5px;text-align: right;font-weight: bold;border-radius: 5px;background-color: #eef;'>_index:</td><td style='padding:5px;border-radius: 5px;background-color: #eef;'>{}</td></tr><tr><td style='padding:5px;text-align: right;font-weight: bold;border-radius: 5px;background-color: #eef;'>_type:</td><td style='padding:5px;border-radius: 5px;background-color: #eef;'>{}</td></tr><tr><td style='padding:5px;text-align: right;font-weight: bold;border-radius: 5px;background-color: #eef;'>host:</td><td style='padding:5px;border-radius: 5px;background-color: #eef;'>{}</td></tr><tr><td style='padding:5px;text-align: right;font-weight: bold;border-radius: 5px;background-color: #eef;'>message:</td><td style='padding:10px 5px;border-radius: 5px;background-color: #F8F9FA;'>{}</td></tr><tr><td style='padding:5px;text-align: right;font-weight: bold;border-radius: 5px;background-color: #eef;'>規則命中條數:</td><td style='padding:5px;border-radius: 5px;background-color: #eef;'>{}</td></tr><tr><td style='padding:5px;text-align: right;font-weight: bold;border-radius: 5px;background-color: #eef;'>匹配觸發告警數:</td><td style='padding:5px;border-radius: 5px;background-color: #eef;'>{}</td></tr><tr><td style='padding:5px;text-align: right;font-weight: bold;border-radius: 5px;background-color: #eef;'>日誌位置:</td><td style='padding:5px;border-radius: 5px;background-color: #eef;'>{}</td></tr></table>"

# 郵箱模板引數
alert_text_args:
- "@timestamp"
- "@version"
- _id
- _index
- _type
- host
- message
- num_hits
- num_matches
- path
# 標題
alert_subject: "緊急!XXX日誌報警通知。"

# 可配置多個接收方(Team)
email:
- "[email protected]"
- "[email protected]"

# 為了安全起見,最好自建郵箱伺服器
smtp_host: "smtp.126.com"
smtp_port: 465
# 郵箱認證配置檔案
smtp_auth_file: /opt/elastalert/rules/smtp_auth.yaml
# 設定郵箱Reply-To標頭。預設值為收件人地址。
email_reply_to: "[email protected]"
# 作為傳送方的系統郵箱地址
from_addr: "[email protected]"
# https 證書
smtp_ssl: true

5.郵箱認證配置
建立 ${ELASTALERT}/rules/smtp_auth.yaml用來儲存規則配置:

user: "[email protected]"
password: "xxxxxxxxxxxxxxxxxx" # 授權碼

6.拉取映象

docker pull bitsensor/elastalert:3.0.0-beta.1

7.容器編排執行

docker run -d -p 3030:3030 -p 3333:3333 \
    -v /mnt/elastalert/config/config.yaml:/opt/elastalert/config.yaml \
    -v /mnt/elastalert/config/config.json:/opt/elastalert-server/config/config.json \
    -v /mnt/elastalert/rules:/opt/elastalert/rules \
    -v /mnt/elastalert/rule_templates:/opt/elastalert/rule_templates \
    -v /etc/localtime:/etc/localtime:ro  \
    -e TZ=Asia/Shanghai \
    --name elastalert bitsensor/elastalert:3.0.0-beta.1

8.告警規則測試
容器執行,檔案路徑為映象內路徑,掛載後為/opt/elastalert/opt/elastalert

docker exec -i elastalert python -m elastalert.elastalert --verbose --config /opt/elastalert/config.yaml --rule /opt/elastalert/rules/xxx_server_rule.yaml

若無異常,你收到的報警郵箱大概是這樣一份聚合後的結果:

ElastAlert Kibana管理外掛部署

Kibana 7.5對應的ElastAlert plugin版本為v1.1.0
對應網址: https://github.com/bitsensor/elastalert-kibana-plugin/
https://github.com/bitsensor/elastalert-kibana-plugin/releases/tag/1.1.0

kibana安裝外掛

su - kibana
cd /opt/kibana-7.5.0-linux-x86_64
./bin/kibana-plugin install https://github.com/bitsensor/elastalert-kibana-plugin/releases/download/1.1.0/elastalert-kibana-plugin-1.1.0-7.5.0.zip

修改kibana配置

vim config/kibana.yml 
elastalert-kibana-plugin.serverHost: 192.168.75.21
elastalert-kibana-plugin.serverPort: 3030

儲存重啟kibana

檢視效果


隨便填寫一個告警規則,儲存的時候報錯:

容器日誌報錯提示:

登陸進去容器檢視,目錄/opt/elastalert/rules/opt/elastalert/rule_templates是在容器啟動時掛載進去的,具體許可權如下:

考慮到這一點,檢視文章開頭建立的那幾個配置檔案目錄許可權/mnt/elastalert/{config,rules,rule_templates}
給這幾個目錄其他使用者操作的許可權就可以了,比如:chmod -R 777 /mnt/elastalert/

然後再在kibana上新增,就會看到已經可以儲存成功了

容器日誌顯示:

實際檢視宿主機上的目錄,該檔案是使用es的使用者建立的

ElastAlert 指令碼

1.編寫start_el_rule.sh用以後臺執行特定ElastAlert規則:

#!/bin/bash

nohup docker exec -i elastalert python -m elastalert.elastalert --verbose --config /opt/elastalert/config.yaml --rule /opt/elastalert/rules/xxx_server_rule.yaml  > logs/xxx_server_rule.log 2>&1 &
echo "ps -aux|grep 'docker exec -i elastalert python -m'"
ps -aux|grep "docker exec -i elastalert python -m"

2.編寫stop.sh用以停止所有規則的執行:

#!/bin/bash

PIDS=`ps -ef |grep "python -m elastalert.elastalert --verbose --config /opt/elastalert/config.yaml" |grep -v grep | awk '{print $2}'`
kill -15 $PIDS
echo 'Kill %s success.' $PIDS