访问日志(Acccess Log)是由web服务生成的日志,每一次api请求都对应一条访问记录,内容包括调用者IP、请求的URL、响应延迟、返回状态码、请求和响应字节数等重要信息。
阿里云API网关提供API托管服务,在微服务聚合、前后端分离、系统集成上为用户便利的产品。
访问日志对于API网关的意义尤为重要,它可以帮助使用者打破黑盒,了解其web服务的运行状况。但实际上,云服务厂商为其用户提供访问日志确实不小的挑战:
- 日志分发到用户空间的实时性:从用户访问服务产生日志到日志对用户可见,业界不少的方案是“T+1”时效的;做到秒级延迟对于用户有非常的意义,使得异常告警、快速问题修复成为可能。
- 日志的ad-hoc查询能力:对于trouble shooting场景,工程师在个人经验和业务知识的基础上,不断缩小问题范围以致最终定位解决,对于日志的分析和查询需求是不断变化的,即时查询能力价值因此得到体现。
- 海量日志的快速分析能力:访问日志和请求PV是对应的,拥有百万级用户的服务每天甚至可以达到TB级别的访问日志规模,秒级延迟下满足常见的日志分析场景是一个重要能力。
在今天,API网关新支持了日志功能,基于日志服务为用户提供实时、自助分析访问日志的能力。
访问日志可以搞些什么事情
开通API网关日志功能后,你可以在日志服务上实时获取所有访问日志记录。日志服务对于访问日志的常见使用场景都提供了支持:
- 报表分析:通过ad-hoc分析语法实时计算结果,并对结果提供丰富的可视化展示
- 实时查询:业界有竞争力的访问日志查询体验,用户API被调用后可以秒级(1分钟,90%情况下15秒内)延迟获取对应的请求日志,查询语法支持全文关键词、Key-Value、Range查询,可以在1秒内处理千万级别日志
- 异常告警:借助分析语法对日志内容做个性化统计,对于统计结果支持阈值报警,对接阿里云通知中心、短信、钉钉进行告警
- 日志投递:一键配置数据投递OSS(低成本归档、数仓计算)、MaxCompute(数仓计算)等云产品,全托管运行
- 其它:更多个性化需求,可以通过函数计算、消费组、EMR等方式处理访问日志
阿里云API网关的访问日志格式如下:
字段名 | 字段含义 |
---|---|
requestId | 每次请求的唯一ID |
apiGroupUid | 分组ID |
apiGroupName | 分组名称 |
apiStageUid | 环境ID |
apiStageName | 环境名称 |
apiUid | API的唯一ID |
apiName | API名称 |
clientIp | 调用者IP |
appId | 调用者的应用ID |
appName | 调用者应用名称 |
domain | 请求的域名 |
httpMethod | 请求方法 |
path | 请求path |
statusCode | HTTP状态码 |
errorMessage | 错误信息 |
exception | 异常信息 |
providerAliUid | API提供者阿里云ID |
region | regionId |
requestHandleTime | 请求处理时间 |
requestSize | 请求大小 |
responseSize | 响应大小 |
serviceLatancy | 服务端延时(单位毫秒) |
玩转API网关访问日志
本节为大家介绍在日志服务控制台上如何对API网关访问日志做分析。
1. 报表分析
基于灵活的分析语法,你可以按照自己的思路写出分析语句,通过ad-hoc查询完成业务需求。日志服务对计算结果提供多种可视化展示方式,dashboard内每个图表的统计指标支持即时修改生效。
日志服务默认提供了一些API网关的分析报表如下:
- api请求成功率、后端服务失败占比
- 请求PV最高的app、请求出现错误的api统计
- 访问来源app数、top请求次数的appGroup
- api请求PV、服务延迟统计
- top延时的api统计、top请求次数的api统计
除了官方提供的报表以外,你还可以自己写分析语句生成报表,10分钟精通Nginx访问日志分析统计提供了一些有趣的访问日志分析语法样例可供参考。
2. 实时查询
快速问题诊断是一项非常重要的能力,可以帮助线上服务减少异常带来的损失。区别于业界常见的“T+1”日志投送能力,我们可以在日志服务上准实时获取到最新访问日志,为短时间内定位问题根源提供可能。
在收到告警或看到异常指标后,日志服务的大数据查询能力可以帮助你快速找到到值得关注的日志记录。例如,我们排查非getName api,GET请求且状态码为500、501、503的访问日志记录:
3. 监控报警
我们在日志服务上保存一个查询语句,计算api请求中非200 pv在总体请求pv的占比:
* | select sum(case when statusCode > 200 then 1 else 0 end) *1.0 / count(1) as non_200_ratio
按照报警设置指南将查询语句保存为告警,查询区间为最近10分钟,当非200 statusCode的请求比率超过千分之一时,通过钉钉发出告警:
4. 数据投递
日志服务支持1~365天的数据存储,假如你的日志规模很大,对于冷数据希望有更经济、更长时间的存储,可以通过配置OSS投递规则将数据投递到OSS存储。
怎样开通日志功能
你可以在日志服务、API网关两个产品的控制台上任选其一开通日志功能。
1. 日志服务控制台上开通步骤
a. 创建Logstore
若Logstore已存在请跳过本步骤。
b. 进入向导
若Logstore是第一步新建出来的:
如果Logsotore是之前已存在的:
c. 选择日志源
d. 授权
e. 确认索引配置
在后的dashboard中将使用到这里列出的索引配置,请谨慎修改。
f. 保存
投递与ETL配置可暂不设置,在将来需要时再创建。
至此wizard初始化工作完成,你可以选择刚才设置的Logstore:api-gateway-access-log进行日志查询、分析,或者进入仪表盘查看报表。
2. API网关控制台上开通步骤
在上图步骤之后,你的API网关访问日志可以分发到指定Logstore。如果需要对Logstore做dashboard或查询、分析,请参考“日志服务控制台上开通步骤”中b~f完成初始化工作。