安裝elastalert插件
elastalert插件直接每隔xxx時(shí)間去es檢索一遍所刀,觸發(fā)條件,就會通過告警媒介來發(fā)送告警通知,此處介紹郵件形式(也可dingding,但是需要單獨(dú)裝釘釘?shù)牟寮?/p>
系統(tǒng): Ubtun20.04.6
環(huán)境: python3.8
需求:
elk收集的日志昔头,對nginx日志進(jìn)行監(jiān)控告警
實(shí)現(xiàn)思路:
nginx日志狀態(tài)碼告警這個(gè)需求可以通過找一臺機(jī)器,安裝并配置elastalert插件 每過xxx時(shí)間去指定的es服務(wù)器拉取匹配的索引信息來 判斷狀態(tài)碼的值, 不符合條件就觸發(fā)告警媒介(如郵件影兽,釘釘)來發(fā)送告警揭斧。這種不需要過多復(fù)雜判斷的需求,直接通過中間件本身即可實(shí)現(xiàn)峻堰。
———————————————————————————————————————————————————
環(huán)境準(zhǔn)備
python虛擬環(huán)境執(zhí)行:
1.安裝
pip3 install virtualenv -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
2.創(chuàng)建
virtualenv /opt/logs-env
3.啟動
cd /opt/logs-env
source ./bin/activate
注意: (看到主機(jī)前面有(logs-env) 代表現(xiàn)在是在虛擬環(huán)境下進(jìn)行的了)
deactivate --關(guān)閉退出虛擬環(huán)境
———————————————————————————————————————————————————
安裝Elastalert
1.下載包
cd /opt/ && wget https://github.com/Yelp/elastalert/archive/refs/heads/master.zip
unzip elastalert-master.zip
2.更新pip
python3 -m pip install --upgrade pip
3.設(shè)置pip永久全局國內(nèi)源
pip3 config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
4.安裝elastalert
cd /opt/elastalert-master
pip3 install setuptools-rust
python3 setup.py install
注: 如果中途出現(xiàn)安裝模塊慢或者網(wǎng)絡(luò)超時(shí)的情況讹开,根據(jù)提示的插件或模塊名使用pip3 install xxxx
來手動安裝下。最終出現(xiàn)Finished processing dependencies for elastalert==0.2.4即為安裝完成捐名。
5.修改elastalert配置文件
cd /opt/elastalert-master
cp config.yaml.example config.yaml
修改完成后配置內(nèi)容:
#告警規(guī)則目錄(相對elastalert目錄,事先創(chuàng)建好jkyy目錄)
rules_folder: example_rules/jkyy
#ElastAlert多久向ES發(fā)送一次請求來根據(jù)規(guī)則文件去查一次(可為seconds,minutes,hours,days,weeks)
run_every:
minutes: 1
#當(dāng)查詢開始一直到結(jié)束旦万,最大的緩存時(shí)間(默認(rèn)15)
buffer_time:
minutes: 15
#es節(jié)點(diǎn)地址,端口(如果es配置了登錄認(rèn)證需要把用戶密碼也寫上)
es_host: 192.168.3.233
es_port: 9200
es_username: xxxxx
es_password: xxxxx
#ElastAlert插件用來存儲告警信息操作來創(chuàng)建的索引名
writeback_index: elastalert_status
writeback_alias: elastalert_alerts
#如果告警發(fā)送失敗,則會在下面時(shí)間范圍內(nèi)嘗試重新發(fā)送
alert_time_limit:
days: 2
向es創(chuàng)建索引elastalert-create-index
6.告警規(guī)則文件配置
關(guān)于nginx狀態(tài)碼告警
vim /opt/elastalert-master/example_rules/jkyy/nginx_code.yaml
例如: nginx狀態(tài)碼大于等于400時(shí)镶蹋,發(fā)送告警赏半,告警內(nèi)容為指定內(nèi)容。(不指定alert_text內(nèi)容默認(rèn)為發(fā)送全部字段)
es_host: 192.168.3.233
es_port: 9200
es_username: xxxxxx
es_password: xxxxxx
name: test elk rules
type: frequency
index: nginx-logs-*
num_events: 1
timeframe:
seconds: 5
realert:
minutes: 0
filter:
- query_string:
query: "response_code: >=404" #kibana上能查詢出來断箫,直接放在這里就行,具體其他寫法可以參考官網(wǎng)琼腔。
#郵箱配置
smtp_host: smtp.163.com
smtp_port: 465
smtp_ssl: True
smtp_auth_file: /opt/smtp_auth_file.yaml
email_reply_to: x@163.com
from_addr: x@163.com
alert:
- "email"
email:
- "x@163.com"
alert_subject: "nginx 日志告警 500-509"
alert_text: "
客戶端IP: {}\n
狀 態(tài) 碼: {}\n
"
alert_text_type: alert_text_only
alert_text_args:
- client_ip
- response_code
#- client_ip踱葛,response_code為logstash處理后切分出來的key,可在kibana查詢?nèi)罩镜臅r(shí)候看到尸诽。
7.郵件賬戶文件配置
#郵箱用戶名
user: xxx@163.com
##不是郵箱密碼甥材,是設(shè)置的SMTP密碼
password: xxxx
8.寫入一條測試數(shù)據(jù)
10.10.11.1 - - [19/Apr/2023:16:33:12 +0800] "GET / HTTP/1.1" 409 0 "-" Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36 - 0.001 192.168.1.132:8005 900 0.000
9.啟動配置
調(diào)試模式啟動:
elastalert --config /opt/elastalert-master/config.yaml --rule nginx_code.yaml --verbose
后臺啟動:
elastalert --config /opt/elastalert-master/config.yaml --rule /opt/elastalert-master/example_rules/jkyy/nginx_code.yaml &
9.收到告警
有時(shí)可能中間件本身處理不了復(fù)雜的邏輯判斷來實(shí)現(xiàn)需求,就需要我們自己用在遠(yuǎn)程寫服務(wù)或者腳本來實(shí)現(xiàn)了性含,這時(shí)就可以elastalert告警規(guī)則文件中使用http post方式來把符合條件的日志信息發(fā)送到遠(yuǎn)程的腳本/服務(wù)中去處理洲赵,在腳本中來實(shí)現(xiàn)邏輯判斷,郵件發(fā)送告警商蕴。
例:
vim /opt/elastalert-master/example_rules/jkyy/frequency.yaml
es_host: 192.168.1.201
es_port: 9200
es_username: log_elasticalert
es_password: xxxx
name: JKYY-API-PROJECT logs monitor
type: frequency
index: filebeat-*
num_events: 1
timeframe:
seconds: 5
realert:
minutes: 0
filter:
- query:
query_string:
query: "message: \"API-PROJECT\""
alert: post
http_post_url: "http://127.0.0.1:9099/biz_alert"
http_post_headers:
type: API-PROJECT
直接日志發(fā)送給遠(yuǎn)程服務(wù)/腳本來處理 叠萍,http_post_headers可以寫一個(gè)請求頭,服務(wù)端也會根據(jù)這個(gè)header來更好區(qū)分來源
————————————————————————————————————————————————
其他方案: Lostash端處理:
將從kafka或者Filebeat中拿到的日志去做格式化處理的時(shí)候绪商,過濾階段該怎么處理怎么處理苛谷,或者不做處理都行,只需要在輸出階段寫入到es(常規(guī)流程)后格郁,判斷一下message中是否含有xxx字符腹殿,如果有就直接發(fā)送到遠(yuǎn)端API接口去處理,以下是配置:
output {
elasticsearch {
hosts => ["http://xxxxx:9200","http://xxxxx:9200","http://xxxxx:9200"]
index => "nginx-logs-%{+YYYY.MM.dd}"
document_type => "%{[@metadata][type]}"
user => "logstash_server"
password => "xxxxx"
}
# stdout { codec => rubydebug }
if [message] =~ /API-QPS/ {
http {
http_method => "post"
url => "http://xxxx:9099/biz_alert"
#format => "message"
message => '%{message}'
headers => ["type", "API-QPS"]
retry_failed => true
automatic_retries => 2
}
}
if [message] =~ /API-PROJECT/ {
http {
http_method => "post"
url => "http://xxxx:9099/biz_alert"
#format => "message"
message => '%{message}'
headers => ["type", "API-PROJECT"]
retry_failed => true
automatic_retries => 2
}
}
}