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使用步骤
- 安装和配置alertmanager
- 配置Prometheus来和alertmanager通信
- 在Prometheus中创建报警规则
- 在alertmanager中创建发送告警信息的各种规则
Prometheus报警出发流程
- Prometheus采集数据
- 判断当前数据指标是否达到阈值
- 如果触发,根据配置文件中的for字段判断持续时间
- 是的话发送给alertmanager
- alertmanager经过分组、抑制、静默等处理流程
- 发送给指定的接收器,如邮件、微信等
配置方式
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 }}