You need to enable JavaScript to run this app.
导航
检索分析运维日志
最近更新时间:2024.06.04 14:11:41首次发布时间:2024.06.04 14:11:41

您可以通过系统运维日志监控系统运维指标以及快速定位系统运行异常情况。本文介绍了系统运维的常见分析场景及示例。

背景信息

某游戏公司将客户端用户访问服务端的所有请求以日志形式上传到日志服务,然后通过日志实时检索分析功能,挖掘分析游戏用户的使用体验以及定位系统异常问题。例如:

  • 分析用户登录接口的响应状态码,判断用户登录游戏是否存在异常。
  • 分析用户客户端的加载时长,判断用户的游戏使用体验。
  • 通过用户反馈的游戏启动卡顿情况,定位卡顿问题出现的根本原因。
  • 通过对一段时间内一个或多个用户的请求响应耗时来分析卡顿的具体原因。
  • 查询延迟较高的接口。

前提条件

  • 已创建日志项目和日志主题。具体操作,请参考创建资源
  • 已根据日志字段创建索引。具体操作,请参考配置索引

日志样例

下述表格罗列了系统运维日志的字段样例。

字段名称

类型

示例

说明

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。

索引样例

本案例基于上述日志样例创建了如下索引配置。索引配置的具体操作及注意事项,请参考配置索引
图片

典型检索分析场景

系统运维日志的典型分析场景主要覆盖业务监控、故障排查和性能调优等方面。

业务监控

场景 1:统计地域分布情况

  • 场景:统计最近一天 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 语法
  • 检索分析结果:

场景 2:分组统计请求平均时长

  • 场景 :统计最近一天不同客户端请求的请求平均时长。

  • 检索分析语句:

    *| SELECT RemoteAddr, ROUND(AVG(ReqTime),2) AS "平均请求时长" GROUP BY RemoteAddr ORDER BY "平均请求时长" DESC
    
  • 检索分析结果:

示例 3:按时间统计请求数量

  • 场景:统计最近一天内每小时请求数量的变化情况。

  • 检索分析语句:

    * |SELECT DATE_TRUNC('hour', __time__/1000) AS HOUR, COUNT(*) AS "请求数量" GROUP BY HOUR ORDER BY HOUR
    

    其中:

    • 将查询时间设置为近1天
    • DATE_TRUNC 函数用于将时间戳对齐到小时级别,详细说明请参考DATE_TRUNC 函数
  • 检索分析结果:
    图片

故障排查

通过分析系统运维日志了解错误发生的概率、发生错误的接口、错误数量等信息,及时定位问题。

场景 1:按时间统计错误数量

  • 场景:分析各种错误类型出现的频率及随时间的变化趋势,查看错误发生的规律。

  • 检索分析语句:

    * |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 子句用于过滤掉成功的请求。
  • 检索分析结果:
    使用流图展示各个错误类型的变化趋势,更多信息请参见流图

场景 2:统计错误比例

  • 场景:分析每分钟内资源加载过长导致的错误占所有错误的比例。

  • 检索分析语句:

    * |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 错误占所有错误的比值,单位为百分比。
  • 检索分析结果:

场景 3:分组统计错误数量

  • 场景:按照用户分组,统计各个用户遇到的错误数,分析哪些用户受到的影响最大。

  • 检索分析语句:

    * |SELECT  Account_id, COUNT(*) AS "错误数" WHERE Status != 200 GROUP BY Account_id ORDER BY "错误数" DESC LIMIT 10
    
  • 检索分析结果:

性能调优

通过分析系统运维日志掌握请求延时、慢请求、接口响应速度等信息,及时识别系统瓶颈,优化系统。

场景 1:分组统计平均延时和最大延时

  • 场景:计算每小时内各个接口对应的请求平均延时和最大延时,从整体了解延时情况。

  • 检索分析语句:

    *|SELECT Action, AVG(ReqTime) AS "平均时延", MAX(ReqTime) AS "最大时延" WHERE Status = 200 GROUP BY Action
    
  • 检索分析结果:

场景 2:筛选慢请求

  • 场景:筛选当前 1 小时内的慢请求以及请求来源。

  • 检索分析语句:

    *|SELECT RemoteAddr, ReqID, ReqTime WHERE Status = 200 AND ReqTime > 30000 LIMIT 10
    

    其中:

    • WHERE Status = 200 AND ReqTime > 30000 用于筛选出请求时间大于 30000 微秒的成功请求。
  • 检索分析结果:

场景 3:分析错误变化趋势

  • 场景:分析用户查询接口的响应状态码,判断用户查询是否存在异常。

  • 检索分析语句:

    * |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 子句用于查找用户查询接口相关的错误请求。
  • 检索分析结果:
    使用流图展示各个错误类型的变化趋势,更多信息请参见流图

场景 4:统计指定接口的平均响应时间

  • 场景:统计数据查询接口的平均响应时间,帮助识别是否是该接口存在异常。

  • 检索分析语句:

    * |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' 子句用于查找数据查询接口相关的成功请求。
  • 检索分析结果:
    使用折线图展示数据查询接口的平均响应时间随时间的变化情况。折线图的具体配置请参考折线图

相关文档