ELK日志報警插件ElastAlert
它通過將Elasticsearch與兩種類型的組件(規則類型和警報)結合使用。定期查詢Elasticsearch,並將數據傳遞到規則類型,該規則類型確定何時找到匹配項。發生匹配時,將為該警報提供一個或多個警報,這些警報將根據匹配采取行動。
這是由一組規則配置的,每個規則定義一個查詢,一個規則類型和一組警報。
ElastAlert包含幾種具有常見監視范例的規則類型:
匹配Y時間內至少有X個事件的地方”(frequency類型)
當事件發生率增加或減少時匹配”(spike類型
在Y時間內少於X個事件時進行匹配”(flatline類型
當某個字段與黑名單/白名單匹配時匹配”(blacklist並whitelist輸入)
匹配任何與給定過濾器匹配的事件”(any類型)
當某個字段在一段時間內具有兩個不同的值時進行匹配”(change類型)
當字段中出現從未見過的術語時進行匹配”(new_term類型)
當字段的唯一值數量大於或小於閾值(cardinality類型)時匹配
告警支持郵件、釘釘、微信、自定義等多種告警方式;能靈活從es中查詢出來的內容
python3.6安裝
tar xf Python-3.6.8.tar.xz
yum -y install wget sqlite-devel xz gcc automake zlib-devel openssl-devel epel-release
cd Python-3.6.8/
./configure && make && make install
elastalert-create-index
運行該elastalert-test-rule工具將測試您的配置文件是否成功加載,並在過去的24小時內以調試模式運行它:
elastalert-test-rule my_rules/esport_interface_frequency.yaml
python3 -m elastalert.elastalert --verbose --rule my_rules/esport_interface_frequency.yaml
安裝elastalert
#安裝ElastAlert的最新發行版:
pip3 install elastalert
#克隆ElastAlert存儲庫里面有配置文件可以參考
wget https://github.com/Yelp/elastalert/archive/v0.2.4.tar.gz
tar xf elastalert-0.2.4.tar.gz
mv elastalert-0.2.4 /opt/
ln -s elastalert-0.2.4 elastalert
安裝之后會自帶三個命令
#elastalert-create-index
ElastAlert會把執行記錄存放到一個ES 索引中,該命令就是用來 創建這個索引的,默認情況下,索引名叫elastalert_status。其中有4個 _type,都有 自己的@timestamp字段,所以同樣也可以用kibana,來查看這個索引的日志記錄情況。
#elastalert-rule-from-kibana
從Kibana3已保存的儀表盤中讀取Filtering設置,幫助生成config.yaml里的配置。不過注意,它只會讀取filtering,不包括queries。
#elastalert-test-rule
測試自定義配置中的rule設置
釘釘報警插件安裝
wget https://github.com/xuyaoqiang/elastalert-dingtalk-plugin/archive/master.zip
unzip elastalert-dingtalk-plugin-master.zip
cd elastalert-dingtalk-plugin-master
pip3 install -r requirements.txt
cp -r elastalert_modules /opt/elastalert/
pip3 install requests
pip3 uninstall urllib3
pip3 uninstall chardet
規則范例
#可以在example_rules /中找到不同類型的規則的示例。
example_spike.yaml
是“峰值”規則類型的示例,它使您可以警告某個時間段內的平均事件發生率增加給定因子的時間。當在過去2個小時內發生與過濾器匹配的事件比前2個小時的事件數多3倍時,此示例將發送電子郵件警報。
example_frequency.yaml
是“頻率”規則類型的示例,它將在一個時間段內發生給定數量的事件時發出警報。此示例將在4小時內出現50個與給定過濾器匹配的文檔時發送電子郵件。
example_change.yaml
是“更改”規則類型的示例,當兩個文檔中的某個字段發生更改時,它將發出警報。在此示例中,當兩個文檔具有相同的“用戶名”字段但“ country_name”字段的值不同時,會在24小時之內發送警報電子郵件。
example_new_term.yaml
是“新術語”規則類型的示例,當一個或多個新值出現在一個或多個字段中時,它將發出警報。在此示例中,在示例登錄日志中遇到新值(“用戶名”,“計算機”)時,將發送一封電子郵件。
編寫管理規則
cp config.yaml.example config.yaml
[root@daily-elk elastalert]# grep -Ev '#|^$' config.yaml
rules_folder: example_rules
run_every:
seconds: 3
buffer_time:
minutes: 15
es_host: 10.0.1.20
es_port: 9200
writeback_index: elastalert_status
writeback_alias: elastalert_alerts
alert_time_limit:
days: 1
rules_folder: my_rules
#修改后,執行elastalert-create-index ,會自動在es中創建索引 elastalert_status,用來保存各個rule每次的執行結果。
#字段解釋
rules_folder: 是ElastAlert從中加載規則配置文件的位置。它將嘗試加載文件夾中的每個.yaml文件。沒有任何有效規則,ElastAlert將無法啟動。隨着此文件夾中文件的更改,ElastAlert還將加載新規則,停止運行缺少的規則並重新啟動修改后的規則
run_every: 是ElastAlert多久查詢一次Elasticsearch的時間
buffer_time: 用來設置請求里時間字段的范圍,默認是45分鍾
Es_host: elasticsearch的host地址
Es_port: elasticsearch對應的端口號
writeback_index: 是ElastAlert將在其中存儲數據的索引的名稱
writeback_alias: 別名
alert_time_limit: 是失敗警報的重試窗口
配置告警規則
#copy一份默認的規則
cp example_rules/example_frequency.yaml example_rules/my_rule.yaml
[root@daily-elk elastalert]# grep -Ev '#|^$' example_rules/my_rule.yaml
es_host: 10.0.1.20
es_port: 9200
name: my_text
type: frequency
index: text-*
use_strftime_index: true
num_events: 1
timeframe:
minutes: 5
filter:
- query:
query_string:
query: "ERROR"
alert:
- "elastalert_modules.dingtalk_alert.DingTalkAlerter"
dingtalk_webhook: https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxxxxxxxxxxxxx
dingtalk_msgtype: text
#字段解釋
Es_host: elasticsearch的host地址
Es_port: elasticsearch對應的端口號
name: 是此規則的唯一名稱。如果兩個規則共享相同的名稱,則ElastAlert將不會啟動
type: 每個規則具有不同的類型,可能采用不同的參數。該frequency類型的意思是“當num_events出現多個警報時發出警報timeframe
index: 要查詢的索引的名稱
use_strftime_index: 如果為true,則ElastAlert將為每個查詢使用datetime.strftime格式化索引
num_events: 此參數特定於frequency類型,並且是觸發警報時的閾值。
timeframe: 是num_events必須發生的時間段。
filter: 是用於過濾結果的Elasticsearch過濾器列表
#詳細參考
https://elastalert.readthedocs.io/en/latest/recipes/writing_filters.html#writingfilters
alert: 是在每次規則中運行的警報的列表
#詳細參考
https://elastalert.readthedocs.io/en/latest/ruletypes.html#alerts
測試規則
elastalert-test-rule example_rules/my_rule.yaml
調試運行
python3 -m elastalert.elastalert --verbose --rule example_rules/my_rule.yaml
生產運行
python -m elastalert.elastalert --config config.yaml