ElastAlert安裝與使用

安裝

官方文檔:elastalert.readthedocs.io/en/latest/r…html

我簡單總結一下附帶我遇到的坑:java

環境

  • Elasticsearch
  • Python 2.7 坑:必定要2.7,2.6和3.*都有問題
  • Ubuntu : python-pip python-dev libffi-dev libssl-dev
  • centos: gcc libffi-devel python-devel openssl-devel python-setuptools

安裝

能夠setup.py腳本安裝也可使用pip 安裝,可是必須從git上拉下來,由於好多配置文件是必需要有的。python

#安裝依賴包
yum install gcc libffi-devel python-devel openssl-devel python-setuptools
#安裝
git clone https://github.com/Yelp/elastalert.git 
pip install -r requirements.txt  
pip install "setuptools>=11.3"
python setup.py install
#或者 pip install elastalert
Elasticsearch 5.0+:
pip install "elasticsearch>=5.0.0"
Elasticsearch 2.X:
pip install "elasticsearch<3.0.0"
複製代碼

配置

cd elastalert  
cp config.yaml.example config.yaml #基本信息
vim config.yaml
複製代碼

基本配置 config.yamlgit

#將從該文件夾下讀取*.yaml配置文件
rules_folder: your_rule_folder
#查詢es中 elastalert_status 索引的頻率,也能夠是minutes,days 等等
run_every:
 hours: 1
# 每兩分鐘查詢一次es 匹配 rules 的數據,存放到elastalert_status中
buffer_time:
 minutes: 2
#host
es_host: 127.0.0.1
#port
es_port: 9200
# Option basic-auth username and password for Elasticsearch
es_username: username
es_password: pwd
複製代碼

規則配置 your_rule.yamlgithub

例子:apache

es_host: 127.0.0.1 
es_port: 9200
es_username: xxx
es_password: xxx

# (Required)
# Rule name, must be unique
# 給rule一個惟一的名字
name: prod

# (Required)
# Type of alert.下面各類type詳細介紹
type: any
#注意了!!!!
#這是最大的坑,並且官方文檔也沒有比較明確的說明,elastalert只會把一條hit的記錄發送給你,若是你想獲取多條須要使用聚合功能,
aggregation:
# "* * * * *" means: run as the "run_every" in config.yaml
 schedule: "* * * * *"
aggregate_by_match_time: true

# (Required)
# sd asd Index to search, wildcard supported
index: '*-prod-*'


# (Required)
#這裏使用的是ES 的DSL語句作過濾條件
filter:
#邏輯組合
- bool:
    #必須存在
 must:
 - match:
 level: "ERROR"
    #必須不存在,即過濾掉的
 must_not:
 - match:
 stackTrace: "org.apache.catalina.connector.ClientAbortException: java.io.IOException: Broken pipe"
 - match:    
 message: "[SUCCESS]"
 
# (Required)
# 報警方式,有郵件 jira等等,github上還有微信等,官網介紹https://elastalert.readthedocs.io/en/latest/ruletypes.html#alerts
#我用的是command 即執行一個命令,比較靈活一些
alert:
- command
#- email
pipe_match_json: true #把參數以json文件流的形式傳入,python中以 sys.stdin.read()接受
command: ["/root/elastalert/your_rule_folder/command_alert.py"]
複製代碼

rule設置各自獨立以文件方式存儲在rules_folder設置的目錄裏。其中能夠定義下面這些參數:json

  • name 配置,每一個規則須要有本身獨立的名稱,一旦重複,進程將沒法啓動。
  • type 配置,選擇某一種數據驗證方式。
  • index 配置,從某類索引裏讀取數據,目前已經支持Ymd格式,須要先設置use_strftime_index:true,而後匹配索引,配置形如:index:logstash-es-test-%Y。%m。%d,表示匹配logstash-ES-測試名稱開頭,以年月日做爲索引後綴的索引。
  • filter 配置,設置向ES請求的過濾條件。
  • timeframe 配置,累積觸發報警的時長。
  • alert 配置,設置觸發報警時執行哪些報警手段。

type :不一樣的類型還有本身獨特的配置選項。目前ElastAlert有如下幾種自帶ruletype:vim

  • any:只要有匹配就報警;
  • blacklistcompare_key字段的內容匹配上blacklist數組裏任意內容;
  • whitelistcompare_key字段的內容一個都沒能匹配上whitelist數組裏內容;
  • change:在相同query_key條件下,compare_key字段的內容,在timeframe範圍內發送變化;
  • frequency:在相同query_key條件下,timeframe範圍內有num_events個被過濾出來的異常;
  • spike:相同在query_key條件下,兩個先後timeframe範圍內數據量相差比例超過spike_height。能夠其中經過spike_type設置具體漲跌方向的英文updownboth。能夠還經過threshold_ref設置要求上一個週期數據量的下限,threshold_cur設置要求當前週期數據量的下限,若是數據量不到下限,也不觸發;
  • flatlinetimeframe範圍內,量數據小於threshold閾值;
  • new_termfields字段新出現以前terms_window_size(默認30天)範圍內最多的terms_size(默認50)個結果之外的數據;
  • cardinality:在相同query_key條件下,timeframe範圍內cardinality_field的值超過max_cardinality或者低於min_cardinality

初始化

安裝完成後會自帶三個命令:centos

  • elastalert-create-index ElastAlert會腳執行記錄存放到一個ES索引中,該命令就是用來建立這個索引的,默認狀況下,索引名叫elastalert_status。其中有4個_type,都有本身的@timestamp字段,因此一樣也能夠用kibana來查看這個索引的日誌記錄狀況。
  • elastalert-rule-from-kibana從Kibana已保存的儀表盤中讀取Filtering設置,幫助生成config.yaml裏的配置。不過注意,它只會讀取過濾,不包括查詢。
  • elastalert-test-rule測試自定義配置中的規則設置。

直接運行:數組

  1. elastalert-create-index

  2. elastalert-test-rule your_rule_folder/your_rule.yaml
    複製代碼

使用

在elastalert/下運行

python -m elastalert.elastalert --config ./config.yaml --verbose --rule your_rule_folder/your_rule.yaml
複製代碼

-m 至關於import,叫作當作模塊來啓動

--config 指定配置文件 默認./config.yaml

--verbose 把詳細信息打印出來

--rule 指定 rule文件

相關文章
相關標籤/搜索