一招高效解析 Access Log,轻松应对泼天流量

乾以、马云雷

业务背景

近日大量美国用户转移到新的社交平台,小红书登顶美国 App 下载榜首。与小红书一样的出海企业都会遇到类似问题:海外用户规模猛增,访问流量也随之快速上涨,如何应对这突如其来的“泼天富贵”:

  • 后端服务如何识别突增流量、快速扩容?
  • 如何识别流量来源、针对网络做优化?
  • 服务波动时能否快速定位来源?

只有妥善解决这些关键问题,企业才能有效留住用户。为此,阿里云可观测推出一套全面的流量分析解决方案,帮助企业在面对巨大的商业机遇时拥有充足的底气与信心。本文将基于访问日志(Access Log)并结合 AIOps 算法,演示如何快速识别流量波动以及精准定位波动的来源,从而为企业提供有针对性的优化建议。

什么是访问日志(Access Log)

访问日志(Access Log)作为记录用户对服务器或网络服务进行访问的详细信息的日志文件。在各类服务器中得到广泛应用,例如 Web 服务器、应用服务器和数据库服务器等。通过访问日志,对分析用户习惯、优化服务性能以及提升用户体验具有重要意义。

访问日志通常包含多种信息,如用户的 IP 地址、访问时间、请求的 URL、HTTP 状态码、用户代理字符串等。这些数据不仅有助于监控系统的性能,还能在遇到问题时为故障排查提供宝贵的线索。此外,访问日志还可以用于安全审计,帮助识别可疑的访问模式和潜在的网络攻击,从而增强系统的安全防护措施,是现代网络服务管理中不可或缺的一部分。这里我们以 Nginx 的 Access Log 为例,其通常具备以下字段,可以看到,其中记录了访问请求的来源、方法、延时等数据。

host:www.lsb.mock.com
remote_addr:123.246.223.87
http_user_agent:Mozilla/5.0 (Macintosh; AMD Mac OS X 10_8_2) AppleWebKit/535.22 (KHTML, like Gecko) Chrome/18.6.872
request_method:POST
request_time:53
request_uri:/request/path-0/file-2
status:200
time_local:15/Jan/2025:01:36:56
upstream_response_time:2.05

为什么需要 AlOps 算法分析访问日志

想要更好的分析日志信息,离不开一套成熟的数据处理语法,SPL(SLS Processing Language,https://help.aliyun.com/zh/sls/user-guide/spl-overview)是针对数据查询、流式消费、数据加工、采集、Ingestion等数据处理场景,所提供的统一的数据处理语法。通过 SPL 能够快速从数据中提取出时序指标,并进行进一步分析。为什么要推出智能化运维呢?

在传统的运维告警方案上,存在着两个挑战:

  • 难以准确识别异常。针对指标数据,通常会通过计算时间窗口均值、变化率等方式来识别异常并配置告警,但是存在着大量漏报、误报问题,针对不断变化的场景,难以确定一个合适的异常阈值。例如一些微小的噪声波动就可能触发大量告警,亦或者因为只差一点达到阈值,而未能及时发出告警。如何准确识别出时序指标中的异常,成为了大量用户的痛点,面对采集上来的监控指标“束手无策”,难以配置出有效的告警。
  • 难以快速定位根因。异常指标可能是由某一个维度引起的,当发现整体指标异常时,如何从海量维度中快速定位异常来源于哪个维度组合?是某个机房故障?还是某个服务组件故障?传统方案依赖于专家经验逐个检查可能性最大的维度,浪费大量时间去恢复故障。只有快速定位根因,才能快速响应和解决故障。

针对以上用户痛点,我们可以利用 SPL 所提供的 AIOps 系列函数,实现了更智能的可观测能力。这里介绍其中的两类算法:

  • 异常检测算法。异常检测算法基于历史数据本身的特征,从历史数据建模,分析其变化趋势,标注存在的异常区间,并且能够提供异常分数,准确表示出异常程度。
  • 根因定位算法。能够快速计算出不同维度组合的子序列,并进行算法分析,找到产生异常的维度来源。

最佳实践

在正式开始前,我们需要完成相关前序准备工作。在完成创建日志服务 SLS 的资源管理单元 Project 和采集、存储和查询单元 Logstore 后,完成 Logtail 采集配置。将 Logtail 安装至 ECS 服务器并开始采集日志,日志会发送到对应的 Logstore 中。

在获得相关日志数据后,我们就可以通过 SPL + AIOps 对访问日志进行智能可观测。

1. 日志到指标:把文本转化为可分析指标

访问指标:根据访问日志可以得到系统整体的访问指标。通过 SPL 将数据按时间进行聚合,得到每分钟的访问量。

*
| extend ts= second_to_nano(to_unixtime(date_trunc(60, __time__)))
| stats request_count=count(1) by ts
| make-series request_count on ts

示例中,我们可以看到通过 SPL 得到全局的访问流量指标序列。

2. 异常检测:识别时序指标是否存在异常

针对该时间序列,可以使用异常检测函数识别时序数据中的异常。在现有的可观测产品中,我们提供了两个检测算法,可以覆盖高频场景中的异常检测需求。

series_decompose_anomalies

异常检测函数 series_decompose_anomalies 异常检测函数专注于对偏连续性指标,内置多种算法进行周期估计、趋势拟合、序列分解、序列重构、假设检验,同时也提供了丰富的高级参数供专业的研发同学进行精细的调参,解决时序的异常检测问题。

series_pattern_anomalies

异常检测函数 series_pattern_anomalies 异常检测函数专注于对指标的形态出发,设计端到端的检测模型,可以支持任意长度的连续型或离散型序列的检测。同时支持更大规模的检测需求。

......
| extend ret = series_decompose_anomalies(request_count_arr)
or
| extend ret = series_pattern_anomalies(request_count_arr)

在示例中,我们看到 16:00 开始指标存在异常情况,我们可以结合告警感知变化。

3. 定位异常时间点:精确定位异常时间

基于异常检测的结果,使用 SPL 进一步进行过滤,能够判断最近 5 分钟是否有异常分数大于 0.5 的异常点。并且使用该 SPL 语句配置告警,可以准确且及时地发现系统异常。

......
| extend anomalies_score_series = ret.anomalies_score_series
| where array_max(slice(anomalies_score_series, -5, 5)) >= 0.5

4. IP 函数:

多维度富化指标维度

当前观测到系统访问流量存在异常,流量猛增,从 IP 角度来看用户可能来自各种地方,但是我们可以把IP转化为其他维度,然后从这些维度查看是否有公共特征。可以使用 SLS 提供的 IP 函数对流量来源进行进一步分析,IP 函数可以把 IP 转化为国家、省、市、运营商等。使用以下 SPL 语句,分析访问 IP 来源的国家。

*
| extend country = ip_to_country(remote_addr)
| stats access_count = count(1) by country

将结果进行可视化,观测访问来源,发现大量海外访问流量来自美国。

5. 根因分析:快速发现异常来源

国外的访问流量增长是否是导致整体访问流量突增的原因?SLS 提供的根因下探函数可以解答这个疑问。我们将整体访问流量按 country,host,agent 这三个维度进行分组聚合,然后对其进行根因定位。

*
| extend ts= second_to_nano(to_unixtime(date_trunc(60, __time__)))
| extend country = ip_to_country(remote_addr)
| stats request_count=count(1) by ts, country, host, agent
| make-series request_count on ts by country, host, agent
| stats country_arr = array_agg(country), host_arr = array_agg(host), agent_arr = array_agg(agent),ts_arr = array_agg(__ts__), metrics_arr = array_agg(request_count)
| extend ret = series_drilldown(country_arr, host_arr, agent_arr, ts_arr, metrics_arr, 1736756946000000000)

从算法返回结果可以看到,导致异常的维度组合是 country=‘美国’,验证了我们的猜想。接下来我们可以针对该来源的流量进行针对性的优化。

{
# 异常根因对应的维度组合
"attrs": [{
"country": "美国"
}],
# 异常根因的评价指标
"statistics": {
"relative_ratio": 0.84,
"relative_unexpected_difference": 0.73,
"difference": -293.2,
"predict": 53.3,
"real": 346.5
}
}

6. 针对性扩容

通过以上流程,能够快速发现流量异常,并使用 IP 函数和根因定位算法定位出异常原因,能够指导运维人员进行针对性地处理,快速扩容,接住上涨的流量。

总结

通过上述 step-by-step 的例子中可以看到,SPL + AIOps 能够提供智能化的可观测解决方案,对访问日志获得立体化的观测覆盖,帮助我们加快感知流量,接住泼天富贵。

未来,我们还将提供出更多 AIOps 函数,让 AI 为可观测赋能。

欢迎来可观测案例中心尝试:https://sls.aliyun.com/doc/

AI 机器学习函数:

https://help.aliyun.com/zh/sls/user-guide/ai-machine-learning-functions/

https://help.aliyun.com/zh/sls/user-guide/machine-learning-syntax-and-functions/


observability.cn Authors 2024 | Documentation Distributed under CC-BY-4.0
Copyright © 2017-2024, Alibaba. All rights reserved. Alibaba has registered trademarks and uses trademarks.
浙ICP备2021005855号-32