千万级日活量,斗鱼如何基于日志实现秒级监控告警?

2022-02-23 19:16:05 浏览数 (2)

作者:zhengxin

导语:云原生日志服务(Cloud Log Service,CLS)是腾讯云提供的一站式日志数据解决平台,提供了从日志采集、日志存储到日志检索,图表分析、监控告警、日志投递等多项服务,协助用户通过日志来解决业务运维、服务监控、日志审计等场景问题。

背景

直播作为近年来的商业新风口,催生了新的社交方式,获得了极大的用户流量。

「斗鱼」作为品类中的头部平台,斗鱼直播APP的日活用户量超千万量级,高峰时段有上万名主播同时在线开播。

庞大的用户体量对斗鱼的日志运维和监控都提出了更高的要求,面对海量的应用请求日志,斗鱼迫切需要一个总体的视⻆来了解应用的总体运行情况,也需要对日志进行监控分析、故障定位及实时告警。因此斗鱼选择CLS作为日志服务的解决方案。

基于CLS的监控架构

斗鱼通过LogListener将应用服务本地的日志文件上报至CLS,不同的业务线和应用分别对应不同的日志主题。

CLS的统计分析功能兼容标准的SQL语法,内置200 统计分析函数,监控指标可以通过这些统计分析函数从原始日志中实时计算获得。这些指标既可以通过仪表盘集中查看,也可以通过告警策略在指标出现异常时及时告警

CLS架构设计CLS架构设计

这种将原始日志先上传至监控平台,再通过统计分析实时获取监控指标的架构,相比传统监控架构具备如下优势:

⻩金指标监控分析

运维领域一般通过“⻩金指标”来监控系统的运行状态,针对直播领域,斗鱼常用到的指标如下:

  • 响应时间:应用请求的执行时间,通常也被称为延迟或耗时。直播业务中的各种互动环节对响应时间要求较高,一般超过 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交流平台日志服务CLS交流平台

往期文章:

CLS 2021年度总结请您查阅|限量虎年红包封面等你来拿!

「腾讯会议」:面对业务指数级增长如何高效运维?

10倍流量突增,智能门店行业引领者—「非码」如何灵活运维?

CLS「数据加工」:实时处理腾讯会议千亿级日志

【日志服务CLS】一键开启腾讯电子签的高效运维之旅

0 人点赞