採用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