使用X-Ray SDK for Java生成自定义子分段 - AWS X-Ray
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用X-Ray SDK for Java生成自定义子分段

子分段会扩展跟踪的分段并提供有关完成任务的详细信息,以便处理请求。每次您通过已分析的客户端进行调用时,X-Ray 开发工具包都将记录在子分段中生成的信息。您可以创建更多子分段以分组其他子分段、测量代码段的性能或记录注释和元数据。

要管理子分段,请使用 beginSubsegmentendSubsegment 方法。

例 GameModel.java - 自定义子分段

import com.amazonaws.xray.AWSXRay; ... public void saveGame(Game game) throws SessionNotFoundException { // wrap in subsegment Subsegment subsegment = AWSXRay.beginSubsegment("Save Game"); try { // check session String sessionId = game.getSession(); if (sessionModel.loadSession(sessionId) == null ) { throw new SessionNotFoundException(sessionId); } mapper.save(game); } catch (Exception e) { subsegment.addException(e); throw e; } finally { AWSXRay.endSubsegment(); } }

在此示例中,子分段中的代码使用会话模型上的方法从 DynamoDB 加载游戏会话,并使用AWS SDK for Java的 DynamoDB 映射器保存游戏。在子分段中包装此代码将调用控制台跟踪视图中 Save Game 子分段的 DynamoDB 子项。

如果子分段中的代码引发了检查异常,请将其包装在 try 数据块中,并在 AWSXRay.endSubsegment() 数据块中调用 finally 以确保始终关闭子分段。如果子分段未结束,则父分段无法完成,不发送到 X-Ray。

对于不会引发检查异常的代码,可以将该代码作为 Lambda 函数传递给 AWSXRay.CreateSubsegment

例 子分段 Lambda 函数

import com.amazonaws.xray.AWSXRay; AWSXRay.createSubsegment("getMovies", (subsegment) -> { // function code });

当您在分段或者其他子分段中创建子分段时,X-Ray SDK for Java将为其生成 ID 并记录开始时间和结束时间。

例 包含元数据的子分段

"subsegments": [{ "id": "6f1605cd8a07cb70", "start_time": 1.480305974194E9, "end_time": 1.4803059742E9, "name": "Custom subsegment for UserModel.saveUser function", "metadata": { "debug": { "test": "Metadata string from UserModel.saveUser" } },

对于异步和多线程编程,您必须手动将子分段传递到 endSubsegment() 方法,以确保其正确关闭,因为 X-Ray 上下文在异步执行期间可能被修改。如果异步子分段在其父分段关闭后关闭,则此方法会自动将整个分段流式传输到 X-Ray 守护程序。

例 异步子分段

@GetMapping("/api") public ResponseEntity<?> api() { CompletableFuture.runAsync(() -> { Subsegment subsegment = AWSXRay.beginSubsegment("Async Work"); try { Thread.sleep(3000); } catch (InterruptedException e) { subsegment.addException(e); throw e; } finally { AWSXRay.endSubsegment(subsegment); } }); return ResponseEntity.ok().build(); }