提到双十一人人都会想到天猫霸气的实时大屏。提及实时大屏,都会想到最典型的流式计算架构:html
在阿里集团内,有大量成熟的产品能够完成此类工做,通常可供选型的产品以下:nginx
除这种方案外,今天给你们介绍一种新的方法:经过日志服务(LOG,原SLS)查询分析LogSearch/Analytics API 直接对接DataV进行大屏展现。api
2017年9月日志服务(原SLS)增强日志实时分析功能(LogSearch/Analytics),可使用查询+SQL92语法对日志进行实时分析。在结果分析可视化上,除了使用自带Dashboard外,还支持Grafana、Tableua(JDBC)等对接方式架构
计算通常根据数据量、实时性和业务需求会分为两种方式:实时计算(流计算)、离线计算(数据仓库+离线计算),日志服务(原SLS)对实时采集数据提供两种方式对接。app
除此以外,对于数据量偏大,对实时性有要求的日志分析场景,咱们提供实时索引LogHub中数据机制,以后可经过LogSearch/Anlaytics直接进行查询分析。这种方法好处是什么:测试
固然没有一个计算系统是万能的,这种方式限制以下:网站
云栖大会期间有个临时需求,统计线上(网站)在全国各地访问量。因为以前采集全量日志数据而且在日志服务中打开了查询分析,因此只要写一个查询分析Query便可。以统计UV为例子:咱们对全部访问日志中nginx下forward字段获取10月11日到目前惟一计数:url
* | select approx_distinct(forward) as uv
线上已跑了1天需求变动了,只须要统计yunqi这个域名下的数据。咱们增长了一个过滤条件(host),立马拿到结果:spa
host:yunqi.aliyun.com | select approx_distinct(forward) as uv
后来发现Nginx访问日志中有多个IP状况,默认状况下只要第一个ip便可,在查询中对Query进行处理插件
host:yunqi.aliyun.com | select approx_distinct(split_part(forward,',',1)) as uv
到第三天接到需求,针对访问计算中须要把uc中广告访问去掉,因而咱们加上一个过滤条件(not …)既立刻算到最新结果:
host:yunqi.aliyun.com not url:uc-iflow | select approx_distinct(split_part(forward,',',1)) as uv
最后大屏效果以下:
主要分3个步骤:
咱们主要演示步骤3,在作完一、2步骤后,在查询页面能够看到原始日志:
类型指定『简单日志服务-SLS』
名称自定义
AK ID和AK Secret填写主帐号,或者有权限读取日志服务的子账号的AK。
Endpoint填写 日志服务的project所在region的地址。图中为杭州的region地址。
建立一个折线图,在折线图的数据配置中,数据源类型选择『简单日志服务-SLS』,而后选择刚刚建立的数据源『log_service_api』在查询中输入参数。
查询参数样例以下:
{ "projectName": "dashboard-demo", "logStoreName": "access-log", "topic": "", "from": ":from", "to": ":to", "query": "*| select approx_distinct(remote_addr) as uv ,count(1) as pv , date_format(from_unixtime(date_trunc('hour',__time__) ) ,'%Y/%m/%d %H:%i:%s') as time group by date_trunc('hour',__time__) order by time limit 1000" , "line": 100, "offset": 0 }
projectName填写本身的project。
logstoreName填写日志的logstore。
from和to分别是日志的起始和结束时间。
注意,上文的咱们填写的是:from和:to。 在测试时,能够先填写unix time,例如1509897600。等发布以后,换成:from和:to这种形式,而后咱们能够在url参数里控制这两个数值的具体时间范围。例如,预览是的url是
http://datav.aliyun.com/screen/86312
, 打开http://datav.aliyun.com/screen/86312?from=1510796077&to=1510798877
后,会按照指定的时间进行计算。
query填写查询的条件,query的语法参考分析语法文档。样例中是展现每分钟的pv数。 query中的时间格式,必定要是2017/07/11 12:00:00这种,因此采用date_format(from_unixtime(date_trunc('hour',__time__) ) ,'%Y/%m/%d %H:%i:%s') 把时间对齐到整点,再转化成目标格式。
其余参数采用默认值。
配置完成后,点击『查看数据响应结果』:
点击上方『使用过滤器』,而后新建一个过滤器:
过滤器内容填写:
return Object.keys(data).map((key) => { let d= data[key]; d["pv"] = parseInt(d["pv"]); return d; } )
在过滤器中,要把y轴用到的结果变成int类型,上述样例中,y轴是pv,因此须要转换pv列。
能看到在结果中有t和pv两列,那么咱们在x轴配置为t,y轴配置成pv。
查询填写:
{ "projectName": "dashboard-demo", "logStoreName": "access-log", "topic": "", "from": 1509897600, "to": 1509984000, "query": "*| select count(1) as pv ,method group by method" , "line": 100, "offset": 0 }
在查询中,咱们计算不一样method的占比。
添加一个过滤器,过滤器填写:
return Object.keys(data).map((key) => { let d= data[key]; d["pv"] = parseInt(d["pv"]); return d; } )
饼图的type填写method, value填写pv。
点击预览和发布,一个大屏就建立成功了。开发者和业务同窗能够在双十一当天实时看到本身的业务访问状况!
附上:Demo地址。url中的参数from和to,你们能够随意切换成任意时间。