跳到主要内容
梧桐
永远年轻,永远热爱
View All Authors

PromQL 常用查询语句示例

· 阅读需 9 分钟
梧桐
永远年轻,永远热爱

本文收集整理了在 Prometheus 监控中最常用的 PromQL 查询语句,方便日常查询和告警规则编写时参考。

系统监控

CPU 相关查询

# CPU 使用率
100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)

# CPU 各个状态占比
rate(node_cpu_seconds_total[5m]) * 100

# 按核心统计 CPU 使用率
avg by (cpu) (rate(node_cpu_seconds_total{mode!="idle"}[5m]) * 100)

# CPU 负载
node_load1 # 1分钟负载
node_load5 # 5分钟负载
node_load15 # 15分钟负载

内存相关查询

# 内存使用率
(1 - node_memory_MemAvailable_bytes/node_memory_MemTotal_bytes) * 100

# 可用内存
node_memory_MemAvailable_bytes / 1024 / 1024 / 1024

# 内存使用量前五的进程
topk(5, sum by (name) (container_memory_usage_bytes{container!=""}))

# Swap 使用率
(1 - node_memory_SwapFree_bytes/node_memory_SwapTotal_bytes) * 100

磁盘相关查询

# 磁盘使用率
100 - ((node_filesystem_avail_bytes * 100) / node_filesystem_size_bytes)

# 磁盘读写速率
rate(node_disk_read_bytes_total[5m])
rate(node_disk_written_bytes_total[5m])

# 磁盘 IO 使用率
rate(node_disk_io_time_seconds_total[5m]) * 100

# 预测磁盘满的时间(小时)
predict_linear(node_filesystem_free_bytes[1h], 4 * 3600) < 0

网络相关查询

# 网络接口流量
rate(node_network_receive_bytes_total[5m])
rate(node_network_transmit_bytes_total[5m])

# 网络接口错误率
rate(node_network_receive_errs_total[5m])
rate(node_network_transmit_errs_total[5m])

# TCP 连接状态
node_netstat_Tcp_CurrEstab

容器监控

容器资源使用

# 容器 CPU 使用率
sum(rate(container_cpu_usage_seconds_total{container!=""}[5m])) by (container) * 100

# 容器内存使用量(GB)
sum(container_memory_usage_bytes{container!=""}) by (container) / 1024^3

# 容器网络 IO
sum(rate(container_network_receive_bytes_total[5m])) by (container)
sum(rate(container_network_transmit_bytes_total[5m])) by (container)

应用监控

HTTP 服务监控

# 请求速率(QPS)
sum(rate(http_requests_total[5m])) by (handler)

# 错误率
sum(rate(http_requests_total{status=~"5.."}[5m]))
/
sum(rate(http_requests_total[5m])) * 100

# 平均响应时间
rate(http_request_duration_seconds_sum[5m])
/
rate(http_request_duration_seconds_count[5m])

# P90/P95/P99 延迟
histogram_quantile(0.90, sum(rate(http_request_duration_seconds_bucket[5m])) by (le))
histogram_quantile(0.95, sum(rate(http_request_duration_seconds_bucket[5m])) by (le))
histogram_quantile(0.99, sum(rate(http_request_duration_seconds_bucket[5m])) by (le))

JVM 监控

# 堆内存使用率
jvm_memory_bytes_used{area="heap"}
/
jvm_memory_bytes_max{area="heap"} * 100

# GC 次数
rate(jvm_gc_collection_seconds_count[5m])

# GC 耗时
rate(jvm_gc_collection_seconds_sum[5m])

# 线程数
jvm_threads_current

告警规则示例

系统告警

# CPU 使用率过高
100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80

# 内存使用率过高
(1 - node_memory_MemAvailable_bytes/node_memory_MemTotal_bytes) * 100 > 90

# 磁盘使用率过高
100 - ((node_filesystem_avail_bytes * 100) / node_filesystem_size_bytes) > 85

# 磁盘将在 4 小时内满
predict_linear(node_filesystem_free_bytes[1h], 4 * 3600) < 0

应用告警

# 服务实例不可用
up{job="my-service"} == 0

# 错误率过高
sum(rate(http_requests_total{status=~"5.."}[5m]))
/
sum(rate(http_requests_total[5m])) * 100 > 5

# 响应延迟过高
histogram_quantile(0.95, sum(rate(http_request_duration_seconds_bucket[5m])) by (le)) > 1

性能优化查询

# 查找高基数的指标
topk(10, count by (__name__) ({__name__=~".+"}))

# 查找最活跃的 targets
topk(10, count by (job) (up))

# 查找采集速率最高的指标
topk(10, rate(prometheus_tsdb_head_samples_appended_total[5m]))

高级监控场景

Kubernetes 集群监控

# 节点 Ready 状态
kube_node_status_condition{condition="Ready",status="true"}

# Pod 运行状态统计
sum by (namespace) (kube_pod_status_phase{phase="Running"})

# 容器重启次数
sum by (namespace, pod) (kube_pod_container_status_restarts_total)

# 节点资源压力
sum by (node) (
kube_pod_container_resource_requests{resource="cpu"}
) / sum by (node) (
kube_node_status_allocatable{resource="cpu"}
) * 100

# 命名空间资源配额使用率
sum by (namespace) (
kube_resourcequota{type="used"}
) / sum by (namespace) (
kube_resourcequota{type="hard"}
) * 100

数据库监控

MySQL 监控

# 连接数使用率
mysql_global_status_threads_connected
/
mysql_global_variables_max_connections * 100

# 慢查询统计
rate(mysql_global_status_slow_queries[5m])

# InnoDB 缓冲池使用率
mysql_global_status_innodb_buffer_pool_pages_total
-
mysql_global_status_innodb_buffer_pool_pages_free

# 事务统计
rate(mysql_global_status_commands_total{command="commit"}[5m])

Redis 监控

# 内存使用率
redis_memory_used_bytes / redis_memory_max_bytes * 100

# 命令执行率
rate(redis_commands_total[5m])

# 键过期率
rate(redis_expired_keys_total[5m])

# 连接数
redis_connected_clients

消息队列监控

RabbitMQ 监控

# 队列消息堆积
rabbitmq_queue_messages_ready

# 消费者数量
rabbitmq_queue_consumers

# 消息处理率
rate(rabbitmq_queue_messages_delivered_total[5m])

# 未确认消息数
rabbitmq_queue_messages_unacknowledged

Kafka 监控

# 主题消息率
rate(kafka_topic_partition_current_offset[5m])

# 消费组延迟
sum by (topic) (
kafka_consumergroup_lag
)

# Broker 活跃连接数
kafka_server_socket_server_metrics_connection_count

# 副本同步延迟
kafka_replica_lag

网关和代理监控

Nginx 监控

# 请求处理率
rate(nginx_http_requests_total[5m])

# 活跃连接数
nginx_connections_active

# 错误率
sum(rate(nginx_http_requests_total{status=~"5.."}[5m]))
/
sum(rate(nginx_http_requests_total[5m])) * 100

# 上游响应时间
histogram_quantile(0.95,
rate(nginx_upstream_response_time_seconds_bucket[5m])
)

应用性能监控

服务依赖监控

# 服务调用错误率
sum by (service) (
rate(service_calls_total{result="error"}[5m])
) / sum by (service) (
rate(service_calls_total[5m])
) * 100

# 服务依赖可用性
sum by (dependency) (
rate(dependency_up[5m])
)

# 外部服务调用延迟
histogram_quantile(0.95,
rate(external_service_response_time_bucket[5m])
)

缓存性能监控

# 缓存命中率
sum(rate(cache_hits_total[5m]))
/
sum(rate(cache_requests_total[5m])) * 100

# 缓存过期率
rate(cache_evictions_total[5m])

# 缓存延迟分布
histogram_quantile(0.99,
rate(cache_operation_duration_seconds_bucket[5m])
)

日志相关监控

# 错误日志率
rate(log_messages_total{level="error"}[5m])

# 按照服务统计错误数
sum by (service) (
increase(log_errors_total[1h])
)

# 日志写入延迟
histogram_quantile(0.95,
rate(log_write_duration_seconds_bucket[5m])
)

安全监控

# 认证失败次数
rate(auth_failures_total[5m])

# IP 封禁次数
increase(ip_blacklist_total[1h])

# HTTPS 证书过期时间(天)
(
ssl_certificate_expiry_timestamp_seconds
-
time()
) / 86400

# 异常登录尝试
sum by (user) (
rate(failed_login_attempts_total[5m])
)

高级告警规则

趋势预测告警

# 预测 4 小时后的值是否超过阈值
predict_linear(
http_requests_total[1h],
4 * 3600
) > 1000

# 异常值检测
abs(
rate(http_requests_total[5m])
-
avg_over_time(rate(http_requests_total[5m])[1h:5m])
) > 2

复合告警条件

# CPU 和内存同时高负载
(
instance:cpu_usage:rate5m > 80
and
instance:memory_usage:ratio > 80
)

# 服务多项指标异常
(
service:error_rate:5m > 1
and
service:latency:p95_5m > 0.5
and
service:success_rate:5m < 99
)

最佳实践补充

查询优化进阶

  1. 使用子查询优化复杂计算
# 优化前
sum(rate(http_requests_total[5m])) / sum(rate(http_requests_total[5m]))

# 优化后
sum(rate(http_requests_total[5m]))
/
group(sum(rate(http_requests_total[5m])))
  1. 使用 recording rules 优化常用查询
# 记录规则示例
rules:
- record: job:http_errors:rate5m
expr: sum by (job) (rate(http_requests_total{status=~"5.."}[5m]))

微服务监控

服务网格监控

# 服务间调用延迟
histogram_quantile(0.95,
sum(rate(istio_request_duration_milliseconds_bucket[5m])) by (source_app, destination_app, le)
)

# 服务错误率
sum(rate(istio_requests_total{response_code=~"5.*"}[5m])) by (destination_service)
/
sum(rate(istio_requests_total[5m])) by (destination_service) * 100

# 服务重试率
sum(rate(istio_requests_total{response_flags="RR"}[5m])) by (destination_service)
/
sum(rate(istio_requests_total[5m])) by (destination_service) * 100

# 断路器开启次数
increase(istio_circuit_breaker_open_total[5m])

链路追踪相关

# 追踪采样率
sum(rate(spans_sampled_total[5m]))
/
sum(rate(spans_total[5m])) * 100

# 追踪延迟分布
histogram_quantile(0.95, sum(rate(trace_duration_seconds_bucket[5m])) by (service, le))

# 追踪错误率
sum(rate(spans_errors_total[5m])) by (service)
/
sum(rate(spans_total[5m])) by (service) * 100

云原生组件监控

Etcd 监控

# Leader 选举状态
etcd_server_is_leader

# 写入延迟
histogram_quantile(0.99, rate(etcd_disk_wal_fsync_duration_seconds_bucket[5m]))

# 数据库大小
etcd_debugging_mvcc_db_total_size_in_bytes

# Raft 提案失败率
rate(etcd_server_proposals_failed_total[5m])
/
rate(etcd_server_proposals_committed_total[5m]) * 100

CoreDNS 监控

# DNS 查询率
sum(rate(coredns_dns_requests_total[5m])) by (zone)

# 查询延迟
histogram_quantile(0.95, sum(rate(coredns_dns_request_duration_seconds_bucket[5m])) by (zone, le))

# 错误率
sum(rate(coredns_dns_responses_total{rcode!="NOERROR"}[5m]))
/
sum(rate(coredns_dns_responses_total[5m])) * 100

存储系统监控

Elasticsearch 监控

# 集群状态
elasticsearch_cluster_health_status{color="green"}

# 索引写入延迟
rate(elasticsearch_index_stats_indexing_index_time_seconds_total[5m])
/
rate(elasticsearch_index_stats_indexing_index_total[5m])

# JVM 堆使用率
elasticsearch_jvm_memory_used_bytes{area="heap"}
/
elasticsearch_jvm_memory_max_bytes{area="heap"} * 100

# 搜索延迟
rate(elasticsearch_indices_search_fetch_time_seconds[5m])
/
rate(elasticsearch_indices_search_fetch_total[5m])

MongoDB 监控

# 连接数
mongodb_connections{state="current"}

# 操作延迟
rate(mongodb_op_latencies_latency_total[5m])
/
rate(mongodb_op_latencies_ops_total[5m])

# 复制延迟
mongodb_replset_member_optime_date{state="SECONDARY"}
-
mongodb_replset_member_optime_date{state="PRIMARY"}

# 慢查询数
rate(mongodb_mongod_metrics_query_executor_total{state="scanned_objects"}[5m])

网络监控进阶

网络质量监控

# 网络延迟
avg_over_time(ping_average_response_ms[5m])

# 丢包率
rate(ping_loss_count[5m])
/
rate(ping_count[5m]) * 100

# 网络抖动
stddev_over_time(ping_average_response_ms[5m])

协议监控

# TCP 重传率
rate(node_netstat_Tcp_RetransSegs[5m])
/
rate(node_netstat_Tcp_OutSegs[5m]) * 100

# TCP 连接状态分布
node_netstat_Tcp_CurrEstab

# UDP 缓冲区溢出
rate(node_netstat_Udp_RcvbufErrors[5m])

自定义业务监控

业务指标监控

# 订单处理速率
rate(business_orders_processed_total[5m])

# 支付成功率
sum(rate(payment_transactions_total{status="success"}[5m]))
/
sum(rate(payment_transactions_total[5m])) * 100

# 用户会话数
sum(rate(user_sessions_total{status="active"}[5m]))

# 业务错误分布
topk(10, sum by (error_type) (rate(business_errors_total[1h])))

用户体验监控

# 页面加载时间
histogram_quantile(0.95, sum(rate(page_load_time_seconds_bucket[5m])) by (page, le))

# JS 错误率
sum(rate(frontend_errors_total[5m])) by (error_type)

# API 响应时间
histogram_quantile(0.99, sum(rate(api_response_time_seconds_bucket[5m])) by (api, le))

高级告警场景

智能告警

# 动态阈值告警
abs(
rate(http_requests_total[5m])
-
avg_over_time(rate(http_requests_total[5m])[1d:5m])
) > stddev_over_time(rate(http_requests_total[5m])[1d:5m]) * 3

# 季节性感知告警
(
rate(http_requests_total[5m])
/
avg_over_time(rate(http_requests_total[5m] offset 7d)[1h:5m])
) > 2

多维度告警

# 服务质量综合告警
(
service:error_rate:5m > 1
and
service:latency:p95_5m > 0.5
and
service:success_rate:5m < 99
and
service:traffic:rate5m > 10
)

# 资源饱和度告警
(
instance:cpu_usage:rate5m > 80
or
instance:memory_usage:ratio > 80
or
instance:disk_usage:ratio > 85
)
and
instance:load1 > count(instance:cpu_cores) by (instance)

Prometheus 指标类型详解

· 阅读需 5 分钟
梧桐
永远年轻,永远热爱

在 Prometheus 生态系统中,指标(Metrics)是最基础的数据类型。理解不同类型的指标及其适用场景,对于构建有效的监控系统至关重要。本文将详细介绍 Prometheus 的四种核心指标类型。

Counter(计数器)

定义

Counter 是一个只增不减的累计指标。它的值只能增加或在重启时重置为零。

特点

  • 单调递增
  • 只能增加或重置为零
  • 常用于计数场景

使用场景

# 常见的 Counter 指标
http_requests_total # HTTP 请求总数
node_network_receive_bytes # 网络接收字节数
errors_total # 错误总数

最佳实践

# 计算速率(每秒请求数)
rate(http_requests_total[5m])

# 计算一段时间内的增量
increase(http_requests_total[1h])

Gauge(仪表盘)

定义

Gauge 是可以任意上下波动的指标,可增可减。

特点

  • 可增可减
  • 反映瞬时状态
  • 适合记录当前状态

使用场景

# 常见的 Gauge 指标
node_memory_MemAvailable_bytes # 可用内存
node_cpu_usage_percent # CPU 使用率
temperature_celsius # 温度

最佳实践

# 直接使用当前值
node_memory_MemAvailable_bytes

# 计算变化率
delta(temperature_celsius[1h])

Histogram(直方图)

定义

Histogram 对观察值进行采样,并将其计入可配置的桶(bucket)中,同时提供所有观察值的总和。

特点

  • 包含多个桶计数
  • 自动计算总和和样本数
  • 支持分位数计算

组成部分

# 一个 Histogram 指标会自动生成以下数据:
<basename>_bucket{le="<upper inclusive bound>"} # 桶计数
<basename>_sum # 所有观察值的总和
<basename>_count # 观察值的总数

使用场景

# HTTP 请求延迟分布
http_request_duration_seconds_bucket{le="0.1"} # 100ms 内的请求数
http_request_duration_seconds_sum # 总延迟时间
http_request_duration_seconds_count # 总请求数

# 计算 P90 延迟
histogram_quantile(0.9,
rate(http_request_duration_seconds_bucket[5m])
)

Summary(摘要)

定义

Summary 类似于 Histogram,但它直接在客户端计算分位数。

特点

  • 客户端计算分位数
  • 提供总和和计数
  • 配置固定的分位数

组成部分

# 一个 Summary 指标会自动生成:
<basename>{quantile="<φ>"} # φ-分位数值
<basename>_sum # 所有观察值的总和
<basename>_count # 观察值的总数

使用场景

# 应用响应时间
http_request_duration_seconds{quantile="0.95"} # P95 延迟
http_request_duration_seconds_sum # 总延迟
http_request_duration_seconds_count # 总请求数

指标类型选择建议

  1. Counter 适用于

    • 请求计数
    • 错误计数
    • 任务完成数
  2. Gauge 适用于

    • 内存使用量
    • 温度
    • 当前并发连接数
  3. Histogram 适用于

    • 请求延迟
    • 响应大小
    • 需要计算分位数的场景
  4. Summary 适用于

    • 需要精确分位数的场景
    • 客户端计算分位数的场景

最佳实践

1. 命名规范

# 好的命名示例
http_requests_total
http_request_duration_seconds
node_memory_usage_bytes

2. 标签使用

# 合理使用标签
http_requests_total{method="GET", status="200", path="/api/v1/users"}

3. 单位规范

  • 使用基本单位(秒、字节等)
  • 在指标名称中包含单位信息

总结

选择合适的指标类型对于构建有效的监控系统至关重要:

  • Counter 适合累计型数据
  • Gauge 适合状态型数据
  • Histogram 适合需要分析分布的数据
  • Summary 适合需要客户端计算分位数的场景

理解这些指标类型的特点和使用场景,可以帮助我们更好地设计监控系统。

参考资料

PromQL 实用指南

· 阅读需 5 分钟
梧桐
永远年轻,永远热爱

在云原生时代,Prometheus 已经成为了监控领域的事实标准。而掌握其查询语言 PromQL 的使用,对于日常运维和问题排查至关重要。本文将介绍 PromQL 的常见用法和实战技巧。

基础查询语法

1. 简单查询

最基本的查询就是直接使用指标名称:

# 查询所有 HTTP 请求总数
http_requests_total

# 带标签的精确匹配查询
http_requests_total{status="200", method="GET"}

2. 标签匹配操作符

PromQL 提供了四种标签匹配操作符:

  • =:完全相等
  • !=:不等于
  • =~:正则匹配
  • !~:正则不匹配

示例:

# 匹配所有 2xx 状态码的请求
http_requests_total{status=~"2.."}

# 匹配除了 POST 以外的所有请求方法
http_requests_total{method!="POST"}

3. 时间范围查询

在 Prometheus 中,我们经常需要查询一段时间内的数据:

# 查询最近 5 分钟的数据
http_requests_total{status="200"}[5m]

# 查询 1 小时前的 5 分钟数据
http_requests_total{status="200"}[5m] offset 1h

常用函数和运算符

1. rate() 和 irate()

这两个函数用于计算计数器(counter)类型指标的变化率:

# 计算请求速率(每秒)
rate(http_requests_total[5m])

# 计算瞬时速率
irate(http_requests_total[5m])

2. 聚合运算符

# 计算所有实例的请求总和
sum(http_requests_total)

# 按照应用名称分组计算平均值
avg by(app) (http_requests_total)

# 查找最大值前 3 名
topk(3, http_requests_total)

实用监控场景

1. 服务可用性监控

# 服务可用性百分比
(1 - (
sum(increase(http_requests_total{status=~"5.."}[5m])) /
sum(increase(http_requests_total[5m]))
)) * 100

# 服务响应时间 P99
histogram_quantile(0.99,
sum(rate(http_request_duration_seconds_bucket[5m])) by (le)
)

2. 资源使用监控

# CPU 使用率
100 - (
avg by(instance) (
rate(node_cpu_seconds_total{mode="idle"}[5m])
) * 100
)

# 内存使用率
(
node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes
) / node_memory_MemTotal_bytes * 100

# 磁盘使用率
(
node_filesystem_size_bytes - node_filesystem_free_bytes
) / node_filesystem_size_bytes * 100

3. 容器监控

# 容器 CPU 使用率
sum(
rate(container_cpu_usage_seconds_total{container!=""}[5m])
) by (container) * 100

# 容器内存使用量(GB)
sum(
container_memory_usage_bytes{container!=""}
) by (container) / 1024^3

性能优化技巧

  1. 查询优化

    • 使用精确的标签匹配而不是正则表达式
    • 避免使用过长的时间范围
    • 合理使用聚合操作
  2. 数据采集优化

    # 使用记录规则预计算常用查询
    record: job:http_requests:rate5m
    expr: rate(http_requests_total[5m])

常见问题排查

1. 数据缺失检查

# 检查时间序列是否存在
absent(up{job="my-service"})

# 检查采集目标状态
up{job="my-service"} == 0

2. 数据异常分析

# 检查速率异常
rate(http_requests_total[5m]) > 100

# 检查延迟异常
histogram_quantile(0.95, http_request_duration_seconds_bucket) > 1

最佳实践

  1. 命名规范

    • 使用有意义的指标名称
    • 保持标签命名的一致性
    • 避免过多的标签维度
  2. 查询设计

    • 优先使用 rate() 而不是 irate()
    • 合理使用记录规则
    • 避免复杂的嵌套查询
  3. 告警设计

    • 设置合理的告警阈值
    • 使用告警聚合减少噪音
    • 提供清晰的告警描述

总结

PromQL 是一个强大的查询语言,掌握它需要:

  • 深入理解基本概念
  • 熟练运用常用函数
  • 注意查询性能优化
  • 遵循最佳实践

通过本文的介绍和示例,希望能帮助你更好地使用 PromQL 进行系统监控和问题诊断。

参考资料

创建一个报警策略

· 阅读需 3 分钟
梧桐
永远年轻,永远热爱

在开始之前,我们需要了解策略的基本概念。

什么是策略?

策略是一组规则的集合,用于去检测和报警系统中的指标。

需要哪些东西?

  1. 什么场景的告警策略?
  2. 告警给谁?
  3. 怎么展示?

针对上述问题,我们可以设计以下策略:

  1. 系统 CPU 使用率过高:当系统 CPU 使用率超过 80% 时,发送邮件给管理员。

创建Hook

Hook 是 Moon 用来与外部系统集成的一种方式。Moon 支持多种类型的 Hook,包括邮件、短信、电话、企业微信、飞书等。

Hook

创建告警通知组

告警组是用于管理通知渠道的集合。里面包含人员(邮件、短信、电话), Hook(Webhook、 DingTalk、企业微信、飞书等)

  • 登录到 Moon 控制台,点击左侧导航栏的“告警通知->告警组”,点击“添加”按钮。

告警通知组

创建数据源

  • 登录到 Moon 控制台,点击左侧导航栏的“数据源->Metric”,点击“新建数据源”按钮。

Metric数据源

CPU 使用率查询

创建策略组

策略组是策略的集合,可以定义多个策略,每个策略可以关联多个数据源。

  • 登录到 Moon 控制台,点击左侧导航栏的“策略管理->策略组”,点击“添加”按钮。

策略组

创建策略

策略是一组规则的集合,用于去检测和报警系统中的指标。

  • 登录到 Moon 控制台,点击左侧导航栏的“策略管理->策略列表”,点击“添加”按钮。

策略添加

策略添加

策略添加

策略详情

查看告警

告警列表

告警详情

feishu通知

email通知

告警恢复

这里是修改策略的阈值为100%,告警恢复。也可以直接关闭策略来产生告警恢复事件

告警恢复

告警恢复feishu

查看告警历史

告警历史