如何高效地在线排查代码问题

本文涉及的产品
云效 DevOps 流水线,基础版人数 不受限
日志服务 SLS,月写入数据量 50GB 1个月
云效 DevOps 项目协作,基础版人数 不受限
简介: 本文提供了两种应用于在线排查代码问题的高效实践,分别应对单应用场景(对应单个代码库)的精细化分析和分布式应用场景(对应多个代码库)端到端的日志分析,实现一站式在线代码诊断。

一、前言


作为程序员经常调侃的一句玩笑话是:“程序员是一种一边写BUG,一边寻找并解决BUG的生物”。会心一笑过后你会发现,代码开发者很重要的一部分工作就是排查代码在运行过程中出现的问题。通常开发者都是接到监控报警(如:cpu、load、memory等系统指标异常,业务成功率、异常错误等业务指标异常)后第一时间响应,并在尽可能短的时间内能够定位问题并完成止血动作。问题排查效率越高则业务面临的损失就会越小,而代码问题排查效率的高度由取决代码的可观测性。所以如何高效地观测运行时的代码并进行问题诊断是每个代码开发者与企业的追求的目标。今天我们来聊聊这个话题,并给出云效Codeup的最佳实践。


二、什么是代码可观测性


在线排查代码问题的效率为什么依赖代码的可观测性呢?代码的可观测性具体又指的是什么呢?首先我们先了解一下“可观测性”,该术语起源与控制理论,最常见的是在描述系统的可观测性。系统的可观测性是指通过系统输出的信息来评估系统当前运行状态的一种属性。它既可以是针对单体系统,又可以针对由多个单体系统组成的复杂的分布式系统。而代码可观测性则是将代码运行所在的整体环境抽象成一个系统,包括各种基础的软硬件设施、可执行的业务代码等。即通过硬件的负载指标、代码打印的日志数据来评估当前代码运行的状态,当问题发生时能够快速定位到底是哪个代码模块出了问题。


容器和微服务的流行,虽然从架构上降低了系统与系统之间、软件与硬件之间的耦合。但分布式部署、敏捷的代码变更却增加了代码运行时不可预测的风险和可观测的难度。可观测性是一种度量,如何实现代码可观测行也就是要找出度量的数据。一般主要使用三类数据:链路跟踪数据(Traces)、应用指标(Metrics)、业务日志(Logs)。其中Metrics这种指标是为了问题的快速发现,比如cpu/load/memory指标达到临界值后快速报警;Traces是发现问题后能够端到端的还原调用链路,以便快速定位问题可能出现问题的代码模块;Logs则是记录详细的业务上下文,包括发生的时间、地点和具体原因描述等文本信息。当系统出现问题时,通常首选是查看Logs数据,并开始分析具体原因。Logs虽然记录了比较详细的上下文信息,但单凭日志数据就可以精准判断原因的情况还是偏少的,一般还是要结合源代码进行分析。这就好比断案需要收集案发现场数据(即Logs),还需要审问嫌疑对象(即源代码),二者缺一不可。下面整理了几种快速“断案”的具体实践。


三、AppObserver实现动态观测


排查线上问题,有时我们会发现关键的位置缺少了日志,没法准确的获知代码运行情况,这会极大阻碍我们定位问题。缺少日志只能补上,再发布一次。对于大多数应用系统来说,发布一次的时间成本是不低的,从数分钟到数小时不等。除时间成本外,发布期间可能会因为服务不可用而影响到用户的正常使用。所以生产系统上发现了 Bug,找起来通常很不容易。云效Devstudion提供了应用观测器(App Observer)可以做到不发布系统的前提下动态添加日志、非阻塞式断点、实时统计Metrics指标等功能。


动态添加日志观测,App Observer可以让你在后悔当初忘记打印的时候不再只剩下后悔。它提供的动态添加日志功能可以让你一扫后悔的阴霾,随时添加、即时生效。同时还可以配合条件表达式控制日志的打印与否,在日志表达式中观测变量值等功能。整个过程中,动态日志不会改变原有的代码行数,不影响通过原日志系统排查问题。


image


非阻塞断点观测,App Observer提供的非阻塞断点在问题排查上,比动态日志跟进一步。最显著的增强点在于可以观测程序的执行堆栈,让程序的调用链路一目了然。此外,在观测变量值方面,可以一步到位,自动观测函数体内的所有变量。所有的观测行为,都不会阻塞程序的执行,真正做到了似断点又非断点。


image


实时 Metrics 用于辅助排查程序的性能问题,不需要添加非业务代码,在保持了程序逻辑清爽的同时,完成了统计观测:

  • 计数器:用于统计某一行代码的执行次数;
  • 方法执行耗时:用于统计函数体的执行耗时;


image


四、Codeup+SLS实现云端源码级观测


无论是传统排查服务器上打印的日志,还是上面介绍的通过AppObserver动态观测,最终都必须结合已下载到本地的源码进行分析定位问题。这个过程涉及到一个环节就是要把代码库克隆到本地的操作,对于一个非常熟悉代码库的开发者或许不是个问题,但是对一个运维或开发人员碰到一个他不是很熟悉的代码库时,他需要先确定日志数据是由哪个代码库的代码打印的,其次获取代码库权限并克隆代码到本地,最后阅读源码定位问题代码行,这本身就是一个效率低下的过程。云效代码托管平台(Codeup)联合阿里云日志服务工具(SLS)一起打通了日志到源码关联通道,在排查过程中无需关心日志与代码库的关联关系,无需临时申请代码库权限等阻碍排查过程的操作,为在线代码问题排查提供了一种面向云的高效最佳实践。这里涉及到两款工具,其中Codeup是代码托管工具,提供了代码源文件的存储与版本控制、代码文本检索等服务;SLS提供了海量日志数据的收集、存储、检索等服务。


首先通过SLS收集上报业务系统打印的日志数据。一旦生产环境出现问题并由监控系统发出报警,则开发或运维人员接到报警后第一时间到SLS控制台查询具体的日志详情。然后分析具体日志详情以及日志关联的源码,整个过程全部一体化,让问题处理的人员专注于问题本身,极大提高应急效率。工具使用操作如下所示:


  1. 配置日志库与代码库的关联关系,通过点击如下图所示的“查看源码”功能,可以进入配置页面。配置是一次性工作,生效后无需重复配置。


image


具体过程如下图2所示:


image


配置成功后会在高级选项里新增“代码诊断”入口。(入口名称可以自定义,此处中自定义为:代码诊断)


image


  1. 查看SLS日志详情,如需配合源码分析,则只需选择相应的代码文本即可,如下图所示


image


  1. 选择日志关键字,跳转Codeup查看源码


image


还可以跳转到Codeup平台看更详细的代码内容


image



五、结束语


云效代码平台致力为企业用户提供稳定、安全、高效的代码服务。围绕以代码数据为中心,面向研发过程总结最佳实践呈现给用户。本文提供了两种应用于在线排查代码问题的高效实践,分别应对单应用场景(对应单个代码库)的精细化分析和分布式应用场景(对应多个代码库)端到端的日志分析,实现一站式在线代码诊断。同时,也欢迎使用我们自研的代码智能补全插件Alibaba Cloud AI Coding Assistant(https://developer.aliyun.com/tool/cosy),助力高效开发。

相关实践学习
2分钟自动化部署人生模拟器
本场景将带你借助云效流水线Flow实现人生模拟器小游戏的自动化部署
SVN版本控制系统
SVN是现在软件开发之中的主流软件版本控制工具,在工作之中利用SVN可以有效的解决多人开发的代码管理问题,本课程将为读者讲解SVN服务器的配置以及基于MyEclipse的SVN客户端插件的配置与使用,并且在讲解之中着重讲解了冲突的产生于解决。
相关文章
|
6月前
|
JavaScript 关系型数据库 MySQL
在线文档频繁故障不稳定,其实可以自己搭一个Etherpad在线文档
在线文档频繁故障不稳定,其实可以自己搭一个Etherpad在线文档
|
3月前
|
数据采集 监控 数据挖掘
打造高效用户旅程:埋点分析系统的实操指南
在数字化时代,了解用户如何与我们的产品或服务互动是至关重要的。用户行为,在广义上,指的是用户在网站、应用程序或其他数字界面上的所有动作和反应。这些行为可能包括点击链接、浏览页面、填写表单,甚至是在社交媒体上分享内容。每一个动作都是用户体验的一部分,并对我们理解他们的需求和偏好提供了宝贵的线索。 在技术层面上,用户行为的跟踪和分析可以让我们深入了解用户的互动模式,从而指导我们的产品改进和市场战略。通过分析这些数据,我们可以发现用户旅程中的关键触点,识别用户体验的痛点,以及揭示潜在的优化机会。这不仅有助于提升用户满意度和忠诚度,还可以增强产品的市场竞争力。
打造高效用户旅程:埋点分析系统的实操指南
|
4月前
|
Java
性能优化思路及常用工具及手段问题之stack工具分析异常数据问题如何解决
性能优化思路及常用工具及手段问题之stack工具分析异常数据问题如何解决
|
NoSQL 分布式数据库 Redis
103 云笔记案例(代码流程分析)
103 云笔记案例(代码流程分析)
58 0
|
XML 缓存 前端开发
【解决方案 十一】问题排查方法的思考
【解决方案 十一】问题排查方法的思考
110 0
智能、高效、便捷问题定位利器 —— 应用诊断分析平台 ATP 上线
一款分析功能丰富、诊断能力完备的平台,帮助用户高效定位应用诊断性能、异常行为等问题。
智能、高效、便捷问题定位利器 —— 应用诊断分析平台 ATP 上线
|
运维 JavaScript 前端开发
记录两次多端排查问题的过程
记录两次多端排查问题的过程
|
SQL 存储 关系型数据库
常见问题排查案例|学习笔记
快速学习常见问题排查案例
常见问题排查案例|学习笔记
|
存储 Web App开发 监控
浅谈前端异常监控平台实现方案
异常捕获是改善软件质量的跟踪手段之一,常见的方式是记录日志,从日志分析异常问题进而跟进。对于前端项目来说,异常可能是后端接口数据导致,可能是前端本身业务逻辑问题导致,不管是什么导致的异常,只要能够精准的捕获到就能够分析出问题所在。可能有小伙说有测试阶段,全面的测试机制的确能够降低异常的出现,但是测试大部份情况是在非生产环境上进行的,覆盖面有限。
518 0
浅谈前端异常监控平台实现方案
|
数据采集 存储 消息中间件
谈谈大数据采集和常见问题
谈谈大数据采集和常见问题
444 0