基于日志服务实现代码级可观测性的最佳实践

任彦宗
  • 收获赞:25
  • 擅长领域:阿里云日志服务产品解决方案架构师,高级灭火专员,一直在线。擅长领域:ITOM、日志服务、APM、AIOPS

传统IT中问题排查多依赖研发、运维同学的经验,通过监控类工具可以定位具体设备或应用的异常堆栈信息,后续问题解决效率和自身能力呈正相关。对于问题影响范围及业务对应的受损人群几乎是信息断层,业务和IT耦合度低。日志服务通过拉通Log、Trace、Code三类数据源,实现业务和云原生代码级可观测性的统一,本文介绍该能力的最佳实践,不区分行业。

IT 环境现在已经变得指数级复杂——更多的环境、更多的连接设备、更多的数据和更多的发布更新,在这一系列变量中,任意点出现的问题都可能导致外部服务失败或延迟升高,最终影响用户体验。因此,用于监控现代应用程序和管理预测故障的遗留方法并不是最佳的工作方式。可观测性倾向于简化复杂性,为了有效地提升IT和业务的能力,系统的行为必须是可观测到的。以Grafana工具的文章为例,IT运维中,典型问题的排查方式如下:

  1. 最开始我们通过各式各样的预设报警发现异常(通常是Metrics/Logs)。

  2. 发现异常后,打开监控大盘查找异常的曲线,并通过各种查询/统计找到异常的模块(Metrics)。

  3. 对这个模块以及关联的日志进行查询/统计分析,找到核心的报错信息(Logs)。

  4. 最后通过详细的调用链数据定位到引起问题的代码(Traces/Code)。

grafnan

“可观测性”将传统监控的外延放大,把研发纳入“可观测性”能力体系之中,改变传统被动监控的方式,主动观测与关联应用的各项指标,以“上帝视角”让系统恰当地展现自身状态。

最佳实践

目前SLS提供基于原生OpenTelemetry协议的分布式链路追踪功能,支持各类Trace数据的接入、存储、分析、可视化、告警、人工智能运维等。在2021年7月,SLS对于可观测性方案进行升级,实现了可观测数据的关联融合分析,Trace分类,Trace质量分析等功能。为给用户提供更流畅的问题定位解决体验,SLS联合阿里云云效Codeup推出代码诊断功能,云效 Codeup 作为阿里云出品的一款企业级代码管理平台,提供代码托管、代码评审、代码扫描、质量检测等功能,结合SLS可观测性解决方案的关联融合分析能力,可以帮助客户实现问题排查过程全链路的一站式打通,实现从日志到源码的关联定位能力,打通问题定位最后一公里,实现代码级的可观测性方案。

操作步骤

整体数据流向如下图所示:

流程图
  1. 日志接入SLS,并在日志中带入了TraceId。

  2. 日志关联跳转Trace。

  3. 代码托管在云效Codeup

成果过程展示

sls-mall一个基于Go实现的商城应用,应用基于SLS可观测方案将相关的Logs/Traces/Metrics指标统一接入到SLS平台存储,并基于SLS 可观测方案进行业务稳定性监控。基于SLS进行问题发现及定位的典型过程如下:

  • 基于拓扑观测整体服务质量情况并发现问题

拓扑

如上图所示,商场应用的全链路拓扑,可以通过拓扑可以快速了解系统整体的质量,QPS、延迟、调用次数等。对于出现错误的调用,在拓扑图中将标红并显示错误率。在图中我们可以看到front-end到orders服务链路存在异常调用。

拓扑黄金指标

点击异常链路后可以看到异常指标的详细数据,该段链路异常错误率1.67%,接下来我们在Trace分析中查看具体的异常。

  • 基于Trace分析找出异常的调用链

查询调用链

如上图所示,SLS提供了多维度的自定义分析能力,并支持Query Builder辅助大家更好的过滤出想要关注的Trace数据,只需要用界面中的各类条件组合即可完成,而且每个组合的可选值都会自动提示出来。通过Trace分析,我们可以基于界面化配置找到( service : "front-end" ) and ( statusCode : "ERROR" )相关的错误调用。

  • 基于Trace详情查看

trace到日志

如上图所示,SLS提供了详细的Trace调用详情报表,Trace详情用于展示整个跟踪链路及Span数据分布情况,图表中的每一行代表一条Span数据,并展示父级Span和子级Span之间的层级关系,同时可以每条调用的状态及具体信息。从图中我们可以看到front-end服务对应POST /orders这个调用存在异常,具体详细信息包括元数据信息,资源信息,相关的日志内容可以从页面中直接查看。为了进一步进行异常错误分析,我们需要通过记录的TraceID信息,关联跳转到对应的日志进行查看。

  • 通过TraceID进行日志与Trace的双向跳转

如果日志中有TraceID、SpanID字段,且Trace已经保存到SLS的Trace服务中,可以通过日志跳转的高级配置选择跳转到指定的Trace实例,直接查看Trace详情,这里就是日志和Trace的双向跳转。

trace-sls日志

通过日志信息我们可以看到 POST /orders 调用异常的原因为Deduct money from your bank card timeout。

  • 查看详细代码

code

从日志中我们可以看到关联的错误代码位置位于 caller:logging.go:29。基于SLS与云效Codeup联合推出的代码诊断功能,我们可以配置错误日志与代码的映射关系,点击错误代码段的位置信息(即logging.go:29),即可在SLS平台直接打开查看相关代码段信息。如需要进一步的Debug,可以点击“前往云效Codeup查看完整源码”直接跳转到云效Codeup进行问题的进一步定位及修复。

价值收益

  1. 无缝关联日志与代码。代码与SLS平台日志功能深度集成,打通从堆栈日志分析到源码Debug的最后一公里链路。

  2. 简单易用。通过简单的关联仓库信息配置后,即可实现从日志到源码的关联能力。

  3. 源代码预览支持。代码诊断功能支持在日志服务页面直接查看源码上下文,快速锁定问题。