Observability - Concept
概述
- 可观测性 - 从系统向外部输出的信息来推断出系统内部状态的好坏
- 可观测强调的是一种度量能力
- 在不发布新代码(如新增诊断日志)的情况下理解系统内部状态 - 系统具有可观测性
Metrics + Logs + Tracing
Metrics + Logs + Tracing 只是遥测数据类型,而 Observability 并非具体技术,而是系统属性,类似于 HA
Key | Desc |
---|---|
Metrics | 在一段时间内测量的数值,默认是结构化的,便于查询和存储优化 |
Logs | 对特定时间发生的事件的文本记录,一般是非结构化字符串,会在程序执行期间被写入磁盘 |
Tracing | 表示请求通过分布式系统的端到端的路径,执行的每个操作被称为 Span |
Tracing 一般会通过可视化的瀑布图展现出来
Metrics
- 由于 Metrics 最大的特点是聚合性
- Metrics 生成的数值是反映预定义时间段内系统状态的汇总报告 - 缺乏颗粒度
- Metrics 之间可能彼此不相关
- Metrics 常用于 - 静态仪表盘的构建、随时间变化的趋势分析、监控维度是否保持在定义的阈值内
- 但都不是 Observability,因为对于故障排查来说,这些信息远远不够
Logs
- Logs 本质上是离散事件,为了便于阅读,一般是一大块非结构化文本
- 需要通过日志解析器(复杂规则)才能完成结构化、索引、搜索
- 结构化 - 创建结构化的日志数据,如 Docker 日志
Tracing
- Tracing 的主要问题 - 仅依靠开发人员进行 Instrument,是远远不够的
- 实现复杂度
- 大量的应用程序需要使用额外的开源框架或库构建的
- 在多语言架构下,会变得更具有挑战性
- 实现成本
- Instrument 的成本比较高,比较很难做到全面覆盖,适用于具体的业务场景
- 随着产品迭代,可能需要反复增加 Instrument,增加工作量且降低系统可靠性
Structured Events
Observability 定义的是一种度量能力,帮助用户更好地理解和解释系统当前所处的任何状态
- Structured Events 是 Observability 的基础
- 事件是指特定请求与服务交互时所有信息的记录,通过事件能了解到服务所受到的影响
- Structured Events 的定义
- 在请求第一次进入服务时,会有一个 Empty Map 被初始化出来
- 在该请求的生命周期内发生的任何细节或者有价值的上下文,都会附加到 Map 中
- 当请求即将退出或者出错时,刚所发生的事情都被记录下来了
- 写入该 Map 的数据被组织和格式化为 Key-Value Pair,以便于搜索 - Structured Events
- 在调试服务问题时,可以比较 Structured Events,及时发现异常 - 任意宽度 - 基数 + 维度
基数
- 在数据库中,基数是指包含在一个集合中的唯一值的数量
- 低基数(性别) - 很多重复的值;高基数(User Id) - 很大比例是完全唯一的值
- 高基数信息在调试或者理解系统的数据时非常有用 - userid + requestid - 精确定位
维度
- 基数是数据中值的唯一性,而维度是数据中 Key 的数量
- 在可观测系统中,遥测数据被生成任意宽度的结构化事件,其中可以包含成百上千的键值对(即维度)
- 事件范围越广,事件发生时获取到的上下文就越丰富,越容易定位问题
对比
传统监控
- 仪表盘 - 受到告警时,某项指标超过了阈值,但不能完全了解系统发生了什么
- 传统监控只能解决 Known-Unknowns 问题 - 完全被动
- 每次出现故障时,复盘的结果是增加一些指标或者告警,然后这些告警可能再也不会被触发
- 例如 - CPU 使用率达到了 90%,但却不知道原因
可观测性
- 可观测性通过查看和分析高纬度和高基数的数据,发现在复杂系统中的隐藏问题 - 无需预设问题发生的模式
- 通过数据的关联,允许从任何角度分析问题,而不是依靠直觉和经验
- 针对应用软件监控,不仅仅是基础设施,目标是保障应用软件的可靠性和稳定性
- 全面搜集 + 关联数据
- 数据采集 - 底层操作系统、各种语言环境的网络协议、前端用户访问数据
- 利用数据所提供的可视化、交互性来真正让可观测性落地
- 可观测性强调的是从应用和业务维度,用各种数据垂直且实时地描述应用的全貌
- 采用的不是传统的分层逻辑,不是用不同的独立的监控系统分开关注每一层的情况
- 传统运维的仪表盘在分布式架构中的用处越来越小
- 对于复杂系统来说,很多之前没有发生过的问题,单靠仪表盘是不能有效发现根本原因
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.