导航
导航

prometheus知识

Prometheus 一款时序型数据库,谷歌开发的一个开源监控软件。

与Nagios、Zabbix、Ganglia、Open-Falcon等很多监控系统相比,Prometheus最主要的特色有4个:

  • 通过PromQL实现多维度数据模型的灵活查询。
  • 定义了开放指标数据的标准,自定义探针(如Exporter等),编写简单方便。
  • PushGateway组件让这款监控系统可以接收监控数据。
  • 提供了VM和容器化的版本。

尤其是第一点,这是很多监控系统望尘莫及的。多维度的数据模型和灵活的查询方式,使监控指标可以关联到多个标签,并对时间序列进行切片和切块,以支持各种图形、表格和告警场景。

除了上述4种特色之外,Prometheus还有如下特点:

  • Go语言编写,拥抱云原生。
  • 采用拉模式为主、推模式为辅的方式采集数据。
  • 二进制文件直接启动,也支持容器化部署镜像。
  • 支持多种语言的客户端,如Java、JMX、Python、Go、Ruby、.NET、Node.js等语言。
  • 支持本地和第三方远程存储,单机性能强劲,可以处理上千target及每秒百万级时间序列。
  • 高效的存储。平均一个采样数据占3.5B左右,共320万个时间序列,每30秒采样一次,如此持续运行60天,占用磁盘空间大约为228GB(有一定富余量,部分要占磁盘空间的项目未在这里列出)。
  • 可扩展。可以在每个数据中心或由每个团队运行独立Prometheus Server。也可以使用联邦集群让多个Prometheus实例产生一个逻辑集群,当单实例Prometheus Server处理的任务量过大时,通过使用功能分区(sharding)+联邦集群(federation)对其进行扩展。
  • 出色的可视化功能。Prometheus拥有多种可视化的模式,比如内置表达式浏览器、Grafana集成和控制台模板语言。它还提供了HTTP查询接口,方便结合其他GUI组件或者脚本展示数据。
  • 精确告警。Prometheus基于灵活的PromQL语句可以进行告警设置、预测等,另外它还提供了分组、抑制、静默等功能防止告警风暴。
  • 支持静态文件配置和动态发现等自动发现机制,目前已经支持了Kubernetes、etcd、Consul等多种服务发现机制,这样可以大大减少容器发布过程中手动配置的工作量。
  • 开放性。Prometheus的client library的输出格式不仅支持Prometheus的格式化数据,还可以在不使用Prometheus的情况下输出支持其他监控系统(比如Graphite)的格式化数据。

Prometheus也存在一些局限性,主要包括如下方面:

  • Prometheus主要针对性能和可用性监控,不适用于针对日志(Log)、事件(Event)、调用链(Tracing)等的监控。
  • Prometheus关注的是近期发生的事情,而不是跟踪数周或数月的数据。因为大多数监控查询及告警都针对的是最近(通常不到一天)的数据。Prometheus认为最有用的数据是最近的数据,监控数据默认保留15天。
  • 本地存储有限,存储大量的历史数据需要对接第三方远程存储。
  • 采用联邦集群的方式,并没有提供统一的全局视图。
  • Prometheus的监控数据并没有对单位进行定义。
  • Prometheus对数据的统计无法做到100%准确,如订单、支付、计量计费等精确数据监控场景。
  • Prometheus默认是拉模型,建议合理规划网络,尽量不要转发。

Prometheus主要由Prometheus Server、Pushgateway、Job/Exporter、Service Discovery、Alertmanager、Dashboard这6个核心模块构成。Prometheus通过服务发现机制发现target,这些目标可以是长时间执行的Job,也可以是短时间执行的Job,还可以是通过Exporter监控的第三方应用程序。被抓取的数据会存储起来,通过PromQL语句在仪表盘等可视化系统中供查询,或者向Alertmanager发送告警信息,告警会通过页面、电子邮件、钉钉信息或者其他形式呈现。