Prometheus介绍
# 监控系统介绍
# 简介
监控系统是信息技术管理的核心组成部分,用于实时收集、分析、管理组织内基础设施及应用服务的性能指标和可用性指标数据。有效的监控系统能够帮助组织确保其技术资源正常运行,及时发现和解决问题,优化性能,并做出基于数据的决策。
PS:监控系统应该能够与自动化工具集成,如自动扩展、自动故障恢复等。
# 功能组件
完整的监控系统包含以下功能组件:
- 数据收集:指标数据采集,从各种资源(服务器、网络设备、应用程序等)收集性能指标和日志数据。
- 数据存储:指标数据存储,安全地存储收集的监控数据,以便于分析和检索。
- 数据处理与分析:指标数据趋势分析,处理和分析收集的数据,例如聚合、排序和预测趋势等。
- 可视化和仪表板:提供可视化的图形界面展示监控数据,帮助用户快速理解系统状态。
- 警报和通知:按需求进行告警,基于预定义的规则生成警报,并通过电子邮件、短信或其他方式通知相关人员。
- 报告和审计:生成定期或按需的报告,用于审计和性能优化分析。
# 监控体系
监控体系可以根据自底向上原则进行监控,自底向上原则指首先确保基础设施(如服务器、网络设备和存储系统)的性能和可靠性,之后再关注应用程序的性能、用户体验和业务指标。也就是:硬件基础设施层面监控 -> 系统层面监控 -> 中间件层面监控 -> 应用层面监控 -> 业务层面监控。
实施自底向上监控的步骤:
- 硬件和网络监控:开始于监控服务器CPU、内存、磁盘空间、网络带宽利用率等基础指标。
- 操作系统和服务监控:监控操作系统级别的指标,如进程数、系统负载、以及关键系统服务的运行状态。
- 数据库和中间件监控:监控数据库的响应时间、查询性能、连接数等,以及中间件组件的性能指标。
- 应用性能监控(APM):关注应用层面的指标,如响应时间、错误率、事务处理速率等。
- 业务和用户体验监控:最后关注业务关键性能指标(KPIs)和用户体验指标,如用户满意度、转化率等。
# Google监控四大黄金指标
Google提出了监控四大黄金指标,用于衡量应用和服务的健康状况:
- 延迟:响应请求所需的时间 (需要区分失败或成功),如HTTP请求平均延迟。
- 流量:系统处理的请求量,如每秒处理的HTTP请求数或数据库的事务数量。
- 错误:请求失败的比例,包括显式的错误(如HTTP 500)和隐式的错误(如HTTP 200但内容错误)。
- 饱和度:系统资源的使用程度,如内存、CPU、磁盘等资源的使用率。
# RED监控方法
RED方法针对的是微服务架构,主要关注三个指标:
- 请求率(Rate):服务接收的请求速率(每秒请求数)。
- 错误率(Errors):请求中发生错误的比例。
- 持续时间(Duration):服务处理每个请求所需的时间。
# Prometheus介绍
# 简介
Prometheus是一个开源的专门用于监控的组件,它并非一个完整的监控系统,我们一般会搭配生态内的其他组件,如Grafana、Altermanager等,构成一个完整的IT监控系统。
在使用Prometheus的监控体系中,Prometheus是进行Target监控的关键组件,Target可以是主机、也可以是一款应用程序等等。
在Prometheus中还内置了时序数据库(TSDB, Time Series Database),能够自身存储时序数据。它提供一种名为PromQL的查询语言,使我们能够灵活快速的查询数据库中的时序数据。
# 时序数据
是按时间顺序排列的数据点(又称观测值)的集合,通常以固定的时间间隔进行记录。每个数据点由一个或多个数值(称为度量或指标)以及数据点确切时间戳组成。如果我们将这些观测值绘制于图形之上,他会有一个时间轴、一个数据轴。
时序数据用于跟踪随时间变化的现象,非常适合于监控系统、金融市场分析、物联网设备状态跟踪、科学研究等领域。
# 工作方式
Prometheus 主要采用pull模型来收集监控数据。在pull模型中,Prometheus服务器定期以客户端的身份向监控目标发送HTTP/HTTPS请求以拉取(pull)指标数据。这种模式的一些关键点包括:
- 主动控制:Prometheus服务器主动控制何时以及如何频繁地收集数据,这简化了配置和管理。
- 简化客户端:监控目标只需暴露一个HTTP端点来提供指标数据,无需关心数据的发送和重试逻辑。
- 服务发现:结合服务发现机制,Prometheus可以自动发现并开始监控新的服务实例,非常适合动态的云环境和微服务架构,例如Kubernetes。
尽管Prometheus倾向于使用pull模型,但我们也可以通过Pushgateway组件实现push模型,一般用于那些短暂的作业或无法直接被Prometheus访问的场景。作业可以将指标数据推送(push)到Pushgateway,而Prometheus再从Pushgateway拉取这些数据。
# 监控模式
Prometheus支持白盒监控和黑盒监控两种模式来进行监控。
# 白盒监控
白盒监控要求被监控端自行产生和暴露这些数据。应用程序在程序内部跟踪各类指标,并通过HTTP端点暴露这些指标,等待Prometheus进行采集。
白盒监控一般侧重于通过系统内部的指标主动发现问题或者预测潜在问题。
# 黑盒监控
黑盒监控是从外部检测被监控端的可用性,不依赖于系统内部的指标。Prometheus可以通过集成如Blackbox Exporter这样的工具来实现黑盒监控。该根据允许Prometheus对外部服务执行HTTP、TCP、ICMP等各种类型的探测,检查服务的可达性、响应时间等。
黑盒监控侧重于关注系统的外部表现,可以监控任何外部可访问的服务,无需了解其内部实现细节。当故障发生时能快速发现问题。
# 结合使用
白盒监控提供了系统内部的详细视图,帮助开发和运维团队理解系统的内部行为和性能。
黑盒监控则从最终用户的角度验证系统的可用性和响应性,确保服务的持续可访问。
这种全方位的监控策略使Prometheus成为现代云原生应用和微服务架构的理想监控解决方案,既能深入洞察系统内部,又能确保从用户角度的服务质量。
# 指标抓取方式
Prometheus的指标抓取(数据收集)方式主要依赖于对目标服务的HTTP请求来实现。这里是一些常见的途径和方法:
# 直接暴露指标
应用服务直接暴露Prometheus格式的指标。在应用内使用Prometheus客户端库来实现。应用会提供一个 HTTP 端点(默认为 /metrics
),供服务端进行采集。
# Exporters
Exporter是一个独立的应用服务,Prometheus社区提供了大量的Exporters,用于监控数据库、硬件、网络设备、中间件等。它会抓取系统或服务的原始数据,将其转换成Prometheus格式的指标并暴露出来,供Prometheus进行采集。
# Pushateway
对于短暂的任务或者由于网络隔离等原因无法被Prometheus直接抓取的场景,Prometheus提供了Pushgateway。
它能暂存指标数据,应用或服务将指标推送(push)到Pushgateway,然后Prometheus再定时从Pushgateway抓取这些指标。这种方式适用于批处理作业、后台任务等。
# 生态组件
# Prometheus
Prometheus组件在整个监控系统中,负责时序性指标数据的采集及存储。它不会进行数据分析、展示、告警,要实现这些功能还需要借助生态内的其他组件实现。
Prometheus拥有以下几种功能:
- Scraping
Scraping用于指标数据的采集,他会定期通过HTTP请求targets的/metrics
端点以拉取(scrape)指标数据,然后存储到TSDB中。
- Storage
Prometheus内置的时序数据库(TSDB),用于存储采集到的指标数据,支持长时间的数据保留策略。
- PromQL
PromQL是Prometheus内置的查询语言,允许用户查询和处理存储在Prometheus(TSDB)中的时序数据。
- Service Discovery
自动发现并监控新的Target实例,特别适合动态变化的容器环境,如Kubernetes。 Prometheus支持各种主流的服务发现,包括静态配置、Kubernetes、Consul等多种服务发现机制。
# Push Gateway
该组件用于支持push模型,适用于批处理作业、后台任务等。
# Alertmanager
接收来自Prometheus的告警,进行去重、分组、抑制处理后,将告警通知发送到指定的接收器,如邮件等。
# Exporter
Exporter组件用于将现有应用程序或服务的指标数据,转换为Prometheus可以识别的格式,并通过/metrics
端点暴露给Prometheus进行抓取。
Prometheus社区中提供各种服务或系统的指标暴露器。
# Grafana
Grafana组件用于提供Web UI,来实现数据可视化展示。用户可以创建丰富的仪表板,展示指标的实时图表,同时支持告警的可视化配置。
它能够支持多数据源,除了Prometheus,还可以集成Elasticsearch、MySQL等其他数据源。
# 数据模型
Prometheus的数据模型是专门为时间序列数据设计的,只能存储键值形式的时序数据,且它的值默认只支持双精度浮点,并且不支持存储文本型数据。
Prometheus的数据模型格式为:
Key{Labels} Value
# 指标(Metric)
指标是Prometheus数据模型的核心概念,代表了被监控系统的一个可量化的度量,例如CPU使用率、内存使用率或是HTTP请求的响应时间。 指标名称可以理解为键值对中的键名,用于描述这个度量的性质,通常遵循一定的命名规则以便于理解和查询。
# 标签(Labels)
标签是键值对形式的元数据,用于为指标提供更多的上下文信息。通过标签,可以将相同指标名称的数据区分开来,用以表示不同实例、不同环境或不同时间点的度量值。标签极大地增加了Prometheus数据的维度和灵活性。
例如我们监控多台主机的内存使用率,就可以用标签来区分相同指标名但来源不同的数据:
- memory_usage{host="server01", environment="test"} 0.64
- memory_usage{host="server02", environment="test"} 0.45
- memory_usage{host="server03", environment="pro"} 0.55
# 注意事项
- 指标名称和标签集的唯一组合:具有相同指标名称和标签集的数据,属于同一个时间序列。任何有关标签的改变都会产生一个新的时间序列。
- 谨慎使用标签:虽然标签非常强大,但是每增加一个标签,都可能显著增加数据库的大小和查询的复杂度,因此应避免使用过多不必要的标签。
通过合理利用指标和标签,Prometheus能够有效地管理和查询大量的时间序列数据,支持复杂的数据分析和告警逻辑。
# 作业与实例
# 作业(Job)
在Prometheus中,作业(Job)指的是一组执行相同功能的实例的集合,一个作业通常用于逻辑上分组和命名一系列相似的监控目标。我们可以将它理解为面向对象编程中的“类”。
# 实例(Instance)
实例(Instance)指的是单个监控目标,即能够被Prometheus抓取指标的具体节点,每个实例都代表了一个具体的监控对象。我们可以将它理解为面向对象编程中的"类"的实例。
Prometheus会将每个实例的抓取URL地址作为唯一标识。这些实例可以通过静态配置列出,或者通过服务发现机制动态发现。
# PromQL
PromQL(Prometheus Query Language)是Prometheus内置的数据查询语言,它提供了灵活且强大的数据查询和聚合能力。
# 向量类型
PromQL主要用于操作两种类型的数据向量:即时向量和时间范围向量。
# 即时向量(Instant Vector)
即时向量查询返回的是最近的数据点,表示在单个时间点上的一组时间序列数据。每个时间序列包含一个值和一组标签。
# 时间范围向量(Range Vector)
时间范围向量查询返回的是过去一段时间内的数据点,表示指定时间范围内的一系列即时向量。它们一般用于函数中,以计算每个时间序列在指定范围内的值。
# 内置函数
PromQL内置了一系列函数,这些函数可以对即时向量或时间范围向量进行操作,以实现更复杂的数据分析和聚合。这些函数包括但不限于:
- 聚合操作:如
sum
(求和)、avg
(平均值)、max
(最大值)、min
(最小值)等,用于对一组时间序列的值进行聚合计算。 - 选择器和转换:如
rate
(计算时间序列在给定时间范围内的变化率)、increase
(计算时间序列在给定时间范围内的增加量)等。 - 条件表达式:支持基于条件的查询,如比较操作符(
>
,<
,==
等),允许根据指标值的大小进行筛选。
# Alerts
告警规则在Prometheus的配置文件中定义,通常是基于PromQL表达式来指定何时触发告警。这些规则会周期性地评估,它会通过表达式分析样本数据,分析结果如果超过设定的阈值,则说明达到了告警条件,Prometheus会生成一个告警。
一旦告警被触发,Prometheus会将告警详情发送到Alertmanager。
Alertmanager是一个独立的组件,负责管理这些告警,包括去重、分组、路由以及发送通知。
Alertmanager接收到prometheus发来的告警后,会根据配置的来处理接收到的告警。它会先根据标签将它们分组,然后根据定义的路由规则将告警通知发送给告警通知人。