文章轉載自:https://blog.csdn.net/UbuntuTouch/article/details/105340379
在Elasticsearch可以提供給我們數據的存儲及快速的搜索,但是如果能夠實時地根據一些條件來發送警報則對我們的應用來說將會非常地有用。在今天的文章中,我們將講述如何使用API的方法利用Elasticsearch來生成警報。
我們今天的配置環境如下:
在上面,我們使用一個MacOS來安裝我們的Elasticsearch及Kibana,同時在一個虛機上安裝我們的Filebeat。在下面的配置中,我們將講述該如何進行安裝。
安裝
Elasticsearch
在安裝完后,我們需要做如下的調整。打開config/elasticsearch.yml文件,並修改:
cluster.name: elasticsearch
network.host: 0.0.0.0
discovery.type: single-node
在這里我們配置一個節點的Elasticsearch,同時我們配置network.host: 0.0.0.0,這樣保證我們的Elasticsearch綁定於每一個網路接口上。
修改完上面的配置后,我們重新啟動Elasticsearch:
我們可以在Elasticsearch啟動的Log里找到相應的啟動地址。我們在瀏覽器中打入上面顯示的地址:192.168.0.100:9200
如果我們能夠看到上面的輸出,那么則表明我們的Elasticsearch安裝是成功的。
Kibana安裝
為了能夠使得我們的Kibana能訪問Elasticsearch及被我們的Beats所訪問到,我們必須修改config/kibana的相應的配置:
server.host: "192.168.0.100"
elasticsearch.hosts: ["http://192.168.0.100:9200"]
我們在自己的瀏覽器中打入如下地址:
如果你能發現上面的界面,則表明你的Kibana的安裝是成功的。
為了能夠實現對log的監控,我們必須使用Start a 30-day trial授權:
Filebeat安裝
打開我們的Kibana界面:
我們點擊Add log data:
找到System logs:
Ubuntu OS是Debian系統。我們選擇DEB平台,讓后嚴格地安照上面的信息來進行安裝。在這里我必須指出的是:我們必須修改/etc/filebeat/filebeat.yml文件的配置以使得filebeat能夠連接上我們的Kibana及Elasticsearch。為此,我們打開filebeat.yml配置文件,對該文件進行如下的修改:
sudo vi /etc/filebeat/filebeat.yml
在這里,我們必須注意的是:替換上面的IP地址為你自己電腦上的IP地址。這個IP地址是你的Elasticsearch及Kibana的運行IP地址。你可以通過ifconfig命令來獲得。
一旦完成上面的配置后,我們安裝Kibana中的命令:
sudo service filebeat start
來啟動filebeat這個服務。如果我們安裝正確的話,我們可以在Kibana中看到數據進來:
如果我們能夠看到有數據在上面的Discover中來,則表明我們的Filebeat的安裝是成功的。
我們可以在Ubuntu的terminal中打入如下的命令:
sudo logger -t JUSTME this is message 2
等過一點時間,我們通過Kibana來查詢我們的數據:
上面的命令生成一個process.name為JUSTME的log信息。我們可以在Kibana中查詢到這個信息。
Watcher API
我們將使用Watcher API來進行監控。請大家參考Elastic的官方文檔https://www.elastic.co/guide/en/elasticsearch/reference/current/watcher-api.html。簡單地說,為了配置一個Watcher,我們必須配置如下的幾個:
PUT _watcher/watch/my-justme-watcher
{
"trigger": {},
"input": {},
"condition": {},
"actions": {}
}
我們下面來分別進行描述:
trigger
這個定義多次實踐watcher運行一次。比如我們可以定義如下:
"trigger": {
"schedule" : {
"interval": "1h"
}
},
上面表明,我們希望watcher每一個小時運行一次。針對我們的情況,我們定義為:
"trigger": {
"schedule": {
"cron": "0 0/1 * * * ?"
}
},
上面表明,我們希望每一分鍾運行一次。
input
這個是定義alert想搜索的index,及針對多長時間的index來進行的搜索的:
"input": {
"search": {
"request": {
"indices": [
"filebeat-*"
],
"body": {
"query": {
"bool": {
"must": {
"match": {
"process.name": "JUSTME"
}
},
"filter": {
"range": {
"@timestamp": {
"from": "{{ctx.trigger.scheduled_time}}||-5m",
"to": "{{ctx.trigger.triggered_time}}"
}
}
}
}
}
}
}
}
},
在上面,我們想針對filebeat-*的索引來進行搜索。如果process.name含有JUSTME,則表明有一個匹配。同時我們針對在過去5分鍾內發生的事件來進行查詢。
condition
我們定義如下:
"condition" : {
"compare" : { "ctx.payload.hits.total" : { "gt" : 0 }}
},
上面顯示如果在查詢結果中,有至少一個的結果,那么就會發送出alert。
actions
這個是定義當上面的condition被滿足時,需要采取的一些行動。這些行動可以在地址找到。目前Watcher支持的action為: email,webhook,index,logging,slack及pagerduty。
我們使用最簡單的logging:
"actions": {
"log": {
"logging": {
"text": "WARNING: find JUSTME(s) in filebeat in the last 5 minutes"
}
}
}
如果大家想如何實現Slack的通知,請參考文章X-Pack:創建閾值檢查警報 。
經過上面的配置后,我們alert配置如下:
PUT _watcher/watch/my-justme-watcher
{
"trigger": {
"schedule": {
"cron": "0 0/1 * * * ?"
}
},
"input": {
"search": {
"request": {
"indices": [
"filebeat-*"
],
"body": {
"query": {
"bool": {
"must": {
"match": {
"process.name": "JUSTME"
}
},
"filter": {
"range": {
"@timestamp": {
"from": "{{ctx.trigger.scheduled_time}}||-5m",
"to": "{{ctx.trigger.triggered_time}}"
}
}
}
}
}
}
}
}
},
"condition": {
"compare": {
"ctx.payload.hits.total": {
"gt": 0
}
}
},
"actions": {
"log": {
"logging": {
"text": "WARNING: find JUSTME(s) in filebeat in the last 5 minutes"
}
}
}
}
執行上面的命令。顯示結果:
{
"_id" : "my-justme-watcher",
"_version" : 1,
"_seq_no" : 6,
"_primary_term" : 1,
"created" : true
}
測試Watcher
在很多情況下,如果我們設置的時間比較久,我們可能等不了那么久才做一個測試。Elastic為了方便我們的測試,提供了_execute接口:
PUT _watcher/watch/my-justme-watcher/_execute
通過上面的接口,我們不需要等在schedule中設置的那么久的時間才運行一下我們的watcher。上面的命令可以直接幫我們運行watcher。
針對我們的情況,我們在Ubuntu OS的terminal中運行如下的命令:
sudo logger -t JUSTME this is message 3
我們切換到Elasticsearch的運行terminal中,等一小會,我們可以看到:
上面顯示,我們已經有一個事情發生了:在filebeat的log里找到含有JUSTME的事件。上面的信息雖然顯示了有JUSTME的事件發生了,但是它並沒有顯示有多少個事件發生了。為此,我們需要修改一下我們的watcher:
PUT _watcher/watch/my-justme-watcher
{
"trigger": {
"schedule": {
"cron": "0 0/1 * * * ?"
}
},
"input": {
"search": {
"request": {
"indices": [
"filebeat-*"
],
"body": {
"query": {
"bool": {
"must": {
"match": {
"process.name": "JUSTME"
}
},
"filter": {
"range": {
"@timestamp": {
"from": "{{ctx.trigger.scheduled_time}}||-5m",
"to": "{{ctx.trigger.triggered_time}}"
}
}
}
}
}
}
}
}
},
"condition": {
"compare": {
"ctx.payload.hits.total": {
"gt": 0
}
}
},
"actions": {
"log": {
"logging": {
"text": "WARNING: find {{ctx.payload.hits.total}} JUSTME(s) in filebeat in the last 5 minutes"
}
}
}
}
在上面,我們使用ctx.payload.hits.total來展示發生了幾次。再次我們在Ubuntu的terminal中連續打入如下的幾個log信息:
我們連續地生成5個含有JUSTME的事件,我們再次回到Elasticsearch運行的terminal中查看:
在這一次,我們正確地顯示了有5個這樣的事件。