前言
阿里云SLS作为一站式的可观测性平台,用户将日志数据,时序数据,Trace数据都存储在SLS;SLS提供统一的查询分析语言,支持完整的SQL 92语法;SLS新版告警完整支持SLS的查询分析语法,基于此,可以配置常见的如关键词告警,同环比告警,网址错误监控,流量急跌或暴涨监控;在新版告警中,可以对多个数据源进行监控,并且支持多数据源的间的协同监控。支持常见的左联,右联,内联,外联,左斥,右斥等集合操作,可以使用在比如白名单,黑名单监控场景。
告警监控
告警监控可以对多个数据源进行监控:通过选择不同的数据源类型(日志存储,时序存储,资源数据),使用不同的查询分析语句,可以得到不同的查询结果,每个查询结果可以看出一个结果集,对多个结果集之间可以进行集合操作,包括左联,右联,全联,内联,外联,左斥,右斥等,也是本文介绍的重点。
在SLS新版告警的查询统计时,最多可以设置三个查询,两个之间可以进行集合操作。
监控系统对于监控规则中的分组评估和触发条件都是基于集合操作的结果进行评估,并非针对某一个查询结果进行评估。
设置单个查询时,集合操作结果即为单个查询的结果,可以理解为对查询结果进行评估。
集合操作类型及其使用场景
SLS集合操作主要包括笛卡尔积,不合并,拼接,左联,右联,全联,左斥,右斥等操作,接下来会对每个集合操作进行简单的介绍,并介绍其使用场景。
以下的介绍场景皆为两个操作结果之间的集合操作,当监控中有三个查询时,会先对前两个结果进行集合操作,得到的结果在跟第三个结果进行集合操作
笛卡尔积
笛卡尔积在数学中是一种集合运算,在告警监控中,两个查询结果,第一个查询结果为m条,第二个查询结果为n条,进行笛卡尔积集合操作后的结果将有m*n条数据;监控规则也将会对这m*n条数据进行分组评估和触发条件评估。
场景
假设同时对oss访问日志和nginx访问日志进行监控,每15分钟统计一次oss的5xx错误和slb的5xxx错误,当错误总数达到1000时进行告警。
如图,对于两条查询可以使用笛卡尔积进行集合操作,然后在触发条件中,可以对两个查询后的结果进行联合判断。
集合操作结果示意图,蓝色表示集合操作后的结果
不合并
不合并表示集合操作结果只包含前一个查询结果,舍弃后一个查询结果,注意,这里只是在规则进行评估时舍弃后一个查询结果,也就是分组评估和触发条件不会用到后一个查询结果,但是后一个查询结果还是可以在内容模板变量中被引用。
场景
监控nginx访问日志时,每15分钟的5xx错误次数大于10次时触发告警,并且在告警内容中列出具体出错的域名信息;这里可以把需求分为两部分,第一部分是评估要用到的条件,5xx错误次数大于10,第二部分是告警内容列举具体错误的域名信息;可以将第一部分用错误总次数作为查询条件,第二个查询使用域名错误作为查询条件。
下面的例子这里触发条件设置为nginx_err_cnt > 10,在触发条件中不可以引用host和err_cnt,因为在评估时不会对后一个查询结果进行评估。
如果想要引用第二个查询结果,可以在内容模板中使用${results[1].raw_results}来引用第二个查询的结果。
集合操作示意图,蓝色会集合操作结果
拼接
拼接是直接将后一个操作结果直接合并到前一个操作结果,按照字段进行对齐,对于重复的数据不进行排重处理。
场景
假设有两个logstore分别用来存储北京和上海的nginx访问日志,需要对两地的nginx 5xx同时进行监控,因为两个logstore的结构一致,直接将两个5xx的错误结果进行拼接,可以实现同时对两地nginx的错误进行监控。
如下例子中,第一个查询是北京的nginx访问日志,第二个查询是上海的nginx访问日志,这里直接设置触发条件err_cnt > 10,可以对北京和上海的nginx访问日志同时进行监控。
集合操作示意图
内联
内联类似数据库中的inner join操作,对于两个查询结果,会根据连接的字段,找出两个查询结果中的公共部分。
场景
比如在oss访问日志的监控中,可以对oss访问的5xx错误数进行监控,在资源表中可以存储bucket对应的环境类型,假如我们只需要对资源表中对应的bucket进行监控,可以使用内联操作,内联的条件是第一个结果的bucket等于第二个结果的bucket。
这里用到了资源数据,我们可以在告警中心-资源数据中,自定义一个资源数据,可以定义其字段和类型,并且批量添加数据
集合操作示意图,蓝色表为集合操作结果
左联
左联类似数据的left join,一般用在前一个查询结果数据字段不足,用后一个查询结果来进行补充的场景。
场景
在oss的监控中,把oss的bucket的描述信息存在资源数据中,包括字段bucket和desc;oss的错误监控查询分析结果包含bucket和err_cnt,使用左联后,连接条件是bucket相同,集合操作结果将包含bucket, err_cnt, desc(如果资源表中没有出现的bucket,集合操作结果也不会有desc字段)。
集合操作示意图,蓝色的为集合操作结果。
注意,上述触发条件选择的是会有数据,这里如果想对蓝色结果进行引用可以使用内容模板变量${fire_results},表示所有的满足触发条件的结果。
右联
右联为左联的相反操作,这里不再赘述,左联两个操作结果调换位置,即为右联。
全联
全联表示集合A和集合B相互补充信息。
场景
比如在OSS 5xx错误监控中,在5xx错误次数监控的同时,也希望可以看到5xx访问的uv,可以在配置监控规则时使用全联操作,连接条件是bucket相同。
集合操作示意图:
左斥
左斥可以理解为前一个查询的结果,排除第二个查询的结果,常用在一种黑名单的操作中,左边的结果,第二个查询结果作为黑名单,第一个查询结果作为评估结果。
场景
比如在OSS 5xx错误监控中,某些bucket是测试bucket,并不需要对齐进行监控,这时可以在资源数据中增加bucket黑名单,将测试bucket填进去,使用左斥操作即可实现黑名单效果。
集合操作示意图:蓝色表示集合操作结果
右斥
右斥是左斥的相反操作,在左斥中将两个操作结果互换位置,即为右斥。
注意事项
- 时序存储进行查询时,使用promql_query(string)、promql_query_range(string, string)函数查询时,返回的字段包括metric, labels, time, value四个字段,其中labels为map类型,在配置监控规则时,会将labels展开,例如labels值为{"host":"xxxx", "ip": "192.168.1.102"},metric值为cpu_util,则查询结果字段有metric, labels, time, value, host, ip 六个字段(该规则只适用用监控规则配置时)。
- 使用查询分析语句时,单个查询和分析的结果超过1000条时,只会保留前1000条数据,用于集合操作,当存在三个查询和分析操作且集合操作未选择不合并时,只选取每个查询和分析结果中的前100条数据。
- 集合操作中,会默认对每个查询结果的字段加上$x.前缀,比如第一个查询结果的字段都会加上$0.前缀,第二个查询结果的字段都会加上$1.前缀, x可以取值0,1,2。以下情况可以在触发条件和分组评估字段中省略前缀:
- 第一个查询的所有字段都可以省略前缀$0.。
- 只有一个查询时,可以省略字段前缀$0.。
- 有两个查询时,两个查询结果中的字段完全不同时,两个查询结果字段分别可以省略前缀$0.和$1.,如果三个查询中的字段也完全不同,三个查询结果中的字段可以省略前缀。
- 有两个查询时,两个查询结果的字段有重复,且重复字段用于集合操作(左联,右联,内联,外联,左斥,右斥)的连接字段,且连接运算符是相等时,可以省略字段重复字段名;如果连接运算符不是相等时,第二个查询结果中的重复字段保留前缀。
- 当有三个查询时,会先计算前两个查询的集合操作结果,然后拿这个集合操作结果跟第三个查询进行集合操作,是否去掉前缀按照两个查询的方式进行。
参考
进一步参考
- SLS(日志服务)云原生观测分析平台:https://www.aliyun.com/product/sls
- SLS新版告警文档首页:https://help.aliyun.com/document_detail/207609.html
- 欢迎扫群加入阿里云-日志服务(SLS)技术交流(集团同学请直接搜索群号11702236加入), 获得第一手资料与支持
- 后续系列直播与培训视频会同步到B站,敬请留意
最后,如果您还想了解更多智能运维前沿资讯,欢迎您报名参加【数智创新行·智能运维专场】。
6月25日|上海·西岸国际人工智能中心
数智创新行上海站·智能运维专场
阿里云将带来云原生智能运维解决方案,满足海量事件有效感知、高效响应,可观测数据统一分析、故障定位,以及基于AI的异常检测等需求,助力企业构建自己的运维平台,成为开发、运维人员高效可靠的助手。
扫描海报二维码或点击下方链接报名, 期待您一起开启智能运维新时代!
https://www.aliyun.com/page-source//developer/special/osssalon