前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >千万级日活量,斗鱼如何基于日志实现秒级监控告警?

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

原创
作者头像
日志服务CLS小助手
修改2022-02-23 19:16:05
1.3K0
修改2022-02-23 19:16:05
举报
文章被收录于专栏:日志服务CLS日志服务CLS

作者: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交流平台
日志服务CLS交流平台

往期文章:

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

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

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

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

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • 基于CLS的监控架构
  • ⻩金指标监控分析
    • 响应时间
      • 监控需求1:响应时间5分钟内超过1s的请求次数大于10即触发告警
      • 监控需求2:按url统计响应时间时需忽略url中的参数
      • 监控需求3:应用的平均响应时间及P99响应时间变化趋势
    • 请求数
      • 监控需求1:对比查看今天与昨天的应用请求数变化趋势
      • 监控需求2:查看国内各省份请求数分布
    • 错误数
      • 监控需求1:错误请求1分钟内次数大于50即触发告警
      • 监控需求2:风控策略封禁请求同比昨日增长过大即触发告警
  • 结语
相关产品与服务
日志服务
日志服务(Cloud Log Service,CLS)是腾讯云提供的一站式日志服务平台,提供了从日志采集、日志存储到日志检索,图表分析、监控告警、日志投递等多项服务,协助用户通过日志来解决业务运维、服务监控、日志审计等场景问题。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档