37DATA

数据看板Grafana使用SLS源实战记录

  • 0、引言

  • 1、SLS简介

  • 2、Grafana中的使用

  • 3、SLS简单使用

    • 3.1、SLS日志操作面板

    • 3.2、建立索引

    • 3.3、从一个简单的查询开始吧

  • 4、几种主流的图表语句怎么写

    • 4.1、饼图

    • 4.2、Stat图

    • 4.3、带趋势的Stat图

    • 4.4、仪表盘

    • 4.5、折线图

    • 4.6、表格

    • 4.7、Bar图

  • 5、结语

0、引言

作为当前“数据部看板”的管理者之一,说来惭愧,之前确实没有好好地去研究下Grafana以及各种数据源的详细配置,总想着等我下一个项目需要用到比较系统的看板,我再来捣鼓一下吧,然后,就没有然后了。

这一次正好碰上俊伟大佬正在整理即将裁撤的IDC机器上的ES源,准备切换到阿里SLS源,于是就有了这一次实践。

总体来说,难度不高,但是细节颇多,Grafana可定制化的配置确实丰富,如果你熟悉常用的SQL语法,那么SLS对你来说就不是什么难题。

1、SLS简介

SLS,是阿里云的日志服务。SLS能够提供一站式的数据采集、加工、分析、告警、投递与消费,这些功能性的介绍,在这里我们就不赘述,大家可以从阿里云官方产品功能介绍中了解。什么是日志服务 (aliyun.com)

Image

本篇文章着重讲的是“查询分析”这一块的内容,我们使用SLS的Logtail进行日志采集到Logstore,然后对日志进行创建索引,调试查询语法,最后将其接入Grafana,最终落地为我们常用的数据看板的数据结果。

2、Grafana中的使用

实际上,我们要想将SLS当成Grafana的数据源之前,有许多工作要做的,这里对于这些前置的步骤不做详尽的讲解,大致步骤如下:

购买SLS服务 > 创建项目 > 创建Logstore > 新建机器组 > 机器组内主机安装Logtail > 日志自动采集 > 日志创建索引 > 配置Grafana新增SLS源 > 在看板中使用查询分析

我们可以看出,前置的准备工作基本是属于运维相关的工作,我们接下来着重讲一讲如何使用SLS的查询和分析。

3、SLS简单使用

在将日志采集到SLS之后,即便我们最终是要在Grafana中进行呈现看板结果,但还是要先在SLS的日志操作面板先进行调试、配置、建立索引。

3.1、SLS日志操作面板

Image

整个操作面板,我觉得简单使用的话,可以分为三大块:

  • 左侧是日志库(Logstore),我们这里以Nginx的access日志为例;

  • 右侧上方有一个可以进行查询语句调试的输入框,其余的按钮是一些配置按钮;

  • 右侧下方是日志内容,默认是显示原始格式的日志,如果没有特殊需求,直接看原始格式已经够用。

3.2、建立索引

一般情况下,在建立Logstore的时候,根据自己选择的日志格式,从日志来源的机器组当中会获取Demo的日志格式,然后提示我们是否自动生成索引。

如果我们的日志格式与第一次配置的时候的格式一样,那么自动生成的索引基本可以覆盖所有的查询键值。

但是在我们使用的时候,除了一些通用的日志(例如nginx、php的错误日志),还会有我们程序自定义格式的日志,而且可能存在日志键值变动调整的情况,那么这时候我们就需要自己去建立索引了。

建立索引,首先我们要从这个入口进入:

Image

随后我们只需要添加我们日志中的字段名称即可,这里有一个地方需要注意,如果添加的字段是需要在管道后的查询语句中使用,就需要勾选“开启统计”:

Image

并且,当我们创建了新的索引,只会对创建该索引之后的数据生效,历史数据就需要进行“重建”,重建操作可以从这个入口进入:

Image

3.3、从一个简单的查询开始吧

Image

最简单的查询,就是直接查询日志属性,其语法与ES一致。

接下来,我们进阶,来看看SLS特有的语法,其语法格式如下:

基础查询 | SQL查询

基础查询,就是上图我们展示的与ES语法一致的部分,那么管道 | 之后的SQL查询,实际上就是基于基础查询之后的结果,通过SQL语法再一次进行过滤和处理,来看个例子:

Image

clientip:10.58.132.17 and method:POST | select clientip, count(1) as cnt where remove_host like '%37api%' group by clientip

管道之后的SQL语法是不是很熟悉呢?没错,它是符合我们常用的SQL语法标准的,不同的地方在于SLS封装了不少专用的函数。

你是否发现,在这段SQL当中,没有 FROM 子句,没错,SLS不填写FROM默认就是查询当前Logstore的数据。

4、几种主流的图表语句怎么写

4.1、饼图

Image

uri:'$domain' | select count(1) as count,__source__ as serverip group by serverip

上图是一个简单的饼图例子,我们要呈现的数据结果,例如这里想要展现各个ip数量的占比情况,那么用饼图就很合适。

其语法主要是 GROUP BY  IP,然后 COUNT(1) 进行计数。

4.2、Stat图

Image

uri:'$domain' | select count(distinct clientip) as count

上图是一个简单的Stat图的例子,这里就更简单了,使用 COUNT 进行计数,然后将计数结果字段配置到 y坐标轴进行呈现即可。

4.3、带趋势的Stat图

Image

uri:'$domain' | select to_unixtime(time) as time,count from (select time_series(__time__, '1m', '%Y-%m-%d %H:%i', '0')  as time,count(1) as count from log group by time order by time limit 10000)

可以简单的理解,带趋势的Stat图,其实就是折线图的Stat图呈现,其SQL语法与写折线图无异。

4.4、仪表盘

Image

logType:sql|select avg("sql.cost") as avg_val

上图是一个HOLO的sql耗时仪表盘,取平均数来进行呈现数据。右侧的阈值设置,是我临时配置的方便展示效果用的,请勿参考这个配置,你需要根据真实的数据场景定义合适的阈值。

4.5、折线图

Image

logType:access|select to_unixtime(times) as t, pod_name, c from (select time_series(time, '1m', '%Y-%m-%d %H:%i', '0') as times, "__tag__:_pod_name_" as pod_name, count(1) as c from log group by times, pod_name order by times limit 10000)

折线图稍微复杂一些,主要表现在需要进行时间+自定义维度的分组,这里是以时间+机器作为分组,那么就需要 GROUP BY 时间,机器。

示例的SQL写法当中,写子查询是为了进行时间轴的平铺,方便进行按分钟的补0,如果你有更好的写法,请不吝赐教。

4.6、表格

Image

cost > 1 | select "@timestamp" as time,clientip,cost,status,method,remove_host,request,referer,postData

表格一般是用来展现日志明细的,即一条一条列出来我们需要查看的字段,常见的情况基本不需要进行聚合和计算。

4.7、Bar图

Image

* | select count(1) as count ,uri group by uri order by count desc limit 10

你发现没有,实际上一旦涉及计数,基本就是需要GROUP BY,这里示例中的Bar图,只需要进行一个维度的聚合,对其进行计数展现,即可呈现出想要的效果。

5、结语

SLS目前我也只是小试牛刀,对于我们常用的数据呈现样式,基本上通过1~2层的聚合和计数即可实现。

如果你也有兴趣,那么请快快来接入我们的“ 数据部看板 ”吧,期待我们能碰撞出奇妙的火花,让数据看板为你的项目保驾护航。