Prometheus
监控系统组件
- 指标数据采集
- 指标数据存储
- 指标数据趋势分析及可视化
- 告警
监控体系介绍
- 系统层监控:监控CPU、Load、Memory、IO等
- 中间件及基础设施类系统监控:Kafka、RabbitMQ、Tomcat、Mysql、Ceph、ShardingSpere等
- 应用层监控:用于衡量应用程序代码的状态和性能
- 业务层监控:用于衡量应用程序的价值,例如电商网站的销售量等
监测的黄金指标
- 延迟:服务器请求所需时长、例如HTTP请求平均延迟
- 流量:衡量服务的容量需求,例如每秒处理的HTTP请求数或数据库系统的事务数量
- 错误:请求失败的速率,衡量错误发生的情况
- 饱和度:衡量资源的使用情况,用于表达应用程序有多满
Prometheus简介
Prometheus是一款时序数据库,也是一款设计用于进行目标监控的组件。其基于http call,从配置文件中指定的网络端点(endpoint)上周期性获取指标数据。其中网络端点被称作是一个Instance,而多个具有类似功能的Instance则被称为Job。Prometheus支持三种类型的途径从目标上抓取指标数据。
- Exporters:添加到对应的组件上,由Exporters获取对应的指标信息,然后响应给Prometheus
- Instrumentation:应用程序内置了Prometheus的指标收集器
- PushGateway:适用于短期任务,将任务数据存到PushGateway,然后Prometheus来拉取
Prometheus组件
Prometheus生态包括了很多组件,它们中的一些是可选的:
- Prometheus Server:用于抓取和存储时间序列数据
- 客户端库:目的在于那些期望提供Instrumentation的应用程序提供便捷的开发途径。即很多应用程序内置的用于采集数据的组件
- Push Gateway:接收那些通常由短作业生成的指标数据的网关
- exporters:用于暴露现有应用程序或服务的指标给Prometheus
- AlertManager:警告管理器,从promethues中受到告警通知后,通过去重、分组、路由等预处理功能后向用户发送告警信息
- Data Visulizetion:Prometues Web UI,内置的可视化组件,并不好用,推荐grafana
- Service Discovery:动态发现待监控的Target,从而完成监控配置的重要组件。现在Prometheus Server内建支持
多数Prometheus组件是Go语言写的,这使得这些组件很容易编译和部署。
数据模型
Prometheus的数据以“key-value”的形式存储时序数据,不支持存储文本信息,其中的键为指标,比如CPU速率、内存使用率等。很多机器都会有相同名称的指标,因而它需要添加更详细额信息来区分其属于哪个机器的指标信息,比如cpu_usage{core="1",ip="128.2.3.4"}
。这些标签还可以作为过滤器进行指标过滤及聚合运算等。
指标类型
- Counter:计数器,用于保存单调递增的数据,例如网站的访问次数等。
- Gauge:仪表盘,用于存储有者起伏特征的指标数据,例如内存空闲大小
- Histogran:直方图,它会在一段时间范围内对数据进行采样,并将其计入可配置的bucket中。Histogram能存储更多的信息,包括样本值分布在每个bucket中的数量、所有样本值之和以及总的样本数量,从而能可以使用一些内置函数,比如计算样本均值、计算样本分位值等。
- Summary:摘要,Histogran的扩展类型,但它是直接由被检测端自行计算出分位数,并将结果返回给Prometheus Server
PromQL
Prometheus提供了内置的数据查询语言PromQL,支持用户进行实时数据查询以及聚合操作。PromQL内置提供了一组用于处理数据的函数,并支持处理两种向量。
- 即时向量:最近依次的时间戳上跟踪的数据指标
- 时间范围向量:指定时间范围内所有时间戳上的数据指标
Prometheus安装
到官网下载Prometheus的tar包直接解压到对应目录下,启动命令直接就是./prometheus
。其次,还可以在官网下载对应的exporter或者gateway的tar包。Prometheus自身内置了监控自身的组件,而如果监控本机的话需要引入对应的exporter,将其放到/usr/local/bin下启动即可。可以通过Prometheus所在机器的9090端口,在页面上显示对应的监控内容。
PromQL
Prometheus的时间序列默认保持一个月,如果需要长时间保留的话需要配置外置数据库。
数据类型:即时向量(取一个时间内的)、范维向量(返回时间段内特定值范围内的样本)、标量、字符串
匹配器
符号 | 说明 |
---|---|
= | 标签等于该值,当等于“”时表示没有这个标签的也匹配 |
!= | 标签不等于 |
=~ | 正则匹配 |
!~ | 正则不匹配 |
即时向量语法:指标名称{标签='值'}
范围向量语法:指标名称{标签='值'}[范围]
,此处的范围即时间,时间单位有ms、s、m、h、d、w、m、y。比如表示5小时30分钟的话就是5h30m,不能使用小数。其次,多个target上的数据抓取的时间点相同时他们的时间戳并不会严格一致,因为Prometheus Server考虑到了负载。
常用函数:
- rate(指标[ ]):获取一定时间内的增长速率
- topk(3,指标):获取该指标下排名前三的时间序列
- bottomk(3,指标):获取该指标下排名后三的时间序列
- irate():同rate,比rate准确
示例: - http_requests_total[5m] offset 1d:表示该指标昨天的前五分钟数据
11个聚合函数
函数名 | 说明 |
---|---|
sum | 对样本值求和 |
avg | 对样本值求平均值 |
count | 对分组内的时间序列进行数量统计 |
stddev | 对样本值求标准差 |
stdvar | 求方差 |
min | 求样本最小值 |
max | 求样本最大值 |
quantile | 分位数用于评估数据的分布状态 |
count_values | 对分组内的时间序列的样本值进行数量统计 |
Prometheus 服务发现
让Prometheus发现所要监控的组件可以在配置文件中配置对应的target信息,但是其有一定的缺点,比如当target容易变动时这种方式就不适用,因此需要一种动态的发现机制。
- 基于文件的服务发现:额外建立一个文件,里边包含了配置文件中target的信息,Prometheus可以周期性的检查这些文件从而完成服务的发现。配置文件的方式如下,在Prometheus配置文件和外部文件中分别加入以下信息:
scrape_config:
- job_name: 'prometheus'
file_sd_config:
- files:
- targets/prometheus*.yaml. //表示当前目录的tartget目录下的文件
refresh_interval: 2m
- targets:
- 172.2.2.2:9100
- 172.2.2.3:9100
- 172.2.2.4:9100
labels:
app: node-exporter
job: node
- 基于DNS的服务发现
- 基于Consul的服务发现:Prometheus从consul中获取注册的服务
- 基k8s的服务发现
pushGateway
配置
scrape_config:
- job_name: 'pushgateway'
static_configs:
- targets: ['localhost:9091','localhost:9092'] /*此处即getway所在机器*/