我们知道对于可观察性数据而言,有超过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个异常事件发生。