深入解析Prometheus:强大的开源监控与告警系统

目录

引言

一、运维监控平台的设计思路

(一)设计思路

1.数据收集模块

2.数据提取模块

3.监控告警模块

(二)监控平台层级

二、Prometheus简介

(一)基本介绍

(二)核心特征

(三)组件说明

(四)Prometheus工作过程

1.数据收集

2.数据存储计算

3.应用展示及告警

三、搭建Prometheus

[(一)Prometheust Server端安装](#(一)Prometheust Server端安装)

1.安装服务

2.查看相关配置文件

3.启动服务

4.查看监控

​编辑四、部署Exporters

[(一)部署Node Exporter](#(一)部署Node Exporter)

1.安装Exporters组件

2.启动服务

3.浏览器访问验证

4.常见的指标参数

5.加入到prometheus监控

(二)监控MySQL

1.安装Exporters组件

2.添加系统启动文件

3.修改MySQL配置文件

4.授权exporter用户

5.启动服务

6.加入到prometheus监控

(三)监控Nginx

1.安装nginx插件

2.编译安装nginx

3.修改配置文件

4.安装Exporters组件

[4.1 安装组件](#4.1 安装组件)

[4.2 启动服务](#4.2 启动服务)

​编辑

5.加入到prometheus监控

五、部署Prometheus服务发现

(一)基于Consul的服务发现

1.部署Consul服务

2.在Consul上注册Services

3.修改Prometheus配置文件

(二)基于file_cd的服务发现

1.创建发现文件

2.修改prometheus配置文件

六、部署Grafana进行展示

(一)下载和安装

1.下载rpm包

2.安装服务

(二)配置数据源

(三)导入grafana监控面板


引言

在云计算和大数据时代,系统监控和告警成为了确保业务稳定运行不可或缺的一环。Prometheus,作为开源的监控与告警工具,以其强大的功能和灵活性,在众多监控解决方案中脱颖而出。本文将对Prometheus进行深入解析,探讨其工作原理、核心特性以及实际应用场景。

一、运维监控平台的设计思路

运维监控平台是运维人员进行工作时,必不可少的一部分,对于开发人员也同样重要,它会帮助运维、开发人员,显示系统中的错误,以便快速处理。

(一)设计思路

它的设计理念大概分为三个模块

1.数据收集模块

数据收集模块,主要用来收集系统中的数据信息,如硬件资源、数据资源、应用资源、网络资源等等,它会将这些资源信息通过HTTP接口、物理接口等方式,收集到自己的应用服务当中

2.数据提取模块

数据提取模块,它会将收集到的数据,对信息进行压缩、聚合等方式的处理,对关键信息进行提取、过滤,根据提取到的信息,判断资源是否正常

3.监控告警模块

监控告警模块,它会通过布尔值(如ture与false、0与1、yes与no等),判断是否需要告警,并根据自定义的告警方式发送告警信息

(二)监控平台层级

第一层 数据收集层 多渠道监控数据(网络、硬件、应用、数据、物理环境)

第二层 数据展示层 数据会生成曲线图标(对时序数据库是动态展示)

第三层 数据提取层 定时采集数据到监控模块当中

第四层 告警规则配置层 告警规则设置 告警阀值设置(布尔值表达式,筛选异常状态)

第五层 告警事件生成层实时记录告警事件 并且形成分析图表(可视化,分析)

第六层 用户展示层 用户登录到平台:统一 管理·集中化监控...维护,各个监控数据(数据收集层里面的监控环境)

二、Prometheus简介

(一)基本介绍

Prometheus是一个开源的系统监控和告警工具包,自2012年诞生以来,它已成为云原生监控领域的佼佼者。Prometheus的设计初衷是为了解决传统监控系统的不足,特别是在容器化和微服务架构的环境下。它通过多维度的数据模型和灵活的查询语言(PromQL),提供了对复杂环境进行全面监控的能力

Prometheus的基本原理是通过HTTP协议周期性抓取被监控组件的状态,任意组件只要提供对应的 HTTP 接口就可以接入监控,不需要任何 SDK 或者其他的集成过程。其核心组件 Prometheus server 会定期从静态配置的监控目标或基于服务发现自动配置的目标中拉取数据。当新拉取的数据超过配置的内存缓存区时,数据将被持久化到存储设备中。

(二)核心特征

多维数据模型:Prometheus 采用时序数据库作为存储,可以灵活的存储多维度的数据。
灵活的查询语言: Prometheus 使用了功能强大的 PromQL 查询语言,可以实时查询时序数据库相关数据。
拉取式采集:Prometheus 通过 HTTP 协议周期性抓取被监控组件状态,而不是通过端口接收推送数据。
服务发现:Prometheus 支持各种服务发现机制,可以自动发现监控目标,如果需要监控的服务比较少,也可以使用静态配置。
多种可视化组件:如 Grafana、 PromDash 等,可以用来展示监控数据,在本项目中我们使用 Grafana 做可视化展示。
告警管理:通过 Alertmanager 负责实现报警功能,既可以使用邮件,也能通过 Webhook 自定义告警处理方式。

(三)组件说明

Prometheus以解耦的方式进行监控。每一个组件就是一个模块,例如数据收集模块、告警模块、存储模块等等,每个模块都有独立的工作内容

|------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 组件名称 | 作用 |
| MetricServer | 是kubernetes集群资源使用情况的聚合器,收集数据给kubernetes集群内使用, 如kubectl、hpa、scheduler等。 |
| PrometheusOperator | 是一个系统监测和警报工具箱,用来存储监控数据。 |
| NodeExporter | 用于收集各 node 的关键度量指标状态数据,如平均负载、CPU、内存、磁盘、 网络等等多个维度的指标数据。 |
| KubeStateMetrics | 收集kubernetes集群内资源对象数据,制定告警规则。包括指定类型的对象总数、 资源限额、容器状态以及Pod资源标签系列等。 |
| Prometheus server | 采用 pull 方式收集 apiserver、scheduler、controller-manager、kubelet 组件数据 ,通过 http 协议 传输。并存储时间序列数据。 Prometheus server 由三个部分组成:Retrieval,Storage,PromQL Retrieval :负责在活跃的 target 主机上抓取监控指标数据。 Storage :存储,主要是把采集到的数据存储到磁盘中。默认为 15 天。 PromQL:是 Prometheus 提供的查询语言模块。 |
| Grafana | 可视化数据统计和监控平台 |
| Alertmanager | 独立的告警模块,从 Prometheus server端接收到alerts后,会进行去重、分组, 并路由到相应的接收方,发出报警。常见的接收方式有:电子邮件,微信,钉钉等 |
| Pushgateway | 各个目标主机可上报数据到 Pushgateway,然后Prometheus server统一从 Pushgateway 拉取数据。 |
| Service Discovery | 服务发现,用于动态发现待监控的 Target, Prometheus 支持多种服务发现机制:文件、DNS、Consul、Kubernetes 等等 |

//TSDB 作为 Prometheus 的存储引擎(即Prometheus server中的 Storage)完美契合了监控数据的应用场景

●存储的数据量级十分庞大

●大部分时间都是写入操作

●写入操作几乎是顺序添加,大多数时候数据都以时间排序

●很少更新数据,大多数情况在数据被采集到数秒或者数分钟后就会被写入数据库

●删除操作一般为区块删除,选定开始的历史时间并指定后续的区块。很少单独删除某个时间或者分开的随机时间的数据

●基本数据大,一般超过内存大小。一般选取的只是其一小部分且没有规律,缓存几乎不起任何作用

●读操作是十分典型的升序或者降序的顺序读

●高并发的读操作十分常见

(四)Prometheus工作过程

1.数据收集

基于服务发现(Service Discovery)机制或静态配置获取要监视的目标(Target),并通过每个目标上的指标 exporter 来采集(Scrape)指标数据

Prometheus server 根据配置文件,定期从已配置好的Exporters 中拉取metrics。这些 Exporters 可以监控各种不同的系统和服务,如操作系统、数据库、Web 服务器等,并将关键的性能指标暴露给 Prometheus。

Exporters 本质上是一个HTTP服务,它们将监控数据的metrics转换为Prometheus可以理解的格式,通常是PromQL(Prometheus Query Language)可以查询的格式。

Prometheus server周期性的拉取数据,对于一些生命周期短暂的数据,它会主动上报数据到 Pushgateway,然后 Prometheus server 统一从Pushgateway 拉取数据

2.数据存储计算

Prometheus server的Retrieval通过HTTP server(即Exporters),在活跃的target主机上抓取监控指标数据,不论是直接指定的主机(Prometheus targets),还是通过服务发现的目标主机(discovery targets)

Prometheus server的Retrieval组件,在抓取到数据后,会将数据存储到Stroage(Prometheus使用TSDB)当中,并存储到节点的磁盘当中,这些数据按照时间序列进行组织,便于后续的分析和查询

3.应用展示及告警

收集到数据后判断信息,一旦警报条件(alert.rules)满足,Prometheus 会记录新的时间序列数据点,这些数据点反映了警报事件的发生,并且可以被用于后续的告警和历史数据分析,通过Alertmanager去发送告警信息

除了记录警报事件,Prometheus 还可以配置为向 Grafana推送警报信息。Grafana 是一个开源的度量分析和可视化套件,它可以从 Prometheus 中获取数据,并根据预先配置的文件对接收到的警报进行处理

三、搭建Prometheus

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

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

(一)Prometheust Server端安装

1.安装服务

可以从官网地址中下载数据包

cs 复制代码
[root@prometheus pm]#ls
prometheus-2.35.0.linux-amd64.tar.gz
[root@prometheus pm]#tar xf prometheus-2.35.0.linux-amd64.tar.gz 
[root@prometheus pm]#ls
prometheus-2.35.0.linux-amd64  prometheus-2.35.0.linux-amd64.tar.gz
[root@prometheus pm]#mv prometheus-2.35.0.linux-amd64 /usr/local/prometheus
[root@prometheus pm]#cd /usr/local/prometheus/
[root@prometheus prometheus]#ls
console_libraries  consoles  LICENSE  NOTICE  prometheus  prometheus.yml  promtool

2.查看相关配置文件

cs 复制代码
[root@prometheus prometheus]#cat /usr/local/prometheus/prometheus.yml | egrep -v "^$|^#"
global:                     '用于prometheus的全局配置,比如采集间隔,抓取超时时间等'
  scrape_interval: 15s      '采集目标主机监控数据的时间间隔,默认为1m'
  evaluation_interval: 15s  '触发告警生成alert的时间间隔,默认是1m'
  # scrape_timeout is set to the global default (10s). '数据采集超时时间,默认10s'
alerting:                   '用于alertmanager实例的配置,支持静态配置和动态服务发现的机制'
  alertmanagers:            '定义了如何与 Alertmanager 通信,以便在告警触发时发送通知'
    - static_configs:       '静态配置 Alertmanager 的地址'
        - targets:          'Alertmanager的地址列表'
          # - alertmanager:9093
rule_files:                 '用于加载告警规则相关的文件路径的配置,可以使用文件名通配机制'
  # - "first_rules.yml"
  # - "second_rules.yml"
scrape_configs:             '用于采集时序数据源的配置,定义了Prometheus如何抓取目标的数据'
  # 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'
    # scheme defaults to 'http'.
    static_configs:
      - targets: ["localhost:9090"]
'静态目标配置,固定从某个target拉取数据'
'在这里,它配置为从 localhost:9090抓取数据,这通常是Prometheus自身的地址,用于自监控'

3.启动服务

cs 复制代码
#添加系统启动文件
[root@prometheus prometheus]#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
[root@prometheus prometheus]#systemctl enable --now prometheus.service   
#立即启动并设置开机自启
Created symlink from /etc/systemd/system/multi-user.target.wants/prometheus.service to /usr/lib/systemd/system/prometheus.service.
[root@prometheus prometheus]#ss -natp |grep 9090
LISTEN   0    128     :::9090       :::*       users:(("prometheus",pid=16994,fd=7))
ESTAB    0    0      ::1:51310    ::1:9090     users:(("prometheus",pid=16994,fd=10)
ESTAB    0    0      ::1:9090     ::1:51310    users:(("prometheus",pid=16994,fd=11)

4.查看监控

浏览器访问:http://Prometheus-server-IP:9090 ,访问到 Prometheus 的 Web UI 界面

点击页面的 Status -> Targets,看到Target状态都为UP,说明Prometheus能正常采集到数据

http://Prometheus-server-IP:9090/metrics ,可以看到 Prometheus 采集到自己的指标数据,

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

四、部署Exporters

注释:所有的部署Exporters包,都可以在官方网站中下载

(一)部署Node Exporter

Node Exporter用于监控系统级指标,它会监控整个系统的资源信,并通过HTTP协议,将自己的数据信息供Prometheus获取

|------------|---------------|---------------|--------------------|
| 主机名 | IP地址 | 安装服务 | 主机类型 |
| prometheus | 192.168.83.60 | prometheus | prometheus-server |
| node | 192.168.83.70 | node_exporter | prometheus-targets |

1.安装Exporters组件

在target主机上进行操作

上传node_exporter-1.3.1.linux-amd64.tar.gz 到系统目录中,并解压

cs 复制代码
[root@node data]#ls
node_exporter-1.3.1.linux-amd64.tar.gz
[root@node data]#tar xf node_exporter-1.3.1.linux-amd64.tar.gz 
[root@node data]#ls
node_exporter-1.3.1.linux-amd64  node_exporter-1.3.1.linux-amd64.tar.gz
[root@node data]#ls node_exporter-1.3.1.linux-amd64
LICENSE  node_exporter  NOTICE
[root@node data]#mv node_exporter-1.3.1.linux-amd64/node_exporter /usr/local/sbin/
[root@node data]#ll /usr/local/sbin/
总用量 17804
-rwxr-xr-x 1 3434 3434 18228926 12月  5 2021 node_exporter

2.启动服务

添加系统启动文件,并启动服务

cs 复制代码
[root@node data]#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/sbin/node_exporter \ #服务启动路径,也就是上一步操作中移动的命令执行文件
--collector.ntp \
--collector.mountstats \
--collector.systemd \
--collector.tcpstat

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

[Install]
WantedBy=multi-user.target
EOF
[root@node data]#systemctl enable --now node_exporter.service 
[root@node data]#systemctl status node_exporter.service 
● node_exporter.service - node_exporter
   Loaded: loaded (/usr/lib/systemd/system/node_exporter.service; enabled; vendor preset: disabled)
   Active: active (running) since 四 2024-06-13 17:58:21 CST; 2s ago
     Docs: https://prometheus.io/
 Main PID: 7888 (node_exporter)
   CGroup: /system.slice/node_exporter.service

3.浏览器访问验证

查看本机是否能够收集到数据,本机能采集到数据,Prometheus才会通过接口采集数据

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

cs 复制代码
[root@node data]#ss -natp |grep node_exporter  
LISTEN   0    128     :::9100   :::*   users:(("node_exporter",pid=7888,fd=3))
#查看node_exporter收集数据的接口

4.常见的指标参数

node_cpu_seconds_total

描述:这是 CPU 使用时间的累积计数器,以秒为单位。

维度:它通常具有多个标签,如 cpu(CPU 核心的编号)、mode(如 "user"、"system"、"idle" 等)。

用途:计算 CPU 使用率。

node_memory_MemTotal_bytes

描述:主机的总物理内存量(以字节为单位)。

维度:通常没有额外的标签。

用途:计算内存使用率。

node_filesystem_size_bytes{mount_point=PATH}

描述:特定挂载点(由 mount_point 标签指定)的文件系统大小(以字节为单位)。

维度:mount_point(文件系统挂载点)和其他可能的标签。

用途:监视文件系统的容量和增长。

node_system_unit_state{name=}

描述:这可能与 systemd 服务单元的状态有关,但具体细节可能因 Prometheus 导出器和/或相关插件而异。

维度:name(systemd 服务单元的名称)和其他可能的标签。

用途:监视 systemd 服务单元的状态。

node_vmstat_pswpin

描述:从磁盘交换到物理内存(RAM)的页面数量。

维度:通常没有额外的标签。

用途:监视交换活动。

node_vmstat_pswpout

描述:从物理内存(RAM)交换到磁盘的页面数量。

维度:通常没有额外的标签。

用途:监视交换活动。

5.加入到prometheus监控

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

cs 复制代码
[root@prometheus prometheus]#vim /usr/local/prometheus/prometheus.yml
......
 30   - job_name: "nodes"            #抓取配置的标识符
 31     metrics_path: '/metrics'     #指定了Prometheus在目标主机上查找度量指标的HTTP路径
 32     static_configs:              #配置列表,static指静态配置的,即不会随时间动态变化
 33     - targets:                   #指定Prometheus要抓取度量指标的目标主机和端口,可以为多个
 34       - 192.168.83.70:9100       #目标主机的 IP 地址和端口号
 35       labels:                    #添加自定义标签。这些标签在查询和分析数据时非常有用
 36         service: node            #这里定义了一个名为 service 的标签,其值为 node
---------------------------------------------------------------------------------------
#总的来说,这个配置片段定义了一个名为 "nodes" 的 Prometheus job,
#它告诉 Prometheus 如何从 IP 地址为 192.168.83.70、端口为 9100 的主机上抓取度量指标,
#并为这些度量指标添加一个 service 标签,其值为 node

重新加载配置文件

修改完配置文件后,使用以下两种指令任意一种重新加载文件

curl -X POST http://Prometheus-server-IP:9090/-/reload

systemctl reload prometheus

cs 复制代码
[root@prometheus prometheus]#curl -X POST http://192.168.83.60:9090/-/reload
#重新加载完毕之后,浏览器查看Prometheus页面的 Status -> Targets

(二)监控MySQL

|------------|---------------|-----------------------------|--------------------|
| 主机名 | IP地址 | 安装服务 | 主机类型 |
| prometheus | 192.168.83.60 | prometheus | prometheus-server |
| mysql | 192.168.83.20 | mysql-5.7.20 mysql_exporter | prometheus-targets |

1.安装Exporters组件

上传 mysqld_exporter-0.14.0.linux-amd64.tar.gz 到mysql服务器的系统目录中,并解压

cs 复制代码
[root@mysql data]#ls
mysqld_exporter-0.14.0.linux-amd64.tar.gz
[root@mysql data]#tar xf mysqld_exporter-0.14.0.linux-amd64.tar.gz 
[root@mysql data]#ls
mysqld_exporter-0.14.0.linux-amd64  mysqld_exporter-0.14.0.linux-amd64.tar.gz
[root@mysql data]#ls mysqld_exporter-0.14.0.linux-amd64
LICENSE  mysqld_exporter  NOTICE
[root@mysql data]#mv mysqld_exporter-0.14.0.linux-amd64/mysqld_exporter /usr/local/sbin/
[root@mysql data]#ll /usr/local/sbin/
total 14808
-rwxr-xr-x 1 3434 3434 15163162 Mar  5  2022 mysqld_exporter

2.添加系统启动文件

cs 复制代码
[root@mysql data]#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/sbin/mysqld_exporter --config.my-cnf=/etc/my.cnf

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

[Install]
WantedBy=multi-user.target
EOF

3.修改MySQL配置文件

cs 复制代码
[root@mysql data]#cat /etc/my.cnf
[client]
......
host=localhost
user=exporter
password=123123
#在[client]模块中,添加mysql-exporter访问的用户名与密码信息
......

4.授权exporter用户

[root@mysql ~]#mysql -uroot -p123456

mysql> GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'localhost' IDENTIFIED BY '123123';

Query OK, 0 rows affected, 2 warnings (0.00 sec)

mysql> flush privileges;

Query OK, 0 rows affected (0.00 sec)


PROCESS:允许用户查询关于MySQL服务器内部操作的信息

REPLICATION CLIENT:允许用户查询主/从复制状态,包括从服务器和主服务器的状态

SELECT:允许用户在所有数据库和所有表上进行 SELECT 操作

5.启动服务

cs 复制代码
[root@mysql data]#systemctl restart mysqld
#重启MySQL
[root@mysql data]#systemctl start mysqld_exporter
[root@mysql data]#systemctl enable mysqld_exporter
[root@mysql data]#ss -natp |grep mysqld_exporter
LISTEN     0  128   [::]:9104     [::]:*   users:(("mysqld_exporter",pid=85985,fd=3))

6.加入到prometheus监控

cs 复制代码
[root@prometheus prometheus]#vim /usr/local/prometheus/prometheus.yml
......
 38   - job_name: "mysqld"
 39     metrics_path: '/metrics'
 40     static_configs:
 41       - targets:
 42         - 192.168.83.20:9104
 43         labels:
 44           service: mysqld
#添加MySQL的targets主机信息
[root@prometheus prometheus]#systemctl reload prometheus
#重新加载配置文件

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

(三)监控Nginx

|------------|---------------|---------------------------------------------------|--------------------|
| 主机名 | IP地址 | 安装服务 | 主机类型 |
| prometheus | 192.168.83.60 | prometheus | prometheus-server |
| nginx | 192.168.83.80 | nginx-1.18.0 nginx-module-vts/tags nginx_exporter | prometheus-targets |

下载 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

1.安装nginx插件

cs 复制代码
[root@nginx data]#ls
nginx-module-vts-0.1.18.tar.gz
[root@nginx data]#tar xf nginx-module-vts-0.1.18.tar.gz 
[root@nginx data]#ls
nginx-module-vts-0.1.18  nginx-module-vts-0.1.18.tar.gz
[root@nginx data]#mv nginx-module-vts-0.1.18 /usr/local/nginx-module-vts

nginx-module-vts-0.1.18插件,即Nginx虚拟主机流量状态模块(nginx-module-vts),

是一个用于监控Nginx服务器性能指标和流量统计的第三方模块
性能监控

提供了对Nginx服务器性能的实时监控功能,允许管理员或开发者实时查看Nginx服务器的运行状态。

通过HTTP接口,可以获取关于Nginx服务器的详细信息,如连接数、请求处理速度等。
流量统计

监控和统计Nginx服务器的流量情况,包括请求数、响应数、响应耗时等。
丰富的指标

除了基本的连接数和请求数外,还提供如响应时间分布、访问用户国家分布等更细粒度的指标。

这些指标有助于更全面地了解Nginx服务器的性能和流量情况。

2.编译安装nginx

cd /data

useradd -M -s /sbin/nologin nginx

tar xf nginx-1.18.0.tar.gz

cd /data/nginx-1.18.0

yum -y install gcc pcre-devel openssl-devel zlib-devel openssl openssl-devel

./configure --prefix=/usr/local/nginx \

--user=nginx \

--group=nginx \

--with-http_ssl_module \

--with-http_v2_module \

--with-http_realip_module \

--with-http_stub_status_module \

--with-http_gzip_static_module \

--with-pcre \

--with-stream \

--with-stream_ssl_module \

--add-module=/usr/local/nginx-module-vts \ #指定nginx-module-vts模块

--with-stream_realip_module

make -j 4 &&make install

ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/

cat > /usr/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 -1 $MAINPID

ExecStop=/bin/kill -3 $MAINPID

PrivateTmp=true

[Install]

WantedBy=multi-user.target

EOF

chown -R nginx.nginx /usr/local/nginx

systemctl daemon-reload

3.修改配置文件

修改nginx的配置文件,启用vts模块

cs 复制代码
[root@nginx data]]#vim /usr/local/nginx/conf/nginx.conf
 17 http {
......
 20     vhost_traffic_status_zone;
 21     vhost_traffic_status_filter_by_host on;
......
 35 
 36     server {
 37         vhost_traffic_status off;
 38         listen 80;
 39         server_name localhost;       #此server_name会被vhost_traffic_status追踪 
 40         allow 127.0.0.1;
 41         allow 192.168.83.60;         #允许Prometheus服务器访问
......
 50         location /nginx_status {
 51             stub_status on;          #显示Nginx的基本状态信息
 52             access_log off;          #关闭日志
 53         }
 54 
 55         location /status {
 56             vhost_traffic_status_display;  #显示vhosttraffic_status的统计信息
 57             vhost_traffic_status_display_format html;  #使用HTML格式显示
 58         }
......
 90     }
......
 128 }
[root@nginx data]]#systemctl  enable --now nginx



----------------------------------------------------------------------------------------
vhost_traffic_status_zone;
'这一行定义了一个名为 vhost_traffic_status 的共享内存区域,用于存储统计信息。'

vhost_traffic_status_filter_by_host on;
'这一行启用了按主机名过滤的功能。当启用此功能时,vhost_traffic_status 模块将只显示与 server_name 指令匹配的主机的统计信息。'
'如果您的 Nginx 配置中有多个 server 块,并且您只想查看特定主机名的统计信息,这将非常有用。'
'Nginx配置有多个server_name的情况下,会根据不同的server_name进行流量的统计,否则默认会把流量全部计算到第一个 server_name 上'

访问查看信息,可以看到 Nginx Vhost Traffic Status 的页面信息

4.安装Exporters组件

4.1 安装组件
cs 复制代码
[root@nginx data]#ls nginx-vts-exporter-0.10.3.linux-amd64.tar.gz 
nginx-vts-exporter-0.10.3.linux-amd64.tar.gz
[root@nginx data]#tar xf nginx-vts-exporter-0.10.3.linux-amd64.tar.gz 
[root@nginx data]#mv nginx-vts-exporter-0.10.3.linux-amd64/nginx-vts-exporter /usr/local/sbin/
[root@nginx data]#ll /usr/local/sbin/
总用量 9752
lrwxrwxrwx 1 root root      27 6月  13 22:58 nginx -> /usr/local/nginx/sbin/nginx
-rwxr-xr-x 1 2000 2000 9982855 3月  28 2018 nginx-vts-exporter
4.2 启动服务
cs 复制代码
[root@nginx data]#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/sbin/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
[root@nginx data]#systemctl enable --now nginx-exporter
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx-exporter.service to /usr/lib/systemd/system/nginx-exporter.service.
[root@nginx data]#ss -natp |grep nginx-vts-exp
LISTEN  0   128    [::]:9913      [::]:*   users:(("nginx-vts-expor",pid=66900,fd=3))

5.加入到prometheus监控

cs 复制代码
[root@prometheus prometheus]#vim /usr/local/prometheus/prometheus.yml
......
 46   - job_name: "nginx"
 47     metrics_path: '/metrics'
 48     static_configs:
 49       - targets:
 50         - 192.168.83.80:9913
 51         labels:
 52           service: nginx
[root@prometheus prometheus]#systemctl reload prometheus.service

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

五、部署Prometheus服务发现

Prometheus服务发现是一种机制,它允许Prometheus自动检测和动态更新其监控目标列表,而无需手动修改配置文件。这对于微服务架构尤其重要,因为服务实例可能会频繁地启动和停止。Prometheus支持多种服务发现机制,包括静态配置、File SD、Consul SD、Kubernetes SD等

[root@prometheus prometheus]#vim /usr/local/prometheus/prometheus.yml

[root@prometheus prometheus]#systemctl reload prometheus.service

(一)基于Consul的服务发现

Consul 是一款基于 golang 开发的开源工具,主要面向分布式,服务化的系统提供服务注册、服务发现和配置管理的功能。提供服务注册/发现、健康检查、Key/Value存储、多数据中心和分布式一致性保证等功能。

下载地址:https://www.consul.io/downloads/

1.部署Consul服务

prometheus服务器上安装cousul服务

1.1 添加执行文件

cs 复制代码
[root@prometheus pm]#ls
consul_0.9.2_linux_amd64.zip
[root@prometheus pm]#unzip consul_0.9.2_linux_amd64.zip 
Archive:  consul_0.9.2_linux_amd64.zip
  inflating: consul                  
[root@prometheus pm]#ls
consul  consul_0.9.2_linux_amd64.zip
[root@prometheus pm]#mv consul /usr/local/bin

1.2 创建目录

创建 Consul 服务的数据目录和配置目录

cs 复制代码
[root@prometheus pm]#mkdir /var/lib/consul-data   #数据目录
[root@prometheus pm]#mkdir /etc/consul/           #配置目录
[root@prometheus pm]#consul agent \
-server \
-bootstrap \
-ui \
-data-dir=/var/lib/consul-data \
-config-dir=/etc/consul/ \
-bind=192.168.83.60 \
-client=0.0.0.0 \
-node=consul-server01 &> /var/log/consul.log &
[root@prometheus pm]#consul members
Node             Address             Status  Type    Build  Protocol  DC
consul-server01  192.168.83.60:8301  alive   server  0.9.2  2         dc1
#查看 consul 集群成员

2.在Consul上注册Services

在配置目录中添加文件

cs 复制代码
[root@prometheus pm]#vim /etc/consul/nodes.json
[root@prometheus pm]#cat /etc/consul/nodes.json
{
  "services": [
    {
      "id": "node_exporter-node",
      "name": "node",
      "address": "192.168.83.70",
      "port": 9100,
      "tags": ["nodes"],
      "checks": [{
        "http": "http://192.168.83.70:9100/metrics",
        "interval": "5s"
      }]
    }]
}
[root@prometheus pm]#consul reload
Configuration reload triggered
#让consul重新加载配置信息
[root@prometheus pm]#ss -natp |grep consul
LISTEN   0    128    192.168.83.60:8300      *:*    users:(("consul",pid=21117,fd=3))
LISTEN   0    128    192.168.83.60:8301      *:*    users:(("consul",pid=21117,fd=10))
LISTEN   0    128    192.168.83.60:8302      *:*    users:(("consul",pid=21117,fd=7))
ESTAB    0    0      192.168.83.60:8300  192.168.83.60:46551   users:(("consul",pid=21117,fd=14))
ESTAB    0    0      192.168.83.60:46551 192.168.83.60:8300    users:(("consul",pid=21117,fd=13))
LISTEN   0    128     :::8500                :::*    users:(("consul",pid=21117,fd=18))
LISTEN   0    128     :::8600                :::*    users:(("consul",pid=21117,fd=17))

3.修改Prometheus配置文件

cs 复制代码
[root@prometheus pm]#vim /usr/local/prometheus/prometheus.yml
......
  - job_name: "nodes"                   #
    consul_sd_configs:                  #指定使用 consul 服务发现
    - server: 192.168.83.60:8500        #指定 consul 服务的端点列表
      tags:                             
#指定 consul 服务发现的 services 中哪些 service 能够加入到 prometheus 监控的标签
      - nodes
      refresh_interval: 2m              #每隔2分钟重新加载一次文件,默认为 5m
[root@prometheus pm]#systemctl restart prometheus.service

(二)基于file_cd的服务发现

基于文件的服务发现是仅仅略优于静态配置的服务发现方式,它不依赖于任何平台或第三方服务,因而也是最为简单和通用的实现方式。

Prometheus Server 会定期从文件中加载 Target 信息,文件可使用 YAML 和 JSON 格式,它含有定义的 Target 列表,以及可选的标签信息

1.创建发现文件

cs 复制代码
[root@prometheus ~]#mkdir /usr/local/prometheus/targets
#创建用于服务发现的目录
[root@prometheus ~]#vim /usr/local/prometheus/targets/mysqld-exporter.yaml 
[root@prometheus ~]#cat /usr/local/prometheus/targets/mysqld-exporter.yaml 
- targets:
  - 192.168.83.20:9104
  labels:
    app: mysqld-exporter
    job: mysqld

2.修改prometheus配置文件

修改 prometheus 配置文件,发现 target 的配置,定义在配置文件的 job 之中

cs 复制代码
[root@prometheus ~]#vim /usr/local/prometheus/prometheus.yml
......
    38	  - job_name: mysqld
    39	    file_sd_configs:          #指定使用文件服务发现
    40	    - files:                  #指定要加载的文件列表
    41	      - targets/mysqld*.yaml  #文件加载支持通配符
    42	      refresh_interval: "2m"
[root@prometheus ~]#systemctl reload prometheus

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

六、部署Grafana进行展示

Grafana是一个开源的数据可视化工具,主要用于大规模指标数据的可视化展现

(一)下载和安装

1.下载rpm包

下载地址:https://grafana.com/grafana/download

https://mirrors.bfsu.edu.cn/grafana/yum/rpm/

cs 复制代码
[root@prometheus grafana]#ls
grafana-7.4.0-1.x86_64.rpm

2.安装服务

使用yum安装,自动解决依赖关系

cs 复制代码
[root@prometheus grafana]#yum install -y grafana-7.4.0-1.x86_64.rpm
[root@prometheus grafana]#systemctl enable --now grafana-server
[root@prometheus grafana]#ss -natp |grep grafana
ESTAB   0   0   192.168.83.60:56218   185.199.109.133:443  users:(("grafana-server",pid=22703,fd=10))
ESTAB   0   0   192.168.83.60:35366   34.120.177.193:443   users:(("grafana-server",pid=22703,fd=9)
LISTEN  0   128      :::3000             :::*              users:(("grafana-server",pid=22703,fd=11))

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

(二)配置数据源

点击 Configuration -> Data Sources -> Add data source -> 选择 Prometheus

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

点击 Save & Test

点击 上方菜单 Dashboards,Import 所有默认模板

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

(三)导入grafana监控面板

浏览器访问:https://grafana.com/grafana/dashboards ,在官方页面中搜索 node exporter ,选择适合的面板,点击 Copy ID 或者 Download JSON

选择合适的版本

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

相关推荐
hikktn38 分钟前
开源宝藏:Smart-Admin 重复提交防护的 AOP 切面实现详解
开源
charley.layabox38 分钟前
LayaAir引擎荣获开源大赛一等奖
开源
键盘上的蚂蚁-39 分钟前
利用开源图床的技巧与实践
开源
Hugging Face41 分钟前
Halo 正式开源: 使用可穿戴设备进行开源健康追踪
开源
OpenCloudOS43 分钟前
开源生态发展合作倡议
开源
n***85946 小时前
嵌入式 UI 开发的开源项目推荐
windows·开源·开源软件
sinovoip10 小时前
Banana Pi BPI-CanMV-K230D-Zero 采用嘉楠科技 K230D RISC-V芯片设计
人工智能·科技·物联网·开源·risc-v
OpenAnolis小助手10 小时前
开源生态发展合作倡议
开源·操作系统·龙蜥社区·龙蜥·openanolis
杭州奥能充电桩11 小时前
移动充储机器人“小奥”的多场景应用(上)
开源·能源
lsjweiyi1 天前
极简AI工具箱网站开源啦!
opencv·开源·微信支付·支付宝支付·百度ai·极简ai工具箱·ai图像处理