Gauge 和 Counter 有什么区别?(Prometheus 指标类型)
Counter 只增不减(重启归零),记录累计量如请求总数;Gauge 可增可减,记录瞬时值如内存占用。查询方式也因此不同:Counter 用 rate() 看速率,Gauge 直接看值。一文讲清选型。
核心区别一句话:Counter 是"累计计数器"——通常只增不减,也可因进程或计数器生命周期变化而重置;Gauge 是"温度计"——可增可减,代表当前这一刻的值。
Counter:单调递增
from prometheus_client import Counter
http_requests = Counter('http_requests_total', 'Total HTTP requests')
http_requests.inc() # 只能 +1 / +n,不能减
适用:请求总数、错误总数、处理任务数、字节收发总量。
查询:rate(http_requests_total[5m]) 看每秒速率;increase(...[1h]) 看小时总量。观察到的计数下降会被这两个函数按重置处理;抓取间未被观测到的重置或增长无法完整恢复。
Gauge:可增可减
from prometheus_client import Gauge
memory_usage = Gauge('memory_usage_bytes', 'Current memory usage')
memory_usage.set(500) # 直接设值
memory_usage.inc(100) # 也能 +100
memory_usage.dec(50) # 也能 -50
适用:内存/CPU 占用、当前连接数、队列深度、在线人数。
查询:直接取值,或 avg_over_time 看一段时间均值。
速查表
| Counter | Gauge | |
|---|---|---|
| 方向 | 只增或重置 | 可增可减 |
| 语义 | 累计量 | 瞬时值 |
| 例子 | 请求总数 | 当前内存 |
| 查询 | rate / increase | 直接取值 |
判断口诀:这个值"天然只涨"(总数)用 Counter;"有涨有落"(水位)用 Gauge。
常见问题(FAQ)
Q:错误率该用哪种? 分子分母都用 Counter(错误数、总数),查询时相除。
Q:Gauge 能算速率吗? rate 可以接受浮点序列但不适合 Gauge 的语义;需要变化率时用 deriv()(窗口内线性回归斜率);delta() 计算窗口内的值差,语义和 rate 不同。