用MLSQL绘制监控图

最近在做一道题,就是需要定时监控某台服务器内存,磁盘IO和CPU使用率,并且绘制出图表。这道题看着简单,但其实蕴含了很多知识:

  1. 熟悉Linux系统常见对内存,磁盘,CPU的监控命令
  2. 会使用一些Linux文本处理命令,如grep,awk
  3. 定时的话,其实就是让你学习cron之类的命令行工具,当然还有cron的语法
  4. 绘图嘛,好歹我们是一家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的学习平台。

results matching ""

    No results matching ""