跟踪服务之间调用的方法
Ways to trace calls between services
我正在 Java 上开发几个通过 HTTP 相互通信的服务。 Logback 用作日志记录框架。
如果一项服务出现错误,通过服务日志定义错误原因并不困难。但是如果我们有一个下游调用影响了一些服务:
服务 A -> 服务 B -> 服务 C -> 服务 D
并且最后一个服务因错误而失败,我需要一些方法来跟踪对 服务 A 的调用以解决问题。
有现成的解决方案吗?我是否应该向每个下游调用唯一的日志消息添加一些额外的属性?
如果您想跟踪执行流程,您需要在每条消息上添加某种标签。您将需要:
- 请求标识符
- 服务标识符。
流程启动时,您使用请求标识符和服务标识符标记第一个调用。在处理调用并需要对其他服务进行其他调用的每个服务上,您保留请求标识符并将当前服务标识符添加到您收到的请求之一。
基本上,请求标识符可让您识别调用流,而服务标识符可让您查看流中的跃点。
对于您的示例,服务 A -> 服务 B -> 服务 C -> 服务 D,您可能有这样的内容:
- 服务 A 开始呼叫“123-A”;
- 服务 B 收到此消息并需要调用服务 C,因此它使用“123-A”并广告他的标识符:“123-A,B”;
- 服务 C 收到此消息并需要调用服务 D,因此它使用“123-A,B”并广告他的标识符:“123-A,B,C”;
- 如果服务 D 中的请求出现问题,您知道要查看哪些服务日志 (A、B、C) 以及要查找的内容 (123)。
您可以将它们包含在 HTTP 消息中或作为 HTTP headers,我们的想法是在您记录某些内容时以某种方式将它们添加到日志消息中。
当然以上是针对你举的例子的简单情况,所以可以扩展到其他情况。这个想法是将调用视为一种堆栈。在每一跳上,您 "push" 将一些标识放入邮件中。
spring-based服务实际上有一个解决方案:request correlation spring cloud starter。
过滤器将唯一的请求标识符作为 header(如果没有这样的 header)添加到每个请求。可以将 id 放入 MDC
并将其添加到具有服务 id 的日志条目中。
我正在 Java 上开发几个通过 HTTP 相互通信的服务。 Logback 用作日志记录框架。
如果一项服务出现错误,通过服务日志定义错误原因并不困难。但是如果我们有一个下游调用影响了一些服务:
服务 A -> 服务 B -> 服务 C -> 服务 D
并且最后一个服务因错误而失败,我需要一些方法来跟踪对 服务 A 的调用以解决问题。
有现成的解决方案吗?我是否应该向每个下游调用唯一的日志消息添加一些额外的属性?
如果您想跟踪执行流程,您需要在每条消息上添加某种标签。您将需要:
- 请求标识符
- 服务标识符。
流程启动时,您使用请求标识符和服务标识符标记第一个调用。在处理调用并需要对其他服务进行其他调用的每个服务上,您保留请求标识符并将当前服务标识符添加到您收到的请求之一。
基本上,请求标识符可让您识别调用流,而服务标识符可让您查看流中的跃点。
对于您的示例,服务 A -> 服务 B -> 服务 C -> 服务 D,您可能有这样的内容:
- 服务 A 开始呼叫“123-A”;
- 服务 B 收到此消息并需要调用服务 C,因此它使用“123-A”并广告他的标识符:“123-A,B”;
- 服务 C 收到此消息并需要调用服务 D,因此它使用“123-A,B”并广告他的标识符:“123-A,B,C”;
- 如果服务 D 中的请求出现问题,您知道要查看哪些服务日志 (A、B、C) 以及要查找的内容 (123)。
您可以将它们包含在 HTTP 消息中或作为 HTTP headers,我们的想法是在您记录某些内容时以某种方式将它们添加到日志消息中。
当然以上是针对你举的例子的简单情况,所以可以扩展到其他情况。这个想法是将调用视为一种堆栈。在每一跳上,您 "push" 将一些标识放入邮件中。
spring-based服务实际上有一个解决方案:request correlation spring cloud starter。
过滤器将唯一的请求标识符作为 header(如果没有这样的 header)添加到每个请求。可以将 id 放入 MDC
并将其添加到具有服务 id 的日志条目中。