Prometheus 的重要性和流行度已经无需多言。直入主题,本文对 Prometheus 监控平台的各个组件做深度讲解,希望能帮助读者更好地理解 Prometheus。

监控系统的核心逻辑

对于一套监控系统而言,核心就是采集数据并存储,然后做告警判定、数据展示分析,这个 专栏文章 详细讲解了这个数据流架构,整个流程图如下:

Prometheus 有多个组件(或者说多个进程),协同工作。下面我们逐个组件做一概述:

  • https://github.com/prometheus/prometheus:这是 prometheus 进程的代码仓库,功能包括抓取远端监控指标、存储时序数据、暴露查询接口支持数据查询、支持告警规则配置并做告警判定
  • https://github.com/prometheus/alertmanager:这是 alertmanager 进程的代码仓库,功能包括接收 prometheus 产生的告警事件,对事件做去重、分组、路由、通知等操作

我把监控系统的流程图给变换一下颜色:

  • prometheus 进程承接了图中蓝色功能,即:采集器、时序库、告警判定引擎
  • alertmanager 进程负责告警事件分发,即图中红色部分
  • 数据展示分析,橙色部分,Prometheus 做的比较少,Prometheus 确实有一个简单的 Web UI,不过比较简陋,一般使用更为强大的 Grafana 来做数据展示分析

大家可能还听过各类 Exporter,难道这些 Exporter 就没有一席之地了么?Exporter 也是很重要的,可以看做是一个适配器,把监控目标的指标暴露出来,让 Prometheus 来抓取。或者把 Exporter 看做是采集器的一部分也行,无伤大雅,理解整个数据流就可以,无需在词汇上纠结。

想象一下,假设你有一个 Application,一个 Go 程序或者 Java Spring Boot 程序,Application 把自身的运行状态指标通过 /metrics 接口暴露出来,Prometheus 直接抓取即可,这里不需要什么 Exporter。但是一些成熟的数据库、中间件,比如 MySQL,Redis,这些软件没有直接暴露 Prometheus 格式的指标,Prometheus 没法直接来抓取,怎么办呢?当然,可以完善 Prometheus 的抓取器,让他不仅可以抓取 HTTP 协议的 /metrics 数据,也可以抓取 MySQL、Redis 等的数据,但是这样的话,Prometheus 代码会变得臃肿,不利于维护。所以,Prometheus 采用了 Exporter 的设计,Exporter 就是一个适配器,使用 Exporter 去抓取这些监控目标的指标,然后暴露为 Prometheus 格式的指标,Prometheus 再去抓取这些 Exporter 暴露的指标。这样做的好处是,Prometheus 代码保持简洁,Exporter 代码可以独立维护,提升整体可维护性。而且 Exporter 可以发动全网力量,让大家共建,一举多得。

但是,Exporter 会有很多不同的进程,水平参差不齐,从部署的角度可能略麻烦,所以市面上也有一些开源项目,把众多 Exporter 整合在一起变成一个进程,比如 Grafana-agent、Cprobe,当然,还有大名鼎鼎的 OpenTelemetry 也是这个思路。

了解了上述知识,我们再来看 Prometheus 官网的架构图。

Prometheus 架构

  • Prometheus Server:是 prometheus 进程的一部分功能,负责数据的抓取、存储、HTTP 接口查询

    • Retrieval:数据抓取,从监控目标那里拉取监控指标,Prometheus 定义了一个标准协议,只要监控目标支持这个协议,Prometheus 就可以抓取
    • TSDB:时序库,Prometheus 会把抓取到的监控指标存储在本地,单点的。如果想要高可用,可以使用 Thanos、VictoriaMetrics 等
    • HTTP server:Prometheus 会暴露 HTTP 接口,供外部查询监控指标
  • Service Discovery:服务发现,是 prometheus 进程的一部分功能,Prometheus 会定期去服务发现组件那里拉取监控目标的列表,省去了手动配置的繁琐,当然,前提是这些监控目标得注册到服务发现组件上
    • Kubernetes SD:基于 Kubernetes 的服务发现机制,比如通过 apiserver 拉取 pod 列表、service 列表作为监控目标
    • File SD:基于文件的服务发现机制,从配置文件中读取监控目标列表
    • HTTP SD:基于 HTTP 的服务发现机制,从 HTTP 接口中读取监控目标列表
    • Consul SD:基于 Consul 的服务发现机制,从 Consul 中读取监控目标列表
    • 等等
  • Pushgateway:是一个单独的进程,用于接收短生命周期的监控指标,比如批处理任务的监控指标,因为批处理任务通常不会暴露 HTTP 接口,Prometheus 就没法拉取了,所以批处理任务需要主动推送监控指标到 Pushgateway,Prometheus 再去拉取 Pushgateway 的监控指标
  • Alertmanager:负责接收 prometheus 产生的告警事件,对事件做去重、分组、路由、通知等操作。如果想要更高阶的收敛、降噪、排班、认领、升级等功能,可以把 Alertmanager 和一些第三方工具结合使用,比如 PagerDuty、FlashDuty、OpsGenie 等
  • Prometheus web UI:prometheus 进程启动之后,会暴露一个简单的 Web UI,可以查看监控指标,但是功能比较简陋,一般使用 Grafana 来做数据展示分析
  • Grafana:是一个独立的进程,不属于 Prometheus 项目的一部分,不过可以和 Prometheus 整合。用于数据展示分析,功能非常强大,支持多种数据源,比如 Prometheus、Elasticsearch、Loki 等,支持多种图表类型,比如折线图、柱状图、饼图、热力图等

Prometheus 架构的问题

主要问题的容量扩展问题。Prometheus 一个进程干了很多事情,部署非常简单,弊端就是单点没法扩展,比如告警引擎是单点、存储是单点、采集是单点,如果体量很大或者对稳定性要求比较高,就需要通过其他手段来解决了。

比如 VictoriaMetrics 项目,就是完全兼容 Prometheus 生态的协议和接口,但是提供了分布式能力。存储使用 vmstorage 进程,查询使用 vmselect 进程,数据接收使用 vminsert,告警使用 vmalert,数据抓取使用 vmagent,组件确实多了,但是每个组件都可以部署多个实例组成集群,提升了整体的可用性和容量。VictoriaMetrics 项目的架构图如下:

或者还有一个办法,就是直接部署多套 Prometheus,比如 DBA 自己用一个 Prometheus,Hadoop 团队自己用一个 Prometheus,这样可以解决容量问题,没法解决数据单点存储问题。如何解决单点问题?双写!比如 DBA 团队,部署两个 Prometheus,采集相同的数据,两个 Prometheus 数据相同,规则相同,告警也会产生两份,可以通过 Alertmanager 做告警去重,这样就解决了单点问题。

Prometheus 规则管理问题

最后一个问题,简单聊聊 Prometheus 的规则管理问题。Prometheus 的规则是通过配置文件定义的,这个配置文件是一个 yaml 文件,里面定义了监控规则、告警规则等。如果一个公司有很多套 Prometheus,规则分散在多个 yaml 中不方便管理,希望能有一套易用的、权限隔离的 UI,把监控能力开放给全公司各个团队并让他们自服务,别啥事都来找监控团队,这个时候就需要一个规则管理系统,比如夜莺(Nightingale)。如果有这方面的痛点可以去了解一下,如果 Prometheus 自身的玩法就感觉够用了,那更好,不用再引入新的组件。

小结

文本详细介绍了 Prometheus 监控平台的各个组件,希望能帮助读者更好地理解 Prometheus。使用任何一个开源项目,都要了解其原理,这样才能了解其最佳实践,出了问题也能有排查思路。切莫只是解决一些表面问题,得过且过,这样是不会有长进的,35岁之后,容易被干。

Prometheus 监控平台组件深度讲解的更多相关文章

  1. 大众点评开源分布式监控平台 CAT 深度剖析

    一.CAT介绍 CAT系统原型和理念来源于eBay的CAL的系统,CAT系统第一代设计者吴其敏在eBay工作长达十几年,对CAL系统有深刻的理解.CAT不仅增强了CAL系统核心模型,还添加了更丰富的报 ...

  2. Prometheus 监控平台的搭建

    1. 环境准备 两台ubuntu 16.04 服务器内网IP 作用 安装软件 172.16.4.11                 监控的服务端                Prometheus( ...

  3. (17)go-micro微服务Prometheus监控

    目录 一 Prometheus监控介绍 1.微服务监控系统promethues介绍 2.微服务监控系统promethues工作流程 二 Prometheus监控重要组件和重要概念 1.微服务监控系统p ...

  4. 容器编排系统K8s之Prometheus监控系统+Grafana部署

    前文我们聊到了k8s的apiservice资源结合自定义apiserver扩展原生apiserver功能的相关话题,回顾请参考:https://www.cnblogs.com/qiuhom-1874/ ...

  5. 建设DevOps统一运维监控平台,全面的系统监控 Zabbix VS Nagios VS Open-Falcon OR Prometheus

    前言 随着Devops.云计算.微服务.容器等理念的逐步落地和大力发展,机器越来越多,应用越来越多,服务越来越微,应用运行基础环境越来多样化,容器.虚拟机.物理机不一而足.面对动辄几百上千个虚拟机.容 ...

  6. 基于Prometheus和Grafana的监控平台 - 环境搭建

    相关概念 微服务中的监控分根据作用领域分为三大类,Logging,Tracing,Metrics. Logging - 用于记录离散的事件.例如,应用程序的调试信息或错误信息.它是我们诊断问题的依据. ...

  7. Docker系列——Grafana+Prometheus+Node-exporter服务器监控平台(一)

    在最近的博文中,都是介绍监控平台的搭建,其实并不难,主要是需要自己动手操作,实践一番就会了. 有天在想,云上的服务器,是不是也可以搭建一个监控平台,所以就捣鼓了一下,不过遗憾的是,使用阿里云开源的插件 ...

  8. Docker 监控平台Prometheus

    Prometheus 是一个强大的监控平台,提供了监控数据搜集.存储.处理.可视化和告警一套完整的解决方案. 官方网站:https://prometheus.io

  9. 基于Prometheus和Grafana的监控平台 - 运维告警

    通过前面几篇文章我们搭建好了监控环境并且监控了服务器.数据库.应用,运维人员可以实时了解当前被监控对象的运行情况,但是他们不可能时时坐在电脑边上盯着DashBoard,这就需要一个告警功能,当服务器或 ...

  10. Docker监控平台prometheus和grafana,监控redis,mysql,docker,服务器信息

    Docker监控平台prometheus和grafana,监控redis,mysql,docker,服务器信息 一.通过redis_exporter监控redis 1.1 下载镜像 1.2 运行服务 ...

随机推荐

  1. 力扣367(java&python)-有效的完全平方数(简单)

    题目: 给定一个 正整数 num ,编写一个函数,如果 num 是一个完全平方数,则返回 true ,否则返回 false . 进阶:不要 使用任何内置的库函数,如  sqrt . 示例 1: 输入: ...

  2. 力扣696(java)-计数二进制子串(简单)

    题目: 给定一个字符串 s,统计并返回具有相同数量 0 和 1 的非空(连续)子字符串的数量,并且这些子字符串中的所有 0 和所有 1 都是成组连续的. 重复出现(不同位置)的子串也要统计它们出现的次 ...

  3. 免费体验!阿里云智能LOGO帮你解决设计难题

    ​简介:超实用!零基础搞定一个高大上的智能logo设计 新年过后,往往是大家一年中士气最足的时候,散去了年末的疲惫和emo,重燃对新一年的热情和希望. 想创业的朋友们同样意气风发,趁着新年的劲头想大干 ...

  4. 双11特刊|十年磨一剑,云原生多模数据库Lindorm 2021双11总结

    ​前言 2021 年,转眼 Lindorm 已经在阿里发展了十年的时间,从基于 HBase 深度改造的 Lindorm 1.0 版本,到全面重构,架构大幅升级的 Lindorm 2.0 版本:从单一的 ...

  5. Hologres揭秘:如何支持超高QPS在线服务(点查)场景

    简介: 本期我们将揭秘Hologres如何支持超高QPS在线服务(点查)场景. Hologres(中文名交互式分析)是阿里云自研的一站式实时数仓,这个云原生系统融合了实时服务和分析大数据的场景,全面兼 ...

  6. 扎克伯格说,Llama3-8B还是太大了,量化、剪枝、蒸馏准备上!

    扎克伯格说,Llama3-8B还是太大了,不适合放到手机中,有什么办法? 量化.剪枝.蒸馏,如果你经常关注大语言模型,一定会看到这几个词,单看这几个字,我们很难理解它们都干了些什么,但是这几个词对于现 ...

  7. netcore5下js请求跨域

    后端代码如下: using Microsoft.AspNetCore.Mvc; using System; using System.Collections.Generic; using System ...

  8. 通过劫持线程arena实现任意地址分配 n1ctf2018_null

    通过劫持线程arena,当堆开了一个线程之后,如果没有做好保护随之的危险也悄然而至 BUU上的n1ctf2018_null很好的说明了这个问题 题目链接:BUUCTF在线评测 (buuoj.cn) 看 ...

  9. linux终端显示git分支的配置

    1.查看现有配置 $ echo $PS1 2.显示git分支 打开./.bashrc文件 添加以下几行命令: git_branch() { git branch 2> /dev/null | s ...

  10. U.2与M.2接口

    U.2接口 U.2接口别称SFF-8639,是由固态硬盘形态工作组(SSD Factor Work Group)推出的接口规范.U.2接口不但能支持SATA-Express(一种PCI-E与SATA混 ...