在windows中的powershell中运行以下脚本即可,可执行文件解压在C:\Program Files\Amazon\XRay
路径,xray daemon默认监听2000端口,可以使用配置文件指定
if ( Get-Service "AWSXRayDaemon" -ErrorAction SilentlyContinue ) {sc.exe stop AWSXRayDaemonsc.exe delete AWSXRayDaemon
}$targetLocation = "C:\Program Files\Amazon\XRay"
if ((Test-Path $targetLocation) -eq 0) {mkdir $targetLocation
}$zipFileName = "aws-xray-daemon-windows-service-3.x.zip"
$zipPath = "$targetLocation\$zipFileName"
$destPath = "$targetLocation\aws-xray-daemon"
if ((Test-Path $destPath) -eq 1) {Remove-Item -Recurse -Force $destPath
}$daemonPath = "$destPath\xray.exe"
$daemonLogPath = "$targetLocation\xray-daemon.log"
$url = "https://s3.dualstack.us-west-2.amazonaws.com/aws-xray-assets.us-west-2/xray-daemon/aws-xray-daemon-windows-service-3.x.zip"Invoke-WebRequest -Uri $url -OutFile $zipPath
Add-Type -Assembly "System.IO.Compression.Filesystem"
[io.compression.zipfile]::ExtractToDirectory($zipPath, $destPath)New-Service -Name "AWSXRayDaemon" -StartupType Automatic -BinaryPathName "`"$daemonPath`" -f `"$daemonLogPath`""
sc.exe start AWSXRayDaemon
默认的配置文件如下,具体的字段解释可参考官方文档
https://docs.aws.amazon.com/zh_cn/xray/latest/devguide/xray-daemon-configuration.html
# Maximum buffer size in MB (minimum 3). Choose 0 to use 1% of host memory.
TotalBufferSizeMB: 0
# Maximum number of concurrent calls to AWS X-Ray to upload segment documents.
Concurrency: 8
Region: "cn-north-1"
# Change the X-Ray service endpoint to which the daemon sends segment documents.
Endpoint: ""
Socket:UDPAddress: "127.0.0.1:2000"TCPAddress: "127.0.0.1:2000"
Logging:LogRotation: trueLogLevel: "debug"LogPath: ""
LocalMode: false
ResourceARN: ""
RoleARN: ""
NoVerifySSL: false
ProxyAddress: ""
Version: 2
启动之后查看日志C:\Program Files\Amazon\XRay\xray-daemon.log
有如下信息
2023-xxxxxxxxx [Info] Initializing AWS X-Ray daemon 3.3.6
2023-xxxxxxxxx [Info] Using buffer memory limit of 154 MB
2023-xxxxxxxxx [Info] 2345 segment buffers allocated
2023-xxxxxxxxx [Info] Using region: cn-north-1
2023-xxxxxxxxx [Info] HTTP Proxy server using X-Ray Endpoint : https://xray.cn-north-1.amazonaws.com.cn
2023-xxxxxxxxx [Info] Starting proxy http server on 127.0.0.1:2000
下载java代理的最新发行版
修改jvm参数
-javaagent:C:\xray-agent\disco\disco-java-agent.jar=pluginPath=C:\xray-agent\disco\disco-plugins
在windows上安装tomcat,启动之后默认监听8080端口
tomcat实现了jsp/servlet规范,是一个轻量级服务器,开源免费
目录结构如下,在bin目录中启停服务器
常见问题
idea集成tomca
tomcat应用的结构如下
myapp--------------应用名称index.htmlcss/index.cssjs/index.jsWEB-INF--------如果有web.xml或者.class文件时,该目录必须存在,且严格区分大小写。该目录下的资源客户端无法直接访问classes----------------web应用的class文件(加载顺序:class,lib目录中的jar包,tomcat的lib目录中的jar包。优先级依次降低)lib--------------------web应用所需的jar包(tomcat的lib目录下jar为所有应用共享)web.xml----------------web应用的主配置文件
创建javaee项目,2022版本的idea不能直接创建javaee项目,搜索add framework支持,选择web application即可。按照以下文章配置
https://blog.csdn.net/m0_64351669/article/details/127309413
之后直接在idea中启动tomcat,查看index.jsp是否显示
我们使用servlet 3.0,通过注解配置servlet类
@WebServlet("/student")
public class StudentServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {System.out.println("test list bucket");final AmazonS3 s3 = AmazonS3ClientBuilder.standard().withRegion(Regions.CN_NORTH_1)// 对单个client进行追踪.withRequestHandlers(new TracingHandler(AWSXRay.getGlobalRecorder())).build();List buckets = s3.listBuckets();System.out.println("Your {S3} buckets are:");for (Bucket b : buckets) {System.out.println("* " + b.getName());}String str = "example string for test";ServletOutputStream sos = resp.getOutputStream();resp.setContentType("text/html;charset=UTF-8");sos.write(str.getBytes("UTF-8"));}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {doGet(req, resp);}
}
手动配置下过滤器,跟踪传入请求
https://docs.aws.amazon.com/zh_cn/xray/latest/devguide/xray-sdk-java-filters.html
AWSXRayServletFilter com.amazonaws.xray.javax.servlet.AWSXRayServletFilter fixedName MyApp AWSXRayServletFilter *
有一个github仓库提供了简单的示例demo
https://github.com/anthunt/spring-boot-aws-xray-sample
application的配置和示例片段如下,controller开启了xray追踪注解
@RestController
@XRayEnabled
@RequestMapping("/api")
public class TestController {@Autowiredprivate TestService testService;@RequestMapping("index")public String index() {testService.test("test_bucket");return "HERE";}
}
查看application配置文件,xray
...
logging:file: ./log/appLog/${spring.application.name}.logpattern:file: "%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %X{AWS-XRAY-TRACE-ID} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"console: "%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %X{AWS-XRAY-TRACE-ID} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"level:com.amazonaws.xray: DEBUGcom.anthunt.aws.spring.boot.xray: DEBUGorg.springframework.cloud.openfeign: ERRORfeign.Logger: ERRORorg.apache.http: ERROR
编写发送分段的逻辑
public class Main {public static void main(String[] args) {System.out.println("Hello world!");AWSXRayRecorder xrayRecorder = AWSXRayRecorderBuilder.defaultRecorder();xrayRecorder.beginSegment("testsegment");Subsegment subsegment = xrayRecorder.beginSubsegment("providedMovie");try {final AmazonS3 s3 = AmazonS3ClientBuilder.standard()// 对单个client开启追踪.withRequestHandlers(new TracingHandler(AWSXRay.getGlobalRecorder())).withRegion(Regions.CN_NORTH_1).build();List buckets = s3.listBuckets();System.out.println("Your {S3} buckets are:");for (Bucket b : buckets) {System.out.println("* " + b.getName());}} catch (RuntimeException e) {subsegment.addException(e);subsegment.setError(true);} finally {xrayRecorder.endSubsegment();}xrayRecorder.endSegment();}
}
对于aws sdk相关的追踪,需要额外进行配置
https://docs.amazonaws.cn/zh_cn/xray/latest/devguide/xray-sdk-java-awssdkclients.html
当在依赖中导入aws-sdk和
aws-sdk-instrumentor,会对当前项目中使用的所有aws客户端启动追踪。如果需要最单独的aws client进行追踪,需要去除aws-sdk-instrumentor子模块的依赖,然后配置具体的客户端。例如如下dynamodb客户端
private AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().withRegion(Regions.fromName(System.getenv("AWS_REGION"))).withRequestHandlers(new TracingHandler(AWSXRay.getGlobalRecorder())).build();
此外还可以手动发送请求的时候创建追踪
https://docs.amazonaws.cn/zh_cn/xray/latest/devguide/xray-sdk-java-httpclients.html