可视化分析日志的需求
运维工程师在通过日志调查问题时,或者通过日志搭建监控系统时,不仅需要查看原始的日志内容,还需要把日志经多深度加工分析,例如计算每分钟的延时,每分钟的流量等等监控。这些数字指标,如果能够通过可视化的手段直观的展示出来,会更直观、有效的理解监控数据。今天我们介绍一种比较简洁、也比较酷的可视化方式,就是在终端上直接通过命令行可视化分析日志。
这种方式的好处在于:
- 直接通过终端,无需打开控制台。
- 通过SQL就能实现可视化,无需配置一大堆可视化参数。
什么?命令行里边也能可视化? 是的,命令行里边能够实现可视化! 实现方式是:通过mysql客户端,连接sls服务,使用SQL中颜色函数,直接在终端上分析。下文将以Nginx的访问日志为力,演示如何在终端可视化分析。
分析每一种Http Method的占比大小
先看效果图,这个颜色条块是在终端上显示出来的:
上图中,分别展示了,method、pv、占比、和大小的柱状图。是不是很酷?我们可以直接在终端上可视化展示数据的大小。怎么做到的呢?
首先,通过mysql协议连接到SLS,通过10005端口连接到SLS, 用户名是accessKeyid, 密码是accessKeySecret, SLS 的project作为database,参考文档:
mysql -hcn-hangzhou-intranet.log.aliyuncs.com -P10005 -u******** -p********* projec_name
然后在mysql命令行中输入以下SQL:
select *, bar(percent, 40) from(select *, pv*1.0 / (sum(pv) over()) as percent from(select method ,count(1) pv from access-log where __time__ between to_unixtime(now())- 600 and to_unixtime(now()) group by method order by pv ));
上述SQL主要做了几件事情:
1: 按照method group by计算每一个method的pv。
2: 外层嵌套查询,通过sum(pv) over() 计算出所有method的pv的总和。这里用到了窗口函数,对于窗口函数的语义,请参考文档。 简单而言,窗口函数在计算上是聚合函数,在结果上是转换函数,也就是计算窗口内所有行的聚合结果,再把结果写回每一行。因而窗口函数计算后,总行数没有改变,还是有3行。
3: 计算每个method的pv占总pv的比例,pv*1.0 / (sum(pv) over()) 。
4: 最后一步就是根据比例信息渲染出柱状图, bar(percent,40)。
bar函数的语义包含两个参数,分别是百分比和最大长度。 最大长度指定柱状图的最大长度, 上边的样例中,就是40个字符的长度, 然后根据百分比,把柱状图展示等比例的长度。
换一种可视化形式
上边我们用柱子的长度来代表pv的大小。那么我们换一种方式,用单纯的颜色来表达呢?
在上图中,绿色部分越多,代表占比越高。红色部分越多,代表占比越低。是不是更酷了?怎么做到的呢?上述SQL其他部分不需要改动,只需要改动bar函数的调用:
bar(40, 40,color(percent, 0,1 , rgb(255,0,0), rgb(0,255,0)), rgb(0,255,0))
bar函数增加了两个参数,分别是起始的颜色和结束的颜色。 那么我们可以定制起始位置的颜色。在这里使用一个动态颜色来表示:color(percent, 0,1 , rgb(255,0,0), rgb(0,255,0)) ,也就说percent取值在0到1之间,如果percent靠近0,那么就颜色就靠近 rgb(255,0,0)红色 ,如果percent靠近1,颜色就靠近rgb(0,255,0)绿色。根据percent的位置,输出动态的颜色。
因为上边界是静态的颜色(绿色)。所以我们如果percent比较小,那么条块的颜色就比较多。如果percent比较大,那么条块就更接近于绿色。那么我们也可以把上边界也设置成动态颜色,效果是什么样的呢?欢迎亲爱的读者亲自试一下呢
不过用颜色来表示柱状图,不如用长度来表达的语义更加直观。像第一个例子,既有颜色,又有长度表达信息,可以更加快速的了解数字的大小信息。
延伸阅读
上文介绍了如何用mysql协议可视化分析日志, 当日志数据量比较大的时候,可能会遇到查询不完整,或者延时变高的问题,欢迎深入了解SLS增强SQL,为千亿日志分析的实时计算引擎。