目录
在aws子模块中添加xray,servlet,spring相关的依赖
实现继承自AbstractXRayInterceptor的Aspect
什么是 AWS X-Ray
AWS X-Ray 是一项服务,收集您应用程序所服务的请求的相关数据,并提供用于查看、筛选和获取数据洞察力的工具,以确定问题和发现优化的机会。对于任何被跟踪的对您应用程序的请求,您不仅可以查看请求和响应的详细信息,还可以查看您的应用程序对下游 AWS 资源、微服务、数据库和 HTTP Web API 进行的调用的详细信息。
X-Ray 开发工具包提供:
-
拦截器,可添加到您的代码中以跟踪传入 HTTP 请求
-
客户端处理程序,可分析您的应用程序用来调用其他 AWS 服务的 AWS 开发工具包客户端
-
HTTP 客户端,用于分析对其他内部和外部 HTTP Web 服务的调用
该开发工具包还支持分析对 SQL 数据库的调用、自动 AWS 开发工具包客户端分析以及其他功能。
借助 X-Ray SDK for Java,通过进行两项配置更改,您可以跟踪自己应用程序的所有主要和下游 AWS 资源:
-
在
WebConfig
类或web.xml
文件中,向 servlet 配置中添加X-Ray SDK for Java的跟踪筛选器。 -
将 X-Ray SDK for Java 子模块作为 Maven 或 Gradle 生成配置中的生成依赖项
AWS X-Ray 守护程序
AWS X-Ray 守护程序是一个软件应用程序,它侦听 UDP 端口 2000 上的流量,收集原始分段数据,并将其中继到 AWS X-Ray API。守护程序与 AWS X-Ray 开发工具包结合使用,并且必须正在运行,这样开发工具包发送的数据才能到达 X-Ray 服务。
在 AWS Lambda 和 AWS Elastic Beanstalk 上,使用这些服务与 X-Ray 的集成来运行该守护程序。每次对采样请求调用函数时,Lambda 都会自动运行该守护程序。在 Elastic Beanstalk 上,使用 XRayEnabled 配置选项在您环境中的实例上运行该守护程序。
要在本地、内部部署或其他 AWS 服务上运行 X-Ray 守护程序,请从 Amazon S3 下载它,运行它,然后赋予其权限以将分段文档上传到 X-Ray。
Linux下载守护程序
在 Linux 上运行 X-Ray 守护程序
在本地运行时,守护程序可以从 AWS 开发工具包凭证文件 (您的用户目录中的 .aws/credentials
) 或从环境变量读取凭证。
守护程序在端口 2000 上侦听 UDP 数据。您可以使用配置文件和命令行选项更改端口和其他选项。
您可以从命令行运行守护程序可执行文件。使用 -o
选项以本地模式运行,-n
选项设置区域。
~/xray-daemon$ ./xray -o -n ap-southeast-1
要在后台运行守护程序,请使用 &
。
~/xray-daemon$ ./xray -o -n ap-southeast-1 &
有如下回显表示开启成功
2020-05-16T16:00:53+08:00 [Info] Initializing AWS X-Ray daemon 3.2.0
2020-05-16T16:00:53+08:00 [Info] Using buffer memory limit of 79 MB
2020-05-16T16:00:53+08:00 [Info] 1264 segment buffers allocated
2020-05-16T16:00:53+08:00 [Info] Using region: ap-southeast-1
2020-05-16T16:00:53+08:00 [Info] HTTP Proxy server using X-Ray Endpoint : https://xray.ap-southeast-1.amazonaws.com
2020-05-16T16:00:53+08:00 [Info] Starting proxy http server on 127.0.0.1:2000
使用 pkill
终止在后台运行的守护程序进程。
~$ pkill xray
Java 的 AWS X-Ray 开发工具包
X-Ray SDK for Java是面向 Java Web 应用程序的一组库,提供用于生成跟踪数据并将其发送到 X-Ray 守护程序的类和方法。跟踪数据包括由应用程序提供服务的传入 HTTP 请求的相关信息,以及应用程序使用 AWS 开发工具包、HTTP 客户端或 SQL 数据库连接器对下游服务进行的调用。您还可以手动创建分段并在注释和元数据中添加调试信息。
首先通过添加AWSXRayServletFilter 作为 servlet 筛选器来跟踪传入请求。Servlet 筛选器创建一个分段。当分段打开时,您可以使用开发工具包客户端的方法将信息添加到分段,并创建子分段以跟踪下游调用。开发工具包还会自动记录在分段打开时应用程序引发的异常。
从版本 1.3 开始,您可以使用 Spring 中面向方面的编程 (AOP) 来分析应用程序。这意味着,您可以在应用程序运行于 AWS 上时分析应用程序,而无需向应用程序的运行时添加任何代码。
创建一个aws子模块
创建子模块
该子模块主要用于提供各种aws的服务,与xray相关的所有代码都会放在该模块中。
选中social-network-serverless project,然后Intellij -> File -> New Project,在弹出的对话框中选择Maven, 使用默认配置,然后Next进入下一步配置。
- 配置项目的名称,位置和artifact信息(可以根据自己需要进行配置),点击Finish完成模块创建。
- Parent:social-network-serverless
- Name:social-network-serverless-aws
- Grouop: com.jessica
- Artifact:social-network-serverless-aws
在父模块中对子模块以及xray相关的包进行版本管理
修改父模块的pom文件,在dependencyManagement中加入social-network-serverless-aws
<dependency>
<groupId>com.jessica</groupId>
<artifactId>social-network-serverless-aws</artifactId>
<version>${project.version}</version>
</dependency>
添加xray包的版本管理
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-xray-recorder-sdk-bom</artifactId>
<version>2.4.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
添加servlet-api的版本管理:需要注意的是这里必须使用3.1.0以上的版本,不然的话启动时会出现如下错误: java.lang.NoSuchMethodError: javax.servlet.ServletContext.getVirtualServerName()Ljava/lang/String。
错误原因是spring boot 2.2.7.RELEASE版本的项目依赖了tomcat-embed-core-9.0.34.jar已经有ServletContext了,并且Servl