您可以通过系统运维日志监控系统运维指标以及快速定位系统运行异常情况。本文介绍了系统运维的常见分析场景及示例。
某游戏公司将客户端用户访问服务端的所有请求以日志形式上传到日志服务,然后通过日志实时检索分析功能,挖掘分析游戏用户的使用体验以及定位系统异常问题。例如:
下述表格罗列了系统运维日志的字段样例。
字段名称 | 类型 | 示例 | 说明 |
---|---|---|---|
Host | Text | http:xxx.com | 请求的目标游戏页面。 |
Action | Text | login | 请求接口的类型。 |
ReqTime | Long | 1000 | 请求的时长,单位为微秒。 |
RespSize | Long | 200 | 请求的响应大小,单位为字节。 |
Status | Long | 429 | 请求的状态码。 |
Time | Text | 2024-05-30 16:57:19.807 | 服务端接收到请求的时间点。 |
RemoteAddr | Text | 10.xx.xx.203 | 游戏系统的用户客户端 IP 地址。 |
ReqSize | Long | 80 | 请求的大小,单位为字节。 |
Account_id | Text | 100000478 | 游戏用户 ID。 |
ReqID | text | 7f4axxxx778f | 游戏客户端发起的请求 ID。 |
本案例基于上述日志样例创建了如下索引配置。索引配置的具体操作及注意事项,请参考配置索引。
系统运维日志的典型分析场景主要覆盖业务监控、故障排查和性能调优等方面。
场景:统计最近一天 TOP 10 客户端的地域分布情况。
检索分析语句:
*| SELECT IP_TO_CITY(RemoteAddr) AS "城市", COUNT(1) AS "访问次数" GROUP BY "城市" HAVING IP_TO_CITY(RemoteAddr) != '' ORDER BY "访问次数" DESC LIMIT 10
其中:
IP_TO_CITY
函数用于获取客户端 IP 地址对应的城市名称,详细说明请参考IP_TO_CITY 函数。GROUP BY
子句用于按照城市对访问次数进行分组,详细说明请参考GROUP BY 语法。HAVING IP_TO_CITY(RemoteAddr) != ''
子句用于排除 RemoteAddr
字段值为空的请求。LIMIT 10
子句用于返回前 10 行结果,详细说明请参考LIMIT 语法。检索分析结果:
场景 :统计最近一天不同客户端请求的请求平均时长。
检索分析语句:
*| SELECT RemoteAddr, ROUND(AVG(ReqTime),2) AS "平均请求时长" GROUP BY RemoteAddr ORDER BY "平均请求时长" DESC
检索分析结果:
场景:统计最近一天内每小时请求数量的变化情况。
检索分析语句:
* |SELECT DATE_TRUNC('hour', __time__/1000) AS HOUR, COUNT(*) AS "请求数量" GROUP BY HOUR ORDER BY HOUR
其中:
DATE_TRUNC
函数用于将时间戳对齐到小时级别,详细说明请参考DATE_TRUNC 函数。检索分析结果:
通过分析系统运维日志了解错误发生的概率、发生错误的接口、错误数量等信息,及时定位问题。
场景:分析各种错误类型出现的频率及随时间的变化趋势,查看错误发生的规律。
检索分析语句:
* |SELECT DATE_TRUNC('minute', __time__/1000) AS time, Status, COUNT(*) WHERE Status != 200 GROUP BY time,Status ORDER BY time,Status
其中:
DATE_TRUNC
函数用于将时间戳对齐到指定的时间级别,详细说明请参考DATE_TRUNC 函数。WHERE Status != 200
子句用于过滤掉成功的请求。检索分析结果:
使用流图展示各个错误类型的变化趋势,更多信息请参见流图。
场景:分析每分钟内资源加载过长导致的错误占所有错误的比例。
检索分析语句:
* |SELECT DATE_TRUNC('minute', __time__/1000) AS time, CAST(SUM(CASE WHEN Status = 400 THEN 1 ELSE 0 END) * 100.00/COUNT(*) AS double) AS "错误占比(%)" WHERE Status != 200 GROUP BY time ORDER BY time
其中:
DATE_TRUNC
函数用于将时间戳对齐到指定的时间级别,详细说明请参考DATE_TRUNC 函数。CAST(SUM(CASE WHEN Status = 400 THEN 1 ELSE 0 END) * 100.00/COUNT(*)
用于计算 400 错误占所有错误的比值,单位为百分比。检索分析结果:
场景:按照用户分组,统计各个用户遇到的错误数,分析哪些用户受到的影响最大。
检索分析语句:
* |SELECT Account_id, COUNT(*) AS "错误数" WHERE Status != 200 GROUP BY Account_id ORDER BY "错误数" DESC LIMIT 10
检索分析结果:
通过分析系统运维日志掌握请求延时、慢请求、接口响应速度等信息,及时识别系统瓶颈,优化系统。
场景:计算每小时内各个接口对应的请求平均延时和最大延时,从整体了解延时情况。
检索分析语句:
*|SELECT Action, AVG(ReqTime) AS "平均时延", MAX(ReqTime) AS "最大时延" WHERE Status = 200 GROUP BY Action
检索分析结果:
场景:筛选当前 1 小时内的慢请求以及请求来源。
检索分析语句:
*|SELECT RemoteAddr, ReqID, ReqTime WHERE Status = 200 AND ReqTime > 30000 LIMIT 10
其中:
WHERE Status = 200 AND ReqTime > 30000
用于筛选出请求时间大于 30000 微秒的成功请求。检索分析结果:
场景:分析用户查询接口的响应状态码,判断用户查询是否存在异常。
检索分析语句:
* |SELECT DATE_TRUNC('minute', __time__/1000) AS time, Status, COUNT(*) AS total WHERE Action = 'SearchPlayerProfile' AND Status != 200 GROUP BY time, Status ORDER BY total
其中:
DATE_TRUNC
函数用于将时间戳对齐到指定的时间级别,详细说明请参考DATE_TRUNC 函数。WHERE Action = 'SearchPlayerProfile' AND Status != 200
子句用于查找用户查询接口相关的错误请求。检索分析结果:
使用流图展示各个错误类型的变化趋势,更多信息请参见流图。
场景:统计数据查询接口的平均响应时间,帮助识别是否是该接口存在异常。
检索分析语句:
* |SELECT DATE_TRUNC('minute', __time__/1000) AS time, AVG(ReqTime) AS "平均响应时长" WHERE Status = 200 AND Action = 'SearchDate' GROUP BY time ORDER BY time
其中:
DATE_TRUNC
函数用于将时间戳对齐到指定的时间级别,详细说明请参考DATE_TRUNC 函数。WHERE Status = 200 AND Action = 'SearchDate'
子句用于查找数据查询接口相关的成功请求。检索分析结果:
使用折线图展示数据查询接口的平均响应时间随时间的变化情况。折线图的具体配置请参考折线图。