可观测性
如果能够在不发布新代码(如增加一个用于调试的日志)的情况下理解任何奇怪或不确定性的状态,那么我们的系统就具备可观测性
结构化的事件(Structured Events)就是可观测性的基础,通过高基数(指包含在一个集合中的唯一值的数量)、高维度(数据中键(key)的数量)的事件,将成为能够发现隐藏在复杂系统架构中的其他隐藏问题的关键组成部分
可观测性与传统监控的区别:
- 需要事先预测问题可能发生在哪里,以及问题发生的模式
- 关注的维度不一样,监控更加关注基础设施的资源情况,可观测平台瞄准的恰恰是应用软件本身
- 数据收集的全面性(不仅仅是指标数据)和关联性上
以下三种监控数据都只是结构化事件的一部分
- 日志:记录离散事件,通过这些记录事后分析出程序的行为
- 追踪:单体的调用栈追踪或者服务调用之间的分布式追踪
- 度量:度量是指对系统中某一类信息的统计聚合
日志收集:与具体技术栈无关 ELK EFK
度量:Prometheus
链路追踪:Zipkin...
日志
日志中有用的信息
- 时间
- 标识
- 系统标识
- 用户标识
- 事件标识...
- 来源
- 日志级别
输出
输出的日志应该是什么样的:
避免敏感信息
避免引用到慢操作信息
避免输出的信息有误导性
记录TraceID 没有TraceID就要自动生成来对请求进行标记
记录系统运行时的关键事件
收集&缓冲
- Logstash
- Beats
为了缓解收集大量日志的压力 可以在收集器之前假设Kafka或者Redis作为缓冲层 面对突发流量
加工&聚合
- 将非结构化数据转为结构化数据
存储&查询
ES是这方面唯一的选择
日志有如下性质:
- 写入后基本无需修改
- 分为冷热数据 更早的日志价值更低
- 日志可离线查询与实时查询
链路追踪
目标:排查故障 分析性能数据 监控服务间的行为
- trace与span
链路追踪的挑战:
- 异构技术
- 对性能敏感
- 对应用透明
- 自动扩缩容
- 持续的监控
数据收集
- 基于日志信息的追踪:将Trace、Span等信息直接输出到应用日志中,然后随着所有节点的日志归集过程汇聚到一起,再从全局日志信息中反推出完整的调用链拓扑关系
- 基于服务的追踪:通过代码注入的方式可以得到方法调用栈等信息 并且需要通过独立的网络调用上报信息 需要消耗更多的资源
- 基于sidecar代理的方式:这种方式对应用透明 但它只能实现服务调用层面的追踪
追踪规范化
OpenTracing(链路追踪标准) -> OpenCensus(在前者的基础上,还包括度量) -> OpenTelemetry
OpenTelemetry
跨语言规范:
API与SDK需要通过插桩的方式来收集数据
- API:定义用于生成和关联追踪、指标和日志的数据类型和操作
- SDK:定义 API 特定语言实现的要求,同时还定义配置、数据处理和导出等概念
- 数据:定义遥测后端可以提供支持的 OpenTelemetry 协议 (OTLP),OTLP 的数据模型定义是基于 ProtoBuf 完成的
OpenTelemetry Collector:针对如何接收、处理和导出遥测数据提供了与供应商无关的实现
- Receiver:负责按照对应的协议格式监听和接收遥测数据,并把数据转给一个或者多个 Processor。
- Processor:负责加工处理遥测数据,如丢弃数据、增加信息、转批处理等,并把数据传递给下一个 Processor 或者一个或多个 Exporter。
- Exporter:负责把数据发送给下一个接收端(一般是指后端),比如将指标数据存储到 Prometheus 中
部署模式:
- Agent模式 通过边车直接跟应用部署在一起
- Gatewaay模式,一个独立的中间件,
聚合度量
指标收集
指标数据类型
- 计数度量器(Counter):对有相同量纲、可加减数值的合计量
- 瞬态度量器(Gauge):表示某个指标在某个时点的数值
- 吞吐率度量器(Meter):单位时间内某个事件的发生次数
- 直方图度量器(Histogram)
- 采样点分位图度量器(Quantile Summary)
指标采集方式
- push
- pull
指标传输协议:
- OpenMetrics
健康检查API模式:
Prometheus
存储查询
如果使用传统的关系型数据库存储度量数据 那每天监控数据的产生量将会非常的大
大部分度量数据都可以使用专门的时序数据库来进行存储
由于度量数据多写少读、几乎不删改、数据只顺序追加这些特点,时序数据库就可以使用某些策略来进行优化:
- 日志结构的合并树
- 对数据进行采样进行节省空间 比如几周前的数据就只保留一天 几年前的就保留一周
- 轮替数据存储 类似于环形缓冲区 输入可以无限 存储有限
监控预警
- Grafana
- Alter Manager
可观测性驱动开发
在整个开发过程中考虑应用程序的可靠性和软件质量,利用工具或是插桩来观测系统的状态和行为
文化
- 拥抱失败
- 允许犯错:事件后审查的目标应该是识别系统和流程中的弱点,并通过建立可观测性和工程化来避免这个错误再次发生
- 拒绝个人英雄主义:依靠少数人甚至一个人的能力来理解和调试系统是不可信的
- 早排查:代码部署到生产环境后,应及时通过可观测性来查看生产环境的状态
可观测性文化
- 用真实数据确定工作优先级并做出决策
- 根据对业务来说真正重要的事情发出告警,找出真正的问题或是影响,而不仅仅根据基础架构的情况作出判断
- 不断消除告警
- 持续地对文档进行改进对于建立可观测性文化来说至关重要
可观测性成熟度框架
- 阶段1:感知到问题
- 阶段2:快速了解问题的背景和影响,此时回滚是第一位的
- 阶段3:问题被修复之后,此时工程师可以花时间定位和理解潜在问题