近年来,以 Serverless 架构为代表的云原生应用架构,得到了越来越多的关注和实践。Serverless 架构的一大特点就是无服务器化,它让我们无需再关注服务器的管理和配置,只需专注于业务逻辑的实现,从而提升开发效率,降低维护成本。然而,随着应用业务的增长,API 请求量的飙升,如何对 API 请求进行实时的监控和统计,成为了一个需要解决的问题。本文将介绍 Serverless 如何统计 API 请求日志,并提供相应的示例代码。
一、Serverless 应用架构
首先,我们来简单地了解一下 Serverless 应用架构。Serverless 应用架构通常由多个服务组成,包括 API Gateway、Lambda、DynamoDB、S3 等 AWS 托管服务,以及实现业务逻辑的自定义代码。其中,API Gateway 作为入口,接收客户端请求,触发 Lambda 函数执行,该函数通常处理请求的业务逻辑,将数据存储到 DynamoDB 或 S3 等数据库中。整个过程中,开发者无需关注服务器的管理和配置,只需要关注业务逻辑即可。下面是一个简单的 Serverless 应用架构图:
二、API 请求日志的统计方案
Serverless 应用架构相比传统应用架构具有很强的弹性和灵活性,使得我们可以非常容易地实现 API 请求日志的统计,常见的方案包括以下几种:
1. 在 Lambda 函数内部打印日志并发送至 CloudWatch
AWS 提供了 CloudWatch 日志服务,可以帮助我们收集、监控和分析日志数据。在 Lambda 函数中,我们可以使用 console.log() 方法或 log4js 等日志框架,打印输出日志;同时,使用 AWS SDK for JavaScript,将日志实时发送至 CloudWatch 日志流中,CloudWatch 会自动分析和汇总日志数据,并提供监控和分析的功能。
代码示例:
// javascriptcn.com 代码示例 // Lambda 函数代码 console.log("Hello, World!"); // AWS SDK for JavaScript const AWS = require('aws-sdk'); const cloudwatchlogs = new AWS.CloudWatchLogs(); const putLogEvents = async () => { const params = { logGroupName: 'api-requests', logStreamName: '2019-11-25', logEvents: [{ message: 'Hello, World!' }] }; await cloudwatchlogs.putLogEvents(params).promise(); }; putLogEvents();
2. 在 API Gateway 中启用访问日志并发送至 CloudWatch
API Gateway 提供了访问日志功能,可以帮助我们记录请求和响应的详细信息,如请求时间、请求 URL、请求头、请求体、响应码等;同时,API Gateway 还可以将访问日志发送至 CloudWatch 日志流中,我们可以通过 CloudWatch 实现日志的汇总和监控。
代码示例:
// javascriptcn.com 代码示例 # serverless.yml provider: name: aws runtime: nodejs10.x iamRoleStatements: - Effect: "Allow" Action: - "logs:CreateLogGroup" - "logs:CreateLogStream" - "logs:PutLogEvents" Resource: "*" logs: restApi: true # 启用 API Gateway 的访问日志 httpApi: true # 启用 API Gateway v2 的访问日志 resources: Resources: ApiGatewayAccount: Type: AWS::ApiGateway::Account Properties: CloudWatchRoleArn: !Sub arn:aws:iam::${AWS::AccountId}:role/api-gateway-cloudwatch-role # 指定与 API Gateway 关联的 CloudWatch 角色 ApiGatewayLogGroup: Type: AWS::Logs::LogGroup Properties: LogGroupName: /aws/apigateway/${self:service}-${self:provider.stage} ApiGatewayCloudWatchRole: Type: AWS::IAM::Role Properties: RoleName: !Sub api-gateway-cloudwatch-role-${self:custom.timestamp} AssumeRolePolicyDocument: Version: "2012-10-17" Statement: - Effect: "Allow" Principal: Service: "apigateway.amazonaws.com" Action: "sts:AssumeRole" ... # 省略其他配置
3. 集成第三方日志服务,如 ELK
ELK 是 Elastic 公司推出的日志管理解决方案,包括 Elasticsearch、Logstash 和 Kibana 三个核心组件。Elasticsearch 提供快速的搜索和分析功能,Logstash 负责收集、处理和发送日志,Kibana 可以生成可视化的仪表盘和报告。我们可以在 Serverless 应用中使用 Logstash,从 API Gateway 或 Lambda 函数中收集日志,将日志发送至 Elasticsearch,再通过 Kibana 生成可视化报表。这种方案适合于需要深度分析和统计日志数据的场景。
三、总结和建议
本文介绍了 Serverless 如何统计 API 请求日志的几种方案,并提供了相应的示例代码。在实际应用中,我们可以根据实际需求,选择合适的方案来实现 API 请求日志的监控和统计。
基于上述方案,我们可以实现 API 请求日志的实时监控和统计,并将日志数据可视化展示,从而帮助我们更好地了解用户访问情况及API性能状况,为业务优化提供数据支持。当然这并不是唯一的方案,也可以根据实际业务情况进行定制化的方案。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6527efbf7d4982a6eba8305c