Prometheus + Grafana 监控常用服务

一、引言

Prometheus监控常见服务的原理主要包括服务暴露指标和Prometheus抓取指标。一方面,被监控服务通过自身提供的监控接口或借助Exporter将服务的性能指标等数据以HTTP协议的方式暴露出来;另一方面,Prometheus根据配置好的采集任务,定期去拉取这些服务暴露的指标数据,将其存储在本地的时间序列数据库中,之后用户就可以通过PromQL查询来分析这些数据,实现对服务的监控。

二、Prometheus监控MySQL服务

1. 安装数据库

这里就不展示怎么安装啦~

2. 启动数据库

bash 复制代码
[root@elk93 ~]# /etc/init.d/mysql.server start
Starting mysql.server (via systemctl): mysql.server.service.
[root@elk93 ~]# 
[root@elk93 ~]# ss -ntl | grep 3306
LISTEN 0      151                *:3306             *:*          
LISTEN 0      70                 *:33060            *:*          
[root@elk93 ~]# 

# 创建用户并且授权,这里我就用已经存在的用户。
mysql> SELECT user,host,plugin FROM mysql.user;
+------------------+-----------+-----------------------+
| user             | host      | plugin                |
+------------------+-----------+-----------------------+
| linux96          | %         | mysql_native_password |
| nacos            | %         | mysql_native_password |
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session    | localhost | caching_sha2_password |
| mysql.sys        | localhost | caching_sha2_password |
| root             | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+
6 rows in set (0.00 sec)

mysql> 
mysql> GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO linux96;
Query OK, 0 rows affected (0.00 sec)

# 查看权限
mysql> SHOW GRANTS FOR linux96;
+-------------------------------------------------------------------+
| Grants for linux96@%                                              |
+-------------------------------------------------------------------+
| GRANT SELECT, PROCESS, REPLICATION CLIENT ON *.* TO `linux96`@`%` |
| GRANT ALL PRIVILEGES ON `nova_kafka`.* TO `linux96`@`%`      |
+-------------------------------------------------------------------+

3. 下载mysql_exporter

bash 复制代码
[root@elk93 ~]# wget https://github.com/prometheus/mysqld_exporter/releases/download/v0.17.2/mysqld_exporter-0.17.2.linux-amd64.tar.gz

3.解压程序 
[root@elk91 ~]# tar xf mysqld_exporter-0.17.2.linux-amd64.tar.gz  -C /usr/local/bin/ mysqld_exporter-0.17.2.linux-amd64/mysqld_exporter --strip-components=1

mysqld_exporter-0.17.2.linux-amd64/mysqld_exporter显式指定要解压的归档文件内的具体路径。即从压缩包中仅提取 mysqld_exporter-0.17.2.linux-amd64/ 目录下的 mysqld_exporter 文件。
--strip-components=1移除解压路径中的前 1层目录。

[root@elk91 ~]# 
[root@elk91 ~]# ll /usr/local/bin/
total 17936
drwxr-xr-x  2 root root     4096 Mar 27 10:56 ./
drwxr-xr-x 18 root root     4096 Mar 24 18:03 ../
-rwxr-xr-x  1 1001 1002 18356306 Feb 26 15:16 mysqld_exporter*
[root@elk91 ~]# 

4. 启动MySQL exporter

bash 复制代码
# MySQL-exporter可以和要暴露http(s)接口服务在同一个节点,这里分开是为了证明,不在同一个节点也可以。
[root@elk91 ~]# cat .my.cnf 
[client]
user=linux96
password=novacao666
host=10.0.0.93
[root@elk91 ~]# 

[root@elk91 ~]# mysqld_exporter --config.my-cnf="/root/.my.cnf" 
time=2025-03-27T03:09:09.709Z level=INFO source=mysqld_exporter.go:239 msg="Starting mysqld_exporter" version="(version=0.17.2, branch=HEAD, revision=e84f4f22f8a11089d5f04ff9bfdc5fc042605773)"
time=2025-03-27T03:09:09.709Z level=INFO source=mysqld_exporter.go:240 msg="Build context" build_context="(go=go1.23.6, platform=linux/amd64, user=root@18b69b4b0fea, date=20250226-07:16:19, tags=unknown)"
time=2025-03-27T03:09:09.709Z level=INFO source=mysqld_exporter.go:252 msg="Scraper enabled" scraper=global_status
......
time=2025-03-27T03:09:09.710Z level=INFO source=tls_config.go:350 msg="TLS is disabled." http2=false address=[::]:9104

5. 测试访问

bash 复制代码
# 一般数据量大的都是正确的,如果是几十几百就说明我们暴露的数据不太对。
[root@elk93 ~]# curl -s http://10.0.0.91:9104/metrics| wc -l
2573
[root@elk93 ~]# 

6. 配置Prometheus监控MySQL项

bash 复制代码
[root@prometheus-server31 ~]# tail -5 /softwares/prometheus-2.53.4.linux-amd64/prometheus.yml
  - job_name: linux96-mysql-exporter
    static_configs:
      - targets: 
        - 10.0.0.91:9104
       
# 热加载
[root@prometheus-server31 ~]# 
[root@prometheus-server31 ~]# curl -X POST http://10.0.0.31:9090/-/reload

7. 验证监控结果并导入grafana模板

bash 复制代码
# 访问

http://10.0.0.31:9090/targets?search=

grafana导入模板ID 

17320
18949
14057
7362

三、Prometheus监控zookeeper集群

zookeeper没有Prometheus提供的exporter组件,但是他自带metrics暴露方式;打开以下注释即可。

1. 修改zookeeper集群的配置信息

bash 复制代码
[root@elk91 ~]# vim /usr/local/zookeeper/conf/zoo.cfg 
[root@elk91 ~]# 
[root@elk91 ~]# tail -5 /usr/local/zookeeper/conf/zoo.cfg 
# zookeeper没有Prometheus提供的exporter组件,但是他自带metrics暴露方式;打开以下注释即可。
# https://prometheus.io Metrics Exporter
metricsProvider.className=org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider
metricsProvider.httpHost=0.0.0.0
metricsProvider.httpPort=7000
metricsProvider.exportJvmInfo=true
[root@elk91 ~]# 

# 拷贝配置文件到其他集群的节点
[root@elk91 ~]# scp /usr/local/zookeeper/conf/zoo.cfg 10.0.0.92:/usr/local/zookeeper/conf/
[root@elk91 ~]# scp /usr/local/zookeeper/conf/zoo.cfg 10.0.0.93:/usr/local/zookeeper/conf/

2. 重启zookeeper服务

bash 复制代码
[root@elk91 ~]# zkServer.sh restart 
[root@elk92 ~]# zkServer.sh restart 
[root@elk93 ~]# zkServer.sh restart 

3. 访问测试

bash 复制代码
http://10.0.0.91:7000/metrics
http://10.0.0.92:7000/metrics
http://10.0.0.93:7000/metrics

4. 配置prometheus监控zookeeper

bash 复制代码
[root@prometheus-server31 ~]# tail -7 /softwares/prometheus-2.53.4.linux-amd64/prometheus.yml
  - job_name: linux96-zk-exporter
    static_configs:
      - targets: 
        - 10.0.0.91:7000
        - 10.0.0.92:7000
        - 10.0.0.93:7000
.....
[root@prometheus-server31 ~]# 

# 热加载Prometheus
[root@prometheus-server31 ~]# curl -X POST http://10.0.0.31:9090/-/reload
[root@prometheus-server31 ~]# 

5. 验证监控结果并导入grafana模板

bash 复制代码
5.验证配置是否生效
http://10.0.0.31:9090/targets?search=
# 看到Prometheus的targets出现zookeeper集群就行

6.grafana导入模板ID 
10465

四、Prometheus监控kafka集群

1. 启动kafka集群

bash 复制代码
[root@elk91 ~]# kafka-server-start.sh -daemon /usr/local/kafka_2.13-3.9.0/config/server.properties 
[root@elk91 ~]# ss -ntl | grep 9092
LISTEN 0      50     [::ffff:10.0.0.91]:9092             *:*          
[root@elk91 ~]# 

[root@elk92 ~]# kafka-server-start.sh -daemon /usr/local/kafka_2.13-3.9.0/config/server.properties 
[root@elk92 ~]# ss -ntl | grep 9092
LISTEN 0      50     [::ffff:10.0.0.92]:9092             *:*          
[root@elk92 ~]# 


[root@elk93 ~]# kafka-server-start.sh -daemon /usr/local/kafka_2.13-3.9.0/config/server.properties 
[root@elk93 ~]# ss -ntl | grep 9092
LISTEN 0      50     [::ffff:10.0.0.93]:9092             *:*          
[root@elk93 ~]# 

2. 下载kafka exporter

bash 复制代码
wget https://github.com/danielqsj/kafka_exporter/releases/download/v1.9.0/kafka_exporter-1.9.0.linux-amd64.tar.gz

3.解压软件包 
[root@elk92 ~]# tar xf kafka_exporter-1.9.0.linux-amd64.tar.gz -C /usr/local/bin/ kafka_exporter-1.9.0.linux-amd64/kafka_exporter --strip-components=1
[root@elk92 ~]# 
[root@elk92 ~]# ll /usr/local/bin/
total 24520
drwxr-xr-x  2 root root              4096 Mar 27 11:44 ./
drwxr-xr-x 14 root root              4096 Mar 18 14:38 ../
-rwxr-xr-x  1 1001 fwupd-refresh 25099148 Feb 17 11:04 kafka_exporter*
[root@elk92 ~]# 

3. 启动kafka exporter

bash 复制代码
# 这里我们指定了集群信息,和kafka的版本信息
[root@elk92 ~]# kafka_exporter  --kafka.server=10.0.0.91:9092  --kafka.server=10.0.0.92:9092 --kafka.server=10.0.0.93:9092 --kafka.version="3.9.0"

4. 访问kafka exporter的WebUI

bash 复制代码
# 出现大量信息即可
http://10.0.0.92:9308/metrics

5. 配置Prometheus监控kafka集群

bash 复制代码
[root@prometheus-server31 ~]# tail -5 /softwares/prometheus-2.53.4.linux-amd64/prometheus.yml
  - job_name: linux96-kafka-exporter
    static_configs:
      - targets: 
        - 10.0.0.92:9308
...
# 热加载
[root@prometheus-server31 ~]# curl -X POST http://10.0.0.31:9090/-/reload
[root@prometheus-server31 ~]# 

6. 验证监控结果并导入grafana模板

bash 复制代码
# 出现kafka集群的targets即可
http://10.0.0.31:9090/targets?search=

8.grafana导入模板ID
12460
10122

五、prometheus监控nacos服务

nacos服务是自己有提供metrics接口,在配置文件中打开注释即可

参考链接: 监控手册 | Nacos 官网

1. 启动nacos集群

bash 复制代码
[root@elk91 ~]# /usr/local/nacos/bin/startup.sh 
[root@elk92 ~]# /usr/local/nacos/bin/startup.sh 
[root@elk93 ~]# /usr/local/nacos/bin/startup.sh 
访问测试 :
	http://10.0.0.93:8848/

2. 修改nacos服务启用Metrics接口

bash 复制代码
# nacos和zk服务都是自己有提供metrics接口,在配置文件中打开注释即可

[root@elk91 ~]# vim  /usr/local/nacos/conf/application.properties
...
management.endpoints.web.exposure.include=prometheus,health
...
# 将配置文件拷贝给集群的其他节点
[root@elk91 ~]# scp /usr/local/nacos/conf/application.properties 10.0.0.92:/usr/local/nacos/conf/
[root@elk91 ~]# scp /usr/local/nacos/conf/application.properties 10.0.0.92:/usr/local/nacos/conf/

3. 重启服务

bash 复制代码
[root@elk91 ~]# /usr/local/nacos/bin/shutdown.sh 
[root@elk92 ~]# /usr/local/nacos/bin/shutdown.sh 
[root@elk93 ~]# /usr/local/nacos/bin/shutdown.sh 

[root@elk91 ~]# /usr/local/nacos/bin/startup.sh 
[root@elk92 ~]# /usr/local/nacos/bin/startup.sh 
[root@elk93 ~]# /usr/local/nacos/bin/startup.sh 

4. 访问nacos的WebUI

bash 复制代码
http://10.0.0.91:8848/actuator/prometheus
http://10.0.0.92:8848/actuator/prometheus
http://10.0.0.93:8848/actuator/prometheus

5. 配置Prometheus监控nacos集群

bash 复制代码
# 在Prometheus配置文件中,他默认只会发现到是以/metrics结尾的URI,所以这里我们要指引一下Prometheus。加一行配置文件指定。
[root@prometheus-server31 ~]# tail  -8 /softwares/prometheus-2.53.4.linux-amd64/prometheus.yml 
  - job_name: linux96-nacos-exporter
    metrics_path: "/actuator/prometheus"
    static_configs:
      - targets: 
        - 10.0.0.91:8848
        - 10.0.0.92:8848
        - 10.0.0.93:8848
        ......
        
# 热加载Prometheus
[root@prometheus-server31 ~]# curl -X POST http://10.0.0.31:9090/-/reload
[root@prometheus-server31 ~]# 

6. 验证监控结果并导入grafana模板

bash 复制代码
http://10.0.0.31:9090/targets?search=

7.grafana导入模板ID
13221

六、 Prometheus监控docker原生Metrics

参考链接:

https://docs.docker.com/reference/cli/dockerd/#daemon-metrics

1. 停止docker

bash 复制代码
[root@elk93 ~]# systemctl stop docker

2. 修改docker启动脚本启用Metrics监控指标

bash 复制代码
[root@elk93 ~]# cat /lib/systemd/system/docker.service
[Unit]
Description=novacao linux Docke Engine
Documentation=https://docs.docker.com
Wants=network-online.target

[Service]
Type=notify
ExecStart=/usr/bin/dockerd --metrics-addr 0.0.0.0:5200
[Install]
WantedBy=multi-user.target
[root@elk93 ~]# 
[root@elk93 ~]# systemctl daemon-reload
[root@elk93 ~]# 
[root@elk93 ~]# systemctl restart docker.service 
[root@elk93 ~]# 
[root@elk93 ~]# ss -ntl | grep 5200
LISTEN 0      4096                    *:5200             *:*          
[root@elk93 ~]# 

3. 访问docker的Metrics接口

bash 复制代码
http://10.0.0.93:5200/metrics

[root@node-exporter41 ~]# curl -s http://10.0.0.93:5200/metrics| wc -l
589
[root@node-exporter41 ~]# 

4. prometheus监控docker服务

bash 复制代码
[root@prometheus-server31 ~]# tail -5 /softwares/prometheus-2.53.4.linux-amd64/prometheus.yml 
  - job_name: linux96-docker-exporter
    static_configs:
      - targets: 
        - 10.0.0.93:5200

[root@prometheus-server31 ~]# 
[root@prometheus-server31 ~]# curl -X POST http://10.0.0.31:9090/-/reload
[root@prometheus-server31 ~]# 

5. 验证监控结果并导入grafana模板

bash 复制代码
http://10.0.0.31:9090/targets?search=

8.grafana导入模板ID
9621

# 这里Prometheus提供的原生Metrics接口数据显示不全,所以我们有第二种解决方案。

Prometheus基于cAdvisor监控Docker容器

1. cAdvisor是什么?

cAdvisor(Container Advisor)是由Google开源的一款轻量级容器监控工具,主要用于实时收集、分析和展示容器运行时资源使用情况与性能数据,帮助用户了解容器化应用的行为和资源消耗。

2. 在docker节点拉取镜像

bash 复制代码
[root@elk92 ~]# docker pull gcr.io/cadvisor/cadvisor-amd64:v0.52.1
v0.52.1: Pulling from cadvisor/cadvisor-amd64
44cf07d57ee4: Already exists 
.....
Status: Downloaded newer image for gcr.io/cadvisor/cadvisor-amd64:v0.52.1
gcr.io/cadvisor/cadvisor-amd64:v0.52.1
[root@elk92 ~]# 

3. 运行cAdvisor

bash 复制代码
[root@elk92 ~]# docker run \
  --volume=/:/rootfs:ro \
  --volume=/var/run:/var/run:ro \
  --volume=/sys:/sys:ro \
  --volume=/var/lib/docker/:/var/lib/docker:ro \
  --volume=/dev/disk/:/dev/disk:ro \
  --publish=18080:8080 \
  --detach=true \
  --name=cadvisor \
  --privileged \
  --device=/dev/kmsg \
  gcr.io/cadvisor/cadvisor-amd64:v0.52.1
	
[root@elk92 ~]# docker ps -l
CONTAINER ID   IMAGE                                    COMMAND                  CREATED         STATUS                        PORTS                                         NAMES
3857cc9ff34e   gcr.io/cadvisor/cadvisor-amd64:v0.52.1   "/usr/bin/cadvisor -..."   2 minutes ago   Up About a minute (healthy)   0.0.0.0:18080->8080/tcp, :::18080->8080/tcp   cadvisor
[root@elk92 ~]# 

4. 访问测试

bash 复制代码
[root@elk92 ~]# curl -s http://10.0.0.92:18080/metrics | wc -l
4885
[root@elk92 ~]# 

5. 访问cAdVisor的webUI测试

bash 复制代码
http://10.0.0.92:18080/containers/

6. 配置Prometheus监控docker容器

bash 复制代码
[root@prometheus-server31 ~]# tail -6 /softwares/prometheus-2.53.4.linux-amd64/prometheus.yml 
  - job_name: linux96-cadVisor-exporter
    static_configs:
      - targets: 
        - 10.0.0.92:18080
        - 10.0.0.93:18080

# 热加载Prometheus
[root@prometheus-server31 ~]# curl -X POST http://10.0.0.31:9090/-/reload
[root@prometheus-server31 ~]# 

7. 验证监控结果并导入grafana模板

bash 复制代码
http://10.0.0.31:9090/targets?search=

6.grafana导入模板ID
11600 

七、prometheus监控nginx

方案1>nginx-module-vts

1. 编译安装NGINX

bash 复制代码
1.1 安装编译工具
[root@elk91 ~]# apt -y install git wget gcc make zlib1g-dev build-essential libtool openssl libssl-dev

1.2 克隆nginx-module-vts模块
	
# 配置虚拟机VPN
export https_proxy=http://10.0.0.1:7890
export http_proxy=http://10.0.0.1:7890

[root@elk91 ~]# env| grep http
https_proxy=http://10.0.0.1:7890
http_proxy=http://10.0.0.1:7890
[root@elk91 ~]# 

[root@elk91 ~]# git clone https://github.com/vozlt/nginx-module-vts.git
Cloning into 'nginx-module-vts'...
remote: Enumerating objects: 1134, done.
remote: Counting objects: 100% (262/262), done.
remote: Compressing objects: 100% (87/87), done.
remote: Total 1134 (delta 206), reused 175 (delta 175), pack-reused 872 (from 2)
Receiving objects: 100% (1134/1134), 1.22 MiB | 935.00 KiB/s, done.
Resolving deltas: 100% (746/746), done.
[root@elk91 ~]# 

1.3 下载nginx软件包
[root@elk91 ~]# wget http://nginx.org/download/nginx-1.27.3.tar.gz

1.4 解压nginx
[root@elk91 ~]# tar xf nginx-1.27.3.tar.gz 

1.5 配置nginx
[root@elk91 ~]# cd nginx-1.27.3/
[root@elk91 nginx-1.27.3]# 
[root@elk91 nginx-1.27.3]# ./configure --prefix=/softwares/nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --without-http_rewrite_module --with-http_stub_status_module --without-http_gzip_module  --with-file-aio --with-stream --with-stream_ssl_module --with-stream_realip_module --add-module=/root/nginx-module-vts

1.6 编译并安装nginx
make -j 2 && make install

2. 修改nginx的配置文件

bash 复制代码
[root@elk91 nginx-1.27.3]# vim /softwares/nginx/conf/nginx.conf
...
http {
    vhost_traffic_status_zone;
    upstream novacao-promethues {
       server 10.0.0.31:9090;
    }
    ...
    server {
        ...
        location / {
            root   html;
            # index  index.html index.htm;
            proxy_pass http://novacao-promethues;
        }

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

3. 启动NGINX

bash 复制代码
[root@elk91 nginx-1.27.3]# /softwares/nginx/sbin/nginx -t
nginx: the configuration file /softwares/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /softwares/nginx/conf/nginx.conf test is successful
[root@elk91 nginx-1.27.3]# 

1.9 启动nginx
[root@elk91 nginx-1.27.3]# systemctl disable --now nginx
Synchronizing state of nginx.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install disable nginx
Removed /etc/systemd/system/multi-user.target.wants/nginx.service.
[root@elk91 nginx-1.27.3]# 
[root@elk91 nginx-1.27.3]# /softwares/nginx/sbin/nginx 
[root@elk91 nginx-1.27.3]# 

4. 访问nginx的状态页面

bash 复制代码
http://10.0.0.91/nginx_status/	
http://10.0.0.91/nginx_status/format/prometheus

5. 修改Prometheus的配置文件

bash 复制代码
[root@prometheus-server31 ~]# tail -6 /softwares/prometheus-2.53.4.linux-amd64/prometheus.yml 
  - job_name: linux96-nginx-vts-modules
    metrics_path: "/nginx_status/format/prometheus"
    static_configs:
      - targets: 
        - 10.0.0.91:80
       
# 热加载
[root@prometheus-server31 ~]# curl -X POST http://10.0.0.31:9090/-/reload
[root@prometheus-server31 ~]# 

6. 验证监控结果并导入grafana模板

bash 复制代码
# 查看Prometheus
http://10.0.0.31:9090/targets?search=

1.12 导入模板ID 
9785

方案2>安装nginx-vtx-exporter

前提也是需要编译好NGINX

1. 下载nginx-vtx-exporter

bash 复制代码
[root@elk92 ~]# wget https://github.com/sysulq/nginx-vts-exporter/releases/download/v0.10.8/nginx-vtx-exporter_0.10.8_linux_amd64.tar.gz

[root@elk92 ~]# tar xf nginx-vtx-exporter_0.10.8_linux_amd64.tar.gz  -C /usr/local/bin/ nginx-vtx-exporter
[root@elk92 ~]# 
[root@elk92 ~]# ll /usr/local/bin/nginx-vtx-exporter 
-rwxr-xr-x 1 1001 avahi 7950336 Jul 11  2023 /usr/local/bin/nginx-vtx-exporter*
[root@elk92 ~]# 

2. 运行nginx-vtx-exporter

bash 复制代码
[root@elk92 ~]# nginx-vtx-exporter -nginx.scrape_uri=http://10.0.0.91/nginx_status/format/json
2025/03/27 16:25:19 Starting nginx_vts_exporter (version=, branch=, revision=)
2025/03/27 16:25:19 Build context (go=go1.20.5, user=, date=)
2025/03/27 16:25:19 Starting Server at : :9913
2025/03/27 16:25:19 Metrics endpoint: /metrics
2025/03/27 16:25:19 Metrics namespace: nginx
2025/03/27 16:25:19 Scraping information from : http://10.0.0.91/nginx_status/format/json

3. 访问nginx exporter的WebUI

http://10.0.0.93:9913/metrics

4. 配置prometheus采集nginx数据

bash 复制代码
[root@prometheus-server31 ~]# tail -12 /softwares/prometheus-2.53.4.linux-amd64/prometheus.yml 

  - job_name: linux96-nginx-vts-modules
    metrics_path: "/nginx_status/format/prometheus"
    static_configs:
      - targets: 
        - 10.0.0.91:80

  - job_name: "linux96-nginx-vtx-exporter"
    static_configs:
      - targets: 
        - 10.0.0.92:9913

[root@prometheus-server31 ~]# 
[root@prometheus-server31 ~]# curl -X POST http://10.0.0.31:9090/-/reload

5. 验证监控结果并导入grafana模板

bash 复制代码
导入grafana模板  
2949

八、Prometheus监控redis

1. 部署Redis服务

bash 复制代码
1.拉取redis镜像 
[root@elk92 ~]# docker pull redis:7.4.2-alpine
7.4.2-alpine: Pulling from library/redis
...........
Digest: sha256:02419de7eddf55aa5bcf49efb74e88fa8d931b4d77c07eff8a6b2144472b6952
Status: Downloaded newer image for redis:7.4.2-alpine
docker.io/library/redis:7.4.2-alpine

2.部署redis服务 
[root@elk92 ~]# docker run -d --network host --name redis-server redis:7.4.2-alpine 
14f6cd2c24f0735bb5bfd189730898b15380101dd11516ad2af3b7776a33a75a
[root@elk92 ~]# 
[root@elk92 ~]# ss -ntl | grep 6379
LISTEN 0      511               0.0.0.0:6379       0.0.0.0:*          
LISTEN 0      511                  [::]:6379          [::]:*          
[root@elk92 ~]# 

2. 部署redis-exporter

bash 复制代码
wget https://github.com/oliver006/redis_exporter/releases/download/v1.69.0/redis_exporter-v1.69.0.linux-amd64.tar.gz

4.解压软件包 
[root@elk93 ~]# tar xf redis_exporter-v1.69.0.linux-amd64.tar.gz -C /usr/local/bin/ redis_exporter-v1.69.0.linux-amd64/redis_exporter --strip-components=1
[root@elk93 ~]# 
[root@elk93 ~]# ll /usr/local/bin/redis_exporter 
-rwxr-xr-x 1 mysql fwupd-refresh 9638072 Mar 15 12:41 /usr/local/bin/redis_exporter*
[root@elk93 ~]# 

3. 运行redis exporter

bash 复制代码
[root@elk93 ~]# redis_exporter -redis.addr  redis://10.0.0.92:6379
INFO[0000] Redis Metrics Exporter v1.69.0    build date: 2025-03-15-04:40:26    sha1: 71dbe37fb14a4ae2537c1790a239dc1e568ffba5    Go: go1.24.1    GOOS: linux    GOARCH: amd64 
INFO[0000] Providing metrics at :9121/metrics  

4. 访问redis exporter的WebUI

http://10.0.0.93:9121/metrics

5. 配置Prometheus监控redis容器指标

bash 复制代码
[root@prometheus-server31 ~]# tail -7 /softwares/prometheus-2.53.4.linux-amd64/prometheus.yml 

  - job_name: linux96-redis-exporter
    static_configs:
      - targets: 
        - 10.0.0.93:9121 

[root@prometheus-server31 ~]# 
[root@prometheus-server31 ~]# curl -X POST http://10.0.0.31:9090/-/reload
[root@prometheus-server31 ~]# 

6. 验证监控结果并导入grafana模板

bash 复制代码
验证Prometheus配置是否生效
http://10.0.0.31:9090/targets?search=


9.grafana导入模板ID
763
14091 
14615

彩蛋、 grafana安装插件

1. 图表报错提示

bash 复制代码
Panel plugin not found: natel-discrete-panel

说明需要安装对应的插件,使用grafana客户端工具安装即可。

2. 安装指定插件

bash 复制代码
[root@prometheus-server31 ~]# ll /var/lib/grafana/
total 5236
drwxr-xr-x  5 grafana grafana    4096 Mar 27 16:53 ./
drwxr-xr-x 61 root    root       4096 Mar 26 11:59 ../
drwxr-x---  3 grafana grafana    4096 Mar 26 12:00 alerting/
drwx------  2 grafana grafana    4096 Mar 26 12:00 csv/
-rw-r-----  1 grafana grafana 5337088 Mar 27 16:53 grafana.db
drwx------  2 grafana grafana    4096 Mar 26 12:00 png/
[root@prometheus-server31 ~]# 
[root@prometheus-server31 ~]# grafana-cli plugins install natel-discrete-panel
✔ Downloaded and extracted natel-discrete-panel v0.1.1 zip successfully to /var/lib/grafana/plugins/natel-discrete-panel

Please restart Grafana after installing or removing plugins. Refer to Grafana documentation for instructions if necessary.

[root@prometheus-server31 ~]# 
[root@prometheus-server31 ~]# ll /var/lib/grafana/
total 5240
drwxr-xr-x  6 grafana grafana    4096 Mar 27 16:56 ./
drwxr-xr-x 61 root    root       4096 Mar 26 11:59 ../
drwxr-x---  3 grafana grafana    4096 Mar 26 12:00 alerting/
drwx------  2 grafana grafana    4096 Mar 26 12:00 csv/
-rw-r-----  1 grafana grafana 5337088 Mar 27 16:53 grafana.db
drwxr-xr-x  3 root    root       4096 Mar 27 16:56 plugins/  # 安装后会将插件存储在本地。
drwx------  2 grafana grafana    4096 Mar 26 12:00 png/
[root@prometheus-server31 ~]# 

3. 重启grafana使得插件生效

bash 复制代码
[root@prometheus-server31 ~]# systemctl restart grafana-server.service 
[root@prometheus-server31 ~]# 

九、Prometheus监控MongoDB

1. 部署mongoDB服务

bash 复制代码
1.下载mongoDB镜像 
[root@elk92 ~]# docker pull mongo:8.0.6-noble
8.0.6-noble: Pulling from library/mongo
.................
Status: Downloaded newer image for mongo:8.0.6-noble
docker.io/library/mongo:8.0.6-noble
[root@elk92 ~]# 

2.部署mongoDB服务
[root@elk92 ~]# docker run -d --name mongodb-server --network host mongo:8.0.6-noble
4b0f00dea78bb571c216c344984ced026c1210c94db147fdc9e32f549e3135de
[root@elk92 ~]# 
[root@elk92 ~]# docker ps -l
CONTAINER ID   IMAGE               COMMAND                  CREATED         STATUS        PORTS     NAMES
4b0f00dea78b   mongo:8.0.6-noble   "docker-entrypoint.s..."   2 seconds ago   Up 1 second             mongodb-server
[root@elk92 ~]# 
[root@elk92 ~]# ss -ntl | grep 27017
LISTEN 0      4096              0.0.0.0:27017      0.0.0.0:*          
[root@elk92 ~]# 

2. 部署MongoDB的exporter

bash 复制代码
https://github.com/percona/mongodb_exporter/releases/download/v0.43.1/mongodb_exporter-0.43.1.linux-amd64.tar.gz

解压软件包 
[root@elk91 ~]# tar xf mongodb_exporter-0.43.1.linux-amd64.tar.gz -C /usr/local/bin/ mongodb_exporter-0.43.1.linux-amd64/mongodb_exporter --strip-components=1
[root@elk91 ~]# 
[root@elk91 ~]# ll /usr/local/bin/mongodb_exporter 
-rwxr-xr-x 1 1001 geoclue 20467864 Dec 13 20:10 /usr/local/bin/mongodb_exporter*

3. 准备MongoDB测试数据

bash 复制代码
[root@elk91 ~]# vim insert_data.js
// 创建数据库和集合
db = db.getSiblingDB('testdb');

// 插入用户数据(10条)
for (let i = 1; i <= 10; i++) {
  db.users.insertOne({
    name: `user${i}`,
    email: `user${i}@example.com`,
    age: Math.floor(Math.random() * 50 + 18),
    created_at: new Date()
  });
}

// 插入订单数据(10条)
for (let i = 1; i <= 10; i++) {
  db.orders.insertOne({
    user_id: i,
    product: `product${Math.floor(Math.random() * 5)}`,
    amount: Math.random() * 100,
    status: ["pending", "completed", "cancelled"][Math.floor(Math.random() * 3)],
    created_at: new Date()
  });
}

// 插入产品数据(5条)
const products = ["product0", "product1", "product2", "product3", "product4"];
products.forEach((product, index) => {
  db.products.insertOne({
    name: product,
    price: Math.random() * 50 + 20,
    stock: Math.floor(Math.random() * 100)
  });
});

// 创建索引(可选)
db.users.createIndex({ email: 1 });
db.orders.createIndex({ user_id: 1 });

#################################################################

# 将脚本复制到容器内
docker cp insert_data.js mongodb-server:/tmp/insert_data.js

# 执行脚本(使用 mongosh)
docker exec -it mongodb-server mongosh --quiet /tmp/insert_data.js

4. 运行mongodb-exporter

bash 复制代码
mongodb_exporter --mongodb.uri=mongodb://10.0.0.92:27017 --log.level=info --collector.dbstats --collector.diagnosticdata --collector.replicasetstatus --collector.topmetrics --collector.currentopmetrics --collector.exporter-metrics --collector.collstats --collector.indexstats --mongodb.collstats-colls=testdb.users,testdb.orders,testdb.products --mongodb.indexstats-colls=testdb.users,testdb.orders

#####################################3

验证mongoDB-exporter的WebUI
http://10.0.0.91:9216/metrics

5. 配置Prometheus监控mongoDB容器

bash 复制代码
[root@prometheus-server31 ~]# tail -7 /softwares/prometheus-2.53.4.linux-amd64/prometheus.yml 
  - job_name: linux96-mongodb-exporter
    static_configs:
      - targets: 
        - 10.0.0.91:9216
 
[root@prometheus-server31 ~]#
[root@prometheus-server31 ~]# curl -X POST http://10.0.0.31:9090/-/reload

6. 验证监控结果并导入grafana模板

bash 复制代码
grafana导入模板ID
16504

当然如果实在找不到,就只能自己定义Dashboard。

比如: "mongodb_up"

十、Prometheus监控ElasticSearch集群

bash 复制代码
保障ES集群状态正常
[root@elk91 ~]# curl https://10.0.0.91:9200/_cat/nodes  -u elastic:123456 -k
10.0.0.93 59 33 45 7.11 2.18 0.75 cdfhilmrstw - elk93
10.0.0.91 78 44  4 0.73 0.51 0.29 cdfhilmrstw * elk91
10.0.0.92 54 31 34 1.49 0.51 0.18 cdfhilmrstw - elk92

1. 下载elasticsearch_exporter服务插件

bash 复制代码
[root@node-exporter41 ~]# wget https://github.com/prometheus-community/elasticsearch_exporter/releases/download/v1.9.0/elasticsearch_exporter-1.9.0.linux-amd64.tar.gz
2.解压软件包
[root@node-exporter41 ~]# tar xf elasticsearch_exporter-1.9.0.linux-amd64.tar.gz -C /usr/local/bin/ elasticsearch_exporter-1.9.0.linux-amd64/elasticsearch_exporter   --strip-components=1
[root@node-exporter41 ~]# ll /usr/local/bin/
total 14728
drwxr-xr-x  2 root root              4096 Mar 27 02:42 ./
drwxr-xr-x 10 root root              4096 Feb 16  2024 ../
-rwxr-xr-x  1 1001 fwupd-refresh 15069336 Mar  3 10:01 elasticsearch_exporter*

2. 启动elasticsearch-exporter

bash 复制代码
[root@node-exporter41 ~]# elasticsearch_exporter --es.uri="https://elastic:123456@10.0.0.91:9200"  --es.ssl-skip-verify
time=2025-03-27T02:42:46.739Z level=INFO source=clusterinfo.go:211 msg="triggering initial cluster info call"
time=2025-03-27T02:42:46.739Z level=INFO source=clusterinfo.go:182 msg="providing consumers with updated cluster info label"
time=2025-03-27T02:42:46.750Z level=INFO source=main.go:244 msg="started cluster info retriever" interval=5m0s
.....
time=2025-03-27T02:14:19.093Z level=INFO source=tls_config.go:350 msg="TLS is disabled." http2=false address=[::]:9114

3. 配置Prometheus的job服务发现

bash 复制代码
[root@prometheus-server31 ~]# tail -5  /softwares/prometheus-2.53.4.linux-amd64/prometheus.yml
  - job_name: linux96-es-exporter
    static_configs:
      - targets: 
        - 10.0.0.41:9114

5.热加载Prometheus
[root@prometheus-server31 ~]# curl -X POST http://10.0.0.31:9090/-/reload
[root@prometheus-server31 ~]# 

4. 验证监控结果并导入grafana模板

bash 复制代码
验证Prometheus配置是否生效 
http://10.0.0.31:9090/targets?search=

7.grafana导入模板ID
14191
9746

十一、小结

Prometheus监控服务分为三种情况。
1. 第一种情况

在Prometheus官网里面提供了exporter的组件,我们只需要部署好组件然后把要监控的服务使用http(s)的方式暴露出去即可,然后Prometheus修改配置文件,配置好服务发现,最后Grafana套用官方的模版ID即可。(当然也可以自己去制作dashboard展示)。

Prometheus的exporter官网

https://prometheus.io/download/

https://prometheus.io/docs/instrumenting/exporters/

Grafana的模版官网

https://grafana.com/dashboards

2. 第二种情况

有些服务自己本身就支持云原生的Prometheus监控,在自己的配置文件中就支持metrics的接口暴露。只需要在配置文件中修改或者取消注释好配置即可,然后Prometheus修改配置文件,配置好服务发现,最后Grafana套用官方的模版ID即可。(当然也可以自己去制作dashboard展示)。

例如:nacos,zookeeper

3. 第三种情况

第一二种情况都不能达到预期的标准,那么他就会有第三种服务为其metrics提供接口。

例如:docker的cAdvisor

希望这篇文章可以帮助您在生产环境中高效率的解决问题。

最后有关K8S的如何监控可以看我的基于 Operator 部署 Prometheus 实现 K8S 监控-CSDN博客

这篇文章!

相关推荐
Aomnitrix1 小时前
我的容器管理革命:从命令行地狱到可视化操控的蜕变
云原生·eureka
wei_shuo1 小时前
从云原生部署到智能时序分析:基于 Kubernetes 的 Apache IoTDB 集群实战与 TimechoDB 国产化增强特性深度解析
云原生·kubernetes·iotdb
做运维的阿瑞1 小时前
Kubernetes 原生滚动更新(Rolling Update)完整实践指南
云原生·容器·kubernetes
奥尔特星云大使12 小时前
《系统规划与管理师教程(第2版)》方法篇 第10章 云原生系统规划 知识点总结
云原生·软考·高级·系规
wanhengidc12 小时前
云手机的基本原理
运维·服务器·游戏·智能手机·云计算
熙客13 小时前
Kubernetes是如何保证有状态应用数据安全和快速恢复的
mysql·云原生·容器·kubernetes
Wang's Blog14 小时前
Nestjs框架: 微服务项目工程结构优化与构建方案
微服务·云原生·架构·nestjs
似水流年 光阴已逝16 小时前
Kubernetes Pod 基本原理:全面详解
云原生·容器·kubernetes·pod
阿里云云原生16 小时前
评估工程正成为下一轮 Agent 演进的重点
云原生
高旭博19 小时前
10. kubernetes资源——statefulset有状态负载
云原生·容器·kubernetes