Prometheus监控平台的部署与监控
1. Prometheus简介
Prometheus是一个开源的系统监控和报警系统,在2012年由SoundCloud创建,并于2015年正式发布
2016年,Prometheus项目正式加入CNCF基金会,成为继kubernetes之后第二个在CNCF托管的项目,现在已经广泛用于容器和微服务领域
Prometheus本身是基于go开发的一套开源的系统监控报警框架和时序数据库(TSDB)
Prometheus的监控功能很完善和全面,性能支持上万规模的集群
Prometheus网站:https://prometheus.io/
Prometheus官网文档:https://prometheus.io/docs
Prometheus代码仓库:https://github.com/prometheus
Prometheus中文文档:https://www.prometheus.wang
Prometheus exporters:https://prometheus.io/docs/instrumenting/exporters/
Prometheus exporter golang客户端库:https://github.com/prometheus/client_golang
Prometheus的特点如下:
- 支持多维数据模型:由度量名和键值对组成的时间序列数据
- 内置时间序列数据库TSDB
- 支持PromQL(Prometheus Query Language)查询语言,可以完成非常复杂的查询和分析,对图表展示和告警非常有意义
- 支持HTTP的PULL方式采集时间序列数据
- 支持PushGateway采集瞬时任务的数据
- 支持服务发现和静态配置两种方式发现目标
- 多种可视化和仪表盘,支持第三方dashboard,比如Grafana
数据特点:
- 监控指标,采用独创的指标格式,我们称之为Prometheus格式,这个格式在监控场景中非常常见
- 数据标签,支持多维度标签,每个独立的标签组合都代表一个独立的时间序列
- 数据处理,Prometheus内部支持多种数据的聚合、切割、切片等功能
- 数据存储,Prometheus支持双精度浮点型数据存储
适用场景:
Prometheus非常适合记录任何纯数字时间序列。它既适合以机器为中心的监控场景,又适合高度动态的面向服务的体系结构的监控场景
在微服务场景中,它对多维数据收集和查询的支持是一种特别的优势
Prometheus的设计旨在提升可用性,使其省委中断期间要使用的系统,以快速诊断问题
每个Prometheus服务器都是独立的,而不依赖于网络存储或其他远程服务
2. Prometheus架构介绍
Prometheus监控是一个监控体系,而Prometheus server只包含Retrieval、TSDB、HTTP server三个组件
Prometheus的主要模块包括:Prometheus server、exporters、PushGateway、PromQL、Alertmanager以及图形化界面
主要组件:
- Prometheus:时序数据存储、监控指标管理
- 可视化:Prometheus webUI、Grafana可视化套件
- 数据采集:exporters为当前客户端暴露出符合Prometheus规格的数据指标、PushGateway为push模式下的数据采集工具
- 监控目标:服务发现,包括文件方式、DNS方式、console方式、kubernetes方式
- 告警:Alertmanager
其中TSDB支持存储60天的数据,如果想要永久存储监控数据的话需要增加一个时序数据库后端,比较典型的是InfluxDB
Retrival负责获取监控数据,也就是Prometheus targets,通常采用的是pull模式
2.1 pull与push
本质上来讲Prometheus只支持pull的方式来获取监控数据
那么push又从何而来的呢?对于一些瞬时任务,比如一个存在时间极短的job,pull的方式显然是不太能够抓取到这些数据的
Prometheus所采用的方式就是部署一个PushGateway,job在执行完成之后将数据push到这个网关代理,而Prometheus将从PushGateway中pull数据
pull模式的特点:
- 被监控方提供一个server,并负责维护
- 监控方控制采集频率
第一点对用户来说要求更高了,但是好处很多,比如pull不到数据本身就说明节点存在故障;比如监控指标自然而然由用户自己维护,使得标准化很简单
第二点更为重要,那就是在监控体系对metric采集的统一和稳定有了可靠的保证,对于数据量大的情况下很重要
同样pull模式的缺点在于需要服务发现模块来动态发现被监控对象,同时被监控方和Prometheus可能存在数据维护不同步的情况,造成一定的信息丢失和不准确
3. Prometheus数据模型
Prometheus中存储的数据为时间序列,即基于同一度量标准或者同一时间维度的数据流
除了时间序列数据的正常存储外,Prometheus还会基于原始数据临时生成新的时间序列数据,用于后续查询的依据或结果
每个时间序列都是由metric名称和标签(可选键值对)组成的唯一标识
3.1 metric
- 该名字必须有意义,用于表示metric的一般性功能,例如:http_requests_total表示http请求的总数
- metric名字由ASCII字符、数字、下划线和冒号组成,且必须满足正则表达式a-zA-Z:*的查询请求
- 注意:冒号是为用户自定义的记录规则保留的
3.2 标签
- 标签是以键值对的形式存在的,不同的标签用于表示时间序列的不同维度标识
- 基本格式:
<metric name>{<label name>=<label value>, ...}
# 示例
http_requests_total{method="POST", endpoint="/api/tracks"}
# 解析:
# http_requests_total{method="POST"}表示所有http请求中的POST请求
# endpoint="/api/tracks"表示请求的url地址是/api/tracks
- 标签中的key由ASCII字符、数字以及下划线组成,且必须要满足正则表达式a-zA-Z:*
- 标签值可以包含任何Unicode字符,标签值为空被认为等同于不存在的标签
查询语言允许基于这些维度进行过滤和聚合
更改任何标签值,包括添加或删除标签,都会创建一个新的时间序列
4. Prometheus部署
4.1 常用的部署方式
包安装
RHEL系统:https://packagecloud.io/app/prometheus-rpm/release/search
Ubuntu和Debian可直接使用apt命令安装
二进制安装
https://prometheus.io/download/
docker安装
https://prometheus.io/docs/prometheus/latest/installation/
k8s operator安装
https://github.com/coreos/kube-prometheus
4.2 docker部署 Prometheus
$ docker run -d --name prometheus -p 9090:9090 prom/prometheus
镜像拉取成功后可以查看 Prometheus是否正在运行
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7bb063c228ed prom/prometheus "/bin/prometheus --c…" 5 seconds ago Up 3 seconds 0.0.0.0:9090->9090/tcp, :::9090->9090/tcp prometheus
访问ip+9090就可以打开Prometheus的webUI
访问ip+9090/metrics可以看到Prometheus拉取的监控指标数据
4.2 二进制部署Prometheus
$ cd /usr/local
$ wget https://github.com/prometheus/prometheus/releases/download/v2.19.2/prometheus-2.19.2.linux-amd64.tar.gz
$ tar xvf prometheus-2.19.2.linux-amd64.tar.gz
$ ln -s prometheus-2.19.2.linux-amd64 prometheus
$ cd prometheus/
$ mkdir bin conf data
$ mv prometheus promtool bin/
$ mv prometheus.yml conf/
$ useradd -r -s /sbin/nologin prometheus
$ chown -R prometheus.prometheus /usr/loacl/prometheus/
将Prometheus添加到环境变量
$ cat /etc/profile.d/prometheus.sh
$ export PROMETHEUS_HOME=/usr/local/prometheus
$ export PATH=${PROMETHEUS_HOME}/bin:$PATH
$ source /etc/profile.d/prometheus.sh
查看配置文件,默认可不修改
$ grep -Ev "^ *#|^$" /usr/local/prometheus/conf/prometheus.yml
global:
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
alerting:
alertmanagers:
- static_configs:
- targets:
rule_files:
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
检查配置文件是否正确
$ promtool check config /usr/local/prometheus/conf/prometheus.yml
Checking /usr/local/prometheus/conf/prometheus.yml
SUCCESS: 0 rule files found
创建service文件
$ vim /lib/systemd/system/prometheus.service
[Unit]
Description=Prometheus Server
Documentation=https://prometheus.io/docs/introduction/overview/
After=network.target
[Service]
Restart=on-failure
User=prometheus
WorkingDirectory=/usr/local/prometheus/
ExecStart=/usr/local/prometheus/prometheus --config.file=/usr/local/prometheus/conf/prometheus.yml
ExecReload=/bin/kill -HUP $MAINPID
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
启动Prometheus server
$ systemctl daemon-reload
$ systemctl enable --now prometheus.service
$ ss -tnlp | grep prometheus
再次访问ip:9090就可以看到Prometheus的webUI界面
以上安装步骤都会放在一个脚本里执行:
install_prometheus.sh
#!/bin/bash
#
#********************************************************************
#Date: 2022-05-20
#FileName: install_prometheus.sh
#Description: The test script
#Copyright (C): 2022 All rights reserved
#********************************************************************
PROMETHEUS_VERSION=2.34.0
#PROMETHEUS_VERSION=2.17.1
PROMETHEUS_FILE="prometheus-${PROMETHEUS_VERSION}.linux-amd64.tar.gz"
INSTALL_DIR=/usr/local
HOST=`hostname -I|awk '{print $1}'`
. /etc/os-release
msg_error() {
echo -e "\033[1;31m$1\033[0m"
}
msg_info() {
echo -e "\033[1;32m$1\033[0m"
}
msg_warn() {
echo -e "\033[1;33m$1\033[0m"
}
color () {
RES_COL=60
MOVE_TO_COL="echo -en \\033[${RES_COL}G"
SETCOLOR_SUCCESS="echo -en \\033[1;32m"
SETCOLOR_FAILURE="echo -en \\033[1;31m"
SETCOLOR_WARNING="echo -en \\033[1;33m"
SETCOLOR_NORMAL="echo -en \E[0m"
echo -n "$1" && $MOVE_TO_COL
echo -n "["
if [ $2 = "success" -o $2 = "0" ] ;then
${SETCOLOR_SUCCESS}
echo -n $" OK "
elif [ $2 = "failure" -o $2 = "1" ] ;then
${SETCOLOR_FAILURE}
echo -n $"FAILED"
else
${SETCOLOR_WARNING}
echo -n $"WARNING"
fi
${SETCOLOR_NORMAL}
echo -n "]"
echo
}
install_prometheus () {
if [ ! -f ${PROMETHEUS_FILE} ] ;then
wget https://github.com/prometheus/prometheus/releases/download/v${PROMETHEUS_VERSION}/${PROMETHEUS_FILE} || \
{ color "下载失败!" 1 ; exit ; }
fi
[ -d $INSTALL_DIR ] || mkdir -p $INSTALL_DIR
tar xf ${PROMETHEUS_FILE} -C $INSTALL_DIR
cd $INSTALL_DIR && ln -s prometheus-${PROMETHEUS_VERSION}.linux-amd64 prometheus
mkdir -p $INSTALL_DIR/prometheus/{bin,conf,data}
cd $INSTALL_DIR/prometheus && { mv prometheus promtool bin/ ; mv prometheus.yml conf/; }
useradd -r -s /sbin/nologin prometheus
chown -R prometheus.prometheus ${INSTALL_DIR}/prometheus/
cat > /etc/profile.d/prometheus.sh <<EOF
export PROMETHEUS_HOME=${INSTALL_DIR}/prometheus
export PATH=\${PROMETHEUS_HOME}/bin:\$PATH
EOF
}
prometheus_service () {
cat > /lib/systemd/system/prometheus.service <<EOF
[Unit]
Description=Prometheus Server
Documentation=https://prometheus.io/docs/introduction/overview/
After=network.target
[Service]
Restart=on-failure
User=prometheus
WorkingDirectory=${INSTALL_DIR}/prometheus
ExecStart=${INSTALL_DIR}/prometheus/bin/prometheus --config.file=${INSTALL_DIR}/prometheus/conf/prometheus.yml
ExecReload=/bin/kill -HUP $MAINPID
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now prometheus.service
}
start_prometheus() {
systemctl is-active prometheus
if [ $? -eq 0 ];then
echo
color "Prometheus 安装完成!" 0
echo "-------------------------------------------------------------------"
echo -e "访问链接: \c"
msg_info "http://$HOST:9090/"
else
color "Prometheus 安装失败!" 1
exit
fi
}
install_prometheus
prometheus_service
start_prometheus
5. Node exporter部署
安装node exporter用于收集各k8s节点上的监控指标数据,监听端口为9100
官方下载:https://prometheus.io/download/
5.1 下载并解压
$ wget -P /usr/local/ https://github.com/prometheus/node_exporter/releases/download/v1.2.2/node_exporter-1.2.2.linux-amd64.tar.gz
$ cd /usr/local
$ tar xvf node_exporter-1.2.2.linux-amd64.tar.gz
$ ln -s node_exporter-1.2.2.linux-amd64 node_exporter
$ cd node_exporter
$ mkdir bin
$ mv node_exporter bin/
5.2 准备service文件
$ vim /lib/systemd/system/node_exporter.service
[Unit]
Description=Prometheus Node Exporter
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/node_exporter/bin/node_exporter
Restart=on-failure
[Install]
WantedBy=multi-user.target
5.3 启动exporter服务
$ systemctl daemon-reload
$ systemctl enable --now node_exporter.service
$ systemctl is-active node_exporter
$ ss -ntlp | grep node_exporter
node_exporter默认在9100端口服务,浏览器访问ip:9100可以看到node_exporter收集到的metric数据
以上步骤会放在一个脚本中执行:
install_node_exporter.sh
#!/bin/bash
#
#********************************************************************
#Date: 2022-05-20
#FileName: install_node_exporter.sh
#Description: The test script
#Copyright (C): 2022 All rights reserved
#********************************************************************
NODE_EXPORTER_VERSION=1.3.1
NODE_EXPORTER_FILE="node_exporter-${NODE_EXPORTER_VERSION}.linux-amd64.tar.gz"
INSTALL_DIR=/usr/local
HOST=`hostname -I|awk '{print $1}'`
. /etc/os-release
msg_error() {
echo -e "\033[1;31m$1\033[0m"
}
msg_info() {
echo -e "\033[1;32m$1\033[0m"
}
msg_warn() {
echo -e "\033[1;33m$1\033[0m"
}
color () {
RES_COL=60
MOVE_TO_COL="echo -en \\033[${RES_COL}G"
SETCOLOR_SUCCESS="echo -en \\033[1;32m"
SETCOLOR_FAILURE="echo -en \\033[1;31m"
SETCOLOR_WARNING="echo -en \\033[1;33m"
SETCOLOR_NORMAL="echo -en \E[0m"
echo -n "$1" && $MOVE_TO_COL
echo -n "["
if [ $2 = "success" -o $2 = "0" ] ;then
${SETCOLOR_SUCCESS}
echo -n $" OK "
elif [ $2 = "failure" -o $2 = "1" ] ;then
${SETCOLOR_FAILURE}
echo -n $"FAILED"
else
${SETCOLOR_WARNING}
echo -n $"WARNING"
fi
${SETCOLOR_NORMAL}
echo -n "]"
echo
}
install_node_exporter () {
if [ ! -f ${NODE_EXPORTER_FILE} ] ;then
wget https://github.com/prometheus/node_exporter/releases/download/v${NODE_EXPORTER_VERSION}/${NODE_EXPORTER_FILE} || \
{ color "下载失败!" 1 ; exit ; }
fi
[ -d $INSTALL_DIR ] || mkdir -p $INSTALL_DIR
tar xf ${NODE_EXPORTER_FILE} -C $INSTALL_DIR
cd $INSTALL_DIR && ln -s node_exporter-${NODE_EXPORTER_VERSION}.linux-amd64 node_exporter
mkdir -p $INSTALL_DIR/node_exporter/bin
cd $INSTALL_DIR/node_exporter && mv node_exporter bin/
cat > /etc/profile.d/node_exporter.sh <<EOF
export NODE_EXPORTER_HOME=${INSTALL_DIR}/node_exporter
export PATH=\${NODE_EXPORTER_HOME}/bin:\$PATH
EOF
}
node_exporter_service () {
cat > /lib/systemd/system/node_exporter.service <<EOF
[Unit]
Description=Prometheus Node Exporter
After=network.target
[Service]
Type=simple
ExecStart=$INSTALL_DIR/node_exporter/bin/node_exporter
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now node_exporter.service
}
start_node_exporter() {
systemctl is-active node_exporter.service
if [ $? -eq 0 ];then
echo
color "node_exporter 安装完成!" 0
echo "-------------------------------------------------------------------"
echo -e "访问链接: \c"
msg_info "http://$HOST:9100/metrics"
else
color "node_exporter 安装失败!" 1
exit
fi
}
install_node_exporter
node_exporter_service
start_node_exporter
6. Prometheus采集监控数据
配置promtheus通过node exporter组件采集node节点的监控指标数据
promtheus的服务发现可以直接修改其配置文件,也可以在服务注册中心发现自己需要监控的节点
6.1 修改prometheus的配置文件
$ vim /usr/local/prometheus/conf/prometheus.yml
# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets:
# - alertmanager:9093
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
# - "first_rules.yml"
# - "second_rules.yml"
# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: 'prometheus'
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ['localhost:9090']
其中的scrape_configs就是我们的监控节点信息,如果想要加上一个node_exporter任务,只需要再添加一个job即可
- job_name: "prometheus"
static_configs:
- targets: ["localhost:9090"]
- job_name: 'node_exporter' #添加以下行,指定监控的node exporter节点
static_configs:
- targets: ['10.0.0.104:9100','10.0.0.105:9100','10.0.0.106:9100']
#属性解析:
#新增一个job_name 和 static_configs的属性
#targets 就是前面基本概念中提到的instance,格式就是"ip:port"
然后重启prometheus服务
$ systemctl restart prometheus
6.2 prometheus验证node节点状态
浏览器访问普罗米修斯webUI,打开targets页签就可以看到我们监控的节点信息
7. Grafana展示数据
Grafana是一个开源的度量分析与可视化套件,它基于go语言开发,经常被用作基础设施的时间序列数据和应用程序分析的可视化
通过该查询编辑器可以对所有数据进行整合,而且还可以在同一个dashboard上进行综合展示。
默认监听与TCP的3000端口,支持集成其他认证服务,且能够通过/metrics输出内建指标
可以在https://grafana.com/dashboards/页面查询到我们想要的各种dashboard模版
7.1 Granafa部署
在prometheus server的服务器上部署Grafana即可
# ubuntu系统
$ wget https://dl.grafana.com/enterprise/release/grafana-enterprise_8.2.1_amd64.deb
$ apt -y install ./grafana-enterprise_8.2.1_amd64.deb
启动服务
$ systemctl daemon-reload
$ systemctl enable --now grafana-server.service
$ ss -ntulp | grep grafana
7.2 配置Grafana
登陆grafana,默认登陆用户名和密码为admin/admin
点击添加数据源“Add your first data source”
选择Prometheus,在setting界面配置prometheus信息即可
在dashboards界面选择想用的dashboard模版,选择任意模版后可以查看效果
我们也可以选择一个任意的模版,通过import导入我们想用的模版即可
参考:
https://time.geekbang.org/column/article/72281
https://time.geekbang.org/column/article/73156
https://prometheus.io/docs/introduction/overview/