Prometheus是一款基于时序数据库的开源监控告警系统,说起Prometheus则不得不提SoundCloud,这是一个在线音乐分享的平台,类似于做视频分享的YouTube,由于他们在微服务架构的道路上越走越远,出现了成百上千的服务,使用传统的监控系统StatsD和Graphite存在大量的局限性。
于是他们在年开始着手开发一套全新的监控系统。Prometheus的原作者是MattT.Proud,他也是在年加入SoundCloud的,实际上,在加入SoundCloud之前,Matt一直就职于Google,他从Google的集群管理器Borg和它的监控系统Borgmon中获取灵感,开发了开源的监控系统Prometheus,和Google的很多项目一样,使用的编程语言是Go。
很显然,Prometheus作为一个微服务架构监控系统的解决方案,它和容器也脱不开关系。早在年8月9日,EricSchmidt在搜索引擎大会上首次提出了云计算(CloudComputing)的概念,在之后的十几年里,云计算的发展势如破竹。
在年,Pivotal的MattStine又提出了云原生(CloudNative)的概念,云原生由微服务架构、DevOps和以容器为代表的敏捷基础架构组成,帮助企业快速、持续、可靠、规模化地交付软件。
为了统一云计算接口和相关标准,年7月,隶属于Linux基金会的云原生计算基金会(CNCF,CloudNativeComputingFoundation)应运而生。第一个加入CNCF的项目是Google的Kubernetes,而Prometheus是第二个加入的(年)。
目前Prometheus已经广泛用于Kubernetes集群的监控系统中,对Prometheus的历史感兴趣的同学可以看看SoundCloud的工程师TobiasSchmidt在年的PromCon大会上的演讲:TheHistoryofPrometheusatSoundCloud。
一、Prometheus概述我们在SoundCloud的官方博客中可以找到一篇关于他们为什么需要新开发一个监控系统的文章Prometheus:MonitoringatSoundCloud,在这篇文章中,他们介绍到,他们需要的监控系统必须满足下面四个特性:
Amulti-dimensionaldatamodel,sothatdatacanbeslicedanddicedatwill,alongdimensionslikeinstance,service,endpoint,andmethod.
Operationalsimplicity,sothatyoucanspinupamonitoringserverwhereandwhenyouwant,evenonyourlocalworkstation,withoutsettingupadistributedstoragebackendorreconfiguringtheworld.
Scalabledatacollectionanddecentralizedarchitecture,sothatyoucanreliablymonitorthemanyinstancesofyourservices,andindependentteamscansetupindependentmonitoringservers.
Finally,apowerfulquerylanguagethatleveragesthedatamodelformeaningfulalerting(includingeasysilencing)andgraphing(fordashboardsandforad-hocexploration).
简单来说,就是下面四个特性:
多维度数据模型
方便的部署和维护
灵活的数据采集
强大的查询语言
实际上,多维度数据模型和强大的查询语言这两个特性,正是时序数据库所要求的,所以Prometheus不仅仅是一个监控系统,同时也是一个时序数据库。那为什么Prometheus不直接使用现有的时序数据库作为后端存储呢?这是因为SoundCloud不仅希望他们的监控系统有着时序数据库的特点,而且还需要部署和维护非常方便。
纵观比较流行的时序数据库(参见下面的附录),他们要么组件太多,要么外部依赖繁重,比如:Druid有Historical、MiddleManager、Broker、Coordinator、Overlord、Router一堆的组件,而且还依赖于ZooKeeper、Deepstorage(HDFS或S3等),Metadatastore(PostgreSQL或MySQL),部署和维护起来成本非常高。而Prometheus采用去中心化架构,可以独立部署,不依赖于外部的分布式存储,你可以在几分钟的时间里就可以搭建出一套监控系统。
此外,Prometheus数据采集方式也非常灵活。要采集目标的监控数据,首先需要在目标处安装数据采集组件,这被称之为Exporter,它会在目标处收集监控数据,并暴露出一个HTTP接口供Prometheus查询,Prometheus通过Pull的方式来采集数据,这和传统的Push模式不同。
不过Prometheus也提供了一种方式来支持Push模式,你可以将你的数据推送到PushGateway,Prometheus通过Pull的方式从PushGateway获取数据。目前的Exporter已经可以采集绝大多数的第三方数据,比如Docker、HAProxy、StatsD、JMX等等,