写点什么

聊聊监控(二):谁为代码负责以及常见的监控痛点

  • 2016-05-22
  • 本文字数:1692 字

    阅读完需:约 6 分钟

『聊聊监控』系列文章翻译自 Baron 的博客,如作者所说,希望你在阅读该系列文章之后,可以在系统中应用这些最佳实践,并为你的应用构建一个高度可监控的架构,用小成本实现极佳的系统能见度。

上一篇文章中,作者聊到了监控指标的取舍以及监控的意义。本文是系列文章的第二篇。

随便在你的应用里面找出一个服务。谁为它的线上表现负责?这个负责人是否就是编写它的那个人?

DevOps 有一个核心理念,那就是编写代码的人要为它们在线上的运行负责。这个理念非常适合微服务架构的软件,而实现这个理念就意味着我们必须要监控它们在线上运行的情况。

本系列文章无意深入探讨这个理念。然而我想要指出一个影响性能和可靠性的常见问题,那就是反馈循环的缺乏(或反馈系统被打断)。如果开发者不负责线上环境的运维,则他们写代码的时候就不会太多考虑运维友好的问题。就是这么简单。不负责运维的他们,不知道系统能够承受什么,不知道怎样的日志信息是有用的而哪些是没用的。可运维性是一项功能,不使用这个功能就不知道该怎样把这个功能做好。

如果你认可这个观点,那么事情就变得很明显:生产环境上运行的每一个服务都需要监控并记录日志,监控的度量和日志事件需要对需要他们的人可见。这些应用和系统的度量应该是透明的、可查询的,而且其代码实现应该做到部署代码的同时就将监控服务相关的内容也一起部署。

接下来我将讨论我在一些定制软件和现成软件中见到的有关可监控性的问题,以及这些软件对于监控方面的设计思路。我针对定制应用列出了下面这些内容,当然它们也适用于服务器软件的开发。

日志级别

对于我们想要的细粒度以及日志信息的准确度而言,日志的级别似乎总是不够用。一条日志应该是 INFO、TRACE 还是 DEBUG?如果这是个用于 WARN 的 DEBUG 呢?所谓的日志级别是否是一个严谨的线性序列?我们也经常在上述通用的日志级别之外创建的更多定制化的日志级别。我个人的观点是,日志信息只需要分成两类:一,有助于代码 debug 的;二,有助于运维操作的。

状态与配置纠缠不清

很多系统在状态变量以及配置变量之间没有做出严格的区分。状态变量是对系统状态的表达,而配置变量是向系统输入的内容。比如在 MySQL 和 Redis 中,获取系统状态的命令会同时返回状态变量和配置变量,而两种变量都混在一起。这种“大杂烩”经常会造成不便,我们不得不另外写一段代码或者编写白名单 / 黑名单来把两种变量分离出来。

向后不兼容

如果你在某次更新中改变了一个度量的含义(或维度),那么在理想的情况下,应该保持之前的行为不变,同时引入一个平行的替代方法。否则的话,会给很多其他的系统带来麻烦。比如在 MySQL 中,SHOW STATUS 命令就进行过一次变更,更新后该命令默认包含连接计数,而之前的全局计数则是通过另一个命令来获取。这一次更改给很多系统带来了麻烦。还有一次,MySQL 把一个“Questions”状态变量的含义改了,新的“Queries”变量取代了之前的“Questions”变量。这等于是一次变量重命名,结果造成了很多混乱。不要做这种事。

不完全可见

还是拿 MySQL 来做反面教材。MySQL 从很早之前开始就有一个 SHOW VARIABLES 命令用于显示变量。然后,很多命令行选项都使用了完全相同的变量名。有些变量被正确的显示了,有些则没有,有些则是被显示了但是名字完全不对。

核心指标(KPI)匮乏

分析性能问题需要的关键指标其实并不多。系统利用率、延时、队列长度是最关键的信息,而这些信息可以从少数几个指标中获取。比如,Linux 下的 /proc/diskstats 指标通过一些队列理论的分析就可以得到其他有用的数值。有一个令人惊讶的事实是,很多系统都没有提供检测上述关键度量的途径,因为构建这些系统的人对于监控并没有清晰的认知。比如,PostgreSQL 为事务设计了标准的性能度量功能,却没有为语句(statements)进行同样的设计,所以如果你想知道服务器每秒在处理多少查询(queries/statements),则不得不采取更加复杂的办法。这种基础度量的缺失是一个很严重的问题。


感谢郭蕾对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2016-05-22 17:434655

评论

发布
暂无评论
发现更多内容

《王者荣耀》鸿蒙版上线后首次全民竞技之约!无缝流转新体验

最新动态

Vue.js 与低代码开发:如何实现快速应用构建

伤感汤姆布利柏

【YashanDB知识库】YashanDB 支持MySQL多表更新语句的解决方法

YashanDB

数据库 yashandb

【YashanDB知识库】MySQL和YashanDB 隐式转换不一致引起的报错

YashanDB

数据库 yashandb

实用的iPhone数据恢复软件PhoneRescue for iOS中文激活版

小玖_苹果Mac软件

DS缩写乱争:当小海豚撞上AI顶流,技术圈也逃不过“撞名”修罗场

白鲸开源

开源 Apache DolphinScheduler DeepSeek DeepSeek v3 DeepSeek-R1、

全链路数据引擎:WhaleStudio驱动下的大数据调度与同步智能革新

白鲸开源

数据集成 数据源 数据调度 白鲸开源 WhaleStudio

人工智能丨deepseek是什么?我们能用它来做什么?

测试人

人工智能

炸裂:SpringAI内置DeepSeek啦!

王磊

腾讯大数据基于 StarRocks 的向量检索探索

StarRocks

向量检索

低代码+AI!DeepSeek新时代,老板们坐不住了!

引迈信息

项目管理资格证书对职业发展的7大影响

薛同学

简洁高效的多窗格文件管理器QSpace Pro for mac中文激活版

小玖_苹果Mac软件

音频合成器插件Arturia Analog Lab Pro V for mac直装激活版

小玖_苹果Mac软件

【YashanDB知识库】从PostgreSQL迁移到YashanDB如何进行数据行数比对

YashanDB

数据库 yashandb

OpenSearch LLM 智能问答版基于 Deepseek-R1 一分钟搭建 RAG 系统

阿里云大数据AI技术

人工智能 阿里云 LLM OpenSearch DeepSeek

基于人工智能技术的图像处理软件Topaz Photo AI for mac激活版

小玖_苹果Mac软件

优秀的词典工具Eudic欧路词典 for Mac中文激活版

小玖_苹果Mac软件

高效前端应用:基于 Vue3 的低代码开发实践

秃头小帅oi

JDK8到JDK17都升级了那些新特性?又有哪些能常用好用的?

不在线第一只蜗牛

Python jdk

AMD 锐龙 7 9800X3D 处理器被曝看视频时烧毁

E科讯

Klook获1亿美元融资,推动全球旅游体验行业持续增长

财见

借助GPT-4开启游戏开发之旅

xuyinyin

DeepSeek正重构人形机器人和具身大模型赛道!

机器人头条

科技 大模型 人形机器人 具身智能

全球人形机器人行业2024年度汇总和行业前瞻报告

机器人头条

科技 大模型 人形机器人 具身智能

低代码开发平台与 Vue.js 的深度融合

秃头小帅oi

硬件信息监测软件iStat Menus for mac中文激活版

小玖_苹果Mac软件

BRASS管乐器演奏插件Arturia Augmented BRASS for mac激活版

小玖_苹果Mac软件

Unity 专家分享2025年移动游戏行业七大趋势展望

极客天地

聊聊监控(二):谁为代码负责以及常见的监控痛点_语言 & 开发_Baron Schwartz_InfoQ精选文章