作者:zhengxin
导语:云原生日志服务(Cloud Log Service,CLS)是腾讯云提供的一站式日志数据解决平台,提供了从日志采集、日志存储到日志检索,图表分析、监控告警、日志投递等多项服务,协助用户通过日志来解决业务运维、服务监控、日志审计等场景问题。
背景
直播作为近年来的商业新风口,催生了新的社交方式,获得了极大的用户流量。
「斗鱼」作为品类中的头部平台,斗鱼直播APP的日活用户量超千万量级,高峰时段有上万名主播同时在线开播。
庞大的用户体量对斗鱼的日志运维和监控都提出了更高的要求,面对海量的应用请求日志,斗鱼迫切需要一个总体的视⻆来了解应用的总体运行情况,也需要对日志进行监控分析、故障定位及实时告警。因此斗鱼选择CLS作为日志服务的解决方案。
基于CLS的监控架构
斗鱼通过LogListener将应用服务本地的日志文件上报至CLS,不同的业务线和应用分别对应不同的日志主题。
CLS的统计分析功能兼容标准的SQL语法,内置200 统计分析函数,监控指标可以通过这些统计分析函数从原始日志中实时计算获得。这些指标既可以通过仪表盘集中查看,也可以通过告警策略在指标出现异常时及时告警。
这种将原始日志先上传至监控平台,再通过统计分析实时获取监控指标的架构,相比传统监控架构具备如下优势:
⻩金指标监控分析
运维领域一般通过“⻩金指标”来监控系统的运行状态,针对直播领域,斗鱼常用到的指标如下:
- 响应时间:应用请求的执行时间,通常也被称为延迟或耗时。直播业务中的各种互动环节对响应时间要求较高,一般超过 1s 即需要告警。
- 请求数:应用请求的执行数量,通常也被称为吞吐量、QPS、QPM、PV等,具体的计算方式略有区别。请求数环比突增、突降或超过系统安全阈值均需及时处理。
- 错误数:应用请求执行报错的数量。除了常规的应用错误外,由于安全和⻛控等原因导致的请求拒绝也需要额外关注。
应用请求日志主要来自于Nginx,下面我们将以CLS日志中心的Nginx demo日志为例,介绍斗鱼的黄金指标统计方式。
样例日志如下:
代码语言:javascript复制__TIMESTAMP__ : 1642513644202
body_bytes_sent : 54
http_user_agent : Mozilla/5.0 (compatible; Nmap Scripting Engine; https://nmap.org/book/nse.html)
method : POST
proxy_alternative_upstream_name :
proxy_upstream_name : default-kubernetes-443
remote_addr : 117.147.9.191
req_id : 2d4e4e74acce40b8b2b183d3d319a51f
request_length : 618
request_time : 0.064
status : 400
sys_address : 9.130.144.178
timestamp : 1638459398
upstream_addr : 169.254.128.14:60002
url : /sdk
version : HTTP/1.1
响应时间
监控需求1:响应时间5分钟内超过1s的请求次数大于10即触发告警
(1)分析语句:
代码语言:javascript复制request_time:>1.0 |
select
url,
count(*) as count
group by
url
order by
count desc
(2)语句解析:
通过检索条件request_time:>1.0
将响应时间超过1s的请求日志过滤出来,通过管道符后面的SQL进行统计分析。
使用count(*) as count
统计日志条数(即请求次数),再通过group by url
可获得每个接口的请求次数。
将该语句添加至告警策略中,应用内任一接口出现了响应时间超过1s的情况,即可触发告警。
(3)效果预览:
监控需求2:按url统计响应时间时需忽略url中的参数
实际的应用日志中,url包含了很多请求参数,这些参数的值很多,如果直接对这些url进行group by
会导致url数量过多,难以直观地了解每个接口的性能指标,因此需要去除这些参数。
(1)分析语句:
代码语言:javascript复制* | select url_extract_path(url)
(2)语句解析:
使用url_extract_path(url)
可单独提取url中的path部分,例如原始url 为 https://console.cloud.tencent.com/cls?region=ap-chongqing
,提取后的值为cls
。
监控需求3:应用的平均响应时间及P99响应时间变化趋势
(1)分析语句:
代码语言:javascript复制* |
select
histogram(__TIMESTAMP__, interval 1 minute) as analytic_time,
approx_percentile(request_time, 0.99) as P99,
avg(request_time) as AVG
group by
analytic_time
order by
analytic_time
limit
1000
(2)语句解析:
histogram(__TIMESTAMP__,interval 1 minute) as analytic_time
用于对时间按分钟进行分组,结合 group by
可按分钟分别统计应用的响应时间。approx_percentile(request_time,0.99)
用于统计应用的 P99响应时间,即99%的请求响应时间低于多少,用来了解大多数用户的使用体验。
avg(request_time)
则用于统计应用的平均响应时间。
(3)效果预览:
请求数
监控需求1:对比查看今天与昨天的应用请求数变化趋势
(1)分析语句:
代码语言:javascript复制* |
SELECT
concat(CAST(CURRENT_DATE AS varchar), ' ', time) AS time,
compare[1] AS today,
compare[2] AS yesterday
FROM (
SELECT
time,
compare(pv, 86400) AS compare
FROM (
SELECT
time_series(__TIMESTAMP__, '10m', '%H:%i:%s', '0') AS time ,
count(*) AS pv
FROM log
GROUP BY time
LIMIT 1000
)
LIMIT 1000
)
ORDER BY time
LIMIT 1000
(2)语句解析:
- 最内层子查询
SELECT time_series(__TIMESTAMP__, '10m', '%H:%i:%s', '0') AS time , count(*) AS pv FROM log GROUP BY time
用于统计今日每10分钟的请求数变化趋势。 - 外层子查询使用
compare(pv, 86400)
可获得昨日(即86400秒前)的请求数变化趋势,其结果的每一行均为一个数组,第一个元素compare[1]
为今日请求数,第二个元素compare[2]
为昨日请求数。 - 最外层查询使用
concat(CAST(CURRENT_DATE AS varchar), ' ', time) AS time
将今天的日期(年-月-日)与每行数据的时间(时:分:秒)连接起来作为一个完整的时间(年-月-日 时:分:秒),便于作为图表的时间轴。使用数据下表运算符[]
将compare数组拆分为两个变量,便于在图表中分别绘图。
(3)效果预览:
监控需求2:查看国内各省份请求数分布
(1)分析语句:
代码语言:javascript复制* |
select
ip_to_province(remote_addr) as province,
count(*) as pv
where
ip_to_country(remote_addr) like '中国%'
group by
province
(2)语句解析:
使用ip_to_province(remote_addr)
将原始日志中的IP地址解析为省份信息,使用count(*)
和group by province
统计每个省份的请求数。
为了避免海外访问数据的干扰,使用where ip_to_country(remote_addr) like '中国%'
对数据进行过滤,仅统计ip属于中国的请求。
(3)效果预览:
错误数
监控需求1:错误请求1分钟内次数大于50即触发告警
(1)分析语句:
代码语言:javascript复制status :>= 500 |
select
count(*) as errorCounts,
status
group by
status
order by
errorCounts desc
(2)语句解析:
通过检索条件status:>=500
将错误的请求日志过滤出来,通过管道符后面的sql进行统计分析。
count(*) as count
统计日志条数(即错误请求次数),再通过group by status
可获得每个状态码的错误请求次数。
将该语句添加至告警策略中,应用内任一状态码1分钟内错误请求次数大于50,即可触发告警。
监控需求2:风控策略封禁请求同比昨日增长过大即触发告警
(1)分析语句:
代码语言:javascript复制limited :1 |
SELECT
compare[1] AS "当前⻛控封禁数量",
compare[2] AS "昨日⻛控封禁数量",
round(compare[3], 2) AS "同比"
FROM
(
SELECT
compare(pv, 86400) AS compare
FROM
(
SELECT
count(*) AS pv
FROM
log
)
)
(2)语句解析:
通过检索条件limited:1
将被风控策略禁止的请求日志过滤出来,再通过后面的sql进行统计分析。
语句中嵌套了2个子查询:
- 最内层子查询使用
count(*)
统计今日被风控策略禁止的请求数。 - 外层子查询使用
compare
获得昨日(即86400秒前)被风控策略禁止的请求数。 - 最外层查询使用使用数据下表运算符
[]
将compare数组拆分为三个变量,分别为当前和同比昨日被风控策略禁止的请求数以及两者的比值,针对比值还是用了round
函数调整小数位数,便于后续在告警通知中查看。
结语
腾讯云日志服务CLS拥有的200 统计分析函数,可以完美实现业务关键指标的实时告警、运营数据可视化图表分析,无论在运维还是运营层面都为客户节省了大量人力物力,实现了业务效率的跨越式提高。
未来CLS还将与客户一起,聚焦运维自动化、成本优化、性能优化等方向,让业务运维、监控更加便捷高效。
统计监控指标过程中主要使用了如下几类函数/语法:
举例 | 使用场景 | 详细说明 | |
---|---|---|---|
日期和时间函数 | histogram、time_series | 分析监控指标随时间的变化趋势时,按一定的颗粒度对时间进行分组 | https://cloud.tencent.com/document/product/614/58981 |
IP 地理函数 | ip_to_country、ip_to_province | 将日志中的IP地址解析为国家、省份等地理信息 | https://cloud.tencent.com/document/product/614/58976 |
URL 函数 | url_extract_path | 在带参数的URL中提取接口地址,便于后续按接口地址统计监控指标 | https://cloud.tencent.com/document/product/614/58979 |
通用聚合函数 | count、avg | 对日志中的数值进行统计计算 | https://cloud.tencent.com/document/product/614/60028 |
估算函数 | approx_percentile | 统计P95、P99、P999响应时间 | https://cloud.tencent.com/document/product/614/60335 |
同环比函数 | compare | 计算监控指标的同比或环比值 | https://cloud.tencent.com/document/product/614/63801 |
GROUP BY | - | 分组统计监控指标,例如统计每个接口的响应时间 | https://cloud.tencent.com/document/product/614/58974 |
ORDER BY | - | 对统计结果进行排序,例如按错误数由大到小查看接口 | https://cloud.tencent.com/document/product/614/58978 |
WHERE | - | 统计过程中对数据进行过滤,例如仅统计IP地址为中国的请求 | https://cloud.tencent.com/document/product/614/44075 |
嵌套子查询 | - | 对统计结果进行二次统计,满足复杂的统计需求 | https://cloud.tencent.com/document/product/614/58980 |
除上述函数/语法外,CLS还支持很多其它函数,满足监控指标的各类统计需求,欢迎大家使用体验。
以上就是关于斗鱼直播通过CLS实现海量日志秒级监控分析的案例分享,如果您有更多有意思的日志实践玩法分享,欢迎投稿!
加入「腾讯云日志服务CLS技术交流群」,获取更多资讯,掌握最新动态!
往期文章:
CLS 2021年度总结请您查阅|限量虎年红包封面等你来拿!
「腾讯会议」:面对业务指数级增长如何高效运维?
10倍流量突增,智能门店行业引领者—「非码」如何灵活运维?
CLS「数据加工」:实时处理腾讯会议千亿级日志
【日志服务CLS】一键开启腾讯电子签的高效运维之旅