使用Grafana 5.2.0+在Elasticsearch中执行对数据的警报,并通知到Discord
首先
Grafana 5.2.0 在2018/6/27发布,终于可以对Elasticsearch内的数据执行警报操作了。(请在此处查看发布说明)
迄今为止,作为Elasticsearch阈值检测机制的选择除了X-Pack Alerting外,只有Elastalert这样的选择。但现在出现了一种新的方法。
本文介绍了如何使用Grafana(v5.2.1),实现对存储在Elasticsearch(v6.3.1)中的Metricbeat度量数据进行阈值检测,并将结果通知到Discord的流程。
环境准备
瞄准的环境状态
请确认Metricbeat已经启动,且持续不断地向Elasticsearch输入CPU使用率。
同时,请确保Grafana已经启动,并且连接到可以与Elasticsearch通信的网络。
如果您已经完成了上述环境配置,请跳过本章。
前提条件
以下工具在能够使用Linux系操作系统的状态下。
-
- git
-
- Docker Engine 1.13.0+
- docker-compose
准备步骤
将包含所有Elastic公式的docker-compose进行git clone,并在docker-compose.yml中添加Grafana的定义。本次将指定最新的6.3.1版本。
git clone https://github.com/elastic/stack-docker.git
cd stack-docker
vim docker-compose.yml
...(省略)...
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:${TAG}
container_name: elasticsearch
environment: ['http.host=0.0.0.0', 'transport.host=127.0.0.1']
ports: ['127.0.0.1:9200:9200']
networks: ['stack']
+ grafana:
+ image: grafana/grafana:5.2.1
+ ports: ['3000:3000']
+ networks: ['stack']
kibana:
...(省略)...
添加了Grafana的定义后,通过docker-compose up命令启动。在启动时,通过TAG指定Elastic Stack的版本。
TAG=6.3.1 docker-compose up
执行完后,请稍等一下,即可连接到Elasticsearch(localhost:9200)、Kibana(localhost:5601)和Grafana(localhost:3000)。
準備過程注意事項
顺便提一下,如果主机的Linux内核版本过旧,可能会出现以下信息。
ERROR: for auditbeat Cannot start service auditbeat: linux spec capabilities: Unknown capability to add: "CAP_AUDIT_READ"
在这种情况下,大胆地从docker-compose.yml中删除与Auditbeat相关的部分(即在auditbeat和setup_auditbeat下的描述)。因为这次只需要Metricbeat就可以了。
- auditbeat:
- image: docker.elastic.co/beats/auditbeat:${TAG}
- container_name: auditbeat
- cap_add: ['AUDIT_CONTROL', 'AUDIT_READ']
- # Auditbeat must run in the main process namespace.
- pid: host
- networks: ['stack']
- depends_on: ['elasticsearch']
- setup_auditbeat:
- image: docker.elastic.co/beats/auditbeat:${TAG}
- container_name: setup_auditbeat
- volumes: ['./scripts/setup-beat.sh:/usr/local/bin/setup-beat.sh:ro']
- # The script may have CR/LF line endings if using Docker for Windows, so
- # remove them so that they won't confuse Bash.
- command: ['/bin/bash', '-c', 'cat /usr/local/bin/setup-beat.sh | tr -d "\r" | bash -s auditbeat']
- networks: ['stack']
- depends_on: ['kibana']
如果无法直接连接到主机Linux的环境,可以通过类似Virtualbox的方式进行更改elasticsearch和kibana的端口设置。
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:${TAG}
container_name: elasticsearch
environment: ['http.host=0.0.0.0', 'transport.host=127.0.0.1']
- ports: ['127.0.0.1:9200:9200']
+ ports: ['9200:9200']
networks: ['stack']
kibana:
image: docker.elastic.co/kibana/kibana:${TAG}
container_name: kibana
- ports: ['127.0.0.1:5601:5601']
+ ports: ['5601:5601']
networks: ['stack']
depends_on: ['elasticsearch']
通过这样设置,即使通过端口转发,也可以在浏览器中进行连接。
Discord的Webhook设置
在进行Grafana的设置之前,请先进行Discord的Webhook设置。
为了省事,我会用图片完成。
首先,导航到服务器设置界面。

接下来,切换到Webhooks设置页面,创建一个新的Webhook。

我们将设置新的Webhook配置。将图标图片设置为Grafana效果会很好。
另外,在这里备份Webhook URL也是很不错的。

以下是Discord的設置。
使用Grafana在Elasticsearch内设置数据警报。
设置数据源
使用浏览器连接到 localhost:3000,并登录到 Grafana。初始ID和密码为 admin:admin。
初次登录时,系统会建议更改密码,您可以选择跳过或更改密码。

一旦可以进入初始画面,就会转到数据源添加画面。

迁移后,我们会设置数据源配置。以下是已进行了更改的项目,其他项目可以保持初始值不变即可。
http://localhost:9200
とかになるはず。Index name[metricbeat-6.3.1-]YYYY.MM.DDデータソースとするindex名の形式PatternDailyデータソースとするIndexがどの時系列レベルで分割されるか(時/日/週/月/年)Version5.6+Elasticsearchのバージョン
输入必要的数据源设置项后,点击保存并测试。如果显示“索引正常”,“时间字段名称正常”,则连接正常无问题。
如果出现错误提示,请检查环境和输入的信息。

警報設置
我会创建一个新的仪表板。

在新的面板中选择图形格式,然后选择图表。

跳转到已追加的Graph的编辑界面。

在中国武装的情况下,可以通过图形化的方式来设置指标。

完成度量的设置后,转到警报设置页面并创建新的警报。

我们将进行警报设置。虽然我们想立即执行”Test Rule”,但需要保存仪表板才能执行,因此我们先保存仪表板。

之后,如果返回到同一界面并执行Test Rule,您可以看到类似这样的结果。

度量标准:平均 system.cpu.total.pct 的值为 Value: 0.104,由于未超过设定的阈值 0.80,因此可以解读为 Eval: false。这样就设置好了警报规则。
Discord通知设定
我会将Grafana配置成在上述Alert失败时发送通知到Discord。
跳转到通知渠道的设置页面。

点击“添加频道”,设置新的通知目标。

我们还可以在此屏幕上进行正常通知的测试确认。让我们发送测试通知试试。

這樣的感覺是Discord的通知就會飛過來。也可以包含圖片,感覺不錯。
好了,確認完操作後,請儲存並啟用通知頻道。
我会再次转到先前创建的图表警报页面。从警报规则页面转到此页面很方便。

我会设置提前通知。

现在一切准备就绪。
确认行动
我会实际对容器进行负载测试来确认。
(如果您不想给环境带来负担,请修改阈值并进行操作确认。)
docker exec -it metricbeat bash
yes >> /dev/null
过一段时间,您将收到 Discord 的通知。

因為非常可憐,所以我們使用Ctrl+C在控制台畫面上停止了100%的負載。
Ctrl+C
过一会儿,您将再次收到 Discord 的通知。

当系统恢复后,您还会收到通知。太好了。
另外,您也可以在Grafana界面上查看以前的状态历史记录。

最后
你认为怎么样呢?
我认为Grafana的Alert功能搭载了Elasticsearch,能够通过GUI轻松设置并且有丰富的通知选项,非常强大。
另外,由于我是第一次接触 Grafana,如果有更加简便的配置方法,还请在评论中指出!