prometheus是一款基于时序数据库的开源监控告警系统。
1)Prometheus Server: 用于收集和存储时间序列数据。
2)Client Library: 客户端库,检测应用程序代码,当Prometheus抓取实例的HTTP端点时,客户端库会将所有跟踪的metrics指标的当前状态发送到prometheus server端。
3)Exporters: prometheus支持多种exporter,通过exporter可以采集metrics数据,然后发送到prometheus server端,所有向promtheus server提供监控数据的程序都可以被称为exporter
4)Alertmanager: 从 Prometheus server 端接收到 alerts 后,会进行去重,分组,并路由到相应的接收方,发出报警,常见的接收方式有:电子邮件,企业微信,钉钉, slack等。
5)Grafana:监控仪表盘,可视化监控数据
6)pushgateway: 各个目标主机可上报数据到pushgateway,然后prometheus server统一从pushgateway拉取数据。
postgres_exporter 是一个postgres服务器状态收集组件,服务于prometheus, prometheus 官方提供了mysql的服务器状态的收集组件,postgres的却没有提供,好在拥有万能的github:GitHub - prometheus-community/postgres_exporter: A PostgreSQL metric exporter for Prometheus。
prometheus特点
1)多维度数据模型
每一个时间序列数据都由metric度量指标名称和它的标签labels键值对集合唯一确定:这个metric度量指标名称指定监控目标系统的测量特征(如:http_requests_total- 接收http请求的总计数)。labels开启了Prometheus的多维数据模型:对于相同的度量名称,通过不同标签列表的结合, 会形成特定的度量维度实例。(例如:所有包含度量名称为/api/tracks的http请求,打上method=POST的标签,则形成了具体的http请求)。这个查询语言在这些度量和标签列表的基础上进行过滤和聚合。改变任何度量上的任何标签值,则会形成新的时间序列图。
2)灵活的查询语言(PromQL):可以对采集的metrics指标进行加法,乘法,连接等操作;
3)可以直接在本地部署,不依赖其他分布式存储;
4)通过基于HTTP的pull方式采集时序数据;
5)可以通过中间网关pushgateway的方式把时间序列数据推送到prometheus server端;
6)可通过服务发现或者静态配置来发现目标服务对象(targets)。
7)有多种可视化图像界面,如Grafana等。
8)高效的存储,每个采样数据占3.5 bytes左右,300万的时间序列,30s间隔,保留60天,消耗磁盘大概200G。
9)做高可用,可以对数据做异地备份,联邦集群,部署多套prometheus,pushgateway上报数据
#下载prometheus :
wget https://github.com/prometheus/prometheus/releases/download/v2.12.0/prometheus-2.12.0.linux-amd64.tar.gz
#解压
tar –xvf prometheus-2.12.0.linux-amd64.tar.gz
#校验文件
./promtool check config prometheus.yml
#配置系统启动文件
vim /etc/systemd/system/prometheus.service
[Unit]
Description=Prometheus Server
After=network.target
Documentation=https://prometheus.io/docs/introduction/overview/
[Service]
Type=simple
WorkingDirectory=/disk1/prometheus-2.32.1
ExecStart=/disk1/prometheus-2.32.1/prometheus \
--config.file=/disk1/prometheus-2.32.1/prometheus.yml \
--web.read-timeout=5m \
--web.max-connections=512 \
--storage.tsdb.retention=15d \
--storage.tsdb.path=/disk1/prometheus-2.32.1 \
--query.timeout=2m
Restart=on-failure
[Install]
WantedBy=multi-user.target
#启动
systemctl daemon-reload
systemctl start prometheus
systemctl enable prometheus
systemctl status prometheus
通过浏览器访问prometheus:地址为http://ip:9090
#配置文件
Prometheus.yml
在 Prometheus 中负责数据汇报的程序统一叫做 Exporter, 而不同的 Exporter 负责不同的业务。
# 下载主机监控程序node_exporter
wget https://github.com/prometheus/node_exporter/releases/download/v0.18.1/node_exporter-0.18.1.linux-amd64.tar.gz
# 解压到指定目录
tar -zxf node_exporter-0.18.1.linux-amd64.tar.gz
cd node_exporter-0.18.1.linux-amd64
#接入Prometheus监控
# exporter集中式配置
修改prometheus参数文件
利用 Prometheus 的 static_configs 来拉取 node_exporter 的数据。打开 prometheus.yml 文件, 在 scrape_configs 中添加如下配置
# 配置prometheus.yml文件
cat >> /ups/app/monitor/prometheus/config/prometheus.yml <<-EOF
- job_name: 'node_exporter'
scrape_interval: 1s
file_sd_configs:
- files:
- targets/node/nodes-instances.json
refresh_interval: 10s
relabel_configs:
- action: replace
source_labels: ['__address__']
regex: (.*):(.*)
replacement: $1
target_label: hostname
- action: labeldrop
regex: __meta_filepath
EOF
配置主机服务器列表json文件
Vi targets/node/nodes-instances.json
[
{
"targets": [ "192.168.10.181:9100","192.168.10.182:9100", "192.168.10.190:9100","192.168.10.191:9100","192.168.10.192:9100"]
}
]
# exporter独立配置
每个监控对象独立一个文件配置
修改Prometheus参数配置文件
- job_name: 'node_exporter'
scrape_interval: 1s
file_sd_configs:
- files:
- targets/node/*.yml
refresh_interval: 10s
relabel_configs:
- action: replace
source_labels: ['__address__']
regex: (.*):(.*)
replacement: $1
target_label: hostname
- action: labeldrop
regex: __meta_filepath
配置主机服务器实例文件
vi targets/node/nodes1-instances.yml
[
{
"targets": ["192.168.10.181:9100"],
"labels": { }
}
]
vi targets/node/nodes2-instances.yml
[
{
"targets": ["192.168.10.182:9100"],
"labels": { }
}
]
# 启动node_exporter
nohup ./node_exporter &
查看http:// ip:9100/metrics
或者单独配置将 node_exporter 加入 prometheus.yml配置中
在prometheus服务器上重载prometheus配置
curl -X POST http://ip:9090/-/reload
#下载文件
wget https://github.com/wrouesnel/postgres_exporter/blob/v0.8.0/queries.yaml
wget https://github.com/wrouesnel/postgres_exporter/releases/download/v0.8.0/postgres_exporter_v0.8.0_linux-amd64.tar.gz
queries.yaml文件为自定义指标文件,有需要的话可以自定义
#在监控的数据库上执行一下以下命令(不使用数据库超级管理员的权限的时候,注意更改密码)
CREATE USER postgres_exporter PASSWORD 'admin123456';
ALTER USER postgres_exporter SET SEARCH_PATH TO postgres_exporter,pg_catalog;
CREATE SCHEMA postgres_exporter AUTHORIZATION postgres_exporter;
CREATE FUNCTION postgres_exporter.f_select_pg_stat_activity()
RETURNS setof pg_catalog.pg_stat_activity
LANGUAGE sql
SECURITY DEFINER
AS $$
SELECT * from pg_catalog.pg_stat_activity;
$$;
CREATE FUNCTION postgres_exporter.f_select_pg_stat_replication()
RETURNS setof pg_catalog.pg_stat_replication
LANGUAGE sql
SECURITY DEFINER
AS $$
SELECT * from pg_catalog.pg_stat_replication;
$$;
CREATE VIEW postgres_exporter.pg_stat_replication
AS
SELECT * FROM postgres_exporter.f_select_pg_stat_replication();
CREATE VIEW postgres_exporter.pg_stat_activity
AS
SELECT * FROM postgres_exporter.f_select_pg_stat_activity();
GRANT SELECT ON postgres_exporter.pg_stat_replication TO postgres_exporter;
GRANT SELECT ON postgres_exporter.pg_stat_activity TO postgres_exporter;
#解压安装
tar xf postgres_exporter_v0.8.0_linux-amd64.tar.gz
mv postgres_exporter_v0.8.0_linux-amd64/postgres_exporter /usr/local/bin/
mkdir /etc/postgres_exporter/
mv queries.yaml /etc/postgres_exporter/
chown -R postgres.postgres /etc/postgres_exporter/
#接入Prometheus监控
添加配置Prometheus文件
- job_name: 'postgres_exporter'
scrape_interval: 1s
file_sd_configs:
- files:
- targets/postgresql/*.yml
refresh_interval: 10s
relabel_configs:
- action: replace
source_labels: ['__address__']
regex: (.*):(.*)
replacement: $1
target_label: hostname
- action: labeldrop
regex: __meta_filepath
添加监控对象
vi targets/postgresql/pg1-instance.yml
[
{
"targets": ["localhost:9187"],
"labels": { "instance": 'postgres:5432' }
}
]
#创建启动服务
vim /usr/lib/systemd/system/postgres_exporter.service
[Unit]
Description=postgres_exporter
After=network.target
[Service]
Type=simple
User=postgres
Environment="DATA_SOURCE_NAME=postgresql://postgres_exporter:[email protected]:5432/postgres?sslmode=disable"
ExecStart=/usr/local/bin/postgres_exporter --log.level=error --extend.query-path=queries.yaml
Restart=on-failure
[Install]
WantedBy=multi-user.target
#加载启动文件
systemctl daemon-reload
#启动监控命令
systemctl status postgres_exporter
systemctl start postgres_exporter
systemctl stop postgres_exporter
实现prometheus的告警,需要通过altermanager这个组件;在prometheus服务端写告警规则,在altermanager组件配置邮箱、企业微信、webhook等
Alertmanager与Prometheus是相互分离的两个组件。Prometheus服务器根据报警规则将警报发送给Alertmanager,然后Alertmanager将silencing、inhibition、aggregation等消息通过电子邮件、dingtalk和HipChat发送通知。
Alertmanager处理由例如Prometheus服务器等客户端发来的警报。它负责删除重复数据、分组,并将警报通过路由发送到正确的接收器,比如电子邮件、Slack、dingtalk等。Alertmanager还支持groups,silencing和警报抑制的机制。
wget https://github.com/prometheus/alertmanager/releases/download/v0.21.0/alertmanager-0.21.0.linux-amd64.tar.gz -O /data/alertmanager-0.21.0.linux-amd64.tar.gz
tar xvf /data/alertmanager-0.21.0.linux-amd64.tar.gz -C /data
mv /data/alertmanager-0.21.0.linux-amd64 /data/alertmanager
cat > /usr/lib/systemd/system/alertmanager.service << EOF
[Unit]
Description=https://alertmanager.io
[Service]
Restart=on-failure
ExecStart=/data/alertmanager/alertmanager --config.file=/data/alertmanager/alertmanager.yml --log.format=logfmt --log.level=info --storage.path=/data/alertmanager/data
[Install]
WantedBy=multi-user.target
EOF
/data/alertmanager/amtool check-config alertmanager.yml
systemctl daemon-reload
systemctl restart alertmanager.service
systemctl enable alertmanager.service