【云原生 Prometheus篇】Prometheus架构详解与核心组件的应用实例(Exporters、Grafana...)

Prometheus Part1

  • 一、常用的监控系统
    • [1.1 简介](#1.1 简介)
    • [1.2 Prometheus和zabbix的区别](#1.2 Prometheus和zabbix的区别)
  • 二、Prometheus
    • [2.1 简介](#2.1 简介)
    • [2.2 Prometheus的主要组件](#2.2 Prometheus的主要组件)
    • [2.3 Prometheus的工作流程](#2.3 Prometheus的工作流程)
    • [2.4 Prometheus数据采集配置](#2.4 Prometheus数据采集配置)
  • 三、二进制部署Prometheus
    • [3.1 初始化操作](#3.1 初始化操作)
    • [3.2 下载Prometheus源码包并解压](#3.2 下载Prometheus源码包并解压)
    • [3.3 Prometheus添加到系统服务中](#3.3 Prometheus添加到系统服务中)
    • [3.4 访问测试](#3.4 访问测试)
  • 四、Exporters部署实例
    • [4.1 实例一:部署 Node Exporter 监控系统级指标](#4.1 实例一:部署 Node Exporter 监控系统级指标)
      • [Step1 准备源代码包](#Step1 准备源代码包)
      • [Step2 将node-expoter添加到系统服务中](#Step2 将node-expoter添加到系统服务中)
      • [Step3 加入到 Prometheus 监控中](#Step3 加入到 Prometheus 监控中)
      • 补充:常用的各指标
    • [4.2 实例二:通过mysql exporter监控 MySQL](#4.2 实例二:通过mysql exporter监控 MySQL)
      • [Step1 部署mysql exporter](#Step1 部署mysql exporter)
      • [Step2 修改Mysql的配置](#Step2 修改Mysql的配置)
      • [Step3 启动mysqld_exporter服务](#Step3 启动mysqld_exporter服务)
      • [Step4 添加Mysql到Prometheus监控中](#Step4 添加Mysql到Prometheus监控中)
      • [Step5 查看Prometheus web界面](#Step5 查看Prometheus web界面)
    • [4.3 实例三:监控Nginx](#4.3 实例三:监控Nginx)
      • [Step1 安装nginx](#Step1 安装nginx)
      • [Step2 修改nginx的配置文件,启动nginx](#Step2 修改nginx的配置文件,启动nginx)
      • [Step3 解压 nginx-exporter并启动](#Step3 解压 nginx-exporter并启动)
      • [Step4 将nginx加入到Prometheus监控中](#Step4 将nginx加入到Prometheus监控中)
      • [Step5 访问Prometheus web页面](#Step5 访问Prometheus web页面)
  • [五、部署 Grafana平台进行展示](#五、部署 Grafana平台进行展示)
    • [5.1 下载和安装](#5.1 下载和安装)
    • [5.2 配置数据源](#5.2 配置数据源)
    • [5.3 导入grafana监控面板](#5.3 导入grafana监控面板)

一、常用的监控系统

1.1 简介

老牌传统的:Zabbix 、Nagios、Cacti ...

云时代的:Prometheus、夜莺 ... ...

1.2 Prometheus和zabbix的区别

Zabbix:更适用于传统业务架构的物理机、虚拟机环境的监控,对容器的支持比较差;数据存储主要采用的是关系型数据库,会随着监控节点数量的增加,关系型数据库的压力也会变大,监控数据的读写也会变的很慢;对大规模集群监控的性能比Prometheus要弱一些,可适用于单集群不超过2000节点的场景。

Prometheus:还能支持云环境、Kubernetes容器集群的监控,是目前容器监控最好的解决方案;数据存储采用的是时序数据库,大大的节省了存储空间,并且提升了查询效率;单集群支持的节点规模更大,通常超过2000台节点、业务服务数量大于1000个的时候建议直接上Prometheus。

二、Prometheus

Prometheus 官网地址:https://prometheus.io

Prometheus github 地址:https://github.com/prometheus

2.1 简介

Prometheus 是一个开源的监控系统 + 时间序列数据库,数据模型是 指标度量名称{键值对标签} 的时间序列数据格式。

2.2 Prometheus的主要组件

1)Prometheus server

Prometheus服务的核心组件

通过http pull拉取的方式采集监控指标数据(时间序列数据);

作为时序数据库持久化存储监控指标数据;

根据告警规则生成告警通知推送给alertmanager;

内建service discovery动态服务发现功能(支持文件、consul、K8S等自动发现方式)

2)Exporters

指标暴露器 ,用于对原生不支持prometheus直接采集监控指标数据的系统或应用,收集监控指标数据并转换格式给prometheus server拉取采集。

常用的exporters 描述
Node-Exporter 用于收集服务器节点的物理指标状态数据,如平均负载、CPU、内存、磁盘、网络等资源信息的指标数据,需要部署到所有运算节点。
mysqld-exporter/nginx-exporter 用于监控特定服务,比如mysql/nginx
Kube-State-Metrics 用于为 Prometheus 采集 K8S 资源数据
cAdvisor 用来监控容器内部使用资源的信息,比如 CPU、内存、网络I/O、磁盘I/O
blackbox-exporter 监控业务容器存活性

3)Alertmanager

接收prometheus server发来的告警通知,负责对告警通知去重、分组,并路由给接收人(电子邮件、钉钉、企业微信等方式)

4)Pushgateway

作为中转站,接收一些短期任务或只会push推送数据的任务发来的监控指标数据,用于临时存储监控指标数据并统一给prometheus server拉取采集

5)Grafana

外置的监控数据展示平台,接入prometheus数据源,通过promQL查询,并以图形化形式展示

2.3 Prometheus的工作流程

1)prometheus server通过http pull拉取的方式从监控目标target(exporter或pushgateway暴露的http接口)拉取监控指标数据;

2)prometheus server将采集到的监控指标数据通过时序数据库持久化存储在本地磁盘或外置存储中;

3)prometheus server将采集到的监控指标数据与本地配置的告警规则进行计算比对,如果触发告警则会生成告警通知推送给alertmanager;

4)alertmanager接收到prometheus server发来的告警通知后,对告警通知去重、分组,再通过电子邮件/钉钉/企业微信等方式发送给接收人;

5)prometheus支持原生的web UI或grafana接入prometheus数据源,通过promQL查询,并以图形化形式展示。

prometheus支持使用influxdb等作为外置时序数据库,实现长期存储历史数据。

prometheus可基于thanos实现prometheus集群的高可用(主要方式是在K8S上部署,通过边车模式与prometheus部署在同一个Pod里共享监控数据)

2.4 Prometheus数据采集配置

yaml 复制代码
#这是一个模板
scrape_configs:
- job_name: XXX              #自定义监控任务的名称
  metrics_path: "/metrics"   #指定获取监控指标数据的URL路径,一般都是 /metrics
  scheme: "http"             #指定拉取监控指标数据的协议,http(默认值)|https
  static_configs:            #定义静态配置的监控目标
  - targets:                   #指定监控目标的IP和exporter的端口
    - <IP1>:<exporter的端口>
    - <IP2>:<exporter的端口>
    labels:                    #自定义监控目标的标签
	  <标签key>: <标签value>

三、二进制部署Prometheus

3.1 初始化操作

bash 复制代码
systemctl stop firewalld
setenforce 0

3.2 下载Prometheus源码包并解压

上传 prometheus-2.45.0.linux-amd64.tar.gz 到 /opt 目录中,并解压

bash 复制代码
#建立工作目录
mkdir -p /opt/prometheus

#上传源码包
cd /opt/prometheus
tar xf prometheus-2.45.0.linux-amd64.tar.gz

#方便补全
mv prometheus-2.45.0.linux-amd64 /usr/local/prometheus

Prometheus配置清单文件详解

yaml 复制代码
cat /usr/local/prometheus/prometheus.yml | grep -v "^#"

global:					#用于prometheus的全局配置,比如采集间隔,抓取超时时间等
  scrape_interval: 15s			#采集目标主机监控数据的时间间隔,默认为1m
  evaluation_interval: 15s 		#触发告警生成alert的时间间隔,默认是1m
  # scrape_timeout is set to the global default (10s).
  scrape_timeout: 10s			#数据采集超时时间,默认10s

alerting:				#用于alertmanager实例的配置,支持静态配置和动态服务发现的机制
  alertmanagers:
    - static_configs:
        - targets:
          # - alertmanager:9093

rule_files:				#用于加载告警规则相关的文件路径的配置,可以使用文件名通配机制
  # - "first_rules.yml"
  # - "second_rules.yml"

scrape_configs:			#用于采集时序数据源的配置
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: "prometheus"		#每个被监控实例的集合用job_name命名,支持静态配置(static_configs)和动态服务发现的机制(*_sd_configs)

    # metrics_path defaults to '/metrics'
    metrics_path: '/metrics'    #指标数据采集路径,默认为 /metrics
    # scheme defaults to 'http'.

    static_configs:				#静态目标配置,固定从某个target拉取数据
      - targets: ["localhost:9090"]

3.3 Prometheus添加到系统服务中

bash 复制代码
#配置系统启动文件
cat > /usr/lib/systemd/system/prometheus.service <<'EOF'
[Unit]
Description=Prometheus Server
Documentation=https://prometheus.io
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/prometheus/prometheus \
--config.file=/usr/local/prometheus/prometheus.yml \
--storage.tsdb.path=/usr/local/prometheus/data/ \
--storage.tsdb.retention=15d \
--web.enable-lifecycle
  
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF

启动

bash 复制代码
#启动 Prometheust
systemctl enable prometheus --now

netstat -natp | grep :9090

3.4 访问测试

浏览器访问:http://192.168.2.108:9090 ,访问到 Prometheus 的 Web UI 界面。

点击页面的 Status -> Targets;

如看到 Target 状态都为 UP,说明 Prometheus 能正常采集到数据。

浏览器访问:http://192.168.2.108:9090/metrics ,可以看到 Prometheus 采集的指标数据。

其中 Help 字段用于解释当前指标的含义Type 字段用于说明数据的类型

四、Exporters部署实例

4.1 实例一:部署 Node Exporter 监控系统级指标

Step1 准备源代码包

上传 node_exporter-1.3.1.linux-amd64.tar.gz 到 /opt 目录中,并解压。

bash 复制代码
tar xf node_exporter-1.3.1.linux-amd64.tar.gz

mv node_exporter-1.3.1.linux-amd64/node_exporter /usr/local/bin

Step2 将node-expoter添加到系统服务中

配置启动文件

bash 复制代码
cat > /usr/lib/systemd/system/node_exporter.service <<'EOF'
[Unit]
Description=node_exporter
Documentation=https://prometheus.io/
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/node_exporter \
--collector.ntp \
--collector.mountstats \
--collector.systemd \
--collector.tcpstat

ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF

启动

bash 复制代码
systemctl enable node_exporter --now

netstat -natp | grep :9100

浏览器访问:http://192.168.2.108:9100/metrics ,可以看到 Node Exporter 采集到的指标数据。

Step3 加入到 Prometheus 监控中

修改Prometheus配置文件

bash 复制代码
vim /usr/local/prometheus/prometheus.yml
#在尾部增加如下内容
  - job_name: nodes
    metrics_path: "/metrics"
    static_configs:
    - targets:
	  - 192.168.2.108:9100
	  - 192.168.2.100:9100
	  - 192.168.2.102:9100
      labels:
        service: kubernetes

重新载入配置

bash 复制代码
#方法一
systemctl reload prometheus

#方法二
curl -X POST http://192.168.2.108:9090/-/reload 

测试

浏览器查看 Prometheus 页面的 Status -> Targets

补充:常用的各指标

●node_cpu_seconds_total

●node_memory_MemTotal_bytes

●node_filesystem_size_bytes{mount_point=PATH}

●node_system_unit_state{name=}

●node_vmstat_pswpin:系统每秒从磁盘读到内存的字节数

●node_vmstat_pswpout:系统每秒钟从内存写到磁盘的字节数

更多指标介绍:https://github.com/prometheus/node_exporter

4.2 实例二:通过mysql exporter监控 MySQL

注:切换到Mysql服务器部署。

Step1 部署mysql exporter

解压mysql exporter源码包

bash 复制代码
tar xf mysqld_exporter-0.14.0.linux-amd64.tar.gz

mv mysqld_exporter-0.14.0.linux-amd64/mysqld_exporter /usr/local/bin/

配置启动文件

bash 复制代码
cat > /usr/lib/systemd/system/mysqld_exporter.service <<'EOF'
[Unit]
Description=mysqld_exporter
Documentation=https://prometheus.io/
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/mysqld_exporter --config.my-cnf=/etc/my.cnf

ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF

Step2 修改Mysql的配置

修改Mysql的配置文件

bash 复制代码
vim /etc/my.cnf
[client]
......
host=localhost
user=exporter
password=abc123

授权 exporter 用户

sql 复制代码
#登录收据库
mysql -uroot -p123123

#授权
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'localhost' IDENTIFIED BY 'abc123';

#刷新
flush privillages

重启mysqld服务

bash 复制代码
systemctl restart mysqld

Step3 启动mysqld_exporter服务

bash 复制代码
systemctl enable mysqld_exporter --now

netstat -natp | grep :9104

Step4 添加Mysql到Prometheus监控中

切换到Prometheus 服务器上操作。

修改 prometheus 配置文件,加入到 prometheus 监控中

yaml 复制代码
vim /usr/local/prometheus/prometheus.yml
#在尾部增加如下内容
  - job_name: mysqld
    metrics_path: "/metrics"
    static_configs:
    - targets:
          - 192.168.2.106:9104
      labels:
        service: mysqld

重新载入配置

bash 复制代码
systemctl reload prometheus

Step5 查看Prometheus web界面

浏览器查看 Prometheus 页面的 Status -> Targets

4.3 实例三:监控Nginx

nginx-exporter下载地址:https://github.com/hnlq715/nginx-vts-exporter/releases/download/v0.10.3/nginx-vts-exporter-0.10.3.linux-amd64.tar.gz

nginx 下载地址:http://nginx.org/download/

nginx 插件下载地址:https://github.com/vozlt/nginx-module-vts/tags

Step1 安装nginx

下载并解压nginx插件包

bash 复制代码
cd /opt

tar xf nginx-module-vts-0.1.18.tar.gz
mv nginx-module-vts-0.1.18 /usr/local/nginx-module-vts

安装nignx

bash 复制代码
#安装依赖
yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make
#管理用户
useradd -M -s /sbin/nologin nginx

#解压代码包
cd /opt
tar xf nginx-1.24.0.tar.gz

#编译安装
cd nginx-1.24.0/
./configure --prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module \
--with-http_ssl_module \
--add-module=/usr/local/nginx-module-vts

make & make install

Step2 修改nginx的配置文件,启动nginx

修改nginx配置文件

nginx 复制代码
vim /usr/local/nginx/conf/nginx.conf
http {
    vhost_traffic_status_zone;					#添加
    vhost_traffic_status_filter_by_host on;		#添加,开启此功能,在 Nginx 配置有多个 server_name 的情况下,会根据不同的 server_name 进行流量的统计,否则默认会把流量全部计算到第一个 server_name 上
	......
	server {
	......
	}
	
    server {
        vhost_traffic_status off;		#在不想统计流量的 server 区域,可禁用 vhost_traffic_status
        listen 8080;
        allow 127.0.0.1;
        allow 192.168.2.108;			#设置为 prometheus 的 ip 地址

        location /nginx-status {
            stub_status on;
            access_log off;
        }

        location /status {
            vhost_traffic_status_display;
            vhost_traffic_status_display_format html;
        }
    }
}

#假如 nginx 没有规范配置 server_name 或者无需进行监控的 server 上,那么建议在此 vhost 上禁用统计监控功能。否则会出现 127.0.0.1、hostname 等的域名监控信息。
bash 复制代码
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/

nginx -t

将nginx添加到系统服务中

bash 复制代码
cat > /lib/systemd/system/nginx.service <<'EOF'
[Unit]
Description=nginx
After=network.target

[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target
EOF

启动

bash 复制代码
systemctl enable nginx --now

浏览器访问:http://192.168.2.107:8080/status ,可以看到 Nginx Vhost Traffic Status 的页面信息

Step3 解压 nginx-exporter并启动

源码包

bash 复制代码
cd /opt/
tar -zxvf nginx-vts-exporter-0.10.3.linux-amd64.tar.gz

mv nginx-vts-exporter-0.10.3.linux-amd64/nginx-vts-exporter /usr/local/bin/

添加到系统服务

bash 复制代码
cat > /usr/lib/systemd/system/nginx-exporter.service <<'EOF'
[Unit]
Description=nginx-exporter
Documentation=https://prometheus.io/
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/nginx-vts-exporter -nginx.scrape_uri=http://localhost:8080/status/format/json

ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF

启动nginx-exporter服务

bash 复制代码
systemctl enable nginx-exporter --now

netstat -natp | grep :9913

Step4 将nginx加入到Prometheus监控中

切换到 Prometheus 服务器。

修改 prometheus 配置文件

yaml 复制代码
vim /usr/local/prometheus/prometheus.yml
#在尾部增加如下内容
  - job_name: nginx
    metrics_path: "/metrics"
    static_configs:
    - targets:
          - 192.168.2.107:9913
      labels:
        service: nginx

重新载入配置

bash 复制代码
systemctl reload prometheus

Step5 访问Prometheus web页面

浏览器查看 Prometheus 页面的 Status -> Targets

五、部署 Grafana平台进行展示

5.1 下载和安装

bash 复制代码
#下载地址
https://grafana.com/grafana/download
https://mirrors.bfsu.edu.cn/grafana/yum/rpm/
bash 复制代码
yum install grafana-enterprise-8.5.9-1.x86_64.rpm
bash 复制代码
systemctl enable grafana-server --now

netstat -natp | grep :3000

浏览器访问:http://192.168.2.108:3000默认 账号和密码为 admin/admin

5.2 配置数据源

http 复制代码
Configuration -> Data Sources -> Add data source -> 选择 Prometheus

HTTP -> URL 输入 http://192.168.2.108:9090

点击 Save & Test




http 复制代码
点击 上方菜单 Dashboards--->Import 所有默认模板

Dashboards -> Manage ,选择 Prometheus 2.0 Stats 或 Prometheus Stats 即可看到 Prometheus job 实例的监控图像


5.3 导入grafana监控面板

浏览器访问:https://grafana.com/grafana/dashboards

在页面中搜索 node exporter ,选择适合的面板,点击 Copy ID 或者 Download JSON


grafana 页面中,+ Create -> Import ,输入面板 ID 号或者上传 JSON 文件,点击 Load,即可导入监控面板


相关推荐
好多173 分钟前
《微服务事务管理》
java·微服务·架构
wanhengidc9 分钟前
手机云服务是什么意思?
运维·网络·安全·游戏·智能手机
desssq21 分钟前
ubuntu 18.04 泰山派编译报错
linux·运维·ubuntu
清风笑烟语26 分钟前
Ubuntu 24.04 搭建k8s 1.33.4
linux·ubuntu·kubernetes
失散1340 分钟前
分布式专题——10.5 ShardingSphere的CosID主键生成框架
java·分布式·架构·分库分表·shadingsphere
Dovis(誓平步青云)1 小时前
《Linux 基础指令实战:新手入门的命令行操作核心教程(第一篇)》
linux·运维·服务器
能不能别报错1 小时前
K8s学习笔记(二):Pod
笔记·学习·kubernetes
维尔切2 小时前
Shell 脚本编程:函数
linux·运维·自动化
roman_日积跬步-终至千里2 小时前
【系统架构设计(25)】Web应用服务器与现代架构
前端·架构·系统架构
无责任此方_修行中2 小时前
AWS IoT Core 成本优化实战:从 PoC 到生产的省钱之旅
后端·架构·aws