Prometheus 监控工具详细介绍与安装
前言
本篇文章介绍 k8s集群中部署 prometheus、grafana、alertmanager,并且配置 prometheus 的动态、静态服务发现,实现对容器、物理节点、service、pod 等资源指标监控,并在Grafana 的 web界面展示 prometheus 的监控指标,然后通过配置自定义告警规则,通过 alertmanager 实现 qq、钉钉、微信报警。
Prometheus 监控工具介绍
Prometheus是一个最初在SoundCloud上构建的开源系统监视和警报工具包。
自2012年成立以来,许多公司和组织都采用了Prometheus,该项目拥有一个非常活跃的开发人员和用户社区。它现在是一个独立的开源项目,可以独立于任何公司进行维护。为了强调这一点,并澄清项目的治理结构,Prometheus 于2016年加入 云计算本地计算基金会,作为继Kubernetes之后的第二个托管项目。
https://prometheus.io
特征
Prometheus的主要特点是:
- 多维数据模型:由度量名称和键值对标识的时间序列数据
- 支持多种exporter采集数据
- PromQL:一种灵活的查询语言,可以利用多维数据完成复杂的查询
- 不依赖分布式存储,单个服务器节点可直接工作(不需要安装数据库,直接使用即可,内置集成了数据库不需要重新的部署)
- 基于HTTP的pull方式采集时间序列数据
- 推送时间序列数据通过PushGateway组件支持,目标主机上报数据到PushGateway,普罗米修斯从PushGateway拉取数据,这个是可以跨网段的。
- 通过服务发现或静态配置发现目标
- 多种图形模式及仪表盘支持(grafana)
- 高效的存储,每个采集数据占用3.5bytes左右,300万的时间序列,30s的时间间隔,保留60天,消耗磁盘大约200G
- 做高可用,对数据进行异地备份。联邦集群,部署多套普罗米修斯,每套普罗米修斯可以在不同的机房,然后将这些普罗米修斯汇总到一个普罗米修斯,那么就可以将各个地方的数据,整体收集上来了。
Prometheus组件与架构
Prometheus 监控工具架构图
Prometheus生态系统由多个组件组成,其中许多组件是可选的:
- 主要的Prometheus server,用于存储时间序列数据。
- 用于检测应用程序代码的客户端库。
- 用于支持short-lived工作的推送网关(push gateway)。
- 针对HAProxy,StatsD,Graphite等服务的exporters。
- 一个alertmanager处理警报管理器。
- 各种支持工具
大多数Prometheus组件都是用Go编写的,因此很容易构建和部署为静态二进制文件。
具体组件的作用:
• Prometheus Server:收集指标和存储时间序列数据,并提供查询接口(采集,存储,查询)
• ClientLibrary:客户端库
• Push Gateway:短期存储指标数据。主要用于临时性的任务,各个目标主机可以上报数据到pushgateway,,然后prometheus server统一从pushgateway拉取数据
• Exporters:采集已有的第三方服务监控指标并暴露metrics(类似于zabbix agent,但是exporter有很多种,针对不同的监控指标)
• Alertmanager:从prometheus server端收到alters之后,会进行去重,分组,并且路由到接收方,发出报警,常见的接收方式有:电子邮件,微信,钉钉
• Web UI:简单的Web控制台
普罗米修斯服务端是内置了TSDB的数据库,是存储在本地的文件系统当中。存储了采集被监控端数据指标。
获取指标有两种方式:
- 一种直接是从pushgateway这里获取被监控指标,这是一个独立的组件,主要完成短周期任务暴露的指标,比如定时任务。(短周期任务不是每分钟都有的指标,可能在运行任务的时候才会产生指标。所以可以将临时的指标汇总到pushgateway,然后有pushgateway统一的暴露给服务端去采集)
- 另外一种就是主要使用的,持久性的应用,比如nginx,mysql还要微服务jar包,这些都属于持久性运行任务的。
使用这种任务的监控就是采用exporter方式了。会配置exporter这样一个组件,主要是用来采集指标暴露给服务端。
Prometheus 根据配置的作业,直接从数据源pull拉取或者通过中间推送网关(push gateway),获取度量值Metrics。它在本地存储所有获取的样本,并在此数据上运行规则,以从现有数据聚合和记录新的时间序列,或者生成警报。Grafana或其他API使用者可用于可视化收集的数据。
服务端采集好之后就会存储在tsdb数据库当中,可以通过其ui去查看,因为其通过了http服务就可以访问其ui了。在ui上可以通过promql完成数据的查询。(export--->prometheus(TSDB)---->promsql)
告警是由altermanager提供的,在普罗米修斯这里定义告警规则,普罗米修斯这里会周期的评估当前采集的指标是否触发了告警规则,如果触发了会将事件推送给altermanger。altermanger会根据自己相关的逻辑处理后发给接收人,提供email webhook,所以告警是由单独的组件完成的。(告警规则在普罗米修斯里面定义,触发了告警推送给altermanager)
普罗米修斯实现了服务的发现,也就是可以自动的找到被监控端,这个需要在普罗米修斯的配置文件里面去配置。有了服务发现就不要一个一个的去配置了,让被监控端自动纳入监控。
普罗米修斯从目标主机拉取数据的时候有两种方式,一种是静态的,也就是我们部署exporter,静态的采集指标,也可以配置服务发现,自动的发现指标数据。通过服务发现和exporter采集到的数据的方式都是采用了默认的pull方式拉取指标的,也可以使用pushgateway上报到prometheus当中,通过在目标主机上面写脚本的方式。
监控指标数据模型
数据模型:
• Prometheus将所有数据存储为时间序列(存储的时候都会记录时间,并且存储到时序的数据库里面,也就是内置的TSDB)
• 具有相同度量名称以及标签属于同一个指标(指标名称是一样,但是标签是不一样的)
• 每个时间序列都由度量标准名称和一组键值对(称为标签)唯一标识,
通过标签查询指定指标。
指标格式 指标名称加上多个标签
<metric name>{<label name>=<label value>,...}
再配置被监控端这里要配置监控谁,在配置被监控端,必须要暴露指标出来,这种指标以https的方式给暴露出来,暴露出来之后在配置文件当中配置被监控端,最后就会被普罗米修斯给采集到,如果以上正确配置
在普罗米修斯的图形界面targets可以看到被监控端,也可以通过指标名称查看采集的数据了。
这个就相当于数据库,可以提供promql来查询数据,并且通过图表绘制出来
Prometheus 部署
• 二进制部署
https://prometheus.io/docs/prometheus/latest/getting_started/ 下载地址
• Docker部署
https://prometheus.io/docs/prometheus/latest/installation/
访问地址:http://IP:9090
[root@localhost ~]# ls
anaconda-ks.cfg prometheus-2.23.0.linux-amd64.tar.gz
[root@localhost ~]# mv prometheus-2.23.0.linux-amd64 /usr/local/prometheus
[root@localhost ~]# cd /usr/local/prometheus/
[root@localhost prometheus]# ls
console_libraries consoles LICENSE NOTICE prometheus prometheus.yml promtool
prometheus 主程序
promtool 检查普罗米修斯的工具,主要是用于检查普罗米修斯配置文件的语法
Prometheus启动
./premetheus -h 命令行常用参数:
• --config.file="prometheus.yml" # 指定配置文件
• --web.listen-address= "0.0.0.0:9090" # 监听地址和端口
• --log.level=info # 日志级别
• --alertmanager.timeout=10s # 与报警组件的超时时间
• --storage.tsdb.path="data/ " # 数据目录
• --storage.tsdb.retention.time=15d # 数据保存时间,默认15天(到时候会在普罗米修斯目录下生成data目录用来保存数据,数据存储时间是15天,会定期的删除,也可以自己设置保存一个月)
直接启动,查看监听端口
[root@localhost prometheus]# ./prometheus
可以看到监听的端口是9090
[root@localhost ~]# netstat -tpln | grep pr
tcp6 0 0 :::9090 :::* LISTEN 26554/./prometheus
浏览器上访问你的主机IP加端口即可
Alters 如果你在这配置了告警,那么这里会显示告警信息
Graph 根据普罗米修斯的查询语言会给你绘制一个图,这里主要是用于编写promq表达式相关的调试
Status 查看运行状态。在status里面的tragets里面是普罗米修斯监控的目标,默认把自己也监控了,service discovery服务发现可以加入被监控端。这里也可以看到告警规则,Configuration 查看普罗米修斯的配置文件内容
可以看到产生了数据目录,以后就可以对该目录做定期的备份
[root@localhost ~]# cd /usr/local/prometheus/
[root@localhost prometheus]# ls
console_libraries consoles data LICENSE NOTICE prometheus prometheus.yml promtool
[root@localhost prometheus]# cd data/
[root@localhost data]# ls
01ETPMX68HCBK9BN6DA4KPNPNK chunks_head lock queries.active wal
使用系统的服务systemd管理来管理普罗米修斯
[root@localhost prometheus]# cat /usr/lib/systemd/system/prometheus.service
[Unit]
Description=prometheus #描述普罗米修斯,可以写任意内容
[Service] #启动普罗米修斯具体路径,如果需要什么参数都可以在后面加上
ExecStart=/usr/local/prometheus/prometheus --config.file=/usr/local/prometheus/prometheus.yml
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
[Install]
WantedBy=multi-user.target
在该目录下 /usr/lib/systemd/system/做任何配置文件改动都要执行daemon-reload,让系统读取到更新
[root@localhost prometheus]# systemctl daemon-reload
[root@localhost prometheus]# systemctl start prometheus
[root@localhost prometheus]# systemctl enable prometheus
这样就部署好了你的普罗米修斯,如果更新了其配置可以使用kill -HUP重新热加载你的配置文件,避免重启普罗米修斯
[root@localhost ~]# ps -ef | grep prome
root 63071 1 0 10:08 ? 00:00:12 /usr/local/prometheus/prometheus --config.file=/usr/local/prometheus/prometheus.yml
root 63472 62981 0 10:39 pts/0 00:00:00 grep --color=auto prome
[root@localhost ~]# kill -HUP 63071
目录 返回
首页