Prometheus,是近年来最火的开源监控系统,特别是在云原生和Kubernetes领域,几乎已经成为了监控的标准。CNCF(云原生计算基金会)把Prometheus列为毕业项目,和Kubernetes、Envoy等项目并列,足以说明它的地位。
但是,很多人对Prometheus还不了解,不知道它和传统的监控系统(比如Zabbix、Nagios)有什么区别,也不知道怎么上手。我最开始接触Prometheus的时候,也是一脸懵,被它的各种概念(指标、标签、实例、作业、PromQL等)搞得晕头转向。
后来,我花了一些时间,系统地学习了Prometheus,并且在实际项目中用了起来,才慢慢理解了它的设计思想和使用方法。今天,我想把我的学习经验整理成一篇入门指南,从零开始,带你了解Prometheus的核心概念、架构、安装配置、数据模型、PromQL查询语言、告警配置、以及和Grafana的集成。
希望这篇文章,能帮助你快速入门Prometheus,搭建起自己的监控系统。
一、Prometheus是什么
在开始之前,先简单介绍一下Prometheus是什么。
Prometheus,是一个开源的系统监控和告警工具包,最初是由SoundCloud公司在2012年开发的。2016年,Prometheus加入了CNCF,成为继Kubernetes之后的第二个托管项目。2018年,Prometheus从CNCF毕业,成为了一个成熟的、被广泛采用的开源项目。
Prometheus的核心特点:
- 多维数据模型:Prometheus用指标名和一组键值对(标签)来标识时间序列数据,支持多维的数据模型。这和传统的监控系统用单一的指标名来标识数据有很大的不同。
- PromQL查询语言:Prometheus有自己的查询语言PromQL,非常强大,可以对时间序列数据进行各种查询、聚合、计算。
- 拉模型(Pull Model):Prometheus采用拉模型,主动从被监控的目标(Target)上拉取指标数据,而不是等目标主动推送。这和传统监控系统的推模型有很大的不同。
- 不依赖分布式存储:单个Prometheus服务器是自治的,不依赖分布式存储。每个Prometheus服务器,自己存储自己的数据,自己处理查询和告警。当然,也可以通过联邦(Federation)或者远程存储(Remote Storage)来扩展。
- 服务发现:Prometheus支持多种服务发现机制,比如静态配置、文件发现、DNS发现、Kubernetes发现、Consul发现等,能自动发现被监控的目标。
- 强大的告警:Prometheus有独立的告警组件Alertmanager,支持灵活的告警规则、告警分组、告警抑制、告警静默、告警路由等功能。
- 可视化:Prometheus自带了一个简单的Web UI,可以查询和可视化数据。但是,更常用的是和Grafana集成,用Grafana来做更强大的可视化。
和传统的监控系统(比如Zabbix、Nagios)相比,Prometheus最大的区别是它的多维数据模型和拉模型。传统的监控系统,通常是用主机+指标的二维模型,数据是由agent主动推送到服务器的。而Prometheus,是用指标+标签的多维模型,数据是由服务器主动从目标拉取的。这种设计,让Prometheus特别适合监控动态的、云原生的环境(比如Kubernetes),因为在这种环境里,主机是动态变化的,用传统的推模型很难管理,而用拉模型+服务发现,就能自动适应环境的变化。
二、Prometheus的架构
Prometheus不是一个单一的程序,而是由多个组件组成的生态系统。核心组件包括:
- Prometheus Server:核心组件,负责抓取和存储时间序列数据,处理PromQL查询。
- Client Libraries:客户端库,用来在应用代码里埋点,暴露指标数据。
- Exporters:导出器,用来把第三方系统(比如数据库、操作系统、中间件等)的指标转换成Prometheus格式,暴露出来供Prometheus抓取。
- Pushgateway:推送网关,用来支持短生命周期的任务(比如定时任务、批处理任务)。这些任务生命周期太短,Prometheus可能来不及抓取就结束了,所以它们可以把指标推送到Pushgateway,然后由Prometheus从Pushgateway拉取。
- Alertmanager:告警管理器,接收Prometheus发来的告警,然后进行分组、抑制、静默、路由,最后发送给接收者(比如邮件、钉钉、Slack等)。
- Web UI:Prometheus自带的Web界面,可以查询数据、查看配置、查看告警状态等。
整体架构图大概是这样的:
+-------------------+
| Prometheus UI |
+---------+---------+
|
v
+-----------+ +----------+----------+ +-------------+
| Exporters |---->| Prometheus Server |---->| Alertmanager|
+-----------+ +----------+----------+ +------+------+
^ |
+-----------+ | v
| Apps |-----------------+ +-------------+
+-----------+ 拉取指标 | 告警通知 |
+-------------+工作流程大概是这样的:
- 被监控的目标(应用、Exporters等)通过HTTP接口暴露指标数据。
- Prometheus Server按照配置的抓取间隔,主动从这些目标上拉取指标数据。
- Prometheus Server把拉取到的数据存储在本地的时间序列数据库里。
- 用户可以通过PromQL查询数据,或者通过Web UI查看数据。
- Prometheus Server根据配置的告警规则,评估数据,如果满足告警条件,就把告警发送给Alertmanager。
- Alertmanager对告警进行处理,然后发送给接收者。
理解了这个架构,你就对Prometheus的工作方式有了一个整体的认识。
三、安装和配置Prometheus
了解了架构之后,我们来实际安装和配置一个Prometheus。
Prometheus的安装很简单,因为它是用Go语言写的,编译出来是一个单一的二进制文件,没有任何依赖。你只需要从官方网站下载对应平台的二进制包,解压,然后运行就行。
步骤一:下载Prometheus
从Prometheus官方下载页面(https://prometheus.io/download/)下载最新版本的Prometheus。2018年4月的时候,最新版本是2.x系列。
# Linux示例
wget https://github.com/prometheus/prometheus/releases/download/v2.2.1/prometheus-2.2.1.linux-amd64.tar.gz
tar xzf prometheus-2.2.1.linux-amd64.tar.gz
cd prometheus-2.2.1.linux-amd64Windows的话,下载zip包,解压就行。
步骤二:配置prometheus.yml
Prometheus的配置文件是prometheus.yml,用YAML格式写。最基本的配置文件大概是这样的:
# 全局配置
global:
scrape_interval: 15s # 抓取间隔,默认15秒
evaluation_interval: 15s # 告警规则评估间隔,默认15秒
external_labels: # 外部标签,会加到所有时间序列上
monitor: 'my-monitor'
# 告警规则配置
rule_files:
# - "first_rules.yml"
# - "second_rules.yml"
# Alertmanager配置
alerting:
alertmanagers:
- static_configs:
- targets:
# - alertmanager:9093
# 抓取配置
scrape_configs:
# 监控Prometheus自己
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']这个配置文件里,最重要的是scrapeconfigs部分,它定义了Prometheus要抓取哪些目标。每个jobname代表一组抓取目标,targets是具体的目标地址。
上面的配置里,只有一个job,叫prometheus,抓取的目标是localhost:9090,也就是Prometheus自己。Prometheus自己也会暴露指标数据,所以可以监控自己。
步骤三:启动Prometheus
配置好之后,就可以启动Prometheus了:
./prometheus --config.file=prometheus.ymlWindows的话,运行prometheus.exe --config.file=prometheus.yml。
启动之后,打开浏览器,访问http://localhost:9090,就能看到Prometheus的Web UI了。
在Web UI里,你可以:
- 在Graph页面,用PromQL查询数据,查看图表。
- 在Status页面,查看Prometheus的配置、运行状态、抓取目标状态等。
- 在Alerts页面,查看告警规则和告警状态。
到这里,你就有了一个最基本的Prometheus监控系统了。当然,现在它只监控了自己,还没有监控其他东西。接下来,我们来看看怎么监控更多的东西。
四、数据模型:指标、标签、时间序列
Prometheus的数据模型,是理解Prometheus的关键。很多人学Prometheus觉得难,就是因为没有理解它的数据模型。
Prometheus存储的所有数据,都是时间序列(Time Series)。每个时间序列,由一个指标名(Metric Name)和一组标签(Label)唯一标识。每个时间序列,有一系列的样本(Sample),每个样本包含一个时间戳(Timestamp)和一个值(Value)。
指标名(Metric Name):用来说明这个指标是测量什么的,比如httprequeststotal(HTTP请求总数)、processcpusecondstotal(进程CPU使用秒数)、nodememoryMemAvailablebytes(节点可用内存字节数)等。指标名通常有一个前缀,说明这个指标属于哪个系统或组件,比如http、process、node_等。
标签(Label):是一组键值对,用来给指标增加维度,区分不同的实例。比如,httprequeststotal这个指标,可以有method标签(GET、POST等)、status标签(200、404、500等)、instance标签(哪个实例)等。这样,你就可以分别查询GET请求的总数、POST请求的总数、200响应的总数等。
标签的键,只能包含字母、数字、下划线,不能以开头(开头的是保留标签)。标签的值,可以是任意的Unicode字符串。
一个时间序列的完整标识,是这样的:
<metric_name>{<label_name>=<label_value>, ...}比如:
http_requests_total{method="GET", status="200", instance="web01:8080"}这个时间序列,代表的是web01实例上的、GET方法的、200状态码的HTTP请求总数。
Prometheus的数据模型,是多维的。你可以通过不同的标签组合,从不同的维度来查询和聚合数据。这是Prometheus最强大的地方之一,也是它和传统监控系统最大的区别之一。
Prometheus有四种核心的指标类型:
- Counter(计数器):只增不减的计数器,比如请求总数、错误总数、处理字节总数等。Counter的值,只能增加,不能减少(除非重启归零)。查询的时候,通常用rate()或者increase()函数来计算增长率。
- Gauge(仪表盘):可增可减的瞬时值,比如温度、内存使用量、当前连接数、队列长度等。Gauge的值,可以增加,也可以减少,代表的是某个时刻的瞬时状态。
- Histogram(直方图):用来统计数据的分布情况,比如请求延迟的分布、响应大小的分布等。Histogram会把数据分成若干个桶(bucket),统计每个桶里的样本数量,以及所有样本的总和。
- Summary(摘要):和Histogram类似,也是用来统计数据的分布情况,但是Summary直接计算分位数(比如P50、P90、P99),而不是用桶来统计。Summary和Histogram的区别是,Summary在客户端计算分位数,Histogram在服务端用PromQL计算分位数。
理解了这四种指标类型,你就知道在埋点的时候该用哪种类型了。
五、PromQL:Prometheus的查询语言
PromQL(Prometheus Query Language),是Prometheus的查询语言,用来查询和处理时间序列数据。PromQL非常强大,但是也有一定的学习曲线。
这里,我介绍一些最常用的PromQL语法,帮你快速入门。
1. 最简单的查询
最简单的查询,就是直接写指标名,返回这个指标的所有时间序列的最新值:
http_requests_total这个查询,会返回所有httprequeststotal指标的时间序列的最新值,包括所有标签组合。
你也可以用标签来过滤:
http_requests_total{method="GET", status="200"}这个查询,只返回method是GET、status是200的时间序列。
标签匹配支持四种操作符:
=:等于!=:不等于=~:正则匹配!~:正则不匹配
比如:
http_requests_total{status=~"2.."}这个查询,返回status以2开头的时间序列(也就是2xx的响应)。
2. 范围查询
上面的查询,返回的是最新的一个值(瞬时向量)。如果你想返回一段时间内的所有值(范围向量),可以用[]指定时间范围:
http_requests_total[5m]这个查询,返回过去5分钟内,每个时间序列的所有样本值。
时间单位支持:s(秒)、m(分钟)、h(小时)、d(天)、w(周)、y(年)。
3. 常用函数
PromQL有很多内置函数,这里介绍几个最常用的:
- rate():计算Counter类型指标的每秒平均增长率。必须用在范围向量上。
``promql rate(httprequeststotal[5m]) `` 这个查询,计算过去5分钟内,HTTP请求的每秒平均增长率。
- increase():计算Counter类型指标在一段时间内的增长量。
``promql increase(httprequeststotal[1h]) `` 这个查询,计算过去1小时内,HTTP请求的总增长量。
- sum():对时间序列求和,可以按标签分组。
``promql sum by (method) (rate(httprequeststotal[5m])) `` 这个查询,按method分组,计算每种方法的HTTP请求速率之和。
- avg():对时间序列求平均值。
``promql avg by (instance) (nodecpuseconds_total) ``
- max() / min():求最大值/最小值。
- count():统计时间序列的数量。
- topk():返回值最大的前k个时间序列。
``promql topk(5, rate(httprequeststotal[5m])) `` 这个查询,返回请求速率最高的前5个时间序列。
- histogram_quantile():计算Histogram的分位数。
``promql histogramquantile(0.99, rate(httprequestdurationseconds_bucket[5m])) `` 这个查询,计算HTTP请求延迟的P99。
4. 运算符
PromQL支持各种运算符:
- 算术运算符:+、-、*、/、%、^
- 比较运算符:==、!=、>、<、>=、<=
- 逻辑运算符:and、or、unless
比如,计算CPU使用率:
100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)这个查询,先计算idle模式的CPU速率,乘以100得到idle百分比,然后用100减去,得到CPU使用率。
PromQL的内容很多,这里只是入门。更多的语法和函数,可以参考Prometheus官方文档。
六、Exporters:监控第三方系统
Prometheus自己只能监控自己,要监控其他系统(比如操作系统、数据库、中间件等),需要用Exporters。
Exporter,是一个小服务,它的作用是把第三方系统的指标,转换成Prometheus格式,暴露在HTTP接口上,供Prometheus抓取。
Prometheus社区有很多现成的Exporter,覆盖了几乎所有常见的系统:
- node_exporter:监控操作系统的指标,比如CPU、内存、磁盘、网络、文件系统等。最常用的Exporter。
- mysqld_exporter:监控MySQL数据库的指标。
- redis_exporter:监控Redis的指标。
- nginx_exporter:监控Nginx的指标。
- blackbox_exporter:通过HTTP、HTTPS、DNS、TCP、ICMP等方式,探测端点的可用性。
- jmx_exporter:监控JVM的指标,通过JMX获取。
- cadvisor:监控容器的指标。
使用Exporter很简单,只需要三步:
- 下载并运行Exporter,配置好要监控的目标。
- 在Prometheus的配置文件里,把Exporter的地址加到scrape_configs里。
- 重启Prometheus,就能抓取到Exporter的指标了。
比如,用node_exporter监控操作系统:
# 下载node_exporter
wget https://github.com/prometheus/node_exporter/releases/download/v0.16.0/node_exporter-0.16.0.linux-amd64.tar.gz
tar xzf node_exporter-0.16.0.linux-amd64.tar.gz
cd node_exporter-0.16.0.linux-amd64
./node_exporter然后,在prometheus.yml里加上:
scrape_configs:
- job_name: 'node'
static_configs:
- targets: ['localhost:9100']重启Prometheus,就能抓取到操作系统的指标了。你可以用nodecpusecondstotal、nodememoryMemAvailablebytes、nodediskiotimeseconds_total等指标,来查询CPU、内存、磁盘等信息。
七、告警配置:Alertmanager
监控的一个重要目的,就是在出问题的时候,能及时收到告警。Prometheus的告警,是由Alertmanager来处理的。
告警的配置,分为两部分:
- 告警规则:在Prometheus里配置,定义什么时候触发告警。
- Alertmanager配置:定义告警怎么处理、怎么发送。
告警规则,是用PromQL写的,放在单独的规则文件里,然后在prometheus.yml里引用。
比如,一个简单的告警规则文件(alert.rules.yml):
groups:
- name: example
rules:
# 实例宕机告警
- alert: InstanceDown
expr: up == 0
for: 1m
labels:
severity: critical
annotations:
summary: "Instance {{ $labels.instance }} down"
description: "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 1 minute."
# CPU使用率过高告警
- alert: HighCPUUsage
expr: 100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
for: 5m
labels:
severity: warning
annotations:
summary: "High CPU usage on {{ $labels.instance }}"
description: "CPU usage on {{ $labels.instance }} is above 80% for more than 5 minutes."这个规则文件里,定义了两个告警:
- InstanceDown:当up == 0(实例宕机)持续1分钟,触发严重告警。
- HighCPUUsage:当CPU使用率超过80%持续5分钟,触发警告告警。
然后,在prometheus.yml里引用这个规则文件:
rule_files:
- "alert.rules.yml"Alertmanager的配置,定义了告警怎么路由、怎么发送。一个简单的Alertmanager配置(alertmanager.yml):
global:
smtp_smarthost: 'smtp.example.com:587'
smtp_from: 'alertmanager@example.com'
smtp_auth_username: 'alertmanager@example.com'
smtp_auth_password: 'password'
route:
group_by: ['alertname', 'cluster', 'service']
group_wait: 30s
group_interval: 5m
repeat_interval: 3h
receiver: 'team-email'
receivers:
- name: 'team-email'
email_configs:
- to: 'team@example.com'
send_resolved: true这个配置里,定义了告警通过邮件发送给team@example.com。Alertmanager还支持很多其他的接收方式,比如钉钉、Slack、Webhook、PagerDuty等。
Alertmanager的强大之处,在于它的告警路由和分组功能。你可以根据告警的标签,把不同的告警路由到不同的接收者。比如,严重告警发给值班电话,警告告警发给邮件,特定服务的告警发给特定的团队。还可以对告警进行分组,把相关的告警合并成一个通知,避免告警风暴。
八、和Grafana集成:强大的可视化
Prometheus自带的Web UI,只能做简单的查询和图表,功能比较有限。要做更强大、更美观的可视化,通常用Grafana。
Grafana,是一个开源的可视化和分析平台,支持多种数据源(包括Prometheus、InfluxDB、MySQL等),可以创建非常漂亮、功能强大的仪表盘。
Grafana和Prometheus的集成很简单:
- 安装Grafana,启动。
- 在Grafana里,添加Prometheus数据源,配置Prometheus的地址。
- 创建仪表盘,添加面板,用PromQL查询数据,配置图表。
Grafana的面板类型很丰富,支持折线图、柱状图、饼图、表格、热力图、仪表盘(Gauge)、状态面板等。你可以根据需要,创建各种类型的图表。
而且,Grafana社区有很多现成的仪表盘模板,你可以直接导入使用。比如,node_exporter的仪表盘、MySQL的仪表盘、Kubernetes的仪表盘等,都有现成的模板,导入之后稍微改改就能用,非常方便。
用Grafana+Prometheus,你可以搭建出非常专业、非常强大的监控系统,实时了解你的系统运行状态,快速定位和排查问题。
九、写在最后
以上,就是Prometheus的入门指南。我们从Prometheus是什么、架构、安装配置、数据模型、PromQL、Exporters、告警配置、Grafana集成,一步步地介绍了Prometheus的核心概念和使用方法。
当然,Prometheus的内容远不止这些,还有很多高级的话题,比如服务发现、联邦集群、远程存储、高可用部署、Recording Rules等。但是,作为入门,掌握了上面这些内容,你就已经能搭建起一个基本可用的监控系统了。
Prometheus,作为云原生时代的监控标准,正在被越来越多的公司和项目采用。特别是在Kubernetes环境里,Prometheus几乎是监控的首选。所以,学习Prometheus,对于运维、开发、SRE等岗位的同学,都是非常有价值的。
学习Prometheus,最好的方法就是动手实践。找一台机器,安装Prometheus,装几个Exporter,写几个PromQL查询,配几个告警,搭几个Grafana仪表盘,在实践中慢慢理解和掌握。光看文档是学不会的,必须动手做。
最后,用一句话来总结这篇文章:"Prometheus,是云原生时代的监控利器。它的多维数据模型、强大的PromQL、灵活的告警,让监控变得简单而强大。掌握了Prometheus,你就能对自己的系统了如指掌,在问题发生的时候快速响应,让系统更稳定、更可靠。"
愿每一个运维和开发同学,都能掌握Prometheus,搭建起自己的监控系统,让系统运行得更稳定、更可靠。
评论(0)
暂无评论,快来抢沙发~
评论功能仅对会员开放,请先登录
登录