前言
SLS新版告警支持多种监控目标,如SLS的日志存储,时序存储;也支持对外部系统如Promethus,Grafana,Zabbix产生的告警进行管理;在对SLS的存储进行监控时,用户可以自定义告警监控规则或者使用内置的告警规则。自定义告警监控规则主要包括监控目标,触发条件,行动配置等。本文主要介绍在创建自定义告警规则时,如何使用统一的查询分析语法来查询并定义监控目标。
查询分析语法概览
SLS支持可观测性的Log,Metric,Trace的存储,对于不同类型的存储,SLS支持使用统一的查询分析语法来查询分析数据。本文主要介绍下查询日志,查询时序,机器学习等语法。
配置索引
对于SLS中的数据日志服务采用半结构化的数据模式定义一条日志,包含日志主题(Topic)、时间(Time)、内容(Content)、来源(Source)和标签(Tags)五个数据域,其中内容数据域记录了日志的具体内容,有一个或多个内容项组成,每一个内容项为一个键值对(Key:Value)。
对于日志内容中的键值对,只有配置索引后,才能进行查询和分析操作,索引类型主要包括全文索引和字段索引。其区别如下
索引类型 | 说明 |
全文索引 | 日志服务根据您设置的分词符将整条日志拆分成多个词并构建索引。在查询时,字段名称(KEY)和字段值(Value)都是普通文本。例如查询语句error ,表示查询包含error 关键字的日志。 |
字段索引 | 配置字段索引后,您可以指定字段名称和字段值(Key:Value)进行查询,缩小查询范围。例如查询语句level:error ,表示查询level 字段值包含error 的日志。如果您要使用分析功能,必须配置字段索引且开启对应字段的统计功能。开启统计功能不会产生额外的索引流量和索引存储空间。 |
在SLS控制台查询页面,可以配置索引,如下示例是nginx的日志索引配置,包括日志中的host,http_referer等字段的索引。
查询分析语法
基本语法
查询语句|分析语句
SLS的查询分析语法包含两部分,一部分是查询语句,一部分是分析语句,两者之间用小竖线(|)来分隔,查询语法为SLS专有语法,可以参考查询语法;分析语句支持标准的SQL92语法并且包含SLS增强的函数,可以参考分析概述。查询语句和分析语句区别如下:
语句类型 | 说明 |
查询语句 | 查询语句用于指定日志查询时的过滤规则,返回符合条件的日志。 查询语句可以为关键词、数值、数值范围、空格、星号(*)等。 如果为空格或星号(*),表示无过滤条件。 |
分析语句 | 分析语句用于对查询结果或全量数据进行计算和统计。 |
比如需要查询一个nginx的5xx错误的次数,可以使用如下查询语句,其中查询语句用查询status超过500的日志,分析语句是一条标准的SQL聚合语句。
status >= 500 | SELECT count(1) as err_cnt from log
告警监控查询场景
SLS新版告警自定义告警规则完全支持SLS的查询分析语法,通过SLS的查询分析语句,可以根据业务和监控需求,查询出需要监控的数据,然后设置相应的触发条件,来触发告警。
场景1:查询语句
比如在监控Nginx日志时,需要查询5xx的错误日志,并且想要把这些错误相关的日志通过告警发出来,我们可以直接使用status >= 500,查询出来的结果包含错误的request_uri, host,request_method等,这里的字段包含所有的日志索引字段。
根据上面的查询语句,我们可以直接另存为新版告警,触发条件设置为有数据。告警监控在评估时如果查询到有5xx的错误,就会触发告警。在内容模板中引用${fire_results}或者${fire_results_as_kv}即可展示错误信息。
场景2:查询语句|分析语句
跟场景1中的例子相似,我们可能在告警中不需要把每个字段都通知出来,只需要最关键的字段比如host,request_method,request_uri,status。这时候我们可以机上分析语句筛选出特定的字段
status >= 500 | SELECT host, request_method, request_uri, status
查询结果示例如下
在配置告警时,触发条件同样选择有数据,在内容模板中引用${fire_results}或者${fire_results_as_kv}即可展示select后的字段信息。
场景3:时序数据监控
对于时序数据,SLS支持两种查询方式,SQL查询分析和SQL + PromQL查询分析
SQL查询分析
使用SLS时序存储接入了主机监控。现在查询主机在过去5分钟内的最大和平均CPU使用率,可有使用SQL查询分析,例句如下:
*| SELECT element_at(__labels__, 'hostname') as host_name, max(__value__) as max_cpu_util, avg(__value__) as avg_cpu_util FROM "ecs-metric.prom" WHERE __name__ = 'cpu_util' group by element_at(__labels__, 'hostname')
查询结果如图,在配置告警规则时,触发条件可以配置为有数据匹配,条件写avg_cpu_util > 80,即可实现对平均使用率超过80%的主机进行监控,可以使用${fire_results}或者${fire_results_as_kv}引用平均使用率高于80%的主机数据。
SQL+PromQL方式
SLS支持使用PromQL语法对时序数据进行查询链接,支持5个PromQL函数,promql_query、promql_query_range、promql_labels、promql_label_values和promql_series。
promql_query(string)、promql_query_range(string, string)函数返回的表的结构如下表所示
字段名 | 字段类型 | 说明 |
metric | varchar | 时序名称。如果查询分析中使用了Group By语法,那么该值可能为空。 |
labels | map<varchar, varchar> | Lables信息,Map类型。 |
time | bigint | 时间。 |
value | double | 某个时间点对应的值。 |
这里以promql_query_range函数为例介绍查询CPU使用率高于80%的时序点。告警规则配置为有数据。分组评估选择“标签自动”,即会
* | select promql_query_range('cpu_util') from metrics having value > 80 limit 1000
场景4:机器学习语法
SLS机器学习功能为您提供多种功能丰富的算法和便捷的调用方式,您可以在日志查询分析中通过分析语句和机器学习函数调用机器学习算法,分析某一字段或若干字段在一段时间内的特征。
接下来以一个异常检测函数ts_predicate_simple为例介绍下查询分析方。
函数格式:
select ts_predicate_simple(x, y, nPred, isSmooth)
参数说明如下:
参数 | 说明 | 取值 |
x | 时间列,从小到大排列。 | 格式为Unixtime时间戳,单位为秒。 |
y | 数值列,对应某时刻的数据。 | - |
nPred | 预测未来的点的数量。 | long类型,取值大于等于1。 |
isSmooth | 是否需要对原始数据做滤波操作。 | bool类型,默认为true表示对原始数据做滤波操作。 |
以OSS访问日志为例,查询每30秒的pv波动情况,并找出异常点
* | select ts_predicate_simple(stamp, value, 6) from (select __time__ - __time__ % 30 as stamp, count(1) as value from log GROUP BY stamp order by stamp)
如下图,红色圆圈表示通过机器学习算法找到的异常点,对应查找结果中的anomaly_prob=1.0,其中src表示原始值,predict表示预测值,可以在告警规则配置中对这些异常点进行检测。
告警配置如下:触发条件选择有大于2条数据满足anomaly_prob > 0,表示在过取4小时内,有两个异常点即告警。
参考
进一步参考
- SLS(日志服务)云原生观测分析平台:https://www.aliyun.com/product/sls
- SLS新版告警文档首页:https://help.aliyun.com/document_detail/207609.html
- 欢迎扫群加入阿里云-日志服务(SLS)技术交流(集团同学请直接搜索群号11702236加入), 获得第一手资料与支持
- 后续系列直播与培训视频会同步到B站,敬请留意