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

引子:

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

開搞

系統:centos 7

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-devel4

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

pip install setuptools==1.1.6

5,現在可以進入elastalert 目錄開搞了

cd elastalert

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

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

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實現故障提前感知預警功能

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:[email protected]
from_addr: [email protected]

#接受報警郵箱的地址,可以寫多個,當然後邊搞個郵件組最好了。
# (required, email specific)
# a list of email addresses to send alerts to
email:
- "[email protected]"
- "[email protected]"

接下來我們需要配置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實現故障提前感知預警功能

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章