elasticsearch5之Elastalert 安裝使用 配置郵件報警和報警模版

簡介

Elastalert是用python2寫的一個報警框架(目前支持python2.6和2.7,不支持3.x),github地址爲 https://github.com/Yelp/elastalert。他提供不同場景的規則配置,若覺得規則、告警不滿足需求時,可以用python編寫插件Adding a New Rule Type、Adding a New Alerter。

環境

系統:centos6.8
python:2.7.12(請參看升級centos6 默認python版本到2.7.12
elasticsearch:5.5
kibana:5.5

Elastalert內置的告警方式:
  • Email JIRA
  • OpsGenie
  • Commands
  • HipChat MS
  • Teams Slack
  • Telegram
  • AWS SNS
  • VictorOps
  • PagerDuty
  • Exotel
  • Twilio
  • Gitter
安裝
pip安裝elastalert

安裝pip包管理工具(參考

$ pip install elastalert

或者 git clone (推薦)

$ git clone https://github.com/Yelp/elastalert.git

安裝模塊

$ pip install "setuptools>=11.3"
$ python setup.py install

根據不同的Elasticsearch版本安裝elasticsearch-py。
Elasticsearch 5.x/2.x

$ pip install "elasticsearch>=5.0.0" ##5.x
$ pip install "elasticsearch<3.0.0" ##2.x

將源碼放置在你指定的目錄下:

$ cd /usr/local/elastalert/
$ cp config.yaml.example config.yaml
$ mkdir es_rules

[xxx@crmnginx elastalert]$ egrep  -v '^#|^$' config.yaml
rules_folder: es_rules
run_every:
  minutes: 5
buffer_time:
  minutes: 5
es_host: 10.xx.xx.xxx
es_port: xxxx
use_ssl: false
verify_certs: false
es_username: elastic 
es_password: changeme
writeback_index: elastalert_status
alert_time_limit:
  days: 2

$ ll
[root@crmnginx elastalert]# ll
total 124
drwxr-xr-x. 4 root root  4096 Nov 12 09:39 build
-rw-r--r--. 1 root root  9737 Nov 12 09:39 changelog.md
-rw-r--r--. 1 root root  2001 Nov 12 14:39 config.yaml
-rw-r--r--. 1 root root  2029 Nov 12 09:39 config.yaml.example
drwxr-xr-x. 2 root root  4096 Nov 12 09:39 dist
-rw-r--r--. 1 root root   261 Nov 12 09:39 docker-compose.yml
-rw-r--r--. 1 root root   264 Nov 12 09:39 Dockerfile-test
drwxr-xr-x. 3 root root  4096 Nov 12 09:39 docs
drwxr-xr-x. 2 root root  4096 Nov 12 11:15 elastalert
drwxr-xr-x. 2 root root  4096 Nov 12 09:39 elastalert.egg-info
drwxr-xr-x. 2 root root  4096 Nov 12 14:14 elastalert_modules
drwxr-xr-x. 2 root root  4096 Nov 12 14:51 es_rules
drwxr-xr-x. 2 root root  4096 Nov 12 09:39 example_rules
-rw-r--r--. 1 root root 11359 Nov 12 09:39 LICENSE
-rw-r--r--. 1 root root   480 Nov 12 09:39 Makefile
-rw-r--r--. 1 root root 15945 Nov 12 09:39 README.md
-rw-r--r--. 1 root root    87 Nov 12 09:39 requirements-dev.txt
-rw-r--r--. 1 root root   372 Nov 12 09:39 requirements.txt
-rw-r--r--. 1 root root   100 Nov 12 09:39 setup.cfg
-rw-r--r--. 1 root root  1650 Nov 12 09:39 setup.py
-rw-r--r--. 1 root root   117 Nov 12 11:14 smtp_auth_file.yaml
-rw-r--r--. 1 root root   780 Nov 12 09:39 supervisord.conf.example
drwxr-xr-x. 2 root root  4096 Nov 12 09:39 tests
-rw-r--r--. 1 root root   606 Nov 12 09:39 tox.ini
配置解析

此處的配置文件是指config.yaml文件。

  • rules_folder:ElastAlert將加載規則配置文件的地方,它將嘗試加載文件夾中的每個.yaml文件(這裏是加載es_rules目錄下)。
  • run_every:ElastAlert查詢Elasticsearch的頻率。
  • buffer_time:是查詢窗口的大小,從每個查詢運行的時間向後延伸。對於其中use_count_query或use_terms_query設置爲true的規則,此值將被忽略。
  • es_host:是Elasticsearch集羣的地址,ElastAlert將存儲有關其狀態、查詢運行、警報和錯誤的數據。每個規則也可以設置不同的elasticsearch主機進行查詢。
  • es_port:Elasticsearch對應的端口。
  • use_ssl: (可選的)是否使用TLS;連接到es_host;設置爲True或False。
  • verify_certs: (可選的)是否驗證TLS證書; 設置爲True或False,默認是True。
  • client_cert: (可選的)PEM證書的路徑。
  • client_key: (可選的) 作爲客戶端密鑰使用的私鑰文件的路徑。
  • ca_certs: (可選的) 用於驗證SSL連接的CA證書的路徑。
  • es_username: (可選的) 用於連接Elasticsearch的basic-auth用戶名。
  • es_password: (可選的) 用於連接Elasticsearch的密碼。
  • es_url_prefix: (可選的) Elasticsearch端點的URL前綴。
  • es_send_get_body_as: (可選的) 查詢Elasticsearch方法- GET,POST或- source,默認是GET。
  • writeback_index:是ElastAlert將存儲數據的索引名稱。
  • alert_time_limit: 是失敗警報的重試窗口。
創建Elasticsearch索引

elastalert-create-index這個命令會在elasticsearch創建索引,便於ElastAlert將有關其查詢及其警報的信息和元數據保存回Elasticsearch。這不是必須的步驟,但是強烈建議創建。因爲對於審計,測試很有用,並且重啓elastalert不影響計數和發送alert。默認情況下,創建的索引叫 elastalert_status。

$ elastalert-create-index  --host 10.xxx.xx.xxx --port xxxx --username xxx --password xxx --no-ssl --no-verify-certs 

創建成功之後,我們可以在Elasticsearch中看到所創建的索引elastalert_status:

$ curl  -u xxx  'localhost:9200/_cat/indices?v' |grep elastalert_status
green  open   elastalert_status                                               eWjVRAzjTX2vmhvAK931Ng   5   1        110            0    513.8kb          266kb
elastalert_status

ElastAlert 根據elastalert_status去確定首次啓動的時候在什麼時間範圍內去查詢,以避免重複查詢。對於每個規則,它將從最近的結束時間開始查詢。包括:

  • @timestamp:文件上傳到Elasticsearch的時間。這是在運行查詢並且已經處理結果之後。
  • rule_name:相應規則的名稱。
  • starttime:查詢的開始時間戳。
  • endtime:查詢結束時間戳。
  • hits:查詢結果的數量。
  • matches:處理命中後規則返回的匹配數。請注意,這並不一定意味着警報被觸發。
  • time_taken:此查詢運行所需的秒數。
配置SMTP郵件報警

在/usr/local/elastalert/目錄下創建文件smtp_auth_file.yaml,內容如下:

[root@crmnginx elastalert]$ cat smtp_auth_file.yaml 
#郵箱用戶名
user: [email protected] 
##不是郵箱密碼,是設置的SMTP密碼
password: YdYfxxx
配置規則

在es_rules目錄下修改配置文件,如下:

$ cd /opt/elastalert/es_rules
[xxx@crmnginx elastalert]$ egrep  -v '^#|^$' es_rules/frequency.yaml 
 es_host: 10.xxx.xx.xxx 
 es_port: 9200
 use_ssl: false
 verify_certs: false
 es_username: xxx
 es_password: xxx
 name: es_rule
 writeback_index: elastalert_status
 type: frequency
 index: logstash-nginx-* 
 num_events: 5
 timeframe:
   minutes: 5
 filter:
 - query:
     query_string:
       query: "status:>=400"
     query_string:
       query: "status: >=500"
#SMTP configration
 smtp_host: smtp.263.net
 smtp_port: 25

#SMTP auth
 smtp_auth_file: /usr/local/elastalert/smtp_auth_file.yaml  
 email_reply_to: [email protected]
 from_addr: [email protected]

# (Required)
# The alert is use when a match is found
 alert:
 - "email"

# (required, email specific)
# a list of email addresses to send alerts to
 email:
 - "[email protected]"

上述規則表示:在elastalert執行的五分鐘內,出現五條有status:>=400 或者 status: >=500的日誌,則觸發告警,並且告警通知將以email的形式從[email protected]郵箱發送給[email protected]

規則配置解析:
  • es_host、es_port:應該指向我們要查詢的Elasticsearch集羣。

  • name:是這個規則的唯一名稱。如果兩個規則共享相同的名稱,ElastAlert將不會啓動。

  • type:每個規則都有不同的類型,可能會採用不同的參數。該frequency類型表示“在timeframe時間內匹配成功次數超過num_events發出警報”。有關其他類型的信息,請參閱規則類型。

  • index:要查詢的索引的名稱。配置,從某類索引裏讀取數據,目前已經支持Ymd格式,需要先設置use_strftime_index:true,然後匹配索引,配置形如:index: logstash-es-test%Y.%m.%d,表示匹配logstash-es-test名稱開頭,以年月日作爲索引後綴的index。

  • num_events:此參數特定於frequency類型,是觸發警報時的閾值。

  • timeframe:timeframe是num_events必鬚髮生的時間段。

  • filter:是用於過濾結果的Elasticsearch過濾器列表。有關
    詳細信息,請參閱編寫過濾規則。

  • email:是要發送警報的地址列表。

  • alert:配置,設置觸發報警時執行哪些報警手段。不同的type還有自己獨特的配置選項。目前ElastAlert 有以下幾種自帶ruletype:

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

命令如下:

$ python -m elastalert.elastalert --config ./config.yaml #運行命令,加載所有rules
$ python -m elastalert.elastalert --config ./config.yaml --rule ./es_rules/frequency.yaml ## 或者單獨執行 rules_folder 裏的某個 rule
給Elasticsearch添加測試數據:
$ curl -X POST "http://127.0.0.1:9200/logstash-nginx-xx/test"  -d '{
"@timestamp": "2018-11-12T10:54:41.000Z",
"status": "500"
}'
產看郵件報警

在這裏插入圖片描述
目前郵件發送使用的是默認模版,可讀性很差,現在我們來配置一套html寫的模版。
先看rule文件:

# cat frequency.yaml      
 es_host: 10.xx.xx.xx 
 es_port: 9200
 use_ssl: false
 verify_certs: false
 es_username: xx
 es_password: xxx
 name: es_htjf_java_rule
 writeback_index: elastalert_email_status
 #writeback_index: elastalert_status
 type: frequency 
 #type: any 
 index: logstash-xx* 
 num_events: 5
 timeframe:
   minutes: 5
 filter:
 - query:
     query_string:
       query: "(level:(error|WARN) AND javameassage:error  OR javameassage:*exception)"
      # query: "level:error "

 #SMTP configration
 smtp_host: smtp.xx.net
 smtp_port: 25

#SMTP auth
 smtp_auth_file: /usr/local/elastalert/smtp_auth_file.yaml 
 email_reply_to: [email protected] 
 from_addr: [email protected]

# (Required)
# The alert is use when a match is found
 alert:
 - "email"

 email_format: html
 alert_subject: "Htjf項目{0}服務正式環境Error告警"
 alert_subject_args:
 - logtype
 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>{}</p></div><br><a href='http://loxx.xxx.com/app/kibana#/context/logstash-xx*2019-10/logs/{}?_a=(columns:!(javameassage,level,logtype,_index,traceid,javaclass),filters:!(),predecessorCount:10,sort:!(&apos;@timestamp&apos;,desc),successorCount:10)&_g=()' target='_blank' style='padding: 8px 16px;background-color:  #46bc99;text-decoration:none;color: white;border-radius: 5px;'>Click to 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;'>logtype:</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;'>threadId:</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;'>num_hits:</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;'>num_matches:</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;'>env:</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;'>source:</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;'>javaclass:</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;'>level:</td><td style='padding:5px;border-radius: 5px;background-color: #eef;'>{}</td></tr></table>"
 alert_text_args:
 - javameassage
 - _id
 - "@timestamp"
 - "@version"
 - _id
 - _index
 - logtype
 - threadId
 - num_hits
 - num_matches
 - env
 - source
 - javaclass
 - level


 email:
 - "[email protected]"
 - "[email protected]"
 - "[email protected]"

生成的報警信息是這樣的

在這裏插入圖片描述

紅色部分:
是報警的詳細代碼報錯

淺綠色部分:
點擊查看相應的kibana報錯行的上下文10行的信息,開發接收到報警後,可以直接定位到報錯行及其報錯行的上下文 快速定位問題。頁面如下:
在這裏插入圖片描述
html代碼位置href=‘http://logs.xxx.com/app/kibana#/context/logstash-xxx*2019-10/logs/{}?_a=(columns:!(javameassage,level,logtype,_index,traceid,javaclass),filters:!(),predecessorCount:10,sort:!(’@timestamp’,desc),successorCount:10)&_g=()’
換成自己kibana地址。
有必要提醒大家的是{}裏的內容是變量的形式傳入的 對應alert_text_args中的第二個變量_id.

報警詳情:
根據自己收集日誌字段 按展示變量的順序添加需要展示的字段信息。一對{}表示一個變量,例如我的第一個{}是- javameassage 變量裏的內容,第二個{}對應- id 以此類推。

告警主題部分

alert_subject: "Htjf項目{0}服務正式環境Error告警"
 alert_subject_args:
 - logtype

使用變量,大括號裏要加上位置 ,{0} 表示alert_subject_args中第一個變量

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章