通过定时SQL提取阿里云API网关访问日志指标
简介: 阿里云API网关服务提供API托管服务,提供了强大的适配和集成能力,可以将各种不同的业务系统API实现统一管理。API网关同时支持将API访问日志一键存储到日志服务,通过日志服务强大的查询分析能力,用户可以针对访问日志自定义计算多种指标,监测服务运行情况。继而通过定时SQL将结果指标直接存储到时序库,直接查询API网关指标,而且可以通过较低成本长期存储指标数据。 下面我们一步步从头开始,学习如何利用日志服务监测API网关及其代理的服务。
背景
阿里云API网关服务提供API托管服务,提供了强大的适配和集成能力,可以将各种不同的业务系统API实现统一管理。API网关同时支持将API访问日志一键存储到日志服务,通过日志服务强大的查询分析能力,用户可以针对访问日志自定义计算多种指标,监测服务运行情况。继而通过定时SQL将结果指标直接存储到时序库,直接查询API网关指标,而且可以通过较低成本长期存储指标数据。 下面我们一步步从头开始,学习如何利用日志服务监测API网关及其代理的服务。
数据采集
数据采集一直是让开发运维比较头疼的事情,要学习各种不同的采集工具,适配形形色色的环境,解析各式各样的数据格式,在不断试错的情况下,才能够完成第一次的数据采集。而在此之后,还需要不断地完善优化,耗费大量的经历。下面简单介绍下数据采集以及采集到的日志格式,详情可以参考官方文档。
一键采集
阿里云API网关已经很好的集成了日志服务,用户只需要在API网关的日志管理界面关联日志服务,即可完成API访问日志的一键采集,极其方便。
- 在API网关的日志管理界面点击创建日志配置;
- 在弹出窗中选择日志服务的Project/Logstore;
- 点击确认,完成数据采集;

日志格式
下面是采集到的API访问日志示例,
{
"exception": " ",
"apiName": "getbill",
"apiStageName": "stage3",
"__tag__:__receive_time__": "1667222540",
"httpMethod": "POST",
"path": "/request/path-1/file-6",
"__pack_meta__": "1|MTY2NzIwNzcxMTIyMzU0Mzc1Ng==|1094|1093",
"requestHandleTime": "31/Oct/2022:13:02:49",
"requestId": "d6b86756-83c2-e5a8-63f6-da39045f6595",
"appId": "9fb195bd-3d39-be83-ca8c-44a6e85262eb",
"__time__": 1667221369,
"__topic__": "apigateway_log",
"apiStageUid": "e5c13606-f96e-5653-26b1-750d766dd3ae",
"appName": "app3",
"__source__": "127.0.0.1",
"apiGroupUid": "3a51584d-20de-2da1-3095-7f82aa7022dc",
"errorMessage": " ",
"responseSize": "472",
"serviceLatency": "967",
"providerAliUid": "9e21f8dc-54bd-7ad0-5fb4-a898614bc41c",
"apiGroupName": "group4",
"apiUid": "316af01f-8f8f-e2f9-17d7-ac0ea3b28518",
"domain": "www.qt.mock.com",
"clientIp": "123.161.24.126",
"__tag__:__receive_time___0": "1667222540",
"region": "cn-chengdu",
"requestSize": "945",
"statusCode": "200"
}
关于各字段的含义,可以查看下表,也可以参考官方文档。访问日志的字段也会随着API网关能力的增强进行补充,不需要用户手动增删,极大的减轻了维护负担。
|
日志项 |
描述 |
|
apiGroupUid |
API的分组ID |
|
apiGroupName |
API分组名称 |
|
apiUid |
API的ID |
|
apiName |
API名称 |
|
apiStageUid |
API环境ID |
|
apiStageName |
API环境名称 |
|
httpMethod |
调用的HTTP方法 |
|
path |
请求的PATH |
|
domain |
调用的域名 |
|
statusCode |
HttpStatusCode |
|
errorMessage |
错误信息 |
|
appId |
调用者应用ID |
|
appName |
调用者应用名称 |
|
clientIp |
调用者客户端IP |
|
exception |
后端返回的具体错信息 |
|
providerAliUid |
API提供者帐户ID |
|
region |
区域,如:cn-hangzhou |
|
requestHandleTime |
请求时间,UTC |
|
requestId |
请求ID,全局唯一 |
|
requestSize |
请求大小,单位:字节 |
|
responseSize |
返回数据大小,单位:字节 |
|
serviceLatency |
访问后端资源耗时总和,包括申请连接资源耗时,建立连接耗时,调用后端服务耗时,单位:毫秒 |
|
errorCode |
错误码code,如:X500ER |
|
requestProtocol |
客户端请求协议:HTTP/HTTPS/WS |
|
instanceId |
API服务所在的网关实例ID |
|
initialRequestId |
API网关自调用时,例如API-1调用API-2 ,那么API-2的日志中会用initialRequestId来记录API-1的requestid。 |
|
clientNonce |
客户端X-Ca-Nonce头 |
|
requestQueryString |
客户端请求的queryString |
|
requestHeaders |
客户端请求的header内容 |
|
requestBody |
客户端请求的body内容,最多1024个字节 |
|
responseHeaders |
API响应的header内容 |
|
responseBody |
API响应的response内容,最多1024个 |
|
consumerAppKey |
API请求的appKey |
|
totalLatency |
API请求的总延迟,单位毫秒 |
|
customTraceId |
全链路日志的traceId |
|
jwtClaims |
从JWT中解析出来的Claim,可以在分组上配置 |
|
plugin |
API请求命中的插件列表及相关上下文 |
查询分析
有了日志,就可以针对访问日志进行简单的查询分析,查看自己感兴趣的指标。日志服务即支持简单的查询,也支持复杂的聚合分析,下面进行简单的介绍。
简单过滤
最常见的情况是查看错误请求,可以通过查询语句: * not statusCode: 200来查看所有的异常请求。

当然还可以通过更多的字段进行过滤,详情可以参考官方文档。
聚合分析
对于更复杂的分析,例如不同错误码的的错误数量,不同api的平均响应时间,就需要用到聚合分析。下面以平均响应时间为例,介绍下如何使用聚合分析。
在查询框中输入过滤以及分析语句:
* and statusCode: 200 | select avg(serviceLatency) as rt, (__time__ - __time__ % 300) as ts from log group by ts order by ts limit 10000
其中* and statusCode: 200 用来过滤出正常请求,其余的sql语句则用来计算过滤后的数据,并通过图表展示出来,如下图所示。可以清楚地看到平均请求延迟的变化曲线。

确认指标
了解了如何进行基本的查询分析,我们能做的事情就非常多了。可以根据自己的需求以及业务场景,自定义多种不同的业务指标,满足自己的日常运维、监测需求。下面列出一些常用的指标,以及对应指标的查询分析语句。
请求延迟
在查询分析中,本文已经介绍过简单的平均延迟计算方法,下面介绍下更完整的请求延迟指标:平均延迟、P99延迟、P95延迟、P90延迟、P50延迟、最大延迟以及最小延迟。
*| select approx_percentile(serviceLatency, 0.99) as p99_latency, approx_percentile(serviceLatency, 0.95) as p95_latency, approx_percentile(serviceLatency, 0.90) as p90_latency, approx_percentile(serviceLatency, 0.50) as p50_latency, min(serviceLatency) as min_latency, min(serviceLatency) as max_latency, avg(serviceLatency) as avg_latency, (__time__ - __time__ % 60) as ts from log group by ts order by ts limit 1000000

错误码分布
*| select count(1) as cnt, statusCode, (__time__ - __time__ % 60) as ts from log group by statusCode, ts order by ts limit 1000000

请求/响应大小
*| select approx_percentile(requestSize, 0.99) as p99_req_size, approx_percentile(requestSize, 0.95) as p95_req_size, approx_percentile(requestSize, 0.90) as p90_req_size, approx_percentile(requestSize, 0.50) as p50_req_size, min(requestSize) as min_req_size, min(requestSize) as max_req_size, avg(requestSize) as avg_req_size, approx_percentile(responseSize, 0.99) as p99_resp_size, approx_percentile(responseSize, 0.95) as p95_resp_size, approx_percentile(responseSize, 0.90) as p90_resp_size, approx_percentile(responseSize, 0.50) as p50_resp_size, min(responseSize) as min_resp_size, min(responseSize) as max_resp_size, avg(responseSize) as avg_resp_size, (__time__ - __time__ % 60) as ts from log group by ts order by ts limit 1000000

地域分布
* | select region, count(1) as cnt , (__time__ - __time__ % 60) as ts from log group by region, ts order by ts

定时任务
可以看到,日志服务强大的查询分析能力允许用户多网关日志进行多种查询分析,得到期望的结果。如果需要把上一小节计算的定时保存下来,就要用到定时任务。下面介绍如何将上一小节中计算的请求/响应大小指标,定时保存到时序库中,从而可以快速获取指标。
创建时序库
点击左侧边栏的时序存储按钮,在时序库管理界面点击+号,填入名称即可创建一个时序库,用来存储希望保存的时序指标。

保存定时任务
创建好时序库,就可以创建任务定时保存分析结果,以供实时查看。下面简单介绍下定时任务配置步骤,详情可以参考官方文档。
点击创建任务
在查询分析界面点击定时保存分析结果,即可弹出任务创建窗口。

选择存储格式
在弹出窗口中选择日志库导入时序库,确定数据存储格式。

确定存储指标
在sql配置中选择期望保存的指标列,以及指标对应的时间列,即完成了指标配置。

配置任务调度
点击下一步,调度间隔选择15分钟,开始时间选择当前时间, SQL时间窗口同样选择15分钟即完成了调度配置。当然,用户也可以根据自己的场景自行选择。最后点击确认完成任务配置。

查看结果指标
点击刚刚创建的时序存储,在Metrics一行点击刷新,即可查看该时序存储包含的所有指标。选择max_resp_size,点击预览,即可查看该指标,无需编写查询分析语句。

添加报表
有了指标,就可以使用这些指标构建监控大盘,查看整体指标,构建自己的专属监控大盘。在指标查询界面点击添加到仪表盘,在弹出窗中选择新建仪表盘,填入名称点击确认,即完成了仪表盘的创建。

点开仪表盘,即可看到刚刚创建的图标。

结语
API网关是服务的入口,通过网关日志可以计算出丰富的服务监控指标。本文以部分常用指标为例,介绍了从数据接入到定时任务创建的整个流程,供用户参考。可以看出,日志服务提供了及其简便的日志采集入口,丰富的查询分析功能,简便的定时任务,帮助用户简单快速的建立起一个完整的日志采集、指标分析、大盘查看系统,减轻了运维负担。
原文链接:https://click.aliyun.com/m/1000364087/
本文为阿里云原创内容,未经允许不得转载。
通过定时SQL提取阿里云API网关访问日志指标的更多相关文章
- 阿里云API网关(11)外网访问 阿里云API网关内定义的API步骤:
网关指南: https://help.aliyun.com/document_detail/29487.html?spm=5176.doc48835.6.550.23Oqbl 网关控制台: https ...
- 阿里云API网关(9)常见问题
网关指南: https://help.aliyun.com/document_detail/29487.html?spm=5176.doc48835.6.550.23Oqbl 网关控制台: https ...
- 阿里云API网关!
API 网关(API Gateway)提供高性能.高可用的 API 托管服务,帮助用户对外开放其部署在 ECS.容器服务等阿里云产品上的应用,提供完整的 API 发布.管理.维护生命周期管理.用户只需 ...
- 浅析阿里云API网关的产品架构和常见应用场景
自上世纪60年代计算机网络发展开始,API(Application Programming Interface )随之诞生,API即应用程序接口,是实现系统间衔接的桥梁.时至今日,API市场已经形成了 ...
- 阿里云API网关(13)请求身份识别:客户端请求签名和服务网关请求签名
网关指南: https://help.aliyun.com/document_detail/29487.html?spm=5176.doc48835.6.550.23Oqbl 网关控制台: https ...
- 阿里云API网关(12)为员工创建子账号,实现分权管理API:使用RAM管理API
网关指南: https://help.aliyun.com/document_detail/29487.html?spm=5176.doc48835.6.550.23Oqbl 网关控制台: https ...
- 阿里云API网关(11)API的三种安全认证方式
网关指南: https://help.aliyun.com/document_detail/29487.html?spm=5176.doc48835.6.550.23Oqbl 网关控制台: https ...
- 阿里云API网关(8)开发指南-SDK下载
网关指南: https://help.aliyun.com/document_detail/29487.html?spm=5176.doc48835.6.550.23Oqbl 网关控制台: https ...
- 阿里云API网关(7)开发指南-API参考
网关指南: https://help.aliyun.com/document_detail/29487.html?spm=5176.doc48835.6.550.23Oqbl 网关控制台: https ...
- 阿里云API网关(6)用户指南(开放 API )
网关指南: https://help.aliyun.com/document_detail/29487.html?spm=5176.doc48835.6.550.23Oqbl 网关控制台: https ...
随机推荐
- python getOpenFileNames 获取文件实例解析
一 概念 选取文件夹 QFileDialog.getExistingDirectory() 选择文件 QFileDialog.getOpenFileName() 选择多个文件 QFileDialog. ...
- day03-功能实现03
功能实现03 9.功能08-分页显示 9.1需求分析 将查询的数据进行分页显示,要求功能如下: 显示共多少条记录 可以设置每页显示几条 点击第几页,显示对应的数据 9.2思路分析 后端使用MyBati ...
- 怎样给U盘加密
给U盘加密其实很简单,下载一个叫U盘超级加密3000的U盘加密软件就可以了. 这款U盘加密的软件最大的特点是不用安装,只要一个exe文件.你把它放到你需要加密的U盘里,就可以加密U盘里的数据了.并且到 ...
- 修复华硕笔记本fn+f2在ubuntu下wifi不能够正常使用和WiFi Disabled (Hard-blocked) (译文)
PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明 本文发布于 2014-12-22 11:49:16 ...
- InfluxDB、Grafana、node_exporter、Prometheus搭建压测平台
InfluxDB.Grafana.node_exporter.Prometheus搭建压测平台 我们的压测平台的架构图如下: 配置docker环境 1)yum 包更新到最新 sudo yum upda ...
- 记录--你敢信?比 setTimeout 还快 80 倍的定时器
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 起因 很多人都知道,setTimeout是有最小延迟时间的,根据MDN 文档 setTimeout:实际延时比设定值更久的原因:最小延迟时 ...
- C# 单例模式使用 Singleton
Singleton 类如下: public class Singleton<T> where T : class, new() { private static T _instance; ...
- 取cookie时报错“[object Object]“ is not valid JSON
做谷粒学苑项目时,在保存登录状态环节出现该问题 取cookie时老师强调要使用JSON.pase()解析cookie为json对象 var userStr = cookie.get("gul ...
- KingbaseES V8R6集群运维案例之---sys_hba.conf限制客户端访问数据库
KingbaseES V8R6集群运维案例之---sys_hba.conf限制客户端访问数据库 案例说明: 客户端认证是由一个配置文件(通常名为sys_hba.conf并被存放在数据库集簇目录中)控制 ...
- KingbaseES 等待事件之LWLock lock_manager
背景 相信我们不止一次遇到过一个等待事件:LWLock lock_manager.下面我们聊聊这个等待事件的含义,产生原因,以及解决方法. 等待事件含义 当数据库维护共享锁的内存区域以在无法实现以fa ...