阿里云 SLS
接入 SLS 数据源
在创建数据源连接时,主要填写以下参数;
访问域名可以在阿里云 SLS 的Project中找到,如果 FlashCat 部署的主机和阿里云 SLS 部署在同一个地域,推荐使用私网域名;如果 FlashCat 部署的主机在非阿里云环境,推荐使用公网域名;如果 FlashCat 在私有云部署,访问就需要填写出网代理地址访问公网域名; 如下图所示 AK ID 和 AKS:阿里云 AccessKey 管理查看创建。
SLS 日志查询
日志原文
展示阿里云 SLS 接入源数据,未经过原文处理。
统计图表
统计表是将查询条件结果进行展示,展示方式分为表格图和时序图两种.
表格图
根据举例的查询条件语句*|SELECT status,count(*) as count GROUP BY status
。将查询统计 status 字段,并将统计计算结果命名为 count ,将结果 count 以 status 通过表格分组展示。
语句简析
*| select ...
说明: |
管道符左侧*是查询语句;|
管道符右侧 select...
是分析语句;
status :表示日志数据中的一个字段。
count() AS count: 表示对每种 status 进行计数,并将计数结果命名为count。
GROUP BY status:表示将查询结果按照 status 字段进行分组。
时序图
将阿里云 SLS 日志查询结果提取值,将过滤条件作为指标中 tag 转存展示。下面有一些查询举例,可以学习理解一下。
常用基础查询语法
查询GET请求成功(状态码为200~299)且请求时间小于60秒的日志:
request_method:GET and status in [200 299] not request_time>=60
查询remote_user字段值不为空的日志:not remote_user:""
查询remote_user字段值为空的日志:remote_user:""
查询remote_user字段值不为null的日志:not remote_user:"null"
查询不存在remote_user字段的日志:not remote_user:*
查询存在remote_user字段的日志:remote_user:*
查询host字段值不为123的日志: not host:123.*
场景一:查询代理日志中状态码为403和405的日志,使用 host 、 method 、request_uri 分组统计。
status:403 OR status:405 | SELECT host AS host,request_method AS method,request_uri AS url,count(*) AS count GROUP BY host,method,url
这个语句也可以变形为程序错误日志,如: errCode: xxx or errCode:xxx | select ...
场景二:查询 request_method 字段以GE开头,且 client_ip 字段范围是 8.140.205.* 的数据,使用 host 、 method 、request_uri 分组统计
request_method:GE* and client_ip:8.140.205.* | SELECT host AS host,request_method AS method,request_uri AS url,client_ip AS cip,count(*) AS count GROUP BY host,method,url,cip
场景三:查询请求时间小于1秒的成功请求的日志中包含 flashcat 字符串的日志,使用 host 、 method 、request_uri 、status 、request_uri 分组统计。
flashcat AND read_request_time < 1 AND (status >= 200 AND status <= 299) | SELECT host AS host, request_method AS method, request_uri AS url,status as st, read_request_time as rqt,count(*) AS A GROUP BY host, method, url,status,read_request_time
场景四:查询昨日代理日志中状态码为403和405的日志,使用 host 、 method 、request_uri 分组统计。
status:403 OR status:405 | SELECT host AS host, request_method AS method, request_uri AS url, from_unixtime(__time__) AS time, count(*) AS A WHERE __time__ < to_unixtime(current_date) AND __time__ > to_unixtime(date_add('day', -1, current_date)) GROUP BY host, method, url, time
这个语句主要使用了from_unixtime()
、to_unixtime()
、current_date
、date_add
和day
函数;
rom_unixtime 函数用于将UNIX时间戳转化为timestamp类型的日期和时间表达式,格式为YYYY-MM-DD HH:MM:SS.Ms或YYYY-MM-DD HH:MM:SS.Ms Time_zone。
current_date 函数将timestamp类型的日期和时间表达式转化成UNIX时间戳。
current_date 函数用于返回当前日期,格式为YYYY-MM-DD。
date_add 函数用于在日期或时间中添加或减去指定的时间间隔。
day 函数用于提取日期和时间表达式中的天数,按月计算。day函数等同于day_of_month函数。
SLS 日志告警
在告警规则—> 选择 log 数据源 —> 配置查询语句和提取值 ValueKey —> 选择简单模式设置指定时间内 ValueKey 的阈值即可。
配置场景一:查询代理日志中状态码为404和405的日志数量,如果查询结果大于0且不等于3个报警。
查询语句就是上面介绍的查询语法status:404 OR status:405 | SELECT status AS status,count(*) AS count GROUP BY status
,这里是以查询值结果进行条件判断,所以在条件判断时使用了$A > 0
且$A !=3
。
配置场景二:配置不同的指标进行结果判断,status:404
值大于100且status:405
值大于1触发报警。
为了实现不同的语句值联合判断,需要填写两个不同的查询分析语句,将值取出进行判断,判断条件分别使用提取值$A
和$B
进行比较运算。
注意:
- 与PromQl一样,如果数据标签不一致查询分析语句会被视为两条不同的曲线,无法进行比较运算。这种情况下不对 LabelKey 进行设置,这样就能保证数据曲线不会因为标签不同无法进行运算了。
- 目前暂时只支持 “等于” 数值,但不支持 “等于” 字符串。所以在过滤字符串时需要将字符串放到查询语句中即可。
排错分析
如果配置完成告警无法正常报警的话,可以查看一下N9E 的 INFO.log 日志过滤关键词rule_eval,下面就是日志的示例。
正确日志:从日志可以看出 $A 和 $B 都获取了对应值,且表达式返回结果为 true ,表示满足表达式。
错误日志:首先从截图日志可以看出返回结果为 false ,标识不满足表达式条件;其次可以看到配置了一条告警计算条件却出现了两个 false 返回;这就很大可能是因为 数据标签不一致查询分析语句会被视为两条不同的曲线,两个数据曲线无法满足告警计算条件,所以无法正常告警。