ES告警詳解之ElastAlert

原文地址: https://www.tony-yin.site/201...

alert

今天聊聊ES的告警,X-Pack提供了報警組件Alert,可是這個功能是須要付費,在尋求其餘方案的時候,發現了ElastAlert,能夠說這是一款爲ES量身定製的告警組件,可以完美替代Alert提供的全部功能。今天就ElastAlert強大的告警功能和筆者實踐過程當中遇到的一些問題進行分享。html

概述

ElastAlert是基於python2開發的一個告警框架,它主要有如下特色:前端

  • 成熟,Github上已有5k+ star
  • 開源,文檔很全面
  • 開發語言爲python,研究和擴展源碼較爲容易
  • 告警規則豐富
  • 告警方式豐富
  • SMTP以每一個告警爲單位,相對獨立

網上已經有了至關多的基礎介紹文章,可是筆者發現大多數文章的內容都是過期的,甚至官方文檔常常還會展現一些棄用配置;還有有始無終的通病,每每不全面,常常對一些關鍵性的細節不說起;再者一些地方解釋地不夠清晰,致使歧義。筆者在搭建和測試過程當中同時借鑑多篇文章,而後在反覆嘗試中最後才成功,這其中失敗了不少次,浪費了不少時間,因此這篇文章借鑑了上面提到的種種問題,保證本文的全面性、細節性以及具體性。python

軟件環境

Centos7
Elasticsearch 6.4.2
Kibana 6.4.2

ElastAlert安裝

安裝較爲簡單,但爲了避免有始無終仍是作一個完整的步驟介紹:git

克隆代碼

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

安裝依賴

$ cd elastalert
$ python setup.py install
$ pip install -r requirements.txt

總體配置

$ cp config.yaml.example config.yaml    // 根據模板生成配置文件
$ vim config.yaml   // 修改配置

主要修改幾個必需的選項,好比rules_folderes_hostes_port等,那些非必需沒有特殊需求就不用更改了:github

# 用來加載rule的目錄,默認是example_rules
rules_folder: example_rules

# 用來設置定時向elasticsearch發送請求
run_every:
  minutes: 1
  
# 用來設置請求裏時間字段的範圍
buffer_time:
  minutes: 15
  
# elasticsearch的host地址
es_host: 192.168.232.191

# elasticsearch 對應的端口號
es_port: 9200

# 可選的,es url前綴
#es_url_prefix:elasticsearch

# 可選的,查詢es的方式,默認是GET
#es_send_get_body_as:GET

# 可選的,選擇是否用SSL鏈接es,true或者false
#use_ssl: True

#可選的,是否驗證TLS證書,設置爲true或者false,默認爲- true
#verify_certs: True

# es認證的username和password
#es_username: someusername
#es_password: somepassword

# elastalert產生的日誌在elasticsearch中的建立的索引
writeback_index: elastalert_status

# 失敗重試的時間限制
alert_time_limit:
  days: 2

詳情請參考文檔:http://elastalert.readthedocs...web

建立ElastAlert索引

能夠在/usr/bin/目錄下看到如下四個命令:docker

$ ll /usr/bin/elastalert*
-rwxr-xr-x 1 root root 399 Nov 20 16:39 /usr/bin/elastalert
-rwxr-xr-x 1 root root 425 Nov 20 16:39 /usr/bin/elastalert-create-index
-rwxr-xr-x 1 root root 433 Nov 20 16:39 /usr/bin/elastalert-rule-from-kibana
-rwxr-xr-x 1 root root 419 Nov 20 16:39 /usr/bin/elastalert-test-rule
  • elastalert-create-index會建立一個索引,ElastAlert 會把執行記錄存放到這個索引中,默認狀況下,索引名叫 elastalert_status。其中有4_type,都有本身的@timestamp 字段,因此一樣也能夠用kibana來查看這個索引的日誌記錄狀況。
  • elastalert-rule-from-kibanaKibana3已保存的儀表盤中讀取Filtering 設置,幫助生成config.yaml裏的配置。不過注意,它只會讀取 filtering,不包括queries
  • elastalert-test-rule測試自定義配置中的rule設置。

執行elastalert-create-index命令在ES建立索引,這不是必須的步驟,可是強烈建議建立。由於對於審計和測試頗有用,而且重啓ES不影響計數和發送alert.shell

$ elastalert-create-index

具體參見文檔: setting-up-elasticsearchnpm

Rule配置

rule配置算是ElastAlert最核心的功能了,支持11種告警規則,就不一一介紹了,選用一個最爲廣泛使用的告警規則frequency,告警方式也選用最廣泛的emailjson

# Alert when the rate of events exceeds a threshold

# (Optional)
# Elasticsearch host
es_host: 192.168.232.191

# (Optional)
# Elasticsearch port
es_port: 9200

# (OptionaL) Connect with SSL to Elasticsearch
#use_ssl: True

# (Optional) basic-auth username and password for Elasticsearch
#es_username: someusername
#es_password: somepassword

# (Required)
# Rule name, must be unique
name: Example frequency rule

# (Required)
# Type of alert.
# the frequency rule type alerts when num_events events occur with timeframe time
type: frequency

# (Required)
# Index to search, wildcard supported
index: metricbeat-*

# (Required, frequency specific)
# Alert when this many documents matching the query occur within a timeframe
num_events: 5

# (Required, frequency specific)
# num_events must occur within this amount of time to trigger an alert
timeframe:
  hours: 4

# (Required)
# A list of Elasticsearch filters used for find events
# These filters are joined with AND and nested in a filtered query
# For more info: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl.html
filter:
- query_string:
    query: "system.process.cpu.total.pct: >10%"     // field支持嵌套

smtp_host: smtp.163.com
smtp_port: 25
smtp_auth_file: /opt/elastalert/smtp_auth.yaml
#回覆給那個郵箱
email_reply_to: xxx@163.com
##從哪一個郵箱發送
from_addr: xxx@163.com
# (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:
- "yyy@qq.com"

上述配置表示選擇metricbeat做爲告警索引,在4小時內將匹配過濾條件,當CPU使用百分比的值爲10%超過5次後,即知足告警條件,而後發送郵件。

郵件配置

上述配置中已經展現了一部分郵件配置,主要有smtp hostsmtp portfrom addrto_addr等。這裏筆者選擇一個網易163的郵箱做爲發送郵箱,一個QQ郵箱做爲接收郵件進行測試,因此smpt host應該爲smtp.163.com

smtp_host: smtp.163.com
smtp_port: 25
smtp_auth_file: /opt/elastalert/smtp_auth.yaml
#回覆給那個郵箱
email_reply_to: xxx@163.com
##從哪一個郵箱發送
from_addr: xxx@163.com
# (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:
- "yyy@qq.com"

還有一個smtp_auth.yaml文件,這個裏面記錄了發送郵箱的帳號和密碼,163郵箱有受權碼機制,因此密碼處應該填寫受權碼(沒有的話則須要開啓)。

#發送郵件的郵箱
user: xxx@163.com
##不是郵箱密碼,是設置的POP3密碼
password: xxx

網易受權碼設置以下圖:

<center>163 client password</center>

高級配置

避免重複告警

避免必定時間段中重複告警,能夠配置realertexponential_realert這兩個選項:

# 5分鐘內相同的報警不會重複發送
realert:
  minutes: 5

# 指數級擴大 realert 時間,中間若是有報警,
# 則按照5->10->20->40->60不斷增大報警時間到制定的最大時間,
# 若是以後報警減小,則會慢慢恢復原始realert時間
exponential_realert:
  hours: 1

聚合相同告警

# 根據報警的內,將相同的報警安裝 name 來聚合
aggregation_key: name

# 聚合報警的內容,只展現 name 與 message
summary_table_fields:
  - name
  - message

告警內容格式化

能夠自定義告警內容,內部是使用Pythonformat來實現的。

alert_subject: "Error {} @{}"
alert_subject_args:
  - name
  - "@timestamp"

alert_text_type: alert_text_only
alert_text: |
  ### Error frequency exceeds
  > Name: {}
  > Message: {}
  > Host: {} ({})
alert_text_args:
  - name
  - message
  - hostname
  - host

固然還有更多高級配置,詳情請參考文檔。

測試Rule

能夠在運行rule以前先經過elastalert-test-rule命令來測試一下

$ elastalert-test-rule ~/elastalert/example_rules/example_frequency.yaml

詳情參考文檔:http://elastalert.readthedocs...

運行Rule

啓動elastalert服務,監聽es,這裏加了--rule example_frequency.yaml表示只運行example_frequency.yaml這一個rule文件,若是不加該選項則會運行rules_folder下全部rule文件,上面配置中的rules_folder爲默認的example_rules

$ python -m elastalert.elastalert --verbose --rule example_frequency.yaml

爲了讓服務後臺運行而且能夠達到守護進程的效果,在生產環境中筆者建議使用supervisor管理。

郵件效果圖以下:

<center>elastalert email</center>

其餘Rule

  • 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_term:fields字段新出現以前terms_window_size(默認30天)範圍內最多的terms_size(默認50)個結果之外的數據;
  • cardinality:在相同 query_key條件下,timeframe範圍內cardinality_field的值超過 max_cardinality或者低於min_cardinality

摘自:ElastAlert介紹和安裝-1
詳細請參考文檔:https://elastalert.readthedoc...

其餘告警方式

除了email,還有jirawebhook等內置告警方式,因爲筆者沒有實踐,就不一一贅述了。

第三方的微信和釘釘:

也能夠根據文檔本身實現:https://elastalert.readthedoc...

elastalert-kibana-plugin

elastalert-kibana-plugin是圍繞elastalert作的一個kibana展現插件,能夠在kibana上建立、編輯和刪除告警,可是說實話這個插件還不是很好用,首先配置就有點麻煩,其次展現效果並不友好,提供配置rule的方式太專業化了,對小白或者通常用戶來講要求稍高。

下載安裝包

下載6.4.2release安裝包

$ wget https://github.com/bitsensor/elastalert-kibana-plugin/releases/download/1.0.1/elastalert-kibana-plugin-1.0.1-6.4.2.zip

本地安裝插件

Kibana插件本地安裝

$ /usr/share/kibana/bin/kibana-plugin install file:///root/elastalert-kibana-plugin-1.0.1-6.4.2.zip

本地安裝前面須要加上file://,不然會默認爲在線資源去解析url並下載

Unix:

$ sudo bin/elasticsearch-plugin install file:///path/to/plugin.zip

Windows:

假定須要安裝的插件本地地址爲C:\path\to\plugin.zip

$ bin\elasticsearch-plugin install file:///C:/path/to/plugin.zip

安裝Server

上面安裝的只是kibana的一個展現插件,插件內部並無集成server,因此還須要再安裝一個server,筆者以前由於沒有作這一步,一直卡着,頁面顯示報錯502 Bad Gateway,關鍵是官方文檔也沒說清楚必定要裝這個。。

克隆倉庫

$ git clone https://github.com/bitsensor/elastalert.git elastalert-server
$ cd elastalert-server

這邊咱們先不用官網說的docker運行的方式,先用本地npm起服務的方式運行。

下載指定版本的npm

$ nvm install "$(cat .nvmrc)"

安裝依賴

$ npm install

修改配置

這一步很重要,由於不少地方沒有說的很清楚,包括docker運行方式在這一塊也沒說清楚。

$ vim config/config.json

默認的配置須要修改,尤爲是elastalertPathrulesPath中的path選項

elastalertPath表示的是咱們最初安裝的elastalert倉庫的目錄,也就是說elastalert-kibana-plugin運行須要三個倉庫,分別是elastalertelastalert-kibana-plugin、和elastalert-server,分別對應的是後端代碼、前端代碼、webserver,這也就是筆者以前提到的安裝提到的安裝麻煩所在了;

其次rulesPathpath選項表示運用elastalert-kibana-plugin插件建立告警後rule文件存放的目錄,上面筆者在elastalert配置的rules_folderexample_rules,這裏配置的pathrules,主要是由於elastalert-server目錄下用的是這個,筆者也在elastalert項目中建立了個rules的目錄,並將rules_folder配置進行同步,這個看我的喜愛自定義便可。

{
  "appName": "elastalert-server",
  "port": 3030,
  "elastalertPath": "/root/elastalert",
  "verbose": false,
  "es_debug": false,
  "debug": false,
  "rulesPath": {
    "relative": true,
    "path": "/rules"
  },
  "templatesPath": {
    "relative": true,
    "path": "/rule_templates"
  },
  "es_host": "192.168.232.191",
  "es_port": 9200,
  "writeback_index": "elastalert_status"
}

起服務

npm start

容器方式

官網提供的命令依舊是很模糊,不少同窗直接運行了,也沒報錯,可是也沒正常運行,這是由於跟上面同樣,下面這些目錄都要對應修改,具體參考上面配置文件便可,最重要的仍是要明白總體架構,三個項目各自的做用,知道原理就一目瞭然了,但不得不說若是官方文檔描述地詳細一點,你們也許會更容易地搞成功。

docker run -d -p 3030:3030 \
    -v `pwd`/config/elastalert.yaml:/opt/elastalert/config.yaml \
    -v `pwd`/config/config.json:/opt/elastalert-server/config/config.json \
    -v `pwd`/rules:/opt/elastalert/rules \
    -v `pwd`/rule_templates:/opt/elastalert/rule_templates \
    --net="host" \
    --name elastalert bitsensor/elastalert:latest

總結

本文從elastalert的安裝講起,接着涉獵rule配置、email配置等環節,而後經過測試和運行來對rule文件進行驗證,最後再詳細介紹了elastalert-kibana-plugin的安裝和用法。

總的來講,elastalert圍繞es所提供的告警功能是很強大的,文中提供的案例只是冰山一角,你們感興趣的能夠多看看官方文檔,elastalert的官方文檔仍是很全的。

至於elastalert-kibana-plugin這個插件,筆者認爲通常般,配置過程稍顯麻煩,其次功能很弱,跟後端手動修改配置文件沒什麼兩樣,也沒有同名校驗這些機制,相比而言,sentinlUI就顯得簡單美觀了,請聽下回分解。

refer

  1. ElastAlert監控日誌告警Web攻擊行爲
  2. ElastAlert:『Hi,咱服務掛了』
  3. ElastAlert介紹和安裝-1
  4. elastalert的簡單運用
  5. ElastAlert 基於Elasticsearch的監控告警
  6. elastAlert之kibana的插件使用
  7. Install plugins
  8. plugin management custom url
相關文章
相關標籤/搜索