原文地址: https://www.tony-yin.site/201...
今天聊聊ES
的告警,X-Pack
提供了報警組件Alert
,可是這個功能是須要付費,在尋求其餘方案的時候,發現了ElastAlert
,能夠說這是一款爲ES
量身定製的告警組件,可以完美替代Alert
提供的全部功能。今天就ElastAlert
強大的告警功能和筆者實踐過程當中遇到的一些問題進行分享。html
ElastAlert
是基於python2
開發的一個告警框架,它主要有如下特色:前端
網上已經有了至關多的基礎介紹文章,可是筆者發現大多數文章的內容都是過期的,甚至官方文檔常常還會展現一些棄用配置;還有有始無終的通病,每每不全面,常常對一些關鍵性的細節不說起;再者一些地方解釋地不夠清晰,致使歧義。筆者在搭建和測試過程當中同時借鑑多篇文章,而後在反覆嘗試中最後才成功,這其中失敗了不少次,浪費了不少時間,因此這篇文章借鑑了上面提到的種種問題,保證本文的全面性、細節性以及具體性。python
Centos7 Elasticsearch 6.4.2 Kibana 6.4.2
安裝較爲簡單,但爲了避免有始無終仍是作一個完整的步驟介紹: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_folder
、es_host
、es_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
能夠在/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-kibana
從Kibana3
已保存的儀表盤中讀取Filtering
設置,幫助生成config.yaml
裏的配置。不過注意,它只會讀取 filtering
,不包括queries
。elastalert-test-rule
測試自定義配置中的rule
設置。執行elastalert-create-index
命令在ES
建立索引,這不是必須的步驟,可是強烈建議建立。由於對於審計和測試頗有用,而且重啓ES
不影響計數和發送alert
.shell
$ elastalert-create-index
具體參見文檔: setting-up-elasticsearchnpm
rule
配置算是ElastAlert
最核心的功能了,支持11
種告警規則,就不一一介紹了,選用一個最爲廣泛使用的告警規則frequency
,告警方式也選用最廣泛的email
。json
# 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 host
、smtp port
、from addr
和to_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></center>
避免必定時間段中重複告警,能夠配置realert
和exponential_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
能夠自定義告警內容,內部是使用Python
的format
來實現的。
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
以前先經過elastalert-test-rule
命令來測試一下
$ elastalert-test-rule ~/elastalert/example_rules/example_frequency.yaml
詳情參考文檔:http://elastalert.readthedocs...
啓動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></center>
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
摘自:ElastAlert介紹和安裝-1
詳細請參考文檔:https://elastalert.readthedoc...
除了email
,還有jira
、webhook
等內置告警方式,因爲筆者沒有實踐,就不一一贅述了。
第三方的微信和釘釘:
也能夠根據文檔本身實現:https://elastalert.readthedoc...
elastalert-kibana-plugin
是圍繞elastalert
作的一個kibana
展現插件,能夠在kibana
上建立、編輯和刪除告警,可是說實話這個插件還不是很好用,首先配置就有點麻煩,其次展現效果並不友好,提供配置rule
的方式太專業化了,對小白或者通常用戶來講要求稍高。
下載6.4.2
的release
安裝包
$ 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
上面安裝的只是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
默認的配置須要修改,尤爲是elastalertPath
和rulesPath
中的path
選項
elastalertPath
表示的是咱們最初安裝的elastalert
倉庫的目錄,也就是說elastalert-kibana-plugin
運行須要三個倉庫,分別是elastalert
、elastalert-kibana-plugin
、和elastalert-server
,分別對應的是後端代碼、前端代碼、webserver
,這也就是筆者以前提到的安裝提到的安裝麻煩所在了;
其次rulesPath
中path
選項表示運用elastalert-kibana-plugin
插件建立告警後rule
文件存放的目錄,上面筆者在elastalert
配置的rules_folder
爲example_rules
,這裏配置的path
爲rules
,主要是由於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
這個插件,筆者認爲通常般,配置過程稍顯麻煩,其次功能很弱,跟後端手動修改配置文件沒什麼兩樣,也沒有同名校驗這些機制,相比而言,sentinl
的UI
就顯得簡單美觀了,請聽下回分解。