Prometheus 是一个开源的服务监控系统和时序数据库,其提供了通用的数据模型和快捷数据采
集、存储和查询接口。它的核心组件 Prometheus server 会定期从静态配置的监控目标或者基于服
务发现自动配置的目标中进行拉取数据,新拉取到的数据会持久化到存储设备当中
每个被监控的主机都可以通过专用的 exporter 程序提供输出监控数据的接口,它会在目标处收集
监控数据,并暴露出一个 HTTP 接口供 Prometheus server 查询,Prometheus 通过基于 HTTP 的
pull 的方式来周期性的采集数据。
如果存在告警规则,则抓取到数据之后会根据规则进行计算,满足告警条件则会生成告警,并发送
到 Alertmanager 完成告警的汇总和分发
当被监控的目标有主动推送数据的需求时,可以以 Pushgateway 组件进行接收并临时存储数据,
然后等待 Prometheus server 完成数据的采集
任何被监控的目标都需要事先纳入到监控系统中才能进行时序数据采集、存储、告警和展示,监控
目标可以通过配置信息以静态形式指定,也可以让 Prometheus 通过服务发现的机制进行动态管理
Prometheus 能够直接把 API Server 作为服务发现系统使用,进而动态发现和监控集群中的所有可
被监控的对象
TSDB 作为 Prometheus 的存储引擎完美契合了监控数据的应用场景
Prometheus 负责时序型指标数据的采集及存储,但数据的分析、聚合及直观展示以及告警等功能并非由 Prometheus Server 所负责。Prometheus 生态圈中包含了多个组件,其中部分组件可选
服务核心组件,采用 pull 方式采集监控数据,通过 http 协议传输;存储时间序列数据;基于“告警
规则”生成告警通知
Prometheus server 由三个部分组成:Retrieval,Storage,PromQL
客户端库,目的在于为那些期望原生提供 Instrumentation 功能的应用程序提供便捷的开发途径,
用于基于应用程序内建的测量系统。
指标暴露器,负责收集不支持内建 Instrumentation 的应用程序或服务的性能指标数据,并通过
HTTP 接口供 Prometheus Server 获取。
换句话说,Exporter 负责从目标应用程序上采集和聚合原始格式的数据,并转换或聚合为
Prometheus 格式的指标向外暴露。
常用的 Exporters:
服务发现,用于动态发现待监控的 Target,Prometheus 支持多种服务发现机制:文件、DNS、
Consul、Kubernetes 等等。 服务发现可通过第三方提供的接口,Prometheus 查询到需要监控的
Target 列表,然后轮询这些 Target 获取监控数据。该组件目前由 Prometheus Server 内建支持
是一个独立的告警模块,从 Prometheus server 端接收到 “告警通知” 后,会进行去重、分组,并
路由到相应的接收方,发出报警, 常见的接收方式有:电子邮件、钉钉、企业微信等。
Prometheus Server 仅负责生成告警指示,具体的告警行为由另一个独立的应用程序
AlertManager 负责;告警指示由 Prometheus Server 基于用户提供的告警规则周期性计算生成,
Alertmanager 接收到 Prometheus Server 发来的告警指示后,基于用户定义的告警路由向告警接
收人发送告警信息
类似一个中转站,Prometheus 的 server 端只会使用 pull 方式拉取数据,但是某些节点因为某些原
因只能使用 push 方式推送数据, 那么它就是用来接收 push 而来的数据并暴露给 Prometheus 的
server 拉取的中转站
可以理解成目标主机可以上报短期任务的数据到 Pushgateway,然后 Prometheus server 统一从
Pushgateway 拉取数据
是一个跨平台的开源的度量分析和可视化工具,可以将采集的数据可视化的展示,并及时通知给告
警接收方。其官方库中具有丰富的仪表盘插件
Zabbix是一款企业级的开源监控产品,基于C语言开发。它可以用于服务器、操作系统、网络、应
用程序等目标对象监控。在监控和数据收集的方式上,可支持zabbix agent、SNMP、ping、端口
监控等多种方式。
Zabbix属于大而全的系统,具有完善的Web界面,并且集成了可视化、告警等功能。用户可在界面
上完成绝大部分的操作,这使得其上手难度低,可以被快速掌握。但与此同时,高度集成带来的缺
点则是定制化的难度很大,无法很好地进行扩展。
Promehteus是一款近年来非常火热的监控系统,它使用go语言开发,设计思路来源于Google的
Borgmom(一个监控容器平台的系统)。在监控上除了支持传统的服务器、网络、操作系统等对象
外,还天然具有对Kubernetes和Docker等云原生产品的支持,这使得其可以在云原生时代大放异
彩
相比于Zabbix大而全的理念,Prometheus则要简单得多,产品只专注于监控的功能并提供简单
Web界面供用户查询,而将可视化和告警这些功能交由Grafana和Alertmanager等第三方产品来实
现。功能上的简洁使得Prometheus变得小巧而灵活,可以非常方便地进行部署与升级,并与第三
方开源产品搭配实现定制化
Prometheus的操作需要通过修改配置文件来实现,还必须掌握自带的PromQL 语言,在学习门槛
会较高,上手难度比较大。
Zabbix
Zabbix分为两大部分,server端和agent端。agent用于部署在目标机器上,并提供数据指标给到
server,它们之间基于TCP协议进行通信
agent支持被动轮询与主动推送模式,被动模式下由server定时向agent端发起请求,agent会处理
请求并将值返回给到server端。而在主动推送下,则是由agent定时向server端发送结果。
Prometheus
Prometheus基于客户端进行数据的收集,Server端会定时与客户端进行交互,并通过pull方式获取
相关的监控指标
Prometheus 基于HTTP进行通信,这使得与其他工具的集成变得简单,任何组件只要提供对应的
HTTP接口就可以接入监控。目前已有许多开源产品提供了对Prometheus的支持,可以按照其支持
的格式提供指标,如Kubernetes、Harbor等。如果无法做到这一点,那么还有许多库可以帮忙导
出现有指标,这些库被称为exporter,常用的有node exporter、mysql exporter、redis exporter
等
Zabbix
Zabbix使用外部数据库来存储数据,目前支持的数据库有MySQL、PostgreSQL、Oracle等。在存
储的数据类型上,Zabbix除key-value格式外,还支持文本、日志等格式。
Prometheus
Prometheus将数据存储在内置的时间序列数据库(TSDB)中,该数据库相比关系型数据库可以较
大的节省存储空间,并且拥有更高的处理效率,能够快速搜索出复杂的结果。
不过,原生的TSDB对于大数据量的存储支持不太友好,所以默认情况下Pormetheus只会保存15
天的数据。如果需要更长时间的数据存储,可以配置远程存储模式,使用第三方存储介质保存数据
指标
需要注意的是,Prometheus只支持存储时间序列的值。
Zabbix
zabbix在查询方面功能较弱,只能通过Web界面做一些有限度的操作,或者直接到数据库使用SQL
进行查询
Prometheus
Prometheus在查询方面要比Zabbix强大得多。Prometheus提供了自带的查询语言PromQL,该语
言非常灵活、简洁且功能强大,可以与函数和运算符配合,进行计算、过滤、分组等操作,同时支
持正则表达式。
在Prometheus的Web界面可以执行表达式的查询,查询结果以图形或表格数据的形式展现。
Zabbix
与可视化情况一样,Zabbix内置了告警功能,并支持多种介质的发送。Zabbix 警报系统允许以不
同的方式管理事件:发送消息、执行远程命令、根据服务级别升级问题等。
Promtheus
在告警上,Prometehus需要与Alertmanager结合使用。因为Prometheus的告警分为两部分,在
Prometheus Server端定义告警规则,当触发规则时则会发送到Alertmanager,并由其发送给对应
的接收人。
Alertmanager可对告警信息进行管理 ,具有静默、分组、聚合等功能,同时支持Email、IM等多种
介质发送
首先可以肯定zabbix和Prometheus都是非常优秀的监控系统,但从选择上,可以根据实际需求来
确定合适的监控系统
zabbix产生时间更为长,基于c语言开发,Zabbix上手难度要低很多,对于传统的服务器、系统、
网络等都有优秀的监控能力,并且可以根据自定义模板监控加上告警监控机制,,适合对于监控方
面要求不高、整体技术能力较弱的传统企业使用。但是zabbix在云原生的部署上发展时间已经适配
程度都不如Prometheus,对于云原生的来讲,zabbix的运用和效率都没那么理想。
Prometheus是CNCF基金的第二款产品,可以说和k8s是亲兄弟一般的存在,对于Kubernetes等容
器产品的支持非常友好,且定制化程度高。但是上手难度也会更大,因此更适合具有较好技术能
力、监控需求复杂的互联网企业使用。 想运用好Prometheus,promQL数据语言的掌握是必不可
少的
关闭防火墙
systemctl disable --now firewalld
setenforce 0
上传 prometheus-2.35.0.linux-amd64.tar.gz 到 /opt 目录中,并解压
tar xf prometheus-2.45.0.linux-amd64.tar.gz
mv prometheus-2.45.0.linux-amd64 /usr/local/prometheus
cd /usr/local/prometheus/
vim prometheus.yml
scrape_interval: 15s #采集目标主机监控数据的时间间隔,默认为1m
evaluation_interval: 15s #触发告警生成alert的时间间隔,默认是1m
# scrape_timeout is set to the global default (10s).
scrape_timeout: 10s #数据采集超时时间,默认10s
metrics_path: '/metrics' #指标数据采集路径,默认为 /metrics
配置系统启动文件
cd /usr/lib/systemd/system
vim prometheus.service
[Unit]
Description=Prometheus Server
Documentation=https://prometheus.io
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/prometheus/prometheus \
--config.file=/usr/local/prometheus/prometheus.yml \
--storage.tsdb.path=/usr/local/prometheus/data/ \
--storage.tsdb.retention.time=15d \
--web.enable-lifecycle
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
[Install]
WantedBy=multi-user.target
systemctl start prometheus.service
systemctl enable prometheus.service
netstat -lntp | grep 9090
浏览器访问验证
上传 node_exporter-1.3.1.linux-amd64.tar.gz 到 /opt 目录中,并解压
cd /opt/
tar xf node_exporter-1.3.1.linux-amd64.tar.gz
mv node_exporter-1.3.1.linux-amd64 /usr/local/node_exporter
cd /usr/local/node_exporter
mv node_exporter /usr/local/bin/
配置启动文件
cd /usr/lib/systemd/system
vim node_exporter.service
[Unit]
Description=node_exporter
Documentation=https://prometheus.io/
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/node_exporter \
--collector.ntp \
--collector.mountstats \
--collector.systemd \
--collector.tcpstat
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
[Install]
WantedBy=multi-user.target
systemctl start prometheus.service
systemctl enable prometheus.service
netstat -lntp | grep node_exporter
关联prometheus监控9100端口
cd /usr/local/prometheus/
vim prometheus.yml
末尾添加
- job_name: "node_exporter"
scheme: http
metrics_path: /metrics
static_configs:
- targets:
- 192.168.80.101:9100
labels:
service: node_exporter
curl -X POST http://192.168.80.101:9090/-/reload 重新载入配置
浏览器查看
cd /usr/local/bin/
scp node_exporter 192.168.80.102:`pwd`
cd /usr/lib/systemd/system
scp node_exporter.service 192.168.80.102:`pwd`
将本地的配置文件和启动文件复制到需要监控的主机
需监控主机操作
systemctl start node_exporter.service
systemctl enable node_exporter.service
netstat -lntp | grep 9100
普罗米修斯服务器
cd /usr/local/prometheus/
vim prometheus.yml
static_configs:
- targets:
- 192.168.80.101:9100
- 192.168.80.102:9100 #添加需要监控的服务器
labels:
service: node_exporter
curl -X POST http://192.168.80.101:9090/-/reload重载
mysql服务器
cd /opt
上传mysqld_exporter-0.14.0.linux-amd64.tar.gz
tar xf mysqld_exporter-0.14.0.linux-amd64.tar.gz
cd mysqld_exporter-0.14.0.linux-amd64/
mv mysqld_exporter /usr/local/bin/
mysqld_exporter --help
cd /usr/lib/systemd/system
vim mysqld_exporter.service
[Unit]
Description=mysqld_exporter
Documentation=https://prometheus.io/
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/mysqld_exporter --config.my-cnf=/etc/my.cnf
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
[Install]
WantedBy=multi-user.target
修改 MySQL 配置文件
vim /etc/my.cnf
host=localhost
user=exporter
password=abc123
授权 exporter 用户
mysql -u root -abc123
create user 'exporter'@'localhost' identified by 'abc123';
grant process, replication client, select on *.* to 'exporter'@'localhost';
flush privileges;
quit
systemctl restart mysqld_exporter.service
systemctl enable mysqld_exporter.service
netstat -lntp | grep 9104
普罗米修斯服务器
cd /usr/local/prometheus
vim prometheus.yml
- job_name: "mysqld_exporter"
scheme: http
metrics_path: /metrics
static_configs:
- targets:
- 192.168.80.103:9104
labels:
service: mysqld
末尾添加
systemctl reload prometheus.service
上传nginx-1.12.0.tar.gz、nginx-module-vts-0.1.18.tar.gz、 nginx-vts-exporter-0.10.3.linux-amd64.tar.gz
useradd -M -s /sbin/nologin nginx
tar xf nginx-module-vts-0.1.18.tar.gz
mv nginx-module-vts-0.1.18 /usr/local/nginx-module-vts
tar xf nginx-1.12.0.tar.gz
cd nginx-1.12.0/
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module --with-http_ssl_module --add-module=/usr/local/nginx-module-vts
make -j2 && make install
修改 nginx 配置文件,启动 nginx
cd /usr/local/nginx/conf
81 server {
82 listen 8080;
83 vhost_traffic_status off;
84 allow 127.0.0.1;
85 allow 192.168.80.101;
86
87 location /nginx-status {
88 stub_status on;
89 access_log off;
90 }
91 location /vts-status {
92 vhost_traffic_status_display;
93 vhost_traffic_status_display_format html;
94 }
95 }
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
nginx -t
cd /usr/lib/systemd/system
vim nginx.service
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
systemctl start nginx.service
netstat -lntp | grep nginx
解压 nginx-exporter,启动 nginx-exporter
tar xf nginx-vts-exporter-0.10.3.linux-amd64.tar.gz
cd nginx-vts-exporter-0.10.3.linux-amd64/
mv nginx-vts-exporter /usr/local/bin/
cd /usr/lib/systemd/system
vim nginx_vts_exporter.service
[Unit]
Description=nginx-exporter
Documentation=https://prometheus.io/
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/nginx-vts-exporter -nginx.scrape_uri=http://localhost:8080/vts-status/format/json
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
[Install]
WantedBy=multi-user.target
systemctl start nginx_vts_exporter.service
systemctl enable nginx_vts_exporter.service
nginx_vts_exporter --help
netstat -lntp | grep 9913
普罗米修斯服务器
vim prometheus.yml
- job_name: "nginx_vts_exporter"
scheme: http
metrics_path: /metrics
static_configs:
- targets:
- 192.168.80.103:9913
labels:
service: nginx
最后添加
上传grafana-7.4.0-1.x86_64.rpm
rpm -ivh grafana-7.4.0-1.x86_64.rpm
systemctl start grafana-server.service
systemctl enable grafana-server.service
netstat -lntp | grep 3000
浏览器访问
如何查看其他nodeport节点数据
导入 grafana 监控面板
浏览器访问:https://grafana.com/grafana/dashboards ,在页面中搜索 node exporter ,选择适合的面板,点击 Copy ID 或者 Download JSON
因篇幅问题不能全部显示,请点此查看更多更全内容