组件说明
组件说明
Prometheus Server
Prometheus组件中的核心部分,负责实现对监控数据的获取,存储以及查询
Tsdb
监控数据持久化数据库,时序数据库
-
chunks
:存储所有时间序列数据块(chunk),每个块包含一定时间范围内的一组样本数据。Prometheus 会周期性地将采集到的样本数据划分为一些块,并将它们写入此目录下的子目录中。 -
index
:存储所有时间序列的索引信息,以便 Prometheus 可以快速查找和检索样本数据。索引文件按照特定格式存储,其中包含了各种元数据(例如标签名称、值、时间戳等)以及对应数据块的位置和偏移量等信息。 -
meta.json
:存储整个 TSDB 数据库的元数据,例如版本信息、块大小、块数、最小和最大时间戳等。当 Prometheus 启动时,会读取此文件以恢复先前保存的数据库状态。 -
tombstones
:存储所有被删除时间序列的墓碑记录,以便在垃圾回收期间清理相应的数据块。每个墓碑包含被删除时间序列的 ID、起始时间戳和结束时间戳等信息
Prometheus 的 TSDB 存储默认保留 15 天的时间序列数据,可在启动脚本参数中配置数据存储时间
Prometheus Server
Prometheus组件中的核心部分,负责实现对监控数据的获取,存储以及查询
Tsdb
监控数据持久化数据库,时序数据库
-
chunks
:存储所有时间序列数据块(chunk),每个块包含一定时间范围内的一组样本数据。Prometheus 会周期性地将采集到的样本数据划分为一些块,并将它们写入此目录下的子目录中。 -
index
:存储所有时间序列的索引信息,以便 Prometheus 可以快速查找和检索样本数据。索引文件按照特定格式存储,其中包含了各种元数据(例如标签名称、值、时间戳等)以及对应数据块的位置和偏移量等信息。 -
meta.json
:存储整个 TSDB 数据库的元数据,例如版本信息、块大小、块数、最小和最大时间戳等。当 Prometheus 启动时,会读取此文件以恢复先前保存的数据库状态。 -
tombstones
:存储所有被删除时间序列的墓碑记录,以便在垃圾回收期间清理相应的数据块。每个墓碑包含被删除时间序列的 ID、起始时间戳和结束时间戳等信息
Prometheus 的 TSDB 存储默认保留 15 天的时间序列数据,可在启动脚本参数中配置数据存储时间
--storage.tsdb.retention.time=180d
Exporter业务数据源
业务数据源通过 Pull/Push 两种方式推送数据到 Prometheus Server
AlertManager
报警管理器,Prometheus 通过配置报警规则,如果符合报警规则,那么就将报警推送到 AlertManager,由其进行报警处理
Grafana
监控数据可视化平台,默认使用SQLite 数据库(存储在/var/lib/grafana/grafana.db),也可在grafana配置使用其他自定义数据库(MySQL、PostgreSQL 或 Microsoft SQL Server等)
PromQL(Prometheus Query Language)
用于查询和分析 Prometheus 时间序列数据的语言
# 基本语法
# 用于查询指定标签名和标签值的度量名称
<metric_name>{<label_name>=<label_value>, ...}
# 聚合函数
# 用于对一个或多个指标进行聚合运算,其中 <aggr_func> 可以是 sum、avg、min、max 等聚合函数,<metric_expression> 是一个查询表达式
<aggr_func>([parameter,] <metric_expression>)
# 时间范围选择
# 用于选择指定时间范围内的度量名称,其中 <range_duration> 是一个数字后接 s、m、h 或 d 表示秒、分钟、小时或天
<metric_name>[<range_duration>]
# 二元运算符
# 用于对两个表达式进行二元运算操作,其中 <binary_op> 可以是 +、-、*、/ 和 % 等运算符
<expr> <binary_op> <expr>
# 函数调用
# 用于调用内置或自定义的函数,其中 <func> 是函数名,<args> 是一个或多个参数
<func>(<args>)
用于调用内置或自定义的函数,其中 <func> 是函数名,<args> 是一个或多个参数
# 特殊关键字
# 用于在查询表达式中进行偏移量、聚合、过滤和分组等操作
offset, by, without, group_left, group_right, on
官方语法文档地址:Querying basics | Prometheus
前置环境
环境要求
Docker版本不低于18.03
Dokcer-compose 版本不低于1.29
以下演示操作系统:Centos 7
安装Docker
安装docker
# 安装所需包
yum install -y yum-utils device-mapper-persistent-data lvm2
# 添加 Docker 仓库
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 查看可用版本
# yum list docker-ce --showduplicates | sort -r
# 安装 docker,可指定版本,如:docker-ce-19.03.0
yum install -y docker-ce-19.03.0
重启docker服务
systemctl enable docker && systemctl restart docker
安装Docker-compose(离线方式)
https://download.csdn.net/download/xactuax/89292317
上传docker-compose安装包,移动并修改名字:
sudo mv docker-compose-Linux-x86_64 /usr/local/bin/docker-compose
添加权限
sudo chmod +x /usr/local/bin/docker-compose
查看docker-compose版本,如回显正常则成功
docker-compose -v
部署Prometheus+Grafana
创建配置和数据挂载目录(为了做持久化)
mkdir -p /monitoring/grafana/data #grafana的数据文件挂载目录
mkdir -p /monitoring/prometheus/conf #prometheus的配置文件挂载目录
mkdir -p /monitoring/prometheus/data。#prometheus的数据文件挂载目录
给挂载目录赋权
chown -R 1001:1001 /monitoring/prometheus/
chown -R 1001:1001 /monitoring/grafana/
新建/monitoring/prometheus/conf/prometheus.yml文件,内容为:
# my global config
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.
# scrape_timeout is set to the global default (10s).
# 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']
新建/monitoring/docker-compose.yml文件,内容为:
version: '2'
services:
prometheus:
image: bitnami/prometheus:latest
container_name: prometheus
ports:
- "9090:9090"
volumes: #挂载配置和数据文件
- "/monitoring/prometheus/conf/prometheus.yml:/opt/bitnami/prometheus/conf/prometheus.yml"
- "/monitoring/prometheus/data:/opt/bitnami/prometheus/data"
environment:
- TZ=Asia/Shanghai
command:
- '--config.file=/opt/bitnami/prometheus/conf/prometheus.yml'
- '--storage.tsdb.retention.time=180d'#启动参数设置数据存储时间为180天
grafana:
image: grafana/grafana
container_name: grafana
ports:
- "3000:3000"
volumes: #挂载数据文件
- "/monitoring/grafana/data:/var/lib/grafana/"
environment:
- TZ=Asia/Shanghai
启动服务(Prometheus+Grafana)
cd /monitoring && docker-compose up d
检查服务运行情况
docker-compose ps #查看各组件启动情况
在浏览器打开http://宿主机ip:9090 #检查页面是否正常访问
客户端安装配置
安装客户端
prometheus 客户端(导出器)有很多种,具体可以参考官网
官网下载监控客户端链接:Download | Prometheus
node_exporter 主机监控客户端,主要用于收集操作系统级别的指标,如CPU、内存、磁盘IO等
mongodb_exporter mongodb监控客户端,收集MongoDB数据库的性能指标,如查询速度、连接数、缓存命中率等
kafka_exporter kafka监控客户端,用于收集Apache Kafka集群的性能指标,如消费者组的偏移量、主题的副本数量等
说明:导出器(exporter)一般安装在被监控的机器上,但不是必须
比如kafka_exporter(或mongodb_exporter),收集指标是基于服务本身的,只要确保exporter能够访问Kafka(或mongodb),并不一定需要部署在被监控机器上
而node_exporter 则不同,它收集的是操作系统级别的指标,故它必须部署在被监控机器上
方式一:直接在被监控机器上部署
以node_exporter为例
将安装包上传到被监控端后,执行以下命令,启动客户端
# 解压到/usr/local/目录
tar -zxvf node_exporter-1.5.0.linux-amd64.tar.gz -C /usr/local/
# 创建软链接
ln -s /usr/local/node_exporter-1.5.0.linux-amd64/node_exporter /usr/bin/node_exporter
# 使用默认端口启动node_exporter
nohup node_exporter & (默认端口为9100)
# 启动时指定端口
nohup ./node_exporter --web.listen-address=:7100 &
在浏览器打开 http://客户端IP:9100/metrics ,查看是否有输出,有输出,说明客户端监控成功
方式二:使用docker-compose部署在固定机器上
以mongodb_exporter和kafka_exporter为例(部署2个kafka_exporter,1个mongodb_exporter)
假设与Prometheus+Grafana部署在同一机器上,则修改/monitoring/docker-compose.yml文件,内容为:
version: '2'
services:
kafka-exporter1:
container_name: kafka-exporter1
image: 'danielqsj/kafka-exporter:latest'
command:
- --kafka.server=172.16.13.112:9092
- --zookeeper.server=172.16.13.112:2181
- --kafka.version=2.3.1
#此处依照实际情况填写kafka的用户名密码加密方式等
- --sasl.enabled
- --sasl.mechanism=plain
- --sasl.username=xxxxx
- --sasl.password=xxxxx
- --web.listen-address=:9308
ports:
- "9308:9308"
environment:
- TZ=Asia/Shanghai
kafka-exporter2:
container_name: kafka-exporter2
image: 'danielqsj/kafka-exporter:latest'
command:
- --kafka.server=172.16.13.214:9092
- --zookeeper.server=172.16.13.214:2181
- --kafka.version=2.8.1
- --sasl.enabled
- --sasl.mechanism=plain
- --sasl.username=xxxx
- --sasl.password=xxxx
- --web.listen-address=:9309 # 修改此处以指定在9309端口上监听
ports:
- "9309:9309"
environment:
- TZ=Asia/Shanghai
mongodb-exporter:
image: 'bitnami/mongodb-exporter:latest'
container_name: mongodb-exporter
command:
- --mongodb.uri=mongodb://user:passwd@172.16.13.214:27017/?authSource=admin
- --collect-all
ports:
- "9216:9216"
environment:
- TZ=Asia/Shanghai
prometheus:
image: bitnami/prometheus:latest
container_name: prometheus
ports:
- "9090:9090"
volumes:
- "/monitoring/prometheus/conf/prometheus.yml:/opt/bitnami/prometheus/conf/prometheus.yml"
- "/monitoring/prometheus/data:/opt/bitnami/prometheus/data"
environment:
- TZ=Asia/Shanghai
command:
- '--config.file=/opt/bitnami/prometheus/conf/prometheus.yml'
- '--storage.tsdb.retention.time=180d'
grafana:
image: grafana/grafana
container_name: grafana
ports:
- "3000:3000"
volumes:
- "/monitoring/grafana/data:/var/lib/grafana/"
environment:
- TZ=Asia/Shanghai
重新启动服务
cd /monitoring # 进入docker-compose.yml所在目录
docker-compose down -v #停止服务并移除容器
docker-compose up -d #启动prometheus组件服务
方式三:部署到k8s集群中
以kafka-exporter为例
在k8s集群所在机器中创建文件deploy.yaml(记得先修改这个文件,配置好用户名密码,自行决定映射到主机的端口),执行kubectl apply -f ./deploy.yaml
kind: Deployment
metadata:
name: kafka-exporter
namespace: qtsa
spec:
replicas: 1
selector:
matchLabels:
app: kafka-exporter
template:
metadata:
labels:
app: kafka-exporter
spec:
containers:
- name: kafka-exporter
imagePullPolicy: IfNotPresent
image: 'danielqsj/kafka-exporter:latest'
args:
- --kafka.server=kafka-svc:9092
- --zookeeper.server=zk-svc:2181
- --kafka.version=2.3.1
#- --sasl.enabled
#- --sasl.mechanism=plain
#- --sasl.username=xxxxx
#- --sasl.password=xxxxx
---
apiVersion: v1
kind: Service
metadata:
name: kafka-exporter-svc
namespace: qtsa
labels:
app: kafka-exporter
spec:
type: NodePort
selector:
app: kafka-exporter
ports:
- name: port-1
port: 9308
nodePort: 30308
配置客户端
回到服务端,在/monitoring/prometheus/conf/prometheus.yml配置文件,添加客户端IP
说明:job类似于业务组,能创建多个job,一个job下可以监控多台客户端
# my global config
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.
# scrape_timeout is set to the global default (10s).
# 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']
- job_name: 'kafka-exporter'
static_configs:
- targets: ['kafka-exporter1:9308']
#如果exporter不是部署在本机的pod,- targets: ['kafka-exporter:9309']修改为- targets: ['对应的kafka-exporter IP地址:端口']
labels:
instance: 172.16.13.112
- targets: ['kafka-exporter2:9309']
labels:
instance: 172.16.13.214
- job_name: 'mongodb-exporter'
static_configs:
- targets: ['mongodb-exporter:9216']
labels:
instance: 172.16.13.214
- job_name: 'node-exporter'
static_configs:
- targets: ['172.16.13.214:9100']
- job_name: 'nifi-exporter'
static_configs:
- targets: ['nifi-test:9999']
重启prometheus容器
cd /monitoring && docker restart prometheus
prometheus web页面检查客户端是否上线
访问地址:http://ip:9090/targets
对接Grafana
登录grafana页面
默认部署后,账号密码 admin/admin 第一次会登录要求修改密码,可以点跳过
添加数据源
点击配置图标-添加数据源,数据源类型选择prometheus
输入promehteus页面地址后,点击下方保存和测试,即可完成数据源添加
导入模板方式
Grafana支持导入监控模板的方式,grafana官网有丰富的模板库,可以在其中找到合适的进行下载导入,如果不适配可能会导致无数据或报错,可以适当更换模板或者直接修改指标
导入模板有两种方式:
- 离线导入json模板文件
- 输入grafana模板库的模板地址或id进行下载导入
以下展示离线导入的方式
点击左侧+号,选择Import,点击Upload JSON file,选中你下载过的模板
选择数据源(前面添加过的),点击导入