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

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

使用适用于 Java 的 X-Ray 开发工具包生成自定义子分段

子段延伸追踪的segment详细说明为了满足请求而完成的工作。当您使用所分析客户端进行调用时,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 加载游戏会话,并使用Amazon SDK for Java的 DynamoDB 映射器来保存游戏。在子分段中包装此代码 DynamoDB 调用Save Game子分段。

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

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

例 子分段 Lambda 函数

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

当您在分段或者其他子分段中创建子分段时,适 SDK for Java 的 X-Ray 开发工具包会为其生成 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(); }