Prometheus:普罗米修斯
Promethues:普罗米修斯promethues是一个开源的系统监控以及报警系统。整合了zabbix的功能,系统,网络,设备。promethues可以兼容网络,设备。容器监控。告警系统。因为他和k8s是一个项目基金开发的产品,天生匹配k8s的原生系统。容器化和云原生服务适配性很高。prometheus是一个服务监控系统和时序数据库,提供了通用的数据模型和快捷数据采集,存储和接口查询。核心组件:
Promethues:普罗米修斯
promethues是一个开源的系统监控以及报警系统。整合了zabbix的功能,系统,网络,设备。
promethues可以兼容网络,设备。容器监控。告警系统。因为他和k8s是一个项目基金开发的产品,天生匹配k8s的原生系统。容器化和云原生服务适配性很高。
prometheus是一个服务监控系统和时序数据库,提供了通用的数据模型和快捷数据采集,存储和接口查询。
核心组件:prometheus server
定期从静态配置的监控目标或者基于服务发现的自动配置目标中进行拉取数据。拉取到数据会持久化的保存到存储设备之中。
先拉取数据,纳入到监控系统当中,才能进行时序数据采集,存储,告警和展示。
能够直接把api server作为服务发现系统使用。动态监控,动态发现。
Promethues的特点:
1、多维的数据模型。根据不同的函数计算方法,对同一数据可以做出不同的结论。
2、时间序列的数据,按照时间的顺序记录系统,设备变化的数据,容器化的数据。每个数据都是一个样本。服务器指标数据,应用程序的性能监控,网络数据数据都是时间序列数据。
3、通过静态,也可以通过服务自动发现收集数据。
4、promethues自带的原生数据展示不是很友好,数据化展示工具,grafana
prometheus的存储引擎:TSDB
1、能够存储的数据量很庞大
2、大部分都是写入操作。
3、写入操作是一个时序添加,大多数情况下都是按照时间排列。
4、很少更新数据,采集到数据在秒级,或者是分钟级就会被写入数据库。
5、基本数据大,一般超过了内存大小。数据按照一定的时间区间展示,缓存在这里不起作用。
6、读操作,一般都是高并发的操作。
7、就是为了大数据,高并发而生的。
prometheus的组件:
1.Prometheus server
服务核心组件,采用pull方式采集监控数据,通过http协议进行传输,存储时间序列的数据。基于告警规则生成告警通知。
prometheus server是核心,核心分为三部分:
1、retrieval:负责在目标主机抓取监控指标数据
2、storage:存储,把采集的数据保存磁盘当中,默认只保存15天。
3、PromOL:负责把数据按照一定的规则,通过指定的语法形成一个结果,最后展示出来(grafana)。
2.Client Library
客户端库,目的在于为那些期望原生提供 Instrumentation 功能的应用程序提供便捷的开发途径,用于基于应用程序内建的测量系统。
3.Exporters
指标暴露器,负责收集不支持内建 Instrumentation 的应用程序或服务的性能指标数据,并通过 HTTP 接口供 Prometheus Server 获取。
换句话说,Exporter 负责从目标应用程序上采集和聚合原始格式的数据,并转换或聚合为 Prometheus 格式的指标向外暴露。
常用的 Exporters:
Node-Exporter:用于收集服务器节点的物理指标状态数据,如平均负载、CPU、内存、磁盘、网络等资源信息的指标数据,需要部署到所有运算节点。
mysqld-exporter/nginx-exporter
Kube-State-Metrics:为 Prometheus 采集 K8S 资源数据的 exporter,通过监听 APIServer 收集 kubernetes 集群内资源对象的状态指标数据,例如 pod、deployment、service 等等。同时它也提供自己的数据,主要是资源采集个数和采集发生的异常次数统计。需要注意的是 kube-state-metrics 只是简单的提供一个 metrics 数据,并不会存储这些指标数据,所以可以使用 Prometheus 来抓取这些数据然后存储, 主要关注的是业务相关的一些元数据,比如 Deployment、Pod、副本状态等;调度了多少个 replicas ?现在可用的有几个?多少个 Pod 是 running/stopped/terminated 状态?Pod 重启了多少次?有多少 job 在运行中。
cAdvisor:用来监控容器内部使用资源的信息,比如 CPU、内存、网络I/O、磁盘I/O 。
blackbox-exporter:监控业务容器存活性。
4.Service Discovery
服务发现,用于动态发现待监控的 Target,Prometheus 支持多种服务发现机制:文件、DNS、Consul、Kubernetes 等等。 服务发现可通过第三方提供的接口,Prometheus 查询到需要监控的 Target 列表,然后轮询这些 Target 获取监控数据。该组件目前由 Prometheus Server 内建支持
5、Altermanager:独立的告警模块,从prometheus server收到告警通知之后,Altermanager进行重组,分类,发送到对应的接受方电子邮件钉钉企业微信。
6、pushgateway:类似于一个中转站,server端只会pul的方式拉取数据,节点的数据只能以上传(push)的方式发送,先把数据源保存在pushgatway,prometheus server统一从pushgateway拉取数据。
7、grafana:图形化工具。
prometheus的工作流程:
1、prometheus server为核心,收集和存储数据(时间序列数据),从监控目标中通过pul方式拉取数据。或者通过pushgateway把采集到的数据,拉取到server当中。
2、拉取到的数据,保存到本地的磁盘当中。(监控指标数据)
3、如果监控的指标数据触发了告警,发送到altermanager模块,然后根据规则发送告警信息。
4、通过proetheus的自带uiweb页面,通过promgl可以查询出监控户数据
5、grafana可以介入prometheus数据源,把监控数据以图形化的方式展示出来
Prometheus 的局限性
Prometheus 是一款指标监控系统,不适合存储事件及日志等;它更多地展示的是趋势性的监控,而非精准数据;
Prometheus 认为只有最近的监控数据才有查询的需要,其本地存储的设计初衷只是保存短期(例如一个月)数据,因而不支持针对大量的历史数据进行存储;若需要存储长期的历史数据,建议基于远端存储机制将数据保存于 InfluxDB 或 OpenTSDB 等系统中;
Prometheus 的集群机制成熟度不高,可基于 Thanos 实现 Prometheus 集群的高可用及联邦集群。
zabbix和prometheus的对比
(1)指标采集方式
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等。
(2) 数据存储
Zabbix
Zabbix使用外部数据库来存储数据,目前支持的数据库有MySQL、PostgreSQL、Oracle等。在存储的数据类型上,Zabbix除key-value格式外,还支持文本、日志等格式。
Prometheus
Prometheus将数据存储在内置的时间序列数据库(TSDB)中,该数据库相比关系型数据库可以较大的节省存储空间,并且拥有更高的处理效率,能够快速搜索出复杂的结果。
不过,原生的TSDB对于大数据量的存储支持不太友好,所以默认情况下Pormetheus只会保存15天的数据。如果需要更长时间的数据存储,可以配置远程存储模式,使用第三方存储介质保存数据指标。
需要注意的是,Prometheus只支持存储时间序列的值。
(3)查询的性能
Zabbix
zabbix在查询方面功能较弱,只能通过Web界面做一些有限度的操作,或者直接到数据库使用SQL进行查询。
Prometheus
Prometheus在查询方面要比Zabbix强大得多。Prometheus提供了自带的查询语言PromQL,该语言非常灵活、简洁且功能强大,可以与函数和运算符配合,进行计算、过滤、分组等操作,同时支持正则表达式。
在Prometheus的Web界面可以执行表达式的查询,查询结果以图形或表格数据的形式展现。
(4)告警功能
Zabbix
与可视化情况一样,Zabbix内置了告警功能,并支持多种介质的发送。Zabbix 警报系统允许以不同的方式管理事件:发送消息、执行远程命令、根据服务级别升级问题等。
Promtheus
在告警上,Prometehus需要与Alertmanager结合使用。因为Prometheus的告警分为两部分,在Prometheus Server端定义告警规则,当触发规则时则会发送到Alertmanager,并由其发送给对应的接收人。
Alertmanager可对告警信息进行管理 ,具有静默、分组、聚合等功能,同时支持Email、IM等多种介质发送。
prometheus的部署搭建
上传 prometheus-2.35.0.linux-amd64.tar.gz,并解压
mkdir -p /opt/prometheus
cd /opt/prometheus
tar xf prometheus-2.35.0.linux-amd64.tar.gz
mv prometheus-2.35.0.linux-amd64 /usr/local/prometheus
cat /usr/local/prometheus/prometheus.yml | grep -v "^#"
global: #用于prometheus的全局配置,比如采集间隔,抓取超时时间等
scrape_interval: 15s #采集目标主机监控数据的时间间隔,默认为1m
evaluation_interval: 15s #触发告警生成alert的时间间隔,默认是1m
# scrape_timeout is set to the global default (10s).
scrape_timeout: 10s #数据采集超时时间,默认10s
alerting: #用于alertmanager实例的配置,支持静态配置和动态服务发现的机制
alertmanagers:
- static_configs:
- targets:
# - alertmanager:9093
rule_files: #用于加载告警规则相关的文件路径的配置,可以使用文件名通配机制
# - "first_rules.yml"
# - "second_rules.yml"
scrape_configs: #用于采集时序数据源的配置
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: "prometheus" #每个被监控实例的集合用job_name命名,支持静态配置(static_configs)和动态服务发现的机制(*_sd_configs)
# metrics_path defaults to '/metrics'
metrics_path: '/metrics' #指标数据采集路径,默认为 /metrics
# scheme defaults to 'http'.
static_configs: #静态目标配置,固定从某个target拉取数据
- targets: ["localhost:9090"]
将Prometheus加入到系统服务
cat > /usr/lib/systemd/system/prometheus.service <<'EOF'
[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=15d \
--web.enable-lifecycle
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
systemctl start prometheus
systemctl enable prometheus
netstat -natp | grep :9090
进行界面访问
http://192.168.73.108:9090(主机IP) ,访问到 Prometheus 的 Web UI 界面
访问:http://1 92.168.73.108:metrics,查看prometheus的数据采集信息
部署 Exporters ,添加监控主机
部署 Node Exporter 监控系统级指标(对每一个node节点)
上传 node_exporter-1.3.1.linux-amd64.tar.gz 进行解压
mdkir -p /opt/prometheus
cd /opt/prometheus
tar xf node_exporter-1.3.1.linux-amd64.tar.gz
mv node_exporter-1.3.1.linux-amd64/node_exporter /usr/local/bin
将 node_exporter添加到系统服务中
cat > /usr/lib/systemd/system/node_exporter.service <<'EOF'
[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
EOF
(3)启动
systemctl start node_exporter
systemctl enable node_exporter
netstat -natp | grep :9100
修改 prometheus 配置文件,加入到 prometheus 监控中
vim /usr/local/prometheus/prometheus.yml
#在尾部增加如下内容
- job_name: nodes
metrics_path: "/metrics"
static_configs:
- targets:
- 192.168.73.105:9100
- 192.168.73.106:9100
- 192.168.73.107:9100
labels:
service: kubernetes
(5)重新载入配置
curl -X POST http://192.168.73.108:9090/-/reload 或 systemctl reload prometheus
浏览器查看 Prometheus 页面的 Status -> Targets
监控 MySQL 配置示例
在 MySQL 服务器上操作
上传 mysqld_exporter-0.14.0.linux-amd64.tar.gz,并解压
mdkir /opt/prometheus
cd /opt/prometheus
tar xf mysqld_exporter-0.14.0.linux-amd64.tar.gz
mv mysqld_exporter-0.14.0.linux-amd64/mysqld_exporter /usr/local/bin/
添加系统服务
cat > /usr/lib/systemd/system/mysqld_exporter.service <<'EOF'
[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
EOF
修改 MySQL 配置文件,并且 授权exporter 用户
vim /etc/my.cnf
[client]
......
host=localhost
user=exporter
password=abc123
########授权 exporter 用户
mysql -uroot -pabc123
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'localhost' IDENTIFIED BY 'abc123';
对mysqld服务和exporter服务进行重启
systemctl restart mysqld
systemctl start mysqld_exporter
systemctl enable mysqld_exporte
在Prometheus主机上添加mysqld的监控项
vim /usr/local/prometheus/prometheus.yml
#在尾部增加如下内容
- job_name: mysqld
metrics_path: "/metrics"
static_configs:
- targets:
- 192.168.73.109:9104
labels:
service: mysqld
curl -X POST http://192.168.73.108:9090/-/reload 或 systemctl reload prometheus
浏览器查看 Prometheus 页面的 Status -> Targets
监控 Nginx 配置示例
在 Nginx 服务器上预先准备操作:
下载 nginx-exporter 地址:https://github.com/hnlq715/nginx-vts-exporter/releases/download/v0.10.3/nginx-vts-exporter-0.10.3.linux-amd64.tar.gz
下载 nginx 地址:http://nginx.org/download/
下载 nginx 插件地址:https://github.com/vozlt/nginx-module-vts/tags
解压nginx的相关插件
cd /opt/prometheus
tar xf nginx-module-vts-0.1.18.tar.gz
mv nginx-module-vts-0.1.18 /usr/local/nginx-module-vts
源码编译安装nginx并设置暴露监控项
yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make
useradd -M -s /sbin/nologin nginx
cd /opt/prometheus
tar xf nginx-1.18.0.tar.gz
cd nginx-1.18.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 -j 2 & make install
(3)修改 nginx 配置文件,启动 nginx
vim /usr/local/nginx/conf/nginx.conf
http {
vhost_traffic_status_zone; #添加
vhost_traffic_status_filter_by_host on; #添加,开启此功能,在 Nginx 配置有多个 server_name 的情况下,会根据不同的 server_name 进行流量的统计,否则默认会把流量全部计算到第一个 server_name 上
......
server {
......
}
server {
vhost_traffic_status off; #在不想统计流量的 server 区域,可禁用 vhost_traffic_status
listen 8080;
allow 127.0.0.1;
allow 192.168.73.110; #设置为 prometheus 的 ip 地址
location /nginx-status {
stub_status on;
access_log off;
}
location /status {
vhost_traffic_status_display;
vhost_traffic_status_display_format html;
}
}
}
#假如 nginx 没有规范配置 server_name 或者无需进行监控的 server 上,那么建议在此 vhost 上禁用统计监控功能。否则会出现 127.0.0.1、hostname 等的域名监控信息。
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
nginx -t
cat > /lib/systemd/system/nginx.service <<'EOF'
[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
EOF
systemctl start nginx
systemctl enable nginx
浏览器访问:http://192.168.73.110:8080/status ,可以看到 Nginx Vhost Traffic Status 的页面信息
在nginx主机上安装exporter插件
cd /opt/
tar -zxvf nginx-vts-exporter-0.10.3.linux-amd64.tar.gz
mv nginx-vts-exporter-0.10.3.linux-amd64/nginx-vts-exporter /usr/local/bin/
cat > /usr/lib/systemd/system/nginx-exporter.service <<'EOF'
[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/status/format/json
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
systemctl start nginx-exporter
systemctl enable nginx-exporter
netstat -natp | grep :9913
在Prometheus主机上添加nginx的监控项
#########修改 prometheus 配置文件,加入到 prometheus 监控中
vim /usr/local/prometheus/prometheus.yml
#在尾部增加如下内容
- job_name: nginx
metrics_path: "/metrics"
static_configs:
- targets:
- 192.168.73.110:9913
labels:
service: nginx
################重新载入配置
curl -X POST http://192.168.73.108:9090/-/reload 或 systemctl reload prometheus
浏览器查看 Prometheus 页面的 Status -> Targets
更多推荐
所有评论(0)