Elastic:如何为机器学习异常发送通知

我们知道对于可观察性数据而言,有超过75%的数据其实是没有用的。对数据来说,我们光采集上来是不够的。面对大量的数据,我们希望从这些海量的数据中发现事件,也就是不同于平常的事件。我们可以对感兴趣的时序数据的指标进行监控,比如突然有大量的数据被导入,或者几乎没有数据被导入,或者某个指标偏离正常的范围(过高或者过低),或者某个个体鹤立鸡群,和其它个体完全不同,比如它下载的数据总是比别人多。这些都可能发生在时序数据中,我们称他们为异常。 我们光用人眼来观察是不够的。我们可以借助 Elastic Stack 所提供的机器学习来对数据进行分析,并生成异常事件。如果大家对于如何使用机器学习还不是很熟的话,请参阅我之前的文章 “Elastic:机器学习的原理及实践 - single metric job”。 即便如此,通过机器学习的方法得到了异常的事件,但是如果不能及时反馈到监控人的手中,那么这些异常事件不能被及时处理,也会影响系统的运行。这些异常如果不能及时被处理,对于一些系统的运维是致命的。当机器学习帮我们分析出异常,我们可以使用 alerts 或 watchers来进行通知。在今天的文章中,我来详细描述如何针对机器学习所发生的异常来进行处理,

在今天的展示中,我将以 7.12 版本为例来进行展示。

 

准备数据

在今天的练习中,我们将使用 Kibana 自带的数据来进行展示:

这样,我们就创建了一个叫做 kibana_sample_data_logs 的索引。

 

启动机器学习

由于机器学习是白金版和企业版所具有的功能。对于我们自管型的 Elasticsearch 集群来说,我们可以在 Kibana 中启动试用版:

这样我们就可以试用 Elastic 所提供的机器学习功能了。

 

创建一个 single metric 机器学习任务

我们在 Kibana 中启动机器学习任务。我们将创建一个 single metric 的学习任务:

 

从上面,我们可以看出来有一个异常的事件发生了。有了这个异常的事件,在实际的使用中,我们希望一旦这个异常事件被检测出来后,会立即对这个事件进行发送警报。一旦有异常我们可以通过 Kibana 查看一个叫做 .ml-anomalies-shared 的索引:

GET .ml-anomalies-shared/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "range": {
            "anomaly_score": {
              "gte": 90,
              "lte": 100
            }
          }
        }
      ],
      "filter": [
        {
          "match": {
            "job_id": "single_metric"
          }
        }
      ]
    }
  }
}

 

发送警报 (alerts)

在上面的机器学习中,我们已经发现了异常,我们希望用警报的方式发送出去。

我们可以点击上面的链接,里面有详细的描述。我们可以使用如下的工具来生成一些键:

bin/kibana-encryption-keys generate

我们在 Kibana 的安装根目录中运行上面的命令,并把上面的输出的键值添加到 config/kibana.yml 文件中,并重新启动 Kibana。我们再次回到之前的页面:

在上面,为了方便,我选择了 Index 作为 Action Type。当然你也可以选择其它形式 Action。你可以查看文章  “Elastic:菜鸟上手指南”  里的 “通知及警报” 一节中如何接入到 Webhook,email 或者 Slack。

如法炮制,我们创建如下结构的 JSON 文档:

点击 Save 按钮:

我们看见当前的状态为 Pending。等一会儿:

状态变为  Active。我们可以在 Kibana 中查看 index_alert 里的内容:

从这里我们可以看出来,在这个 index_alert 的索引里含有之前显示的那个 score 为98的异常。

 

使用 Watcher 发送警报

我们实际上也可以使用 Watcher 来发送警报。我们首先需要为 .ml-anomalies-shared 创建一个索引模式。

这样我们就创建了一个为访问 .ml-anomalies-shared 索引的索引模式。接下来,我们创建一个 Watcher:

依赖于我们想要检测的条件,我们也可以修改上面的 condition 比如:

当然我们也可以直接使用 Watcher 的 API 来进行描述。你可以参考文章  “Elastic:菜鸟上手指南”  里的 “通知及警报” 一节中如何使用 Watcher 来发送通知。

我们可以点击 Show request 来查看 watcher 的内容:

我们创建了一个叫做 anomalies_watcher 的索引来存放异常。当然我们也可以选择其它的 action。你可以参考文章  “Elastic:菜鸟上手指南”  里的 “通知及警报” 一节中如何接入到 Webhook,email 或者 Slack。

我们可以查看 index_watcher 来查看异常的情况:

如上所示在过去一天有 193个异常事件发生。

已标记关键词 清除标记
相关推荐