一、Prometheus 数据模型

1.1 时间序列数据基础

Prometheus 的核心是时间序列数据。时间序列是按时间顺序排列的一系列数据点,在 Prometheus 里,每个时间序列由指标名称和一组标签(labels)唯一标识。指标名称描述了被测量的内容,例如 http_requests_total 表示 HTTP 请求的总数。标签则提供了更多的上下文信息,用于区分同一指标的不同维度。比如,对于 http_requests_total 这个指标,可能有 method="GET" 和 status_code="200" 这样的标签,分别表示请求方法是 GET 以及响应状态码为 200。

1.2 指标名称和标签的作用

指标名称是理解监控数据的关键,它定义了监控的对象。良好的指标命名规范有助于清晰地表达监控的含义,例如使用驼峰命名或下划线分隔的命名方式。标签则用于对指标进行分类和过滤。通过不同的标签组合,可以从多个维度分析和比较数据。例如,在一个微服务架构中,可以使用 service 标签来区分不同的服务,使用 instance 标签来区分同一服务的不同实例。

1.3 数据样本与时间戳

每个时间序列由一系列的数据样本组成,每个样本包含一个浮点数的值和一个时间戳。时间戳表示样本被采集的时间,精确到毫秒。Prometheus 以固定的时间间隔采集数据,这个间隔可以在配置文件中设置。例如,以下是一个简单的时间序列数据示例:

http_requests_total{method="GET", status_code="200"} 123 1630435200000

这里 http_requests_total 是指标名称,method="GET" 和 status_code="200" 是标签,123 是值,1630435200000 是时间戳(单位:毫秒)。

1.4 数据模型的优势

Prometheus 的数据模型具有高度的灵活性和可扩展性。多维标签使得可以对数据进行任意维度的切片和分析,能够满足复杂的监控和分析需求。同时,这种数据模型也使得数据的存储和查询更加高效,因为可以根据标签进行快速的索引和过滤。

二、PromQL 查询语言

2.1 PromQL 基础语法

PromQL 是 Prometheus 强大的查询语言,用于从时间序列数据中提取和处理信息。基本的 PromQL 查询可以是一个简单的指标名称,例如:

http_requests_total

这个查询将返回所有名为 http_requests_total 的时间序列数据。也可以通过标签过滤来缩小查询范围,例如:

http_requests_total{method="GET", status_code="200"}

这将只返回 method 为 GET 且 status_code 为 200 的 http_requests_total 时间序列数据。

2.2 常用操作符

2.2.1 算术操作符

PromQL 支持常见的算术操作符,如 +(加法)、-(减法)、*(乘法)、/(除法)、%(取模)和 ^(幂运算)。例如,计算每个实例的平均请求处理时间:

http_request_duration_seconds_sum / http_request_duration_seconds_count

这里 http_request_duration_seconds_sum 是请求处理时间的总和,http_request_duration_seconds_count 是请求的总数,通过除法运算得到平均请求处理时间。

2.2.2 比较操作符

比较操作符包括 >(大于)、<(小于)、>=(大于等于)、<=(小于等于)、==(等于)和 !=(不等于)。例如,查询所有 CPU 使用率大于 80% 的实例:

node_cpu_seconds_total{mode="idle"} < 0.2 * node_cpu_seconds_total

这里假设 node_cpu_seconds_total 是总的 CPU 时间,mode="idle" 表示空闲 CPU 时间,通过比较操作找出空闲 CPU 时间小于总 CPU 时间 20% 的实例。

2.2.3 逻辑操作符

逻辑操作符有 and(与)、or(或)和 unless(除非)。例如,查询 CPU 使用率大于 80% 且内存使用率大于 70% 的实例:

(node_cpu_seconds_total{mode="idle"} < 0.2 * node_cpu_seconds_total) and (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes < 0.3)

2.3 聚合操作

PromQL 提供了强大的聚合操作,用于对时间序列数据进行汇总和统计。常见的聚合操作包括 sum(求和)、avg(求平均值)、min(求最小值)、max(求最大值)、count(计数)等。例如,计算所有实例的 HTTP 请求总数:

sum(http_requests_total)

还可以按标签进行分组聚合,例如按 method 标签分组计算每个请求方法的请求总数:

sum by (method) (http_requests_total)

2.4 时间范围查询

在 PromQL 中,可以使用时间范围查询来获取一段时间内的数据。时间范围通过 [] 表示,例如 [5m] 表示 5 分钟的时间范围。例如,查询过去 5 分钟内每个实例的平均 CPU 使用率:

avg_over_time(node_cpu_seconds_total{mode="idle"}[5m])

这里 avg_over_time 是一个函数,用于计算指定时间范围内的平均值。

三、PromQL 实际应用案例

3.1 计算服务的请求成功率

假设我们有两个指标:http_requests_total 表示总的 HTTP 请求数,http_requests_failed_total 表示失败的 HTTP 请求数。要计算服务的请求成功率,可以使用以下 PromQL 查询:

1 - (http_requests_failed_total / http_requests_total)

这个查询先计算失败请求数占总请求数的比例,然后用 1 减去这个比例得到成功率。

3.2 监控系统资源使用情况

监控服务器的 CPU 和内存使用情况是常见的需求。例如,查询过去 1 小时内服务器的平均 CPU 使用率:

1 - avg_over_time(node_cpu_seconds_total{mode="idle"}[1h])

查询过去 1 小时内服务器的平均内存使用率:

1 - (avg_over_time(node_memory_MemAvailable_bytes[1h]) / avg_over_time(node_memory_MemTotal_bytes[1h]))

Prometheus 的数据模型和 PromQL 查询语言是其强大功能的核心。多维数据模型使得监控数据的表示更加灵活和丰富,而 PromQL 则提供了强大的查询和分析能力。掌握 Prometheus 的数据模型和 PromQL 查询语言,可以更好地实现利用 Prometheus 进行系统监控和性能分析。

Logo

一站式 AI 云服务平台

更多推荐