任何服务都离不开监控系统,对于管理维护服务的组织来说,监控是必备技能之一。近几年来,容器化、微服务、云原生等方式成为流行的现代架构思想,这给监控系统带来了不小的挑战。具体来说,监控系统需要在动态的云环境或者基于容器的微服务中快速、自动地识别对象的生命周期,并持续地提供近实时的监控检测。
监控的方法是多种多样的,实际上,你可以说从单元测试到检查清单(checklist)的所有事情都是监控的某种形式。
注:Lindsay Holmwood对测试驱动的监控有一个很好的介绍,讨论了测试和监控之间的联系。此外,Cindy Sridharan关于微服务测试的文章也介绍了一些有趣的测试和监控的相似之处。
但是传统上,监控的定义侧重于检查和测量应用程序的状态。
探针和内省
监控应用程序主要有两种方法:探针(probing)和内省(introspection)。探针监控是在应用程序的外部,它查询应用程序的外部特征:监听端口是否有响应并返回正确的数据或状态码。探针监控的一个例子是执行 ICMP 检查并确认可以收到响应。Nagios 就是一个主要基于探针监控的监控系统。
内省监控主要查看应用程序内部的内容。应用程序经过检测,并返回其状态、内部组件,或者事务和事件性能的度量。这些数据可准确显示应用程序的运行方式,而不仅是其可用性或其表面行为。内省监控可以直接将事件、日志和指标发送到监控工具,也可以将信息发送给状态或健康检查接口,然后由监控工具收集。
内省方法提供了应用程序实际运行的状态,它允许你传达比探针监控更丰富且更多的有关应用程序状态上下文的信息,是能提供你和业务所需的监控信息的更好方式。
这并不是说探针监控没有作用了,了解应用程序的外部状态通常很有用,特别是如果应用程序由第三方提供,并且你没有深入了解其内部操作的时候。从外部查看应用程序以了解某些网络、安全性或可用性问题通常也很有帮助。通常建议对安全网络进行探针监控以发现问题,然后使用内省监控进行报告和诊断。
拉取和推送
目前有两种执行监控检查的方式,分别是拉取(pull)和推送(push),这里我们简单讨论一下。
基于拉取的监控方式会提取或检查远程应用程序—例如包含指标的端点,或是探针监控中使用 ICMP 进行的检查。在基于推送的监控方式中,应用程序发送事件给监控系统接收。
这两种方法都有利有弊。关于这些优点和缺点,监控领域内部存在相当大的争议,但就许多用户而言,这些辩论没有实际意义。
Prometheus 主要是一个基于拉取的系统,但它也支持接收推送到网关的事件,我们将在本书中展示如何使用这两种方法。
监控数据的类型
监控工具可以收集各种不同类型的数据,这些数据主要有两种形式:
指标:大多数现代监控工具都非常依赖指标来帮助我们了解系统的情况。指标存储为时间序列数据,用于记录应用程序度量的状态,我们很快就会看到更多相关内容。
日志:日志是从应用程序发出的(通常是文本的)事件。虽然有助于让你知道发生了什么,但它们通常对故障诊断和调查最有帮助。我们不会在本书中详细介绍日志,但是有很多可用的工具(如ELK堆栈)可用于收集和管理日志事件。
作者介绍:
詹姆斯·特恩布尔(James Turnbull)是一位作家和工程师。他最近出版的书包括《The Packer Book》《The Terraform Book》和《The Art of Monitoring》,以及关于开源容器虚拟化技术的《The Docker Book》,还有关于开源日志工具的《The Logstash Book》。詹姆斯还撰写了两本关于 Puppet 的书:《Pro Puppet》和《Pulling Strings with Puppet》。同时他还是另外三本书的作者:《Pro Linux System Administration》《Pro Nagios 2.0》和《Hardening Linux》。
他目前是 Empatico 公司的首席技术官,并且曾担任过 Kickstarter 公司的首席技术官、Docker 公司服务和支持副总裁、Venmo 公司工程副总裁以及 Puppet 公司技术运营副总裁。他喜欢品尝美食、喝酒、读书、摄影和养猫。
本文节选自《Prometheus 监控实战》,更多内容请点击此处查看。
评论