在可观测性系统中,几乎所有的产品都会提供拓扑功能。大部分用户在初看这个拓扑之时都会觉得非常有用,但是一旦真实落地使用,就感觉这个拓扑比较鸡肋。这篇文章重点探讨APO团队是如何考虑让用户能够更好的使用拓扑,真正发挥出拓扑的价值。
应用级别拓扑定义
GPT介绍应用级别拓扑:
应用级别拓扑是一种用于表示应用程序内部及其与其他应用程序或系统之间关系的可视化模型。它描述了应用程序中的各个组件(如服务、数据库、消息队列等)之间的交互方式,包括调用关系、数据流动和依赖关系。应用级别拓扑的目标是帮助开发和运维团队更好地理解和监控应用程序的架构、性能和健康状况。
应用级别拓扑的关键要素:
- 服务或组件:表示应用程序中的各个服务或模块,例如Web服务、数据库服务、缓存服务等。
- 依赖关系:显示应用程序对外部系统或资源的依赖,例如第三方API、外部数据库等。
- 数据流动:描述数据在应用程序中的流动路径,从数据的输入源到输出目标。
- 性能指标:包括延迟、吞吐量、错误率等关键性能指标,帮助监控应用程序的运行状态。
应用级别拓扑有助于在复杂的分布式系统中跟踪请求的执行路径,识别性能问题和瓶颈,并在发生故障时快速定位问题的根源。
提供了应用级别拓扑的产品
常见的开源apm、npm软件都提供了应用级别拓扑
应用级别拓扑鸡肋的原因
应用级别拓扑肯定是有用的,但是实际落地比较鸡肋的原因如下:
- 在小规模环境中比较有用,一旦达到几十个至上百个应用节点,拓扑结构就是一张蜘蛛网要清晰看出某个具体应用服务的依赖关系比较困难。
- 应用级别拓扑结构粒度较粗,难以精准判断依赖关系影响:应用级别拓扑反应的程序与程序之间的依赖关系,并不是接口层,比如一个应用提供了10个接口,其中某一个接口调用了redis,在应用级别拓扑结构就会依赖redis,但是其余的接口其实并不依赖redis,很难回答以下的问题:
- redis有告警了,影响哪些业务操作?根据应用拓扑只能猜测redis告警,可能影响应用,具体是否受影响要在深入人为排查。
- 业务操作入口(用户直接使用的接口)执行缓慢,如何找到到底哪个依赖服务导致的呢?在应用拓扑中,得顺着应用拓扑所有路径去排查每个应用(几乎需要排查所有被监控的应用,因为所有的应用最后都可能形成一个拓扑结构)。现在的优化措施是在应用拓扑结构中优先排查应用告警的应用,这样希望能够尽早找到故障节点,但是有时仍然需要排查不少的应用,才能撞到故障根因节点。
- 业务操作入口(用户直接使用的接口)执行缓慢的另外一种排查思路,就是查看业务操作入口的Trace,这样看Trace缺失了统计信息,应用级别拓扑本应该发挥统计数据价值无用武之地。
业界王者Dynatrace的ServiceFlow解决了应用拓扑鸡肋的问题
以下是Dynatrace 的Service Flow图
初看和应用拓扑差不多,反应的也是应用节点直接的依赖调用关系,但是实际上和应用拓扑有以下的不同。
精准反应应用调用关系:相同的应用节点在拓扑中会按照调用顺序出现多次
ServiceFlow精准的反应应用接口之间的调用关系。相同业务操作入口的拓扑图才会被归属在同一个ServiceFlow中。
基于ServcieFlow 可以精准的找到依赖关系,比如redis告警,到底是如何影响业务调用链的。
基于ServiceFlow可以清晰的看出来业务操作入口的影响是由于下游依赖的哪些应用接口执行导致的。
在大规模业务中,会将对入口业务操作影响贡献不大的应用收缩,从而在一张图中清晰看出调用关系
APO中的接口URL级别拓扑和ServiceFlow异曲同工
PO中的URL接口级别拓扑是根据相同业务操作入口的Trace拓扑不断分析统计而成,虽然看上去像应用级别拓扑,但是实际是URL接口级别拓扑,这样可以清楚看出应用为了执行此类业务的调用关系。
如果redis告警,在此拓扑中未发现有redis,说明redis告警不会影响此业务,不需要像应用级别拓扑再次猜测redis告警到底影响了哪些业务。
APO也实现了同样的效果:精准反应应用调用关系——相同的应用节点在拓扑中会按照调用顺序出现多次
根据业务入口延时相似度对拓扑结构的收缩,保证一张图可以清晰显示业务调用关系
APO利用延时曲线相似度来收缩相似度非常低的接口服务业务操作入口的延时曲线与下游依赖的节点延时曲线完全不相似,说明两者应该不是很相关,可以收缩起来。
相似度较高的曲线,比如下图,紫色的延时曲线明显和绿色延时曲线很相似,还有一些曲线是有波动的,但是还有很多曲线是很平稳的。那些曲线平稳的肯定对此业务操作入口的波动贡献很小,所以可以收缩。
未来基于URL接口级别拓扑能够实现以下功能
在APO的规划当中会实现以下的功能:
- 每个微服务接口点击详情之后,自动关联业务操作入口从而快速判断故障影响面
- 按照URL接口界别拓扑,自动化精准关联下游依赖节点告警
APO介绍:
国内开源首个 OpenTelemetry 结合 eBPF 的向导式可观测性产品
http://apo.kindlingx.com
https://github.com/CloudDetail/apo