1、logstash 做監控的優劣
適合match-then-alert 的方式
logstash-filter-metric
logstash-input-http_poller
無狀態、進程間數據無法交流
無復雜表達能力
logstash 做監控沒有復雜的語法,同時越復雜的功能越消耗資源,本身logstash 就非常的消耗資源
利用logstash mail 插件有點low
2、spark 做監控的優劣
streaming 方式做准實時監控,需要預定義模式和編程能力,checkpoint 會降低性能
sql 方式做定期統計監控,運行緩慢
es-hadoop 方式讀取es數據,可以利用sql來讀取es數據,spark可以並發線程直連每個es的shard,
但是:意味着query出來的數據需要轉存一份到spark里,利用sparkSQL做聚合統計后,數據再刪除,
重復使用一次IO
非常吃內存
3、Elastalert
elastalert 是Yelp公司開源的用python 2.6 寫的報警框架
屬於后來elastic.co公司出品的Watcher的同類產品
文檔地址是:
http://elastalert.readthedocs.io/en/latest/elastalert.html#
我們創建的規則都要寫道es里,所以elastalert要創建index到es
3.1、elastaliert 的配置語法:
query(watcher 的 trigger) 查詢
rule(watcher 的 input,comdition) 規則
enhancements(watcher 的 transform)
alert(watcher 的 action) 報警
3.2、query 配置:
除了有關es服務器的配置以外,主要包括:
1、‘run_every’配置,用來設置定時向ES發請求,默認五分鍾
2、‘buffer_time’配置,用來設置請求的時間字段的范圍,默認45分鍾,查多長時間段內的數據
3、‘ruler_folder’配置,用來加載下一階段的rule設置,默認是example_rulers
4、’timestamp_field‘配置,設置'buffer_time‘時 針對哪個字段,默認是@timestamp
5、'timestamp_type'配置,設置'timestamp_field'的事件類型,elastalert 內部也需要轉換時間對象,默認是"ISO8601",也可以是'UNIX'
run_every:我們到 es 里去查詢數據,定時的輪詢去查詢數據,滿足一定規則的,這個我們可以全局的指定,也可以每個配置文件單獨指定的,默認是全局的,建議每一個配置文件單獨指定、
3.3 rule 配置
rule 設置各自獨立以獨立的文件方式存儲在'rules_folder'設置的目錄里,其中你可以定義下面這些參數,其中可以
定義下面這些參數:
name配置:每個rule需要有自己獨立的name,一旦重復,進程將無法啟動
type配置:選擇某一種數據驗證方式
index配置:從某類索引里讀取數據,支持時間配置
filter配置:設置向es請求的過濾條件
timeframe配置:累計觸發報警的時長(連續多長時間有異常才發報警)
alert配置:設置觸發報警時執行那些報警手段
內置的rule介紹:
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_sizer默認30天)范圍內最多的terms_size(默認50)個結果以外的數據
cardinality: 在相同 query_key條件下, timeframe范圍內 Cardinality_field的值超過max_cardinality或者低於 min_cardinality
3.4 enhancements 方式
match_enhancements 配置,設置一個數組,在報警內容發送到alert之前修改具體數據elastalsert 默認
不提供具體的enhancements實現,需要自己去擴展
不過,作為通用的方式,elastalert 提供幾個便捷選項,把kibana 地址加入報警
1、generate_kibana_link: 自動生成一個kibana3 的臨時儀表板在報警內容上
2、use_kibana_dashboard:采用現成的kibana3 儀表盤附屬在報警內容上
3、use_kibana4_dashboard:采用現成的kibana4 儀表盤附屬在報警內容上
我們現在使用的是kibana 5,這個是沒有關系的,我們配置上URL,他是不會識別我們的kibana的版本號的。所以這個沒有關系的,我們直接
把我們的kibana URL配置上就行
3.5 alert 配置
alert配置是一個數組,目前elastalert 支持的報警方式有:
Command
Email
JIRA
OpsGenie
SNS
HipChat
Slack
Telegram
Debug
Stomp
我們在使用的時候要預防報警風暴(在實際使用中我們遇到過可能一分鍾成百上千的錯誤,要是都是發出來,就有問題了)。我們利用下面的一些措施來控制報警風暴:
1、aggregation:設置一個時長,則該時長內,所有的報警(同一個配置文件內的報警)最終合並在一起發送一次:
2、realert:設置一個時長,在該時間內,相同 query_key 的報警只發一個
3、exponential_realert: 設置一個時長,必須大於realert 設置,則在realert到exponential_realert之間,每次報警之后,realert 自動翻倍
3.5.1 alert command 方式
1、command 最靈活也最簡單,默認采用 '%{fieldname}s' 格式
command:["/bin/send_alert的腳本","--username","%{username}s","--time","%(key_as_string)s"]
2、如果要用的比較多,可以開啟'pipe_match_json'參數,會把整個過濾到的內容,以一整個JSON字符串的方式管道輸入指定腳本
3.5.2 alert email 方式:
1、email方式采用SMTP協議,所以有一系列‘smtp_*’的配置,然后加上'email'參數提供收件人地址數組
2、特殊的是email 和 jira兩種方式,elastalert 提供了一些內容格式化模板
3、比如可以這樣控制郵件標題
alert_subject:"issue:{0} occurred at {1}"
alert_subject_args:
- issue.name
- "@timestamp"
4、而默認的郵件內容模板是:
body = rule_name
{alert_text}
ruletype_text
{top_counts}
{field_values}
5、這些內容同樣可以通過'alert_text' (及對應alert_text_args)等來修改
配置案例:
alert:
- "email"
alert_text:"test"
smtp_host:smtp.exmail.qq.com
smtp_auth_file:smtp_auth_file.yaml
email_reply_to:monitor@bigbao.com
from_addr:monitor@bigbao.com
4、針對業務系統的監控系統:
業務系統與基礎設施的關注點差異
基於日志 VS 基於探針
Rsyslog + ES
模板:
name: test1-front-rule
type: any
index: test1-front-*
realert:
minutes: 0
num_events: 1
filter:
- query_string:
query: "Level:ERROR"
smtp_host: smtp.bigbao.com
smtp_port: 25
smtp_auth_file: /data/package/elastalert/smtp_auth_file.yaml
email_reply_to: big@bigbao.com
from_addr: big@bigbao.com
alert:
- "email"
alert_subject: "[front] service ERROR !!!"
#include: ["Date","Thread","RequestId","msg"]
#exclude: ["@timestamp","Class","Level","_id","_index","_type","beat","kafka"]
#alert_text_type: alert_text_only
alert_text: "
Service_Name: {} \n
Date: {} \n
Host: {} \n
Thread: {} \n
RequestId: {} \n
msg: {} \n
"
alert_text_args:
- type
- Date
- beat.hostname
- Thread
- RequestId
- msg
email:
- "big@bigbao.com"