[ElastAlert]介紹和安裝-1

寫在前面的話

最近幹起了運維的活;代碼改造,搭建elk,搭建告警,此處作些個總結。php


環境介紹

Ubuntu14
Elasticsearch 5.1.2
Kibana 5.1.2html


安裝

官網網址:python

https://elastalert.readthedoc...git

執行:github

git clone https://github.com/Yelp/elastalert.git 
cd elastalert
python setup.py install            //可能須要sudo
Pip install -r requirements.txt    //可能須要sudo
cp config.yaml.example config.yaml

注意若是你用的是elk5.0, elastalert master還不支持,你須要本身切換分支到 support_es5docker


結構介紹

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

elastalert-create-index ElastAlert 會把執行記錄存放到一個 ES 索引中,該命令就是用來建立這個索引的,默認狀況下,索引名叫 elastalert_status。其中有 4 個 _type,都有本身的 @timestamp 字段,因此一樣也能夠用 kibana 來查看這個索引的日誌記錄狀況。json

注意:實際上,kibana5.0上並不能打開此索引,多是兼容性問題,往後在想辦法。數組

elastalert-rule-from-kibana 從 Kibana3 已保存的儀表盤中讀取 Filtering 設置,幫助生成 config.yaml 裏的配置。不過注意,它只會讀取 filtering,不包括 queries。
沒使用過app

elastalert-test-rule 測試自定義配置中的 rule 設置。
注意:es5的話還不支持 test 功能


基本使用

運行命令,加載全部rules:

python -m elastalert.elastalert --config ./config.yaml

或者單獨執行 rules_folder 裏的某個 rule:

python -m elastalert.elastalert --config ./config.yaml --rule ./examele_rules/one_rule.yaml

Elastalert支持的警告類型

  • Command

  • Email

  • JIRA

  • OpsGenie

  • SNS

  • HipChat

  • Slack

  • Telegram

  • Debug

詳見:http://elastalert.readthedocs...


配製結構

和 Watcher 相似(或者說也只有這種方式),ElastAlert 配置結構也分幾個部分,可是它有本身的命名。(Watcher快出個官方工具吧,純接口太累了)


config.ymal中的配置項

  • Rules_folder:用來加載下一階段rule的設置,默認是example_rules

  • Run_every:用來設置定時向elasticsearch發送請求

  • Buffer_time:用來設置請求裏時間字段的範圍,默認是45分鐘

  • Es_host:elasticsearch的host地址

  • Es_port:elasticsearch 對應的端口號

  • Use_ssl:可選的,選擇是否用SSL鏈接es,true或者false

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

  • Es_username:es認證的username

  • Es_password:es認證的password

  • Es_url_prefix:可選的,es的url前綴(個人理解是https或者http)

  • Es_send_get_body_as:可選的,查詢es的方式,默認的是GET

  • Writeback_index:elastalert產生的日誌在elasticsearch中的建立的索引
    Alert_time_limit:失敗重試的時間限制

詳見:http://elastalert.readthedocs...


Elastalert的rule規則

  • name:配置,每一個rule須要有本身獨立的name,一旦重複,進程將沒法啓動。

  • type:配置,選擇某一種數據驗證方式。

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

  • filter:配置,設置向ES請求的過濾條件。

  • timeframe:配置,累積觸發報警的時長。

  • 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

背景:我已盡用docker 搭建好了elk,日誌已經接入,就差告警了。
按優先級,有個需求,就是日誌 status > 500 時候就行告警。

先在kibana 上把查詢語句調試好了,比較簡單

status: >=500

編輯elastalert下的config.yaml文件

rules_folder: example_rules
run_every:
  seconds: 5  #表明每5秒鐘輪詢query es。

# ElastAlert will buffer results from the most recent
# period of time, in case some log sources are not in real time
buffer_time:
  minutes: 5  #由於日誌進入elk會有延遲,能夠配製query 的向前的時間範圍,這是5分鐘,即查詢 time[now-5m, now], 這樣包括了相對多的日誌數了。

# The elasticsearch hostname for metadata writeback
# Note that every rule can have it's own elasticsearch host
es_host: 192.168.1.100
es_port: 9200

#郵箱告警必配
smtp_host: smtp.sina.com
smtp_port: 465
#保存了郵箱驗證的帳號密碼信息
smtp_auth_file: example_rules/smtp_auth_file.yaml
from_addr: xxxx@sina.com

use_ssl: False

# Option basic-auth username and password for elasticsearch
#es_username: someusername
#es_password: somepassword

#elastalert 須要在 es保存數據,這是實用的索引名稱,可默認
writeback_index: elastalert_status

# If an alert fails for some reason, ElastAlert will retry
# sending the alert until this time period has elapsed
alert_time_limit:
  days: 2

編輯example_rules/example_test.yaml 文件內容以下:

# Alert when the rate of events exceeds a threshold

# (Optional)
# Elasticsearch host
#es_host: 192.168.1.100

# (Optional)
# Elasticsearch port
#es_port: 9200

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

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

# (Required)
# Rule name, must be unique
name: name_alert_qycloud_status_error

# (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: monitor-*

# (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:
  minutes: 5

# (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

#此處是es5 的寫法
filter:
- query_string:
    query: "status: >=500"

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

#我這是用告警使用命令行,自定義更好
pipe_match_json: true
command: ["/home/df/elastalert/php_alert.php"]

# (required, email specific)
# a list of email addresses to send alerts to
email:
- "xxxxx@qq.com"

上面的規則,說明在5分鐘的時間窗口中,若是status: >=500 達到5次,就就行告警。

啓動elastalert服務,監聽elasticsearch

python -m elastalert.elastalert --verbose --rule example_rules/example_test.yaml

看下運行狀況:

INFO:elastalert:Sleeping for 4 seconds
INFO:elastalert:Queried rule name_alert_qycloud_status_error from 2017-01-29 20:05 CST to 2017-01-29 20:10 CST: 6 / 6 hits
INFO:elastalert:Alert for name_alert_qycloud_status_error at 2017-01-29T12:10:21.651Z:
INFO:elastalert:name_alert_qycloud_status_error

At least 5 events occurred between 2017-01-29 20:05 CST and 2017-01-29 20:10 CST

@read_timestamp: 2017-01-29T12:10:24.043Z
@timestamp: 2017-01-29T12:10:21.651Z
@version: 1
_id: AVnqGcU6GEG-kKWj4PKc
_index: monitor-2017.01.29
_type: json_php_monitor
app: AYSaaS-master
beat: {
    "hostname": "dfdeMacBook-Air.local", 
    "name": "dfdeMacBook-Air.local", 
    "version": "5.1.1"
}
client: 127.0.0.1
elapsed: 0
ent_id: 
error: 
......
.......

在看下告警使用的php腳本內容,只是保存告警的第一條log信息:

$fp = fopen('php://stdin', 'r');
$result = '';

while(!feof($fp)) {
    $result .= fgets($fp, 128);
}
fclose($fp);

file_put_contents('/tmp/alert_test', $result . "\r\n");

關於郵件報警配製

尚未配製成功。。
主要關注的配製參數:

#郵箱告警必配
smtp_host: smtp.sina.com
smtp_port: 465
#保存了郵箱驗證的帳號密碼信息
smtp_auth_file: example_rules/smtp_auth_file.yaml
from_addr: xxxx@sina.com

smtp_auth_file.yaml 內容:

user:xxx
password: xxx

參考網址

http://kibana.logstash.es/con...

http://blog.csdn.net/pujiaoli...

http://www.chinacloud.cn/show...

相關文章
相關標籤/搜索