ELK藉助ElastAlert實現故障提早感知預警功能

本人公衆號,歡迎來留言。
ELK藉助ElastAlert實現故障提早感知預警功能html

引子:

監控系統對於任何的業務系統來講都是很是重要的,不少時候它可以讓咱們及時的治療線上的問題,避免更大的問題產生,可是如今的監控系統基本都是基於問題發生了以後,雖然也能夠利用性能方面的產生作到提早的預知,可是有效性上可能能就沒有那麼高。那怎麼提升提早的感知能力呢?怎麼讓問題消滅在萌芽中呢?囉嗦一下咱們引入一箇中醫的概念,中醫界公認最牛逼的醫生是治療「未病」的醫生。所謂治療「未病」百度百科給出以下解釋:「上醫治未病」最先源自於《黃帝內經》所說:「上工治未病,不治已病,此之謂也」。「治」,爲治理管理的意思。「治未病」即採起相應的措施,防止疾病的發生發展。其在中醫中的主要思想是:未病先防和既病防變。」
那咱們在運維監控中是否是也能夠用這樣的思想暱?答案是固然能夠了,elk 不只幫咱們把日誌收集,存儲,分析,圖形化,咱們還能夠深度挖掘其中的有用數據,能夠把網絡設備日誌,server idrac 卡日誌,os 日誌,應用日誌等等,經過預約的錯誤關鍵字符串來達到剛剛講的治療「未病」的目的。不論是物理硬件仍是系統層,仍是應用層,錯誤的第一反饋點就是日誌,咱們把日誌充分的挖掘就可以達到有錯誤先感知,提早處理問題,不讓真正的問題發生,這樣就可以更加高效的辦公,不至於出現問題手忙腳亂的應對了。同時之後能夠結合NB的AI 算法提升準確率,那就更加美美嗒!前端

#該項目github 官方地址及官方doc,供各位客官參考。
https://github.com/Yelp/elastalert
https://elastalert.readthedocs.io/en/latest/python

開搞

系統:centos 7ios

1,elastalert 須要一個固定的文件夾,之後執行程序的時候須要在這個目錄中執行,通常狀況下都會放到/usr/local/ 下,你能夠自定義;

2,經過git 下載elastalert 包,首先要求你的系統裏邊有git ,若是沒有yum 裝一下

cd /usr/local/ 
git clone https://github.com/Yelp/elastalert.git

3,安裝elastalert 須要依賴的包,這個步驟必須作,不作的話會報錯哦!

yum install gcc libffi-devel python-devel openssl-devel4nginx

4,經過pip 安裝setuptools的指定版本,這個是elastalert 要求的最低版本,pip 若是沒有的話經過east_install install pip 安裝一下就行

pip install setuptools==1.1.6git

5,如今能夠進入elastalert 目錄開搞了

cd elastalert github

6,Elastalert 已經把它依賴的包寫到了requirement.txt 咱們只是須要執行下邊的命令,就會把全部的依賴包安裝上

pip install -r requirements.txt
ELK藉助ElastAlert實現故障提早感知預警功能web

7,萬事ok 只欠 elastalert 了,執行完如下的命令咱們今天的事情就。。。。。。。還有很長的路要走。

pip install elastalert算法

8,安裝完成以後是這樣樣子滴!

ELK藉助ElastAlert實現故障提早感知預警功能

9,elastalert 安裝完成以後系統裏邊會有多出以下三個命令:

elastalert-create-index  命令用來建立ES索引的,默認爲elastalert_status
  elastalert-test-rule      測試自定義配置中的rule設置
  elastalert-rule-from-kibana   從Kibana3中直接導出Filters

10,執行以下命令在elasticsearch中建立elastalert的日誌索引

elastalert-create-index
根據本身的狀況,填入elasticsearch的相關信息,關於 elastalert_status部分直接回車默認的便可。 以下圖,主要是第一個和第二個,其他的根據本身的狀況來。
ELK藉助ElastAlert實現故障提早感知預警功能centos

11,建立配置文件,在elastalert 目錄裏邊有一個config.yaml.example 文件,咱們經過copy 一份以後修改爲本身須要的配置

cp  config.yaml.example config.yaml
   vi config.yaml
#存放elastalert 規則的文件夾,你的elastalert 放到哪裏就放到哪裏就好了
# This is the folder that contains the rule yaml files
# Any .yaml file will be loaded as a rule
rules_folder: /usr/local/elastalert/example_rules

#Elastalert 多久去查詢一下根據定義的規則去elasticsearch 查詢是否有符合規則的字段,若是有就會觸發報警,若是沒有就等待下一次時間再檢查,時間定義的單位從周到秒均可以,具體定義方法以下。
# How often ElastAlert will query Elasticsearch
# The unit can be anything from weeks to seconds
run_every:
  #seconds:1
  minutes: 1
  #hours:1
  #days:1
  #weeks:1

#當查詢開始一直到結束,最大的緩存時間。
# ElastAlert will buffer results from the most recent
# period of time, in case some log sources are not in real time
buffer_time:
  minutes: 15

#你的Elasticsearch ip地址
# The Elasticsearch hostname for metadata writeback
# Note that every rule can have its own Elasticsearch host
es_host: 192.168.115.65

#Elasticsearch 的端口
# The Elasticsearch port
es_port: 9200

#是否是用TLS 加密
# Connect with TLS to Elasticsearch
#use_ssl: True

#是否是啓動TLS證書驗證
# Verify TLS certificates
#verify_certs: True

#若是Elasticsearch 有認證的話須要把這個填寫上
# Option basic-auth username and password for Elasticsearch
#es_username: someusername
#es_password: somepassword

#配置證書存放的位置
# Use SSL authentication with client certificates client_cert must be
# a pem file containing both cert and key for client
#verify_certs: True
#ca_certs: /path/to/cacert.pem
#client_cert: /path/to/client_cert.pem
#client_key: /path/to/client_key.key

#這個是elastalert 在es裏邊寫的index
# The index on es_host which is used for metadata storage
# This can be a unmapped index, but it is recommended that you run
# elastalert-create-index to set a mapping
writeback_index: elastalert_status

#若是alert當時沒有發出去重試多久以後放棄發送;
# If an alert fails for some reason, ElastAlert will retry
# sending the alert until this time period has elapsed
alert_time_limit:
  days: 2

##rules 的定義
cd example_rules/
cp example_frequency.yaml my_rule.yaml
vi my_rule.yaml

# Alert when the rate of events exceeds a threshold
#Elasticsearch  機器
# (Optional)
# Elasticsearch host
es_host: 192.168.115.65

#Elasticsearch  端口
# (Optional)
# Elasticsearch port
es_port: 9200

#是否使用ssl 連接
# (OptionaL) Connect with SSL to Elasticsearch
#use_ssl: True

#若是elasticsearch 有認證,填寫用戶名和密碼的地方
# (Optional) basic-auth username and password for Elasticsearch
#es_username: someusername
#es_password: somepassword

#rule name 必須是獨一的,否則會報錯,這個定義完成以後,會成爲報警郵件的標題
# (Required)
# Rule name, must be unique
name: xx-xx-alert

#配置一種數據驗證的方式,有 any,blacklist,whitelist,change,frequency,spike,flatline,new_term,cardinality 
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
# (Required)
# Type of alert.
# the frequency rule type alerts when num_events events occur with timeframe time
#我配置的是frequency,這個須要兩個條件知足,在相同 query_key條件下,timeframe 範圍內有num_events個被過濾出來的異常
type: frequency 

#這個index 是指再kibana 裏邊的index,支持正則匹配,支持多個index,同時若是嫌麻煩直接* 也能夠。
# (Required)
# Index to search, wildcard supported
index: es-nginx*,winlogbeat*

#時間出發的次數
# (Required, frequency specific)
# Alert when this many documents matching the query occur within a timeframe
num_events: 5

#和上邊的參數關聯,也就是說在4分鐘內出發5次會報警
# (Required, frequency specific)
# num_events must occur within this amount of time to trigger an alert
timeframe:
  minutes: 4

#這個仍是很是關鍵的地方,就是你但願程序的message裏邊出現了什麼樣的關鍵字就報警,這個其實就是elasticsearch 的query語句,支持 AND&OR等。
# (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:
    query_string: 
      query: "message: 錯誤  OR Error"
#一但須要報警用那種方式報警,支持以下的方式,同時官方支持自定義,我用常規的郵件方式做爲報警方式。
#自定義alert 方式
https://elastalert.readthedocs.io/en/latest/recipes/adding_rules.html#writingrules
https://elastalert.readthedocs.io/en/latest/recipes/adding_alerts.html#writingalerts 

Command
Email
JIRA
OpsGenie
SNS
HipChat
Slack
Telegram
Debug
Stomp
# (Required)
# The alert is use when a match is found
alert:
- "email"
#在郵件正文會顯示你定義的alert_text
alert_text: "Ref Log http://192.168.115.65"
#報警郵箱的smtp server
smtp_host: smtp.126.com
#報警郵箱的smtp 端口
smtp_port: 25
#須要把認證信息寫到額外配置文件裏,須要user和password兩個屬性
smtp_auth_file: /usr/local/elastalert/example_rules/smtp_auth_file.yaml
email_reply_to:test@126.com
from_addr: test@126.com

#接受報警郵箱的地址,能夠寫多個,固然後邊搞個郵件組最好了。
# (required, email specific)
# a list of email addresses to send alerts to
email:
- "test@126.com"
- "test1@126.com"

接下來咱們須要配置smtp認證文件了,touch 一個配置文件
vi smtp_auth_file.yaml
#文件配置內容以下:

user: "test"
password: "test@12345"

12,經過elastalert-test-rule 測試一下咱們寫的rule 是否有問題

elastalert-test-rule my_rule.yaml
測試結果以下,若是有問題會提示問題,若是沒有問題就會告訴你successfully。
ELK藉助ElastAlert實現故障提早感知預警功能

#我修改了一下配置文件,把elasticsearch的端口改爲9800 以後會有以下報錯:

ELK藉助ElastAlert實現故障提早感知預警功能

13,配置檢查成功以後,咱們就能夠把程序跑起來了,把全部的日誌直接打在前端,這樣方便驗證

python -m elastalert.elastalert --verbose --rule my_rule.yaml

##本身生成一個錯誤,驗證一下是否可以在預設的前提下報警,個人測試結果以下圖,如第二箭頭處提示已經觸發報警,郵件已經發出了。

ELK藉助ElastAlert實現故障提早感知預警功能
#檢驗結果的時候到了,看看郵箱裏邊有沒有報警,俺滴神啊,郵箱裏邊有沒有。。。!啊哈,
有了以下圖,elastalert 是每分鐘去elasticsearch中去查詢一次,num_hits 是咱們指定的index 過去一分鐘中有多少調條日誌產生,num_matches 是指有多少條符合了咱們的過濾規則。到這裏這項偉大的工程基本就結束了,餘下的就是收尾了!正好抓到有人嘗試登錄我機器的記錄,這個就體現出來日誌報警的重要性了!
ELK藉助ElastAlert實現故障提早感知預警功能

14,接下來咱們有兩種方式能夠保證elastalert 正常的在後臺運行,第一種是系統服務的方式,第二種是採用supervisor方式,先來聊聊第一種方式;

#在etc 下建立程序工做目錄
mkdir -p /etc/elastalert/rules
#進入工做目錄複製剛剛建立好的配置文件
cd /etc/elastalert/
cp /usr/local/elastalert/config.yaml config.yaml
#進入rules 目錄複製rule 文件及smtp 認證文件
cp /usr/local/elastalert/example_rules/my_rule.yaml my_rule.yaml
cp /usr/local/elastalert/example_rules/smtp_auth_file.yaml smtp_auth_file.yaml

#接下來咱們須要修改配置文件中涉及到相應配置文件目錄了,
修改 config.yaml 中
rules_folder:/etc/elastalert/rules
修改my_rules.yaml 中
smtp_auth_file: /etc/elastalert/rules/smtp_auth_file.yaml

#接下來就是建立systemd服務了
cd /etc/systemd/system/
vi elastalertd.service

[Unit]
Description=elastalertd
After=elasticsearch.service

[Service]
Type=simple
User=root
Group=root
Restart=on-failure
WorkingDirectory=/usr/local/elastalert
ExecStart=/usr/bin/elastalert --config /etc/elastalert/config.yaml --rule /etc/elastalert/rules/my_rule.yaml
[Install]
WantedBy=multi-user.target

#關鍵時刻來臨了 ,開啓服務開機自啓動
systemctl enable elastalertd
ELK藉助ElastAlert實現故障提早感知預警功能
#啓動服務,check 服務啓動狀態
ELK藉助ElastAlert實現故障提早感知預警功能

15,ok 第一種方式搞定了以後,咱們來第二種啓動方式,使用supervisor管理程序啓動supervisor 的介紹請移步這裏

#進入到supervisor 目錄
cd /etc/supervisor/conf.d/
#建立程序配置文件

vi elastalert.conf
[program:elastic-alert]
command = /usr/bin/python -m elastalert.elastalert --rule /etc/elastalert/rules/my_rule.yaml --verbose 
directory= /usr/local/elastalert
autostart = true
autorestart = true
startsecs = 5
startretries = 3
user = root
redirect_stderr = true
stdout_logfile=/data/logs/elk/elastic-std.log
stderr_logfile=/data/logs/elk/elastic-error.log

#經過supervisorctl 命令加載新建立的配置文件,執行以下命令
superviosrctl
#進入交互模式,執行update 命令
update

#如今就能夠經過web 管理界面來結果全部服務了,以下圖:
ELK藉助ElastAlert實現故障提早感知預警功能

相關文章
相關標籤/搜索