Prometheus安装方式

  • 二进制方式(本文采用方式)
  • 容器方式
  • Helm
  • Prometheus Operator
  • Kube-Prometheus Stack

下载需要的程序包

cd /usr/local/src
#Prometheus:
wget https://github.com/prometheus/prometheus/releases/download/v2.34.0/prometheus-2.34.0.linux-amd64.tar.gz
#Alertmanager:
wget https://github.com/prometheus/alertmanager/releases/download/v0.24.0/alertmanager-0.24.0.linux-amd64.tar.gz
#node_exporter:
wget https://github.com/prometheus/node_exporter/releases/download/v1.3.1/node_exporter-1.3.1.linux-amd64.tar.gz

Prometheus主程序安装

#环境:一台虚拟机(ip:192.168.199.100)
#解压程序包,并移动到/usr/local
tar xzvf prometheus-2.34.0.linux-amd64.tar.gz
mv prometheus-2.34.0.linux-amd64 /usr/local/prometheus
cd /usr/local/prometheus
#修改prometheus.yml文件如下所示
cat prometheus.yml | sed /^$/d | sed /^#/d | grep -v "#"

global:
  scrape_interval: 15s #默认为15s,用于设置每次数据收集的间隔时间。
  evaluation_interval: 15s
alerting:  #Alertmanager相关配置
  alertmanagers:
    - static_configs:
        - targets:
rule_files: #告警规则文件列表
scrape_configs: #收集信息配置列表
  - job_name: "prometheus"
    scrape_interval: 5s
    static_configs:
      - targets: ["192.168.199.100:9090"]
        labels:
          instance: prometheus
  - job_name: "centos7" #node_exporter信息收集配置
    scrape_interval: 10s
    static_configs:
      - targets: ["192.168.199.100:9100"] #node_exporter默认端口是9100
        labels:
          instance: ansiable


#添加账号,通过此账号启动Prometheus服务
groupadd prometheus
useradd -g prometheus -s /sbin/nologin prometheus
#创建Prometheus数据存储目录
mkdir -p /data/prometheus
#对相应目录进行授权
chown -R prometheus:prometheus /usr/local/prometheus /data/prometheus
#配置Prometheus的systemctl管理服务
vim /usr/lib/systemd/system/prometheus.service
[Unit]
Description=Prometheus
Documentation=https://prometheus.io/
After=network.target

[Service]
# Type设置为notify时,服务会不断重启
Type=simple
User=prometheus
# --storage.tsdb.path是可选项,默认数据目录在运行目录的./dada目录中,修改为刚才配置的/data/prometheus
# --web.enable-lifecycle是可选项,添加后将开启配置文件热加载功能,通过curl -X POST http://ip:port/-/reload实现热加载功能
ExecStart=/usr/local/prometheus/prometheus --config.file=/usr/local/prometheus/prometheus.yml --storage.tsdb.path=/data/prometheus –-web.enable-lifecycle
Restart=on-failure

[Install]
WantedBy=multi-user.target

#对创建的服务管理脚本进行授权
chmod +x /usr/lib/systemd/system/prometheus.service
#设置开机自启并运行Prometheus
systemctl daemon-reload && systemctl enable --now prometheus
#查看Prometheus服务状态
systemctl status prometheus
#通过浏览器访问Prometheus提供的UI界面测试是否部署成功:http://192.168.199.100:9090

部署node_exporter

在Prometheus中收集服务器/业务的数据可以分为两种类型:

  • 云原生应用,云原生应用在开发时就考虑到状态数据采集问题,可以主动暴露出程序的/metrics接口,Prometheus通过访问此类应用的接口即可实现数据的采集,如Kubernetes的etcd等服务,均自带/metrics接口。
  • 非云原生应用,此类应用在开发未曾像云原生应用那样暴露/metrics接口来提供数据,所以通过Prometheus官方或者第三方提供的的exporter来收集此类服务的数据然后再把自身收集到的数据通过/metrics接口暴露出去以供Prometheus来进行收集。

Node_exporter用于收集机器的系统数据,除node_exporter外官方还提供有多重exporter用于收集相关系统的数据,如:blackbox_exporter、haproxy_exporter、memcached_exporter、mysqld_exporter等,可以根据业务的需要去安装相应的exporter来实现数据采集。

node_exporter安装也有几种方式:

  • ansible
  • 二进制:本次采用此种方式安装
  • docker
  • kubernetes-daemonset:只能监控到kubernetes节点的数据
#解压程序包并移动至/usr/local
cd /usr/local/src
tar xzvf node_exporter-1.3.1.linux-amd64.tar.gz && mv node_exporter-1.3.1.linux-amd64 /usr/local/node_exporter
#配置node_exporter的systemctl管理服务
vim /usr/lib/systemd/system/node-exporter.service
[Unit]
Description=node_exporter
Documentation=https://prometheus.io/
After=network.target

[Service]
Type=simple
User=prometheus
ExecStart=/usr/local/node_exporter/node_exporter
Restart=on-failure

[Install]
WantedBy=multi-user.target

#进行授权
chown -R prometheus:prometheus /usr/local/node_exporter
chmod +x /usr/lib/systemd/system/node-exporter.service
#设置开机自启并运行node_exporter
systemctl daemon-reload && systemctl enable --now node-exporter && systemctl status node-exporter

访问Prometheus UI界面可以看到配置的node_exporter已经能够获取到数据了

node_exporter basic认证

可以为node_exporter加上基于basic的用户密码认证,可以按照如下方式进行添加:

#安装htpasswd工具
yum install httpd -y
#生成密码
htpasswd -nBC 12 '' | tr -d ':\n'
New password: 
Re-type new password: 
$2y$12$h.q/60SgtVK28Leiy6lsnuKE86ms.eKklIrns8dzPcck.NfwuRp1u
#此处输入的密码就是prometheus.yml文件中需要添加的密码
#此处生成的hash值就是node_exporter配置需要的密码
#新建如下配置文件/usr/local/node_exporter/config.yml
basic_auth_users:
  admin: $2y$12$h.q/60SgtVK28Leiy6lsnuKE86ms.eKklIrns8dzPfRk.NfwuRp1y
#用户名随意填写,但是需要保证prometheus.yml中的用户名配置和此处保持一致,密码为刚才输入的密码(加密后)
#修改Prometheus配置文件
  - job_name: "L3"
    scrape_interval: 10s
    static_configs:
      - targets: ["10.2.3.2:9100", "10.2.3.3:9100", "10.2.3.4:9100", "10.2.3.5:9100", "10.2.3.7:9100", "10.2.3.11:9100"]
    basic_auth:
      username: admin
      password: admin
#用户名和密码(明文)都需要和此前的配置保持一致
#重启两个服务后即可完成认证

安装grafana

Grafana用于展示信息,通过从Prometheus获取数据并进行友好的图形化展示,同时在Grafana官方也有很多制作者制作的dashboard可以使用。地址如下:
https://grafana.com/grafana/dashboards/?dataSource=prometheus&search=exporter

#下载grafana rpm安装包
wget https://dl.grafana.com/enterprise/release/grafana-enterprise-8.4.4-1.x86_64.rpm
#安装即可
yum localinstall grafana-enterprise-8.4.4-1.x86_64.rpm
#安装后配置自动启动
systemctl enable --now grafana-server
#启动成功后,通过浏览器访问grafana,默认端口为3000,默认账号密码为admin/admin
#在grafana中添加Prometheus的数据源,Prometheus数据源的端口为9090
#可以通过grafana官方搜索到的dashboard来进行界面展示

安装Alertmanager

Prometheus将数据采集和报警分成了两个模块。报警规则配置在Prometheus Servers上,然后发送报警信息到AlertManger,然后我们的AlertManager就来管理这些报警信息,包括silencing、inhibition,聚合报警信息过后通过email、PagerDuty、HipChat、Slack 等方式发送消息提示。

Alertmanager使用步骤

  1. 安装和配置alertmanager
  2. 配置Prometheus来和alertmanager通信
  3. 在Prometheus中创建报警规则
  4. 在alertmanager中创建发送告警信息的各种规则

Prometheus报警出发流程

  1. Prometheus采集数据
  2. 判断当前数据指标是否达到阈值
  3. 如果触发,根据配置文件中的for字段判断持续时间
  4. 是的话发送给alertmanager
  5. alertmanager经过分组、抑制、静默等处理流程
  6. 发送给指定的接收器,如邮件、微信等

配置方式

tar xzvf alertmanager-0.24.0.linux-amd64.tar.gz
mv alertmanager-0.24.0.linux-amd64 /usr/local/alertmanager
mkdir /data/alertmanager
#alertmanager配置规则再行配置,本文针对于安装
#配置alertmanager的systemctl管理服务
vim /usr/lib/systemd/system/alertmanager.service
[Unit]
Description=alertmanager
Documentation=https://prometheus.io/
After=network.target

[Service]
Type=simple
User=prometheus
ExecStart=/usr/local/alertmanager/alertmanager --storage.path=/data/alertmanager --config.file=/usr/local/alertmanager/alertmanager.yml
Restart=on-failure

[Install]
WantedBy=multi-user.target

#授权
chown -R prometheus:prometheus /data/alertmanager
chown -R prometheus:prometheus /usr/local/alertmanager
chmod +x /usr/lib/systemd/system/alertmanager.service
#启动
systemctl daemon-reload && systemctl enable --now alertmanager

Prometheus配置通过Alertmanager进行告警

修改Prometheus配置

#prometheus.yml关键配置如下:
# Alertmanager configuration
alerting:
  alertmanagers:
    - static_configs:
        - targets:
           - 10.2.3.11:9093  #Alertmanager通信地址

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  - "rules/*.yml"    #配置告警规则,符合告警规则的信息将被推送至Alertmanager,Alertmanager接收到告警信息后将根据Alertmanager的配置进行告警通知。
  # - "first_rules.yml"
  # - "second_rules.yml"

#  配置Prometheus告警规则:
# /usr/local/prometheus/rules/node_exporter.yml配置如下:

groups:
- name: node_health #警报规则组名称
  rules:
  - alert: HighMemoryUsage #警报规则的名称
    expr: node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes < 0.6 #告警表达式,通过查询满足此条件的的信息进行推送
    for: 1m    #持续时间,如果状态持续1分钟,那么就推送至Alertmanager
    labels:    #可以自行定义相应标签
      severity: warning    #定义此类告警信息的级别,key=severity为标准写法,value级别有:warning、critical和emergency,严重等级依次增加
    annotations: #自定义告警描述信息
      summary: High memory usage  

rule配置中有一些变量用户来获取告警信息中的值,例如:

  • {{ $labels. }}:用来获取当前告警实列中指定标签的值
  • {{ $value }}:获取当前PromQL表达式计算的值

修改Alertmanager配置

#修改alertmanager.yml主配置文件,配置如下:
global:    #定义发件人信息
  resolve_timeout: 1h
  smtp_smarthost: 'smtp.163.com:465'
  smtp_from: 'xxxxxx@163.com'
  smtp_auth_username: 'xxxxxx@163.com'
  smtp_auth_password: 'xxxxxxxxx'
  smtp_require_tls: false
templates:    #配置告警模板信息,可以编写多个告警模板(钉钉、微信、邮件等)
  - '/etc/alertmanager/config/*.tmpl'
route:    #告警路由规则
  group_by: ['alertname']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 1h
  receiver: 'test'
receivers:    #收件人信息
  - name: 'test'
    email_configs:
      - to: 'aaaaa@163.com'
        html: '{{ template "email.to.html" . }}'    #email.to.html配置告警模板
        send_resolved: true    #是否发送恢复消息
inhibit_rules:
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['alertname', 'dev', 'instance']      

配置Alertmanager告警(邮件)主题模板

 cat /etc/alertmanager/config/email.tmpl 
{{ define "email.to.html" }}
        {{ if gt (len .Alerts.Firing) 0 }}
                {{ range $i, $alert := .Alerts }}
                        <h3>告警邮件</h3>
                        <table border="1">
                                <tr>
                                        <td><strong>告警项:</strong></td>
                                        <td>{{ index $alert.Labels "alertname" }}</td>
                                </tr>
                                <tr>
                                        <td><strong>告警实例:</strong></td>
                                        <td>{{ index $alert.Labels "instance" }}</td>
                                </tr>
                                <tr>
                                        <td><strong>告警级别:</strong></td>
                                        <td bgcolor="{{ index $alert.Labels "severity" }}">{{ index $alert.Labels "severity" }}</td>
                                </tr>
                                <tr>
                                        <td><strong>告警主题:</strong></td>
                                        <td>{{ index $alert.Annotations "summary" }}</td>
                                </tr>
                                <tr>
                                        <td><strong>告警描述:</strong></td>
                                        <td>{{ index $alert.Annotations "description" }}</td>
                                </tr>
                                <tr>
                                        <td><strong>触发时间:</strong></td>
                                        <td>{{ ($alert.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}</td>
                                </tr>
                                <tr>
                                        <td><strong>当前告警值:</strong></td>
                                        <td>{{ index $alert.Annotations "value" }}</td>
                                </tr>
                        </table>
                {{ end }}
        {{ end }}
        {{ if gt (len .Alerts.Resolved) 0 }}
                {{ range $i, $alert := .Alerts }}
                        <h3>告警恢复邮件</h3>
                        <table border="1">
                                <tr>
                                        <td><strong>告警项:</strong></td>
                                        <td>{{ index $alert.Labels "alertname" }}</td>
                                </tr>
                                <tr>
                                        <td><strong>告警实例:</strong></td>
                                        <td>{{ index $alert.Labels "instance" }}</td>
                                </tr>
                                <tr>
                                        <td><strong>告警级别:</strong></td>
                                        <td bgcolor="green"></td>
                                </tr>
                                <tr>
                                        <td><strong>告警主题:</strong></td>
                                        <td>{{ index $alert.Annotations "summary" }}</td>
                                </tr>
                                <tr>
                                        <td><strong>告警描述:</strong></td>
                                        <td>{{ index $alert.Annotations "description" }}</td>
                                </tr>
                                <tr>
                                        <td><strong>恢复时间:</strong></td>
                                        <td>{{ ($alert.EndsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}</td>
                                </tr>
                                <tr>
                                        <td><strong>当前值:</strong></td>
                                        <td>{{ index $alert.Annotations "value" }}</td>
                                </tr>
                        </table>
                {{ end }}
        {{ end }}
{{ end }}

星霜荏苒 居诸不息