Prometheus 快速入门

一般我们说 Prometheus,有两种理解,我们平时需要注意识别的,其含义有两种,一是指的 Prometheus 自身,是一个时序数据库;另外一种是指 Prometheus 生态圈,指的是是整体的监控报警的生态圈和解决方案(Prometheus+Grafana+Alertmanager)。

Prometheus 在 2016年加入了 CNCF(Cloud Native Computing Foundation),是继 Kubernetes 之后的第二个托管项目,目前已经毕业,其主要的特点如下:

  • 多维度的数据模型:由指标名称和键/值对标签标识的时间序列数据来组成多维的数据模型。
  • 灵活的查询语言:在 Prometheus 中使用强大的查询语言 PromSQL 来进行查询。
  • 不依赖分布式存储,Prometheus 单个节点也可以直接工作,支持本地存储(TSDB)和远程存储的模式。
  • 服务端采集数据:Prometheus 基于 HTTP pull 方式去对不同的端采集时间序列数据。
  • 客户端主动推送:支持通过 PushGateway 组件主动推送时间序列数据。

Prometheus 生态组件

Prometheus 生态由多个组件共同组成,其中许多组件是可根据实际情况选择的,并且绝大部分由 Go 语言编写,在部署和构建上比较方便,如下:

  • Prometheus Server:Prometheus 服务端,用于收集指标和存储时间序列数据,并提供一系列的查询和设置接口。
  • Client Libraries:客户端库,用于帮助需要监控采集的服务暴露 metrics handler 给 Prometheus server。例如像 例子 中直接调用 promhttp 暴露了一个 metrics 接口。
  • Push Gateway:推送网关,Prometheus 服务端仅支持 HTTP pull 的采集方式,而有一些指存在的时间短,Prometheus 来 pull 前就结束了。又或是该类指标,就是要客户端自行上报的,这时候就可以采用 Push Gateway 的方式,客户端将指标 push 到 Push Gateway,再由 Prometheus Server 从 Pushgateway 上 pull。
  • Exporters:用于暴露已有的第三方服务(HAProxy,StatsD,Graphite)的 metrics 给 Prometheus Server。
  • Alertmanager:用于处理告警,从 Prometheus server 端接收到 alerts 后,会进行去重,分组,然后路由到对应的Receiver,发出报警。
  • Support Tools:各种支持工具。

Prometheus 整体流程图

Prometheus 的整体架构和生态组件组成,如下图所示:

image

Prometheus Server 通过从监控目标中或者间接通过推送网关来拉取监控指标,它在本地存储所有抓取到的样本数据,并对此数据执行一系列规则,以汇总和记录现有数据的新时间序列或生成告警。可以通过 Grafana 或者其他工具来实现监控数据的可视化。

Prometheus 采集的数据存到哪里

Prometheus 所有采集的指标数据在默认的情况下,都保存在本地所内置的时间序列数据库(TSDB)当中,如果需要另外调整,再将 Prometheus 的存储指向改为远程存储即可。

Prometheus 采用在默认情况下使用本地存储,能够一定的便利性,例如:开箱即用、运维方便(不用管)等等。但是也有不少缺点,像是海量数据无法持久化等等问题,因此强烈建议在上到企业级的海量应用时,一定对其进行研讨,适当考虑远程存储。

时序数据库是什么

Prometheus 是时序数据库(Time Series Database),又简称 TSDB。目前在行业中比较出名,流行度较高的时序数据库如下:

image

时序数据库简单来讲,就是将数据按照时间顺序排列,它具有唯一性和可排序性,因此在 Prometheus 的 Metrics 中即使只添加了一个新标签,也会造成破坏,也就是它不再是原本的那个时序数据了。

注:时序数据库是一个比较大的话题,后续会单独开一篇文章讲解,此处仅概要。

Prometheus 远程存储的方案

  • AppOptics: write
  • Azure Data Explorer: read and write
  • Chronix: write
  • Cortex: read and write
  • CrateDB: read and write
  • Elasticsearch: write
  • Gnocchi: write
  • Graphite: write
  • InfluxDB: read and write
  • IRONdb: read and write
  • Kafka: write
  • M3DB: read and write
  • OpenTSDB: write
  • PostgreSQL/TimescaleDB: read and write
  • QuasarDB: read and write
  • SignalFx: write
  • Splunk: read and write
  • TiKV: read and write
  • Thanos: write
  • VictoriaMetrics: write
  • Wavefront: write

数据持久化的意义

  • 数据存储与服务提供应当隔离。
  • 事故、问题的度量指标回溯。
  • 数据挖掘的考虑。
  • 提供给外部的自定义平台进行数据查询等等

安装 Prometheus

Prometheus 是由 Go 语言编写的,因此安装非常的方便,只需要在 DOWNLOAD 中下载对应的 tar.gz 文件。进行如下解压:

$ tar xvfz prometheus-*.tar.gz

就可以看到下述目录:

prometheus
├── LICENSE
├── NOTICE
├── console_libraries
├── consoles
├── data
├── prometheus
├── prometheus.yml
├── prometheus.yml.default
├── promtool
├── rules
└── tsdb

启动 Prometheus:

$ ./prometheus 
...
level=info ts=2020-05-16T07:33:34.138Z caller=main.go:661 msg="Starting TSDB ..."
level=info ts=2020-05-16T07:33:34.139Z caller=web.go:508 component=web msg="Start listening for connections" address=0.0.0.0:9090

默认监听 9090 端口:

image

至此我们就完成了 Prometheus 的基本启动了。

小结

在本章节中,我们快速了解 Prometheus 的基本概念和整体的生态概要,在下一章节起我们将进一步的实操,知行合一。

参考资料