基于 Eleasticsearch 和 Kibana 的运营数据可视化后台

本文章首发于个人博客 基于 Eleasticsearch 和 Kibana 的运营数据可视化后台,转载请注明来源。html

前一段时间在研究 ELK 这个东西,以前也用过一点,但都没有深刻研究,其实这回也没有深刻研究,但我找到了在如今状况下我该怎么用这个东西的方法。git

ELK 是一个日志系统的全家桶工具,Elasticsearch 用的人比较多,不少人把这个看成搜索后台,若是你选择了 Django 这样的框架的话也很容易继承搜索功能进去,好比用这个库 django-haystack,固然不少人是用来作日志存储。github

L 是 Logstash,通过个人调研就发现这个玩意其实不太好用,性能差是主要缘由。这个东西的用途就是一个中间件,把多个平台的不一样格式的日志所有进行预处理,而后再存入 ES 中,可是做为一个还很小,没那么复杂的后台服务来讲,用不着,只有一个日志来源,日志格式也是固定的,一条日志里面有四个 JSON object,每一个 object 的 key 不是固定的,只要处理一下时间戳就好了,其余都不用动,直接 mapping 到 ES 中,刚开始我甚至还用到了 filebeat,先用 filebeat 监控文件,而后 filebeat output 给 logstash,而后 logstash 再 output 给 ES,简直了,测试的时候没什么问题,但一上线过了两三天日志数量多了起来我就发现问题了,数量不对,天天都在累加前一天的日志条数,等于说是 tail 文件没成功,每次都从头开始读文件了,外加用了 rsync 这个东西从生产服务器上同步日志到 ES 机器上,我也没整明白究竟是哪里出了问题,索性直接弃用 logstash 和 filebeat,只用 ES 和 kibana,我本身写脚本监控文件、把日志写入 ES 中,也把日志按天切分红文件,简单又靠谱。django

运营数据日志的日志内容其实和消息系统很像,我就直接引用这里的概念 AVOTActor/Verb/Object/Target。举例说明: xxx 关注了 yyyxxx 是 Actor,关注 是 Verb,yyy 是 Target,这里没有 Object,再举一个例子,xxx 将 uuu 添加到了 yyy 中,这里的 Verb 是 添加,Object 是 uuuActor/Object/Target 就是模型,固然咱们不用把模型的所有字段都放进去,放个 type/id/name 就够了。按照这样的规则规定好日志内容以后就简单了,在每一个须要记录日志的地方进行埋点,这个就是比较麻烦的地方,若是业务比较复杂的化,埋点不少,写的时候必定要一次性写对 Object 和 Target,不要写了一次以后复制粘贴,很容易搞错,一个个写。还有一点就是 Actor/Object/Target 的 id 都转成字符串存储,由于用户的 id 是 uuid,日志 object 直接 to_json(),django logger 直接用,用户 id 会变成字符串,其余 model 的 id 仍是 int,类型若是不一致再存到 ES 里面数据会有冲突。json

最终的日志格式示例:bash

{"target": {"type": "Paper", "title": "Deep Depth Super-Resolution : Learning Depth Super-Resolution using Deep Convolutional Neural Network", "id": "791", "owner": "MKFMIKU"}, "object": {}, "actor": {"agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36", "accept_language": "en-US,en;q=0.8", "username": "qhl722", "host": "zijin.paperweekly.site", "referer": "http://www.paperweekly.site/getting-started"}, "verb": "点赞", "time": 1507000406.305043}
{"target": {"type": "User", "id": "fcc3837f-1a61-4d2c-bdbf-0961085547a3", "owner": "gg5d"}, "object": {}, "actor": {"agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36", "accept_language": "zh-CN,zh;q=0.8", "username": "", "host": "zijin.paperweekly.site", "referer": "http://www.paperweekly.site/"}, "verb": "注册", "time": 1507000688.429523}
复制代码

我用了 Elasticsearch 的官方 Python API elasticsearch-py,脚本放在了 Gist 里面。服务器

日志存到 ES 中是这个样子:app

Kibana

Kibana 是一个但是化工具,能看到 ES 中的数据,作一些报表,只要把数据导入到 ES 中,作报表就很简单了,简单的也是有前提的,前提是你要定义好日志的内容。框架

好比点赞数量,在 Visualize 里面新建一个柱状图,搜索 item.verb="点赞",而后第一个 Y 轴聚合搜索出来的日志条数,就是点赞的数量,再添加一个 Y 轴 Unique Count item.actor.username.keyword 就能得出多少个用户产生了这么多赞,X 轴就是按照时间,我都是按天来,选择 Date HistogramIntervalDaily,若是你的日志系统要求的实时性比较高,还能选择 Hourly,而后把实时刷新打开,就能看到比较实时的数据了。elasticsearch

4
5

Kibana 最终是这个样子:

0
1

过几天我把这个东西拆分出来变成一个仓库再详细写一下教程。

相关文章
相关标签/搜索