2. Prometheus 基础回顾:PromQL 核心语法与指标类型

在构建指标驱动的集群安全基线之前,必须牢固掌握 Prometheus 的数据模型与查询语言。本章将系统梳理 PromQL 核心语法与四种指标类型(Counter、Gauge、Histogram、Summary),为后续安全指标采集与告警规则编写打下基础。

2.1 指标类型与适用场景

Prometheus 客户端库提供四种核心指标类型,每种类型对应不同的数据语义与聚合方式。理解它们的差异是编写正确 PromQL 的前提。

类型 数据特征 典型安全场景 常用 PromQL 函数
Counter 只增不减(重启可重置) 登录失败次数、API 请求总数、容器重启次数 rate(), increase(), resets()
Gauge 可增可减,反映当前状态 CPU 使用率、内存占用、活跃连接数、Pod 副本数 avg(), max(), min(), delta()
Histogram 分桶计数,可计算分位数 API 响应延迟分布、TLS 握手耗时、审计日志处理延迟 histogram_quantile(), rate()
Summary 预计算分位数,客户端侧聚合 请求延迟预计算分位数(0.5/0.9/0.99) 直接读取 _quantile 指标
安全基线提示: 基线检查中 80% 的告警规则基于 Counter 和 Gauge 类型。Counter 用于检测“事件频率”异常(如暴力破解),Gauge 用于检测“状态越界”(如容器以特权模式运行)。

2.2 PromQL 核心语法结构

PromQL 查询由 指标选择器、标签匹配器 和 时间范围 三部分构成。以下为基本语法模板:

<metric_name>{<label_matchers>}[<time_duration>]

2.2.1 标签匹配器

  • 精确匹配:=,如 namespace="kube-system"
  • 正则匹配:=~,如 pod=~"api-.*"
  • 反向匹配:!=,如 container!="POD"
  • 反向正则:!~,如 namespace!~"kube-.*"

2.2.2 时间范围与偏移

语法 含义 示例
[5m] 过去 5 分钟内的所有样本 rate(http_requests_total[5m])
offset 1h 偏移 1 小时前的数据 node_cpu_seconds_total offset 1h
@timestamp 指定 Unix 时间戳 process_cpu_seconds_total @1600000000

2.3 四种指标类型详解

2.3.1 Counter:事件计数器

Counter 适用于只增不减的累计值。直接查询 Counter 原始值没有意义,必须配合 rate() 或 increase() 计算每秒增长率或增量。

# 计算过去 5 分钟内每秒登录失败次数
rate(kubelet_http_requests_total{path="/api/v1/namespaces"}[5m])

# 计算过去 1 小时内容器重启次数增量
increase(kube_pod_container_status_restarts_total[1h])
常见错误: 对 Counter 直接使用 avg() 或 sum() 而不加 rate(),会导致结果受累计时间影响,无法反映真实速率。安全基线中所有“频率类”指标必须使用 rate() 包裹。

2.3.2 Gauge:瞬时状态

Gauge 反映当前值,可升可降。安全基线中常用于检测资源使用率是否超过阈值,或安全配置状态是否异常。

# 检测节点 CPU 使用率是否超过 90%
(1 - avg(rate(node_cpu_seconds_total{mode="idle"}[5m])) by (instance)) > 0.9

# 检测容器是否以特权模式运行(值为 1 表示特权)
container_security_context_privileged{container!="POD"} == 1

2.3.3 Histogram:分桶分布

Histogram 将观测值分配到预定义的桶(bucket)中,适合计算分位数和分布特征。安全场景中常用于分析 TLS 握手延迟、审计日志处理延迟等。

# 计算过去 5 分钟内 API 请求延迟的 P99 值
histogram_quantile(0.99, rate(apiserver_request_duration_seconds_bucket[5m]))

2.3.4 Summary:预计算分位数

Summary 在客户端侧直接计算分位数,暴露为 _quantile 指标。与 Histogram 不同,Summary 无法跨进程聚合,但查询更简单。

# 直接读取预计算的 P99 延迟
apiserver_request_duration_seconds{quantile="0.99"}

2.4 PromQL 聚合与运算

安全基线检查中经常需要对指标进行聚合运算,以下为最常用的聚合操作符:

操作符 作用 安全基线示例
sum() 求和 统计集群中所有特权容器数量
avg() 平均值 计算节点平均 CPU 使用率
max() 最大值 找出集群中延迟最高的节点
count() 计数 统计满足条件的 Pod 数量
topk() 取前 K 个 找出重启次数最多的前 5 个 Pod
# 统计集群中所有特权容器数量
sum(container_security_context_privileged{container!="POD"} == 1)

# 找出重启次数最多的前 5 个 Pod
topk(5, increase(kube_pod_container_status_restarts_total[1h]))

2.5 指标类型与 PromQL 函数对照

不同指标类型适用的 PromQL 函数不同,错误使用会导致语义错误或查询失败。

Prometheus 指标类型与 PromQL 函数映射 Counter Gauge Histogram Summary 推荐函数 rate() / increase() resets() 推荐函数 avg() / max() / min() delta() / predict_linear() 推荐函数 histogram_quantile() rate() + _bucket 推荐函数 直接读取 _quantile 指标 安全基线应用场景 暴力破解检测 容器重启频率 CPU/内存越界 特权容器检测 TLS 握手延迟 审计日志处理 预计算 延迟分位数 核心原则:Counter 必须配合 rate() 使用;Gauge 可直接比较阈值;Histogram 用于分布分析;Summary 用于预计算分位数

2.6 安全基线中的 PromQL 实战模式

以下为安全基线检查中最常用的三种 PromQL 模式,后续章节将反复使用:

  1. 频率异常检测:使用 rate() 计算事件速率,与动态阈值比较。
  2. 状态越界检测:使用 Gauge 直接比较阈值,配合 on() 或 ignoring() 处理多标签。
  3. 分布异常检测:使用 histogram_quantile() 计算 P99/P95,与基线值比较。
# 模式1:频率异常 - 检测 5 分钟内登录失败速率是否超过 10 次/秒
rate(login_failures_total[5m]) > 10

# 模式2:状态越界 - 检测容器是否以特权模式运行
container_security_context_privileged{container!="POD"} == 1

# 模式3:分布异常 - 检测 API 请求 P99 延迟是否超过 500ms
histogram_quantile(0.99, rate(apiserver_request_duration_seconds_bucket[5m])) > 0.5
本章要点: 掌握 Counter 与 Gauge 的语义差异是编写安全基线规则的基础。Counter 必须配合 rate() 使用,Gauge 可直接比较阈值。Histogram 和 Summary 用于延迟分布分析,在 TLS 握手和审计日志场景中尤为重要。后续章节将基于这些基础构建完整的集群安全基线指标体系。