2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

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

  • 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:434642

评论

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

BRC20支持的Dapp:开创去中心化应用的未来

区块链软件开发推广运营

dapp开发 区块链开发 链游开发 NFT开发 公链开发

10个React状态管理库推荐

伤感汤姆布利柏

SD-WAN的突出作用

Ogcloud

SD-WAN SD-WAN组网 SD-WAN服务商

为什么Nginx被称为“反向”代理呢?

互联网工科生

服务器 ​Nginx

字节跳动新一代云原生消息队列实践

字节跳动云原生计算

云原生 消息列队

香港服务器出租的优势分析:为何成为企业首选?

一只扑棱蛾子

香港服务器

纯血鸿蒙来了,鸿蒙App开发有可能提速吗?

FinFish

鸿蒙系统 小程序化 小程序技术 鸿蒙Next 纯血鸿蒙

库存智慧:数字化管理下的服装企业如何实现库存的精准优化

第七在线

透过 Footprint 的聚合视图洞察加密世界的全貌

Footprint Analytics

区块链 数据分析 加密货币

每日一题:LeetCode-958. 二叉树的完全性检验

Geek_4z9ami

面试 算法 LeetCode 二叉树 BFS

服务器C盘突然满了,是什么问题

德迅云安全杨德俊

什么是信创业态支持?支持信创的数据库防水坝哪家好?

行云管家

数据库 信创 堡垒机 国产化 数据库防水坝

京东商品详情数据接口(app)Python

tbapi

京东API接口 京东商品详情接口 京东商品数据采集

简论密码登录安全性

Geek_44385e

登录 密码安全

TDengine 3.0 四大企业应用案例合集,给你最直观的应用体验

TDengine

tdengine 时序数据库

常见的企业网络问题及SD-WAN解决方案

Ogcloud

SD-WAN SD-WAN组网 SD-WAN服务商

SD-WAN和MPLS的区别以及如何选择?

Ogcloud

SD-WAN SD-WAN组网 SD-WAN服务商

智能预测:数字化时代的服装企业如何实现准确的需求规划

第七在线

区块链游戏解说:Sunflower Land 是什么

Footprint Analytics

区块链游戏 NFT 链游

利用 ASP.NET Core 开发单机应用

不在线第一只蜗牛

.net 架构 分布式 微服务

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