1.部署Prometheus

环境介绍:

服务器名称

操作系统

服务器资源情况

软件版本

Prometheus监控

Centos7.9

2c,4g,50g

Prometheus-3.5.3+Grafana13.0.2

Liunx、Nginx

Centos7.9

2c,4g,50g

Nginx-1.24.0

Prometheus官网:Download | Prometheus

Grafana官网:Download Grafana

#设置时间及时区(监控服务器对时间要求很严谨建议配置)
#查看自己服务器的时区
timedatectl
#更换时区为上海
timedatectl set-timezone Asia/Shanghai
#查看服务器时间
date
date -s "2026-07-13 14:30:00"       #时间不正确的话更正时间

1.1部署Prometheus监控端

首先需要确认自己的cpu架构

uname -a

进入官网下载自己服务器情况对应的安装包(x86_64选择amd64)

1.1.1上传压缩包后解压并修改目录名称

1.1.2配置系统服务(方便后续进行管理)

#创建并打开prometheus系统服务文件
vim /usr/lib/systemd/system/prometheus.service
#配置如下(记得先确认下自己的安装目录)

[Unit]
Description=Prometheus Monitoring System
After=network.target

[Service]
Type=simple
ExecStart=/root/prometheus/prometheus \
--config.file=/root/prometheus/prometheus.yml \
--storage.tsdb.path=/root/prometheus/data/ \
--web.enable-lifecycle
Restart=always

[Install]
WantedBy=multi-user.target
systemctl daemon-reload      #重新加载系统服务配置,也就是让你刚刚写的配置生效
systemctl enable prometheus.service --now  #设置开机自启并立即启动
systemctl status prometheus.service   #查看服务的状态

注:如果不重新加载的话启动失败,效果如下:

注:prometheus自带的排错工具:./promtool check config /你的安装路径/prometheus.yml

Prometheus.yml #prometheus的配置文件

# 全局配置
global:
  scrape_interval: 30s # 每30秒一次从客户端拉取一次数据。
  evaluation_interval: 5s # 每隔5秒执行一次告警规则和记录规则,检查下有没有触发告警。
  scrape_timeout: 10s  #单次拉取数据的超时时间。如果被监控机器 10 秒内没响应,就放弃这次拉取

# 告警配置
alerting:
  alertmanagers:
    - static_configs:
        - targets:
          # - alertmanager:9093

# 规则文件
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"]
       # The label name is added as a label `label_name=<label_value>` to any timeseries scraped from this config.
        labels:
          app: "prometheus"
#重新加载配置不重启服务
[root@localhost prometheus]# curl -X POST http://localhost:9090/-/reload  

1.1.3访问测试(默认端口为9090)

注:如果访问不到检查服务是否正常、9090端口是否启动正常、还有服务器防火墙有没有关或者放通策略。

查看监控本机的状态

监控本机的数据(通过http://服务器IP:9090/metrics)

主界面可以查询需要查看的对应数据

1.2 Prometheus配置客户端

Prometheus官网:Download | Prometheus

监控客户端资源情况(需要监控数据库或者中间件的话需要安装别的客户端安装包)

1.2.1上传并解压客户端压缩包

1.2.2创建系统服务

[root@localhost ~]# vim /usr/lib/systemd/system/node_exporter.service
[Unit]
Description=node_exporter
After=network.target 

[Service]
ExecStart=/root/node_exporter/node_exporter
Restart=on-failure

[Install]
WantedBy=multi-user.target
 #重新加载系统服务配置,也就是让你刚刚写的配置生效
[root@localhost ~]# systemctl daemon-reload  
 #设置开机自启并立即启动服务
[root@localhost ~]# systemctl enable node_exporter.service --now
#查看服务状态
[root@localhost ~]# systemctl status node_exporter.service

注:客户端默认端口为9100

2. 安装Grafana

2.1下载安装包

Grafana官网:Download Grafana

无法联网下载压缩包安装,可以联网的话直接复制下面的命令直接安装

2.1.1安装依赖及Grafana

yum -y install fontconfig && yum install -y https://dl.grafana.com/grafana-enterprise/release/13.0.2/grafana-enterprise_13.0.2_26816849631_linux_amd64.rpm

systemctl enable grafana-server.service --now   #grafana开机自启并立即启动
systemctl status grafana-server.service     #查看grafana状态

2.1.2访问测试

(默认端口3000,默认账密:admin/admin)

注:第一次登录会提示修改密码

2.1.3设置中文

点击后下滑,找到Language字段并展开,选择简体中文并保存配置

命令行设置中文

vim /etc/grafana/grafana.ini

2.2 Grafana配置数据源

点击DATA SOURCES

保存并测试

监控模板下载

访问:Grafana dashboards | Grafana Labs

访问后下滑有很多模板

点击模板并下载(可以下载json和复制模板id)

导入模板

导入刚刚下载的json模板再保存下配置

通过模板id导入模板

查看模板-->仪表盘

2.2.1Grafana接入Linux服务器数据

Prometheus监控端配置客户端

[root@localhost prometheus]# vim prometheus.yml
# 全局配置
global:
  scrape_interval: 30s # 每30秒一次从客户端拉取一次数据。
  evaluation_interval: 5s # 每隔5秒执行一次告警规则和记录规则,检查下有没有触发告警。
  scrape_timeout: 10s #单次拉取数据的超时时间。如果被监控机器 10 秒内没响应,就放弃这次拉取

# 告警配置
alerting:
  alertmanagers:
    - static_configs:
        - targets:
          # - alertmanager:9093

# 规则文件
rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
# 抓取配置

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['172.25.62.100:9090']
  - job_name: 'linux'
    static_configs:
      - targets: ['172.25.42.101:9100','172.25.62.101:9100']      #多个IP用,分开

重启prometheus监控端

#重新加载配置不重启服务
[root@localhost prometheus]# curl -X POST http://localhost:9090/-/reload  

Web页面查看客户端数据

错误分析:

这边显示抓取失败,首先查看是否是服务器防火墙问题

这边看到防火墙是开启状态,我们关闭防火墙再看下是否能抓取到

关闭后30秒后再去看下监控端是否已经更新数据

注:前面配置文件已经标明监控端30秒向客户端取一次数据

关闭防火墙后显示客户端状态正常

注:如果不能关闭防火墙的话需要放通监控端访问客户端的9100端口的策略

grafana查看linux服务器数据

2.2.2Grafana接入Nginx服务器数据

Nginx服务器安装nginx-prometheus-exporter

下载地址:

https://github.com/nginxinc/nginx-prometheus-exporter/releases/download/v1.3.0/nginx-prometheus-exporter_1.3.0_linux_amd64.tar.gz

可以联网的话直接执行下方命令:

wget https://github.com/nginx/nginx-prometheus-exporter/releases/download/v1.3.0/nginx-prometheus-exporter_1.3.0_linux_amd64.tar.gz

解压并启动nginx-prometheus-exporter

#将nginx-prometheus-exporter进程放到后台运行

nohup ./nginx-prometheus-exporter/nginx-prometheus-exporter -nginx.scrape-uri http://127.0.0.1:80/nginx_status &

注:nginx-prometheus-exporter会监听服务器的9113端口

[root@localhost ~]# crontab -e
@reboot /usr/local/nginx/sbin/nginx
@reboot /root/nginx-prometheus-exporter/nginx-prometheus-exporter -nginx.scrape-uri http://127.0.0.1:80/nginx_status >> /root/nginx-prometheus-exporter/start.log 2>&1 &

官网安装一个Nginx展示模板

模板:Nginx | Grafana Labs

导入Nginx数据展示模板

输入刚刚复制的模板id并加载

选择数据接入器并加载

nginx -V 2>&1 | grep -o with-http_stub_status_module     #查看是否存在该模块

如果不存的话需要重新编译添加模块

./configure --prefix=/nginx的安装目录 --with-http_stub_status_module  --add-module=nginx-module-vts   #添加模块
make   #编译
make install  #编译安装

注:编译和添加模块不会影响服务,但是编译安装的话会替换掉现有的nginx配置文件,建议先将nginx整个目录全都拷贝以下,安装完再替换回去。

添加完模块后修改nginx.conf配置文件(添加到server模块)

 location /nginx_status {           #访问172.25.62.101服务器的80端口的nginx_status的url会进入该配置执行后续规则
            stub_status on;                  #开启nginx内置状态统计功能
            access_log off;                  #关闭该路径的访问日志记录
            allow 127.0.0.1;                 #只允许172.25.62.100访问本机的nginx_status状态模块
            deny all;                        #拒绝所有IP访问
        }

prometheus配置文件添加Nginx服务器

[root@localhost prometheus]# vim prometheus.yml
# 全局配置
global:
  scrape_interval: 30s # 每30秒一次从客户端拉取一次数据。
  evaluation_interval: 5s # 每隔5秒执行一次告警规则和记录规则,检查下有没有触发告警。
  scrape_timeout: 10s #单次拉取数据的超时时间。如果被监控机器 10 秒内没响应,就放弃这次拉取

# 告警配置
alerting:
  alertmanagers:
    - static_configs:
        - targets:
          # - alertmanager:9093

# 规则文件
rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
# 抓取配置

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['172.25.62.100:9090']
  - job_name: 'linux'
    static_configs:
      - targets: ['172.25.42.101:9100','172.25.62.101:9100']      #多个IP用,分开
  - job_name:  'Nginx'
    static_configs:
      - targets: ['172.25.42.101:9113']
#重启Prometheus
[root@localhost prometheus]# systemctl restart prometheus
[root@localhost prometheus]# systemctl status prometheus
#重新加载配置不重启服务
[root@localhost prometheus]# curl -X POST http://localhost:9090/-/reload  

Web查看是否有数据

查看Grafana的web端是否有数据

3.Prometheus配置告警

3.1 Prometheus配置钉钉告警

3.1.1安装alertmanager

下载地址:Download | Prometheus

上传并解压压缩包

配置系统服务

[root@localhost ~]# cat /usr/lib/systemd/system/alertmanager.service 
[Unit]
Description=Prometheus-Server
After=network.target
[Service]
ExecStart=/root/alertmanager/alertmanager --cluster.advertise-address=0.0.0.0:59093 --config.file=/root/alertmanager/alertmanager.yml
[Install]
WantedBy=multi-user.target
重新加载系统服务配置
systemctl daemon-reload
设置开机自启并直接启动
systemctl enable --now alertmanager

3.1.2安装钉钉告警组件(安装到prometheus服务器上)

wget https://github.com/timonwong/prometheus-webhook-dingtalk/releases/download/v2.1.0/prometheus-webhook-dingtalk-2.1.0.linux-amd64.tar.gz

注:安装显示证书不安全可以跳过证书验证直接安装

跳过证书验证:

Wget --no-check-certificate https://github.com/timonwong/prometheus-webhook-dingtalk/releases/download/v2.1.0/prometheus-webhook-dingtalk-2.1.0.linux-amd64.tar.gz

解压报错解析:

原因是因为下载的文件有问题,大概率是下载失败了,后缀是压缩包的后缀,实际下载的可能是github的页面文件,重新通过国内镜像源下载。

wget --no-check-certificate https://mirror.ghproxy.com/https://github.com/timonwong/prometheus-webhook-dingtalk/releases/download/v2.1.0/prometheus-webhook-dingtalk-2.1.0.linux-amd64.tar.gz

或者直接通过电脑下载也可以,下载完传到服务器,下载地址如下:

https://github.com/timonwong/prometheus-webhook-dingtalk/releases/download/v2.1.0/prometheus-webhook-dingtalk-2.1.0.linux-amd64.tar.gz

解压压缩包

创建系统服务(方便后续管理)

[root@localhost ~]# vim /usr/lib/systemd/system/prometheus-webhook-dingtalk.service
[Service]
ExecStart=/root/prometheus-webhook/prometheus-webhook-dingtalk --config.file=/root/prometheus-webhook/config.example.yml

[Install]
WantedBy=multi-user.target

[Unit]
Description=prometheus-webhook-dingtalk
After=network.target
#重新加载系统服务配置
systemctl daemon-reload
#设置开机自启并直接启动
systemctl enable --now prometheus-webhook-dingtalk

默认端口为8060

配置钉钉告警机器人

3.1.3钉钉机器人和钉钉告警组件关联

修改告警组件配置文件(配置文件的格式建议参照下方图片,参照下方配置文件整体的结构,要不然会报错导致启动失败)

[root@localhost prometheus-webhook]# vim config.example.yml 

[root@localhost alertmanager]# vim alertmanager.yml
route:
  group_by: ['alertname'] #告警分组规则,把标签值相同的告警合并成一组,只发一条汇总通知
  group_wait: 20s # 最初即第一次等待多久时间发送一组警报的通知
#group_wait含义:等待时间,在收到第一个告警后等待多久才发送通知
#作用:给系统时间收集同一分组内的其他相关告警,避免频繁发送
#效果:10秒内同一分组的其他告警会被合并到同一个通知中
  group_interval: 20s # 在发送新警报前的等待时间
#group_interval含义:同一分组内告警的发送间隔
#作用:控制同一组告警通知的更新频率
#效果:每10秒检查一次分组状态,如果有新告警加入或状态变化,会发送更新通知
  repeat_interval: 3m
#repeat_interval含义:重复发送相同告警的间隔时间
#作用:对于持续触发的告警,控制重复提醒的频率
#效果:即使告警状态没有变化,每10秒也会重新发送一次通知
  receiver: 'dingding' # 发送警报的接收者的名称,以下receivers name的名称
#定义警报接收者信息
receivers:
  - name: 'dingding' #钉钉
    webhook_configs: #钉钉配置
      - send_resolved: true
        url: 'http://localhost:8060/dingtalk/webhook1/send' #接收警报的url配置
# 当严重级别 (critical) 告警产生时,自动抑制 / 屏蔽同维度下的警告级别 (warning) 告警,避免大量衍生告警刷屏。
inhibit_rules: #抑制规则
 - source_match: #源标签
    severity: 'critical'
   target_match:
    severity: 'warning'
   equal: ['alertname', 'dev', 'instance']
# 匹配条件:以下标签 取值完全相同 时,才执行抑制
# 1. alertname:告警名称
# 2. dev:自定义设备标签
# 3. instance:监控实例地址(IP:端口)
route:
  group_by: ['alertname'] 
  group_wait: 20s 
  group_interval: 20s 
  repeat_interval: 3m
  
  receiver: 'dingding' 
receivers:
  - name: 'dingding' 
    webhook_configs: 
      - send_resolved: true
        url: 'http://localhost:8060/dingtalk/webhook1/send' 

inhibit_rules: 
 - source_match: 
    severity: 'critical'
   target_match:
    severity: 'warning'
   equal: ['alertname', 'dev', 'instance']

重启监控组件

[root@localhost prometheus]# vim prometheus.yml

# 全局配置
global:
  scrape_interval: 30s # 每30秒一次从客户端拉取一次数据。
  evaluation_interval: 5s # 每隔5秒执行一次告警规则和记录规则,检查下有没有触发告警。
  scrape_timeout: 10s #单次拉取数据的超时时间。如果被监控机器 10 秒内没响应,就放弃这次拉取

# 告警配置
alerting:
  alertmanagers:
    - static_configs:
        - targets:
          - 172.25.62.100:9093  #alertmanagerip+端口
# 规则文件
rule_files:
  - "/root/prometheus/rules/*.yml"     #指定告警规则文件存放位置
  # - "first_rules.yml"
  # - "second_rules.yml"

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
# 抓取配置

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['172.25.62.100:9090']
  - job_name: 'linux'
    static_configs:
      - targets: ['172.25.62.101:9100']      #多个IP用,分开
  - job_name:  'Nginx'
    static_configs:
      - targets: ['172.25.62.101:9113']

创建告警规则

[root@localhost prometheus]# mkdir /root/prometheus/rules
[root@localhost prometheus]# vim /root/prometheus/rules/guize.yml
groups:
- name: node-up
  rules:
#服务器告警规则
  - alert: node-up
    expr: up == 0
    for: 10s
    labels:
      severity: warning
      team: node
    annotations:
      summary: "{{ $labels.instance }} 服务器已停止运行超过 10s!"
#nginx告警规则
  - alert: NginxServiceDown
    expr: nginx_up == 0
    for: 10s
    labels:
      severity: critical
    annotations:
      summary: "Nginx服务异常宕机"
      description: "实例 {{ $labels.instance }} 的Nginx服务已不可用,请尽快排查"
# alert:告警规则的名称。 
# expr:基于 PromQL 表达式告警触发条件,用于计算是否有时间序列满足该条件。
# for:评估等待时间,可选参数。用于表示只有当触发条件多久才发送告警。在等待期间新产生告警的状态为 pending。 
# labels:自定义标签,允许用户指定要附加到告警上的一组附加标签。 
# annotations:用于指定一组附加信息,比如用于描述告警详细信息的文字等,annotations 的内容在告警产生时会一同作为参数发送到 Alertmanager。 
# summary 描述告警的概要信息,description 用于描述告警的详细信息。 
# 同时 Alertmanager 的 UI 也会根据这两个标签值,显示告警信息。
#重新加载prometheus配置文件无需重启
[root@localhost prometheus]# curl -X POST http://localhost:9090/-/reload

Web页面查看告警规则

3.1.4配置钉钉告警模板

[root@localhost ~]# vim prometheus-webhook/contrib/templates/legacy/dingding.tmpl
{{ define "dingtalk.message" }}
{{ if gt (len .Alerts.Firing) 0 }}
### ??【Prometheus告警】<br>
**告警状态:** <font color="red">FIRING 告警中</font><br>
**告警数量:** {{ .Alerts.Firing | len }} 条<br>
<br>
{{ range .Alerts.Firing }}
**━━━━━━━━━━━━━━━━**<br>
**告警名称:** {{ .Labels.alertname }}<br>
**告警级别:** {{ .Labels.severity }}<br>
**故障主机:** {{ .Labels.instance }}<br>
**告警指标:** {{ .Labels.job }}<br>
**触发时间:** {{ (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}<br>
**告警详情:** {{ .Annotations.description }}<br>
**告警概要:** {{ .Annotations.summary }}<br>
**监控链接:** [点击查看]({{ .GeneratorURL }})<br>
<br>
{{ end }}
{{ end }}

{{ if gt (len .Alerts.Resolved) 0 }}
### ??【Prometheus恢复】<br>
**告警状态:** <font color="green">RESOLVED 已恢复</font><br>
**恢复数量:** {{ .Alerts.Resolved | len }} 条<br>
<br>
{{ range .Alerts.Resolved }}
**━━━━━━━━━━━━━━━━**<br>
**告警名称:** {{ .Labels.alertname }}<br>
**告警级别:** {{ .Labels.severity }}<br>
**故障主机:** {{ .Labels.instance }}<br>
**触发时间:** {{ (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}<br>
**告警概要:** {{ .Annotations.summary }}<br>
**恢复时间:** {{ (.EndsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}<br>
**恢复详情:** {{ .Annotations.description }}<br>
<br>
{{ end }}
{{ end }}
{{ end }}

[root@localhost ~]# vim prometheus-webhook/config.example.yml
templates:
  - /root/prometheus-webhook/contrib/templates/legacy/dingding.tmpl
## Request timeout
# timeout: 5s

## Uncomment following line in order to write template from scratch (be careful!)
#no_builtin_template: true

## Customizable templates path
#templates:
#  - contrib/templates/legacy/template.tmpl

## You can also override default template using `default_message`
## The following example to use the 'legacy' template from v0.3.0
#default_message:
#  title: '{{ template "legacy.title" . }}'
#  text: '{{ template "legacy.content" . }}'

## Targets, previously was known as "profiles"
targets:
  webhook1:
    url: https://oapi.dingtalk.com/robot/send?access_token=e96937d98d6c63807287b9bf7515cffb547ecbdb1cda39e1bc54424e3de7aa61
    # secret for signature
    secret: SEC9ebf3700145a31ebc6e502f7d6010d4d6e61d69859fd18b78bc46489aa9339e4
    message:
      title: 'Prometheus监控告警'
      text: '{{ template "dingtalk.message" . }}'
  webhook2:
    url: https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxxxxxx
  webhook_legacy:
    url: https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxxxxxx
    # Customize template content
    message:
      # Use legacy template
      title: '{{ template "dingtalk.message" . }}'
      text: '{{ template "legacy.content" . }}'
  webhook_mention_all:
    url: https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxxxxxx
    mention:
      all: true
  webhook_mention_users:
    url: https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxxxxxx
    mention:
      mobiles: ['156xxxx8827', '189xxxx8325']

配置alertmanager触发钉钉告警组件

[root@localhost ~]# vim /root/alertmanager/alertmanager.yml
templates:
  - /root/prometheus-webhook/contrib/templates/legacy/dingding.tmpl
route:
  group_by: ['alertname'] #告警分组规则,把标签值相同的告警合并成一组,只发一条汇总通知
###############################################################################################################
  group_wait: 20s # 最初即第一次等待多久时间发送一组警报的通知
#group_wait含义:等待时间,在收到第一个告警后等待多久才发送通知
#作用:给系统时间收集同一分组内的其他相关告警,避免频繁发送
#效果:10秒内同一分组的其他告警会被合并到同一个通知中
###############################################################################################################
  group_interval: 20s # 在发送新警报前的等待时间
#group_interval含义:同一分组内告警的发送间隔
#作用:控制同一组告警通知的更新频率
#效果:每10秒检查一次分组状态,如果有新告警加入或状态变化,会发送更新通知
###############################################################################################################
  repeat_interval: 3m
#repeat_interval含义:重复发送相同告警的间隔时间
#作用:对于持续触发的告警,控制重复提醒的频率
#效果:即使告警状态没有变化,每10秒也会重新发送一次通知
###############################################################################################################
  receiver: 'dingding' # 发送警报的接收者的名称,以下receivers name的名称
###############################################################################################################
#定义警报接收者信息
receivers:
  - name: 'dingding' #钉钉
    webhook_configs: #钉钉配置
      - send_resolved: true
        url: 'http://localhost:8060/dingtalk/webhook1/send' #接收警报的url配置
###############################################################################################################
# 当严重级别 (critical) 告警产生时,自动抑制 / 屏蔽同维度下的警告级别 (warning) 告警,避免大量衍生告警刷屏。
inhibit_rules: #抑制规则
 - source_match: #源标签
    severity: 'critical'
   target_match:
    severity: 'warning'
   equal: ['alertname', 'dev', 'instance']
[root@localhost ~]# systemctl restart alertmanager
[root@localhost ~]# systemctl restart prometheus-webhook-dingtalk

测试告警

[root@localhost ~]# nginx -s stop

[root@localhost ~]# nginx

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐