通过 API Gateway 使用 AWS X-Ray 服务地图和跟踪视图

通过 API Gateway 使用 AWS X-Ray 服务地图和跟踪视图

Scroll Down

一、API Gateway

1、API Gateway 是什么?

官方解释:Amazon API Gateway 是一项 AWS 服务,用于创建、发布、维护、监控和保护任意规模的 REST、HTTP 和 WebSocket API。API 开发人员可以创建能够访问 AWS、其他 Web 服务以及存储在 AWS 云中的数据的 API。作为 API Gateway API 开发人员,您可以创建 API 以在您自己的客户端应用程序中使用。或者,您可以将您的 API 提供给第三方应用程序开发人员

简单解释:API Gateway 可以作为一系列API的集合,无服务架构的向外提供API

2、API Gateway简单测试:

① 控制台创建一个实例API( REST API / HTTP API / WebSocket API 各有其优缺点,其区别不是本篇重点,不过多讨论 )

image20201209153438591.png

image20201209153643452.png

② 部署该API资源

image20201209153733633.png

image20201209153806079.png

③ 访问此URL以访问此GET方法:

image20201209154006057.png

二、X-ray

1、X-ray是什么?

官方解释:AWS X-Ray 是一项服务,收集用户应用程序所服务的请求的相关数据,并提供用于查看、筛选和获取数据洞察力的工具,以确定问题和发现优化的机会。对于任何被跟踪的对应用程序的请求,用户不仅可以查看请求和响应的详细信息,还可以查看应用程序对下游 AWS 资源、微服务、数据库和 HTTP Web API 进行的调用的详细信息。

简单解释:X-Ray可以追踪特定资源、服务的相关数据,例延迟和状态码等信息,以便更容易细化故障的原因和出处。X-Ray Trace 显示的是在aws 中的延迟和状态码等信息

2、API Gateway开启X-Ray追踪:

① 在已部署的阶段中,找到日志/跟踪,开启X-Ray跟踪:

image20201209154839733.png

② 测试访问该阶段的不同GET方法,查看X-Ray控制台:

image20201209155252000.png

③ 点击某一个具体的Trace ID可以查看具体的追踪详情:

image20201209155350873.png

三、详细测试

因为生产环境中关于API Gateway 都是较为复杂的,所以我们来进行一下生产环境的模仿测试

1、第一种架构

客户端-》访问API Gateway URL-》 代理到 自定义域名 -》域名CNAME转到 ALB -》ALB 转发到具体的EC2服务器

image20201209160917818.png

① 添加域名Cname解析到ALB

image20201209161520029.png

② 将API Gateway导向该自定义域名,部署该资源并开启X-Ray追踪

image20201209161735481.png

image20201209161921018.png

③ ALB 和 EC2 服务的准备这里就不贴出来

④ 访问测试,web访问API Gateway跳转到自定义域名,找到后端的EC2服务

⑤ X-Ray界面查看,发现有两个Trace ID,一个是API Gateway的追踪,一个是自定义域名的追踪。

image20201209170312842.png

在我们的这种架构中,显示了两段的Trace,分别是API Gateway的和自定义域名的。每段的"延迟" 是通过请求的开始和结束时间计算的. 比如 apigateway这段, 当客户端请求包到 apigateway , 开始计时, 一直到 apigateway 把结果发回给客户端结束。

那么API Gateway这段显示的延迟其实是本次请求总的时间,即客户端向API Gateway发起请求到结束本次请求。

域名这块, 可以理解为 api gateway 在处理请求过程中, 将请求转发给域名从域名处获取到结果 的时间

那如果想要得到具体的EC2->ALB这一段之间的延迟应该怎么办呢?

答:因为ALB本身是不能开启X-Ray追踪的,所以可以在EC2上开启X-Ray追踪,即装一个X-Ray守护进程,但是EC2上的应用必须主动向X-Ray守护进程发送数据,X-Ray才能获取到具体的数据。从xray 的角度, 它是接收特定的请求数据才能进行记录的, 所以一般的应用都没法直接监控, 如果您后端用的是自己的程序框架 ,比如 go / python / java 等, 都可以通过 sdk 来向 xray daemon 发送记录数据。这需要具体的应用(Python、Java等)通过调用SDK去实现,与Web中间件没有关系。

在 Amazon EC2 上运行 X-Ray 守护程序 - AWS X-Ray

xray 也是可以收集 eks 中运行的 pod 的数据的, 但是也是需要 pod 中的应用主动向 xray daemon 发数据

EKS Tracing with X-Ray

2、第二种架构

客户端访问自定义域名-》自定义域名-》CNAME到API Gateway-》VpcLink连接API Gateway和私有ALB-》请求转到ALB上-》后端服务器

这种架构下,开启了X-Ray追踪依然看不到EC2与ALB之间具体的延迟与状态码等信息,依然需要如上说的,需要在EC2上安装X-Ray守护进程,并主动向它发送数据

三、QA

通过X-ray检测到的延迟和状态码这些数据,我能否根据某一段的延迟、状态码去做一个报警邮件提醒?

xray 本身没法直接配 alarm. 这个需要通过 lambda 之类的方式实现, 可以通过 xray 的api 来获取到 trace 的信息, 然后通过分析这些信息来触发 cloudwatch

https://aws.amazon.com/blogs/devops/using-amazon-cloudwatch-and-amazon-sns-to-notify-when-aws-x-ray-detects-elevated-levels-of-latency-errors-and-faults-in-your-application/