【背景】
为了以曲线图的方式展示项目每日的使用情况,包括对功能,用户部门的分类报表,从而持续改进项目。
公司的所谓架构师,当前对外提供restful接口记录项目的使用日志。后台架构是以写文件的方式记录用户对项目软件的数据,每天晚上通过chronjob定时上传到hadoop里,然后又通过hive的接口进行分类查询,最后开发一个"Dashboard"来展示。
对此方案,我心里很吐槽,不仅杀鸡用了牛刀,还增加了对Dashboard的开发工作量,且用户使用数据不能实时显示,我们其他系统对接时还要等到第二天才能看到数据。
【新方案】
最近学习了Elastic Stack相关工具,并做了相应的验证,我觉得这类需求完全就可以0开发,且这些系统的高可用,高并发,安全,监控都是可以配置出来的。 不过对于我们这种内部系统来说,前期越简单越好,不就是给自己内部看个数据吗
最精简方案:用户数据--->统一日志Rest接口(简单封装下,避免后续下游系统修改)-->Elastic Search --> Kibana
随着深入可改进为:用户数据--->统一日志Rest接口(简单封装下,避免后续下游系统修改)-->RabbitMQ-->LogStash-->Elastic Search --> Kibana
后续要求高并发,高可靠,监控之类的话,再讲这些组件配置成高可用方案
【方案细化】
1.定义用户数据的数据结构,最简单就这些数据
name:用户ID
action:操作类型
detail:详细数据
date:2018-05-18 12:00:200
因此可在kibana的Dev tools中定义Elastic Search的结构
PUT userlog
{
"settings" : {
"number_of_shards" : 1
},
"mappings" : {
"doc" : {
"properties" : {
"user" : { "type" : "keyword" },
"action" : { "type" : "keyword" },
"detail" : { "type" : "text" },
"logdate" : { "type" : "date","format": "yyyy-MM-dd HH:mm:ss" }
}
}
}
}
2.在kibana的Dev tools中手工创建一些数据,试着查询
POST userlog/doc/
{
"user" : "m00371981",
"action" : "codeverify",
"detail" : "hello world",
"logdate" : "2018-06-01 12:00:00"
}
GET /_search
{
"query": {
"match" : {
"user" : "m00371981"
}
}
}
GET /ideaclient/doc/_search
{
"size" : 0,
"_source": {
"excludes": []
},
"aggs": {
"2": {
"date_histogram": {
"field": "logdate",
"interval": "1d",
"format": "yyyy-MM-dd"
}
}
}
}
3.在kibana Management中Create Index Pattern,选择userlog
在Visualize和Dashboard中配置报表,我尝试了Pie,Bar,MarkDwon,Metrics相关的报表,感觉效果很好
4.改用logstash从rabbitmq中获取配置,可参考如下配置
input {
#stdin {}
rabbitmq {
host => "localhost"
exchange => "madixin"
}
}
# The filter part of this file is commented out to indicate that it is
# optional.
# filter {
#
# }
output {
stdout {}
}
【Elastic Stack使用说明】
网上多的是教程的,这些系统大多装个JDK 1.8+,执行下bin的启动文件就能跑了
多看官网吧:
https://www.elastic.co/guide/en/kibana/6.x/getting-started.html
PS:写这篇文章的时候,Elastic Stack工具各版本都到了6.2.4版本