用MLSQL绘制监控图
最近在做一道题,就是需要定时监控某台服务器内存,磁盘IO和CPU使用率,并且绘制出图表。这道题看着简单,但其实蕴含了很多知识:
- 熟悉Linux系统常见对内存,磁盘,CPU的监控命令
- 会使用一些Linux文本处理命令,如grep,awk
- 定时的话,其实就是让你学习cron之类的命令行工具,当然还有cron的语法
- 绘图嘛,好歹我们是一家OLAP公司,图表展示肯定是必须的
传统做法肯定是你要登录到那台服务器上,然后写脚本,设置调度,最后文本数据拉下来,接着使用excel等工具画个图表,费时费力,重要的是还没办法形成流程化,而且做的工作几乎只对这台机器有效。考虑到除了1作为数据源头以外,其他的都算是数据分析部分了,那么肯定可以用数据分析工具来完成的。于是尝试用MLSQL来解决。
获取数据
借助mlsql-shell插件(更多插件介绍),我们可以写一个shell脚本,然后借助MLSQL定时调度能力,就可以产生一批数据了,具体操作如下:
当然了,目前这个插件还不支持ssh到特定某台机器上远程执行。我们这里只是为了演示,所以就拿MLSQL Driver所在的机器(MacOS,所以获取数据信息和Linux略有不同)的数据为示例数据。
其中'/tmp/monitor.txt' 是driver机器上的本地目录。MLSQL是使用对象存储的(如果是单机部署也可以使用本地磁盘),所以我们需要把文件上传到对象存储上。使用如下命令:
可以看到,文件已经在对象存储上了,这里,因为MLSQL是多租户的,每个用户有自己独立的用户目录,用户只能操作自己的目录,所以不会有安全性问题。
数据处理加工
现在我们需要简单加工下从shell脚本执行得到的文本数据,这可以充分利用SQL的处理能力,因为使用shell对文本截取,类型转换,数字计算还是比较麻烦的。
从图中我们可以看到,我们用shell采集到的数据是比较粗糙的,比如CPU使用率有百分号,而内存则是使用Mb为单位,数字相比另外两个很大,这样其实对绘图会造成比较大的影响。我们统一使用SQL做了清理。
深加工
因为我们希望多个曲线在一张图里,目前的数据结构没办法很好的适应现在的python绘图组件,所以我们要做一次列转行的操作,也就是进行unpivot操作,在Spark里,使用stack函数来完成。
这样,我们就获取了一个分类字段y, 绘图的时候,分类字段有多少个分类,就会有多少条曲线。在我们这个案例里,分别是Mem, IO,CPU。
绘图
这里推荐plotly,别被代码行数吓到,其实瞪眼一看,非常简单,核心代码只有两三行。前面注解部分是指定数据输入,环境,后面代码部分获取数据和绘图,最后转成Html(这个代码略多,但其实是模板,几乎不用改)输出。
#%python
#%input=newdata
#%output=html
#%cache=true
#%schema=st(field(content,string))
#%dataMode=model
import pandas as pd
import plotly.express as px
from plotly.io import to_html
from pyjava.api.mlsql import RayContext
ray_context = RayContext.connect(globals(),None)
data = list(ray_context.collect())
df = pd.DataFrame(data, columns=data[0].keys())
fig = px.line(df, x="x", y="value",line_group="y", color="y")
fig.update_xaxes(title_text='time')
html = to_html(
fig,
config={},
auto_play=False,
include_plotlyjs=True,
include_mathjax="cdn",
post_script=None,
full_html=True,
animation_opts=None,
default_width="50%",
default_height="50%",
validate=False,
)
context.build_result([{"content":html}])
呈现图标
最后一步,让系统呈现出我们绘制的图表
还有没有其他
比如有了这张图,我们可以利用MLSQL邮件发送插件进行邮件的发送,大概语法如下:
run command SendMail.`` where
from="" and
to="" and
.....;
因为MLSQL支持语法的插件扩展,用户也可以开发自己定制化的邮件亦或是即时消息插件,从而方便把自己处理的信息投递出去(配合MLSQL的条件分支语言支持,更香)。
结束语
简单配合调度,这个就可以成为日常报表,整个过程中我们可以在Web上分分钟搞定,而且大部分流程都是可以复用的。是不是很简单? 另外MLSQL Console也是适合做SQL/Linux的学习平台。