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"