本人公衆號,歡迎來留言。
html
監控系統對於任何的業務系統來講都是很是重要的,不少時候它可以讓咱們及時的治療線上的問題,避免更大的問題產生,可是如今的監控系統基本都是基於問題發生了以後,雖然也能夠利用性能方面的產生作到提早的預知,可是有效性上可能能就沒有那麼高。那怎麼提升提早的感知能力呢?怎麼讓問題消滅在萌芽中呢?囉嗦一下咱們引入一箇中醫的概念,中醫界公認最牛逼的醫生是治療「未病」的醫生。所謂治療「未病」百度百科給出以下解釋:「上醫治未病」最先源自於《黃帝內經》所說:「上工治未病,不治已病,此之謂也」。「治」,爲治理管理的意思。「治未病」即採起相應的措施,防止疾病的發生發展。其在中醫中的主要思想是:未病先防和既病防變。」
那咱們在運維監控中是否是也能夠用這樣的思想暱?答案是固然能夠了,elk 不只幫咱們把日誌收集,存儲,分析,圖形化,咱們還能夠深度挖掘其中的有用數據,能夠把網絡設備日誌,server idrac 卡日誌,os 日誌,應用日誌等等,經過預約的錯誤關鍵字符串來達到剛剛講的治療「未病」的目的。不論是物理硬件仍是系統層,仍是應用層,錯誤的第一反饋點就是日誌,咱們把日誌充分的挖掘就可以達到有錯誤先感知,提早處理問題,不讓真正的問題發生,這樣就可以更加高效的辦公,不至於出現問題手忙腳亂的應對了。同時之後能夠結合NB的AI 算法提升準確率,那就更加美美嗒!前端
#該項目github 官方地址及官方doc,供各位客官參考。
https://github.com/Yelp/elastalert
https://elastalert.readthedocs.io/en/latest/python
系統:centos 7ios
cd /usr/local/ git clone https://github.com/Yelp/elastalert.git
yum install gcc libffi-devel python-devel openssl-devel4nginx
pip install setuptools==1.1.6git
cd elastalert github
pip install -r requirements.txt
web
pip install elastalert算法
elastalert-create-index 命令用來建立ES索引的,默認爲elastalert_status elastalert-test-rule 測試自定義配置中的rule設置 elastalert-rule-from-kibana 從Kibana3中直接導出Filters
elastalert-create-index
根據本身的狀況,填入elasticsearch的相關信息,關於 elastalert_status部分直接回車默認的便可。 以下圖,主要是第一個和第二個,其他的根據本身的狀況來。
centos
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"
elastalert-test-rule my_rule.yaml
測試結果以下,若是有問題會提示問題,若是沒有問題就會告訴你successfully。
#我修改了一下配置文件,把elasticsearch的端口改爲9800 以後會有以下報錯:
python -m elastalert.elastalert --verbose --rule my_rule.yaml
##本身生成一個錯誤,驗證一下是否可以在預設的前提下報警,個人測試結果以下圖,如第二箭頭處提示已經觸發報警,郵件已經發出了。
#檢驗結果的時候到了,看看郵箱裏邊有沒有報警,俺滴神啊,郵箱裏邊有沒有。。。!啊哈,
有了以下圖,elastalert 是每分鐘去elasticsearch中去查詢一次,num_hits 是咱們指定的index 過去一分鐘中有多少調條日誌產生,num_matches 是指有多少條符合了咱們的過濾規則。到這裏這項偉大的工程基本就結束了,餘下的就是收尾了!正好抓到有人嘗試登錄我機器的記錄,這個就體現出來日誌報警的重要性了!
#在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
#啓動服務,check 服務啓動狀態
#進入到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 管理界面來結果全部服務了,以下圖: