最近幹起了運維的活;代碼改造,搭建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_es5
docker
安裝完成後會自帶三個命令: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
Command
JIRA
OpsGenie
SNS
HipChat
Slack
Telegram
Debug
詳見:http://elastalert.readthedocs...
和 Watcher 相似(或者說也只有這種方式),ElastAlert 配置結構也分幾個部分,可是它有本身的命名。(Watcher快出個官方工具吧,純接口太累了)
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...
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
背景:我已盡用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...