Kibana:创建一个 webhook alert - Elastic Stack 8.2

946 阅读5分钟

在今天的练习中,我将展示如何使用最新的 Elastic Stack 8.2 来生成一个 Alert,也就是一个警报。

创建一个 webhook alert - Elastic Stack 8.2

创建一个 webhook alert - Elastic Stack 8.2_哔哩哔哩_bilibili

安装

安装 Elastic Stack

如果你还没有安装好自己的 Elasticsearch 及 Kibana,那么请参考如下的文章来安装好自己的 Elasticsearch 及 Kibana:

特别需要指出的是,你需要按照 Elastic Stack 8.x 的部分来进行安装。如果你是使用 macOS,你可以参考文章 “Elastic Stack 8.0 安装 - 保护你的 Elastic Stack 现在比以往任何时候都简单” 即可。

等我们安装好 Elasticsearch 和 Kibana 后。我们接着导航到 Kibana 的如下界面:

当我们点击 Rules and Connectors 时,我们可以看到它需要让我们做一些额外的配置:

上面显示,我们需要添加如上所示的一个 key。我们在 Kibana 的安装目录打入如下的命令:

./bin/kibana-encryption-keys generate

我们把上面生成的三个 key 拷贝到 config/kibana.yml 文件中去。再次重新启动 Kibana。然后再导航到刚才的  Rules and Connectors 位置:

现在我们没有看到之前的那个提醒额外安装的步骤。我们可以直接创建 rule 了。

安装 webhook

我们首先创建一个比较简单的 Webserver。我们在自己喜欢的目录中,创建如下的一个文件:

webserver.cr



1.  require "http/server"
2.  require "colorize"

4.  cyan = Colorize.with.cyan
5.  light_cyan = Colorize.with.light_cyan
6.  color = cyan

8.  server = HTTP::Server.new do |context|
9.      req = context.request
10.      color = color == cyan ? light_cyan : cyan
11.      color.surround(STDOUT) do
12.          req.to_io STDOUT
13.      end
14.      STDOUT.print "\n\n" if req.body
15.  end

17.  server.listen 8888


这是一个非常简单的 Webserver。我们在 macOS 下做如下的安装来进行安装。

sudo port install crystal
curl https://sh.rustup.rs -sSf | sh
cargo install bore-cli

然后,我们在两个 terminal 中做如下的运行:

我们先使用 crystal 来启动 webserver:

crystal webserver.cr

然后再在右边的 terminal 中访问这个 webserver。在左边,我们可以看到相应的输出。

为了能使得我们的 webserver 能被外网所访问,我们可以使用 bore 来实现。尽管在我们的这个练习中并不需要,因为我们所有的运行在本地局域网中完成的。我们在另外一个 terminal 中运行如下的命令:

bore local 8888 --to bore.pub

在运行完 bore 之后,我们可以看到一个输出的外网地址。我们再在另外一个 terminal 中访问外网的地址。在 webserver 中,我们可以看到另外一个响应。这说明我们的 bore 的运行是成功的。

至此,我们的 webhook 已经安装完毕。

创建 webhook alert

我们接下来创建一个 webhook 的 connector:

从上面的界面中,我们可以看出来目前免费的 alert 只有 Index 及 Server log。Webhook alert 是一个收费的功能。我们必须启动试用功能:

这样我们就启动了白金版的试用功能。我们再次回到之前的界面:

这次,我们选择 Webhook:

我们再次回到之前的 terminal 中进行查看:

上面显示我们的测试是成功的。

我们接下来创建一个 rule:

在上面的列表中,我们可以看到许多的 rule。在本次的练习中,我们将创建一个 Index threshold rule。根据它的描述:

也就是说聚合的值满足一个阈值就会发送报警。具体可以详细阅读官方文档。

接下来,我们来创建一个索引:



1.  PUT webhook
2.  {
3.    "mappings": {
4.      "properties": {
5.        "@timestamp": {
6.          "type": "date"
7.        },
8.        "hits": {
9.          "type": "long"
10.        }
11.      }
12.    }
13.  }


为了方便插入时间戳,我们也创建如下的一个 ingest pipeline:



1.  PUT _ingest/pipeline/add-timestamp
2.  {
3.    "processors": [
4.      {
5.        "set": {
6.          "field": "@timestamp",
7.          "value": "{{_ingest.timestamp}}"
8.        }
9.      }
10.    ]
11.  }


 我们可以通过如下的方式来写入一个文档:



1.  PUT webhook/_doc/1?pipeline=add-timestamp
2.  {
3.    "hits": 500
4.  }


我们可以通过如下的方式来检查我们些人的文档:

GET webhook/_search?filter_path=**.hits


1.  {
2.    "hits" : {
3.      "hits" : [
4.        {
5.          "_index" : "webhook",
6.          "_id" : "1",
7.          "_score" : 1.0,
8.          "_source" : {
9.            "hits" : 500,
10.            "@timestamp" : "2022-05-07T07:10:17.516110Z"
11.          }
12.        }
13.      ]
14.    }
15.  }


我们可以看到有一个时间戳和 hits 字段。

接下来,我们再次回到之前的 rule 创建界面:

当满足条件时,我们发送如下格式的通知信息:



1.  Threshold is met!

3.  Value: {{context.value}}

5.  Message: {{context.message}}


点击上面的 Save 按钮:

我们可以看到当前的 rule 的状态是 enabled,而它的上一个 response 是 Pending。然后变为:

我们接下来回到 Kibana 的 Dev Tools 中打入如下的命令:



1.  PUT webhook/_doc/1?pipeline=add-timestamp
2.  {
3.    "hits": 6500
4.  }


过一小会儿,我们再查看 rule 的界面:

 

这是因为我们设置的是在过去的10秒钟的时间里,聚合 hits 字段的值超过 5000 就报警。这是在上面的界面中设置的。我们再来查看一下 webserver 的界面:

我们再接下来发送如下的一个信息:



1.  PUT webhook/_doc/1?pipeline=add-timestamp
2.  {
3.    "hits": 500
4.  }


 这次,我们的 hits 值为 500。我们再看看:

好了。今天的展示就到这里。我们可以看到从0创建一个 alert。希望对大家有所帮助!