前言
为什么要写这本书
熟悉我的读者应该都知道,在这本书之前我写过一本书《HikariCP数据库连接池实战》。那本书解答了“HikariCP该如何监控”的问题,提出了HikariCP的主要监控指标,但是没有对Prometheus这项技术做专项分析。本书则弥补了那本书的遗憾,全面且系统地介绍了Prometheus这款监控产品,并将介绍对象由数据库连接池转移到监控产品本身。从HikariCP(光)到Prometheus(火),也展示了我对于技术的理解层层深入、渐入佳境的过程。
Prometheus是由SoundCloud开源的监控系统,是Google BorgMon监控系统的开源版本。Prometheus开源项目是继Kubernetes后第二个正式加入CNCF(Cloud Native Computing Foundation,云原生计算基金会)的项目,也是继Kubernetes之后第二个正式“毕业”的CNCF项目,是容器和云原生领域事实上的监控标准解决方案。
如今,Prometheus已经被全球众多企业广泛使用,它已经成为企业构建现代云原生架构的首选开源监控工具。近几年来,国内技术社区关于监控的讨论有很多,尤其是关于监控选型的讨论比较频繁,目前IT类公司有一个统一的趋势——使用Prometheus作为通用的监控系统解决方案。百度、京东、阿里、宜信、51信用卡等互联网公司都有专门的Prometheus研发及运维团队。
Prometheus既是一个监控系统,又是一个存储系统,可以说它提供了一个完备的监控生态。我和Prometheus有着不解之缘:早在2014年,我在阿里就职期间就接触过与TSDB时序数据库相关的技术;我后来研发的底层数据库中间件采用了HikariCP数据库连接池,数据库连接池的监控就依托于公司的Prometheus监控系统;2019年,我主导的项目Kubernetes+Prometheus一举拿下了公司年度最佳产研类项目,有10余人参与到这个项目中,通过项目室闭关的形式,用了半年多的时间将全公司的应用全部迁移到了Kubernetes集群上并接入了Prometheus监控。由于长期接触Prometheus,我也经常和一些使用者进行相关问题的讨论,这些经历帮我积累了宝贵的实战经验。
虽然Prometheus相关的书市面上有很多,但是大多都存在一些问题。首先,其中大多数书籍面向的群体仅是运维工程师,却忽略了开发者;其次,部分书籍专注于源码解析或者对Kubernetes技术进行介绍,却忽略了Prometheus本身的内容,比如PromQL是实战中非常重要的知识,但却少有书籍会通过理论联系实际的方式具体介绍;最后,一些书籍大量堆砌代码和概念,导致重点内容介绍不足和实战案例缺乏,这对实际工作不会有太多帮助。
本书在内容上深入浅出,注重实战性、实用性,兼顾开发者的诉求,可以让读者迅速对Prometheus形成闭环认知。书中还提炼了最佳实践以提升读者认知高度和实践能力。
读者对象
本书适合运维工程师和所有Java程序员阅读,尤其适合以下读者:
·Java初中级开发者;
·系统架构师;
·中间件开发者;
·运维工程师;
·工作中使用Prometheus的公司与团队;
·开设Prometheus相关课程的大专院校师生;
·其他对Prometheus技术感兴趣的人员。
如何阅读本书
本书共分为11章,紧密围绕Prometheus的相关概念和技术展开介绍。
第1章主要介绍了监控系统的相关概念。本章首先介绍了监控的概念、监控的分类、MDD(指标驱动开发)的理念、Google四大黄金指标、USE方法、RED方法等知识;接着介绍了监控中的探针和内省、拉取和推送等常见手法;最后介绍了常见的监控系统Nagios、Zabbix、Ganglia、Open-Falcon、ZMon,以及进行监控系统选型时应该考虑的维度及误区。
第2章介绍了Prometheus的相关概念。从历史、特点、架构、局限性、快速开始这5个方面介绍了Prometheus是什么,它在监控领域有哪些使用场景,以及如何快速安装和启动Prometheus。
第3章介绍了在Spring Boot中如何集成Prometheus。本章通过介绍Micrometer的理论,辅以Spring Boot 2.x应用的案例,一步步教读者将Spring Boot 2.x应用数据传输到Prometheus监控系统中,再以可视化监控大盘的形式展现在Grafana仪表盘中。本章还介绍了当系统出现故障时,读者如何将Spring Boot 2.x应用的故障信息以告警的形式发送到邮箱或者钉钉中。本章内容对于广大开发者来说具有一定的实战指导作用。
第4章介绍了与PromQL相关的知识。PromQL是Prometheus实战的核心,是Prometheus场景的基础,也是Prometheus的重中之重。本章用很大的篇幅,从时间序列、PromQL数据类型、指标类型、选择器、聚合操作、二元操作符、内置函数、最佳实践、性能优化等方面,通过理论联系实际的方式,全方位介绍了与PromQL相关的概念及其具体用法。
第5章介绍了PromQL的高级用法。首先介绍了39个PromQL内置函数,然后围绕HTTP API、记录规则、告警规则、metric_relabel_configs、relabel_configs等多个知识点,以理论联系实际、知识点结合案例的形式,全方位介绍了PromQL的高级用法和最佳实践。
第6章介绍了Prometheus的告警模块——Alertmanager。本章围绕Alertmanager告警的架构、工作原理、集群、触发的流程等展开介绍,接着拓展了告警分组、抑制、静默、延迟等众多知识点。读完本章,读者可以轻松理解告警是如何触发的,还可以分析、定位、解决告警轰炸、告警不准确等常见问题。
第7章介绍了Prometheus中与Exporter相关的概念。Exporter的来源主要有两个,一个是社区,另一个是用户自定义。本章从数据规范、数据采集方式、案例代码编写等方面一步步指导读者自定义Exporter。为了帮助读者提高编码水平和真正写好Exporter,本章还给出了写好Exporter的建议,并结合Node Exporter、Redis Exporter、MySQL Exporter、RocketMQ Exporter等的原理进行分析讲解。通过对本章的学习,读者可以掌握使用和定制Exporter的方法。
第8章介绍了与Spring Boot相关的高级话题,帮助读者了解Prometheus集成Spring Boot的原理、源码和解决方案。本章针对Prometheus监控RESTful、监控业务、通过注解进行监控、监控Dubbo这4个真实需求给出了源码级的技术指导方案。对Prometheus集成Spring Boot过程中可能产生的问题,如空指针、极大值、内存溢出等,本章也做了补充分析与解答。
第9章介绍了与Prometheus集群相关的实战内容。本章围绕Prometheus集群实战的架构问题,讨论了多种集群解决方案(简单HA、简单HA+远程存储、简单HA+远程存储+联邦集群)的理念、方法及优化手段,探究如何构建具有更高扩展性和可靠性的集群。本章是实战章节,在采集指标、推广Prometheus在企业中的部署等细节问题上都给出了指导。本章还通过搭建一个基于M3DB的简单HA+远程存储Prometheus K8S集群的真实案例,用步骤引导以及配置文件样例的形式,带领读者实际部署Prometheus集群。
第10章介绍了Prometheus的存储原理。Prometheus不仅是一个监控系统,还是一款优秀的时序数据库。本章主要围绕Prometheus 3.0版本的TSDB本地存储,对存储文件的格式、存储的原理、chunk、索引、block、WAL日志、tombstones、Checkpoint等相关知识点进行介绍,让读者清晰地了解Prometheus存储的运行机制。
第11章介绍了Prometheus的相关技术。本章首先介绍了Prometheus的伴侣——Thanos和M3DB,并对使用这些技术的过程中可能出现的一些问题给出了指导和建议;然后介绍了继承Prometheus理念的Loki,详细介绍了Loki、ELK等相关日志技术的原理和架构方案;最后,介绍了Operator模式和Prometheus Operator模式,以及在实战中针对压测、查找中间件(如Redis问题)等场景应该如何灵活运用Prometheus。
勘误和支持
由于作者的水平有限,书中难免会出现一些错误或者不准确的地方,恳请读者批评指正。为此,我在GitHub网站上专门建了一个Issue项目(https://github.com/CharlesMaster/PrometheusBook/issues),你可以将书中的错误,以及你的疑问、改进建议以GitHub Issue的形式发布在Bug勘误表页面中,我将尽量在线上为你提供最满意的解答。当然,更希望大家通过Issue对Prometheus展开讨论,互相切磋和共同成长。
致谢
首先要感谢伟大的Prometheus,它是一款影响我整个人生的软件。
感谢曾经和我一起致力于研究Prometheus这项技术的领导、同事、朋友,你们投入的时间、精力和智慧为我提供了莫大的帮助。
感谢机械工业出版社华章公司的编辑杨福川老师和孙海亮老师,你们始终支持我的写作,你们的鼓励和帮助引导我顺利完成全部书稿。
最后感谢我的爸爸、妈妈、小姨、姨夫、爷爷、奶奶、外公、外婆,感谢你们将我培养成人,并时时刻刻给予我信心和力量!
谨以此书献给我最亲爱的家人,以及众多热爱Prometheus的朋友们!