Prometheus 架构
Prometheus 的整体架构以及生态系统组件如下图所示:

Prometheus Server 直接从监控目标中或者间接通过推送网关来拉取监控指标,它在本地存储所有抓取到的样本数据,并对此数据执行一系列规则,以汇总和记录现有数据的新时间序列或生成告警。可以通过 Grafana 或者其他工具来实现监控数据的可视化。
Prometheus 生态圈中包含了多个组件,其中许多组件是可选的:
- Prometheus Server:用于
收集和存储时间序列数据。 - Client Library:客户端库,为需要监控的服务
生成相应的 metrics并暴露给 Prometheus server。当 Prometheus server 来 pull 时,直接返回实时状态的 metrics。 - Push Gateway:主要用于短期的 jobs。由于这类 jobs 存在时间较短,可能在 Prometheus 来 pull 之前就消失了。为此,这些 jobs 可以直接向 Prometheus server 端推送它们的 metrics。这种方式主要用于服务层面的 metrics,对于机器层面的 metrices,需要使用 node exporter。
- Exporters: 用于暴露已有的第三方服务的 metrics 给 Prometheus。
- Alertmanager: 从 Prometheus server 端接收到 alerts 后,会进行去除重复数据,分组,并路由到对应的接收方式,发出报警。常见的接收方式有:电子邮件,pagerduty,OpsGenie, webhook 等。
- 一些其他的工具。
Prometheus 的工作流程如下:
- Prometheus 通过配置文件中指定的服务发现方式来确定要拉取监控指标的目标(Target)。
- 接着从要拉取的目标(应用容器和 Pushgateway ),发起 HTTP 请求到特定的端点(Metric Path),将指标持久化至本身的 TSDB 中,TSDB 最终会把内存中的时间序列压缩落到硬盘。
- Prometheus 会定期通过 PromQL 计算设置好的告警规则,决定是否生成告警到 Alertmanager,后者接收到告警后会负责把通知发送到邮件或企业内部群聊中。
Prometheus 的数据模型和核心概念
Prometheus 所采集到的数据被定义为【指标】。存储的数据为【时间序列】,所谓时间序列(或称动态数列)是指将同一统计指标的数值按其发生的时间先后顺序排列而成的数列。而存储的数据库为自带的时序数据库 TSDB。
指标名称和标签
Prometheus 中每一条时间序列由指标名称(Metrics Name)以及一组标签(键值对)唯一标识。其中指标的名称(metric name)可以反映被监控样本的含义(例如,http_requests_total — 表示当前系统接收到的 HTTP 请求总量)
指标名称只能由 ASCII 字符、数字、下划线以及冒号组成,同时必须匹配正则表达式 [a-zA-Z:][a-zA-Z0-9:]*。
标签的名称只能由 ASCII 字符、数字以及下划线组成并满足正则表达式 [a-zA-Z][a-zA-Z0-9]*。其中以 _作为前缀的标签,是系统保留的关键字,只能在系统内部使用。标签的值则可以包含任何 Unicode 编码的字符。
样本
在时间序列中的每一个点称为一个样本(sample),样本由以下三部分组成:
- 指标(metric):指标名称和描述当前样本特征的 labelsets;
- 样本值(value):一个 float64 的浮点型数据表示当前样本的值。
- 时间戳(timestamp):一个精确到毫秒的时间戳;
指标类型
Prometheus 的客户端库中提供了四种核心的指标类型。
- Counter:代表一种样本数据单调递增的指标,即只增不减,通常用来统计如服务的请求数,错误数等。
- Gauge:代表一种样本数据可以任意变化的指标,即可增可减,通常用来统计如服务的 CPU 使用值,内存占用值等。
- Histogram 和 Summary:用于表示一段时间内的数据采样和点分位图统计结果,通常用来统计请求耗时或响应大小等。
Flink 度量类型映射到 Prometheus 度量类型如下:
| Flink | Prometheus |
|---|---|
| Counter | Counter |
| Gauge | Gauge |
| Histogram | Histogram |
| Meter | Summary |
Flink 平台监控系统架构
我们先来看一下整体的监控架构:
这里面有几个核心的组件:
- Flink App :这是我们需要监控的数据来源
- Pushgateway + nodeManger : 都是 Prometheus 生态中的组件,pushGateway 服务收集 Flink 的指标,nodeMnager 负责监控运行机器的状态
- Prometheus : 我们监控系统的主角
- Grafana:可视化展示
准备服务器环境
- 为了能够让 Prometheus 安全地运行在我们的服务器上,我们首先要为 Prometheus、Node Exporter 和 Pushgateway 创建一个不含登录权限的用户。可使用 —no-create-home 参数避免创建用户根目录,使用 —shell /usr/sbin/nologin 来禁止用户打开 Shell。
sudo useradd --no-create-home --shell /usr/sbin/nologin prometheussudo useradd --no-create-home --shell /bin/false node_exportersudo useradd --no-create-home --shell /bin/false pushgateway
- 创建目录,用于存储 Prometheus 可执行文件以及其配置:
sudo mkdir /etc/prometheussudo mkdir /var/lib/prometheus
- 设置以上目录的拥有者为 prometheus 用户,确保 Prometheus 有权限访问这些文件夹。
sudo chown prometheus:prometheus /etc/prometheussudo chown prometheus:prometheus /var/lib/prometheus
下载并安装 Node Exporter
由于 Prometheus 仅具备采集系统指标的功能,因此我们需要通过 Node Exporter 来扩展它的能力。Node Exporter 是一款收集系统 CPU、磁盘、内存用量信息并将它们公开以供抓取的工具。
- 下载并解压 Node Exporter 的最新版本。
wget https://github.com/prometheus/node_exporter/releases/download/v1.3.1/node_exporter-1.3.1.linux-amd64.tar.gztar xvf node_exporter-1.3.1.linux-amd64.tar.gz
- 复制其中的可执行文件到 /usr/local/bin 目录下,并将其拥有者设为上文创建的 node_exporter 用户:
sudo cp node_exporter-1.3.1.linux-amd64/node_exporter /usr/local/binsudo chown node_exporter:node_exporter /usr/local/bin/node_exporter
- 为了让 Node Exporter 能够跟随系统自动启动,我们需要创建一个 Systemd 服务。例如使用 vi 编辑器创建该服务文件:
sudo vi /etc/systemd/system/node_exporter.service
- 将以下内容复制到文件内,保存并退出。
[Unit]Description=Node ExporterWants=network-online.targetAfter=network-online.target[Service]User=node_exporterGroup=node_exporterType=simpleExecStart=/usr/local/bin/node_exporter[Install]WantedBy=multi-user.target
- 启动 Node Exporter,并设置开机自启动:
sudo systemctl daemon-reloadsudo systemctl start node_exportersudo systemctl enable node_exporter
- 验证服务是否正在运行并提供指标:
sudo systemctl status node_exporter
Node Exporter 使用 9100 端口上报自己的指标
curl localhost:9100/metrics
下载并安装 Pushgateway
- 下载并解压 Pushgateway 的最新版本。
wget https://github.com/prometheus/pushgateway/releases/download/v1.4.2/pushgateway-1.4.2.linux-amd64.tar.gztar xfz pushgateway-1.4.2.linux-amd64.tar.gz
- 复制其中的可执行文件到 /usr/local/bin 目录下,并将其拥有者设为上文创建的 pushgateway 用户:
sudo cp pushgateway-1.4.2.linux-amd64/pushgateway /usr/local/binsudo chown pushgateway:pushgateway /usr/local/bin/pushgateway
- 为了让 Pushgateway 能够跟随系统自动启动,我们需要创建一个 Systemd 服务。例如使用 vi 编辑器创建该服务文件:
sudo vi /etc/systemd/system/pushgateway.service
- 将以下内容复制到文件内,保存并退出。
[Unit]Description=Prometheus PushgatewayWants=network-online.targetAfter=network-online.target[Service]User=pushgatewayGroup=pushgatewayType=simpleExecStart=/usr/local/bin/pushgateway[Install]WantedBy=multi-user.target
- 启动 Pushgateway,并设置开机自启动:
sudo systemctl daemon-reloadsudo systemctl enable pushgatewaysudo systemctl start pushgateway
- 验证服务是否正在运行并提供指标:
sudo systemctl status pushgateway
Pushgateway 使用 9091 端口上报自己的指标
curl localhost:9091/metrics
下载并安装 Flink
- 安装 OpenJDK。
sudo apt updatesudo apt install default-jdk
- 下载并解压 Flink 的最新版本。
wget https://mirrors.aliyun.com/apache/flink/flink-1.14.3/flink-1.14.3-bin-scala_2.12.tgztar xfz flink-1.14.3-bin-scala_2.12.tgzcd flink-1.14.3
- 编辑
flink-conf.yaml配置。
sudo vi ./conf/flink-conf.yaml
- 将以下内容复制到文件末尾,保存并退出。
metrics.reporter.promgateway.class: org.apache.flink.metrics.prometheus.PrometheusPushGatewayReportermetrics.reporter.promgateway.host: localhostmetrics.reporter.promgateway.port: 9091metrics.reporter.promgateway.jobName: flinkJobmetrics.reporter.promgateway.randomJobNameSuffix: truemetrics.reporter.promgateway.deleteOnShutdown: falsemetrics.reporter.promgateway.groupingKey: k1=v1;k2=v2metrics.reporter.promgateway.interval: 5 SECONDS
PrometheusPushGatewayReporter 将指标推送到 Pushgateway,Prometheus 可以对 Pushgateway 进行抓取。
host 需要配置为 PushGateway 服务的 IP,port 需要为配置 PushGateway 服务的端口。
- 启动 Flink 集群(其他部署模式也是一样的)
./bin/start-cluster.sh
- 提交 Job
./bin/flink run ./examples/streaming/TopSpeedWindowing.jar
- 验证 Flink 是否将指标推送到 Pushgateway:
curl localhost:9091/metrics
此时会增加 JobManager 和 TaskManager 相关的指标。
下载并安装 Prometheus
- 下载并解压 Prometheus 的最新版本。
sudo apt-get update && apt-get upgradewget https://github.com/prometheus/prometheus/releases/download/v2.33.3/prometheus-2.33.3.linux-amd64.tar.gztar xfz prometheus-*.tar.gzcd prometheus-*/
该目录内包含以下两个可执行文件:
- prometheus - Prometheus 主程序
- promtool
以下两个子目录包含了 Web 接口、示例配置:
- consoles
- console_libraries
Prometheus 的配置文件使用 YAML 格式,严格禁止使用 Tabs:
- prometheus.yml
prometheus.yml 配置文件看起来应当类似:
global:scrape_interval: 15sevaluation_interval: 15srule_files:# - "first.rules"# - "second.rules"scrape_configs:- job_name: 'prometheus'scrape_interval: 5sstatic_configs:- targets: ['localhost:9090']
Prometheus 的配置文件分为三个部分:global、rule_files 和 scrape_configs。
- 在
global部分内,可以找到一些通用配置:scrape_interval用于设置 Prometheus 多久抓取一次目标(Targets),evaluation_interval用于设置多久计算一次规则(Rules)。而规则用于控制存储预先计算的数据,以及何时生成告警(Alert)。 - 在
rule_files部分内,包含了 Prometheus 加载的规则文件路径。 - 在
scrape_configs部分内,包含了 Prometheus 监控的资源信息。
- 复制其中的可执行文件到 /usr/local/bin 目录下,并将其拥有者设为上文创建的 prometheus 用户:
sudo cp ./prometheus /usr/local/bin/sudo cp ./promtool /usr/local/bin/sudo chown prometheus:prometheus /usr/local/bin/prometheussudo chown prometheus:prometheus /usr/local/bin/promtool
- 复制 console 和 console_libraries 目录到 /etc/prometheus,并将其目录及其子目录和文件的拥有者设为上文创建的 prometheus 用户:
sudo cp -r ./consoles /etc/prometheussudo cp -r ./console_libraries /etc/prometheussudo chown -R prometheus:prometheus /etc/prometheus/consolessudo chown -R prometheus:prometheus /etc/prometheus/console_libraries
- 复制 prometheus.yml 到 /etc/prometheus,并将其拥有者设为上文创建的 prometheus 用户:
sudo cp -r ./prometheus.yml /etc/prometheus
- 直接使用以下命令启动 Prometheus 即可,该命令将会以 prometheus 用户的身份运行。
sudo -u prometheus /usr/local/bin/prometheus --config.file /etc/prometheus/prometheus.yml --storage.tsdb.path /var/lib/prometheus/ --web.console.templates=/etc/prometheus/consoles --web.console.libraries=/etc/prometheus/console_libraries
接着,你会看到一些状态输出,以及服务已启动的信息:
level=info ts=2018-04-12T11:56:53.084000977Z caller=main.go:220 msg="Starting Prometheus" version="(version=2.2.1, branch=HEAD, revision=bc6058c81272a8d938c05e75607371284236aadc)"level=info ts=2018-04-12T11:56:53.084463975Z caller=main.go:221 build_context="(go=go1.10, user=root@149e5b3f0829, date=20180314-14:15:45)"level=info ts=2018-04-12T11:56:53.084632256Z caller=main.go:222 host_details="(Linux 4.4.127-mainline-rev1 #1 SMP Sun Apr 8 10:38:32 UTC 2018 x86_64 scw-041406 (none))"level=info ts=2018-04-12T11:56:53.084797692Z caller=main.go:223 fd_limits="(soft=1024, hard=65536)"level=info ts=2018-04-12T11:56:53.09190775Z caller=web.go:382 component=web msg="Start listening for connections" address=0.0.0.0:9090level=info ts=2018-04-12T11:56:53.091908126Z caller=main.go:504 msg="Starting TSDB ..."level=info ts=2018-04-12T11:56:53.102833743Z caller=main.go:514 msg="TSDB started"level=info ts=2018-04-12T11:56:53.103343144Z caller=main.go:588 msg="Loading configuration file" filename=/etc/prometheus/prometheus.ymllevel=info ts=2018-04-12T11:56:53.104047346Z caller=main.go:491 msg="Server is ready to receive web requests."
如果启动 Prometheus 服务时有错误信息输出,请再次确认配置文件是否存在语法错误。错误信息将会指明应当如何检查。
- 此时 Prometheus 已经能够正常工作,为了让 Prometheus 能够跟随系统自动启动,我们需要创建一个 Systemd 服务。例如使用 vi 编辑器创建该服务文件:
sudo vi /etc/systemd/system/prometheus.service
- 将以下内容复制到文件内,保存并退出。
[Unit]Description=Prometheus MonitoringWants=network-online.targetAfter=network-online.target[Service]User=prometheusGroup=prometheusType=simpleExecStart=/usr/local/bin/prometheus \--config.file /etc/prometheus/prometheus.yml \--storage.tsdb.path /var/lib/prometheus/ \--web.console.templates=/etc/prometheus/consoles \--web.console.libraries=/etc/prometheus/console_librariesExecReload=/bin/kill -HUP $MAINPID[Install]WantedBy=multi-user.target
- 启动 Prometheus,并设置开机自启动:
sudo systemctl daemon-reloadsudo systemctl enable prometheussudo systemctl start prometheus
- 验证服务是否正在运行并提供指标:
sudo systemctl status prometheus
Prometheus 使用 9090 端口上报自己的指标
curl localhost:9090/metrics
- 可通过 http://your.server.ip:9090 访问 Web 服务,并查询其收集到的数据。通过点击 Status,然后再点击 Targets 可以查看抓取的目标, 可以看到目前只有 prometheus。

可通过 http://your.server.ip:9090/metrics 查看 prometheus 的指标。

使用 Prometheus 监控 Node Exporter
- 编辑 Prometheus 配置
sudo vi /etc/prometheus/prometheus.yml
- Prometheus 将会抓取在 scrape_configs 内定义的 Exporter,因此我们需要将 Node Exporter 添加至该文件,就像上文中监控 Prometheus 自己一样。
- job_name: 'node_exporter'scrape_interval: 5sstatic_configs:- targets: ['localhost:9100']
如上,我们覆盖了 scrape_interval 配置并设置为 5 秒。并且 Node Exporter 与 Prometheus 运行在同一个服务器,所以我们可以直接使用 localhost 以及 Node Exporter 的默认端口:9100。
若是从外部服务器抓取数据,你需要使用远程服务器的 IP 地址替换 localhost。
- 重启 Prometheus 以加载新配置:
sudo systemctl restart prometheus
- 查看抓取的目标, 可以看到抓取的目标多了一个 node_exporter

使用 Prometheus 监控 Pushgateway
- 编辑 Prometheus 配置
sudo vi /etc/prometheus/prometheus.yml
- 我们需要将 Pushgateway 添加至该文件,就像上文中监控 Node Exporter 自己一样。
- job_name: 'pushgateway'scrape_interval: 5sstatic_configs:- targets: ['localhost:9091']
若是从外部服务器抓取数据,你需要使用远程服务器的 IP 地址替换 localhost。
- 重启 Prometheus 以加载新配置:
sudo systemctl restart prometheus
- 查看抓取的目标, 可以看到抓取的目标多了一个 pushgateway

下载并安装 Grafana
- 下载并安装 Grafana。
wget https://dl.grafana.com/oss/release/grafana_8.4.1_amd64.debsudo apt-get install -y adduser libfontconfig1sudo dpkg -i grafana_8.4.1_amd64.deb
- 使用
systemd开启 Grafana 的开机自启动。
sudo systemctl daemon-reload && sudo systemctl enable grafana-server && sudo systemctl start grafana-server
Grafana 已经开始运行,我们可以通过 http://your.server.ip:3000 访问。默认的用户名和密码是 admin/admin。登录的时候会提醒修改 admin 用户的密码。

- 现在你需要创建一个数据源(Data Source),也就是 Prometheus:


- 点击 「齿轮图标」,然后在 Configuration下,点击「Data Sources」。
- 点击「Add data source」。
- 选择「Prometheus」作为数据源并点击。
- 设置 Prometheus 服务的 URL(在本例中为:http://localhost:9090)。
- 点击 「Save & test」即可测试连接并保存为新的数据源。
- 现在你可以创建第一个看板(Dashboard)用于展示 Prometheus 收集到的信息了。这里我们会从共享看板集合导入一些现成的看板
- 添加 Node Exporter 看板
- 点击 「+ 」打开,然后点击「Import」。

- 复制 https://grafana.com/grafana/dashboards/1860 并点击 Load

- 选择「Prometheus」作为数据源并点击 Import。


- 添加 Flink 看板
- 点击 「+ 」打开,然后点击「Import」。

- 复制 https://grafana.com/grafana/dashboards/14911 并点击 Load

- 选择「Prometheus」作为数据源并点击 Import。


参考
基于 Prometheus+Grafana 打造企业级 Flink 监控系统
Installing Prometheus Pushgateway
Configure a Prometheus monitoring server with a Grafana dashboard
