监控数据有多种形式--有些系统会持续地输出数据,而其他系统只会在发生罕见事件时生成数据。有些数据能够直接定位问题,有些数据能帮助调查问题。更宽泛的说,拥有监控数据是观察系统工作状况的必要条件。
无论采集什么形式的监控数据,核心要点都是一样的:
采集数据的开销很小,但是如果在需要的时候没有数据,代价可就大了。所以有必要检测所有内容,并且合理地收集所有有用的数据。
指标是在特定时间捕获的与系统相关的值 -- 比如当前登陆到Web应用程序的用户数量。因此,通常以固定时间间隔收集指标,比如每秒采集一次,每分钟采集一次。
我们把指标主要分成两类:工作指标和资源指标。对于软件依赖的每个系统,应该考虑哪些工作指标和资源指标是合理的,并且将其全部收集。
工作指标通过系统的输出来获取系统的运行状况。在考虑采集工作指标时,通常可以将这些指标分成四类:
上面讲的指标对于观察系统的运行状况非常重要。采集到了这些数据可以快速回答关于系统内部健康和性能最紧迫的问题:系统现在可用吗?系统现在性能如何?
以下是两种常见系统的所有四种子类型的工作指标示例。
子类型 | 描述 | 值 |
---|---|---|
吞吐量 | 每秒请求数 | 312 |
成功率 | 两次测量间2xx的响应百分比 | 99.1 |
错误率 | 两次测量间5xx的响应百分比 | 0.1 |
性能 | 百分之90的请求的响应时间(秒) | 0.4 |
子类型 | 描述 | 值 |
---|---|---|
吞吐量 | 每秒查询次数 | 949 |
成功率 | 两次测量间成功执行的查询百分比 | 100 |
失败率 | 两次测量间成功执行的查询百分比 | 0 |
失败率 | 两次测量见返回过时数据的查询百分比 | 4.2 |
性能 | 百分之90的查询时间(秒) | 0.02 |
软件基础架构的大多数组件都成为其他系统的资源。有一些资源是底层的,比如CPU,内存,磁盘和网络接口之类的物理组件。如果另外一些组件,比如数据库或者地理定位微服务也可以被看成是资源,因为其他的系统需要这些组件来完成工作。
资源指标有助于了解系统的详细状态,这在调查问题和诊断问题的时候是特别有价值的。资源指标可以分为四类:
下面是几种常见的资源类型的指标示例
资源 | 利用率 | 饱和度 | 错误 | 可用性 |
---|---|---|---|---|
磁盘 IO | 设备繁忙时间的百分比 | 等待队列长度 | 设备错误 | 可写的时间的百分比 |
内存 | 已使用的内存百分比 | swap使用率 | (通常观测不到) | 通常观测不到 |
微服务 | 每个请求服务线程忙的平均时间百分比 | 请求数量 | 服务抛出异常 | 服务可用时间的百分比 |
数据库 | 每个连接繁忙的平均时间百分比 | 排队中的查询 | 内部错误,比如复制错误 | 服务可访问的时间百分比 |
还有一些指标,既不是工作指标,也不是资源指标,但这些指标同样有助于观察复杂的系统。比较常见的例子是缓存命中数或者数据库锁。
除了可以连续收集的指标外,一些监控系统还可以捕获事件,这些事件往往是频繁的,离散的,但对整个系统的理解是有帮助的。比如:
事件通常带有足够的信息,可以单独解释,而不像单个数据点通常只有在上下文中才有意义。
事件会记录在特定时间点发生的事情,比如
时间 | 时间 | 附加信息 |
---|---|---|
Hotfix f464bfe发布到生产环境了 | 2015-05-15 04:13:25 UTC | 时间:1.2秒 |
Pull request 1630被合并了 | 2015–05–19 14:22:20 UTC | commit:ea720d6 |
每夜数据汇总失败 | 2015–05–27 00:03:18 UTC | 失败任务的链接 |
事件有时候用来生成告警--通知负责人事情的发生,比如上面的第三个例子。不过这些事件更常用的用法是调查问题。一般来说,最好像指标一样考虑这样的事件--尽可能地收集它们。
需要收集的数据应该有四个特征: