Istio最佳实践系列:如何实现方法级调用跟踪? (4)

然后在需要进行调用跟踪的方法上加上Traced注解:

@Component public class DBAccess { @Traced public void save2db() { try { Thread.sleep((long) (Math.random() * 100)); } catch (InterruptedException e) { e.printStackTrace(); } } } @Component public class BankTransaction { @Traced public void transfer() { try { Thread.sleep((long) (Math.random() * 100)); } catch (InterruptedException e) { e.printStackTrace(); } } }

demo程序的master branch已经加入了方法级代码跟踪,可以直接部署。

git checkout master kubectl apply -f k8s/eshop.yaml

效果如下图所示,可以看到trace中增加了transfer和save2db两个方法级的Span。

Istio最佳实践系列:如何实现方法级调用跟踪?


可以打开一个方法的Span,查看详细信息,包括Java类名和调用的方法名等,在AOP代码中还可以根据需要添加出现异常时的异常堆栈等信息。

Istio最佳实践系列:如何实现方法级调用跟踪?

总结

Istio/Envoy为微服务应用提供了分布式调用跟踪功能,提高了服务调用的可见性。我们可以使用OpenTracing来代替应用硬编码,以传递分布式跟踪的相关http header;还可以通过OpenTracing将方法级的调用信息加入到Istio/Envoy缺省提供的调用链跟踪信息中,以提供更细粒度的调用跟踪信息。

下一步

除了同步调用之外,异步消息也是微服务架构中常见的一种通信方式。在下一篇文章中,我将继续利用eshop demo程序来探讨如何通过OpenTracing将Kafka异步消息也纳入到Istio的分布式调用跟踪中。

参考资料

本文中eshop示例程序的源代码

Opentracing docs

Opentracing specification

Opentracing wire protocols

Zipkin-b3-propagation

OpenTracing Project Deep Dive

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpjgxd.html