Elasticsearch開發實戰篇——基於ES的SQL報警引擎



內容來源:2017年6月10日,南京雲利來軟件科技有限公司張立丹在「Elastic Meetup 南京」進行《基於ES的SQL報警引擎》演講分享。IT 大咖說做爲獨家視頻合做方,經主辦方和講者審閱受權發佈。
python

閱讀字數:1499 | 4分鐘閱讀網絡

嘉賓演講視頻回顧及PPT: suo.im/Z5iA5

摘要

通常來講,ES的查詢語言在使用過程當中會比較麻煩,來自南京雲利來軟件科技有限公司的張丹立老師從四個方面來分析把ES換成SQL後的狀態。併發

概述

ES的聚合能力很是強,延遲低;而SQL相對於DSL來講有較高的抽象層次,更爲大衆所熟悉。在作報警引擎的時候咱們發現,純用ES難以解決咱們的問題,必需要在ES計算後進行第二次處理。RDL用「規則描述語言」,提供計算機輔助功能。函數

SQL及擴展


過濾

過濾表達式:inbyte + outbyte > 10000 AND sip = ‘192.168.0.55’url

過濾表達式有基本的四則運算,並對ES支持的某些腳本添加了一些抽象函數。線程

ES也是基於時間線的,不管是作日誌採集仍是數據監控,都要指定一個時間域。咱們作報警時首先要解決的就是時間模型,須要把時間模型抽象出一些函數。代理

過濾函數:last(5m)、last_days(3,5m)、last_weeks(4,5m)、last_weekdays(3,10m)、range(flows,[100,1000])、ip_range(sip,’192.168.0.0/24’)、date_range(…)日誌

query_string(‘sip:[192.168.0.100TO 192.168.0.200]’)cdn

以上的過濾函數都是按照ES提供的函數來進行抽象。視頻

聚合

聚合函數:count(*)、count(sip)、count(UNIQUE url)、count(inbyte + outbyte)

sum()、min()、max()、avg()

stdve()、squares()、variance()

聚合函數是根據ES提供的聚合功能來進行抽象。


咱們在對網絡數據進行報警的時候,須要對流量進行報警。流量有內部局域網訪問的流量,也有訪問外部的局域網。

ES裏有一個桶聚合的功能叫作filters,在filters裏面能夠把ip_range當成一個filters來作。

RDL腳本

經過SQL查詢ES以後,還要作進一步的處理。由於雖然ES的聚合能力很強,但它聚合後的結果處理能力仍是比較弱的。


咱們在報警模塊中開發了一套腳本語言,這個腳本語言和大部分腳本語言長得很是接近,它的主要功能就是負責查詢ES並作一些簡單的運算處理,再把報警輸出。固然也少不了一些邏輯判斷。這個腳本兼顧了一些對ES的配置功能以及運算功能,它還提供了經過SQL語句進行查詢的功能,查詢完以後能夠進行輸出。



當時有人質疑爲何不用python。首先python的併發實現起來不太人性化,若是是線程併發可能會是一個僞線程,沒有徹底併發出來;若是用進程的話,寫了不少報警規則,在調度的時候python可能就會掛了。因而咱們開發了這一套腳本,在併發上達到幾十萬是沒有問題的,這個腳本還能夠根據它的語法本身定義功能。提供這個功能能夠提升規則複用的程度。

規則


在報警的時候SQLAlert有兩種工做方式,第一種是看成程序來跑,寫完規則後在配置文件中加入,它本身就會慢慢進行調度,基本上300秒調度一次。另外一個工做方式就是它做爲代理,由用戶來寫代碼,向SQLAlert發出請求,由它對ES進行查詢,獲得查詢結果再返回給請求者。

實例一

固定閥值報警的時間範圍是過去五分鐘,報警條件是字節數超過200M或者總包數超過10000個。


如圖所示,前兩行是定義ES的主機地址和報警輸出的索引信息。中間兩行是定義閥值200M和10000個數據包。SQL語句用來計算總字節數和總包數。在查詢後的返回語句是過去五分鐘全部的SIP和DIP聚合以後的數據。在聚合的基礎上還有一個過濾功能,就是總字節數和總包數大於定義的閥值,纔會把結果輸出來再寫回到ES裏面。

實例二

咱們也不知道網絡中的數據量到底有多大,只知道過去有相同的訪問數據。這個示例的時間範圍仍是對過去五分鐘的數據進行報警,參考時間是昨天的當前時間段以前的五分鐘。報警條件是總字節數超過200M或者總包數超過10000個,且超過歷史數據的50%。


實例三

這個示例是對一段數據的變化率進行報警。參考時間是過去四周內相同時刻的30分鐘時間段,參考數據是歷史數據的90%的百分位數。當變化率超過參考數據的2倍時會進行報警。

在一個公司內部網絡流量波動很是大的狀況下,能夠把當前的變化率和昨天的變化率進行對比,若是超過了昨天的變化率可能就是一個報警。


總結

咱們作的SQLAlert模塊主要是對報警和報警風暴的抑制,報警風暴主要是經過ES自己來進行抑制。咱們對報警輸出作了兩次輸出,第一次輸出的是接受者的ES,經過SQLAlert查詢ES的告警索引,再進行第二次輸出,這樣輸出的數量就大大減小了。

我今天的分享就到這裏,謝謝你們!

相關文章
相關標籤/搜索